openepd 3.1.1__py3-none-any.whl → 3.1.3__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.
Files changed (34) hide show
  1. openepd/__version__.py +1 -1
  2. openepd/compat/compat_functional_validators.py +29 -0
  3. openepd/compat/pydantic.py +6 -1
  4. openepd/model/specs/concrete.py +1 -157
  5. openepd/model/specs/generated/asphalt.py +1 -11
  6. openepd/model/specs/generated/cladding.py +4 -16
  7. openepd/model/specs/generated/cmu.py +1 -8
  8. openepd/model/specs/generated/concrete.py +59 -33
  9. openepd/model/specs/generated/conveying_equipment.py +2 -12
  10. openepd/model/specs/generated/electrical.py +9 -12
  11. openepd/model/specs/generated/enums.py +26 -20
  12. openepd/model/specs/generated/finishes.py +2 -36
  13. openepd/model/specs/generated/fire_and_smoke_protection.py +1 -3
  14. openepd/model/specs/generated/furnishings.py +1 -3
  15. openepd/model/specs/generated/masonry.py +5 -4
  16. openepd/model/specs/generated/mechanical.py +25 -93
  17. openepd/model/specs/generated/mechanical_insulation.py +1 -5
  18. openepd/model/specs/generated/network_infrastructure.py +2 -12
  19. openepd/model/specs/generated/openings.py +209 -91
  20. openepd/model/specs/generated/plumbing.py +3 -19
  21. openepd/model/specs/generated/precast_concrete.py +1 -5
  22. openepd/model/specs/generated/steel.py +117 -53
  23. openepd/model/specs/generated/thermal_moisture_protection.py +1 -15
  24. openepd/model/specs/generated/utility_piping.py +2 -10
  25. openepd/model/specs/generated/wood.py +1 -5
  26. openepd/model/validation/quantity.py +158 -16
  27. {openepd-3.1.1.dist-info → openepd-3.1.3.dist-info}/METADATA +2 -1
  28. {openepd-3.1.1.dist-info → openepd-3.1.3.dist-info}/RECORD +30 -33
  29. openepd/model/specs/aluminium.py +0 -67
  30. openepd/model/specs/glass.py +0 -360
  31. openepd/model/specs/steel.py +0 -184
  32. openepd/model/specs/wood.py +0 -130
  33. {openepd-3.1.1.dist-info → openepd-3.1.3.dist-info}/LICENSE +0 -0
  34. {openepd-3.1.1.dist-info → openepd-3.1.3.dist-info}/WHEEL +0 -0
@@ -1,5 +1,5 @@
1
1
  openepd/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
2
- openepd/__version__.py,sha256=rwS4v5JkA3cxID1usXh3VK1DMKIZ60kBre3pvGgaobQ,855
2
+ openepd/__version__.py,sha256=3Eh_qZicwJYii9dyyB-2KQWynO2s7Uw5q0hpfoWU8wQ,855
3
3
  openepd/api/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
4
4
  openepd/api/base_sync_client.py,sha256=JcNpWsGoIK_1Eg27CAQd7nIjbcfD56jQ1nS6B48Q0cI,21142
5
5
  openepd/api/category/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
@@ -27,7 +27,8 @@ openepd/bundle/model.py,sha256=TdFkUTOnd_dklcP-Qahp2glvk1YgEM0HfiqQz5MikeA,2663
27
27
  openepd/bundle/reader.py,sha256=z4v_UWyaosktN3DdmnRx8GpLq4DkejjoUsckFfCgUac,6904
28
28
  openepd/bundle/writer.py,sha256=AfvzzdAr9ybIbtiZfuX2mAGfddamTxXxUTxtHHrs2Gc,8353
29
29
  openepd/compat/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
30
- openepd/compat/pydantic.py,sha256=wh7vExwILD9QUYAKbrALXtTqNvsc6E8tjVVYXF2WvTY,1174
30
+ openepd/compat/compat_functional_validators.py,sha256=GBifyebqJC0U-Pfz8GlAIvtufoKJZuEGZOT-KwE8JUA,1051
31
+ openepd/compat/pydantic.py,sha256=fk-6umbMBbKvNDCwsF1AA4Z63C7dYamt5U5A_bFLAXc,1363
31
32
  openepd/model/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
32
33
  openepd/model/base.py,sha256=Yerebn3KP8-CdeeKOuQ1h16qkZnNGn7yvZNiAWutpsI,9154
33
34
  openepd/model/category.py,sha256=NhQzKYi02DcdDy83qI_WZuGfYAUcZgsEPEXRa0nGqxs,1856
@@ -39,57 +40,53 @@ openepd/model/org.py,sha256=XJcfKGPN90IIGcN-S1ZNy8Zh_yM28iT2wbJD3pk3T08,4013
39
40
  openepd/model/pcr.py,sha256=MypmvAR56ldoSMqtq0JKVeqUGHD-heyfsOPXjGcZFQ4,4620
40
41
  openepd/model/specs/README.md,sha256=W5LSMpZuW5x36cKS4HRfeFsClsRf8J9yHMMICghdc0s,862
41
42
  openepd/model/specs/__init__.py,sha256=lN1u5WN1H9uwWSHb4sFEBxJ3_tvGYar9iCvsDD67JTQ,5176
42
- openepd/model/specs/aluminium.py,sha256=wRtkixZqO_27mulz0m60oZfAR1I0r_4cikvT-9U4lnk,2271
43
43
  openepd/model/specs/asphalt.py,sha256=1Vmw3jsdTyhPaM9ftIjMvpLj7GbGnZLytaJYDDJQ7bU,3549
44
44
  openepd/model/specs/base.py,sha256=T0HsHTFf5ew1sLgUf-7dfifrMPMup7WRc-C5DHAXUc4,2697
45
- openepd/model/specs/concrete.py,sha256=TVfKbvZGJwC_LDJimHj07_5KsOrNBi-S6KQ3-DmrXsA,15961
45
+ openepd/model/specs/concrete.py,sha256=YvhUaq0GBazRuYUiMhdt1qppcBS9PcVlg98XuzMsJ-4,9810
46
46
  openepd/model/specs/generated/accessories.py,sha256=Gt7H0Xz6kWce05MfF_J0v5sah8xrZnGcc7XhJBDkE30,1934
47
47
  openepd/model/specs/generated/aggregates.py,sha256=TMw2f7K7kuKP23MWkeFyqKUIXJFIamwX3gSR-48k3AY,3161
48
48
  openepd/model/specs/generated/aluminium.py,sha256=MXOo_Hnue2kbxg9nwF5d-C1rubqHACGjcJymGoRgUGU,2440
49
- openepd/model/specs/generated/asphalt.py,sha256=D-V1J-VxjoAhfYA6ACnujLNGkAmqQ-RQRB4TEZeALpQ,3837
49
+ openepd/model/specs/generated/asphalt.py,sha256=uWIc2xkwyDC5ezSyR3Z2BOU_VF96Pat6zPD1N_IUed4,3365
50
50
  openepd/model/specs/generated/bulk_materials.py,sha256=DJgOjpj1ZqwwieMV_4wNKEgLnX1hKbAM4jaLDSICxNM,1034
51
51
  openepd/model/specs/generated/cast_decks_and_underlayment.py,sha256=2VwwCgVRb3SuDy-x4EsI-n7GRnq0E7xrNE78CHoEExg,1058
52
- openepd/model/specs/generated/cladding.py,sha256=RHq6irHwXJNnKuBOsA3h2g1jedMDOJPmV4WNjkdesgs,6939
53
- openepd/model/specs/generated/cmu.py,sha256=mSRYG67m2c01C1dmYNyQjXQmYCcM4frpLQ3wKurTa50,2324
52
+ openepd/model/specs/generated/cladding.py,sha256=r84f9CVTDzvokV64ThmY8CFSatEhWZqMBiMUlFMaGiE,6475
53
+ openepd/model/specs/generated/cmu.py,sha256=LGBrmjciW5xTBoHna7l94LSsIVfrmljOsaSeaViO7sE,2000
54
54
  openepd/model/specs/generated/common.py,sha256=n_wuE-VtNFytpE-uLZrSXeeIIoNl2lSutPodiGKH94E,1117
55
- openepd/model/specs/generated/concrete.py,sha256=cbTwYGxw0ttPYcg8zrkQEehNqtI3wakI7XgTEec0W24,6617
56
- openepd/model/specs/generated/conveying_equipment.py,sha256=HcMSuyng9OlRKvUVYSstJx0XtaD8_cQ9ka8l4vG76AY,2422
57
- openepd/model/specs/generated/electrical.py,sha256=oEhWkm4Au9N0xtTLUNTUVMxQUuJuvoLgOKccnAI0oGQ,10457
55
+ openepd/model/specs/generated/concrete.py,sha256=EPyT87aid75q9WGxmOX8k4ik4I9SfoL_fbvhYHsfbEo,7204
56
+ openepd/model/specs/generated/conveying_equipment.py,sha256=Hm4jUvFzpOHH0Q1k8CfEq398DuS2DoAq5FSIGdST7Og,1986
57
+ openepd/model/specs/generated/electrical.py,sha256=vY2gZq9qpOStwnlO2n7PBMT3QMlA1-T3Msw663LhhFc,9996
58
58
  openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py,sha256=CiI6wcfo_tf6QoGkpAjUskCUKNJQvz0_N0RD7tF1oiA,2117
59
59
  openepd/model/specs/generated/electricity.py,sha256=8W_vkCn_MDoB5rqGbPp2g04VMEG0ULMexD4OImgAt9U,1029
60
- openepd/model/specs/generated/enums.py,sha256=_7eYhDClgRPrtt06o9N11enoKIIEUaHTBu9QGW3CABw,57079
61
- openepd/model/specs/generated/finishes.py,sha256=xGjhNfpecOT7H4zElK34VSJuy8mfJ8gFF85PurKatao,22337
62
- openepd/model/specs/generated/fire_and_smoke_protection.py,sha256=sbyEIMHB8zkIREqvUW6SSYZO9Tlx_zEoJrHWhqIjboI,2801
63
- openepd/model/specs/generated/furnishings.py,sha256=NkS59ulTVqzSWFveM4Qd0Wv6bh0E-sx45fLrTH3Ixs4,3076
60
+ openepd/model/specs/generated/enums.py,sha256=fCX13A-xCZoIBb_CR-_XSBBWemLSCg5QhqCoE2IxlW4,58482
61
+ openepd/model/specs/generated/finishes.py,sha256=Ymsr_mj_20EYUBMkzblBmy8Mb9GgMD40aizgoNVbNac,20292
62
+ openepd/model/specs/generated/fire_and_smoke_protection.py,sha256=X9VYPkvNodqldtWSTk1kS4I_oUR4xnTV42-skX7Zwhg,2665
63
+ openepd/model/specs/generated/furnishings.py,sha256=IoSQD7wK6JVcAeOY-82BRZEZ9wOP3_nAYtAX7i55_Yc,2940
64
64
  openepd/model/specs/generated/grouting.py,sha256=JAdrgzQObw_6nBeM6KHoTShXXBhG_38qDi6vOHvxXWM,1023
65
65
  openepd/model/specs/generated/manufacturing_inputs.py,sha256=zlGyBUyGIW7Ruyt5XkPgu_q9yGaTFJQ4sjkdGQ-LucA,4599
66
- openepd/model/specs/generated/masonry.py,sha256=VUd5Noeqtv8NWQfTqnM_8O0GZroib_pMipll2-pYQr8,3177
66
+ openepd/model/specs/generated/masonry.py,sha256=vO0b3SkTGAAimzwexte1at2MzUAl1nRjQ-XmoCe3mFY,3216
67
67
  openepd/model/specs/generated/material_handling.py,sha256=qiyo_nH4nXmvTZxebqhOMXytCtpcQolHf3OLs1LBOx8,1225
68
- openepd/model/specs/generated/mechanical.py,sha256=fELaoqPbNhgOQ_6oB8NIRfgz7Nff_nB6rqb0um1MGKY,11561
69
- openepd/model/specs/generated/mechanical_insulation.py,sha256=CAtiQCPZUnRnfnKS8upqxQGuWoizCk4Hq8hgxg_0ZoA,1900
70
- openepd/model/specs/generated/network_infrastructure.py,sha256=rejSwn6i0Ns4K2tFbv212wroM-zT4B2vTeIr3g8MVeg,8644
71
- openepd/model/specs/generated/openings.py,sha256=n-SSgG-xHNwHGnKK5JN1PxLkxspTtSf8rgizXf3KtJs,17100
68
+ openepd/model/specs/generated/mechanical.py,sha256=oXaVr9bhKdgggCNEXEcCHbh0349M9zfxKXTwd7xqCoI,8388
69
+ openepd/model/specs/generated/mechanical_insulation.py,sha256=O2ulg8Pj9PEAk0OqzWWH9REgcqvXLxHillslDoDF_yU,1714
70
+ openepd/model/specs/generated/network_infrastructure.py,sha256=Qj7_ODFbG0UavLrlwb2hoI09PPrBAD4xeLbHpW5Cn2w,7924
71
+ openepd/model/specs/generated/openings.py,sha256=QVPbHP3yMHBPFrAo_fk6CYcJ3OltlMIKXX4-JNWE95k,19035
72
72
  openepd/model/specs/generated/other_electrical_equipment.py,sha256=06HI_DEoHlywStzhj8rQtkfnXyWc-4Q4O3iE2rv4h2I,1057
73
73
  openepd/model/specs/generated/other_materials.py,sha256=DCVKE_C0aVdotwayPuMATTlEmDjfTUm3-cQ8gzdxGMw,3453
74
- openepd/model/specs/generated/plumbing.py,sha256=MOtI9aRGHtW64hui2x9ayHgkhtXtem0Aa6GTHJMpHw8,5439
75
- openepd/model/specs/generated/precast_concrete.py,sha256=0aMCCXnCCgt7GGvjAppFAe-Hidjn-rokpvhOL1YgK0A,2690
74
+ openepd/model/specs/generated/plumbing.py,sha256=Utad1UQaoCghFs4u-IsNMJ5jdBecVMPXP9Se00WFbAk,4652
75
+ openepd/model/specs/generated/precast_concrete.py,sha256=9OaBMV8g5DxwZ46a1OXIpipMlISc3W39B-O3g1AOx68,2490
76
76
  openepd/model/specs/generated/sheathing.py,sha256=pV_j6R8mZ7Kyr8WYxP6UzsP3qSAqwxbVfe9V7jjSYb0,3516
77
- openepd/model/specs/generated/steel.py,sha256=F3YzUb7jxUISn04Ye1NtMKORiYaqFfqfixTMfQWUJQY,8102
78
- openepd/model/specs/generated/thermal_moisture_protection.py,sha256=3rqYO7_ljDMF_SLy0SsMjuiciOyL2qgVCyYz3b9ouTM,7963
79
- openepd/model/specs/generated/utility_piping.py,sha256=qUJEFUWMav-TTB4UcJhRW2E_xftBwr0NwL_oTZmLuLQ,2768
80
- openepd/model/specs/generated/wood.py,sha256=w_z9b2bIBjNyLEsn8MvFxVo0sVSuK75Mmuh9fQbOqgo,6199
77
+ openepd/model/specs/generated/steel.py,sha256=QoECjBYKXOrfjjfdm5nVfpU3a-a0Xv68vay45NUJ9zo,10119
78
+ openepd/model/specs/generated/thermal_moisture_protection.py,sha256=xsxqRo6rdKSFiI7Ijh1LdF6C-6DZYkbyrRRp1MdTggQ,7368
79
+ openepd/model/specs/generated/utility_piping.py,sha256=B4LCUff5Ygh3U7DplAAlfYarRivLEeWWcHC1Yu3ewTk,2372
80
+ openepd/model/specs/generated/wood.py,sha256=etcTYm4EW6TAbODUDAnQlb9qP1SU8CsL3hUwWWGv7w4,6027
81
81
  openepd/model/specs/generated/wood_joists.py,sha256=UFakZ93LJqr-gSUz8hTyjx7BwHBq0BzWjpSKZ1B5TgQ,1880
82
- openepd/model/specs/glass.py,sha256=JNIYlG7ybWTBPWBHq6kRGT4ibkkWGkDbb61zLPhKOPk,13664
83
- openepd/model/specs/steel.py,sha256=6yRH_HK36kqn5XfAuF0_Q6TQtmeAc163qGIeStFGCM0,6367
84
- openepd/model/specs/wood.py,sha256=DtviU3TrcWW74of8si2PCmaHxrdKWO1M2rSCBo_n6v8,5144
85
82
  openepd/model/standard.py,sha256=8F70DCagplBe7IvkGJOUmt7td-uh_8zzdpvuVpjk0GY,1535
86
83
  openepd/model/validation/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
87
84
  openepd/model/validation/common.py,sha256=TPxIUtTNqNLiDsvuSE_dVREtNBe6XsagVMH4u1MYfpA,2652
88
85
  openepd/model/validation/numbers.py,sha256=4gkMS35zKnGyfdFyLTgHncNmKpg8-WOYX9qaUr5scE4,1105
89
- openepd/model/validation/quantity.py,sha256=GIPPtzOVwMYgKpx1XbDmoLQERlcoQ-VSK6k_EyMNQoQ,5287
86
+ openepd/model/validation/quantity.py,sha256=tBryaJcgvU4fvXAHILp2C0E7VkOQaW80Msq4_tnE3xc,7411
90
87
  openepd/model/versioning.py,sha256=1gqeeAhc2lVonq9ErOD3Ws7XZ0CgZnmlFpKHKrc9IwI,4690
91
88
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- openepd-3.1.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
93
- openepd-3.1.1.dist-info/METADATA,sha256=awCzyeqGXZZ5nITI6LOUXyHWwP4mS-CYhWrc_FzbaAE,7762
94
- openepd-3.1.1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
95
- openepd-3.1.1.dist-info/RECORD,,
89
+ openepd-3.1.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
90
+ openepd-3.1.3.dist-info/METADATA,sha256=neWDjvnYnAOjA5REWADsX1_mFnx3corhKd-qoxkMh-8,7790
91
+ openepd-3.1.3.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
92
+ openepd-3.1.3.dist-info/RECORD,,
@@ -1,67 +0,0 @@
1
- #
2
- # Copyright 2024 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
- # This software was developed with support from the Skanska USA,
17
- # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
- # Find out more at www.BuildingTransparency.org
19
- #
20
- from enum import StrEnum
21
-
22
- from openepd.compat.pydantic import pyd
23
- from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
24
- from openepd.model.validation.numbers import RatioFloat
25
-
26
-
27
- class AluminiumAlloy(StrEnum):
28
- """Aluminium alloy enum."""
29
-
30
- ALLOY_1xxx = ("1xxx",)
31
- ALLOY_2xxx = ("2xxx",)
32
- ALLOY_3xxx = ("3xxx",)
33
- ALLOY_4xxx = ("4xxx",)
34
- ALLOY_5xxx = ("5xxx",)
35
- ALLOY_6xxx = ("6xxx",)
36
- ALLOY_7xxx = ("7xxx",)
37
- ALLOY_8xxx = ("8xxx",)
38
- ALLOY_1xx_x = ("1xx.x",)
39
- ALLOY_2xx_x = ("2xx.x",)
40
- ALLOY_3xx_x = ("3xx.x",)
41
- ALLOY_4xx_x = ("4xx.x",)
42
- ALLOY_5xx_x = ("5xx.x",)
43
- ALLOY_7xx_x = ("7xx.x",)
44
- ALLOY_8xx_x = ("8xx.x",)
45
- ALLOY_9xx_x = ("9xx.x",)
46
-
47
-
48
- class AluminiumExtrusionsV1(BaseOpenEpdHierarchicalSpec):
49
- """Aluminium extrusions V1 spec."""
50
-
51
- _EXT_VERSION = "1.0"
52
-
53
- """Aluminium extrusions V1 spec."""
54
- thermally_improved: bool | None = pyd.Field(default=None, description="Thermally improved")
55
-
56
-
57
- class AluminiumV1(BaseOpenEpdHierarchicalSpec):
58
- """Aluminium V1 spec."""
59
-
60
- _EXT_VERSION = "1.0"
61
- recycled_content: RatioFloat | None = pyd.Field(default=None, description="Recycled content")
62
-
63
- alloy: AluminiumAlloy | None = pyd.Field(default=None, description="AluminiumAlloy")
64
- anodized: bool | None = None
65
- painted: bool | None = None
66
-
67
- AluminiumExtrusions: AluminiumExtrusionsV1 | None = pyd.Field(title="AluminiumExtrusionsV1", default=None)
@@ -1,360 +0,0 @@
1
- #
2
- # Copyright 2024 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
- # This software was developed with support from the Skanska USA,
17
- # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
- # Find out more at www.BuildingTransparency.org
19
- #
20
- from enum import StrEnum
21
-
22
- from openepd.compat.pydantic import pyd
23
- from openepd.model.base import BaseOpenEpdSchema
24
- from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
25
- from openepd.model.specs.generated.enums import NAFSPerformanceGrade
26
- from openepd.model.validation.numbers import PositiveInt, RatioFloat
27
- from openepd.model.validation.quantity import HeatConductanceUCIStr, LengthMmStr, PressureMPaStr, QuantityStr
28
-
29
-
30
- class SolarHeatGainMixin(BaseOpenEpdSchema):
31
- """Solar heat gain mixin."""
32
-
33
- solar_heat_gain: RatioFloat | None = pyd.Field(
34
- default=None,
35
- description="Solar heat gain, measured at a certain level of Differential Pressure.",
36
- example=0.3,
37
- le=1,
38
- ge=0,
39
- )
40
-
41
-
42
- class GlazingOptionsMixin(BaseOpenEpdSchema):
43
- """Glazing options mixin."""
44
-
45
- low_emissivity: bool | None = pyd.Field(default=None, description="Low Emissivity coatings")
46
- electrochromic: bool | None = pyd.Field(
47
- default=None, description="Glazing with an electrically controllable solar heat gain and/or other properties."
48
- )
49
- acid_etched: bool | None = pyd.Field(
50
- default=None, description="Flat glass that has undergone a chemical etching process."
51
- )
52
- tempered: bool | None = pyd.Field(
53
- default=None,
54
- description="Consists of a single pane that has been heat-treated "
55
- "to give the glass increased impact resistance. Standard typically used in North America.",
56
- )
57
- toughened: bool | None = pyd.Field(
58
- default=None,
59
- description="Consists of a single pane that has been specially heat-treated to give the glass increased "
60
- "impact resistance. Standard typically used in Europe.",
61
- )
62
-
63
- laminated: bool | None = pyd.Field(
64
- default=None,
65
- description="Consists of at least two glass panes lying one on top of the other, with one or several layers "
66
- "of a tear-resistant, viscoelastic film positioned between the panes, which consist of polyvinyl "
67
- "butyral (PVB)",
68
- )
69
- fire_resistant: bool | None = pyd.Field(default=None, description="Fire resistant")
70
- fire_protection: bool | None = pyd.Field(
71
- default=None,
72
- description="Specifically tested for its ability to block flames and smoke, but not radiant heat. Ranges"
73
- " from specialty tempered products rated for ~20 minutes to glass ceramics rated up to 3 hours.",
74
- )
75
- pyrolytic_coated: bool | None = pyd.Field(
76
- default=None,
77
- description="At least one coating is applied in a pyrolytic process, typically during float glass production.",
78
- )
79
- sputter_coat: bool | None = pyd.Field(
80
- default=None, description="At least one coating is applied using sputter (vacuum deposition) coating."
81
- )
82
-
83
-
84
- class GlassPanesMixin(BaseOpenEpdSchema):
85
- """Glass panes mixin."""
86
-
87
- glass_panes: PositiveInt | None = pyd.Field(
88
- default=None,
89
- description="Number of panes, each separated by a cavity. A 3 pane unit has 2 cavities. example: 3",
90
- example=3,
91
- )
92
-
93
-
94
- class DPRatingMixin(BaseOpenEpdSchema):
95
- """Differential pressure rating mixin."""
96
-
97
- dp_rating: PressureMPaStr | None = pyd.Field(
98
- default=None, description="Maximum Differential Pressure, a measure of wind tolerance.", example="75 psf"
99
- )
100
-
101
-
102
- class AirInfiltrationMixin(BaseOpenEpdSchema):
103
- """Air infiltration mixin."""
104
-
105
- air_infiltration: QuantityStr | None = pyd.Field(
106
- default=None,
107
- description="Air infiltration, measured at a certain level of Differential Pressure.",
108
- example="0.3 m3/(sec * m2)",
109
- )
110
-
111
-
112
- class AssemblyUFactorMixin(BaseOpenEpdSchema):
113
- """Assembly U factor mixin."""
114
-
115
- assembly_u_factor: HeatConductanceUCIStr | None = pyd.Field(
116
- default=None,
117
- description="Weighted average conductance of heat across assembly (including frame).",
118
- example="0.3 UCI",
119
- )
120
-
121
-
122
- class GlassIntendedApplicationMixin(BaseOpenEpdSchema):
123
- """Glass intended application mixin."""
124
-
125
- glazing_intended_application_curtain_wall: bool | None = pyd.Field(
126
- default=None, description="Intended for curtain walls. Relevant for IGUs."
127
- )
128
- glazing_intended_application_r_windows: bool | None = pyd.Field(
129
- default=None,
130
- description="Intended for residential (NAFS 'R') and similar windows, doors, or skylights. Relevant for IGUs.",
131
- )
132
- glazing_intended_application_lc_windows: bool | None = pyd.Field(
133
- default=None, description="Intended for light commercial (NAFS 'LC') and similar windows. Relevant for IGUs."
134
- )
135
- glazing_intended_application_cw_windows: bool | None = pyd.Field(
136
- default=None, description="Intended for commercial (NAFS 'CW') and similar windows. Relevant for IGUs."
137
- )
138
- glazing_intended_application_aw_windows: bool | None = pyd.Field(
139
- default=None, description="Intended for architectural (NAFS 'AW') and similar windows. Relevant for IGUs."
140
- )
141
- glazing_intended_application_storefronts: bool | None = pyd.Field(
142
- default=None, description="Intended for Storefronts and similar applications. Relevant for IGUs."
143
- )
144
- glazing_intended_application_glazed_doors: bool | None = pyd.Field(
145
- default=None, description="Intended for Glazed Doors and similar applications. Relevant for IGUs."
146
- )
147
- glazing_intended_application_unit_skylights: bool | None = pyd.Field(
148
- default=None, description="Intended for Unit Skylights and similar applications. Relevant for IGUs."
149
- )
150
- glazing_intended_application_sloped_skylights: bool | None = pyd.Field(
151
- default=None,
152
- description="Intended for sloped glazing, and architectural skylights, and similar. Relevant for IGUs.",
153
- )
154
- glazing_intended_application_other: bool | None = pyd.Field(
155
- default=None, description="Intended for other application not listed. Relevant for IGUs."
156
- )
157
-
158
-
159
- class ThermalSeparationEnum(StrEnum):
160
- """Thermal separation enum."""
161
-
162
- ALUMINIUM = "Aluminium"
163
- STEEL = "Steel"
164
- THERMALLY_IMPROVED_METAL = "Thermally Improved Metal"
165
- THERMALLY_BROKEN_METAL = "Thermally Broken Metal"
166
- NON_METAL = "Nonmetal"
167
-
168
-
169
- class ThermalSeparationMixin(BaseOpenEpdSchema):
170
- """Thermal separation mixin."""
171
-
172
- thermal_separation: ThermalSeparationEnum | None = pyd.Field(default=None, description="Thermal separation.")
173
-
174
-
175
- class HurricaneResistantMixin(BaseOpenEpdSchema):
176
- """Hurricane resistant mixin."""
177
-
178
- hurricane_resistant: bool | None = pyd.Field(
179
- default=None, description="The product has been designed to resist windborne debris."
180
- )
181
-
182
-
183
- class SpacerEnum(StrEnum):
184
- """Spacer enum."""
185
-
186
- ALUMINIUM = "Aluminium"
187
- STAINLESS_STEEL = "Stainless steel"
188
- PLASTIC_AND_STAINLESS_STEEL = "Plastic and stainless steel"
189
- THERMOPLASTIC = "Thermoplastic"
190
- FOAM = "Foam"
191
- STAINLESS_STEEL_AND_TIN = "Stainless steel or tin plate U-channel"
192
- PLASTIC = "Plastic"
193
-
194
-
195
- class FenestrationHardwareFunctionEnum(StrEnum):
196
- """Fenestration hardware function enum."""
197
-
198
- LOCK = "Lock"
199
- HINGE = "Hinge"
200
- HANDLE = "Handle"
201
- OPERATOR = "Operator"
202
- BALANCE = "Balance"
203
- OTHER = "Other"
204
-
205
-
206
- class FrameMaterialEnum(StrEnum):
207
- """Framing material enum."""
208
-
209
- VINYL = "Vinyl"
210
- ALUMINIUM = "Aluminium"
211
- STEEL = "Steel"
212
- WOOD = "Wood"
213
- FIBERGLASS = "Fiberglass"
214
- COMPOSITE = "Composite"
215
- NONE = "None"
216
- OTHER = "Other"
217
-
218
-
219
- class NAFSFenestrationV1(
220
- GlassPanesMixin,
221
- DPRatingMixin,
222
- AirInfiltrationMixin,
223
- SolarHeatGainMixin,
224
- AssemblyUFactorMixin,
225
- ThermalSeparationMixin,
226
- GlazingOptionsMixin,
227
- HurricaneResistantMixin,
228
- BaseOpenEpdHierarchicalSpec,
229
- ):
230
- """NAFS Fenestration V1 spec."""
231
-
232
- _EXT_VERSION = "1.0"
233
- nafs_performance_class_r: bool | None = pyd.Field(
234
- default=None, description="Residential; commonly used in one- and two-family dwellings."
235
- )
236
- nafs_performance_class_lc: bool | None = pyd.Field(
237
- default=None,
238
- description="Light Commercial: commonly used in low-rise and mid-rise multi-family dwellings and other "
239
- "buildings where larger sizes and higher loading requirements are expected.",
240
- )
241
- nafs_performance_class_cw: bool | None = pyd.Field(
242
- default=None,
243
- description="Commercial Window: commonly used in low-rise and mid-rise buildings where larger sizes, higher "
244
- "loading requirements, limits on deflection, and heavy use are expected.",
245
- )
246
- nafs_performance_class_aw: bool | None = pyd.Field(
247
- default=None,
248
- description="Architectural Window: commonly used in high-rise and mid-rise buildings to meet increased "
249
- "loading requirements and limits on deflection, and in buildings where frequent and extreme use "
250
- "of the fenestration products is expected.",
251
- )
252
-
253
- nafs_performance_grade: NAFSPerformanceGrade | None = pyd.Field(
254
- default=None,
255
- description="NAFS Performance Grade. The NAFS Performance Grade is a number that represents the performance "
256
- "of the glazing product. The higher the number, the better the performance. The NAFS Performance "
257
- "Grade is calculated using the NAFS Performance Class, the NAFS Performance Index, and the NAFS "
258
- "Performance Factor. While it is expressed as pressure, there are specific values which are "
259
- "allowed. The values are listed in the enum.",
260
- )
261
-
262
-
263
- class InsulatingGlazingUnitsV1(
264
- GlassPanesMixin,
265
- DPRatingMixin,
266
- AirInfiltrationMixin,
267
- SolarHeatGainMixin,
268
- GlazingOptionsMixin,
269
- HurricaneResistantMixin,
270
- GlassIntendedApplicationMixin,
271
- BaseOpenEpdHierarchicalSpec,
272
- ):
273
- """Insulating glazing units V1 spec."""
274
-
275
- _EXT_VERSION = "1.0"
276
-
277
- cog_u_factor: HeatConductanceUCIStr | None = pyd.Field(
278
- default=None, description="Conductance of heat at center of glass.", example="0.3 UCI"
279
- )
280
- spacer: SpacerEnum | None = pyd.Field(default=None, description="Spacer material for Integrated Glass Unit.")
281
-
282
-
283
- class FenestrationFramingV1(GlassIntendedApplicationMixin, BaseOpenEpdHierarchicalSpec):
284
- """Fenestration framing V1 spec."""
285
-
286
- _EXT_VERSION = "1.0"
287
-
288
- frame_material: FrameMaterialEnum | None = pyd.Field(default=None, description="Frame material.")
289
-
290
-
291
- class FenestrationHardwareV1(BaseOpenEpdHierarchicalSpec):
292
- """Fenestration hardware V1 spec."""
293
-
294
- _EXT_VERSION = "1.0"
295
-
296
- hardware_function: FenestrationHardwareFunctionEnum | None = pyd.Field(
297
- default=None, description="Hardware function."
298
- )
299
-
300
-
301
- class FenestrationPartsV1(GlassIntendedApplicationMixin, BaseOpenEpdHierarchicalSpec):
302
- """Fenestration parts V1 spec."""
303
-
304
- _EXT_VERSION = "1.0"
305
-
306
- FenestrationHardware: FenestrationHardwareV1 | None = pyd.Field(
307
- default=None, title="FenestrationHardwareV1", description="Fenestration hardware V1 spec."
308
- )
309
- FenestrationFraming: FenestrationFramingV1 | None = pyd.Field(
310
- default=None, title="FenestrationFramingV1", description="Fenestration framing V1 spec."
311
- )
312
-
313
-
314
- class ProcessedNonInsulatedGlassPanesV1(
315
- GlassPanesMixin, SolarHeatGainMixin, GlazingOptionsMixin, BaseOpenEpdHierarchicalSpec
316
- ):
317
- """Processed non-insulated glass panes V1 spec."""
318
-
319
- _EXT_VERSION = "1.0"
320
-
321
-
322
- class FlatGlassPanesV1(BaseOpenEpdHierarchicalSpec):
323
- """Flat glass panes."""
324
-
325
- _EXT_VERSION = "1.0"
326
- flat_glass_panes_thickness: LengthMmStr | None = pyd.Field(
327
- default=None, description="Thickness of the flat glass panes.", example="8 mm"
328
- )
329
-
330
-
331
- class GlassPanesV1(BaseOpenEpdHierarchicalSpec):
332
- """Glass panes V1 spec."""
333
-
334
- _EXT_VERSION = "1.0"
335
-
336
- ProcessedNonInsulatedGlassPanes: ProcessedNonInsulatedGlassPanesV1 | None = pyd.Field(
337
- default=None,
338
- title="ProcessedNonInsulatedGlassPanesV1",
339
- description="Processed non-insulated glass panes V1 spec.",
340
- )
341
- FlatGlassPanes: FlatGlassPanesV1 | None = pyd.Field(
342
- default=None, title="FlatGlassPanes", description="Flat glass panes spec."
343
- )
344
-
345
-
346
- class GlazingV1(BaseOpenEpdHierarchicalSpec):
347
- """Glazing V1 spec."""
348
-
349
- _EXT_VERSION = "1.0"
350
- thickness: str | None = pyd.Field(default=None, description="Thickness of the glazing.")
351
- GlassPanes: GlassPanesV1 | None = pyd.Field(default=None, title="GlassPanesV1", description="Glass panes V1 spec.")
352
- InsulatingGlazingUnits: InsulatingGlazingUnitsV1 | None = pyd.Field(
353
- default=None, title="InsulatingGlazingUnitsV1", description="Insulating glazing units V1 spec."
354
- )
355
- NAFSFenestration: NAFSFenestrationV1 | None = pyd.Field(
356
- default=None, title="NAFSFenestrationV1", description="NAFS Fenestration V1 spec."
357
- )
358
- FenestrationParts: FenestrationPartsV1 | None = pyd.Field(
359
- default=None, title="FenestrationPartsV1", description="Fenestration parts V1 spec."
360
- )