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.
Files changed (294) hide show
  1. {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
  2. {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
  3. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dataframe_compatibility.py +28 -0
  4. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/__init__.py +0 -0
  5. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_dropdown.py +93 -0
  6. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_operation.py +97 -0
  7. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/base_validation_filters.py +32 -0
  8. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/compare_operation.py +13 -0
  9. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/name_template_parts.py +8 -0
  10. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_field_properties.py +138 -0
  11. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_name_template.py +83 -0
  12. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/properties/base_schema_properties.py +140 -0
  13. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/base/str_enum.py +9 -0
  14. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/cli.py +316 -0
  15. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/controller.py +244 -0
  16. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/live_test_dropdown_migration.py +77 -0
  17. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/live_test_entity_schema_migration.py +144 -0
  18. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/cli/utils.py +73 -0
  19. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/__init__.py +5 -0
  20. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/benchling_connection.py +83 -0
  21. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/connection/benchling_service.py +411 -0
  22. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/api.py +175 -0
  23. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/compare.py +170 -0
  24. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/generate_files.py +70 -0
  25. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/operations.py +344 -0
  26. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/dropdowns/utils.py +123 -0
  27. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/api.py +95 -0
  28. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/compare.py +462 -0
  29. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/entity_schema_models.py +209 -0
  30. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/generate_files.py +250 -0
  31. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/operations.py +620 -0
  32. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/tag_schema_models.py +613 -0
  33. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/entity_schemas/utils.py +149 -0
  34. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/__init__.py +8 -0
  35. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_api_field_type.py +23 -0
  36. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_entity_type.py +32 -0
  37. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_field_type.py +78 -0
  38. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_folder_item_type.py +10 -0
  39. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_naming_strategy.py +32 -0
  40. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/benchling_sequence_type.py +8 -0
  41. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/name_template_part_type.py +14 -0
  42. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/enums/sequence_constraint.py +13 -0
  43. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/external/__init__.py +47 -0
  44. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/mappers.py +272 -0
  45. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/components.py +97 -0
  46. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/revision.py +204 -0
  47. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/migrate/revisions_timeline.py +335 -0
  48. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base.py +16 -0
  49. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_model.py +444 -0
  50. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_results_model.py +237 -0
  51. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/registry_entity.py +60 -0
  52. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/schema.py +31 -0
  53. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/base_tables/user.py +32 -0
  54. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/column.py +147 -0
  55. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/mixins.py +98 -0
  56. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/name_template.py +39 -0
  57. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/name_template_parts.py +111 -0
  58. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/relationship.py +114 -0
  59. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/results_schema_properties.py +23 -0
  60. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/orm/schema_properties.py +96 -0
  61. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/py.typed +0 -0
  62. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/generate_files.py +207 -0
  63. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/models/results_schema_model.py +144 -0
  64. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/results_schemas/utils.py +48 -0
  65. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/__init__.py +0 -0
  66. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/conftest.py +542 -0
  67. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/from benchling_sdk.py +3 -0
  68. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_benchling_service.py +34 -0
  69. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_dataframe_compatibility.py +33 -0
  70. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_dropdown_compare.py +192 -0
  71. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/tests/test_entity_schema_compare.py +407 -0
  72. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/unit_dictionary/utils.py +48 -0
  73. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/utils.py +96 -0
  74. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/validation/__init__.py +151 -0
  75. liminal_orm-4.7.0a1/.uv-cache/archive-v0/arvZabAJhner6mVH/liminal/validation/validation_severity.py +10 -0
  76. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/__init__.py +0 -0
  77. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_dropdown.py +93 -0
  78. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_operation.py +97 -0
  79. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/base_validation_filters.py +32 -0
  80. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/compare_operation.py +13 -0
  81. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/name_template_parts.py +8 -0
  82. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_field_properties.py +138 -0
  83. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_name_template.py +83 -0
  84. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/properties/base_schema_properties.py +140 -0
  85. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/base/str_enum.py +9 -0
  86. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/cli.py +316 -0
  87. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/controller.py +244 -0
  88. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/live_test_dropdown_migration.py +77 -0
  89. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/live_test_entity_schema_migration.py +144 -0
  90. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/cli/utils.py +73 -0
  91. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/__init__.py +5 -0
  92. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/benchling_connection.py +83 -0
  93. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/connection/benchling_service.py +411 -0
  94. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/api.py +175 -0
  95. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/compare.py +170 -0
  96. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/generate_files.py +70 -0
  97. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/operations.py +344 -0
  98. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/dropdowns/utils.py +123 -0
  99. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/api.py +95 -0
  100. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/compare.py +462 -0
  101. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/entity_schema_models.py +209 -0
  102. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/generate_files.py +250 -0
  103. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/operations.py +620 -0
  104. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/tag_schema_models.py +613 -0
  105. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/entity_schemas/utils.py +149 -0
  106. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/__init__.py +8 -0
  107. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_api_field_type.py +23 -0
  108. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_entity_type.py +32 -0
  109. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_field_type.py +78 -0
  110. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_folder_item_type.py +10 -0
  111. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_naming_strategy.py +32 -0
  112. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/benchling_sequence_type.py +8 -0
  113. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/name_template_part_type.py +14 -0
  114. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/enums/sequence_constraint.py +13 -0
  115. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/external/__init__.py +47 -0
  116. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/mappers.py +272 -0
  117. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/components.py +97 -0
  118. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/revision.py +204 -0
  119. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/migrate/revisions_timeline.py +335 -0
  120. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base.py +16 -0
  121. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_model.py +444 -0
  122. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_results_model.py +237 -0
  123. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/registry_entity.py +60 -0
  124. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/schema.py +31 -0
  125. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/base_tables/user.py +32 -0
  126. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/column.py +147 -0
  127. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/mixins.py +98 -0
  128. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/name_template.py +39 -0
  129. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/name_template_parts.py +111 -0
  130. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/relationship.py +114 -0
  131. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/results_schema_properties.py +23 -0
  132. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/orm/schema_properties.py +96 -0
  133. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/py.typed +0 -0
  134. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/generate_files.py +207 -0
  135. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/models/results_schema_model.py +144 -0
  136. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/results_schemas/utils.py +48 -0
  137. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/__init__.py +0 -0
  138. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/conftest.py +542 -0
  139. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/from benchling_sdk.py +3 -0
  140. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_benchling_service.py +34 -0
  141. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dataframe_compatibility.py +28 -0
  142. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_dropdown_compare.py +192 -0
  143. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/tests/test_entity_schema_compare.py +407 -0
  144. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/unit_dictionary/utils.py +48 -0
  145. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/utils.py +96 -0
  146. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/validation/__init__.py +151 -0
  147. liminal_orm-4.7.0a1/.uv-cache/archive-v0/eXa8KUkHhZHOAuoK/liminal/validation/validation_severity.py +10 -0
  148. {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/PKG-INFO +16 -5
  149. {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/README.md +1 -0
  150. liminal_orm-4.7.0a1/liminal/__init__.py +0 -0
  151. liminal_orm-4.7.0a1/liminal/base/base_dropdown.py +93 -0
  152. liminal_orm-4.7.0a1/liminal/base/base_operation.py +97 -0
  153. liminal_orm-4.7.0a1/liminal/base/base_validation_filters.py +32 -0
  154. liminal_orm-4.7.0a1/liminal/base/compare_operation.py +13 -0
  155. liminal_orm-4.7.0a1/liminal/base/name_template_parts.py +8 -0
  156. liminal_orm-4.7.0a1/liminal/base/properties/base_field_properties.py +138 -0
  157. liminal_orm-4.7.0a1/liminal/base/properties/base_name_template.py +83 -0
  158. liminal_orm-4.7.0a1/liminal/base/properties/base_schema_properties.py +140 -0
  159. liminal_orm-4.7.0a1/liminal/base/str_enum.py +9 -0
  160. liminal_orm-4.7.0a1/liminal/cli/cli.py +316 -0
  161. liminal_orm-4.7.0a1/liminal/cli/controller.py +244 -0
  162. liminal_orm-4.7.0a1/liminal/cli/live_test_dropdown_migration.py +77 -0
  163. liminal_orm-4.7.0a1/liminal/cli/live_test_entity_schema_migration.py +144 -0
  164. liminal_orm-4.7.0a1/liminal/cli/utils.py +73 -0
  165. liminal_orm-4.7.0a1/liminal/connection/__init__.py +5 -0
  166. liminal_orm-4.7.0a1/liminal/connection/benchling_connection.py +83 -0
  167. liminal_orm-4.7.0a1/liminal/connection/benchling_service.py +411 -0
  168. liminal_orm-4.7.0a1/liminal/dropdowns/api.py +175 -0
  169. liminal_orm-4.7.0a1/liminal/dropdowns/compare.py +170 -0
  170. liminal_orm-4.7.0a1/liminal/dropdowns/generate_files.py +70 -0
  171. liminal_orm-4.7.0a1/liminal/dropdowns/operations.py +344 -0
  172. liminal_orm-4.7.0a1/liminal/dropdowns/utils.py +123 -0
  173. liminal_orm-4.7.0a1/liminal/entity_schemas/api.py +95 -0
  174. liminal_orm-4.7.0a1/liminal/entity_schemas/compare.py +462 -0
  175. liminal_orm-4.7.0a1/liminal/entity_schemas/entity_schema_models.py +209 -0
  176. liminal_orm-4.7.0a1/liminal/entity_schemas/generate_files.py +250 -0
  177. liminal_orm-4.7.0a1/liminal/entity_schemas/operations.py +620 -0
  178. liminal_orm-4.7.0a1/liminal/entity_schemas/tag_schema_models.py +613 -0
  179. liminal_orm-4.7.0a1/liminal/entity_schemas/test_entity_dataframe_compatibility.py +28 -0
  180. liminal_orm-4.7.0a1/liminal/entity_schemas/utils.py +149 -0
  181. liminal_orm-4.7.0a1/liminal/enums/__init__.py +8 -0
  182. liminal_orm-4.7.0a1/liminal/enums/benchling_api_field_type.py +23 -0
  183. liminal_orm-4.7.0a1/liminal/enums/benchling_entity_type.py +32 -0
  184. liminal_orm-4.7.0a1/liminal/enums/benchling_field_type.py +78 -0
  185. liminal_orm-4.7.0a1/liminal/enums/benchling_folder_item_type.py +10 -0
  186. liminal_orm-4.7.0a1/liminal/enums/benchling_naming_strategy.py +32 -0
  187. liminal_orm-4.7.0a1/liminal/enums/benchling_sequence_type.py +8 -0
  188. liminal_orm-4.7.0a1/liminal/enums/name_template_part_type.py +14 -0
  189. liminal_orm-4.7.0a1/liminal/enums/sequence_constraint.py +13 -0
  190. liminal_orm-4.7.0a1/liminal/external/__init__.py +47 -0
  191. liminal_orm-4.7.0a1/liminal/mappers.py +272 -0
  192. liminal_orm-4.7.0a1/liminal/migrate/components.py +97 -0
  193. liminal_orm-4.7.0a1/liminal/migrate/revision.py +204 -0
  194. liminal_orm-4.7.0a1/liminal/migrate/revisions_timeline.py +335 -0
  195. liminal_orm-4.7.0a1/liminal/orm/base.py +16 -0
  196. liminal_orm-4.7.0a1/liminal/orm/base_model.py +444 -0
  197. liminal_orm-4.7.0a1/liminal/orm/base_results_model.py +237 -0
  198. liminal_orm-4.7.0a1/liminal/orm/base_tables/registry_entity.py +60 -0
  199. liminal_orm-4.7.0a1/liminal/orm/base_tables/schema.py +31 -0
  200. liminal_orm-4.7.0a1/liminal/orm/base_tables/user.py +32 -0
  201. liminal_orm-4.7.0a1/liminal/orm/column.py +147 -0
  202. liminal_orm-4.7.0a1/liminal/orm/mixins.py +98 -0
  203. liminal_orm-4.7.0a1/liminal/orm/name_template.py +39 -0
  204. liminal_orm-4.7.0a1/liminal/orm/name_template_parts.py +111 -0
  205. liminal_orm-4.7.0a1/liminal/orm/relationship.py +114 -0
  206. liminal_orm-4.7.0a1/liminal/orm/results_schema_properties.py +23 -0
  207. liminal_orm-4.7.0a1/liminal/orm/schema_properties.py +96 -0
  208. liminal_orm-4.7.0a1/liminal/py.typed +0 -0
  209. liminal_orm-4.7.0a1/liminal/results_schemas/generate_files.py +207 -0
  210. liminal_orm-4.7.0a1/liminal/results_schemas/models/results_schema_model.py +144 -0
  211. liminal_orm-4.7.0a1/liminal/results_schemas/test_results_dataframe_compatibility.py +30 -0
  212. liminal_orm-4.7.0a1/liminal/results_schemas/utils.py +48 -0
  213. liminal_orm-4.7.0a1/liminal/tests/__init__.py +0 -0
  214. liminal_orm-4.7.0a1/liminal/tests/conftest.py +542 -0
  215. liminal_orm-4.7.0a1/liminal/tests/from benchling_sdk.py +3 -0
  216. liminal_orm-4.7.0a1/liminal/tests/test_benchling_service.py +34 -0
  217. liminal_orm-4.7.0a1/liminal/tests/test_dropdown_compare.py +192 -0
  218. liminal_orm-4.7.0a1/liminal/tests/test_entity_schema_compare.py +407 -0
  219. liminal_orm-4.7.0a1/liminal/unit_dictionary/utils.py +48 -0
  220. liminal_orm-4.7.0a1/liminal/utils.py +96 -0
  221. liminal_orm-4.7.0a1/liminal/validation/__init__.py +151 -0
  222. liminal_orm-4.7.0a1/liminal/validation/validation_severity.py +10 -0
  223. {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/pyproject.toml +22 -6
  224. {liminal_orm-4.6.2 → liminal_orm-4.7.0a1}/.gitignore +0 -0
  225. {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
  226. {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
  227. {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
  228. {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
  229. {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
  230. {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
  231. {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
  232. {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
  233. {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
  234. {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
  235. {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
  236. {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
  237. {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
  238. {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
  239. {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
  240. {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
  241. {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
  242. {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
  243. {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
  244. {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
  245. {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
  246. {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
  247. {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
  248. {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
  249. {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
  250. {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
  251. {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
  252. {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
  253. {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
  254. {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
  255. {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
  256. {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
  257. {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
  258. {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
  259. {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
  260. {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
  261. {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
  262. {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
  263. {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
  264. {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
  265. {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
  266. {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
  267. {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
  268. {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
  269. {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
  270. {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
  271. {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
  272. {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
  273. {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
  274. {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
  275. {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
  276. {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
  277. {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
  278. {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
  279. {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
  280. {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
  281. {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
  282. {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
  283. {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
  284. {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
  285. {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
  286. {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
  287. {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
  288. {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
  289. {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
  290. {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
  291. {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
  292. {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
  293. {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
  294. {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
- return pd.read_sql(query.statement, session.connection())
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
- return pd.read_sql(query.statement, session.connection())
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"}]
@@ -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
@@ -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()])})"
@@ -0,0 +1,9 @@
1
+ from enum import Enum
2
+
3
+
4
+ class StrEnum(str, Enum):
5
+ def __repr__(self) -> str:
6
+ """
7
+ Returns the string representation of the enum. ex: 'StrEnum.VALUE'
8
+ """
9
+ return self.__str__()