lamindb 1.11.0__tar.gz → 1.11.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. {lamindb-1.11.0 → lamindb-1.11.1}/PKG-INFO +2 -2
  2. {lamindb-1.11.0 → lamindb-1.11.1}/README.md +1 -1
  3. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/__init__.py +1 -1
  4. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/_context.py +4 -2
  5. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/artifact.py +49 -8
  6. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/sqlrecord.py +1 -1
  7. {lamindb-1.11.0 → lamindb-1.11.1}/tests/permissions/scripts/setup_access.py +5 -0
  8. {lamindb-1.11.0 → lamindb-1.11.1}/tests/permissions/test_permissions.py +44 -0
  9. {lamindb-1.11.0 → lamindb-1.11.1}/tests/storage/test_streaming.py +8 -0
  10. {lamindb-1.11.0 → lamindb-1.11.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  11. {lamindb-1.11.0 → lamindb-1.11.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  12. {lamindb-1.11.0 → lamindb-1.11.1}/.github/ISSUE_TEMPLATE/enhancement.yml +0 -0
  13. {lamindb-1.11.0 → lamindb-1.11.1}/.github/ISSUE_TEMPLATE/usage_question.yml +0 -0
  14. {lamindb-1.11.0 → lamindb-1.11.1}/.github/workflows/build.yml +0 -0
  15. {lamindb-1.11.0 → lamindb-1.11.1}/.github/workflows/doc-changes.yml +0 -0
  16. {lamindb-1.11.0 → lamindb-1.11.1}/.gitignore +0 -0
  17. {lamindb-1.11.0 → lamindb-1.11.1}/.gitmodules +0 -0
  18. {lamindb-1.11.0 → lamindb-1.11.1}/.pre-commit-config.yaml +0 -0
  19. {lamindb-1.11.0 → lamindb-1.11.1}/CONTRIBUTING.md +0 -0
  20. {lamindb-1.11.0 → lamindb-1.11.1}/LICENSE +0 -0
  21. {lamindb-1.11.0 → lamindb-1.11.1}/docs/api.md +0 -0
  22. {lamindb-1.11.0 → lamindb-1.11.1}/docs/arrays.ipynb +0 -0
  23. {lamindb-1.11.0 → lamindb-1.11.1}/docs/bio-registries.ipynb +0 -0
  24. {lamindb-1.11.0 → lamindb-1.11.1}/docs/bionty.md +0 -0
  25. {lamindb-1.11.0 → lamindb-1.11.1}/docs/changelog.md +0 -0
  26. {lamindb-1.11.0 → lamindb-1.11.1}/docs/clinicore.md +0 -0
  27. {lamindb-1.11.0 → lamindb-1.11.1}/docs/curate.ipynb +0 -0
  28. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/acid.ipynb +0 -0
  29. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/curate-any.ipynb +0 -0
  30. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/delete.ipynb +0 -0
  31. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/idempotency.ipynb +0 -0
  32. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/import-modules.ipynb +0 -0
  33. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/keep-artifacts-local.ipynb +0 -0
  34. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/pydantic-pandera.ipynb +0 -0
  35. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/reference-field.ipynb +0 -0
  36. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/search.ipynb +0 -0
  37. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/setup.ipynb +0 -0
  38. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/symbol-mapping.ipynb +0 -0
  39. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/test_notebooks.py +0 -0
  40. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/track-run-inputs.ipynb +0 -0
  41. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/validate-fields.ipynb +0 -0
  42. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq/visibility.ipynb +0 -0
  43. {lamindb-1.11.0 → lamindb-1.11.1}/docs/faq.md +0 -0
  44. {lamindb-1.11.0 → lamindb-1.11.1}/docs/guide.md +0 -0
  45. {lamindb-1.11.0 → lamindb-1.11.1}/docs/includes/installation.md +0 -0
  46. {lamindb-1.11.0 → lamindb-1.11.1}/docs/index.md +0 -0
  47. {lamindb-1.11.0 → lamindb-1.11.1}/docs/lamindb.md +0 -0
  48. {lamindb-1.11.0 → lamindb-1.11.1}/docs/query-search.md +0 -0
  49. {lamindb-1.11.0 → lamindb-1.11.1}/docs/registries.ipynb +0 -0
  50. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_anndata_flexible.py +0 -0
  51. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_anndata_uns.py +0 -0
  52. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_dataframe_attrs.py +0 -0
  53. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_dataframe_external_features.py +0 -0
  54. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_dataframe_flexible.py +0 -0
  55. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_dataframe_minimal_errors.py +0 -0
  56. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_mudata.py +0 -0
  57. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_soma_experiment.py +0 -0
  58. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/curate_spatialdata.py +0 -0
  59. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/define_mini_immuno_features_labels.py +0 -0
  60. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/define_mini_immuno_schema_flexible.py +0 -0
  61. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/define_schema_anndata_ensembl_gene_ids_and_valid_features_in_obs.py +0 -0
  62. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/define_schema_anndata_uns.py +0 -0
  63. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/define_schema_df_metadata.py +0 -0
  64. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/define_schema_spatialdata.py +0 -0
  65. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/define_valid_features.py +0 -0
  66. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/run_track_and_finish.py +0 -0
  67. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/run_track_with_params.py +0 -0
  68. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/run_workflow.py +0 -0
  69. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/save_mini_immuno_datasets.py +0 -0
  70. {lamindb-1.11.0 → lamindb-1.11.1}/docs/scripts/synced_with_git.py +0 -0
  71. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/add-replace-cache.ipynb +0 -0
  72. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/anndata-accessor.ipynb +0 -0
  73. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/prepare-transfer-local-to-cloud.ipynb +0 -0
  74. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/test-files/iris.csv +0 -0
  75. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/test-files/iris.data +0 -0
  76. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/test-files/new_iris.csv +0 -0
  77. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/test_notebooks.py +0 -0
  78. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/transfer-local-to-cloud.ipynb +0 -0
  79. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/upload.ipynb +0 -0
  80. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage/vitessce.ipynb +0 -0
  81. {lamindb-1.11.0 → lamindb-1.11.1}/docs/storage.md +0 -0
  82. {lamindb-1.11.0 → lamindb-1.11.1}/docs/test_notebooks.py +0 -0
  83. {lamindb-1.11.0 → lamindb-1.11.1}/docs/track.ipynb +0 -0
  84. {lamindb-1.11.0 → lamindb-1.11.1}/docs/transfer.ipynb +0 -0
  85. {lamindb-1.11.0 → lamindb-1.11.1}/docs/wetlab.md +0 -0
  86. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/_finish.py +0 -0
  87. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/_tracked.py +0 -0
  88. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/_view.py +0 -0
  89. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/base/__init__.py +0 -0
  90. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/base/dtypes.py +0 -0
  91. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/base/fields.py +0 -0
  92. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/base/ids.py +0 -0
  93. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/base/types.py +0 -0
  94. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/base/uids.py +0 -0
  95. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/base/users.py +0 -0
  96. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/__init__.py +0 -0
  97. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/_compat.py +0 -0
  98. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/_mapped_collection.py +0 -0
  99. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/_settings.py +0 -0
  100. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/_sync_git.py +0 -0
  101. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/_track_environment.py +0 -0
  102. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/exceptions.py +0 -0
  103. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/loaders.py +0 -0
  104. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/__init__.py +0 -0
  105. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/_anndata_accessor.py +0 -0
  106. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/_backed_access.py +0 -0
  107. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/_polars_lazy_df.py +0 -0
  108. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/_pyarrow_dataset.py +0 -0
  109. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/_spatialdata_accessor.py +0 -0
  110. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/_tiledbsoma.py +0 -0
  111. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/_valid_suffixes.py +0 -0
  112. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/_zarr.py +0 -0
  113. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/objects.py +0 -0
  114. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/storage/paths.py +0 -0
  115. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/subsettings/__init__.py +0 -0
  116. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/subsettings/_annotation_settings.py +0 -0
  117. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/subsettings/_creation_settings.py +0 -0
  118. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/core/types.py +0 -0
  119. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/curators/__init__.py +0 -0
  120. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/curators/_legacy.py +0 -0
  121. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/curators/core.py +0 -0
  122. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/errors.py +0 -0
  123. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/__init__.py +0 -0
  124. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/cellxgene/__init__.py +0 -0
  125. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/cellxgene/_cellxgene.py +0 -0
  126. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/cellxgene/cellxgene_schema_versions.csv +0 -0
  127. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/croissant/__init__.py +0 -0
  128. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/croissant/mini_immuno.anndata.zarr_metadata.json +0 -0
  129. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/datasets/__init__.py +0 -0
  130. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/datasets/_core.py +0 -0
  131. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/datasets/_fake.py +0 -0
  132. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/datasets/_small.py +0 -0
  133. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/datasets/mini_immuno.py +0 -0
  134. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/fixtures/__init__.py +0 -0
  135. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/fixtures/sheets.py +0 -0
  136. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/schemas/__init__.py +0 -0
  137. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/schemas/_anndata.py +0 -0
  138. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/examples/schemas/_simple.py +0 -0
  139. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/integrations/__init__.py +0 -0
  140. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/integrations/_croissant.py +0 -0
  141. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/integrations/_vitessce.py +0 -0
  142. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0069_squashed.py +0 -0
  143. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0070_lamindbv1_migrate_data.py +0 -0
  144. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0071_lamindbv1_migrate_schema.py +0 -0
  145. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0072_remove_user__branch_code_remove_user_aux_and_more.py +0 -0
  146. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0073_merge_ourprojects.py +0 -0
  147. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0074_lamindbv1_part4.py +0 -0
  148. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0075_lamindbv1_part5.py +0 -0
  149. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0076_lamindbv1_part6.py +0 -0
  150. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0077_lamindbv1_part6b.py +0 -0
  151. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0078_lamindbv1_part6c.py +0 -0
  152. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0079_alter_rundata_value_json_and_more.py +0 -0
  153. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0080_polish_lamindbv1.py +0 -0
  154. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0081_revert_textfield_collection.py +0 -0
  155. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0082_alter_feature_dtype.py +0 -0
  156. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0083_alter_feature_is_type_alter_flextable_is_type_and_more.py +0 -0
  157. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0084_alter_schemafeature_feature_and_more.py +0 -0
  158. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0085_alter_feature_is_type_alter_flextable_is_type_and_more.py +0 -0
  159. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0086_various.py +0 -0
  160. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0087_rename__schemas_m2m_artifact_feature_sets_and_more.py +0 -0
  161. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0088_schema_components.py +0 -0
  162. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0089_subsequent_runs.py +0 -0
  163. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0090_runproject_project_runs.py +0 -0
  164. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0091_alter_featurevalue_options_alter_space_options_and_more.py +0 -0
  165. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0092_alter_artifactfeaturevalue_artifact_and_more.py +0 -0
  166. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0093_alter_schemacomponent_unique_together.py +0 -0
  167. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0094_writeloglock_writelogmigrationstate_and_more.py +0 -0
  168. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0095_remove_rundata_flextable.py +0 -0
  169. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0096_remove_artifact__param_values_and_more.py +0 -0
  170. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0097_remove_schemaparam_param_remove_paramvalue_param_and_more.py +0 -0
  171. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0098_alter_feature_type_alter_project_type_and_more.py +0 -0
  172. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0099_alter_writelog_seqno.py +0 -0
  173. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0100_branch_alter_artifact__branch_code_and_more.py +0 -0
  174. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0101_alter_artifact_hash_alter_feature_name_and_more.py +0 -0
  175. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0102_remove_writelog_branch_code_and_more.py +0 -0
  176. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0103_remove_writelog_migration_state_and_more.py +0 -0
  177. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0104_alter_branch_uid.py +0 -0
  178. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0105_record_unique_name.py +0 -0
  179. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0106_transfer_data_migration.py +0 -0
  180. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0107_add_schema_to_record.py +0 -0
  181. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0108_remove_record_sheet_remove_sheetproject_sheet_and_more.py +0 -0
  182. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0109_record_input_of_runs_alter_record_run_and_more.py +0 -0
  183. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0110_rename_values_artifacts_record_linked_artifacts.py +0 -0
  184. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0111_remove_record__sort_order.py +0 -0
  185. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0112_alter_recordartifact_feature_and_more.py +0 -0
  186. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0113_lower_case_branch_and_space_names.py +0 -0
  187. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0114_alter_run__status_code.py +0 -0
  188. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0115_alter_space_uid.py +0 -0
  189. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0116_remove_artifact_unique_artifact_storage_key_hash_and_more.py +0 -0
  190. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0117_fix_artifact_storage_hash_unique_constraints.py +0 -0
  191. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0118_alter_recordproject_value_projectrecord.py +0 -0
  192. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0119_rename_records_project_linked_in_records.py +0 -0
  193. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0119_squashed.py +0 -0
  194. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0120_add_record_fk_constraint.py +0 -0
  195. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/0121_recorduser.py +0 -0
  196. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/migrations/__init__.py +0 -0
  197. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/__init__.py +0 -0
  198. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/_describe.py +0 -0
  199. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/_django.py +0 -0
  200. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/_feature_manager.py +0 -0
  201. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/_from_values.py +0 -0
  202. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/_is_versioned.py +0 -0
  203. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/_label_manager.py +0 -0
  204. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/_relations.py +0 -0
  205. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/artifact_set.py +0 -0
  206. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/can_curate.py +0 -0
  207. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/collection.py +0 -0
  208. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/feature.py +0 -0
  209. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/has_parents.py +0 -0
  210. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/project.py +0 -0
  211. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/query_manager.py +0 -0
  212. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/query_set.py +0 -0
  213. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/record.py +0 -0
  214. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/run.py +0 -0
  215. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/save.py +0 -0
  216. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/schema.py +0 -0
  217. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/storage.py +0 -0
  218. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/transform.py +0 -0
  219. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/models/ulabel.py +0 -0
  220. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/py.typed +0 -0
  221. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/setup/__init__.py +0 -0
  222. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/setup/_switch.py +0 -0
  223. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/setup/core/__init__.py +0 -0
  224. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/setup/errors/__init__.py +0 -0
  225. {lamindb-1.11.0 → lamindb-1.11.1}/lamindb/setup/types/__init__.py +0 -0
  226. {lamindb-1.11.0 → lamindb-1.11.1}/noxfile.py +0 -0
  227. {lamindb-1.11.0 → lamindb-1.11.1}/pyproject.toml +0 -0
  228. {lamindb-1.11.0 → lamindb-1.11.1}/tests/conftest.py +0 -0
  229. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/_dataset_fixtures.py +0 -0
  230. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/conftest.py +0 -0
  231. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/notebooks/basic-r-notebook.Rmd.cleaned.html +0 -0
  232. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/notebooks/basic-r-notebook.Rmd.html +0 -0
  233. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/notebooks/duplicate/with-title-initialized-consecutive-finish.ipynb +0 -0
  234. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/notebooks/no-title.ipynb +0 -0
  235. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/notebooks/with-title-initialized-consecutive-finish-not-last-cell.ipynb +0 -0
  236. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/notebooks/with-title-initialized-consecutive-finish.ipynb +0 -0
  237. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/scripts/duplicate1/script-to-test-versioning.py +0 -0
  238. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/scripts/duplicate2/script-to-test-versioning.py +0 -0
  239. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/scripts/duplicate3/script-to-test-versioning.py +0 -0
  240. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/scripts/duplicate4/script-to-test-versioning.py +0 -0
  241. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/scripts/duplicate5/script-to-test-versioning.py +0 -0
  242. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/scripts/script-to-test-filename-change.py +0 -0
  243. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/scripts/script-to-test-versioning.py +0 -0
  244. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_artifact.py +0 -0
  245. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_artifact_folders.py +0 -0
  246. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_can_curate.py +0 -0
  247. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_collection.py +0 -0
  248. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_data.py +0 -0
  249. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_db.py +0 -0
  250. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_delete.py +0 -0
  251. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_describe_and_df_calls.py +0 -0
  252. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_dtype.py +0 -0
  253. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_feature.py +0 -0
  254. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_feature_label_manager.py +0 -0
  255. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_from_values.py +0 -0
  256. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_has_parents.py +0 -0
  257. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_integrity.py +0 -0
  258. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_load.py +0 -0
  259. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_manager.py +0 -0
  260. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_models.py +0 -0
  261. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_notebooks.py +0 -0
  262. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_queryset.py +0 -0
  263. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_run.py +0 -0
  264. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_save.py +0 -0
  265. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_schema.py +0 -0
  266. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_search.py +0 -0
  267. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_settings.py +0 -0
  268. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_sqlrecord.py +0 -0
  269. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_storage.py +0 -0
  270. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_track.py +0 -0
  271. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_tracked.py +0 -0
  272. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_transform.py +0 -0
  273. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_ulabel.py +0 -0
  274. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_versioning.py +0 -0
  275. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_view.py +0 -0
  276. {lamindb-1.11.0 → lamindb-1.11.1}/tests/core/test_visibility.py +0 -0
  277. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/conftest.py +0 -0
  278. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/test_cat_managers.py +0 -0
  279. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/test_curate_from_croissant.py +0 -0
  280. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/test_curators_examples.py +0 -0
  281. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/test_curators_general.py +0 -0
  282. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/test_curators_multivalue.py +0 -0
  283. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/test_cxg_curator.py +0 -0
  284. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/test_dataframe_curators_accounting_example.py +0 -0
  285. {lamindb-1.11.0 → lamindb-1.11.1}/tests/curators/test_records.py +0 -0
  286. {lamindb-1.11.0 → lamindb-1.11.1}/tests/permissions/conftest.py +0 -0
  287. {lamindb-1.11.0 → lamindb-1.11.1}/tests/permissions/jwt_utils.py +0 -0
  288. {lamindb-1.11.0 → lamindb-1.11.1}/tests/permissions/scripts/check_lamin_dev.py +0 -0
  289. {lamindb-1.11.0 → lamindb-1.11.1}/tests/permissions/scripts/clean_lamin_dev.py +0 -0
  290. {lamindb-1.11.0 → lamindb-1.11.1}/tests/permissions/scripts/setup_instance.py +0 -0
  291. {lamindb-1.11.0 → lamindb-1.11.1}/tests/storage/conftest.py +0 -0
  292. {lamindb-1.11.0 → lamindb-1.11.1}/tests/storage/test_artifact_storage.py +0 -0
  293. {lamindb-1.11.0 → lamindb-1.11.1}/tests/storage/test_artifact_zarr.py +0 -0
  294. {lamindb-1.11.0 → lamindb-1.11.1}/tests/storage/test_cache.py +0 -0
  295. {lamindb-1.11.0 → lamindb-1.11.1}/tests/storage/test_connect_reconnect.py +0 -0
  296. {lamindb-1.11.0 → lamindb-1.11.1}/tests/storage/test_storage_lifecycle.py +0 -0
  297. {lamindb-1.11.0 → lamindb-1.11.1}/tests/storage/test_transfer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: lamindb
3
- Version: 1.11.0
3
+ Version: 1.11.1
4
4
  Summary: A data framework for biology.
5
5
  Author-email: Lamin Labs <open-source@lamin.ai>
6
6
  Requires-Python: >=3.10,<3.14
@@ -129,7 +129,7 @@ Conversely, you can query artifacts by the script that created them.
129
129
  ln.Artifact.get(transform__key="create-fasta.py") # query artifact by transform key
130
130
  ```
131
131
 
132
- Data lineage is just one type of metadata to help analysis and model training through queries, validation, and annotation. Here is a more [comprehensive example](https://lamin.ai/laminlabs/lamindata/artifact/fgKBV8qdSnbIga0i).
132
+ Data lineage is just one type of metadata to help analysis and model training through queries, validation, and annotation. Here is a more [comprehensive example](https://lamin.ai/laminlabs/lamindata/artifact/9K1dteZ6Qx0EXK8g).
133
133
 
134
134
  <img src="https://lamin-site-assets.s3.amazonaws.com/.lamindb/6sofuDVvTANB0f480001.png" width="850">
135
135
 
@@ -76,7 +76,7 @@ Conversely, you can query artifacts by the script that created them.
76
76
  ln.Artifact.get(transform__key="create-fasta.py") # query artifact by transform key
77
77
  ```
78
78
 
79
- Data lineage is just one type of metadata to help analysis and model training through queries, validation, and annotation. Here is a more [comprehensive example](https://lamin.ai/laminlabs/lamindata/artifact/fgKBV8qdSnbIga0i).
79
+ Data lineage is just one type of metadata to help analysis and model training through queries, validation, and annotation. Here is a more [comprehensive example](https://lamin.ai/laminlabs/lamindata/artifact/9K1dteZ6Qx0EXK8g).
80
80
 
81
81
  <img src="https://lamin-site-assets.s3.amazonaws.com/.lamindb/6sofuDVvTANB0f480001.png" width="850">
82
82
 
@@ -114,7 +114,7 @@ Backwards compatibility.
114
114
 
115
115
  # ruff: noqa: I001
116
116
  # denote a release candidate for 0.1.0 with 0.1rc1, 0.1a1, 0.1b1, etc.
117
- __version__ = "1.11.0"
117
+ __version__ = "1.11.1"
118
118
 
119
119
  import warnings as _warnings
120
120
 
@@ -600,9 +600,11 @@ class Context:
600
600
  if pypackages is None:
601
601
  pypackages = True
602
602
  description = None
603
+ if path.suffix == ".ipynb" and path.stem.startswith("Untitled"):
604
+ raise RuntimeError(
605
+ "Your notebook is untitled, please rename it before tracking"
606
+ )
603
607
  path_str = path.as_posix()
604
- if path_str.endswith("Untitled.ipynb"):
605
- raise RuntimeError("Please rename your notebook before tracking it")
606
608
  if path_str.startswith("/fileId="):
607
609
  logger.warning("tracking on Google Colab is experimental")
608
610
  path_str = get_notebook_key_colab()
@@ -10,7 +10,7 @@ import fsspec
10
10
  import lamindb_setup as ln_setup
11
11
  import pandas as pd
12
12
  from anndata import AnnData
13
- from django.db import connections, models
13
+ from django.db import ProgrammingError, connections, models
14
14
  from django.db.models import CASCADE, PROTECT, Q
15
15
  from django.db.models.functions import Length
16
16
  from lamin_utils import colors, logger
@@ -32,7 +32,7 @@ from lamindb.base.fields import (
32
32
  CharField,
33
33
  ForeignKey,
34
34
  )
35
- from lamindb.errors import FieldValidationError, UnknownStorageLocation
35
+ from lamindb.errors import FieldValidationError, NoWriteAccess, UnknownStorageLocation
36
36
  from lamindb.models.query_set import QuerySet
37
37
 
38
38
  from ..base.users import current_user_id
@@ -294,6 +294,7 @@ def process_data(
294
294
 
295
295
  def get_stat_or_artifact(
296
296
  path: UPath,
297
+ storage: Record,
297
298
  key: str | None = None,
298
299
  check_hash: bool = True,
299
300
  is_replace: bool = False,
@@ -331,14 +332,14 @@ def get_stat_or_artifact(
331
332
  else:
332
333
  result = (
333
334
  Artifact.objects.using(instance)
334
- .filter(Q(hash=hash) | Q(key=key, storage=settings.storage.record))
335
+ .filter(Q(hash=hash) | Q(key=key, storage=storage))
335
336
  .order_by("-created_at")
336
337
  .all()
337
338
  )
338
339
  artifact_with_same_hash_exists = result.filter(hash=hash).count() > 0
339
340
  if not artifact_with_same_hash_exists and len(result) > 0:
340
341
  logger.important(
341
- f"creating new artifact version for key='{key}' (storage: '{settings.storage.root_as_str}')"
342
+ f"creating new artifact version for key='{key}' (storage: '{storage.root}')"
342
343
  )
343
344
  previous_artifact_version = result[0]
344
345
  if artifact_with_same_hash_exists:
@@ -438,6 +439,7 @@ def get_artifact_kwargs_from_data(
438
439
 
439
440
  stat_or_artifact = get_stat_or_artifact(
440
441
  path=path,
442
+ storage=storage,
441
443
  key=key,
442
444
  instance=using_key,
443
445
  is_replace=is_replace,
@@ -3072,8 +3074,12 @@ def _track_run_input(
3072
3074
  )
3073
3075
  data.save()
3074
3076
  is_valid = True
3077
+ data_run_id, run_id = data.run_id, run.id
3078
+ different_runs = (data_run_id != run_id) or (
3079
+ data_run_id is None and run_id is None
3080
+ )
3075
3081
  return (
3076
- data.run_id != run.id
3082
+ different_runs
3077
3083
  and not data._state.adding # this seems duplicated with data._state.db is None
3078
3084
  and is_valid
3079
3085
  )
@@ -3118,8 +3124,9 @@ def _track_run_input(
3118
3124
  if track_run_input:
3119
3125
  if run is None:
3120
3126
  raise ValueError("No run context set. Call `ln.track()`.")
3121
- # avoid adding the same run twice
3122
- run.save()
3127
+ if run._state.adding:
3128
+ # avoid adding the same run twice
3129
+ run.save()
3123
3130
  if data_class_name == "artifact":
3124
3131
  IsLink = run.input_artifacts.through
3125
3132
  links = [
@@ -3131,7 +3138,41 @@ def _track_run_input(
3131
3138
  IsLink(run_id=run.id, collection_id=data_id)
3132
3139
  for data_id in input_data_ids
3133
3140
  ]
3134
- IsLink.objects.bulk_create(links, ignore_conflicts=True)
3141
+ try:
3142
+ IsLink.objects.bulk_create(links, ignore_conflicts=True)
3143
+ except ProgrammingError as e:
3144
+ if "new row violates row-level security policy" in str(e):
3145
+ instance = setup_settings.instance
3146
+ available_spaces = instance.available_spaces
3147
+ if available_spaces is None:
3148
+ raise NoWriteAccess(
3149
+ f"You’re not allowed to write to the instance {instance.slug}.\n"
3150
+ "Please contact administrators of the instance if you need write access."
3151
+ ) from None
3152
+ write_access_spaces = (
3153
+ available_spaces["admin"] + available_spaces["write"]
3154
+ )
3155
+ no_write_access_spaces = {
3156
+ data_space
3157
+ for data in input_data
3158
+ if (data_space := data.space) not in write_access_spaces
3159
+ }
3160
+ if (run_space := run.space) not in write_access_spaces:
3161
+ no_write_access_spaces.add(run_space)
3162
+ if len(no_write_access_spaces) > 1:
3163
+ name_msg = ", ".join(
3164
+ f"'{space.name}'" for space in no_write_access_spaces
3165
+ )
3166
+ space_msg = "spaces"
3167
+ else:
3168
+ name_msg = f"'{no_write_access_spaces.pop().name}'"
3169
+ space_msg = "space"
3170
+ raise NoWriteAccess(
3171
+ f"You’re not allowed to write to the {space_msg} {name_msg}.\n"
3172
+ f"Please contact administrators of the {space_msg} if you need write access."
3173
+ ) from None
3174
+ else:
3175
+ raise e
3135
3176
 
3136
3177
 
3137
3178
  # privates currently dealt with separately
@@ -918,7 +918,7 @@ class BaseSQLRecord(models.Model, metaclass=Registry):
918
918
  ):
919
919
  raise NoWriteAccess(
920
920
  f"You’re not allowed to write to the space '{self.space.name}'.\n"
921
- "Please contact an administrator of the space if you need write access."
921
+ "Please contact administrators of the space if you need write access."
922
922
  ) from None
923
923
  else:
924
924
  raise
@@ -100,6 +100,11 @@ feature = ln.Feature(name="team_access_feature", dtype=float)
100
100
  feature.space = team_access
101
101
  feature.save()
102
102
 
103
+ # artifact for testing tracking error
104
+ artifact = ln.Artifact("README.md", description="test tracking error")
105
+ artifact.space = select_access
106
+ artifact.save()
107
+
103
108
  print("Created models")
104
109
 
105
110
  # save jwt db connection
@@ -10,6 +10,7 @@ import pytest
10
10
  from django.db import connection, transaction
11
11
  from django.db.utils import IntegrityError, InternalError, ProgrammingError
12
12
  from jwt_utils import sign_jwt
13
+ from lamindb.models.artifact import _track_run_input
13
14
  from lamindb_setup.core.django import DBToken, db_token_manager
14
15
  from psycopg2.extensions import adapt
15
16
 
@@ -294,6 +295,49 @@ def test_write_role():
294
295
 
295
296
  ln.ULabel(name="new label team default space").save()
296
297
 
298
+ with psycopg2.connect(pgurl) as conn, conn.cursor() as cur:
299
+ cur.execute(
300
+ "UPDATE hubmodule_team SET role = 'read' WHERE uid = 'teamuiduid11'",
301
+ )
302
+
303
+
304
+ def test_tracking_error():
305
+ # switch user role to write to create the transform and run
306
+ with psycopg2.connect(pgurl) as conn, conn.cursor() as cur:
307
+ cur.execute(
308
+ "UPDATE hubmodule_account SET role = 'write' WHERE id = %s", (user_uuid,)
309
+ )
310
+
311
+ artifact = ln.Artifact.get(description="test tracking error")
312
+
313
+ transform = ln.Transform(key="My transform").save()
314
+ run = ln.Run(transform) # unsaved, this is saved inside _track_run_input
315
+
316
+ # this error because ln.setup.settings.instance._db_permissions is not jwt
317
+ # it is None
318
+ with pytest.raises(ln.errors.NoWriteAccess) as e:
319
+ _track_run_input(artifact, run)
320
+ assert "You’re not allowed to write to the instance " in str(e)
321
+
322
+ # the instance is local so we set this manually
323
+ ln.setup.settings.instance._db_permissions = "jwt"
324
+ # artifact.space is not available for writes
325
+ with pytest.raises(ln.errors.NoWriteAccess) as e:
326
+ _track_run_input(artifact, run)
327
+ assert "You’re not allowed to write to the space " in str(e)
328
+
329
+ # switch user role back to read
330
+ with psycopg2.connect(pgurl) as conn, conn.cursor() as cur:
331
+ cur.execute(
332
+ "UPDATE hubmodule_account SET role = 'read' WHERE id = %s", (user_uuid,)
333
+ )
334
+ # as the user is read-only now, 2 spaces are unavailable for writes (artifact.space, run.space)
335
+ with pytest.raises(ln.errors.NoWriteAccess) as e:
336
+ _track_run_input(artifact, run)
337
+ assert "You’re not allowed to write to the spaces " in str(e)
338
+
339
+ ln.setup.settings.instance._db_permissions = None
340
+
297
341
 
298
342
  def test_token_reset():
299
343
  db_token_manager.reset()
@@ -680,10 +680,18 @@ def test_compressed():
680
680
  _compress(adata_f, adata_gz)
681
681
 
682
682
  artifact = ln.Artifact.from_anndata(adata_gz, key="adata.h5ad.gz").save()
683
+
684
+ print("begin open adata.h5ad.gz")
685
+
683
686
  with artifact.open() as store:
684
687
  assert isinstance(store, AnnDataAccessor)
688
+
689
+ print("begin load adata.h5ad.gz")
690
+
685
691
  assert isinstance(artifact.load(), ad.AnnData)
686
692
 
693
+ print("begin open adata.h5ad.gz with compression=None")
694
+
687
695
  with pytest.raises(OSError):
688
696
  artifact.open(compression=None)
689
697
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes