liminal-orm 4.6.2__tar.gz → 4.7.0a1__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.
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/base_model.py +2 -1
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/base_results_model.py +2 -1
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dataframe_compatibility.py +28 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/__init__.py +0 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_dropdown.py +93 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_operation.py +97 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_validation_filters.py +32 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/compare_operation.py +13 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/name_template_parts.py +8 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_field_properties.py +138 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_name_template.py +83 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_schema_properties.py +140 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/str_enum.py +9 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/cli.py +316 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/controller.py +244 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/live_test_dropdown_migration.py +77 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/live_test_entity_schema_migration.py +144 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/utils.py +73 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/__init__.py +5 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/benchling_connection.py +83 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/benchling_service.py +411 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/api.py +175 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/compare.py +170 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/generate_files.py +70 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/operations.py +344 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/utils.py +123 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/api.py +95 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/compare.py +462 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/entity_schema_models.py +209 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/generate_files.py +250 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/operations.py +620 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/tag_schema_models.py +613 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/utils.py +149 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/__init__.py +8 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_api_field_type.py +23 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_entity_type.py +32 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_field_type.py +78 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_folder_item_type.py +10 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_naming_strategy.py +32 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_sequence_type.py +8 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/name_template_part_type.py +14 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/sequence_constraint.py +13 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/external/__init__.py +47 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/mappers.py +272 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/components.py +97 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/revision.py +204 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/revisions_timeline.py +335 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base.py +16 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_model.py +444 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_results_model.py +237 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/registry_entity.py +60 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/schema.py +31 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/user.py +32 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/column.py +147 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/mixins.py +98 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/name_template.py +39 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/name_template_parts.py +111 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/relationship.py +114 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/results_schema_properties.py +23 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/schema_properties.py +96 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/py.typed +0 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/generate_files.py +207 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/models/results_schema_model.py +144 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/utils.py +48 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/__init__.py +0 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/conftest.py +542 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/from benchling_sdk.py +3 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_benchling_service.py +34 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_dataframe_compatibility.py +33 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_dropdown_compare.py +192 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_entity_schema_compare.py +407 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/unit_dictionary/utils.py +48 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/utils.py +96 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/validation/__init__.py +151 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/validation/validation_severity.py +10 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/__init__.py +0 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_dropdown.py +93 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_operation.py +97 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_validation_filters.py +32 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/compare_operation.py +13 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/name_template_parts.py +8 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_field_properties.py +138 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_name_template.py +83 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_schema_properties.py +140 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/str_enum.py +9 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/cli.py +316 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/controller.py +244 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/live_test_dropdown_migration.py +77 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/live_test_entity_schema_migration.py +144 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/utils.py +73 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/__init__.py +5 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/benchling_connection.py +83 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/benchling_service.py +411 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/api.py +175 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/compare.py +170 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/generate_files.py +70 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/operations.py +344 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/utils.py +123 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/api.py +95 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/compare.py +462 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/entity_schema_models.py +209 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/generate_files.py +250 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/operations.py +620 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/tag_schema_models.py +613 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/utils.py +149 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/__init__.py +8 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_api_field_type.py +23 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_entity_type.py +32 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_field_type.py +78 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_folder_item_type.py +10 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_naming_strategy.py +32 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_sequence_type.py +8 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/name_template_part_type.py +14 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/sequence_constraint.py +13 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/external/__init__.py +47 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/mappers.py +272 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/components.py +97 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/revision.py +204 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/revisions_timeline.py +335 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base.py +16 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_model.py +444 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_results_model.py +237 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/registry_entity.py +60 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/schema.py +31 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/user.py +32 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/column.py +147 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/mixins.py +98 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/name_template.py +39 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/name_template_parts.py +111 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/relationship.py +114 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/results_schema_properties.py +23 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/schema_properties.py +96 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/py.typed +0 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/generate_files.py +207 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/models/results_schema_model.py +144 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/utils.py +48 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/__init__.py +0 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/conftest.py +542 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/from benchling_sdk.py +3 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_benchling_service.py +34 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dataframe_compatibility.py +28 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dropdown_compare.py +192 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_entity_schema_compare.py +407 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/unit_dictionary/utils.py +48 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/utils.py +96 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/validation/__init__.py +151 -0
- liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/validation/validation_severity.py +10 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/PKG-INFO +16 -5
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/README.md +1 -0
- liminal_orm-4.7.0a1/liminal/__init__.py +0 -0
- liminal_orm-4.7.0a1/liminal/base/base_dropdown.py +93 -0
- liminal_orm-4.7.0a1/liminal/base/base_operation.py +97 -0
- liminal_orm-4.7.0a1/liminal/base/base_validation_filters.py +32 -0
- liminal_orm-4.7.0a1/liminal/base/compare_operation.py +13 -0
- liminal_orm-4.7.0a1/liminal/base/name_template_parts.py +8 -0
- liminal_orm-4.7.0a1/liminal/base/properties/base_field_properties.py +138 -0
- liminal_orm-4.7.0a1/liminal/base/properties/base_name_template.py +83 -0
- liminal_orm-4.7.0a1/liminal/base/properties/base_schema_properties.py +140 -0
- liminal_orm-4.7.0a1/liminal/base/str_enum.py +9 -0
- liminal_orm-4.7.0a1/liminal/cli/cli.py +316 -0
- liminal_orm-4.7.0a1/liminal/cli/controller.py +244 -0
- liminal_orm-4.7.0a1/liminal/cli/live_test_dropdown_migration.py +77 -0
- liminal_orm-4.7.0a1/liminal/cli/live_test_entity_schema_migration.py +144 -0
- liminal_orm-4.7.0a1/liminal/cli/utils.py +73 -0
- liminal_orm-4.7.0a1/liminal/connection/__init__.py +5 -0
- liminal_orm-4.7.0a1/liminal/connection/benchling_connection.py +83 -0
- liminal_orm-4.7.0a1/liminal/connection/benchling_service.py +411 -0
- liminal_orm-4.7.0a1/liminal/dropdowns/api.py +175 -0
- liminal_orm-4.7.0a1/liminal/dropdowns/compare.py +170 -0
- liminal_orm-4.7.0a1/liminal/dropdowns/generate_files.py +70 -0
- liminal_orm-4.7.0a1/liminal/dropdowns/operations.py +344 -0
- liminal_orm-4.7.0a1/liminal/dropdowns/utils.py +123 -0
- liminal_orm-4.7.0a1/liminal/entity_schemas/api.py +95 -0
- liminal_orm-4.7.0a1/liminal/entity_schemas/compare.py +462 -0
- liminal_orm-4.7.0a1/liminal/entity_schemas/entity_schema_models.py +209 -0
- liminal_orm-4.7.0a1/liminal/entity_schemas/generate_files.py +250 -0
- liminal_orm-4.7.0a1/liminal/entity_schemas/operations.py +620 -0
- liminal_orm-4.7.0a1/liminal/entity_schemas/tag_schema_models.py +613 -0
- liminal_orm-4.7.0a1/liminal/entity_schemas/test_entity_dataframe_compatibility.py +28 -0
- liminal_orm-4.7.0a1/liminal/entity_schemas/utils.py +149 -0
- liminal_orm-4.7.0a1/liminal/enums/__init__.py +8 -0
- liminal_orm-4.7.0a1/liminal/enums/benchling_api_field_type.py +23 -0
- liminal_orm-4.7.0a1/liminal/enums/benchling_entity_type.py +32 -0
- liminal_orm-4.7.0a1/liminal/enums/benchling_field_type.py +78 -0
- liminal_orm-4.7.0a1/liminal/enums/benchling_folder_item_type.py +10 -0
- liminal_orm-4.7.0a1/liminal/enums/benchling_naming_strategy.py +32 -0
- liminal_orm-4.7.0a1/liminal/enums/benchling_sequence_type.py +8 -0
- liminal_orm-4.7.0a1/liminal/enums/name_template_part_type.py +14 -0
- liminal_orm-4.7.0a1/liminal/enums/sequence_constraint.py +13 -0
- liminal_orm-4.7.0a1/liminal/external/__init__.py +47 -0
- liminal_orm-4.7.0a1/liminal/mappers.py +272 -0
- liminal_orm-4.7.0a1/liminal/migrate/components.py +97 -0
- liminal_orm-4.7.0a1/liminal/migrate/revision.py +204 -0
- liminal_orm-4.7.0a1/liminal/migrate/revisions_timeline.py +335 -0
- liminal_orm-4.7.0a1/liminal/orm/base.py +16 -0
- liminal_orm-4.7.0a1/liminal/orm/base_model.py +444 -0
- liminal_orm-4.7.0a1/liminal/orm/base_results_model.py +237 -0
- liminal_orm-4.7.0a1/liminal/orm/base_tables/registry_entity.py +60 -0
- liminal_orm-4.7.0a1/liminal/orm/base_tables/schema.py +31 -0
- liminal_orm-4.7.0a1/liminal/orm/base_tables/user.py +32 -0
- liminal_orm-4.7.0a1/liminal/orm/column.py +147 -0
- liminal_orm-4.7.0a1/liminal/orm/mixins.py +98 -0
- liminal_orm-4.7.0a1/liminal/orm/name_template.py +39 -0
- liminal_orm-4.7.0a1/liminal/orm/name_template_parts.py +111 -0
- liminal_orm-4.7.0a1/liminal/orm/relationship.py +114 -0
- liminal_orm-4.7.0a1/liminal/orm/results_schema_properties.py +23 -0
- liminal_orm-4.7.0a1/liminal/orm/schema_properties.py +96 -0
- liminal_orm-4.7.0a1/liminal/py.typed +0 -0
- liminal_orm-4.7.0a1/liminal/results_schemas/generate_files.py +207 -0
- liminal_orm-4.7.0a1/liminal/results_schemas/models/results_schema_model.py +144 -0
- liminal_orm-4.7.0a1/liminal/results_schemas/test_results_dataframe_compatibility.py +30 -0
- liminal_orm-4.7.0a1/liminal/results_schemas/utils.py +48 -0
- liminal_orm-4.7.0a1/liminal/tests/__init__.py +0 -0
- liminal_orm-4.7.0a1/liminal/tests/conftest.py +542 -0
- liminal_orm-4.7.0a1/liminal/tests/from benchling_sdk.py +3 -0
- liminal_orm-4.7.0a1/liminal/tests/test_benchling_service.py +34 -0
- liminal_orm-4.7.0a1/liminal/tests/test_dropdown_compare.py +192 -0
- liminal_orm-4.7.0a1/liminal/tests/test_entity_schema_compare.py +407 -0
- liminal_orm-4.7.0a1/liminal/unit_dictionary/utils.py +48 -0
- liminal_orm-4.7.0a1/liminal/utils.py +96 -0
- liminal_orm-4.7.0a1/liminal/validation/__init__.py +151 -0
- liminal_orm-4.7.0a1/liminal/validation/validation_severity.py +10 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/pyproject.toml +22 -6
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/.gitignore +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/__init__.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/base_dropdown.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/base_operation.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/base_validation_filters.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/compare_operation.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/name_template_parts.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/properties/base_field_properties.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/properties/base_name_template.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/properties/base_schema_properties.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/base/str_enum.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/cli/cli.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/cli/controller.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/cli/live_test_dropdown_migration.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/cli/live_test_entity_schema_migration.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/cli/utils.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/connection/__init__.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/connection/benchling_connection.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/connection/benchling_service.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/dropdowns/api.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/dropdowns/compare.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/dropdowns/generate_files.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/dropdowns/operations.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/dropdowns/utils.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/entity_schemas/api.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/entity_schemas/compare.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/entity_schemas/entity_schema_models.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/entity_schemas/generate_files.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/entity_schemas/operations.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/entity_schemas/tag_schema_models.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/entity_schemas/utils.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/__init__.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/benchling_api_field_type.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/benchling_entity_type.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/benchling_field_type.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/benchling_folder_item_type.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/benchling_naming_strategy.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/benchling_sequence_type.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/name_template_part_type.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/enums/sequence_constraint.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/external/__init__.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/mappers.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/migrate/components.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/migrate/revision.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/migrate/revisions_timeline.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/base.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/base_tables/registry_entity.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/base_tables/schema.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/base_tables/user.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/column.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/mixins.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/name_template.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/name_template_parts.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/relationship.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/results_schema_properties.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/orm/schema_properties.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/py.typed +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/results_schemas/generate_files.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/results_schemas/models/results_schema_model.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/results_schemas/utils.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/tests/__init__.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/tests/conftest.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/tests/from benchling_sdk.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/tests/test_benchling_service.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/tests/test_dropdown_compare.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/tests/test_entity_schema_compare.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/unit_dictionary/utils.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/utils.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/validation/__init__.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK}/liminal/validation/validation_severity.py +0 -0
- {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/LICENSE.md +0 -0
|
@@ -352,7 +352,8 @@ class BaseModel(Generic[T], Base):
|
|
|
352
352
|
A pandas dataframe of all entities from the database.
|
|
353
353
|
"""
|
|
354
354
|
query = cls.query(session)
|
|
355
|
-
|
|
355
|
+
result = session.connection().execute(query.statement)
|
|
356
|
+
return pd.DataFrame(result.fetchall(), columns=list(result.keys()))
|
|
356
357
|
|
|
357
358
|
@classmethod
|
|
358
359
|
def query(cls, session: Session) -> Query:
|
|
@@ -143,7 +143,8 @@ class BaseResultsModel(Generic[T], Base):
|
|
|
143
143
|
A pandas dataframe of all results schema rows from the database.
|
|
144
144
|
"""
|
|
145
145
|
query = cls.query(session)
|
|
146
|
-
|
|
146
|
+
result = session.connection().execute(query.statement)
|
|
147
|
+
return pd.DataFrame(result.fetchall(), columns=list(result.keys()))
|
|
147
148
|
|
|
148
149
|
@classmethod
|
|
149
150
|
def query(cls, session: Session) -> Query:
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from unittest.mock import patch
|
|
2
|
+
|
|
3
|
+
from sqlalchemy import Column, Integer, String, create_engine
|
|
4
|
+
from sqlalchemy.orm import Session, declarative_base
|
|
5
|
+
|
|
6
|
+
from liminal.orm.base_model import BaseModel
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_dataframe_query_supports_declared_pandas_and_sqlalchemy_versions() -> None:
|
|
10
|
+
test_base = declarative_base()
|
|
11
|
+
|
|
12
|
+
class ExampleRow(test_base): # type: ignore[valid-type,misc]
|
|
13
|
+
__tablename__ = "example_rows"
|
|
14
|
+
|
|
15
|
+
id = Column(Integer, primary_key=True)
|
|
16
|
+
name = Column(String)
|
|
17
|
+
|
|
18
|
+
engine = create_engine("sqlite://")
|
|
19
|
+
test_base.metadata.create_all(engine)
|
|
20
|
+
|
|
21
|
+
with Session(engine) as session:
|
|
22
|
+
session.add(ExampleRow(name="example"))
|
|
23
|
+
session.commit()
|
|
24
|
+
|
|
25
|
+
with patch.object(BaseModel, "query", return_value=session.query(ExampleRow)):
|
|
26
|
+
dataframe = BaseModel.df(session)
|
|
27
|
+
|
|
28
|
+
assert dataframe.to_dict(orient="records") == [{"id": 1, "name": "example"}]
|
|
File without changes
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from abc import ABC
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from liminal.connection.benchling_service import BenchlingService
|
|
5
|
+
from liminal.dropdowns.utils import get_benchling_dropdown_summaries
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class BaseDropdown(ABC):
|
|
9
|
+
"""_summary_
|
|
10
|
+
|
|
11
|
+
Parameters
|
|
12
|
+
----------
|
|
13
|
+
__benchling_name__: str
|
|
14
|
+
The name of the dropdown in Benchling. There can be no duplicate dropdown names in Benchling.
|
|
15
|
+
__allowed_values__: list[str]
|
|
16
|
+
The list of values for the dropdown. Order matters and reflects the order of the dropdown in Benchling. Values must be unique.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
__benchling_name__: str
|
|
20
|
+
__allowed_values__: list[str]
|
|
21
|
+
|
|
22
|
+
_existing_benchling_names: set[str] = set()
|
|
23
|
+
|
|
24
|
+
def __new__(cls, **kwargs: Any) -> "BaseDropdown":
|
|
25
|
+
if not hasattr(cls, "__allowed_values__"):
|
|
26
|
+
raise ValueError(f"{cls.__name__} must define __allowed_values__")
|
|
27
|
+
if not hasattr(cls, "__benchling_name__") or not cls.__benchling_name__:
|
|
28
|
+
raise ValueError(f"{cls.__name__} must define __benchling_name__")
|
|
29
|
+
if len(cls.__allowed_values__) != len(set(cls.__allowed_values__)):
|
|
30
|
+
raise ValueError(
|
|
31
|
+
f"{cls.__name__} must have unique values in __allowed_values__"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
if cls.__benchling_name__ in cls._existing_benchling_names:
|
|
35
|
+
raise ValueError(
|
|
36
|
+
f"{cls.__benchling_name__} is already used as a benchling name."
|
|
37
|
+
)
|
|
38
|
+
cls._existing_benchling_names.add(cls.__benchling_name__)
|
|
39
|
+
return super().__new__(cls, **kwargs)
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def get_id(cls, benchling_service: BenchlingService) -> str:
|
|
43
|
+
"""Connects to Benchling and returns the id of the dropdown using the __benchling_name__.
|
|
44
|
+
|
|
45
|
+
Parameters
|
|
46
|
+
----------
|
|
47
|
+
benchling_service : BenchlingService
|
|
48
|
+
The Benchling service to use.
|
|
49
|
+
|
|
50
|
+
Returns
|
|
51
|
+
-------
|
|
52
|
+
str
|
|
53
|
+
The id of the dropdown.
|
|
54
|
+
"""
|
|
55
|
+
all_dropdowns = get_benchling_dropdown_summaries(benchling_service)
|
|
56
|
+
dropdowns_found_by_name = [
|
|
57
|
+
d for d in all_dropdowns if d.name == cls.__benchling_name__
|
|
58
|
+
]
|
|
59
|
+
if len(dropdowns_found_by_name) == 0:
|
|
60
|
+
raise ValueError(f"No dropdowns found with name '{cls.__benchling_name__}'")
|
|
61
|
+
else:
|
|
62
|
+
dropdown = dropdowns_found_by_name[0]
|
|
63
|
+
return dropdown.id
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def validate(cls, *values: str | None) -> None:
|
|
67
|
+
err_values = []
|
|
68
|
+
for value in values:
|
|
69
|
+
if value and value not in cls.__allowed_values__:
|
|
70
|
+
err_values.append(value)
|
|
71
|
+
if len(err_values) > 0:
|
|
72
|
+
raise ValueError(
|
|
73
|
+
f"{', '.join(err_values)} are not valid {cls.__benchling_name__} dropdown values."
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def get_all_subclasses(
|
|
78
|
+
cls, names: set[str] | None = None
|
|
79
|
+
) -> list[type["BaseDropdown"]]:
|
|
80
|
+
if names is None:
|
|
81
|
+
return cls.__subclasses__()
|
|
82
|
+
dropdowns = {
|
|
83
|
+
name: subclass
|
|
84
|
+
for subclass in cls.__subclasses__()
|
|
85
|
+
for name in names
|
|
86
|
+
if name in (subclass.__name__, subclass.__benchling_name__)
|
|
87
|
+
}
|
|
88
|
+
if len(dropdowns.keys()) != len(set(names)):
|
|
89
|
+
missing_dropdowns = set(names) - set(dropdowns.keys())
|
|
90
|
+
raise ValueError(
|
|
91
|
+
f"No dropdown subclass found for the following class names or warehouse names: {', '.join(missing_dropdowns)}"
|
|
92
|
+
)
|
|
93
|
+
return list(dropdowns.values())
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Any, ClassVar
|
|
3
|
+
|
|
4
|
+
from liminal.connection.benchling_service import BenchlingService
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Order of operations based on order class var:
|
|
8
|
+
1. CreateDropdown
|
|
9
|
+
2. UpdateDropdownName
|
|
10
|
+
3. UnarchiveDropdown
|
|
11
|
+
4. CreateDropdownOption
|
|
12
|
+
5. UpdateDropdownOption
|
|
13
|
+
6. ArchiveDropdownOption
|
|
14
|
+
7. ReorderDropdownOptions
|
|
15
|
+
8. CreateSchema
|
|
16
|
+
9. UnarchiveSchema
|
|
17
|
+
10. CreateField
|
|
18
|
+
11. UpdateEntitySchemaNameTemplate
|
|
19
|
+
12. UpdateSchema
|
|
20
|
+
13. UnarchiveField
|
|
21
|
+
14. UpdateField
|
|
22
|
+
15. ArchiveField
|
|
23
|
+
16. ReorderFields
|
|
24
|
+
17. ArchiveSchema
|
|
25
|
+
18. ArchiveDropdown
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class BaseOperation(ABC):
|
|
30
|
+
"""A class that represents a callable operation to be run during a Benchling schema migration."""
|
|
31
|
+
|
|
32
|
+
order: ClassVar[int] = 0
|
|
33
|
+
|
|
34
|
+
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
35
|
+
self.args = args
|
|
36
|
+
self.kwargs = kwargs
|
|
37
|
+
|
|
38
|
+
def validate(self, benchling_service: BenchlingService) -> None:
|
|
39
|
+
"""Validate the operation before running it. This is not called at runtime,
|
|
40
|
+
but is used to validate operations before a migration is run."""
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
@abstractmethod
|
|
44
|
+
def execute(self, benchling_service: BenchlingService) -> dict[str, Any]:
|
|
45
|
+
"""Execute the operation using the given Benchling SDK instance.
|
|
46
|
+
|
|
47
|
+
Parameters
|
|
48
|
+
----------
|
|
49
|
+
benchling_service : BenchlingService
|
|
50
|
+
The BenchlingService to connect to the given Benchling tenant with.
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
Returns
|
|
54
|
+
-------
|
|
55
|
+
dict[str, Any]
|
|
56
|
+
The contents of the response from the operation.
|
|
57
|
+
"""
|
|
58
|
+
raise NotImplementedError
|
|
59
|
+
|
|
60
|
+
@abstractmethod
|
|
61
|
+
def describe_operation(self) -> str:
|
|
62
|
+
"""Returns a description of what the CallableOperation will do."""
|
|
63
|
+
raise NotImplementedError
|
|
64
|
+
|
|
65
|
+
@abstractmethod
|
|
66
|
+
def describe(self) -> str:
|
|
67
|
+
"""Returns a description of what the state of the comparison is."""
|
|
68
|
+
raise NotImplementedError
|
|
69
|
+
|
|
70
|
+
def __repr__(self) -> str:
|
|
71
|
+
"""Generates a string representation of the class so that it can be executed."""
|
|
72
|
+
args = []
|
|
73
|
+
for k, v in self.__dict__.items():
|
|
74
|
+
if k.startswith("_"):
|
|
75
|
+
continue
|
|
76
|
+
if isinstance(v, str):
|
|
77
|
+
args.append(f"'{v}'")
|
|
78
|
+
else:
|
|
79
|
+
args.append(f"{v.__repr__()}")
|
|
80
|
+
return f"{self.__class__.__name__}({', '.join(args)})"
|
|
81
|
+
|
|
82
|
+
def revision_file_string(self) -> str:
|
|
83
|
+
"""Generates an exact string representation of the operation that can be evaluated.
|
|
84
|
+
Imports in external module as b so that it can be evaluated in the revision file."""
|
|
85
|
+
import liminal.external as b
|
|
86
|
+
|
|
87
|
+
liminal_imports = [c for c in dir(b) if not c.startswith("_")]
|
|
88
|
+
op_str = repr(self)
|
|
89
|
+
for i in liminal_imports:
|
|
90
|
+
if f"{i}(" in op_str:
|
|
91
|
+
op_str = op_str.replace(f"{i}(", f"b.{i}(")
|
|
92
|
+
if f"{i}." in op_str:
|
|
93
|
+
op_str = op_str.replace(f"{i}.", f"b.{i}.")
|
|
94
|
+
return op_str
|
|
95
|
+
|
|
96
|
+
def __lt__(self, other: "BaseOperation") -> bool:
|
|
97
|
+
return self.order < other.order
|
liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_validation_filters.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from datetime import date
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class BaseValidatorFilters(BaseModel):
|
|
7
|
+
"""
|
|
8
|
+
This class is used to pass base filters to benchling warehouse database queries.
|
|
9
|
+
These columns are found on all tables in the benchling warehouse database.
|
|
10
|
+
|
|
11
|
+
Parameters
|
|
12
|
+
----------
|
|
13
|
+
created_date_start: date | None
|
|
14
|
+
Start date for created date filter.
|
|
15
|
+
created_date_end: date | None
|
|
16
|
+
End date for created date filter.
|
|
17
|
+
updated_date_start: date | None
|
|
18
|
+
Start date for updated date filter.
|
|
19
|
+
updated_date_end: date | None
|
|
20
|
+
End date for updated date filter.
|
|
21
|
+
entity_ids: list[str] | None
|
|
22
|
+
List of entity IDs to filter by.
|
|
23
|
+
creator_full_names: list[str] | None
|
|
24
|
+
List of creator full names to filter by.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
created_date_start: date | None = None
|
|
28
|
+
created_date_end: date | None = None
|
|
29
|
+
updated_date_start: date | None = None
|
|
30
|
+
updated_date_end: date | None = None
|
|
31
|
+
entity_ids: list[str] | None = None
|
|
32
|
+
creator_full_names: list[str] | None = None
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from pydantic import BaseModel, ConfigDict
|
|
2
|
+
|
|
3
|
+
from liminal.base.base_operation import BaseOperation
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class CompareOperation(BaseModel):
|
|
7
|
+
op: BaseOperation
|
|
8
|
+
reverse_op: BaseOperation
|
|
9
|
+
|
|
10
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
11
|
+
|
|
12
|
+
def __lt__(self, other: "CompareOperation") -> bool:
|
|
13
|
+
return self.op.order < other.op.order
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import warnings
|
|
2
|
+
|
|
3
|
+
from liminal.orm.name_template_parts import * # noqa: F403
|
|
4
|
+
|
|
5
|
+
warnings.warn(
|
|
6
|
+
"Importing from 'liminal.base.name_template_parts' is deprecated. Please import from 'liminal.orm.name_template_parts' instead. This will be removed in v5.",
|
|
7
|
+
FutureWarning,
|
|
8
|
+
)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, PrivateAttr
|
|
6
|
+
|
|
7
|
+
from liminal.enums import BenchlingFieldType
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BaseFieldProperties(BaseModel):
|
|
11
|
+
"""A class that represents the properties of a field on an entity schema in Benchling.
|
|
12
|
+
This is used to define properties in a benchling column and is used to generically define properties of a field.
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
name : str | None
|
|
17
|
+
The external facing name of the field.
|
|
18
|
+
warehouse_name : str | None
|
|
19
|
+
The sql column name in the benchling warehouse.
|
|
20
|
+
type : BenchlingFieldType | None
|
|
21
|
+
The type of the field.
|
|
22
|
+
required : bool | None
|
|
23
|
+
Whether the field is required.
|
|
24
|
+
is_multi : bool | None
|
|
25
|
+
Whether the field is a multi-value field.
|
|
26
|
+
parent_link : bool | None
|
|
27
|
+
Whether the entity link field is a parent of the entity schema.
|
|
28
|
+
dropdown : Type[BaseDropdown] | str | None
|
|
29
|
+
The dropdown for the field or the __benchling_name__ of the dropdown.
|
|
30
|
+
If a string gets passed in, it gets converted to the dropdown class.
|
|
31
|
+
entity_link : str | None
|
|
32
|
+
The warehouse name of the entity schema that the field links to.
|
|
33
|
+
If a string gets passed in, it gets converted to the entity schema class.
|
|
34
|
+
tooltip : str | None
|
|
35
|
+
The tooltip text for the field.
|
|
36
|
+
_archived : bool | None
|
|
37
|
+
Whether the field is archived in Benchling.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
name: str | None = None
|
|
41
|
+
warehouse_name: str | None = None
|
|
42
|
+
type: BenchlingFieldType | None = None
|
|
43
|
+
required: bool | None = None
|
|
44
|
+
is_multi: bool | None = None
|
|
45
|
+
parent_link: bool | None = None
|
|
46
|
+
dropdown_link: str | None = None
|
|
47
|
+
entity_link: str | None = None
|
|
48
|
+
tooltip: str | None = None
|
|
49
|
+
decimal_places: int | None = None
|
|
50
|
+
unit_name: str | None = None
|
|
51
|
+
_archived: bool | None = PrivateAttr(default=None)
|
|
52
|
+
|
|
53
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
54
|
+
|
|
55
|
+
def __init__(self, **data: Any):
|
|
56
|
+
super().__init__(**data)
|
|
57
|
+
self._archived = data.get("_archived", None)
|
|
58
|
+
|
|
59
|
+
def set_archived(self, value: bool) -> BaseFieldProperties:
|
|
60
|
+
self._archived = value
|
|
61
|
+
return self
|
|
62
|
+
|
|
63
|
+
def set_warehouse_name(self, wh_name: str) -> BaseFieldProperties:
|
|
64
|
+
self.warehouse_name = wh_name
|
|
65
|
+
return self
|
|
66
|
+
|
|
67
|
+
def unset_tooltip(self) -> BaseFieldProperties:
|
|
68
|
+
if "tooltip" in self.__pydantic_fields_set__:
|
|
69
|
+
self.__pydantic_fields_set__.remove("tooltip")
|
|
70
|
+
return self
|
|
71
|
+
|
|
72
|
+
def unset_entity_link(self) -> BaseFieldProperties:
|
|
73
|
+
if "entity_link" in self.__pydantic_fields_set__:
|
|
74
|
+
self.__pydantic_fields_set__.remove("entity_link")
|
|
75
|
+
return self
|
|
76
|
+
|
|
77
|
+
def unset_unit_name(self) -> BaseFieldProperties:
|
|
78
|
+
if "unit_name" in self.__pydantic_fields_set__:
|
|
79
|
+
self.__pydantic_fields_set__.remove("unit_name")
|
|
80
|
+
return self
|
|
81
|
+
|
|
82
|
+
def set_type(self, new_type: BenchlingFieldType) -> BaseFieldProperties:
|
|
83
|
+
self.type = new_type
|
|
84
|
+
return self
|
|
85
|
+
|
|
86
|
+
def validate_column_definition(self, wh_name: str) -> bool:
|
|
87
|
+
"""If the Field Properties are meant to represent a column in Benchling,
|
|
88
|
+
this will validate the properties and ensure that the entity_link and dropdowns are valid names that exist in our code.
|
|
89
|
+
"""
|
|
90
|
+
return True
|
|
91
|
+
|
|
92
|
+
def column_dump(self) -> dict[str, Any]:
|
|
93
|
+
"""This function returns a model dump or dictionary of the field properties.
|
|
94
|
+
However, it removes defaults based on the init in the Column class."""
|
|
95
|
+
column_props = self.model_dump(exclude_unset=True, exclude_none=True)
|
|
96
|
+
to_pop = []
|
|
97
|
+
for k, v in column_props.items():
|
|
98
|
+
if k == "is_multi" and v is False:
|
|
99
|
+
to_pop.append(k)
|
|
100
|
+
elif k == "parent_link" and v is False:
|
|
101
|
+
to_pop.append(k)
|
|
102
|
+
for k in to_pop:
|
|
103
|
+
column_props.pop(k)
|
|
104
|
+
return column_props
|
|
105
|
+
|
|
106
|
+
def merge(self, new_props: BaseFieldProperties) -> dict[str, Any]:
|
|
107
|
+
"""Returns a diff of the two given Benchling FieldProperties as a dictionary.
|
|
108
|
+
If the field is different, set it as the new field.
|
|
109
|
+
|
|
110
|
+
Parameters
|
|
111
|
+
----------
|
|
112
|
+
new_props : Benchling FieldProperties
|
|
113
|
+
The new properties of the field
|
|
114
|
+
|
|
115
|
+
Returns
|
|
116
|
+
-------
|
|
117
|
+
dict[str, Any]
|
|
118
|
+
The diff of the two given Benchling FieldProperties.
|
|
119
|
+
"""
|
|
120
|
+
diff = {}
|
|
121
|
+
for new_field_name, new_val in new_props.model_dump().items():
|
|
122
|
+
if getattr(self, new_field_name) != new_val:
|
|
123
|
+
diff[new_field_name] = new_val
|
|
124
|
+
return diff
|
|
125
|
+
|
|
126
|
+
def __eq__(self, other: object) -> bool:
|
|
127
|
+
if not isinstance(other, BaseFieldProperties):
|
|
128
|
+
return NotImplemented
|
|
129
|
+
return self.model_dump() == other.model_dump()
|
|
130
|
+
|
|
131
|
+
def __str__(self) -> str:
|
|
132
|
+
return ", ".join(
|
|
133
|
+
[f"{k}={v}" for k, v in self.model_dump(exclude_unset=True).items()]
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
def __repr__(self) -> str:
|
|
137
|
+
"""Generates a string representation of the class so that it can be executed."""
|
|
138
|
+
return f"{self.__class__.__name__}({', '.join([f'{k}={v.__repr__()}' for k, v in self.model_dump(exclude_unset=True).items()])})"
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ConfigDict
|
|
6
|
+
|
|
7
|
+
from liminal.orm.name_template_parts import NameTemplateParts
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BaseNameTemplate(BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
This class is the generic class for defining the name template.
|
|
13
|
+
It is used to create a diff between the old and new name template.
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
parts : list[NameTemplatePart] | None
|
|
18
|
+
The list of name template parts that make up the name template (order matters).
|
|
19
|
+
order_name_parts_by_sequence : bool | None
|
|
20
|
+
Whether to order the name parts by sequence. This can only be set to True for sequence enity types. If one or many part link fields are included in the name template,
|
|
21
|
+
list parts in the order they appear on the sequence map, sorted by start position and then end position.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
parts: list[NameTemplateParts] | None = None
|
|
25
|
+
order_name_parts_by_sequence: bool | None = None
|
|
26
|
+
|
|
27
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
28
|
+
|
|
29
|
+
def merge(self, new_props: BaseNameTemplate) -> dict[str, Any]:
|
|
30
|
+
"""Creates a diff between the current name template and the new name template.
|
|
31
|
+
Sets value to None if the values are equal, otherwise sets the value to the new value.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
new_props : BaseNameTemplate
|
|
36
|
+
The new name template.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
dict[str, Any]
|
|
41
|
+
A dictionary of the differences between the old and new name template.
|
|
42
|
+
"""
|
|
43
|
+
diff = {}
|
|
44
|
+
for field_name in self.model_fields:
|
|
45
|
+
new_val = getattr(new_props, field_name)
|
|
46
|
+
if getattr(self, field_name) != new_val:
|
|
47
|
+
diff[field_name] = new_val
|
|
48
|
+
return diff
|
|
49
|
+
|
|
50
|
+
def __eq__(self, other: object) -> bool:
|
|
51
|
+
if not isinstance(other, BaseNameTemplate):
|
|
52
|
+
return False
|
|
53
|
+
return self.model_dump() == other.model_dump()
|
|
54
|
+
|
|
55
|
+
def __str__(self) -> str:
|
|
56
|
+
parts_str = (
|
|
57
|
+
f"parts=[{', '.join(repr(part) for part in self.parts)}]"
|
|
58
|
+
if self.parts is not None
|
|
59
|
+
else None
|
|
60
|
+
)
|
|
61
|
+
order_name_parts_by_sequence_str = (
|
|
62
|
+
f"order_name_parts_by_sequence={self.order_name_parts_by_sequence}"
|
|
63
|
+
if self.order_name_parts_by_sequence is not None
|
|
64
|
+
else None
|
|
65
|
+
)
|
|
66
|
+
return ", ".join(filter(None, [parts_str, order_name_parts_by_sequence_str]))
|
|
67
|
+
|
|
68
|
+
def __repr__(self) -> str:
|
|
69
|
+
"""Generates a string representation of the class so that it can be executed."""
|
|
70
|
+
model_dump = self.model_dump(exclude_defaults=True, exclude_unset=True)
|
|
71
|
+
props = []
|
|
72
|
+
if "parts" in model_dump:
|
|
73
|
+
parts_repr = (
|
|
74
|
+
f"[{', '.join(repr(part) for part in self.parts)}]"
|
|
75
|
+
if self.parts
|
|
76
|
+
else "[]"
|
|
77
|
+
)
|
|
78
|
+
props.append(f"parts={parts_repr}")
|
|
79
|
+
if "order_name_parts_by_sequence" in model_dump:
|
|
80
|
+
props.append(
|
|
81
|
+
f"order_name_parts_by_sequence={self.order_name_parts_by_sequence}"
|
|
82
|
+
)
|
|
83
|
+
return f"{self.__class__.__name__}({', '.join(props)})"
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, model_validator
|
|
6
|
+
|
|
7
|
+
from liminal.enums import BenchlingEntityType, BenchlingNamingStrategy
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MixtureSchemaConfig(BaseModel):
|
|
11
|
+
"""
|
|
12
|
+
This class is used to define the properties of a mixture schema within our code and when retrieving data from the benchling api.
|
|
13
|
+
It is only used when the entity schema type is Mixture.
|
|
14
|
+
It can either be storage, text, or both if allowMeasuredIngredients is True. Otherwise, both must be false.
|
|
15
|
+
|
|
16
|
+
Parameters
|
|
17
|
+
----------
|
|
18
|
+
allowMeasuredIngredients : bool | None
|
|
19
|
+
Whether the mixture schema allows measured ingredients.
|
|
20
|
+
componentLotStorageEnabled : bool | None
|
|
21
|
+
Whether the mixture schema allows component lot storage.
|
|
22
|
+
componentLotTextEnabled : bool | None
|
|
23
|
+
Whether the mixture schema allows component lot text.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
allowMeasuredIngredients: bool = False
|
|
27
|
+
componentLotStorageEnabled: bool | None = None
|
|
28
|
+
componentLotTextEnabled: bool | None = None
|
|
29
|
+
|
|
30
|
+
@model_validator(mode="after")
|
|
31
|
+
def validate_mixture_schema_config(self) -> MixtureSchemaConfig:
|
|
32
|
+
if self.allowMeasuredIngredients:
|
|
33
|
+
if not (self.componentLotStorageEnabled or self.componentLotTextEnabled):
|
|
34
|
+
raise ValueError(
|
|
35
|
+
"If allowMeasuredIngredients is True, either componentLotStorageEnabled or componentLotTextEnabled must be True."
|
|
36
|
+
)
|
|
37
|
+
elif self.allowMeasuredIngredients is False:
|
|
38
|
+
if self.componentLotStorageEnabled or self.componentLotTextEnabled:
|
|
39
|
+
raise ValueError(
|
|
40
|
+
"If allowMeasuredIngredients is False, both componentLotStorageEnabled and componentLotTextEnabled must be False."
|
|
41
|
+
)
|
|
42
|
+
return self
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class BaseSchemaProperties(BaseModel):
|
|
46
|
+
"""
|
|
47
|
+
This class is the generic class for defining the Benchling entity schema properties, where all fields are optional.
|
|
48
|
+
It is used to create a diff between the old and new schema properties.
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
name : str | None
|
|
53
|
+
The name of the schema.
|
|
54
|
+
warehouse_name : str | None
|
|
55
|
+
The sql table name of the schema in the benchling warehouse.
|
|
56
|
+
prefix : str | None
|
|
57
|
+
The prefix to use for the schema.
|
|
58
|
+
entity_type : BenchlingEntityType | None
|
|
59
|
+
The entity type of the schema.
|
|
60
|
+
naming_strategies : set[BenchlingNamingStrategy] | None
|
|
61
|
+
The naming strategies of the schema.
|
|
62
|
+
mixture_schema_config : MixtureSchemaConfig | None
|
|
63
|
+
The mixture schema config of the schema.
|
|
64
|
+
use_registry_id_as_label : bool | None = None
|
|
65
|
+
Flag for configuring the chip label for entities. Determines if the chip will use the Registry ID as the main label for items.
|
|
66
|
+
include_registry_id_in_chips : bool | None = None
|
|
67
|
+
Flag for configuring the chip label for entities. Determines if the chip will include the Registry ID in the chip label.
|
|
68
|
+
constraint_fields : set[str] | None
|
|
69
|
+
Set of constraints for field values for the schema. Must be a set of warehouse column names. This specifies that their entity field values must be a unique combination within an entity.
|
|
70
|
+
The following sequence constraints are also supported:
|
|
71
|
+
- bases: only supported for nucleotide sequence entity types. hasUniqueResidues=True
|
|
72
|
+
- amino_acids_ignore_case: only supported for amino acid sequence entity types. hasUniqueResidues=True
|
|
73
|
+
- amino_acids_exact_match: only supported for amino acid sequence entity types. hasUniqueResidues=True, areUniqueResiduesCaseSensitive=True
|
|
74
|
+
show_bases_in_expanded_view : bool | None
|
|
75
|
+
Whether the bases should be shown in the expanded view of the entity.
|
|
76
|
+
_archived : bool | None
|
|
77
|
+
Whether the schema is archived in Benchling.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
name: str | None = None
|
|
81
|
+
warehouse_name: str | None = None
|
|
82
|
+
prefix: str | None = None
|
|
83
|
+
entity_type: BenchlingEntityType | None = None
|
|
84
|
+
naming_strategies: set[BenchlingNamingStrategy] | None = None
|
|
85
|
+
mixture_schema_config: MixtureSchemaConfig | None = None
|
|
86
|
+
use_registry_id_as_label: bool | None = None
|
|
87
|
+
include_registry_id_in_chips: bool | None = None
|
|
88
|
+
constraint_fields: set[str] | None = None
|
|
89
|
+
show_bases_in_expanded_view: bool | None = None
|
|
90
|
+
_archived: bool | None = None
|
|
91
|
+
|
|
92
|
+
def __init__(self, **data: Any):
|
|
93
|
+
super().__init__(**data)
|
|
94
|
+
self._archived = data.get("_archived", None) # TODO: WHY??
|
|
95
|
+
|
|
96
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
97
|
+
|
|
98
|
+
def set_warehouse_name(self, value: str) -> BaseSchemaProperties:
|
|
99
|
+
self.warehouse_name = value
|
|
100
|
+
return self
|
|
101
|
+
|
|
102
|
+
def set_naming_strategies(
|
|
103
|
+
self, value: set[BenchlingNamingStrategy]
|
|
104
|
+
) -> BaseSchemaProperties:
|
|
105
|
+
self.naming_strategies = value
|
|
106
|
+
return self
|
|
107
|
+
|
|
108
|
+
def merge(self, new_props: BaseSchemaProperties) -> dict[str, Any]:
|
|
109
|
+
"""Creates a diff between the current schema properties and the new schema properties.
|
|
110
|
+
Sets value to None if the values are equal, otherwise sets the value to the new value.
|
|
111
|
+
|
|
112
|
+
Parameters
|
|
113
|
+
----------
|
|
114
|
+
new_props : Benchling BaseSchemaProperties
|
|
115
|
+
The new schema properties.
|
|
116
|
+
|
|
117
|
+
Returns
|
|
118
|
+
-------
|
|
119
|
+
dict[str, Any]
|
|
120
|
+
A dictionary of the differences between the old and new schema properties.
|
|
121
|
+
"""
|
|
122
|
+
diff = {}
|
|
123
|
+
for new_field_name, new_val in new_props.model_dump().items():
|
|
124
|
+
if getattr(self, new_field_name) != new_val:
|
|
125
|
+
diff[new_field_name] = new_val
|
|
126
|
+
return diff
|
|
127
|
+
|
|
128
|
+
def __eq__(self, other: object) -> bool:
|
|
129
|
+
if not isinstance(other, BaseSchemaProperties):
|
|
130
|
+
return False
|
|
131
|
+
return self.model_dump() == other.model_dump()
|
|
132
|
+
|
|
133
|
+
def __str__(self) -> str:
|
|
134
|
+
return ", ".join(
|
|
135
|
+
[f"{k}={v}" for k, v in self.model_dump(exclude_unset=True).items()]
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
def __repr__(self) -> str:
|
|
139
|
+
"""Generates a string representation of the class so that it can be executed."""
|
|
140
|
+
return f"{self.__class__.__name__}({', '.join([f'{k}={v.__repr__()}' for k, v in self.model_dump(exclude_unset=True, exclude_defaults=True).items()])})"
|