openepd 4.6.0__py3-none-any.whl → 4.7.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 = "4.6.0"
16
+ VERSION = "4.7.0"
openepd/model/base.py CHANGED
@@ -16,7 +16,7 @@
16
16
  import abc
17
17
  from enum import StrEnum
18
18
  import json
19
- from typing import Any, Callable, Generic, Optional, Type, TypeAlias, TypeVar
19
+ from typing import Any, Callable, ClassVar, Generic, Optional, Type, TypeAlias, TypeVar
20
20
 
21
21
  from openepd.compat.pydantic import pyd, pyd_generics
22
22
  from openepd.model.validation.common import validate_version_compatibility, validate_version_format
@@ -177,7 +177,7 @@ TOpenEpdObjectClass = TypeVar("TOpenEpdObjectClass", bound=Type[BaseOpenEpdSchem
177
177
  class RootDocument(abc.ABC, BaseOpenEpdSchema):
178
178
  """Base class for all objects representing openEPD root element. E.g. Epd, IndustryEpd, GenericEstimate, etc."""
179
179
 
180
- _FORMAT_VERSION: str
180
+ _FORMAT_VERSION: ClassVar[str]
181
181
  """Version of this document format. Must be defined in the concrete class."""
182
182
 
183
183
  doctype: str = pyd.Field(
openepd/model/epd.py CHANGED
@@ -20,7 +20,7 @@ from openepd.model.base import BaseDocumentFactory, OpenEpdDoctypes
20
20
  from openepd.model.common import Amount, Ingredient, WithAltIdsMixin, WithAttachmentsMixin
21
21
  from openepd.model.declaration import BaseDeclaration
22
22
  from openepd.model.lcia import WithLciaMixin
23
- from openepd.model.org import Org, OrgRef, Plant
23
+ from openepd.model.org import Org, Plant
24
24
  from openepd.model.specs import Specs
25
25
  from openepd.model.versioning import OpenEpdVersions, Version
26
26
 
@@ -66,8 +66,8 @@ class EpdPreviewV0(WithAttachmentsMixin, WithAltIdsMixin, BaseDeclaration, title
66
66
  description="Link to data object on original registrar's site",
67
67
  example="https://epd-online.com/EmbeddedEpdList/Download/6029",
68
68
  )
69
- manufacturer: OrgRef | None = pyd.Field(description=MANUFACTURER_DESCRIPTION)
70
- epd_developer: OrgRef | None = pyd.Field(
69
+ manufacturer: Org | None = pyd.Field(description=MANUFACTURER_DESCRIPTION)
70
+ epd_developer: Org | None = pyd.Field(
71
71
  description=DEVELOPER_DESCRIPTION,
72
72
  default=None,
73
73
  )
@@ -82,14 +82,14 @@ class EpdPreviewV0(WithAttachmentsMixin, WithAltIdsMixin, BaseDeclaration, title
82
82
  description="List of object(s) for one or more plant(s) that this declaration applies to.",
83
83
  default_factory=list,
84
84
  )
85
- program_operator: OrgRef | None = pyd.Field(description=PROGRAM_OPERATOR_DESCRIPTION)
85
+ program_operator: Org | None = pyd.Field(description=PROGRAM_OPERATOR_DESCRIPTION)
86
86
  program_operator_doc_id: str | None = pyd.Field(
87
87
  max_length=200, description="Document identifier from Program Operator.", example="123-456.789/b"
88
88
  )
89
89
  program_operator_version: str | None = pyd.Field(
90
90
  max_length=200, description="Document version number from Program Operator.", example="4.3.0"
91
91
  )
92
- third_party_verifier: OrgRef | None = pyd.Field(description=THIRD_PARTY_VERIFIER_DESCRIPTION)
92
+ third_party_verifier: Org | None = pyd.Field(description=THIRD_PARTY_VERIFIER_DESCRIPTION)
93
93
  third_party_verification_url: pyd.AnyUrl | None = pyd.Field(
94
94
  description="Optional link to a verification statement.",
95
95
  example="https://we-verify-epds.com/en/letters/123-456.789b.pdf",
@@ -204,6 +204,8 @@ class EpdWithDepsV0(EpdV0, title="EPD (with Dependencies)"):
204
204
  Expanded version of the EPD.
205
205
 
206
206
  Contains related entities - orgs - with full fields, to support object matching in implementations.
207
+ For now the implementation matches the above EpdV0 entity, but they will diverge as normal Epd would have
208
+ some required fields in Org (like web_domain), and WithDeps would not.
207
209
  """
208
210
 
209
211
  manufacturer: Org | None = pyd.Field(description=MANUFACTURER_DESCRIPTION)
@@ -21,7 +21,7 @@ from openepd.model.common import WithAltIdsMixin, WithAttachmentsMixin
21
21
  from openepd.model.declaration import BaseDeclaration
22
22
  from openepd.model.geography import Geography
23
23
  from openepd.model.lcia import WithLciaMixin
24
- from openepd.model.org import Org, OrgRef
24
+ from openepd.model.org import Org
25
25
  from openepd.model.versioning import OpenEpdVersions, Version
26
26
 
27
27
 
@@ -65,11 +65,11 @@ class GenericEstimatePreviewV0(WithAttachmentsMixin, BaseDeclaration, title="Gen
65
65
  description="1-paragraph description of the Generic Estimate. Supports plain text or github flavored markdown.",
66
66
  )
67
67
 
68
- publisher: OrgRef | None = pyd.Field(description="Organization that published the LCA results.")
68
+ publisher: Org | None = pyd.Field(description="Organization that published the LCA results.")
69
69
  reviewer_email: pyd.EmailStr | None = pyd.Field(
70
70
  description="Email address of the third party verifier", example="john.doe@example.com", default=None
71
71
  )
72
- reviewer: OrgRef | None = pyd.Field(description="Org that performed a critical review of the LCA.")
72
+ reviewer: Org | None = pyd.Field(description="Org that performed a critical review of the LCA.")
73
73
  license_terms: LicenseTerms | None = pyd.Field(description="The license terms for use of the data.")
74
74
  geography: list[Geography] | None = pyd.Field(
75
75
  "Jurisdiction(s) in which the LCA result is applicable. An empty array, or absent properties, implies global applicability."
@@ -102,6 +102,10 @@ class GenericEstimateWithDepsV0(GenericEstimateV0, title="Generic Estimate (with
102
102
  Expanded version of the GenericEstimate.
103
103
 
104
104
  Contains related entities - orgs - with full fields, to support object matching in implementations.
105
+
106
+ For now the implementation matches the above GenericEstimate entity, but they will diverge as normal GE would have
107
+ some required fields in Org (like web_domain), and WithDeps would not.
108
+
105
109
  """
106
110
 
107
111
  publisher: Org | None = pyd.Field(description="Organization that published the LCA results.")
@@ -982,6 +982,65 @@ class HvacHeatExchangersType(StrEnum):
982
982
  SPIRAL = "Spiral"
983
983
 
984
984
 
985
+ class HvacDuctType(StrEnum):
986
+ """
987
+ Hvac duct type.
988
+
989
+ - Flexible: Duckwork that can be bent or adjusted easily. Suitable for tricky, tight spaces where rigid
990
+ ducts cannot be used.
991
+ - Rigid: Stiff ductwork, typically in fixed shapes. Commonly used for main duct runs due to its durability
992
+ and airflow efficiency.
993
+ - Semi-rigid: Less flexible than flexible ducts but not fixed. Balances flexibility and sturdiness,
994
+ useful for certain architectural constraints. Used mostly in residential applications.
995
+ - Ductboard: Insulated panel-type ductwork made from fiberglass or other materials. It provides thermal insulation
996
+ and is used where space is not a constraint.
997
+ """
998
+
999
+ FLEXIBLE = "Flexible"
1000
+ RIGID = "Rigid"
1001
+ SEMI_RIGID = "Semi-rigid"
1002
+ DUCTBOARD = "Ductboard"
1003
+
1004
+
1005
+ class HvacDuctMaterial(StrEnum):
1006
+ """
1007
+ Hvac duct material.
1008
+
1009
+ - Galvanized Steel: coated with a layer of zinc to prevent rust. Very durable and common for both residential
1010
+ and commercial HVAC systems.
1011
+ - Aluminum: lightweight and resistant to corrosion. Uncommon but preferred for special applications due
1012
+ to its ease of handling and installation.
1013
+ - PVC: Plastic ducts suitable for specific environments. Uncommon but used where moisture or chemical resistance
1014
+ is needed. Not for high temperatures.
1015
+ - Fiberglass: Insulated ducts that also absorb sound. Reduces noise and heat loss. Uncommon but suitable
1016
+ for sensitive environments.
1017
+ - Fabric: Ducts made from specialized fabric materials. Used for distributing air uniformly, and in places
1018
+ requiring diffused airflow.
1019
+ """
1020
+
1021
+ GALVANIZED_STEEL = "Galvanized Steel"
1022
+ ALUMINUM = "Aluminum"
1023
+ PVC = "PVC"
1024
+ FIBERGLASS = "Fiberglass"
1025
+ FABRIC = "Fabric"
1026
+
1027
+
1028
+ class HvacDuctShape(StrEnum):
1029
+ """
1030
+ Hvac duct shape.
1031
+
1032
+ - Round: Cylindrical ducts providing efficient airflow. Minimizes friction losses, making it effective for long runs.
1033
+ - Rectangular: Square or rectangular ducts, versatile installation. Common in commercial settings, easier
1034
+ to install in flat spaces.
1035
+ - Oval: Combines attributes of round and rectangular shapes. Provides the benefits of round ducts
1036
+ where space is limited.
1037
+ """
1038
+
1039
+ ROUND = "Round"
1040
+ RECTANGULAR = "Rectangular"
1041
+ OVAL = "Oval"
1042
+
1043
+
985
1044
  class HeatPumpType(StrEnum):
986
1045
  """
987
1046
  Heat pump type.
@@ -23,6 +23,9 @@ from openepd.model.specs.generated.enums import (
23
23
  BoilerConfiguration,
24
24
  BoilerEquipmentFuelType,
25
25
  HeatPumpType,
26
+ HvacDuctMaterial,
27
+ HvacDuctShape,
28
+ HvacDuctType,
26
29
  HvacHeatExchangersType,
27
30
  MechanicalInstallation,
28
31
  MechanicalRefrigerants,
@@ -205,10 +208,22 @@ class HvacVrfSystemsV1(BaseOpenEpdHierarchicalSpec):
205
208
  HvacVrfOutdoor: HvacVrfOutdoorV1 | None = None
206
209
 
207
210
 
211
+ class HvacDuctsV1(BaseOpenEpdHierarchicalSpec):
212
+ """Ducts for HVAC systems performance specification."""
213
+
214
+ _EXT_VERSION = "1.0"
215
+
216
+ shape: HvacDuctShape | None = pyd.Field(default=None, description="Hvac duct shape", example="Rectangular")
217
+ material: HvacDuctMaterial | None = pyd.Field(
218
+ default=None, description="Hvac duct material", example="Galvanized Steel"
219
+ )
220
+ type: HvacDuctType | None = pyd.Field(default=None, description="Hvac duct type", example="Flexible")
221
+
222
+
208
223
  class MechanicalV1(BaseOpenEpdHierarchicalSpec):
209
224
  """Mechanical performance specification."""
210
225
 
211
- _EXT_VERSION = "1.0"
226
+ _EXT_VERSION = "1.1"
212
227
 
213
228
  # Nested specs:
214
229
  HvacAirDiffusers: HvacAirDiffusersV1 | None = None
@@ -222,3 +237,4 @@ class MechanicalV1(BaseOpenEpdHierarchicalSpec):
222
237
  HvacPumps: HvacPumpsV1 | None = None
223
238
  HvacRTUs: HvacRTUsV1 | None = None
224
239
  HvacVrfSystems: HvacVrfSystemsV1 | None = None
240
+ HvacDucts: HvacDuctsV1 | None = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 4.6.0
3
+ Version: 4.7.0
4
4
  Summary: Python library to work with OpenEPD format
5
5
  Home-page: https://github.com/cchangelabs/openepd
6
6
  License: Apache-2.0
@@ -1,5 +1,5 @@
1
1
  openepd/__init__.py,sha256=Shkfh0Kun0YRhmRDw7LkUj2eQL3X-HnP55u2THOEALw,794
2
- openepd/__version__.py,sha256=Bxj3Ca48hb_OiFMyeAxnZuIFNvhflavMRqNuZEV96-4,638
2
+ openepd/__version__.py,sha256=pMpg9-CrnTUE6GtcD2aL-Z8bPoVZ7HOk38EYJxrVfGo,638
3
3
  openepd/api/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
4
4
  openepd/api/base_sync_client.py,sha256=jviqtQgsOVdRq5x7_Yh_Tg8zIdWtVTIUqNCgebf6YDg,20925
5
5
  openepd/api/category/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
@@ -30,13 +30,13 @@ openepd/compat/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,62
30
30
  openepd/compat/compat_functional_validators.py,sha256=yz6DfWeg7knBHEN_enpCGGTLRknEsecXfpzD1FDlywY,834
31
31
  openepd/compat/pydantic.py,sha256=DOjSixsylLqMtFAIARu50sGcT4VPXN_c473q_2JwZQ0,1146
32
32
  openepd/model/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
33
- openepd/model/base.py,sha256=uVEGndgLm8JFwffsCXdusfRE01DQSKJUJLxsd-GXba0,8988
33
+ openepd/model/base.py,sha256=Uy2Fh7Z9nPzrXrOn2aHPoJjktQfVOQ7UBCXiATkPfEQ,9008
34
34
  openepd/model/category.py,sha256=IQXNGQFQmFZ_H9PRONloX_UOSf1sTMDq1rM1yz8JR0Y,1639
35
35
  openepd/model/common.py,sha256=aa_bfotPybPoYyzHtwj5E5X1T-fCEyznMfVUWvpUhiM,5460
36
36
  openepd/model/declaration.py,sha256=5mzX24KpsezqBuGFAr-InsgB4FFNqI7HPJeDHQ93ZCI,5322
37
- openepd/model/epd.py,sha256=3fg6ex8hC4PLALEzYNp62kPKWXZuBwu86fdlv6-6PA4,10159
37
+ openepd/model/epd.py,sha256=bhmPNWQQ28uhaoxE7sW8_mxyswSCEvGovQ2tH69jzUo,10324
38
38
  openepd/model/factory.py,sha256=StQUH7GNmRqskMnnRYkr_PLCl5X5sSLEPiYZOIQI9eo,2541
39
- openepd/model/generic_estimate.py,sha256=aNduYJ0oR1RCXamlbz1erORGKK-7jWIvl4eBJTmbq7g,4582
39
+ openepd/model/generic_estimate.py,sha256=RSpQ4F4uVpwLg7NeymoX-V7c4vw3vbR5O4oObFON62A,4764
40
40
  openepd/model/geography.py,sha256=OngHXz-Dkg-NrVPIwNPP53xu4-HkQ_fnEfX5fYIVEfA,37417
41
41
  openepd/model/lcia.py,sha256=Cw4dwEy5Fb13XyYxpqQyGNhkuZNdjsjucAC7L1TAn7I,17560
42
42
  openepd/model/org.py,sha256=FHcYh2WOOQrCMyzm0Ow-iP79jMTBPcneidjH6NXIklA,3760
@@ -61,7 +61,7 @@ openepd/model/specs/generated/conveying_equipment.py,sha256=sQSnFccpTIw8sNGywW0K
61
61
  openepd/model/specs/generated/electrical.py,sha256=z4v6zbDvyMSYwbz7kb70aks1Ik9Q14ZkLss7cLqUdTs,10755
62
62
  openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py,sha256=h6UQixACOHrquhQ2GFqqYWel_zqOXT-vAkI0o_RLf0A,1978
63
63
  openepd/model/specs/generated/electricity.py,sha256=iGtN21K1MRVwoRfO6friVgiXc2b6cVdITbvnXqLmW3k,823
64
- openepd/model/specs/generated/enums.py,sha256=JaQZFGrGLPxz_J8t5VcSszM8HgmqHaIxqg9-nqFnv_k,58504
64
+ openepd/model/specs/generated/enums.py,sha256=9JA9hay6s76kStmcAvpmF8NLgsYZA3IkNMRh-TMK2qY,60938
65
65
  openepd/model/specs/generated/finishes.py,sha256=QHFtUZcUCGAzZeHJlLoG1D9SxAW9FGPj7g48Fu1Nvdc,21660
66
66
  openepd/model/specs/generated/fire_and_smoke_protection.py,sha256=zkOlnNCnAZ9MUWk2sDqUX14YxNEDU3MGfUlePG3su0Q,3068
67
67
  openepd/model/specs/generated/furnishings.py,sha256=QY_FDsFZaqjCiw2xHsD3kmyBGJA7jCHlSIvaw4TmqXI,2581
@@ -69,7 +69,7 @@ openepd/model/specs/generated/grouting.py,sha256=mDpfsax6TO72SuBqv8HftJDYoQPP741
69
69
  openepd/model/specs/generated/manufacturing_inputs.py,sha256=B1_6OYX3cOFpOBvQRQrbPD4v9-iwKHo4E1fu9YfEDOo,5103
70
70
  openepd/model/specs/generated/masonry.py,sha256=35yUySGoRCApdZSYWbCjZ_rTR7WRPssz4patN8pqHNU,3069
71
71
  openepd/model/specs/generated/material_handling.py,sha256=hx8fisNcFw6GXC7uMfW-4wkGUS8xJA9gTk_WpZGHkqY,1274
72
- openepd/model/specs/generated/mechanical.py,sha256=RfW-HKNWCj6K-emQ6YjfaGU0MldrP9X7xXWlwYWTqeA,9277
72
+ openepd/model/specs/generated/mechanical.py,sha256=qRKvOqRqn2DoyTCOnNwHClyoby0pa4YN8vXuE6CtY8A,9872
73
73
  openepd/model/specs/generated/mechanical_insulation.py,sha256=sbXTXT4xOOgvyDeLN4HZ3xCIwKkaPEjoQlRyCrq4tlM,1617
74
74
  openepd/model/specs/generated/network_infrastructure.py,sha256=GTdoFYj-ZU3rVqFrxb7hY5WzbyN3NnwtqnduH0wODeg,8157
75
75
  openepd/model/specs/generated/openings.py,sha256=cpJr0Qk9FTLktM5hQAOsPBFL36CRP2sKpe_1v1EOVG4,18818
@@ -91,7 +91,7 @@ openepd/model/validation/quantity.py,sha256=kzug0MZ3Ao0zeVzN-aleyxUg5hA_7D5tNOOe
91
91
  openepd/model/versioning.py,sha256=R_zm6rCrgF3vlJQYbpyWhirdS_Oek16cv_mvZmpuE8I,4473
92
92
  openepd/patch_pydantic.py,sha256=xrkzblatmU9HBzukWkp1cPq9ZSuohoz1p0pQqVKSlKs,4122
93
93
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
- openepd-4.6.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
95
- openepd-4.6.0.dist-info/METADATA,sha256=qMG2uMUbdxqQf34jmCjDmHJI1nfG1R-37hDUpN_-jtg,8534
96
- openepd-4.6.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
97
- openepd-4.6.0.dist-info/RECORD,,
94
+ openepd-4.7.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
95
+ openepd-4.7.0.dist-info/METADATA,sha256=cZp9von79AjPkfMiN8va1GOm7Imr7D73byVhyoYBlaI,8534
96
+ openepd-4.7.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
97
+ openepd-4.7.0.dist-info/RECORD,,