openepd 3.5.1__py3-none-any.whl → 4.1.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 = "3.5.1"
16
+ VERSION = "4.1.0"
@@ -14,8 +14,7 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  from openepd.api.base_sync_client import BaseApiMethodGroup
17
- from openepd.api.pcr.dto import PcrRef
18
- from openepd.model.pcr import Pcr
17
+ from openepd.model.pcr import Pcr, PcrRef
19
18
 
20
19
 
21
20
  class PcrApi(BaseApiMethodGroup):
openepd/model/org.py CHANGED
@@ -35,7 +35,7 @@ class OrgRef(BaseOpenEpdSchema):
35
35
  )
36
36
  ref: ReferenceStr | None = pyd.Field(
37
37
  default=None,
38
- example="https://buildingtransparency.org/ec3/epds/1u7zsed8",
38
+ example="https://openepd.buildingtransparency.org/api/orgs/c-change-labs.com",
39
39
  description="Reference to this Org's JSON object",
40
40
  )
41
41
 
@@ -53,7 +53,6 @@ class Org(WithAttachmentsMixin, WithAltIdsMixin, OrgRef):
53
53
  owner: Optional["OrgRef"] = pyd.Field(description="Organization that controls this organization", default=None)
54
54
  subsidiaries: Annotated[list["OrgRef"], pyd.conlist(pyd.constr(max_length=200), max_items=255)] | None = pyd.Field(
55
55
  description="Organizations controlled by this organization",
56
- example=["cqd.io", "supplychaincarbonpricing.org"],
57
56
  default=None,
58
57
  )
59
58
  hq_location: Location | None = pyd.Field(
openepd/model/pcr.py CHANGED
@@ -19,7 +19,7 @@ from typing import Annotated, Optional
19
19
 
20
20
  from openepd.compat.pydantic import pyd
21
21
  from openepd.model.base import BaseOpenEpdSchema
22
- from openepd.model.common import WithAltIdsMixin, WithAttachmentsMixin
22
+ from openepd.model.common import Amount, WithAltIdsMixin, WithAttachmentsMixin
23
23
  from openepd.model.org import Org
24
24
 
25
25
 
@@ -33,6 +33,26 @@ class PcrStatus(StrEnum):
33
33
  Sunset = "Sunset"
34
34
 
35
35
 
36
+ class PcrRef(BaseOpenEpdSchema):
37
+ """Reference to a PCR."""
38
+
39
+ id: str | None = pyd.Field(
40
+ description="The unique ID for this PCR. To ensure global uniqueness, should be registered "
41
+ "at open-xpd-uuid.cqd.io/register or a coordinating registry.",
42
+ example="ec3xpgq2",
43
+ default=None,
44
+ )
45
+ name: str | None = pyd.Field(
46
+ max_length=200,
47
+ description="Full document name as listed in source document",
48
+ example="c-PCR-003 Concrete and concrete elements (EN 16757)",
49
+ )
50
+ ref: pyd.AnyUrl | None = pyd.Field(
51
+ description="Reference to this PCR's JSON object",
52
+ example="https://openepd.buildingtransparency.org/api/pcrs/1u7zsed8",
53
+ )
54
+
55
+
36
56
  class Pcr(WithAttachmentsMixin, WithAltIdsMixin, BaseOpenEpdSchema):
37
57
  """Represent a PCR (Product Category Rules)."""
38
58
 
@@ -60,6 +80,11 @@ class Pcr(WithAttachmentsMixin, WithAltIdsMixin, BaseOpenEpdSchema):
60
80
  description="A shortened name without boilerplate text.",
61
81
  example="Concrete and Concrete Elements",
62
82
  )
83
+ declared_units: list[Amount] | None = pyd.Field(
84
+ description="SI declared units for this PCR. If a functional unit is "
85
+ "utilized, the declared unit shall refer to the amount of "
86
+ "product associated with the A1-A3 life cycle stage."
87
+ )
63
88
  version: str | None = pyd.Field(
64
89
  description="Document version, as expressed in document.",
65
90
  example="1.0.2",
@@ -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"
@@ -34,6 +34,7 @@ from openepd.model.specs.generated.enums import (
34
34
  GypsumFacing,
35
35
  GypsumFireRating,
36
36
  GypsumThickness,
37
+ PlasterComposition,
37
38
  ResilientFlooringFormFactor,
38
39
  ResilientFlooringMaterial,
39
40
  ResilientFlooringThickness,
@@ -45,6 +46,7 @@ from openepd.model.specs.generated.enums import (
45
46
  )
46
47
  from openepd.model.validation.numbers import RatioFloat
47
48
  from openepd.model.validation.quantity import (
49
+ AreaPerVolumeStr,
48
50
  GwpKgCo2eStr,
49
51
  LengthMmStr,
50
52
  LengthMStr,
@@ -484,10 +486,30 @@ class WallFinishesV1(BaseOpenEpdHierarchicalSpec):
484
486
  thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
485
487
 
486
488
 
489
+ class PlasterV1(BaseOpenEpdHierarchicalSpec):
490
+ """
491
+ Plaster, Stucco, & Render.
492
+
493
+ Used for the protective or decorative coating of walls and ceilings and for
494
+ moulding and casting decorative elements. These are typically gypsum-, lime-,
495
+ or cement-based. Products in this category refer to dry mix.
496
+ """
497
+
498
+ _EXT_VERSION = "1.0"
499
+
500
+ # Own fields:
501
+ composition: PlasterComposition | None = pyd.Field(default=None, description="", example="Cement")
502
+ application_rate: AreaPerVolumeStr | None = pyd.Field(
503
+ default=None,
504
+ description="Typical or reference amount of material covering a unit of a host surface.",
505
+ example="10 m2/l",
506
+ )
507
+
508
+
487
509
  class FinishesV1(BaseOpenEpdHierarchicalSpec):
488
510
  """General category - finishes for interior ceilings, floors, walls."""
489
511
 
490
- _EXT_VERSION = "1.0"
512
+ _EXT_VERSION = "1.1"
491
513
 
492
514
  # Nested specs:
493
515
  Flooring: FlooringV1 | None = None
@@ -501,3 +523,4 @@ class FinishesV1(BaseOpenEpdHierarchicalSpec):
501
523
  Mirrors: MirrorsV1 | None = None
502
524
  PaintingAndCoating: PaintingAndCoatingV1 | None = None
503
525
  WallFinishes: WallFinishesV1 | None = None
526
+ Plaster: PlasterV1 | None = None
@@ -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: 3.5.1
3
+ Version: 4.1.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=KyIZ3qz2i78BnJOs7MH2n0TZXfV40t1xP94p_biGq30,638
2
+ openepd/__version__.py,sha256=6oJDIgetUTDqMCH9aRm3UXrdGYxWPFFWo59gSw2CtbA,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
@@ -17,8 +17,7 @@ openepd/api/epd/dto.py,sha256=NZ76vfUkCEkwDibQd2QCEQP5DZms_NFc9tjoP-mcw3o,4874
17
17
  openepd/api/epd/sync_api.py,sha256=5wuPiM_zVciVtTvsGaaRdf7T6q2CUp7QMZCW0DAjQng,7072
18
18
  openepd/api/errors.py,sha256=Pcg2JqjLoUXUFJTVdIFbd8rgjGoAT5HpnivTpFRACVU,2159
19
19
  openepd/api/pcr/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
20
- openepd/api/pcr/dto.py,sha256=QhRAgJG22JmlELAY6ogWpatLfEEmp49F2q4uz-3ZuVE,1432
21
- openepd/api/pcr/sync_api.py,sha256=LdJki4t_pEXPJuSnzh8LhN0kZibA8mYEgwf_3hpu0YE,1588
20
+ openepd/api/pcr/sync_api.py,sha256=Riu77h8uLJngKpITOiXYmO7mzjAHpYskUJ6ynyfNG78,1557
22
21
  openepd/api/sync_client.py,sha256=kVirNhExF92vr2VXnzxNFVUJwnbgC_VR8vzV47twQKQ,2287
23
22
  openepd/api/test/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
24
23
  openepd/api/utils.py,sha256=FSY2W8zTXGTvJAJACMi4nibpo-9m1HXkTCH8kdAYlzQ,875
@@ -37,8 +36,8 @@ openepd/model/common.py,sha256=aa_bfotPybPoYyzHtwj5E5X1T-fCEyznMfVUWvpUhiM,5460
37
36
  openepd/model/epd.py,sha256=_PyVM3cKrOBS2vgLLPBZzKkNfiBEtp2rECP0imp49bc,14082
38
37
  openepd/model/factory.py,sha256=i45ZXG5RIMKrXvVH1li0ZlUwcBpSl5gEctcLc1MBM7M,1701
39
38
  openepd/model/lcia.py,sha256=x3NI71UB8t07LTmnf-HL9Q2nSXqN96I9zORzDvof86M,16948
40
- openepd/model/org.py,sha256=b-K1g2uNaFDz5QZStJLWD7Tc2Swyz3vVXQmp8Zlfk98,3803
41
- openepd/model/pcr.py,sha256=wlsTVXtzlFZzBPgrm9gfn22aIzzTzBgiq7uum4byjSw,4403
39
+ openepd/model/org.py,sha256=FHcYh2WOOQrCMyzm0Ow-iP79jMTBPcneidjH6NXIklA,3760
40
+ openepd/model/pcr.py,sha256=SwqLWMj9k_jqIzxz5mh6ttqvtLCspKSpywF5YTBOMsA,5397
42
41
  openepd/model/specs/README.md,sha256=W5LSMpZuW5x36cKS4HRfeFsClsRf8J9yHMMICghdc0s,862
43
42
  openepd/model/specs/__init__.py,sha256=CfuCZKFE6xysags8XY9VlW-o_zHEyCu9fGekoj-RJOg,4959
44
43
  openepd/model/specs/asphalt.py,sha256=kyv-WvqujYD5xqi-lS2nSculXLQAuuBbJU_YRCb-5ug,3332
@@ -59,8 +58,8 @@ openepd/model/specs/generated/conveying_equipment.py,sha256=sQSnFccpTIw8sNGywW0K
59
58
  openepd/model/specs/generated/electrical.py,sha256=z4v6zbDvyMSYwbz7kb70aks1Ik9Q14ZkLss7cLqUdTs,10755
60
59
  openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py,sha256=h6UQixACOHrquhQ2GFqqYWel_zqOXT-vAkI0o_RLf0A,1978
61
60
  openepd/model/specs/generated/electricity.py,sha256=iGtN21K1MRVwoRfO6friVgiXc2b6cVdITbvnXqLmW3k,823
62
- openepd/model/specs/generated/enums.py,sha256=orwUcMQLiA8eHEglUPw-LGIHpYVv7uypPZyl95serqc,58329
63
- 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=2loL2pYhVS_LLc2bY9V4fwv0JjU5nusPFB3KG7o25bg,21887
64
63
  openepd/model/specs/generated/fire_and_smoke_protection.py,sha256=zkOlnNCnAZ9MUWk2sDqUX14YxNEDU3MGfUlePG3su0Q,3068
65
64
  openepd/model/specs/generated/furnishings.py,sha256=QY_FDsFZaqjCiw2xHsD3kmyBGJA7jCHlSIvaw4TmqXI,2581
66
65
  openepd/model/specs/generated/grouting.py,sha256=mDpfsax6TO72SuBqv8HftJDYoQPP741dD1vi_2cuNCE,934
@@ -85,10 +84,10 @@ openepd/model/standard.py,sha256=QhGpWN3U27fDcS0Yy1Dk8ElJfD0etet6i_PzoTD6B48,131
85
84
  openepd/model/validation/__init__.py,sha256=UGmZGEyMnASrYwEBPHuXmVzHiuCUskUsJEPoHTIo-lg,620
86
85
  openepd/model/validation/common.py,sha256=FLYqK8gYFagx08LCkS0jy3qo4-Zq9VAv5i8ZwF2svkc,2435
87
86
  openepd/model/validation/numbers.py,sha256=tgirqrDGgrSo6APGlW1ozNuVV8mJz_4HCAXS2OUENq0,888
88
- openepd/model/validation/quantity.py,sha256=j1s2G0vVePveeCzHOqz2W0CicPfZgWzFdg4ZFC5OmGA,7306
87
+ openepd/model/validation/quantity.py,sha256=kzug0MZ3Ao0zeVzN-aleyxUg5hA_7D5tNOOerverfRQ,7415
89
88
  openepd/model/versioning.py,sha256=R_zm6rCrgF3vlJQYbpyWhirdS_Oek16cv_mvZmpuE8I,4473
90
89
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- openepd-3.5.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
92
- openepd-3.5.1.dist-info/METADATA,sha256=6yGQqjcPVerGaNBY5NrYraf_CbdmP7AYXSfc-OLfubU,7790
93
- openepd-3.5.1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
94
- openepd-3.5.1.dist-info/RECORD,,
90
+ openepd-4.1.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
91
+ openepd-4.1.0.dist-info/METADATA,sha256=CfJzVypYSUzyoJXxU-NA93cJs3YH6-teHzIW5NIUIpk,7790
92
+ openepd-4.1.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
93
+ openepd-4.1.0.dist-info/RECORD,,
openepd/api/pcr/dto.py DELETED
@@ -1,37 +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
- from openepd.api.dto.base import BaseOpenEpdApiModel
17
- from openepd.compat.pydantic import pyd
18
-
19
-
20
- class PcrRef(BaseOpenEpdApiModel):
21
- """Reference to a PCR."""
22
-
23
- id: str | None = pyd.Field(
24
- description="The unique ID for this PCR. To ensure global uniqueness, should be registered "
25
- "at open-xpd-uuid.cqd.io/register or a coordinating registry.",
26
- example="ec3xpgq2",
27
- default=None,
28
- )
29
- name: str | None = pyd.Field(
30
- max_length=200,
31
- description="Full document name as listed in source document",
32
- example="c-PCR-003 Concrete and concrete elements (EN 16757)",
33
- )
34
- ref: pyd.AnyUrl | None = pyd.Field(
35
- description="Reference to this PCR's JSON object",
36
- example="https://openepd.buildingtransparency.org/api/pcrs/1u7zsed8",
37
- )