liminal-orm 4.7.0a1__tar.gz → 5.1.0__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.7.0a1 → liminal_orm-5.1.0}/.gitignore +2 -1
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/PKG-INFO +1 -6
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/base_operation.py +15 -14
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/name_template_parts.py +1 -1
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/properties/base_field_properties.py +17 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/cli/cli.py +95 -12
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/cli/controller.py +67 -1
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/cli/live_test_entity_schema_migration.py +16 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/cli/utils.py +2 -2
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/connection/benchling_connection.py +29 -8
- liminal_orm-5.1.0/liminal/connection/benchling_service.py +245 -0
- liminal_orm-5.1.0/liminal/dropdowns/api.py +149 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/dropdowns/compare.py +4 -2
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/dropdowns/operations.py +101 -71
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/dropdowns/utils.py +55 -51
- liminal_orm-5.1.0/liminal/entity_schemas/api.py +244 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/entity_schemas/compare.py +13 -30
- liminal_orm-5.1.0/liminal/entity_schemas/entity_schema_models.py +822 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/entity_schemas/generate_files.py +8 -19
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/entity_schemas/operations.py +185 -141
- liminal_orm-5.1.0/liminal/entity_schemas/utils.py +186 -0
- liminal_orm-5.1.0/liminal/enums/__init__.py +15 -0
- liminal_orm-5.1.0/liminal/enums/benchling_entity_schema_endpoint_type.py +15 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/enums/benchling_entity_type.py +1 -1
- liminal_orm-5.1.0/liminal/enums/benchling_entity_type_name.py +15 -0
- liminal_orm-5.1.0/liminal/enums/benchling_field_definition_input_type.py +94 -0
- liminal_orm-5.1.0/liminal/enums/benchling_field_definition_type.py +85 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/enums/benchling_field_type.py +3 -1
- liminal_orm-5.1.0/liminal/enums/benchling_link_definition_type.py +31 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/enums/benchling_naming_strategy.py +2 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/enums/name_template_part_type.py +2 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/external/__init__.py +1 -3
- liminal_orm-5.1.0/liminal/mappers.py +343 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/migrate/revisions_timeline.py +20 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/base_model.py +5 -5
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/column.py +8 -3
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/relationship.py +2 -2
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/schema_properties.py +29 -4
- liminal_orm-5.1.0/liminal/results_schemas/api.py +53 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/results_schemas/generate_files.py +13 -16
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/results_schemas/models/results_schema_model.py +54 -36
- liminal_orm-5.1.0/liminal/results_schemas/utils.py +105 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/tests/conftest.py +0 -21
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/tests/test_entity_schema_compare.py +6 -11
- liminal_orm-5.1.0/liminal/utils.py +237 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/pyproject.toml +2 -8
- liminal_orm-5.1.0/skills/liminal/SKILL.md +411 -0
- liminal_orm-4.7.0a1/liminal/connection/benchling_service.py +0 -411
- liminal_orm-4.7.0a1/liminal/dropdowns/api.py +0 -175
- liminal_orm-4.7.0a1/liminal/entity_schemas/api.py +0 -95
- liminal_orm-4.7.0a1/liminal/entity_schemas/entity_schema_models.py +0 -209
- liminal_orm-4.7.0a1/liminal/entity_schemas/tag_schema_models.py +0 -613
- liminal_orm-4.7.0a1/liminal/entity_schemas/utils.py +0 -149
- liminal_orm-4.7.0a1/liminal/enums/__init__.py +0 -8
- liminal_orm-4.7.0a1/liminal/enums/benchling_api_field_type.py +0 -23
- liminal_orm-4.7.0a1/liminal/enums/benchling_folder_item_type.py +0 -10
- liminal_orm-4.7.0a1/liminal/enums/benchling_sequence_type.py +0 -8
- liminal_orm-4.7.0a1/liminal/mappers.py +0 -272
- liminal_orm-4.7.0a1/liminal/results_schemas/utils.py +0 -48
- liminal_orm-4.7.0a1/liminal/utils.py +0 -96
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_dropdown.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_operation.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_validation_filters.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/compare_operation.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/name_template_parts.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_field_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_name_template.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/str_enum.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/cli.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/controller.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/live_test_dropdown_migration.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/live_test_entity_schema_migration.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/benchling_connection.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/benchling_service.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/api.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/operations.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/api.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/entity_schema_models.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/operations.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/tag_schema_models.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_api_field_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_entity_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_field_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_folder_item_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_naming_strategy.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_sequence_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/name_template_part_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/sequence_constraint.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/external/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/mappers.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/components.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/revision.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/revisions_timeline.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_results_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/registry_entity.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/schema.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/user.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/column.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/mixins.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/name_template.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/name_template_parts.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/relationship.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/results_schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/py.typed +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/models/results_schema_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/conftest.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/from benchling_sdk.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_benchling_service.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dataframe_compatibility.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dropdown_compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_entity_schema_compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/unit_dictionary/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/validation/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/validation/validation_severity.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_dropdown.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_operation.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_validation_filters.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/compare_operation.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/name_template_parts.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_field_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_name_template.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/str_enum.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/cli.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/controller.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/live_test_dropdown_migration.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/live_test_entity_schema_migration.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/benchling_connection.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/benchling_service.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/api.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/operations.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/api.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/entity_schema_models.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/operations.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/tag_schema_models.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_api_field_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_entity_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_field_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_folder_item_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_naming_strategy.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_sequence_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/name_template_part_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/sequence_constraint.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/external/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/mappers.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/components.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/revision.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/revisions_timeline.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_results_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/registry_entity.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/schema.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/user.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/column.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/mixins.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/name_template.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/name_template_parts.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/relationship.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/results_schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/py.typed +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/models/results_schema_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/conftest.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/from benchling_sdk.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_benchling_service.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_dataframe_compatibility.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_dropdown_compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_entity_schema_compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/unit_dictionary/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/validation/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/validation/validation_severity.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_dropdown.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_operation.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_validation_filters.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/compare_operation.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/name_template_parts.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_field_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_name_template.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/str_enum.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/cli.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/controller.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/live_test_dropdown_migration.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/live_test_entity_schema_migration.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/benchling_connection.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/benchling_service.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/api.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/operations.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/api.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/entity_schema_models.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/operations.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/tag_schema_models.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_api_field_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_entity_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_field_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_folder_item_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_naming_strategy.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_sequence_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/name_template_part_type.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/sequence_constraint.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/external/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/mappers.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/components.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/revision.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/revisions_timeline.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_results_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/registry_entity.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/schema.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/user.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/column.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/mixins.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/name_template.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/name_template_parts.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/relationship.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/results_schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/py.typed +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/models/results_schema_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/conftest.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/from benchling_sdk.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_benchling_service.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dataframe_compatibility.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dropdown_compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_entity_schema_compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/unit_dictionary/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/validation/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/validation/validation_severity.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/LICENSE.md +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/README.md +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/base_dropdown.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/base_validation_filters.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/compare_operation.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/properties/base_name_template.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/properties/base_schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/base/str_enum.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/cli/live_test_dropdown_migration.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/connection/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/dropdowns/generate_files.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/entity_schemas/test_entity_dataframe_compatibility.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/enums/sequence_constraint.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/migrate/components.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/migrate/revision.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/base.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/base_results_model.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/base_tables/registry_entity.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/base_tables/schema.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/base_tables/user.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/mixins.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/name_template.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/name_template_parts.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/orm/results_schema_properties.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/py.typed +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/results_schemas/test_results_dataframe_compatibility.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/tests/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/tests/from benchling_sdk.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/tests/test_benchling_service.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/tests/test_dropdown_compare.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/unit_dictionary/utils.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/validation/__init__.py +0 -0
- {liminal_orm-4.7.0a1 → liminal_orm-5.1.0}/liminal/validation/validation_severity.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: liminal-orm
|
|
3
|
-
Version:
|
|
3
|
+
Version: 5.1.0
|
|
4
4
|
Summary: An ORM and toolkit that builds on top of Benchling's platform to keep your schemas and downstream code dependencies in sync.
|
|
5
5
|
Project-URL: Homepage, https://github.com/dynotx/liminal-orm
|
|
6
6
|
Project-URL: Repository, https://github.com/dynotx/liminal-orm
|
|
@@ -15,9 +15,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
16
|
Requires-Python: <3.14,>=3.10
|
|
17
17
|
Requires-Dist: benchling-sdk<2,>=1.21.2
|
|
18
|
-
Requires-Dist: bs4<0.0.3,>=0.0.2
|
|
19
18
|
Requires-Dist: click<8.2.0,>=8.0.0
|
|
20
|
-
Requires-Dist: lxml<6,>=5.3.0
|
|
21
19
|
Requires-Dist: numpy<2,>=1.23.5; python_version < '3.12'
|
|
22
20
|
Requires-Dist: numpy<2,>=1.26; python_version == '3.12'
|
|
23
21
|
Requires-Dist: numpy<3,>=2.1; python_version == '3.13'
|
|
@@ -25,14 +23,11 @@ Requires-Dist: pandas<3,>=1.5.3; python_version == '3.10'
|
|
|
25
23
|
Requires-Dist: pandas<4,>=1.5.3; python_version == '3.11'
|
|
26
24
|
Requires-Dist: pandas<4,>=2.2.3; python_version == '3.13'
|
|
27
25
|
Requires-Dist: pandas<4,>=2.2; python_version == '3.12'
|
|
28
|
-
Requires-Dist: playwright>=1.58.0
|
|
29
26
|
Requires-Dist: psycopg2-binary<3,>=2.9.10
|
|
30
27
|
Requires-Dist: pydantic<=2.13,>=2
|
|
31
|
-
Requires-Dist: requests<3,>=2.32.3
|
|
32
28
|
Requires-Dist: rich<14,>=13.9.2
|
|
33
29
|
Requires-Dist: sqlalchemy<2,>=1.4.53
|
|
34
30
|
Requires-Dist: tenacity<10,>=8
|
|
35
|
-
Requires-Dist: tornado==6.5.0
|
|
36
31
|
Requires-Dist: typer<0.13,>=0.12.5
|
|
37
32
|
Description-Content-Type: text/markdown
|
|
38
33
|
|
|
@@ -9,20 +9,21 @@ Order of operations based on order class var:
|
|
|
9
9
|
2. UpdateDropdownName
|
|
10
10
|
3. UnarchiveDropdown
|
|
11
11
|
4. CreateDropdownOption
|
|
12
|
-
5.
|
|
13
|
-
6.
|
|
14
|
-
7.
|
|
15
|
-
8.
|
|
16
|
-
9.
|
|
17
|
-
10.
|
|
18
|
-
11.
|
|
19
|
-
12.
|
|
20
|
-
13.
|
|
21
|
-
14.
|
|
22
|
-
15.
|
|
23
|
-
16.
|
|
24
|
-
17.
|
|
25
|
-
18.
|
|
12
|
+
5. UnarchiveDropdownOption
|
|
13
|
+
6. UpdateDropdownOption
|
|
14
|
+
7. ArchiveDropdownOption
|
|
15
|
+
8. ReorderDropdownOptions
|
|
16
|
+
9. CreateEntitySchema
|
|
17
|
+
10. UnarchiveEntitySchema
|
|
18
|
+
11. CreateEntitySchemaField
|
|
19
|
+
12. UpdateEntitySchemaNameTemplate
|
|
20
|
+
13. UpdateEntitySchema
|
|
21
|
+
14. UnarchiveEntitySchemaField
|
|
22
|
+
15. UpdateEntitySchemaField
|
|
23
|
+
16. ArchiveEntitySchemaField
|
|
24
|
+
17. ReorderEntitySchemaFields
|
|
25
|
+
18. ArchiveEntitySchema
|
|
26
|
+
19. ArchiveDropdown
|
|
26
27
|
"""
|
|
27
28
|
|
|
28
29
|
|
|
@@ -3,6 +3,6 @@ import warnings
|
|
|
3
3
|
from liminal.orm.name_template_parts import * # noqa: F403
|
|
4
4
|
|
|
5
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
|
|
6
|
+
"Importing from 'liminal.base.name_template_parts' is deprecated. Please import from 'liminal.orm.name_template_parts' instead. This will be removed in v6.",
|
|
7
7
|
FutureWarning,
|
|
8
8
|
)
|
|
@@ -56,6 +56,23 @@ class BaseFieldProperties(BaseModel):
|
|
|
56
56
|
super().__init__(**data)
|
|
57
57
|
self._archived = data.get("_archived", None)
|
|
58
58
|
|
|
59
|
+
@staticmethod
|
|
60
|
+
def unsupported_field_properties(
|
|
61
|
+
field_type: BenchlingFieldType, has_entity_link: bool
|
|
62
|
+
) -> set[str]:
|
|
63
|
+
"""Returns the properties that Benchling does not support for the given field type."""
|
|
64
|
+
unsupported: set[str] = set()
|
|
65
|
+
non_multi_types = BenchlingFieldType.get_non_multi_select_types()
|
|
66
|
+
if field_type in non_multi_types:
|
|
67
|
+
unsupported.add("is_multi")
|
|
68
|
+
if not (has_entity_link and field_type == BenchlingFieldType.ENTITY_LINK):
|
|
69
|
+
unsupported.add("parent_link")
|
|
70
|
+
if field_type not in BenchlingFieldType.get_number_field_types():
|
|
71
|
+
unsupported.add("unit_name")
|
|
72
|
+
if field_type != BenchlingFieldType.DECIMAL:
|
|
73
|
+
unsupported.add("decimal_places")
|
|
74
|
+
return unsupported
|
|
75
|
+
|
|
59
76
|
def set_archived(self, value: bool) -> BaseFieldProperties:
|
|
60
77
|
self._archived = value
|
|
61
78
|
return self
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
|
+
import json
|
|
2
3
|
from pathlib import Path
|
|
4
|
+
import sys
|
|
3
5
|
from typing import Any
|
|
6
|
+
|
|
4
7
|
import typer
|
|
5
8
|
from rich import print
|
|
6
9
|
from typer.core import TyperGroup
|
|
7
10
|
|
|
8
11
|
from liminal.cli.controller import (
|
|
9
12
|
autogenerate_revision_file,
|
|
13
|
+
diff_benchling_tenant,
|
|
10
14
|
downgrade_benchling_tenant,
|
|
11
15
|
generate_all_files,
|
|
12
16
|
upgrade_benchling_tenant,
|
|
@@ -67,8 +71,6 @@ connection = BenchlingConnection(
|
|
|
67
71
|
api_client_id="my-secret-api-client-id",
|
|
68
72
|
api_client_secret="my-secret-api-client-secret",
|
|
69
73
|
warehouse_connection_string="...",
|
|
70
|
-
internal_api_admin_email="my-secret-internal-api-admin-email",
|
|
71
|
-
internal_api_admin_password="my-secret-internal-api-admin-password",
|
|
72
74
|
config_flags=TenantConfigFlags(...)
|
|
73
75
|
)
|
|
74
76
|
"""
|
|
@@ -119,7 +121,7 @@ def generate_files(
|
|
|
119
121
|
),
|
|
120
122
|
) -> None:
|
|
121
123
|
benchling_connection = read_local_liminal_dir(LIMINAL_DIR_PATH, benchling_tenant)
|
|
122
|
-
benchling_service = BenchlingService(benchling_connection
|
|
124
|
+
benchling_service = BenchlingService(benchling_connection)
|
|
123
125
|
if not write_path.exists():
|
|
124
126
|
write_path.mkdir()
|
|
125
127
|
print(f"[green]Created directory: {write_path}")
|
|
@@ -147,20 +149,101 @@ def current(
|
|
|
147
149
|
),
|
|
148
150
|
) -> None:
|
|
149
151
|
benchling_connection = read_local_liminal_dir(LIMINAL_DIR_PATH, benchling_tenant)
|
|
150
|
-
benchling_service = BenchlingService(benchling_connection
|
|
152
|
+
benchling_service = BenchlingService(benchling_connection)
|
|
151
153
|
remote_revision_id = benchling_service.get_remote_revision_id()
|
|
152
154
|
print(f"[blue]Current remote revision_id: {remote_revision_id}.")
|
|
153
155
|
|
|
154
156
|
|
|
155
157
|
@app.command(
|
|
156
158
|
name="head",
|
|
157
|
-
help="Returns the local heads, or the latest revision_id, in your linear revision timeline.",
|
|
159
|
+
help="Returns the local heads, or the latest revision_id, in your linear revision timeline. Pass --reset to delete the local head revision file.",
|
|
158
160
|
)
|
|
159
|
-
def head(
|
|
161
|
+
def head(
|
|
162
|
+
reset: bool = typer.Option(
|
|
163
|
+
False,
|
|
164
|
+
"-r",
|
|
165
|
+
"--reset",
|
|
166
|
+
help="Deletes the local head revision file, making its down_revision the new head. Only use this for revisions that have not been applied to any tenant.",
|
|
167
|
+
),
|
|
168
|
+
) -> None:
|
|
160
169
|
revision_timeline = RevisionsTimeline(VERSIONS_DIR_PATH)
|
|
170
|
+
if reset:
|
|
171
|
+
latest_revision = revision_timeline.get_latest_revision()
|
|
172
|
+
file_path = VERSIONS_DIR_PATH / latest_revision.revision_file_name
|
|
173
|
+
print(
|
|
174
|
+
f"[bold yellow]Delete local head revision file {latest_revision.id} ({file_path})?[/bold yellow]"
|
|
175
|
+
)
|
|
176
|
+
typer.confirm("Confirm", abort=True)
|
|
177
|
+
revision_timeline.delete_latest_revision()
|
|
178
|
+
print(f"[dim]Deleted revision file {file_path}.")
|
|
161
179
|
print(f"[blue]{revision_timeline.get_latest_revision().id}: (head)[/blue]")
|
|
162
180
|
|
|
163
181
|
|
|
182
|
+
@app.command(
|
|
183
|
+
name="diff",
|
|
184
|
+
help="Compares the locally defined dropdowns and entity schemas to the given Benchling tenant. Exit codes: 0=in sync, 1=error, 2=differences found.",
|
|
185
|
+
)
|
|
186
|
+
def diff(
|
|
187
|
+
benchling_tenant: str = typer.Argument(
|
|
188
|
+
..., help="Benchling tenant (or alias) to connect to."
|
|
189
|
+
),
|
|
190
|
+
dropdowns_flag: bool = typer.Option(
|
|
191
|
+
False,
|
|
192
|
+
"-d",
|
|
193
|
+
"--dropdowns",
|
|
194
|
+
help="Only compare dropdowns.",
|
|
195
|
+
),
|
|
196
|
+
entity_schemas_flag: bool = typer.Option(
|
|
197
|
+
False,
|
|
198
|
+
"-es",
|
|
199
|
+
"--entity-schemas",
|
|
200
|
+
help="Only compare entity schemas.",
|
|
201
|
+
),
|
|
202
|
+
json_output: bool = typer.Option(
|
|
203
|
+
False,
|
|
204
|
+
"--json",
|
|
205
|
+
help="Write a machine-readable comparison report to stdout.",
|
|
206
|
+
),
|
|
207
|
+
) -> None:
|
|
208
|
+
benchling_connection = read_local_liminal_dir(LIMINAL_DIR_PATH, benchling_tenant)
|
|
209
|
+
benchling_service = BenchlingService(benchling_connection)
|
|
210
|
+
if not dropdowns_flag and not entity_schemas_flag:
|
|
211
|
+
dropdowns_flag = True
|
|
212
|
+
entity_schemas_flag = True
|
|
213
|
+
report = diff_benchling_tenant(
|
|
214
|
+
benchling_service, dropdowns_flag, entity_schemas_flag
|
|
215
|
+
)
|
|
216
|
+
if json_output:
|
|
217
|
+
typer.echo(json.dumps(report, sort_keys=True))
|
|
218
|
+
else:
|
|
219
|
+
for key, label in (
|
|
220
|
+
("dropdowns", "Dropdowns"),
|
|
221
|
+
("entity_schemas", "Entity schemas"),
|
|
222
|
+
):
|
|
223
|
+
section = report[key]
|
|
224
|
+
if not section["compared"]:
|
|
225
|
+
continue
|
|
226
|
+
if section["in_sync"]:
|
|
227
|
+
print(f"[bold green]{label} are in sync for {report['tenant']} tenant.")
|
|
228
|
+
continue
|
|
229
|
+
print(
|
|
230
|
+
f"[bold yellow]{label}: {len(section['differences'])} difference(s) for {report['tenant']} tenant."
|
|
231
|
+
)
|
|
232
|
+
for index, difference in enumerate(section["differences"], start=1):
|
|
233
|
+
print(f" {index}. {difference['description']}")
|
|
234
|
+
|
|
235
|
+
if report["in_sync"]:
|
|
236
|
+
print(
|
|
237
|
+
f"[bold green]No differences found. {report['tenant']} is in sync with code."
|
|
238
|
+
)
|
|
239
|
+
else:
|
|
240
|
+
print(
|
|
241
|
+
f"[bold yellow]{report['total_differences']} total difference(s) found between code and {report['tenant']}. Run `liminal revision {report['tenant']} '<description>'` to generate a revision file that resolves them."
|
|
242
|
+
)
|
|
243
|
+
if not report["in_sync"]:
|
|
244
|
+
raise typer.Exit(code=2)
|
|
245
|
+
|
|
246
|
+
|
|
164
247
|
@app.command(
|
|
165
248
|
name="revision",
|
|
166
249
|
help="Generates a revision file with a list of operations to bring the given Benchling tenant up to date with the locally defined schemas. Writes revision file to liminal/versions/.",
|
|
@@ -180,7 +263,7 @@ def revision(
|
|
|
180
263
|
),
|
|
181
264
|
) -> None:
|
|
182
265
|
benchling_connection = read_local_liminal_dir(LIMINAL_DIR_PATH, benchling_tenant)
|
|
183
|
-
benchling_service = BenchlingService(benchling_connection
|
|
266
|
+
benchling_service = BenchlingService(benchling_connection)
|
|
184
267
|
revisions_timeline = RevisionsTimeline(VERSIONS_DIR_PATH)
|
|
185
268
|
is_init_revision = revisions_timeline.is_only_init_revision()
|
|
186
269
|
if is_init_revision:
|
|
@@ -214,7 +297,7 @@ def autogenerate(
|
|
|
214
297
|
),
|
|
215
298
|
) -> None:
|
|
216
299
|
raise DeprecationWarning(
|
|
217
|
-
"CLI command `liminal autogenerate ...` is deprecated and will be removed in
|
|
300
|
+
"CLI command `liminal autogenerate ...` is deprecated and will be removed in v6. Please use `liminal revision ...` instead."
|
|
218
301
|
)
|
|
219
302
|
|
|
220
303
|
|
|
@@ -233,7 +316,7 @@ def upgrade(
|
|
|
233
316
|
),
|
|
234
317
|
) -> None:
|
|
235
318
|
benchling_connection = read_local_liminal_dir(LIMINAL_DIR_PATH, benchling_tenant)
|
|
236
|
-
benchling_service = BenchlingService(benchling_connection
|
|
319
|
+
benchling_service = BenchlingService(benchling_connection)
|
|
237
320
|
current_revision_id = benchling_service.get_remote_revision_id()
|
|
238
321
|
revisions_timeline = RevisionsTimeline(VERSIONS_DIR_PATH)
|
|
239
322
|
upgrade_revision_id = upgrade_benchling_tenant(
|
|
@@ -261,7 +344,7 @@ def downgrade(
|
|
|
261
344
|
),
|
|
262
345
|
) -> None:
|
|
263
346
|
benchling_connection = read_local_liminal_dir(LIMINAL_DIR_PATH, benchling_tenant)
|
|
264
|
-
benchling_service = BenchlingService(benchling_connection
|
|
347
|
+
benchling_service = BenchlingService(benchling_connection)
|
|
265
348
|
current_revision_id = benchling_service.get_remote_revision_id()
|
|
266
349
|
revisions_timeline = RevisionsTimeline(VERSIONS_DIR_PATH)
|
|
267
350
|
downgrade_revision_id = downgrade_benchling_tenant(
|
|
@@ -301,7 +384,7 @@ def live_test(
|
|
|
301
384
|
"Only one of --entity-schema-migration or --dropdown-migration can be set."
|
|
302
385
|
)
|
|
303
386
|
benchling_connection = read_local_liminal_dir(LIMINAL_DIR_PATH, benchling_tenant)
|
|
304
|
-
benchling_service = BenchlingService(benchling_connection
|
|
387
|
+
benchling_service = BenchlingService(benchling_connection)
|
|
305
388
|
if test_entity_schema_migration:
|
|
306
389
|
mock_entity_schema_full_migration(
|
|
307
390
|
benchling_service, "test_dont_touch", dry_run=not execute
|
|
@@ -312,5 +395,5 @@ def live_test(
|
|
|
312
395
|
)
|
|
313
396
|
|
|
314
397
|
|
|
315
|
-
print("Starting Liminal CLI...")
|
|
398
|
+
print("Starting Liminal CLI...", file=sys.stderr)
|
|
316
399
|
app()
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
|
+
from typing import Any
|
|
2
3
|
|
|
3
4
|
from rich import print
|
|
4
5
|
|
|
6
|
+
from liminal.base.compare_operation import CompareOperation
|
|
5
7
|
from liminal.connection.benchling_service import BenchlingService
|
|
8
|
+
from liminal.dropdowns.compare import compare_dropdowns
|
|
6
9
|
from liminal.dropdowns.generate_files import generate_all_dropdown_files
|
|
10
|
+
from liminal.entity_schemas.compare import compare_entity_schemas
|
|
7
11
|
from liminal.entity_schemas.generate_files import generate_all_entity_schema_files
|
|
8
12
|
from liminal.migrate.components import execute_operations, get_full_migration_operations
|
|
9
13
|
from liminal.migrate.revisions_timeline import RevisionsTimeline
|
|
@@ -45,6 +49,68 @@ def generate_all_files(
|
|
|
45
49
|
generate_all_results_schema_files(benchling_service, write_path, overwrite)
|
|
46
50
|
|
|
47
51
|
|
|
52
|
+
def diff_benchling_tenant(
|
|
53
|
+
benchling_service: BenchlingService,
|
|
54
|
+
dropdowns_flag: bool = True,
|
|
55
|
+
entity_schemas_flag: bool = True,
|
|
56
|
+
) -> dict[str, Any]:
|
|
57
|
+
"""Compares locally defined schemas to a Benchling tenant.
|
|
58
|
+
|
|
59
|
+
This is read-only and does not make any changes to the Benchling tenant or
|
|
60
|
+
write any files.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
benchling_service : BenchlingService
|
|
65
|
+
The Benchling service object that is connected to a specified Benchling tenant.
|
|
66
|
+
dropdowns_flag : bool
|
|
67
|
+
Whether to compare dropdowns.
|
|
68
|
+
entity_schemas_flag : bool
|
|
69
|
+
Whether to compare entity schemas.
|
|
70
|
+
|
|
71
|
+
Returns
|
|
72
|
+
-------
|
|
73
|
+
dict[str, Any]
|
|
74
|
+
A machine-readable report of the comparison.
|
|
75
|
+
"""
|
|
76
|
+
tenant = benchling_service.benchling_tenant
|
|
77
|
+
sections: dict[str, dict[str, list[CompareOperation]] | None] = {
|
|
78
|
+
"dropdowns": None,
|
|
79
|
+
"entity_schemas": None,
|
|
80
|
+
}
|
|
81
|
+
if dropdowns_flag:
|
|
82
|
+
sections["dropdowns"] = compare_dropdowns(benchling_service)
|
|
83
|
+
if entity_schemas_flag:
|
|
84
|
+
sections["entity_schemas"] = compare_entity_schemas(benchling_service)
|
|
85
|
+
|
|
86
|
+
report: dict[str, Any] = {"tenant": tenant, "total_differences": 0}
|
|
87
|
+
for section_name, comparison in sections.items():
|
|
88
|
+
compared = comparison is not None
|
|
89
|
+
differences = [
|
|
90
|
+
{
|
|
91
|
+
"name": name,
|
|
92
|
+
"operation": compare_op.op.__class__.__name__,
|
|
93
|
+
"description": compare_op.op.describe(),
|
|
94
|
+
}
|
|
95
|
+
for name, compare_op in sorted(
|
|
96
|
+
(
|
|
97
|
+
(name, compare_op)
|
|
98
|
+
for name, compare_ops in (comparison or {}).items()
|
|
99
|
+
for compare_op in compare_ops
|
|
100
|
+
),
|
|
101
|
+
key=lambda difference: difference[1],
|
|
102
|
+
)
|
|
103
|
+
]
|
|
104
|
+
report[section_name] = {
|
|
105
|
+
"compared": compared,
|
|
106
|
+
"in_sync": len(differences) == 0 if compared else None,
|
|
107
|
+
"differences": differences,
|
|
108
|
+
}
|
|
109
|
+
report["total_differences"] += len(differences)
|
|
110
|
+
report["in_sync"] = report["total_differences"] == 0
|
|
111
|
+
return report
|
|
112
|
+
|
|
113
|
+
|
|
48
114
|
def autogenerate_revision_file(
|
|
49
115
|
benchling_service: BenchlingService,
|
|
50
116
|
revisions_timeline: RevisionsTimeline,
|
|
@@ -76,7 +142,7 @@ def autogenerate_revision_file(
|
|
|
76
142
|
)
|
|
77
143
|
if current_revision_id != revisions_timeline.get_latest_revision().id:
|
|
78
144
|
raise Exception(
|
|
79
|
-
f"Your target Benchling tenant is currently at revision_id {current_revision_id}, which is not up to date with the local head revision ({revisions_timeline.get_latest_revision().id}). Please upgrade your tenant to the latest revision before generating a new revision."
|
|
145
|
+
f"Your target Benchling tenant is currently at revision_id {current_revision_id}, which is not up to date with the local head revision ({revisions_timeline.get_latest_revision().id}). Please upgrade your tenant to the latest revision before generating a new revision. If the local head revision should not be applied, run `liminal head --reset` to delete it."
|
|
80
146
|
)
|
|
81
147
|
if compare:
|
|
82
148
|
compare_ops = get_full_migration_operations(benchling_service)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from liminal.base.base_operation import BaseOperation
|
|
2
2
|
from liminal.base.properties.base_field_properties import BaseFieldProperties
|
|
3
|
+
from liminal.base.properties.base_name_template import BaseNameTemplate
|
|
3
4
|
from liminal.base.properties.base_schema_properties import BaseSchemaProperties
|
|
4
5
|
from liminal.connection.benchling_service import BenchlingService
|
|
5
6
|
from liminal.entity_schemas.operations import (
|
|
@@ -12,6 +13,7 @@ from liminal.entity_schemas.operations import (
|
|
|
12
13
|
UnarchiveEntitySchemaField,
|
|
13
14
|
UpdateEntitySchema,
|
|
14
15
|
UpdateEntitySchemaField,
|
|
16
|
+
UpdateEntitySchemaNameTemplate,
|
|
15
17
|
)
|
|
16
18
|
from liminal.enums import (
|
|
17
19
|
BenchlingEntityType,
|
|
@@ -19,6 +21,7 @@ from liminal.enums import (
|
|
|
19
21
|
BenchlingNamingStrategy,
|
|
20
22
|
)
|
|
21
23
|
from liminal.migrate.components import execute_operations, execute_operations_dry_run
|
|
24
|
+
from liminal.orm.name_template_parts import FieldPart, SeparatorPart, TextPart
|
|
22
25
|
from liminal.orm.schema_properties import SchemaProperties
|
|
23
26
|
from liminal.utils import generate_random_id
|
|
24
27
|
|
|
@@ -122,6 +125,18 @@ def mock_entity_schema_full_migration(
|
|
|
122
125
|
["test_column_1", "test_column_2", "test_column_3", "test_column_4"],
|
|
123
126
|
)
|
|
124
127
|
|
|
128
|
+
update_name_template_op = UpdateEntitySchemaNameTemplate(
|
|
129
|
+
test_model_wh_name,
|
|
130
|
+
BaseNameTemplate(
|
|
131
|
+
parts=[
|
|
132
|
+
TextPart(value="TEST"),
|
|
133
|
+
SeparatorPart(value="-"),
|
|
134
|
+
FieldPart(wh_field_name="test_column_1"),
|
|
135
|
+
],
|
|
136
|
+
order_name_parts_by_sequence=False,
|
|
137
|
+
),
|
|
138
|
+
)
|
|
139
|
+
|
|
125
140
|
archive_entity_schema_op = ArchiveEntitySchema(test_model_wh_name)
|
|
126
141
|
unarchive_entity_schema_op = UnarchiveEntitySchema(test_model_wh_name)
|
|
127
142
|
rearchive_entity_schema_op = ArchiveEntitySchema(test_model_wh_name)
|
|
@@ -134,6 +149,7 @@ def mock_entity_schema_full_migration(
|
|
|
134
149
|
archive_entity_schema_field_op,
|
|
135
150
|
unarchive_entity_schema_field_op,
|
|
136
151
|
reorder_entity_schema_field_op,
|
|
152
|
+
update_name_template_op,
|
|
137
153
|
archive_entity_schema_op,
|
|
138
154
|
unarchive_entity_schema_op,
|
|
139
155
|
rearchive_entity_schema_op,
|
|
@@ -25,7 +25,7 @@ def read_local_liminal_dir(
|
|
|
25
25
|
liminal_dir_path: Path, benchling_tenant: str
|
|
26
26
|
) -> BenchlingConnection:
|
|
27
27
|
"""Imports the env.py file from /liminal/env.py and returns the BenchlingConnection object.
|
|
28
|
-
The BenchlingConnection object is expected to be defined and have connection information for the Benchling API client
|
|
28
|
+
The BenchlingConnection object is expected to be defined and have connection information for the Benchling API client.
|
|
29
29
|
"""
|
|
30
30
|
_check_liminal_directory_initialized(liminal_dir_path)
|
|
31
31
|
env_file_path = liminal_dir_path / "env.py"
|
|
@@ -36,7 +36,7 @@ def _read_local_env_file(
|
|
|
36
36
|
env_file_path: Path, benchling_tenant: str
|
|
37
37
|
) -> BenchlingConnection:
|
|
38
38
|
"""Imports the env.py file from the current working directory and returns the BenchlingConnection object.
|
|
39
|
-
The BenchlingConnection object is expected to be defined and have connection information for the Benchling API client
|
|
39
|
+
The BenchlingConnection object is expected to be defined and have connection information for the Benchling API client.
|
|
40
40
|
"""
|
|
41
41
|
module_path = Path.cwd() / env_file_path
|
|
42
42
|
spec = importlib.util.spec_from_file_location(env_file_path.stem, module_path)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import keyword
|
|
2
2
|
import re
|
|
3
|
+
import warnings
|
|
3
4
|
|
|
4
5
|
from pydantic import BaseModel, model_validator
|
|
5
6
|
|
|
@@ -37,14 +38,11 @@ class BenchlingConnection(BaseModel):
|
|
|
37
38
|
warehouse_connection_string: str | None = None
|
|
38
39
|
The connection string for the warehouse.
|
|
39
40
|
internal_api_admin_email: str | None = None
|
|
40
|
-
|
|
41
|
+
DEPRECATED: Liminal no longer uses Benchling's internal API, so this is ignored. It will be removed in v6.
|
|
41
42
|
internal_api_admin_password: str | None = None
|
|
42
|
-
|
|
43
|
-
playwright_data_dir: str | None =
|
|
44
|
-
|
|
45
|
-
Liminal uses playwright so the user can log into Benchling in order to give Liminal the authenticated internal API session cookie.
|
|
46
|
-
This directory is used to store playwright's persistent context, allowing the user to set up a persistent chrome profile.
|
|
47
|
-
Set this to None in order to disable playwright's persistent context which enables automatic login.
|
|
43
|
+
DEPRECATED: Liminal no longer uses Benchling's internal API, so this is ignored. It will be removed in v6.
|
|
44
|
+
playwright_data_dir: str | None = None
|
|
45
|
+
DEPRECATED: Liminal no longer uses Playwright to log into Benchling's internal API, so this is ignored. It will be removed in v6.
|
|
48
46
|
fieldsets: bool = False
|
|
49
47
|
Whether your Benchling tenant has access to fieldsets.
|
|
50
48
|
config_flags: TenantConfigFlags = TenantConfigFlags()
|
|
@@ -59,7 +57,7 @@ class BenchlingConnection(BaseModel):
|
|
|
59
57
|
warehouse_connection_string: str | None = None
|
|
60
58
|
internal_api_admin_email: str | None = None
|
|
61
59
|
internal_api_admin_password: str | None = None
|
|
62
|
-
playwright_data_dir: str | None =
|
|
60
|
+
playwright_data_dir: str | None = None
|
|
63
61
|
fieldsets: bool = False
|
|
64
62
|
config_flags: TenantConfigFlags = TenantConfigFlags()
|
|
65
63
|
|
|
@@ -81,3 +79,26 @@ class BenchlingConnection(BaseModel):
|
|
|
81
79
|
|
|
82
80
|
values["current_revision_id_var_name"] = var_name
|
|
83
81
|
return values
|
|
82
|
+
|
|
83
|
+
@model_validator(mode="after")
|
|
84
|
+
def warn_deprecated_internal_api_credentials(self) -> "BenchlingConnection":
|
|
85
|
+
if (
|
|
86
|
+
self.internal_api_admin_email is not None
|
|
87
|
+
or self.internal_api_admin_password is not None
|
|
88
|
+
):
|
|
89
|
+
warnings.warn(
|
|
90
|
+
"Deprecated BenchlingConnection properties set: internal_api_admin_email and internal_api_admin_password. Liminal no longer uses Benchling's internal API, so they are ignored. Remove them from your BenchlingConnection, since they will be removed in v6.",
|
|
91
|
+
FutureWarning,
|
|
92
|
+
stacklevel=3,
|
|
93
|
+
)
|
|
94
|
+
return self
|
|
95
|
+
|
|
96
|
+
@model_validator(mode="after")
|
|
97
|
+
def warn_deprecated_playwright_data_dir(self) -> "BenchlingConnection":
|
|
98
|
+
if self.playwright_data_dir is not None:
|
|
99
|
+
warnings.warn(
|
|
100
|
+
"Deprecated BenchlingConnection property set: playwright_data_dir. Liminal no longer uses Playwright to log into Benchling, so it is ignored. Remove it from your BenchlingConnection, since it will be removed in v6.",
|
|
101
|
+
FutureWarning,
|
|
102
|
+
stacklevel=3,
|
|
103
|
+
)
|
|
104
|
+
return self
|