liminal-orm 3.1.0__tar.gz → 3.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/PKG-INFO +1 -1
  2. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/dropdowns/generate_files.py +2 -2
  3. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/entity_schemas/generate_files.py +5 -5
  4. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/entity_schemas/operations.py +7 -2
  5. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/utils.py +10 -15
  6. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/validation/__init__.py +3 -3
  7. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/pyproject.toml +1 -1
  8. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/LICENSE.md +0 -0
  9. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/README.md +0 -0
  10. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/__init__.py +0 -0
  11. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/base_dropdown.py +0 -0
  12. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/base_operation.py +0 -0
  13. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/base_validation_filters.py +0 -0
  14. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/compare_operation.py +0 -0
  15. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/name_template_parts.py +0 -0
  16. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/properties/base_field_properties.py +0 -0
  17. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/properties/base_name_template.py +0 -0
  18. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/properties/base_schema_properties.py +0 -0
  19. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/base/str_enum.py +0 -0
  20. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/cli/cli.py +0 -0
  21. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/cli/controller.py +0 -0
  22. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/cli/live_test_dropdown_migration.py +0 -0
  23. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/cli/live_test_entity_schema_migration.py +0 -0
  24. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/cli/utils.py +0 -0
  25. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/connection/__init__.py +0 -0
  26. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/connection/benchling_connection.py +0 -0
  27. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/connection/benchling_service.py +0 -0
  28. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/dropdowns/api.py +0 -0
  29. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/dropdowns/compare.py +0 -0
  30. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/dropdowns/operations.py +0 -0
  31. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/dropdowns/utils.py +0 -0
  32. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/entity_schemas/api.py +0 -0
  33. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/entity_schemas/compare.py +0 -0
  34. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/entity_schemas/entity_schema_models.py +0 -0
  35. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/entity_schemas/tag_schema_models.py +0 -0
  36. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/entity_schemas/utils.py +0 -0
  37. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/__init__.py +0 -0
  38. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/benchling_api_field_type.py +0 -0
  39. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/benchling_entity_type.py +0 -0
  40. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/benchling_field_type.py +0 -0
  41. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/benchling_folder_item_type.py +0 -0
  42. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/benchling_naming_strategy.py +0 -0
  43. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/benchling_sequence_type.py +0 -0
  44. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/name_template_part_type.py +0 -0
  45. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/enums/sequence_constraint.py +0 -0
  46. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/external/__init__.py +0 -0
  47. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/mappers.py +0 -0
  48. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/migrate/components.py +0 -0
  49. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/migrate/revision.py +0 -0
  50. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/migrate/revisions_timeline.py +0 -0
  51. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/base.py +0 -0
  52. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/base_model.py +0 -0
  53. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/base_tables/registry_entity.py +0 -0
  54. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/base_tables/schema.py +0 -0
  55. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/base_tables/user.py +0 -0
  56. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/column.py +0 -0
  57. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/mixins.py +0 -0
  58. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/name_template.py +0 -0
  59. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/name_template_parts.py +0 -0
  60. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/relationship.py +0 -0
  61. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/orm/schema_properties.py +0 -0
  62. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/py.typed +0 -0
  63. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/tests/__init__.py +0 -0
  64. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/tests/conftest.py +0 -0
  65. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/tests/from benchling_sdk.py +0 -0
  66. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/tests/test_dropdown_compare.py +0 -0
  67. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/tests/test_entity_schema_compare.py +0 -0
  68. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/unit_dictionary/utils.py +0 -0
  69. {liminal_orm-3.1.0 → liminal_orm-3.1.1}/liminal/validation/validation_severity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: liminal-orm
3
- Version: 3.1.0
3
+ Version: 3.1.1
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
  Home-page: https://github.com/dynotx/liminal-orm
6
6
  Author: DynoTx Open Source
@@ -4,7 +4,7 @@ from rich import print
4
4
 
5
5
  from liminal.connection import BenchlingService
6
6
  from liminal.dropdowns.utils import get_benchling_dropdowns_dict
7
- from liminal.utils import pascalize, to_snake_case
7
+ from liminal.utils import to_pascal_case, to_snake_case
8
8
 
9
9
 
10
10
  def generate_all_dropdown_files(
@@ -24,7 +24,7 @@ def generate_all_dropdown_files(
24
24
  for dropdown_name, dropdown_options in dropdowns.items():
25
25
  dropdown_values = [option.name for option in dropdown_options.options]
26
26
  options_list = str(dropdown_values).replace("'", '"')
27
- classname = pascalize(dropdown_name)
27
+ classname = to_pascal_case(dropdown_name)
28
28
  dropdown_content = f"""
29
29
  from liminal.base.base_dropdown import BaseDropdown
30
30
 
@@ -8,7 +8,7 @@ from liminal.entity_schemas.utils import get_converted_tag_schemas
8
8
  from liminal.enums import BenchlingEntityType, BenchlingFieldType
9
9
  from liminal.mappers import convert_benchling_type_to_python_type
10
10
  from liminal.orm.name_template import NameTemplate
11
- from liminal.utils import pascalize, to_snake_case
11
+ from liminal.utils import to_pascal_case, to_snake_case
12
12
 
13
13
 
14
14
  def get_entity_mixin(entity_type: BenchlingEntityType) -> str:
@@ -59,18 +59,18 @@ def generate_all_entity_schema_files(
59
59
  subdirectory_map: dict[str, list[tuple[str, str]]] = {}
60
60
  benchling_dropdowns = get_benchling_dropdowns_dict(benchling_service)
61
61
  dropdown_name_to_classname_map: dict[str, str] = {
62
- dropdown_name: pascalize(dropdown_name)
62
+ dropdown_name: to_pascal_case(dropdown_name)
63
63
  for dropdown_name in benchling_dropdowns.keys()
64
64
  }
65
65
  wh_name_to_classname: dict[str, str] = {
66
- sp.warehouse_name: pascalize(sp.name) for sp, _, _ in models
66
+ sp.warehouse_name: to_pascal_case(sp.name) for sp, _, _ in models
67
67
  }
68
68
 
69
69
  for schema_properties, name_template, columns in models:
70
- classname = pascalize(schema_properties.name)
70
+ classname = to_pascal_case(schema_properties.name)
71
71
 
72
72
  for schema_properties, name_template, columns in models:
73
- classname = pascalize(schema_properties.name)
73
+ classname = to_pascal_case(schema_properties.name)
74
74
  filename = to_snake_case(schema_properties.name) + ".py"
75
75
  columns = {key: columns[key] for key in columns}
76
76
  import_strings = [
@@ -313,10 +313,15 @@ class CreateEntitySchemaField(BaseOperation):
313
313
  self.index = index
314
314
 
315
315
  self._wh_field_name: str
316
+ self._field_name: str
316
317
  if field_props.warehouse_name:
317
318
  self._wh_field_name = field_props.warehouse_name
318
319
  else:
319
320
  raise ValueError("Field warehouse name is required.")
321
+ if field_props.name:
322
+ self._field_name = field_props.name
323
+ else:
324
+ raise ValueError("Field name is required.")
320
325
 
321
326
  def execute(self, benchling_service: BenchlingService) -> dict[str, Any]:
322
327
  try:
@@ -385,10 +390,10 @@ class CreateEntitySchemaField(BaseOperation):
385
390
  if (
386
391
  benchling_service.connection.config_flags.schemas_enable_change_warehouse_name
387
392
  is False
388
- and self.field_props.warehouse_name != to_snake_case(self.field_props.name)
393
+ and self.field_props.warehouse_name != to_snake_case(self._field_name)
389
394
  ):
390
395
  raise ValueError(
391
- f"{self.wh_schema_name}: Tenant config flag SCHEMAS_ENABLE_CHANGE_WAREHOUSE_NAME is required to set a custom field warehouse name. Reach out to Benchling support to turn this config flag to True and then set the flag to True in BenchlingConnection.config_flags. Otherwise, define the field warehouse_name in code to be the given Benchling warehouse name: {to_snake_case(self.field_props.name)}."
396
+ f"{self.wh_schema_name}: Tenant config flag SCHEMAS_ENABLE_CHANGE_WAREHOUSE_NAME is required to set a custom field warehouse name. Reach out to Benchling support to turn this config flag to True and then set the flag to True in BenchlingConnection.config_flags. Otherwise, define the field warehouse_name in code to be the given Benchling warehouse name: {to_snake_case(self._field_name)}."
392
397
  )
393
398
  if (
394
399
  self.field_props.unit_name
@@ -10,30 +10,25 @@ from liminal.connection.benchling_service import BenchlingService
10
10
 
11
11
 
12
12
  def generate_random_id(length: int = 8) -> str:
13
- """Generate a random ID with only lowercase letters."""
13
+ """Generate a pseudo-random ID with only lowercase letters."""
14
14
  return "".join(random.choices(string.ascii_lowercase, k=length))
15
15
 
16
16
 
17
- def pascalize(input_string: str) -> str:
17
+ def to_pascal_case(input_string: str) -> str:
18
18
  """
19
- Convert a string to PascalCase.
19
+ Convert a string to PascalCase. Filters out any non-alphanumeric characters.
20
20
  """
21
- return "".join(
22
- re.sub(r"[\[\]{}():]", "", word).capitalize()
23
- for word in re.split(r"[ /_\-]", input_string)
24
- )
21
+ words = re.split(r"[ /_\-]", input_string)
22
+ # Then remove any non-alphanumeric characters and capitalize each word
23
+ return "".join(re.sub(r"[^a-zA-Z0-9]", "", word).capitalize() for word in words)
25
24
 
26
25
 
27
- def to_snake_case(input_string: str | None) -> str:
26
+ def to_snake_case(input_string: str) -> str:
28
27
  """
29
- Convert a string to snake_case.
28
+ Convert a string to snake_case. Filters out any non-alphanumeric characters.
30
29
  """
31
- if input_string is None:
32
- return ""
33
- return "_".join(
34
- re.sub(r"[\[\]{}():]", "", word).lower()
35
- for word in re.split(r"[ /_\-]", input_string)
36
- )
30
+ words = re.split(r"[ /_\-]", input_string)
31
+ return "_".join(re.sub(r"[^a-zA-Z0-9]", "", word).lower() for word in words)
37
32
 
38
33
 
39
34
  def to_string_val(input_val: Any) -> str:
@@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Any, Callable
4
4
 
5
5
  from pydantic import BaseModel, ConfigDict
6
6
 
7
- from liminal.utils import pascalize
7
+ from liminal.utils import to_pascal_case
8
8
  from liminal.validation.validation_severity import ValidationSeverity
9
9
 
10
10
  if TYPE_CHECKING:
@@ -137,14 +137,14 @@ def liminal_validator(
137
137
  valid=False,
138
138
  level=validator_level,
139
139
  entity=self,
140
- validator_name=validator_name or pascalize(func.__name__),
140
+ validator_name=validator_name or to_pascal_case(func.__name__),
141
141
  message=str(e),
142
142
  )
143
143
  return BenchlingValidatorReport.create_validation_report(
144
144
  valid=True,
145
145
  level=validator_level,
146
146
  entity=self,
147
- validator_name=validator_name or pascalize(func.__name__),
147
+ validator_name=validator_name or to_pascal_case(func.__name__),
148
148
  )
149
149
 
150
150
  setattr(wrapper, "_is_liminal_validator", True)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "liminal-orm"
3
- version = "3.1.0"
3
+ version = "3.1.1"
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"
File without changes
File without changes