industrial-model 0.1.41__py3-none-any.whl → 1.0.1__py3-none-any.whl

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.
@@ -1,4 +1,4 @@
1
- from cognite.client.data_classes.data_modeling import InstanceSort, View
1
+ from cognite.client.data_classes.data_modeling import InstanceSort, MappedProperty, View
2
2
 
3
3
  from industrial_model.cognite_adapters.utils import get_property_ref
4
4
  from industrial_model.constants import SORT_DIRECTION
@@ -15,7 +15,17 @@ class SortMapper:
15
15
  InstanceSort(
16
16
  property=get_property_ref(column.property, root_view),
17
17
  direction=direction,
18
- nulls_first=direction == "descending",
18
+ nulls_first=self._is_nulls_first(column, root_view, direction),
19
19
  )
20
20
  for column, direction in sort_clauses
21
21
  ]
22
+
23
+ def _is_nulls_first(
24
+ self, column: Column, root_view: View, direction: SORT_DIRECTION
25
+ ) -> bool:
26
+ view_property = root_view.properties.get(column.property)
27
+
28
+ if isinstance(view_property, MappedProperty) and view_property.source:
29
+ return direction == "ascending"
30
+
31
+ return direction == "descending"
@@ -20,13 +20,13 @@ def generate_engine_params(
20
20
  file_env_parsed = env_sub_template.substitute(dict(os.environ))
21
21
 
22
22
  engine_config = yaml.safe_load(file_env_parsed)
23
- assert isinstance(
24
- engine_config, dict
25
- ), "Configuration file must contain a dictionary"
23
+ assert isinstance(engine_config, dict), (
24
+ "Configuration file must contain a dictionary"
25
+ )
26
26
  assert "cognite" in engine_config, "Configuration must contain 'cognite' section"
27
- assert (
28
- "data_model" in engine_config
29
- ), "Configuration must contain 'data_model' section"
27
+ assert "data_model" in engine_config, (
28
+ "Configuration must contain 'data_model' section"
29
+ )
30
30
 
31
31
  client = CogniteClient.load(engine_config["cognite"])
32
32
  dm_id = DataModelId.model_validate(engine_config["data_model"])
@@ -73,9 +73,9 @@ class ViewInstance(InstanceId):
73
73
  return cls.view_config.get("view_external_id") or cls.__name__
74
74
 
75
75
  def get_edge_metadata(self, property: Column | str | Any) -> list[EdgeContainer]:
76
- assert isinstance(
77
- property, Column | str
78
- ), f"Expected property to be Column, or str, got {type(property).__name__}"
76
+ assert isinstance(property, Column | str), (
77
+ f"Expected property to be Column, or str, got {type(property).__name__}"
78
+ )
79
79
  identifier = property.property if isinstance(property, Column) else property
80
80
 
81
81
  edge_map_key = self.get_field_alias(identifier) or self.get_field_name(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: industrial-model
3
- Version: 0.1.41
3
+ Version: 1.0.1
4
4
  Summary: Industrial Model ORM
5
5
  Project-URL: Homepage, https://github.com/lucasrosaalves/industrial-model
6
6
  Project-URL: Source, https://github.com/lucasrosaalves/industrial-model
@@ -24,7 +24,7 @@ Description-Content-Type: text/markdown
24
24
 
25
25
  # 📦 industrial-model
26
26
 
27
- `industrial-model` is a Python ORM-style abstraction for querying views and data models in Cognite Data Fusion (CDF). It provides a declarative and type-safe way to model CDF views using `pydantic`, build queries, and interact with the CDF API in a Pythonic fashion.
27
+ `industrial-model` is a Python ORM-style abstraction for querying views in Cognite Data Fusion (CDF). It provides a declarative and type-safe way to model CDF views using `pydantic`, build queries, and interact with the CDF API in a Pythonic fashion.
28
28
 
29
29
  ---
30
30
 
@@ -54,7 +54,6 @@ We use the simplified version of the `CogniteAsset`view in the `CogniteCore` dat
54
54
 
55
55
  ```graphql
56
56
  type CogniteAsset {
57
- object3D: Cognite3DObject
58
57
  name: String
59
58
  description: String
60
59
  tags: [String]
@@ -11,17 +11,17 @@ industrial_model/cognite_adapters/optimizer.py,sha256=-iorsO-yOe8wuMNBMsV1KjAmC3
11
11
  industrial_model/cognite_adapters/query_mapper.py,sha256=tpRdrEW6i0NKy5h6bYrIIP96nanPSokK-s5-1d0PES8,6597
12
12
  industrial_model/cognite_adapters/query_result_mapper.py,sha256=KaBqYr5l1t8sQMxEoX_F3J2prypKIPaDJxSzGF_fMB8,10203
13
13
  industrial_model/cognite_adapters/search_mapper.py,sha256=zRe5FgucTWHX2VVbh3iLmzM7FmUAFhJG5t42gXnnJrE,1587
14
- industrial_model/cognite_adapters/sort_mapper.py,sha256=RJUAYlZGXoYzK0PwX63cibRF_L-MUq9g2ZsC2EeNIF4,696
14
+ industrial_model/cognite_adapters/sort_mapper.py,sha256=EQ2Xpfdet8jN6EK0rEZ3IA8L7sPXWVX1MA9kQg4LdXs,1083
15
15
  industrial_model/cognite_adapters/upsert_mapper.py,sha256=jzelnmECFcuVkQY7dgZG-xL19yD9kxtYvx827InIMO8,4951
16
16
  industrial_model/cognite_adapters/utils.py,sha256=-9NUG84r49cKvmmzoUinxNF1zhHIlmoWFypUCD_WTeM,4800
17
17
  industrial_model/cognite_adapters/view_mapper.py,sha256=9nWx0P7h8TMthLcOF5GZ4yC4UOndVuUo_s-Oz5nSAyM,1276
18
18
  industrial_model/engines/__init__.py,sha256=7aGHrUm2MxIq39vR8h0xu3i1zNOuT9H9U-q4lV3nErQ,102
19
- industrial_model/engines/_internal.py,sha256=bepUTKygYNHcOB810-KoWIKnzf4hFpwXZoWYJyuOUfc,1090
19
+ industrial_model/engines/_internal.py,sha256=a3fdqqP3pVTPkfYIF5W_bNSQiIps3MA4xiGC3HOIYhI,1092
20
20
  industrial_model/engines/async_engine.py,sha256=BSuI1vjUsjHeYSvxZM4bK2cEw-WutzjlCUFU0Nnu2-M,2139
21
21
  industrial_model/engines/engine.py,sha256=icpYh-zgzMM_jsV5AytXoXz-nb2nYKug6qkekeMAQQw,4621
22
22
  industrial_model/models/__init__.py,sha256=g8oa95iG6c22A-vTYhiZKSYa6RG2C7Ht1dpn5_HfXxs,796
23
23
  industrial_model/models/base.py,sha256=qi44m0KW9KuXKTSJqSLea1poErBeAqm6Hv08VdRYHkU,2023
24
- industrial_model/models/entities.py,sha256=jqTgyCv8frzovKCKg6yVUNO9hoBqz_b3HGYbGwIq7gI,5698
24
+ industrial_model/models/entities.py,sha256=-Jf7bNCijbS3_wZohlog3bRsAkXvkUeAQW9DamJqGFo,5700
25
25
  industrial_model/models/schemas.py,sha256=EoLK9GYdS-0DQ98myTP3wOU9YpWIJOfDSLOYZUy3xEY,4559
26
26
  industrial_model/models/utils.py,sha256=MFS8OyCfh4cYPY_R66-mUaCauQfQy0vd558Rw0tiGDc,1786
27
27
  industrial_model/queries/__init__.py,sha256=lA83zOxMRgBgkseWJgK9kCr1vD8D8iSWs9NGGRnoYKk,355
@@ -30,7 +30,7 @@ industrial_model/queries/params.py,sha256=50qY5BO5onLsXorhcv-7qCKhJaMO94UzhKLCmZ
30
30
  industrial_model/queries/utils.py,sha256=uP6PLh9IVHDK6J8x444zHWPmyV4PkxdLO-PMc6qWItc,1505
31
31
  industrial_model/statements/__init__.py,sha256=3Et9PM7AMbIS7Fh9051Q0u3qUpX6588d1yuNrvdd4wI,5429
32
32
  industrial_model/statements/expressions.py,sha256=4ZZOcZroI5-4xRw4PXIRlufi0ARndE5zSbbxLDpR2Ec,4816
33
- industrial_model-0.1.41.dist-info/METADATA,sha256=NezuBkb2KOQ2zkUkvE91wXKVSC2vLtyDNhiKht4AWsM,7725
34
- industrial_model-0.1.41.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
35
- industrial_model-0.1.41.dist-info/licenses/LICENSE,sha256=BCHCZ1Qo7m4YvAEIQqtVBI3NebFJdZ8_7m_cxInIlN0,4934
36
- industrial_model-0.1.41.dist-info/RECORD,,
33
+ industrial_model-1.0.1.dist-info/METADATA,sha256=aVJIFKqwM1oLsn2s2TAwq15sE6UCYMJyhUi5GyssbMw,7680
34
+ industrial_model-1.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
35
+ industrial_model-1.0.1.dist-info/licenses/LICENSE,sha256=BCHCZ1Qo7m4YvAEIQqtVBI3NebFJdZ8_7m_cxInIlN0,4934
36
+ industrial_model-1.0.1.dist-info/RECORD,,