openepd 6.18.0__py3-none-any.whl → 6.20.0__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.
openepd/__version__.py CHANGED
@@ -13,4 +13,4 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
- VERSION = "6.18.0"
16
+ VERSION = "6.20.0"
@@ -0,0 +1,15 @@
1
+ #
2
+ # Copyright 2025 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
@@ -0,0 +1,79 @@
1
+ #
2
+ # Copyright 2025 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ from typing import Literal, overload
17
+
18
+ from requests import Response
19
+
20
+ from openepd.api.base_sync_client import BaseApiMethodGroup
21
+ from openepd.api.utils import encode_path_param
22
+ from openepd.model.org import Org, OrgRef
23
+
24
+
25
+ class OrgApi(BaseApiMethodGroup):
26
+ """API methods for Orgs."""
27
+
28
+ @overload
29
+ def create(self, to_create: Org, with_response: Literal[True]) -> tuple[OrgRef, Response]: ...
30
+
31
+ @overload
32
+ def create(self, to_create: Org, with_response: Literal[False] = False) -> OrgRef: ...
33
+
34
+ def create(self, to_create: Org, with_response: bool = False) -> OrgRef | tuple[OrgRef, Response]:
35
+ """
36
+ Create a new organization.
37
+
38
+ :param to_create: Organization to create
39
+ :param with_response: if True, return a tuple of (OrgRef, Response), otherwise return only OrgRef
40
+ :return: Organization reference or Organization reference with HTTP Response object depending on parameter
41
+ :raise ValidationError: if given object Org is invalid
42
+ """
43
+ response = self._client.do_request("post", "/orgs", json=to_create.to_serializable())
44
+ content = response.json()
45
+ ref = OrgRef.parse_obj(content)
46
+ if with_response:
47
+ return ref, response
48
+ return ref
49
+
50
+ @overload
51
+ def edit(self, to_edit: Org, with_response: Literal[True]) -> tuple[OrgRef, Response]: ...
52
+
53
+ @overload
54
+ def edit(self, to_edit: Org, with_response: Literal[False] = False) -> OrgRef: ...
55
+
56
+ def edit(self, to_edit: Org, with_response: bool = False) -> OrgRef | tuple[OrgRef, Response]:
57
+ """
58
+ Edit an organization.
59
+
60
+ :param to_edit: Organization to edit
61
+ :param with_response: if True, return a tuple of (OrgRef, Response), otherwise return only Org
62
+ :return: Organization reference or Organization reference with HTTP Response object depending on parameter
63
+ :raise ValueError: if the organization web_domain is not set
64
+ """
65
+ entity_id = to_edit.web_domain
66
+ if not entity_id:
67
+ msg = "The organization web_domain must be set to edit an organization."
68
+ raise ValueError(msg)
69
+ response = self._client.do_request(
70
+ "put",
71
+ f"/orgs/{encode_path_param(entity_id)}",
72
+ json=to_edit.to_serializable(exclude_unset=True, exclude_defaults=True, by_alias=True),
73
+ )
74
+ response.raise_for_status()
75
+ content = response.json()
76
+ ref = OrgRef.parse_obj(content)
77
+ if with_response:
78
+ return ref, response
79
+ return ref
@@ -13,7 +13,12 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
+ from typing import Literal, overload
17
+
18
+ from requests import Response
19
+
16
20
  from openepd.api.base_sync_client import BaseApiMethodGroup
21
+ from openepd.api.utils import encode_path_param
17
22
  from openepd.model.pcr import Pcr, PcrRef
18
23
 
19
24
 
@@ -42,3 +47,33 @@ class PcrApi(BaseApiMethodGroup):
42
47
  """
43
48
  pcr_ref_obj = self._client.do_request("post", "/pcrs", json=pcr.to_serializable()).json()
44
49
  return PcrRef.parse_obj(pcr_ref_obj)
50
+
51
+ @overload
52
+ def edit(self, to_edit: Pcr, with_response: Literal[True]) -> tuple[PcrRef, Response]: ...
53
+
54
+ @overload
55
+ def edit(self, to_edit: Pcr, with_response: Literal[False] = False) -> PcrRef: ...
56
+
57
+ def edit(self, to_edit: Pcr, with_response: bool = False) -> PcrRef | tuple[PcrRef, Response]:
58
+ """
59
+ Edit a pcr.
60
+
61
+ :param to_edit: Pcr to edit
62
+ :param with_response: if True, return a tuple of (PcrRef, Response), otherwise return only PcrRef
63
+ :return: Pcr reference or Pcr reference with HTTP Response object depending on parameter
64
+ :raise ValueError: if the pcr ID is not set
65
+ """
66
+ entity_id = to_edit.id
67
+ if not entity_id:
68
+ msg = "The pcr ID must be set to edit a pcr."
69
+ raise ValueError(msg)
70
+ response = self._client.do_request(
71
+ "put",
72
+ f"/pcrs/{encode_path_param(entity_id)}",
73
+ json=to_edit.to_serializable(exclude_unset=True, exclude_defaults=True, by_alias=True),
74
+ )
75
+ content = response.json()
76
+ ref = PcrRef.parse_obj(content)
77
+ if with_response:
78
+ return ref, response
79
+ return ref
@@ -0,0 +1,15 @@
1
+ #
2
+ # Copyright 2025 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
@@ -0,0 +1,79 @@
1
+ #
2
+ # Copyright 2025 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ from typing import Literal, overload
17
+
18
+ from requests import Response
19
+
20
+ from openepd.api.base_sync_client import BaseApiMethodGroup
21
+ from openepd.api.utils import encode_path_param
22
+ from openepd.model.org import Plant, PlantRef
23
+
24
+
25
+ class PlantApi(BaseApiMethodGroup):
26
+ """API methods for Plants."""
27
+
28
+ @overload
29
+ def create(self, to_create: Plant, with_response: Literal[True]) -> tuple[PlantRef, Response]: ...
30
+
31
+ @overload
32
+ def create(self, to_create: Plant, with_response: Literal[False] = False) -> PlantRef: ...
33
+
34
+ def create(self, to_create: Plant, with_response: bool = False) -> PlantRef | tuple[PlantRef, Response]:
35
+ """
36
+ Create a new plant.
37
+
38
+ :param to_create: Plant to create
39
+ :param with_response: if True, return a tuple of (PlantRef, Response), otherwise return only PlantRef
40
+ :return: Plant reference or Plant reference with HTTP Response object depending on parameter
41
+ :raise ValidationError: if given object Plant is invalid
42
+ """
43
+ response = self._client.do_request("post", "/plants", json=to_create.to_serializable())
44
+ content = response.json()
45
+ ref = PlantRef.parse_obj(content)
46
+ if with_response:
47
+ return ref, response
48
+ return ref
49
+
50
+ @overload
51
+ def edit(self, to_edit: Plant, with_response: Literal[True]) -> tuple[PlantRef, Response]: ...
52
+
53
+ @overload
54
+ def edit(self, to_edit: Plant, with_response: Literal[False] = False) -> PlantRef: ...
55
+
56
+ def edit(self, to_edit: Plant, with_response: bool = False) -> PlantRef | tuple[PlantRef, Response]:
57
+ """
58
+ Edit a plant.
59
+
60
+ :param to_edit: Plant to edit
61
+ :param with_response: if True, return a tuple of (PlantRef, Response), otherwise return only PlantRef
62
+ :return: Plant reference or Plant reference with HTTP Response object depending on parameter
63
+ :raise ValueError: if the plant ID is not set
64
+ """
65
+ entity_id = to_edit.id
66
+ if not entity_id:
67
+ msg = "The plant ID must be set to edit a plant."
68
+ raise ValueError(msg)
69
+ response = self._client.do_request(
70
+ "put",
71
+ f"/plants/{encode_path_param(entity_id)}",
72
+ json=to_edit.to_serializable(exclude_unset=True, exclude_defaults=True, by_alias=True),
73
+ )
74
+ response.raise_for_status()
75
+ content = response.json()
76
+ ref = PlantRef.parse_obj(content)
77
+ if with_response:
78
+ return ref, response
79
+ return ref
@@ -0,0 +1,15 @@
1
+ #
2
+ # Copyright 2025 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
@@ -0,0 +1,79 @@
1
+ #
2
+ # Copyright 2025 by C Change Labs Inc. www.c-change-labs.com
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+ from typing import Literal, overload
17
+
18
+ from requests import Response
19
+
20
+ from openepd.api.base_sync_client import BaseApiMethodGroup
21
+ from openepd.api.utils import encode_path_param
22
+ from openepd.model.standard import Standard, StandardRef
23
+
24
+
25
+ class StandardApi(BaseApiMethodGroup):
26
+ """API methods for Standards."""
27
+
28
+ @overload
29
+ def create(self, to_create: Standard, with_response: Literal[True]) -> tuple[StandardRef, Response]: ...
30
+
31
+ @overload
32
+ def create(self, to_create: Standard, with_response: Literal[False] = False) -> StandardRef: ...
33
+
34
+ def create(self, to_create: Standard, with_response: bool = False) -> StandardRef | tuple[StandardRef, Response]:
35
+ """
36
+ Create a new standard.
37
+
38
+ :param to_create: Standard to create
39
+ :param with_response: if True, return a tuple of (StandardRef, Response), otherwise return only StandardRef
40
+ :return: Standard reference or Standard reference with HTTP Response object depending on parameter
41
+ :raise ValidationError: if given object Standard is invalid
42
+ """
43
+ response = self._client.do_request("post", "/standards", json=to_create.to_serializable())
44
+ content = response.json()
45
+ ref = StandardRef.parse_obj(content)
46
+ if with_response:
47
+ return ref, response
48
+ return ref
49
+
50
+ @overload
51
+ def edit(self, to_edit: Standard, with_response: Literal[True]) -> tuple[StandardRef, Response]: ...
52
+
53
+ @overload
54
+ def edit(self, to_edit: Standard, with_response: Literal[False] = False) -> StandardRef: ...
55
+
56
+ def edit(self, to_edit: Standard, with_response: bool = False) -> StandardRef | tuple[StandardRef, Response]:
57
+ """
58
+ Edit a standard.
59
+
60
+ :param to_edit: Standard to edit
61
+ :param with_response: if True, return a tuple of (StandardRef, Response), otherwise return only StandardRef
62
+ :return: Standard reference or Standard reference with HTTP Response object depending on parameter
63
+ :raise ValueError: if the standard short_name is not set
64
+ """
65
+ entity_id = to_edit.short_name
66
+ if not entity_id:
67
+ msg = "The standard short_name must be set to edit a standard."
68
+ raise ValueError(msg)
69
+ response = self._client.do_request(
70
+ "put",
71
+ f"/standards/{encode_path_param(entity_id)}",
72
+ json=to_edit.to_serializable(exclude_unset=True, exclude_defaults=True, by_alias=True),
73
+ )
74
+ response.raise_for_status()
75
+ content = response.json()
76
+ ref = StandardRef.parse_obj(content)
77
+ if with_response:
78
+ return ref, response
79
+ return ref
@@ -22,7 +22,10 @@ from openepd.api.average_dataset.industry_epd_sync_api import IndustryEpdApi
22
22
  from openepd.api.base_sync_client import SyncHttpClient, TokenAuth
23
23
  from openepd.api.category.sync_api import CategoryApi
24
24
  from openepd.api.epd.sync_api import EpdApi
25
+ from openepd.api.org.sync_api import OrgApi
25
26
  from openepd.api.pcr.sync_api import PcrApi
27
+ from openepd.api.plant.sync_api import PlantApi
28
+ from openepd.api.standard.sync_api import StandardApi
26
29
 
27
30
 
28
31
  class OpenEpdApiClientSync:
@@ -41,6 +44,9 @@ class OpenEpdApiClientSync:
41
44
  self._http_client = SyncHttpClient(base_url, auth=auth, **kwargs)
42
45
  self.__epd_api: EpdApi | None = None
43
46
  self.__pcr_api: PcrApi | None = None
47
+ self.__org_api: OrgApi | None = None
48
+ self.__plant_api: PlantApi | None = None
49
+ self.__standard_api: StandardApi | None = None
44
50
  self.__category_api: CategoryApi | None = None
45
51
  self.__generic_estimate_api: GenericEstimateApi | None = None
46
52
  self.__industry_epd_api: IndustryEpdApi | None = None
@@ -59,6 +65,27 @@ class OpenEpdApiClientSync:
59
65
  self.__pcr_api = PcrApi(self._http_client)
60
66
  return self.__pcr_api
61
67
 
68
+ @property
69
+ def orgs(self) -> OrgApi:
70
+ """Get the Org API."""
71
+ if self.__org_api is None:
72
+ self.__org_api = OrgApi(self._http_client)
73
+ return self.__org_api
74
+
75
+ @property
76
+ def plants(self) -> PlantApi:
77
+ """Get the Plant API."""
78
+ if self.__plant_api is None:
79
+ self.__plant_api = PlantApi(self._http_client)
80
+ return self.__plant_api
81
+
82
+ @property
83
+ def standards(self) -> StandardApi:
84
+ """Get the Standard API."""
85
+ if self.__standard_api is None:
86
+ self.__standard_api = StandardApi(self._http_client)
87
+ return self.__standard_api
88
+
62
89
  @property
63
90
  def categories(self) -> CategoryApi:
64
91
  """Get the Category API."""
@@ -2031,6 +2031,7 @@ class InsulatingMaterial(StrEnum):
2031
2031
  EXPANDED_POLYETHYLENE = "Expanded Polyethylene"
2032
2032
  EPS = "EPS"
2033
2033
  WOOD_FIBER = "Wood Fiber"
2034
+ POLYURETHANE = "Polyurethane"
2034
2035
  OTHER = "Other"
2035
2036
 
2036
2037
 
@@ -121,6 +121,27 @@ class ShotcreteRangeV1(BaseOpenEpdHierarchicalSpec):
121
121
  _EXT_VERSION = "1.0"
122
122
 
123
123
 
124
+ class OtherConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
125
+ """
126
+ Other Concrete.
127
+
128
+ Range version.
129
+ """
130
+
131
+ _EXT_VERSION = "1.0"
132
+
133
+
134
+ class CellularConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
135
+ """
136
+ Cellular concrete is typically composed of cementitious material, water, and pre-formed foam with air entrainment.
137
+
138
+ Such a product is a homogeneous void or cell structure.
139
+ It is self-compacting and can be pumped over extensive heights and distances.
140
+ """
141
+
142
+ _EXT_VERSION = "1.0"
143
+
144
+
124
145
  class ConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
125
146
  """
126
147
  Concrete.
@@ -131,7 +152,7 @@ class ConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
131
152
  Range version.
132
153
  """
133
154
 
134
- _EXT_VERSION = "1.0"
155
+ _EXT_VERSION = "1.1"
135
156
 
136
157
  lightweight: bool | None = pyd.Field(default=None, description="Product is lightweight")
137
158
  strength_28d: AmountRangePressureMpa | None = pyd.Field(default=None, description="Concrete strength after 28 days")
@@ -177,3 +198,5 @@ class ConcreteRangeV1(BaseOpenEpdHierarchicalSpec):
177
198
  OilPatch: OilPatchRangeV1 | None = None
178
199
  ReadyMix: ReadyMixRangeV1 | None = None
179
200
  Shotcrete: ShotcreteRangeV1 | None = None
201
+ OtherConcrete: OtherConcreteRangeV1 | None = None
202
+ CellularConcrete: CellularConcreteRangeV1 | None = None
@@ -99,6 +99,28 @@ class ShotcreteV1(BaseOpenEpdHierarchicalSpec):
99
99
  _EXT_VERSION = "1.0"
100
100
 
101
101
 
102
+ class CellularConcreteV1(BaseOpenEpdHierarchicalSpec):
103
+ """
104
+ Cellular concrete is typically composed of cementitious material, water, and pre-formed foam with air entrainment.
105
+
106
+ Such a product is a homogeneous void or cell structure.
107
+ It is self-compacting and can be pumped over extensive heights and distances.
108
+ """
109
+
110
+ _EXT_VERSION = "1.0"
111
+
112
+
113
+ class OtherConcreteV1(BaseOpenEpdHierarchicalSpec):
114
+ """
115
+ Other Concrete Products.
116
+
117
+ Other types of concrete products that are not captured by existing concrete categories.
118
+ Could include products such as patching concrete or additives
119
+ """
120
+
121
+ _EXT_VERSION = "1.0"
122
+
123
+
102
124
  class ConcreteV1(BaseOpenEpdHierarchicalSpec):
103
125
  """
104
126
  Concrete.
@@ -107,7 +129,7 @@ class ConcreteV1(BaseOpenEpdHierarchicalSpec):
107
129
  hardens over time.
108
130
  """
109
131
 
110
- _EXT_VERSION = "1.0"
132
+ _EXT_VERSION = "1.1"
111
133
 
112
134
  # Own fields:
113
135
  lightweight: bool | None = pyd.Field(default=None, description="Product is lightweight", example=True)
@@ -173,6 +195,8 @@ class ConcreteV1(BaseOpenEpdHierarchicalSpec):
173
195
  OilPatch: OilPatchV1 | None = None
174
196
  ReadyMix: ReadyMixV1 | None = None
175
197
  Shotcrete: ShotcreteV1 | None = None
198
+ OtherConcrete: OtherConcreteV1 | None = None
199
+ CellularConcrete: CellularConcreteV1 | None = None
176
200
 
177
201
  _aci_exposure_classes_exclusive_groups_validator = pyd.validator("aci_exposure_classes", allow_reuse=True)(
178
202
  exclusive_groups_validator_factory(AciExposureClass)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: openepd
3
- Version: 6.18.0
3
+ Version: 6.20.0
4
4
  Summary: Python library to work with OpenEPD format
5
5
  License: Apache-2.0
6
6
  Author: C-Change Labs
@@ -1,5 +1,5 @@
1
1
  openepd/__init__.py,sha256=fhxfEyEurLvSfvQci-vb3njzl_lvhcLXiZrecCOaMU8,794
2
- openepd/__version__.py,sha256=Nax6JWlEOZo8C77Zc0b6oQhFqjhMuCqe9NH96tOeN-M,639
2
+ openepd/__version__.py,sha256=qqFv4TdG_QezASXat2Iyq25c6fS3PUY0MuIdqETulzQ,639
3
3
  openepd/api/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
4
4
  openepd/api/average_dataset/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
5
5
  openepd/api/average_dataset/generic_estimate_sync_api.py,sha256=_eZt_jGVL1a3p9cr-EF39Ve9Vl5sB8zwzTc_slnRL50,7975
@@ -19,9 +19,15 @@ openepd/api/epd/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,6
19
19
  openepd/api/epd/dto.py,sha256=MqhHjaNdtOc-KT2zNI88EB9-1d2a6CS2zzSus8HefBo,4874
20
20
  openepd/api/epd/sync_api.py,sha256=kBsx43q0cBm51hl3HVvzMIDrMMRi8NMyudPmHYd0qqU,7342
21
21
  openepd/api/errors.py,sha256=BgZeNfMNAKVPfhpuiVapCXNBSsXygAOWql-gy7m9j7E,2868
22
+ openepd/api/org/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
23
+ openepd/api/org/sync_api.py,sha256=VzOrd3eB1xPVLyrKlZl3OwXIQ5nT3808sA6N7MNBu7w,3167
22
24
  openepd/api/pcr/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
23
- openepd/api/pcr/sync_api.py,sha256=MyBOlBqdJt35-fXk-Vr-RpiKUbN_XlilUwwFGvVROdQ,1557
24
- openepd/api/sync_client.py,sha256=reD_OXsaVOvUvnC-cyp5aq8sKSOH2Z8xmImxV2ClQIM,3105
25
+ openepd/api/pcr/sync_api.py,sha256=JWiegxoSnD2JElYORp6QdkbO3jDNhrNKxJR6orsD1TI,2849
26
+ openepd/api/plant/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
27
+ openepd/api/plant/sync_api.py,sha256=cryGfKojyXV78RxIPRTGscWuLnkdgTNJAw9RkxrbZWI,3121
28
+ openepd/api/standard/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
29
+ openepd/api/standard/sync_api.py,sha256=Oj_Os3yBPk7y7hXDvQbzr-AyX-z2b82jzbN7AuiK3Go,3264
30
+ openepd/api/sync_client.py,sha256=DiDSQU0kBd9gU17KrPUvo07pyLv15rGozuWXbkM1JzA,4037
25
31
  openepd/api/test/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
26
32
  openepd/api/utils.py,sha256=xOU8ihC0eghsoaCFhC85PU4WYRwNxVEpfK3gzq4e9ik,2092
27
33
  openepd/bundle/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
@@ -53,7 +59,7 @@ openepd/model/specs/__init__.py,sha256=toVWd8_jxmAf7gRwpoXQpLfZW6Cl-NwveoduMXhEC
53
59
  openepd/model/specs/asphalt.py,sha256=eHhcITbBrNYR5N6x4Q2BxpsR64BR9OkjJ4bvPRYOqMg,3411
54
60
  openepd/model/specs/base.py,sha256=10IDyRFKQgFnyIPSqpeayP8Og1BDgs1EepXX5dyCMM4,2674
55
61
  openepd/model/specs/concrete.py,sha256=D9jbhZDtTXNBoAgljQBPxsmGsMvLSIAP5H53ZYiXcGI,5336
56
- openepd/model/specs/enums.py,sha256=tX26ZSV1yWPSJMjmo_JRQI2_wJhXJ8XD4nJjRB26rpw,63049
62
+ openepd/model/specs/enums.py,sha256=6vNIDqt2kI-JKp9EBP9vhis935tfAS31znZ7v7LHb8s,63083
57
63
  openepd/model/specs/range/__init__.py,sha256=nV5ODdlIF2o0JZzIkgmzjo5_B3GNqKYEL_FWjyFvM8Y,4536
58
64
  openepd/model/specs/range/accessories.py,sha256=hZYz8mvAqrfLFiOIZ9qQZ59zmEiu0xE61Ko9cQ7NSKU,2498
59
65
  openepd/model/specs/range/aggregates.py,sha256=udVbsYc1Lyrd6a4YZBGNDQ3sBi-L3WLub_e1ecq7U-Q,2549
@@ -63,7 +69,7 @@ openepd/model/specs/range/bulk_materials.py,sha256=SuKhmJXMa9jl0CrkYr3QVvPX_GDbr
63
69
  openepd/model/specs/range/cast_decks_and_underlayment.py,sha256=37fx7jDRy6xryZTVweW_vu78h0kRs5vQurGS-Ypayog,1132
64
70
  openepd/model/specs/range/cladding.py,sha256=r7M2lc77NR2GXBkgkqRzskQ6TdZeMd7pEEm8ecHb8rc,7236
65
71
  openepd/model/specs/range/cmu.py,sha256=Sv4yw6121LSgYhW4J82xKsIi1KucaeDVF7xmpZtoCt8,1833
66
- openepd/model/specs/range/concrete.py,sha256=m2JP-W4Pnoo6q3hUbkIJF4_hTwI_-7FNLGZzdp-PX1w,6907
72
+ openepd/model/specs/range/concrete.py,sha256=CwRJ_0lJ6zRFwaiom3jrp50BSTiB9mIGL3ujcygZwfs,7528
67
73
  openepd/model/specs/range/conveying_equipment.py,sha256=_rqJ9Y3kkP8E6-vkZb6Pih3JnR1nUESJoOLf-LT--sc,3176
68
74
  openepd/model/specs/range/electrical.py,sha256=EI8pv9SN4lJbFNz1wlyMNAjkA0dsi84pc2J9YvtiwzY,11860
69
75
  openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py,sha256=xDdyLj6oJRmdybq7W91MtgE80FDpaG6ii5hE921aRGQ,2525
@@ -102,7 +108,7 @@ openepd/model/specs/singular/cast_decks_and_underlayment.py,sha256=HjIEKekxCAKx5
102
108
  openepd/model/specs/singular/cladding.py,sha256=ywT6E8iv55khqbrkMRFOkm_PAWht3qt4ybNDNRa1wyw,6588
103
109
  openepd/model/specs/singular/cmu.py,sha256=yexfb3REDGvVG3yD_1Yg1Zt-atBWLa8tv2lPmBPDWfw,1952
104
110
  openepd/model/specs/singular/common.py,sha256=rPJTp2XuSa_dOXj6ZikzMv-lLbEwPLaP-XsXkjDB4uI,1048
105
- openepd/model/specs/singular/concrete.py,sha256=G3PRrqNdlAougtuvvmjp1Fp-qFOvUTVbpW2UFfMQ-ts,7718
111
+ openepd/model/specs/singular/concrete.py,sha256=yDqNa5Ylv__ago6jeYUjBH2GNhMUlXjTHasl1Ing7tU,8467
106
112
  openepd/model/specs/singular/conveying_equipment.py,sha256=AK_KdGyBDh0_Dl3YCkIyfHEfpiJmntdH-e9rFaIZv2s,3042
107
113
  openepd/model/specs/singular/deprecated/__init__.py,sha256=f8I04fHO5QWpNtorrCgbUXz4r0B0zgsk8zDUfXu_i80,2635
108
114
  openepd/model/specs/singular/deprecated/concrete.py,sha256=swSOfViIvy7z923C6uHBcIZrv_JRMv7wSJHpg9PGAJg,5265
@@ -144,7 +150,7 @@ openepd/model/validation/quantity.py,sha256=mP4gIkeOGZuHRhprsf_BX11Cic75NssYxOTk
144
150
  openepd/model/versioning.py,sha256=wBZdOVL3ND9FMIRU9PS3vx9M_7MBiO70xYPQvPez6po,4522
145
151
  openepd/patch_pydantic.py,sha256=bO7U5HqthFol0vfycb0a42UAGL3KOQ8-9MW4yCWOFP0,4150
146
152
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
- openepd-6.18.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
148
- openepd-6.18.0.dist-info/METADATA,sha256=KbKTmRSBbq8LSANcUMXpAmBMIxjhstZUdafIKBKFXUU,9067
149
- openepd-6.18.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
150
- openepd-6.18.0.dist-info/RECORD,,
153
+ openepd-6.20.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
154
+ openepd-6.20.0.dist-info/METADATA,sha256=J0jlBV5Gco4ONtZm_cOAEIAKc06-ChlLrK6TJ_tiAwc,9067
155
+ openepd-6.20.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
156
+ openepd-6.20.0.dist-info/RECORD,,