liminal-orm 1.0.3.dev1__tar.gz → 1.0.4.dev1__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 (60) hide show
  1. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/PKG-INFO +1 -1
  2. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/cli/cli.py +2 -2
  3. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/dropdowns/compare.py +1 -1
  4. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/dropdowns/utils.py +25 -10
  5. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/entity_schemas/generate_files.py +1 -1
  6. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/entity_schemas/utils.py +4 -5
  7. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/utils.py +2 -2
  8. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/pyproject.toml +2 -2
  9. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/LICENSE.md +0 -0
  10. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/README.md +0 -0
  11. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/__init__.py +0 -0
  12. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/base/base_dropdown.py +0 -0
  13. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/base/base_operation.py +0 -0
  14. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/base/base_validation_filters.py +0 -0
  15. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/base/compare_operation.py +0 -0
  16. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/base/properties/base_field_properties.py +0 -0
  17. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/base/properties/base_schema_properties.py +0 -0
  18. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/base/str_enum.py +0 -0
  19. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/cli/controller.py +0 -0
  20. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/cli/live_test_dropdown_migration.py +0 -0
  21. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/cli/live_test_entity_schema_migration.py +0 -0
  22. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/connection/__init__.py +0 -0
  23. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/connection/benchling_connection.py +0 -0
  24. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/connection/benchling_service.py +0 -0
  25. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/dropdowns/api.py +0 -0
  26. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/dropdowns/generate_files.py +0 -0
  27. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/dropdowns/operations.py +0 -0
  28. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/entity_schemas/api.py +0 -0
  29. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/entity_schemas/compare.py +0 -0
  30. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/entity_schemas/entity_schema_models.py +0 -0
  31. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/entity_schemas/operations.py +0 -0
  32. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/entity_schemas/tag_schema_models.py +0 -0
  33. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/enums/__init__.py +0 -0
  34. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/enums/benchling_api_field_type.py +0 -0
  35. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/enums/benchling_entity_type.py +0 -0
  36. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/enums/benchling_field_type.py +0 -0
  37. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/enums/benchling_folder_item_type.py +0 -0
  38. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/enums/benchling_naming_strategy.py +0 -0
  39. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/enums/benchling_report_level.py +0 -0
  40. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/enums/benchling_sequence_type.py +0 -0
  41. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/external/__init__.py +0 -0
  42. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/mappers.py +0 -0
  43. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/migrate/components.py +0 -0
  44. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/migrate/revision.py +0 -0
  45. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/migrate/revisions_timeline.py +0 -0
  46. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/migrate/utils.py +0 -0
  47. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/orm/base.py +0 -0
  48. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/orm/base_model.py +0 -0
  49. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/orm/column.py +0 -0
  50. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/orm/mixins.py +0 -0
  51. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/orm/relationship.py +0 -0
  52. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/orm/schema_properties.py +0 -0
  53. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/orm/user.py +0 -0
  54. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/py.typed +0 -0
  55. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/tests/__init__.py +0 -0
  56. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/tests/conftest.py +0 -0
  57. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/tests/from benchling_sdk.py +0 -0
  58. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/tests/test_dropdown_compare.py +0 -0
  59. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/tests/test_entity_schema_compare.py +0 -0
  60. {liminal_orm-1.0.3.dev1 → liminal_orm-1.0.4.dev1}/liminal/validation/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: liminal-orm
3
- Version: 1.0.3.dev1
3
+ Version: 1.0.4.dev1
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
  Author: DynoTx Open Source
6
6
  Author-email: opensource@dynotx.com
@@ -78,8 +78,8 @@ def generate_files(
78
78
  benchling_tenant: str = typer.Argument(
79
79
  ..., help="Benchling tenant (or alias) to connect to."
80
80
  ),
81
- write_path: Path = typer.Argument(
82
- ..., help="The path to write the generated files to."
81
+ write_path: Path = typer.Option(
82
+ Path("."), help="The path to write the generated files to."
83
83
  ),
84
84
  ) -> None:
85
85
  current_revision_id, benchling_connection = read_local_env_file(
@@ -19,7 +19,7 @@ def compare_dropdowns(
19
19
  ) -> dict[str, list[CompareOperation]]:
20
20
  dropdown_operations: dict[str, list[CompareOperation]] = {}
21
21
  benchling_dropdowns: dict[str, Dropdown] = get_benchling_dropdowns_dict(
22
- benchling_service
22
+ benchling_service, include_archived=True
23
23
  )
24
24
  processed_benchling_names = set()
25
25
  model_dropdowns = BaseDropdown.get_all_subclasses(dropdown_names)
@@ -57,15 +57,15 @@ def get_benchling_dropdown_by_name(
57
57
 
58
58
  def get_benchling_dropdowns_dict(
59
59
  benchling_service: BenchlingService,
60
+ include_archived: bool = False,
60
61
  ) -> dict[str, Dropdown]:
61
- with requests.Session() as session:
62
- request = session.get(
63
- f"https://{benchling_service.benchling_tenant}.benchling.com/1/api/schema-field-selectors/?registryId={benchling_service.registry_id}",
64
- headers=benchling_service.custom_post_headers,
65
- cookies=benchling_service.custom_post_cookies,
66
- )
67
- return {
68
- d["name"]: Dropdown(
62
+ def _convert_dropdown_from_json(
63
+ d: dict[str, Any], include_archived: bool = False
64
+ ) -> Dropdown:
65
+ all_options = d["allSchemaFieldSelectorOptions"]
66
+ if not include_archived:
67
+ all_options = [o for o in all_options if not o["archiveRecord"]]
68
+ return Dropdown(
69
69
  id=d["id"],
70
70
  name=d["name"],
71
71
  archive_record=BenchlingArchiveRecord(reason=d["archiveRecord"]["purpose"])
@@ -81,11 +81,26 @@ def get_benchling_dropdowns_dict(
81
81
  if o["archiveRecord"]
82
82
  else None,
83
83
  )
84
- for o in d["allSchemaFieldSelectorOptions"]
84
+ for o in all_options
85
85
  ],
86
86
  )
87
- for d in request.json()["selectorsByRegistryId"][benchling_service.registry_id]
87
+
88
+ with requests.Session() as session:
89
+ request = session.get(
90
+ f"https://{benchling_service.benchling_tenant}.benchling.com/1/api/schema-field-selectors/?registryId={benchling_service.registry_id}",
91
+ headers=benchling_service.custom_post_headers,
92
+ cookies=benchling_service.custom_post_cookies,
93
+ )
94
+ all_dropdowns = request.json()["selectorsByRegistryId"][
95
+ benchling_service.registry_id
96
+ ]
97
+ if not include_archived:
98
+ all_dropdowns = [d for d in all_dropdowns if not d["archiveRecord"]]
99
+ dropdowns = {
100
+ d["name"]: _convert_dropdown_from_json(d, include_archived)
101
+ for d in all_dropdowns
88
102
  }
103
+ return dropdowns
89
104
 
90
105
 
91
106
  def dropdown_exists_in_benchling(
@@ -90,7 +90,7 @@ def generate_all_entity_schema_files(
90
90
  dropdown_classname = dropdown_name_to_classname_map[col.dropdown_link]
91
91
  dropdowns.append(dropdown_classname)
92
92
  column_strings.append(
93
- f"""{tab}{col_name}: SqlColumn = Column(name="{col.name}", type={str(col.type)}, required={col.required}{', is_multi=True' if col.is_multi else ''}{', parent_link=True' if col.parent_link else ''}{f', entity_link="{col.entity_link}"' if col.entity_link else ''}{f', dropdown={dropdown_classname}' if dropdown_classname else ''})"""
93
+ f"""{tab}{col_name}: SqlColumn = Column(name="{col.name}", type={str(col.type)}, required={col.required}{', is_multi=True' if col.is_multi else ''}{', parent_link=True' if col.parent_link else ''}{f', entity_link="{col.entity_link}"' if col.entity_link else ''}{f', dropdown={dropdown_classname}' if dropdown_classname else ''}{f', tooltip="{col.tooltip}"' if col.tooltip else ''})"""
94
94
  )
95
95
  if col.required and col.type:
96
96
  init_strings.append(
@@ -41,6 +41,9 @@ def convert_tag_schema_to_internal_schema(
41
41
  dropdowns_map: dict[str, str],
42
42
  include_archived_fields: bool = False,
43
43
  ) -> tuple[SchemaProperties, dict[str, BaseFieldProperties]]:
44
+ all_fields = tag_schema.allFields
45
+ if not include_archived_fields:
46
+ all_fields = [f for f in all_fields if not f.archiveRecord]
44
47
  return (
45
48
  SchemaProperties(
46
49
  name=tag_schema.name,
@@ -63,11 +66,7 @@ def convert_tag_schema_to_internal_schema(
63
66
  ).set_archived(tag_schema.archiveRecord is not None),
64
67
  {
65
68
  f.systemName: convert_tag_schema_field_to_field_properties(f, dropdowns_map)
66
- for f in (
67
- tag_schema.allFields
68
- if include_archived_fields
69
- else [f for f in tag_schema.allFields if not f.archiveRecord]
70
- )
69
+ for f in all_fields
71
70
  },
72
71
  )
73
72
 
@@ -9,14 +9,14 @@ from liminal.connection.benchling_service import BenchlingService
9
9
 
10
10
  def pascalize(input_string: str) -> str:
11
11
  return "".join(
12
- re.sub(r"[\[\]{}()]", "", word).capitalize()
12
+ re.sub(r"[\[\]{}():]", "", word).capitalize()
13
13
  for word in re.split(r"[ /_\-]", input_string)
14
14
  )
15
15
 
16
16
 
17
17
  def to_snake_case(input_string: str) -> str:
18
18
  return "_".join(
19
- re.sub(r"[\[\]{}()]", "", word).lower()
19
+ re.sub(r"[\[\]{}():]", "", word).lower()
20
20
  for word in re.split(r"[ /_\-]", input_string)
21
21
  )
22
22
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "liminal-orm"
3
- version = "1.0.3.dev1"
3
+ version = "1.0.4.dev1"
4
4
  description = "An ORM and toolkit that builds on top of Benchling's platform to keep your schemas and downstream code dependencies in sync."
5
5
  authors = ["DynoTx Open Source <opensource@dynotx.com>"]
6
6
  readme = "README.md"
@@ -22,7 +22,7 @@ lxml = "^5.3.0"
22
22
  [tool.poetry.group.dev.dependencies]
23
23
  ipykernel = "^6.29.5"
24
24
  mkdocs-material = "^9.5.41"
25
- mypy = "^1.11.2"
25
+ mypy = "^1.1.1"
26
26
  pre-commit = "^4.0.1"
27
27
  pytest = "^8.3.3"
28
28
  ruff = "^0.6.9"