openepd 6.13.2__py3-none-any.whl → 7.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.
Files changed (99) hide show
  1. openepd/__init__.py +0 -6
  2. openepd/__version__.py +1 -1
  3. openepd/api/average_dataset/generic_estimate_sync_api.py +11 -10
  4. openepd/api/average_dataset/industry_epd_sync_api.py +9 -8
  5. openepd/api/base_sync_client.py +53 -9
  6. openepd/api/category/sync_api.py +1 -1
  7. openepd/api/dto/base.py +4 -4
  8. openepd/api/dto/common.py +24 -16
  9. openepd/api/dto/meta.py +15 -11
  10. openepd/api/dto/mf.py +9 -8
  11. openepd/api/epd/dto.py +43 -33
  12. openepd/api/epd/sync_api.py +9 -9
  13. openepd/api/pcr/sync_api.py +2 -2
  14. openepd/bundle/model.py +11 -10
  15. openepd/bundle/reader.py +12 -5
  16. openepd/bundle/writer.py +17 -6
  17. openepd/model/base.py +61 -44
  18. openepd/model/category.py +13 -10
  19. openepd/model/common.py +107 -59
  20. openepd/model/declaration.py +93 -64
  21. openepd/model/epd.py +51 -43
  22. openepd/model/generic_estimate.py +28 -13
  23. openepd/model/industry_epd.py +15 -9
  24. openepd/model/lcia.py +161 -136
  25. openepd/model/org.py +70 -37
  26. openepd/model/pcr.py +38 -32
  27. openepd/model/specs/asphalt.py +31 -22
  28. openepd/model/specs/base.py +14 -11
  29. openepd/model/specs/concrete.py +60 -39
  30. openepd/model/specs/range/aggregates.py +9 -9
  31. openepd/model/specs/range/aluminium.py +7 -7
  32. openepd/model/specs/range/asphalt.py +22 -19
  33. openepd/model/specs/range/cladding.py +16 -16
  34. openepd/model/specs/range/cmu.py +10 -9
  35. openepd/model/specs/range/concrete.py +36 -27
  36. openepd/model/specs/range/conveying_equipment.py +16 -15
  37. openepd/model/specs/range/electrical.py +24 -22
  38. openepd/model/specs/range/finishes.py +109 -104
  39. openepd/model/specs/range/fire_and_smoke_protection.py +7 -7
  40. openepd/model/specs/range/furnishings.py +16 -12
  41. openepd/model/specs/range/manufacturing_inputs.py +16 -16
  42. openepd/model/specs/range/masonry.py +16 -16
  43. openepd/model/specs/range/mechanical.py +47 -47
  44. openepd/model/specs/range/mechanical_insulation.py +7 -7
  45. openepd/model/specs/range/network_infrastructure.py +54 -46
  46. openepd/model/specs/range/openings.py +36 -31
  47. openepd/model/specs/range/plumbing.py +15 -13
  48. openepd/model/specs/range/precast_concrete.py +20 -16
  49. openepd/model/specs/range/sheathing.py +18 -18
  50. openepd/model/specs/range/steel.py +27 -25
  51. openepd/model/specs/range/thermal_moisture_protection.py +20 -20
  52. openepd/model/specs/range/utility_piping.py +9 -9
  53. openepd/model/specs/range/wood.py +19 -19
  54. openepd/model/specs/range/wood_joists.py +8 -8
  55. openepd/model/specs/singular/__init__.py +9 -5
  56. openepd/model/specs/singular/aggregates.py +22 -15
  57. openepd/model/specs/singular/aluminium.py +20 -5
  58. openepd/model/specs/singular/asphalt.py +44 -20
  59. openepd/model/specs/singular/cladding.py +38 -23
  60. openepd/model/specs/singular/cmu.py +26 -11
  61. openepd/model/specs/singular/common.py +3 -2
  62. openepd/model/specs/singular/concrete.py +85 -48
  63. openepd/model/specs/singular/conveying_equipment.py +30 -17
  64. openepd/model/specs/singular/deprecated/__init__.py +3 -2
  65. openepd/model/specs/singular/deprecated/concrete.py +68 -33
  66. openepd/model/specs/singular/deprecated/steel.py +28 -15
  67. openepd/model/specs/singular/electrical.py +69 -41
  68. openepd/model/specs/singular/finishes.py +250 -140
  69. openepd/model/specs/singular/fire_and_smoke_protection.py +9 -6
  70. openepd/model/specs/singular/furnishings.py +16 -14
  71. openepd/model/specs/singular/manufacturing_inputs.py +23 -14
  72. openepd/model/specs/singular/masonry.py +66 -21
  73. openepd/model/specs/singular/mechanical.py +48 -47
  74. openepd/model/specs/singular/mechanical_insulation.py +7 -6
  75. openepd/model/specs/singular/mixins/conduit_mixin.py +13 -10
  76. openepd/model/specs/singular/network_infrastructure.py +111 -52
  77. openepd/model/specs/singular/openings.py +127 -95
  78. openepd/model/specs/singular/plumbing.py +15 -12
  79. openepd/model/specs/singular/precast_concrete.py +68 -54
  80. openepd/model/specs/singular/sheathing.py +47 -27
  81. openepd/model/specs/singular/steel.py +69 -45
  82. openepd/model/specs/singular/thermal_moisture_protection.py +36 -20
  83. openepd/model/specs/singular/utility_piping.py +11 -8
  84. openepd/model/specs/singular/wood.py +48 -24
  85. openepd/model/specs/singular/wood_joists.py +19 -6
  86. openepd/model/standard.py +15 -8
  87. openepd/model/validation/common.py +9 -3
  88. openepd/model/validation/numbers.py +0 -13
  89. openepd/model/validation/quantity.py +88 -55
  90. openepd/model/versioning.py +9 -6
  91. {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/METADATA +2 -2
  92. openepd-7.0.1.dist-info/RECORD +141 -0
  93. openepd/compat/__init__.py +0 -15
  94. openepd/compat/compat_functional_validators.py +0 -25
  95. openepd/compat/pydantic.py +0 -30
  96. openepd/patch_pydantic.py +0 -108
  97. openepd-6.13.2.dist-info/RECORD +0 -145
  98. {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/LICENSE +0 -0
  99. {openepd-6.13.2.dist-info → openepd-7.0.1.dist-info}/WHEEL +0 -0
openepd/patch_pydantic.py DELETED
@@ -1,108 +0,0 @@
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 Any
17
-
18
- from pydantic import utils as pydantic_utils
19
-
20
- from openepd.compat.pydantic import pyd
21
-
22
-
23
- def patch_pydantic_metaclass():
24
- """
25
- Patch pydantic's ModelMetaclass to restore class attribute lookup for fields.
26
-
27
- In pydantic, while the model fields are defined in the model as class-level attributes, in runtime they disappear
28
- due to ModelMetaclass logic. ModelMetaclass takes the defined attributes, removes them from class dict and puts
29
- into a special __fields__ attribute to avoid naming conflict.
30
-
31
- We would like to be able to access the attributes via dot notation in the runtimes, since it makes refactoring
32
- easier.
33
-
34
- This class exposes the original fields when accessed via class name. For example, one can call `Pcr.name` and get
35
- `ModelField`, in addition to calling `pcr.__fields__` on an instance.
36
- """
37
-
38
- def model_metaclass__getattr__(cls, name: str) -> Any:
39
- if name in cls.__fields__:
40
- return cls.__fields__[name]
41
- return getattr(super, name)
42
-
43
- pyd.main.ModelMetaclass.__getattr__ = model_metaclass__getattr__
44
-
45
-
46
- def patch_pydantic_metaclass_validator():
47
- """
48
- Patch the internal validator function used during model construction to support modified metaclass.
49
-
50
- Pydantic has a special guard which stops execution if a model defines field which shadows a basemodel interface.
51
- For example, if someone would define a field named `__fields__` this would break code.
52
-
53
- With the modified metaclass functionality, we are exposing the original fields as class attributes, and this
54
- breaks this check.
55
-
56
- This patcher method modifies the pydantic internals so that the check is retained, but it is not causing exception
57
- when doing the normal field inheritance.
58
- """
59
- model_field_classes = list()
60
-
61
- try:
62
- from pydantic.v1.fields import ModelField as ModelFieldV1
63
-
64
- model_field_classes.append(ModelFieldV1)
65
- except ImportError:
66
- pass
67
-
68
- try:
69
- from pydantic.fields import ModelField as ModelFieldPydanticV1
70
-
71
- model_field_classes.append(ModelFieldPydanticV1)
72
- except ImportError:
73
- pass
74
-
75
- try:
76
- from pydantic_core.core_schema import ModelField as ModelFieldV2
77
-
78
- model_field_classes.append(ModelFieldV2)
79
- except ImportError:
80
- pass
81
- model_field_classes_tuple = tuple(model_field_classes)
82
-
83
- def pydantic_utils__validate_field_name(bases: list[type[pyd.BaseModel]], field_name: str) -> None:
84
- for base in bases:
85
- if attr := getattr(base, field_name, None):
86
- if isinstance(attr, model_field_classes_tuple):
87
- continue
88
-
89
- raise NameError(
90
- f'Field name "{field_name}" shadows a BaseModel attribute; '
91
- f"use a different field name with \"alias='{field_name}'\"."
92
- )
93
-
94
- pyd.main.validate_field_name = pydantic_utils__validate_field_name
95
- pydantic_utils.validate_field_name = pydantic_utils__validate_field_name
96
-
97
-
98
- def patch_pydantic():
99
- """
100
- Modify Pydantic to support field attribute access via class.
101
-
102
- Example: Field the_field in the model TheModel(BaseModel). Before this patch, one can do
103
- `TheModel().__fields__["the_field"]' to get field descriptor. After the fix, one can do TheModel.the_field.
104
-
105
- To disable, set env variable `OPENEPD_DISABLE_PYDANTIC_PATCH` to "1", "yes" or "true".
106
- """
107
- patch_pydantic_metaclass()
108
- patch_pydantic_metaclass_validator()
@@ -1,145 +0,0 @@
1
- openepd/__init__.py,sha256=fhxfEyEurLvSfvQci-vb3njzl_lvhcLXiZrecCOaMU8,794
2
- openepd/__version__.py,sha256=qONobSZDRb30xeK087DIv0mIqy0n-JQXVGDOZraUG1I,639
3
- openepd/api/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
4
- openepd/api/average_dataset/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
5
- openepd/api/average_dataset/generic_estimate_sync_api.py,sha256=KHCmSKMOJTQct6vhdhAatAENoouStc_yVRza5AFNoIo,7953
6
- openepd/api/average_dataset/industry_epd_sync_api.py,sha256=CG5c6FQD3I8sl9PKI9VHFUaJlFrnF8E14i4k6Uv0B74,6286
7
- openepd/api/base_sync_client.py,sha256=E6yrqME-c1emV1BrI33dwjdu6wcFoRkqWtg1zFyki2Y,20992
8
- openepd/api/category/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
9
- openepd/api/category/dto.py,sha256=-nsSNH1zWIluFuF50qmnIcvloX08Jk_KV5mebJqzLe4,850
10
- openepd/api/category/sync_api.py,sha256=XlT5a_IkfaVARrZY0hjDUzDVP2ThkR2j_MRNqz6zkTE,1371
11
- openepd/api/common.py,sha256=bLSER3RQQFR4lyEuxQPKNjTaa3S0K8fFi8x4QRAPM_g,8812
12
- openepd/api/dto/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
13
- openepd/api/dto/base.py,sha256=w-Ci0MN2vTIQ0Vl0YKLUXVG_fC0OxiwojT9SX3lWktg,1033
14
- openepd/api/dto/common.py,sha256=3d-frR8kqVw0TFwFE7u7ovxKQM0ZAzNcwaLiGgSO-zE,4488
15
- openepd/api/dto/meta.py,sha256=IrGJtfl6-mBXLSWZjcyr08WvvOh9VL0LJnx5ubhJqco,2160
16
- openepd/api/dto/mf.py,sha256=59YvIrH5teHlpxINihxryFyCjs7jBZZuqYIO1K-daA8,1994
17
- openepd/api/dto/params.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
18
- openepd/api/epd/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
19
- openepd/api/epd/dto.py,sha256=MqhHjaNdtOc-KT2zNI88EB9-1d2a6CS2zzSus8HefBo,4874
20
- openepd/api/epd/sync_api.py,sha256=coM-4VDn_sn3DeBbA4YnStsMBqX7zQZSmUnUXHi0gM8,7320
21
- openepd/api/errors.py,sha256=BgZeNfMNAKVPfhpuiVapCXNBSsXygAOWql-gy7m9j7E,2868
22
- 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/test/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
26
- openepd/api/utils.py,sha256=xOU8ihC0eghsoaCFhC85PU4WYRwNxVEpfK3gzq4e9ik,2092
27
- openepd/bundle/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
28
- openepd/bundle/base.py,sha256=Ou2zlAV7VRKp7Lxu8h4k56OLEMwn5F1nrEEF_ies_lE,6869
29
- openepd/bundle/model.py,sha256=_fQWW1KsxKquFFB6JtU3dyc82re1vqmwMpxe6zUEfSE,2605
30
- openepd/bundle/reader.py,sha256=sXhqwxXFN2GdNS0cQHdaxKEtNM4jzhcML1yN4XAIRzE,6687
31
- openepd/bundle/writer.py,sha256=gHK1D-F-td2C18QFWerg666JUTLaGUkTUSQURJi9o74,8136
32
- openepd/compat/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
33
- openepd/compat/compat_functional_validators.py,sha256=aWg3a80fqT8zjN0S260N-Ad2WFKAaB8ByN7ArBW3NMA,834
34
- openepd/compat/pydantic.py,sha256=dNwPXK1X5xq9sdkd0kcbKQAUIter1GAfcxXOl6hmITQ,1146
35
- openepd/m49/__init__.py,sha256=vkXC6i8OeCl5K88JUIRN_NKfsAIpNIaN-fyPmmd-Lfk,689
36
- openepd/m49/const.py,sha256=buspTHOOWhkBXWUIS0oqvQ0y1L7y70Y_PXilkiBIKD4,31819
37
- openepd/m49/utils.py,sha256=Qm8HvxAZlQncsyUYDO0lG0feMFFnT4HQPNSMp78W4zU,7111
38
- openepd/model/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
39
- openepd/model/base.py,sha256=1GeaEDn-ppy94GaOaZI1y6Yew_0eBBho1COaxfzzLCw,9834
40
- openepd/model/category.py,sha256=reeOVRDuZPYU77EMwG0K5VjnK2H9yOGxT0PJXXqrjEk,1639
41
- openepd/model/common.py,sha256=2MYjaXXq3_ECjTD7lI4SSZm3wguLrPraaObUpqF0t5g,13062
42
- openepd/model/declaration.py,sha256=56cjshR21PxTVCM5xOq_JH7Rw4gw1q_9jdroHaDDOiI,13832
43
- openepd/model/epd.py,sha256=qYYJQKbcFNOU_qS5Ag9CXn7Tx0TkIoUOZQEDGJI-xZw,12290
44
- openepd/model/factory.py,sha256=doexyqZXJVGd45T1JsbjuyGUjEykW-MerKUq4SQHhRY,2656
45
- openepd/model/generic_estimate.py,sha256=zLGTyf4Uzmp2C0m-J1ePWItSz2RGdZ0OiGPWC5nhKHk,3992
46
- openepd/model/geography.py,sha256=Jx7NIDdk_sIvwyh-7YxnIjAwIHW2HCQK7UtFGM2xKtw,42095
47
- openepd/model/industry_epd.py,sha256=QZr7OhgGkzqZ8H5p6dCIVk9zSHEYtK3y9Nk-DvkFMyk,4011
48
- openepd/model/lcia.py,sha256=gS4WFcw7v8PKKDCBUQXQP5I8Jh_TdyZyIklAjUc5HL4,25507
49
- openepd/model/org.py,sha256=MtaUrD8IdSbcMJEwL2lnXOIXNfE8wpzrepFSe2qh2uc,5342
50
- openepd/model/pcr.py,sha256=b8WmeII8MZ3rJFWxugqv_Z0ETan8NMWj9L6mSrhneJk,5494
51
- openepd/model/specs/README.md,sha256=UGhSiFJ9hOxT1mZl-5ZrhkOrPKf1W_gcu5CI9hzV7LU,2430
52
- openepd/model/specs/__init__.py,sha256=YcAvn0h_Bhz_Cb4-uEl8DiBI82nXogQsocB-c2zvr_A,3094
53
- openepd/model/specs/asphalt.py,sha256=bfNnTAIT6BN2trWOAoYOjDgfbhvIbBw4hfFaTn9Ecpk,3420
54
- openepd/model/specs/base.py,sha256=cJTv4kO3QyS0vqfytTlKrOBu-2sBwx7NM0_YZS4i3rY,2652
55
- openepd/model/specs/concrete.py,sha256=D9jbhZDtTXNBoAgljQBPxsmGsMvLSIAP5H53ZYiXcGI,5336
56
- openepd/model/specs/enums.py,sha256=_WMe0l8ZKPIGQG53A1rB_Sv_p2izr8Zemg9AEEYOU2g,63638
57
- openepd/model/specs/range/__init__.py,sha256=ZXgsyzn_c6H2SPCo5hTVZOjRqlCf0HvVVMDQ4RGaPSU,4502
58
- openepd/model/specs/range/accessories.py,sha256=wnOv1V_uatA6g_9QVfZaSp-rNLbyZ_KS-t3wlHaeEsI,2498
59
- openepd/model/specs/range/aggregates.py,sha256=udVbsYc1Lyrd6a4YZBGNDQ3sBi-L3WLub_e1ecq7U-Q,2549
60
- openepd/model/specs/range/aluminium.py,sha256=m2u43hHAcPmvm9dkhcqMojTRuJmX4gofW_uU5AZzqG8,2745
61
- openepd/model/specs/range/asphalt.py,sha256=DN3--5g0WL2AQ8Vc23M899rPqxCaFgEhaYqV8vWRbZY,2934
62
- openepd/model/specs/range/bulk_materials.py,sha256=SuKhmJXMa9jl0CrkYr3QVvPX_GDbr7KATzrSS-fJEU4,1051
63
- openepd/model/specs/range/cast_decks_and_underlayment.py,sha256=37fx7jDRy6xryZTVweW_vu78h0kRs5vQurGS-Ypayog,1132
64
- openepd/model/specs/range/cladding.py,sha256=3rMnT-km0tZ9b_Wb-i8vMxO-Uw94SPJqCYzMLDD4BOQ,7236
65
- openepd/model/specs/range/cmu.py,sha256=4bf9z1ps_WTYfhdtG_duqEwTahIBrykm6v7c-uyeyWY,1862
66
- openepd/model/specs/range/concrete.py,sha256=lmLEhll8xgkMu__BRbQRACvZ5u3R9ui2oVhE9qR0RMs,6907
67
- openepd/model/specs/range/conveying_equipment.py,sha256=Ly5i8yUwn-2Xjh8-mA1-rwel0eRQZ028zrEApO2XhxQ,3176
68
- openepd/model/specs/range/electrical.py,sha256=TkmXFiGbyX5rtNqVYftr37wuhwyx-3T71IfXlUufkkU,11860
69
- openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py,sha256=rbdmHvz9nRMgcWrCGVnN0xXSl5ZezuwArOZ_4xCQIgM,2525
70
- openepd/model/specs/range/electricity.py,sha256=yn_S25C_tZqseb8hiJ1yiHszu2mQ49FOFWWCqNpOBY0,997
71
- openepd/model/specs/range/finishes.py,sha256=oCaPVYJja1KYxwEzTHCl7HtxQ2mokzeyahjyP33zHSg,21291
72
- openepd/model/specs/range/fire_and_smoke_protection.py,sha256=u5veICQznf-woYlh49S_IbvPA23CLWEy7Ngvic2FIpw,3337
73
- openepd/model/specs/range/furnishings.py,sha256=7r9albaHmuf0ttqkSQ6elJcSzgFgOHSrwAfhEpJMm5k,6531
74
- openepd/model/specs/range/grouting.py,sha256=BQPxH6BvlXpdhLEZBui9zTuY93K_9syjoa6rdnF8GGY,1095
75
- openepd/model/specs/range/manufacturing_inputs.py,sha256=xzgkNz7yG8cp715hxS0LtJX9nfJ5RQR8GxlD2bAduwE,5574
76
- openepd/model/specs/range/masonry.py,sha256=IyjQMb8Mx3tpJlHIIam0OrMkFsJXKvc0WXRLRBupozY,2867
77
- openepd/model/specs/range/material_handling.py,sha256=9jxRHpjMKu71B5omH55UjkNVJvaTLgTMtEidSKPFn5c,1483
78
- openepd/model/specs/range/mechanical.py,sha256=vAUXSYJXBIhDNuVJHOGeP--Pvt0YObJLdedmkXF6_9c,10267
79
- openepd/model/specs/range/mechanical_insulation.py,sha256=S2-NkFVkjLmn_dk3gsG8C2YcV0SFXbOCgY6LKberqh8,1737
80
- openepd/model/specs/range/network_infrastructure.py,sha256=8bJGGEME7TELLxKAfKCCkZfA-K27Mp7tkC71W6YOxEc,8498
81
- openepd/model/specs/range/openings.py,sha256=tgy7XbiwPleqrsSVrKBadvmnXSyV3bnOVf84K8vwEMQ,15451
82
- openepd/model/specs/range/other_electrical_equipment.py,sha256=H4tZHcHyR2uUYHn-bQfLC6hR4tynVp_7EJbiI-YpK7Y,1001
83
- openepd/model/specs/range/other_materials.py,sha256=k7Gv6YvWy43B-QFBabBt-TkvkC450Pz2a2pz9t6r4OU,4495
84
- openepd/model/specs/range/plumbing.py,sha256=RYfP6ail7cYrwBluxmbAkC9icbxXaxdrdnf4Vqhy9ho,5342
85
- openepd/model/specs/range/precast_concrete.py,sha256=hXnljuc6djoScmx50ZWkmVjnihCTjiZV755aaKCs6uA,3763
86
- openepd/model/specs/range/sheathing.py,sha256=tATL6dzKTdN0rUKZRzZd779dLhKdEavL5Bjybnt2MjU,3395
87
- openepd/model/specs/range/steel.py,sha256=tPRtWSqhVjmbbWVFoFpS7rQKDsaYn9D_6afBOYhqPug,10417
88
- openepd/model/specs/range/thermal_moisture_protection.py,sha256=WOyUzR_t39mpekg1vOrU9e529DyR1EPM0h3QAP46kdc,9409
89
- openepd/model/specs/range/utility_piping.py,sha256=mQTrKbMTES_0Yta9DBnKehsmA2BAN_zYF_uPZCTKLPo,2665
90
- openepd/model/specs/range/wood.py,sha256=1ZAkUwcFF9etc7CZ1_BSvjchpnqnngfZihYZMtuLdeM,6946
91
- openepd/model/specs/range/wood_joists.py,sha256=NCBHL0gdKwdKlGCP6up_Royl9BtWUUeuFfS1r2vIZ30,1785
92
- openepd/model/specs/singular/__init__.py,sha256=igkfspzFQzoIFPU6Gd6RbxkyLr2RFPGn7brKUo_jN5s,6910
93
- openepd/model/specs/singular/accessories.py,sha256=xcuSJrG84oTm_w76_wlv_sItfK36gSyDmUD2TnpZnVE,2013
94
- openepd/model/specs/singular/aggregates.py,sha256=oSfArxvLUj63w_U0tZViRyiOpMRRjE72ncy2BimKxco,2934
95
- openepd/model/specs/singular/aluminium.py,sha256=pkcjMf_gBTler1nzbb7_XEKCpUD1hyM-tly3Twfr_lo,2403
96
- openepd/model/specs/singular/asphalt.py,sha256=JDviENdY_2tcj5SrzgJnYJHuxTIOhLCWcXhmoSiELKk,3295
97
- openepd/model/specs/singular/bulk_materials.py,sha256=LKTmh432ak51L0GsVf-40389Lwx-sxZm_jSfzWNfagE,875
98
- openepd/model/specs/singular/cast_decks_and_underlayment.py,sha256=HjIEKekxCAKx51XEvH1tthUP6gNTbntDoi8gSu8LjZk,955
99
- openepd/model/specs/singular/cladding.py,sha256=ywT6E8iv55khqbrkMRFOkm_PAWht3qt4ybNDNRa1wyw,6588
100
- openepd/model/specs/singular/cmu.py,sha256=yexfb3REDGvVG3yD_1Yg1Zt-atBWLa8tv2lPmBPDWfw,1952
101
- openepd/model/specs/singular/common.py,sha256=rPJTp2XuSa_dOXj6ZikzMv-lLbEwPLaP-XsXkjDB4uI,1048
102
- openepd/model/specs/singular/concrete.py,sha256=G3PRrqNdlAougtuvvmjp1Fp-qFOvUTVbpW2UFfMQ-ts,7718
103
- openepd/model/specs/singular/conveying_equipment.py,sha256=AK_KdGyBDh0_Dl3YCkIyfHEfpiJmntdH-e9rFaIZv2s,3042
104
- openepd/model/specs/singular/deprecated/__init__.py,sha256=f8I04fHO5QWpNtorrCgbUXz4r0B0zgsk8zDUfXu_i80,2635
105
- openepd/model/specs/singular/deprecated/concrete.py,sha256=swSOfViIvy7z923C6uHBcIZrv_JRMv7wSJHpg9PGAJg,5265
106
- openepd/model/specs/singular/deprecated/steel.py,sha256=0A3Y50XpLsPt105t_H8BzByaDUbLoX1o_QIr566JfB4,3499
107
- openepd/model/specs/singular/electrical.py,sha256=BiaPpZBGBzUt5wVacd1tOIZ9dRn9ZAKFg582UfNnmyI,11113
108
- openepd/model/specs/singular/electrical_transmission_and_distribution_equipment.py,sha256=oZYyHgnXn9RH3YzltUEDiiQKrin2mvMlTgC3OhxV7DY,1978
109
- openepd/model/specs/singular/electricity.py,sha256=f1cJ9eklNUf97khCIZiT5-z8V_TbOcvH2me_1UTQVrE,823
110
- openepd/model/specs/singular/finishes.py,sha256=bAlNZiUP-HwePaJyC1D4j2fpv0xnMp3V5mhtAs9iaxQ,22571
111
- openepd/model/specs/singular/fire_and_smoke_protection.py,sha256=1uyEGdMAsboYORHvSFN1wftRVAps_UJ1Ep3Dk9arT3s,3058
112
- openepd/model/specs/singular/furnishings.py,sha256=6V6Dc4xph8PcIQhuuLFyFGL4w2Yh_ByEKCNvQfUkxZQ,5603
113
- openepd/model/specs/singular/grouting.py,sha256=pg2tX3W7a2TQ3z_eyFYGlBJY3WEwn6JlZyqM3PQIJcU,934
114
- openepd/model/specs/singular/manufacturing_inputs.py,sha256=9WSDOVN0mUqvFXqWf82lkpHi-XRQSMcEpe9bweegwhU,5093
115
- openepd/model/specs/singular/masonry.py,sha256=f6nph-gscAmVeJ60bG-ebto5kz0fgh0LY27n0VutGFA,3165
116
- openepd/model/specs/singular/material_handling.py,sha256=iEeUx1hNKla669y0zl-QAJn6xA7ceq75aRG8qT0p56Q,1274
117
- openepd/model/specs/singular/mechanical.py,sha256=VvW9PQ3VI8GCaqu5MKUmxjmcaHkKDAHAIhLyK-DVlUw,9862
118
- openepd/model/specs/singular/mechanical_insulation.py,sha256=h-Ir-jiLF-cpiHap4wx5G4fpvsRRKzqcGVXb5U5aqvQ,1607
119
- openepd/model/specs/singular/mixins/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
120
- openepd/model/specs/singular/mixins/conduit_mixin.py,sha256=tj6p-MF84rg4LGxXPC65uMvmn6NlxmATuloe4TcuQdk,1928
121
- openepd/model/specs/singular/network_infrastructure.py,sha256=eB3p1zu1u15Ly5iuyyJ4xl3Z1GuBCRVU18Wpz8FWZrg,8521
122
- openepd/model/specs/singular/openings.py,sha256=UbdojHW3yxV9DdWECgyANKicdH5czz6pyFPKpzzLxmw,18941
123
- openepd/model/specs/singular/other_electrical_equipment.py,sha256=FX7p4rMuUbTrz1yDwKkS-Z6odohoq-zCw6SU3Kw5ISs,814
124
- openepd/model/specs/singular/other_materials.py,sha256=_00_fCPn7G_-HVKC1cQcNvBDf4CtXFLOGvYLDJtL5ZA,3498
125
- openepd/model/specs/singular/plumbing.py,sha256=fHmKyy1aQxu8NZ3RTwxuA0CCERMgwVUdMA74kMDVc8o,4568
126
- openepd/model/specs/singular/precast_concrete.py,sha256=W2tKf0vOnAdfeGc1n7Pk8yx9jy44afdFB0cbwHjw1HI,7327
127
- openepd/model/specs/singular/sheathing.py,sha256=dfBSGElsJ-suj3WH7CZx5k3_v5E5IHVDOscwRI5yghE,3709
128
- openepd/model/specs/singular/steel.py,sha256=bPK2BUS_DfM7ulgvG-IZtB9yZETZV9HiUF-9TzodTYI,10529
129
- openepd/model/specs/singular/thermal_moisture_protection.py,sha256=7fikgfPyopWruPzhWdyU-YWvlo5facOjXbviyl_qOEw,8195
130
- openepd/model/specs/singular/utility_piping.py,sha256=KunlvMGqH_Z62TecGnT_4HhsTase01aJJIGIsyY5mGY,2483
131
- openepd/model/specs/singular/wood.py,sha256=6bGl5TgJgAZxosh_46YcZDm57DOyFyLZ9g2W-oDlhl8,6591
132
- openepd/model/specs/singular/wood_joists.py,sha256=WL_l48aTuazQkWwdz5EQcGrbK5biWhqHqhWdHXITPIo,1719
133
- openepd/model/standard.py,sha256=LFqZKK8nYJHKvcW0BaLoFm0-TVYpQr2l9l70vHLRiNk,1688
134
- openepd/model/validation/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
135
- openepd/model/validation/common.py,sha256=3HYzftDMYvaX_gpl337g8AdsohMkaOoOR6pmE22Mm5c,2435
136
- openepd/model/validation/enum.py,sha256=ttODVtMEQaBemMFywGUNlXU4bAM25FiBlVDKZbOv2iY,1793
137
- openepd/model/validation/numbers.py,sha256=r15pLe8oWY1tshazQvis_suVXpC6PUcPzKTvj3QTL9Q,851
138
- openepd/model/validation/quantity.py,sha256=vfSe-3DGQf84bCp_sMIU0ZPAA1wIilodpTjLSMoz5Jk,20194
139
- openepd/model/versioning.py,sha256=cm3LaAUODnbbu3W3pC6baJzxKusTQ1kZH-PwwScCj3c,4473
140
- openepd/patch_pydantic.py,sha256=LVqDMKn723VYYf_V-RgTLxIb1xiUtYOfPYCQP6-7RoM,4122
141
- openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
- openepd-6.13.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
143
- openepd-6.13.2.dist-info/METADATA,sha256=mJIwK2tPktGs8i7uVmk6xqRuMpSg3AWA5H3RELYtypo,9039
144
- openepd-6.13.2.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
145
- openepd-6.13.2.dist-info/RECORD,,