openepd 4.0.0__py3-none-any.whl → 4.2.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.0.0"
16
+ VERSION = "4.2.0"
openepd/model/base.py CHANGED
@@ -56,7 +56,28 @@ def modify_pydantic_schema(schema_dict: dict, cls: type) -> dict:
56
56
  return schema_dict
57
57
 
58
58
 
59
- class BaseOpenEpdSchema(pyd.BaseModel):
59
+ class PydanticClassAttributeExposeModelMetaclass(pyd.main.ModelMetaclass):
60
+ """
61
+ Extension of the pydantic's ModelMetaclass which restores class attribute lookup for fields.
62
+
63
+ In pydantic, while the model fields are defined in the model as class-level attributes, in runtime they disappear
64
+ due to ModelMetaclass logic. ModelMetaclass takes the defined attributes, removes them from class dict and puts
65
+ into a special __fields__ attribute to avoid naming conflict.
66
+
67
+ We would like to be able to access the attributes via dot notation in the runtimes, since it makes refactoring
68
+ easier.
69
+
70
+ This class exposes the original fields when accessed via class name. For example, one can call `Pcr.name` and get
71
+ `ModelField`, in addition to calling `pcr.__fields__` on an instance.
72
+ """
73
+
74
+ def __getattr__(cls, name: str) -> Any:
75
+ if name in cls.__fields__:
76
+ return cls.__fields__[name]
77
+ return getattr(super, name)
78
+
79
+
80
+ class BaseOpenEpdSchema(pyd.BaseModel, metaclass=PydanticClassAttributeExposeModelMetaclass):
60
81
  """Base class for all OpenEPD models."""
61
82
 
62
83
  ext: dict[str, AnySerializable] | None = pyd.Field(alias="ext", default=None)
@@ -13,6 +13,7 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
+ from openepd.compat.pydantic import pyd
16
17
  from openepd.model.base import BaseOpenEpdSchema
17
18
  from openepd.model.org import OrgRef
18
19
 
@@ -20,4 +21,6 @@ from openepd.model.org import OrgRef
20
21
  class HasForestPracticesCertifiers(BaseOpenEpdSchema):
21
22
  """An interface for models which are linked to forest practices certifiers."""
22
23
 
23
- forest_practices_certifiers: list[OrgRef] | None
24
+ forest_practices_certifiers: list[OrgRef] | None = pyd.Field(
25
+ default=None, description="List of organizations that certify forest practices."
26
+ )
@@ -2422,3 +2422,13 @@ class NAFSPerformanceGrade(StrEnum):
2422
2422
  GRADE_200_PSF = "200 psf"
2423
2423
  GRADE_205_PSF = "205 psf"
2424
2424
  GRADE_210_PSF = "210 psf"
2425
+
2426
+
2427
+ class PlasterComposition(StrEnum):
2428
+ """Plaster Composition."""
2429
+
2430
+ CEMENT = "Cement"
2431
+ GYPSUM = "Gypsum"
2432
+ ACRYLIC = "Acrylic"
2433
+ LIME = "Lime"
2434
+ OTHER = "Other"
@@ -14,7 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
- from openepd.model.org import OrgRef
18
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
18
  from openepd.model.specs.generated.common import HasForestPracticesCertifiers
20
19
  from openepd.model.specs.generated.enums import (
@@ -34,6 +33,7 @@ from openepd.model.specs.generated.enums import (
34
33
  GypsumFacing,
35
34
  GypsumFireRating,
36
35
  GypsumThickness,
36
+ PlasterComposition,
37
37
  ResilientFlooringFormFactor,
38
38
  ResilientFlooringMaterial,
39
39
  ResilientFlooringThickness,
@@ -45,6 +45,7 @@ from openepd.model.specs.generated.enums import (
45
45
  )
46
46
  from openepd.model.validation.numbers import RatioFloat
47
47
  from openepd.model.validation.quantity import (
48
+ AreaPerVolumeStr,
48
49
  GwpKgCo2eStr,
49
50
  LengthMmStr,
50
51
  LengthMStr,
@@ -177,7 +178,6 @@ class WoodFlooringV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
177
178
  thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
178
179
  timber_species: WoodFlooringTimberSpecies | None = pyd.Field(default=None, description="", example="Oak")
179
180
  fabrication: WoodFlooringFabrication | None = pyd.Field(default=None, description="", example="Solid hardwood")
180
- forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
181
181
 
182
182
 
183
183
  class AcousticalCeilingsV1(BaseOpenEpdHierarchicalSpec):
@@ -423,7 +423,6 @@ class DeckingBoardsV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers)
423
423
  # Own fields:
424
424
  timber_species: SawnTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
425
425
  fabrication: AllFabrication | None = pyd.Field(default=None, description="", example="LVL")
426
- forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
427
426
  weather_exposed: bool | None = pyd.Field(default=None, description="", example=True)
428
427
  fire_retardant: bool | None = pyd.Field(default=None, description="", example=True)
429
428
  decay_resistant: bool | None = pyd.Field(default=None, description="", example=True)
@@ -484,10 +483,30 @@ class WallFinishesV1(BaseOpenEpdHierarchicalSpec):
484
483
  thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
485
484
 
486
485
 
486
+ class PlasterV1(BaseOpenEpdHierarchicalSpec):
487
+ """
488
+ Plaster, Stucco, & Render.
489
+
490
+ Used for the protective or decorative coating of walls and ceilings and for
491
+ moulding and casting decorative elements. These are typically gypsum-, lime-,
492
+ or cement-based. Products in this category refer to dry mix.
493
+ """
494
+
495
+ _EXT_VERSION = "1.0"
496
+
497
+ # Own fields:
498
+ composition: PlasterComposition | None = pyd.Field(default=None, description="", example="Cement")
499
+ application_rate: AreaPerVolumeStr | None = pyd.Field(
500
+ default=None,
501
+ description="Typical or reference amount of material covering a unit of a host surface.",
502
+ example="10 m2/l",
503
+ )
504
+
505
+
487
506
  class FinishesV1(BaseOpenEpdHierarchicalSpec):
488
507
  """General category - finishes for interior ceilings, floors, walls."""
489
508
 
490
- _EXT_VERSION = "1.0"
509
+ _EXT_VERSION = "1.1"
491
510
 
492
511
  # Nested specs:
493
512
  Flooring: FlooringV1 | None = None
@@ -501,3 +520,4 @@ class FinishesV1(BaseOpenEpdHierarchicalSpec):
501
520
  Mirrors: MirrorsV1 | None = None
502
521
  PaintingAndCoating: PaintingAndCoatingV1 | None = None
503
522
  WallFinishes: WallFinishesV1 | None = None
523
+ Plaster: PlasterV1 | None = None
@@ -14,7 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
- from openepd.model.org import OrgRef
18
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
18
  from openepd.model.specs.generated.common import HasForestPracticesCertifiers
20
19
  from openepd.model.specs.generated.enums import (
@@ -154,9 +153,6 @@ class WoodV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
154
153
  default=None, description="Timber species", example="Alaska Cedar"
155
154
  )
156
155
  fabrication: AllFabrication | None = pyd.Field(default=None, description="Timber fabrication", example="LVL")
157
- forest_practices_certifiers: list[OrgRef] | None = pyd.Field(
158
- default=None, description="List of organizations that certify forest practices."
159
- )
160
156
  weather_exposed: bool | None = pyd.Field(default=None, description="Weather exposed", example=True)
161
157
  fire_retardant: bool | None = pyd.Field(default=None, description="Fire retardant", example=True)
162
158
  decay_resistant: bool | None = pyd.Field(default=None, description="Decay resistant", example=True)
@@ -14,7 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
- from openepd.model.org import OrgRef
18
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
18
  from openepd.model.specs.generated.common import HasForestPracticesCertifiers
20
19
  from openepd.model.specs.generated.enums import AllFabrication, AllTimberSpecies
@@ -33,7 +32,6 @@ class WoodJoistsV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
33
32
  # Own fields:
34
33
  timber_species: AllTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
35
34
  fabrication: AllFabrication | None = pyd.Field(default=None, description="", example="LVL")
36
- forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
37
35
  weather_exposed: bool | None = pyd.Field(default=None, description="", example=True)
38
36
  fire_retardant: bool | None = pyd.Field(default=None, description="", example=True)
39
37
  decay_resistant: bool | None = pyd.Field(default=None, description="", example=True)
@@ -274,3 +274,9 @@ class MassPerLengthStr(QuantityStr):
274
274
  """Mass per unit of length quantity type."""
275
275
 
276
276
  unit = "kg / m"
277
+
278
+
279
+ class AreaPerVolumeStr(QuantityStr):
280
+ """Area per unit of volume quantity type."""
281
+
282
+ unit = "m2 / l"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 4.0.0
3
+ Version: 4.2.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=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
2
- openepd/__version__.py,sha256=9t1ToCvhFbSr7mGIm2JugiAa52g5zZ6EQH3fsTUcmiI,638
2
+ openepd/__version__.py,sha256=IT2njgGsj7sZj8Fhuc29NsUD079UbTrJ_u_Mw7RoCMk,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,7 +30,7 @@ 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=wRoFYIK62BaiEY2wAn2uLRo0kImX_aSlwF6lzUh1dZ0,8937
33
+ openepd/model/base.py,sha256=XGuXCWr0PTAeewQj8u75OcRWFumFP2wiSdJsrsL_ZGI,9959
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/epd.py,sha256=_PyVM3cKrOBS2vgLLPBZzKkNfiBEtp2rECP0imp49bc,14082
@@ -52,14 +52,14 @@ openepd/model/specs/generated/bulk_materials.py,sha256=otVwnI8N5zCs-JqklykdQDena
52
52
  openepd/model/specs/generated/cast_decks_and_underlayment.py,sha256=qZjryfTZc1ltPUkut7pkITb-wwZmBZWGIfUl1p8FNXs,955
53
53
  openepd/model/specs/generated/cladding.py,sha256=bdHmLyAWdp0Altjxm2vrrQ6N1KXpZSTwrRtUeO_IDds,6562
54
54
  openepd/model/specs/generated/cmu.py,sha256=Vv-aiT4Q7Zl5XTkSCnTeGOpE_ufTy63zt2Z5aXbv_Qo,1794
55
- openepd/model/specs/generated/common.py,sha256=1cACMUmr44kXBI2igvuLsl4v10FIzsUSsGTlEz85T90,900
55
+ openepd/model/specs/generated/common.py,sha256=iNeJmVYZURVQWewx3zskwnwy7DBuaggCHFWQBThtY2A,1048
56
56
  openepd/model/specs/generated/concrete.py,sha256=wnR656XxF6b26aBP4TRijMJf5CdLUzbZtSLXsbE3Yxw,6987
57
57
  openepd/model/specs/generated/conveying_equipment.py,sha256=sQSnFccpTIw8sNGywW0KajE1lCHzbVBCISKyrYFW02U,3052
58
58
  openepd/model/specs/generated/electrical.py,sha256=z4v6zbDvyMSYwbz7kb70aks1Ik9Q14ZkLss7cLqUdTs,10755
59
59
  openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py,sha256=h6UQixACOHrquhQ2GFqqYWel_zqOXT-vAkI0o_RLf0A,1978
60
60
  openepd/model/specs/generated/electricity.py,sha256=iGtN21K1MRVwoRfO6friVgiXc2b6cVdITbvnXqLmW3k,823
61
- openepd/model/specs/generated/enums.py,sha256=orwUcMQLiA8eHEglUPw-LGIHpYVv7uypPZyl95serqc,58329
62
- openepd/model/specs/generated/finishes.py,sha256=CfOpikGK6EJLDSUyshp0hmXT9yC2Xy6FKihThMjJVHI,21121
61
+ openepd/model/specs/generated/enums.py,sha256=JaQZFGrGLPxz_J8t5VcSszM8HgmqHaIxqg9-nqFnv_k,58504
62
+ openepd/model/specs/generated/finishes.py,sha256=QHFtUZcUCGAzZeHJlLoG1D9SxAW9FGPj7g48Fu1Nvdc,21660
63
63
  openepd/model/specs/generated/fire_and_smoke_protection.py,sha256=zkOlnNCnAZ9MUWk2sDqUX14YxNEDU3MGfUlePG3su0Q,3068
64
64
  openepd/model/specs/generated/furnishings.py,sha256=QY_FDsFZaqjCiw2xHsD3kmyBGJA7jCHlSIvaw4TmqXI,2581
65
65
  openepd/model/specs/generated/grouting.py,sha256=mDpfsax6TO72SuBqv8HftJDYoQPP741dD1vi_2cuNCE,934
@@ -78,16 +78,16 @@ openepd/model/specs/generated/sheathing.py,sha256=06Y9Dy7_9Iy3VfA6fQGr6AUq30u1K_
78
78
  openepd/model/specs/generated/steel.py,sha256=nqkGivvAg5rll2NhClhKE6UCORsvPaVgHiuhirKP3Js,9901
79
79
  openepd/model/specs/generated/thermal_moisture_protection.py,sha256=px1GPZyumr1w0r0ikKO1FefHNK66cxYp1PpmZvpTzPU,8205
80
80
  openepd/model/specs/generated/utility_piping.py,sha256=X0cHq5kQP41RH1iGWrkwUdFX0PI4V00WzxH9BA-i7SY,2493
81
- openepd/model/specs/generated/wood.py,sha256=cTx9vqw3gklsWBuJ0jCOTJc9oOBTZF5M05R7saah9kY,6539
82
- openepd/model/specs/generated/wood_joists.py,sha256=KHFhVgbYy3idredDrCA0_0lrfeqG8hGPoEQfgaTWuMk,1862
81
+ openepd/model/specs/generated/wood.py,sha256=RMNoPRS9K3XF2aXCbvRN3awpO23_5ugYhRCrnvCvI20,6341
82
+ openepd/model/specs/generated/wood_joists.py,sha256=IWDRZ6OvZq6jaqjndK1Ge6H0vrQutAEgdbvcVJb-Ybw,1730
83
83
  openepd/model/standard.py,sha256=QhGpWN3U27fDcS0Yy1Dk8ElJfD0etet6i_PzoTD6B48,1318
84
84
  openepd/model/validation/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
85
85
  openepd/model/validation/common.py,sha256=FLYqK8gYFagx08LCkS0jy3qo4-Zq9VAv5i8ZwF2svkc,2435
86
86
  openepd/model/validation/numbers.py,sha256=tgirqrDGgrSo6APGlW1ozNuVV8mJz_4HCAXS2OUENq0,888
87
- openepd/model/validation/quantity.py,sha256=j1s2G0vVePveeCzHOqz2W0CicPfZgWzFdg4ZFC5OmGA,7306
87
+ openepd/model/validation/quantity.py,sha256=kzug0MZ3Ao0zeVzN-aleyxUg5hA_7D5tNOOerverfRQ,7415
88
88
  openepd/model/versioning.py,sha256=R_zm6rCrgF3vlJQYbpyWhirdS_Oek16cv_mvZmpuE8I,4473
89
89
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- openepd-4.0.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
91
- openepd-4.0.0.dist-info/METADATA,sha256=UA4MKE056z9tXOIVSuemeI-6qd11JCLvYjSnWbiP3LA,7790
92
- openepd-4.0.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
93
- openepd-4.0.0.dist-info/RECORD,,
90
+ openepd-4.2.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
91
+ openepd-4.2.0.dist-info/METADATA,sha256=S2oqtKvw4rDM-N5a9NDPrD0AVRPknspcRFuufvz48YM,7790
92
+ openepd-4.2.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
93
+ openepd-4.2.0.dist-info/RECORD,,