openepd 7.7.0__py3-none-any.whl → 7.8.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 = "7.7.0"
16
+ VERSION = "7.8.0"
@@ -0,0 +1,15 @@
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
+ #
@@ -0,0 +1,168 @@
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
+ __all__ = ["ScopePhases"]
17
+
18
+
19
+ from enum import StrEnum
20
+
21
+ from openepd.utils.functional import classproperty
22
+
23
+
24
+ # noinspection PyMethodParameters
25
+ class ScopePhases(StrEnum):
26
+ """Container of common way to specify known scope phases under OpenEPD standard."""
27
+
28
+ A1 = "A1"
29
+ A2 = "A2"
30
+ A3 = "A3"
31
+ A1A2A3 = "A1A2A3"
32
+ A4 = "A4"
33
+ A5 = "A5"
34
+
35
+ B1 = "B1"
36
+ B2 = "B2"
37
+ B3 = "B3"
38
+ B4 = "B4"
39
+ B5 = "B5"
40
+ B6 = "B6"
41
+ B7 = "B7"
42
+
43
+ C1 = "C1"
44
+ C2 = "C2"
45
+ C3 = "C3"
46
+ C4 = "C4"
47
+
48
+ D = "D"
49
+
50
+ @classproperty
51
+ def a1a2a3(cls) -> str:
52
+ return cls.A1A2A3.lower()
53
+
54
+ @classproperty
55
+ def a1(cls) -> str:
56
+ return cls.A1.lower()
57
+
58
+ @classproperty
59
+ def a2(cls) -> str:
60
+ return cls.A2.lower()
61
+
62
+ @classproperty
63
+ def a3(cls) -> str:
64
+ return cls.A3.lower()
65
+
66
+ @classproperty
67
+ def a4(cls) -> str:
68
+ return cls.A4.lower()
69
+
70
+ @classproperty
71
+ def a5(cls) -> str:
72
+ return cls.A5.lower()
73
+
74
+ @classproperty
75
+ def b1(cls) -> str:
76
+ return cls.B1.lower()
77
+
78
+ @classproperty
79
+ def b2(cls) -> str:
80
+ return cls.B2.lower()
81
+
82
+ @classproperty
83
+ def b3(cls) -> str:
84
+ return cls.B3.lower()
85
+
86
+ @classproperty
87
+ def b4(cls) -> str:
88
+ return cls.B4.lower()
89
+
90
+ @classproperty
91
+ def b5(cls) -> str:
92
+ return cls.B5.lower()
93
+
94
+ @classproperty
95
+ def b6(cls) -> str:
96
+ return cls.B6.lower()
97
+
98
+ @classproperty
99
+ def b7(cls) -> str:
100
+ return cls.B7.lower()
101
+
102
+ @classproperty
103
+ def c1(cls) -> str:
104
+ return cls.C1.lower()
105
+
106
+ @classproperty
107
+ def c2(cls) -> str:
108
+ return cls.C2.lower()
109
+
110
+ @classproperty
111
+ def c3(cls) -> str:
112
+ return cls.C3.lower()
113
+
114
+ @classproperty
115
+ def c4(cls) -> str:
116
+ return cls.C4.lower()
117
+
118
+ @classproperty
119
+ def d(cls) -> str:
120
+ return cls.D.lower()
121
+
122
+ @classmethod
123
+ def a_scopes(cls, *, lowercase: bool = False) -> tuple[str, ...]:
124
+ result = (ScopePhases.A1A2A3, ScopePhases.A1, ScopePhases.A2, ScopePhases.A3, ScopePhases.A4, ScopePhases.A5)
125
+ if lowercase:
126
+ return cls._lowercase(result)
127
+ return result
128
+
129
+ @classmethod
130
+ def b_scopes(cls, *, lowercase: bool = False) -> tuple[str, ...]:
131
+ result = (
132
+ ScopePhases.B1,
133
+ ScopePhases.B2,
134
+ ScopePhases.B3,
135
+ ScopePhases.B4,
136
+ ScopePhases.B5,
137
+ ScopePhases.B6,
138
+ ScopePhases.B7,
139
+ )
140
+ if lowercase:
141
+ return cls._lowercase(result)
142
+
143
+ return result
144
+
145
+ @classmethod
146
+ def c_scopes(cls, *, lowercase: bool = False) -> tuple[str, ...]:
147
+ result = (ScopePhases.C1, ScopePhases.C2, ScopePhases.C3, ScopePhases.C4)
148
+ if lowercase:
149
+ return cls._lowercase(result)
150
+ return result
151
+
152
+ @classmethod
153
+ def d_scopes(cls, *, lowercase: bool = False) -> tuple[str, ...]:
154
+ result = (ScopePhases.D,)
155
+ if lowercase:
156
+ return cls._lowercase(result)
157
+ return result
158
+
159
+ @classmethod
160
+ def all_scopes(cls, *, lowercase: bool = False) -> tuple[str, ...]:
161
+ result = cls.a_scopes() + cls.b_scopes() + cls.c_scopes() + cls.d_scopes()
162
+ if lowercase:
163
+ return cls._lowercase(result)
164
+ return result
165
+
166
+ @classmethod
167
+ def _lowercase(cls, scopes: tuple[str, ...]) -> tuple[str, ...]:
168
+ return tuple(scope.lower() for scope in scopes)
@@ -232,6 +232,9 @@ class WithVerifierMixin(pydantic.BaseModel):
232
232
  examples=["john.doe@example.com"],
233
233
  default=None,
234
234
  )
235
+ third_party_verifier_name: str | None = pydantic.Field(
236
+ description="The publishable name of the third party verifier", examples=["John Doe"], default=None
237
+ )
235
238
 
236
239
 
237
240
  class WithEpdDeveloperMixin(pydantic.BaseModel):
openepd/model/lcia.py CHANGED
@@ -602,6 +602,7 @@ class LCIAMethod(StrEnum):
602
602
  CML_1992 = "CML 1992"
603
603
  RECIPE_2016 = "ReCiPe 2016"
604
604
  RECIPE_2008 = "ReCiPe 2008"
605
+ GWP_GHG = "GWP-GHG"
605
606
  LIME2 = "LIME2"
606
607
 
607
608
  @classmethod
@@ -0,0 +1,36 @@
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
+
17
+ # Portions of this file are sourced from https://github.com/django/django/blob/main/django/utils/functional.py
18
+ # Copyright (c) Django Software Foundation and individual contributors.
19
+ # Licensed under the BSD 3-Clause License.
20
+
21
+ # noinspection PyPep8Naming
22
+ class classproperty:
23
+ """
24
+ Decorator that converts a method with a single cls argument into a property
25
+ that can be accessed directly from the class.
26
+ """ # noqa: D205
27
+
28
+ def __init__(self, method=None):
29
+ self.fget = method
30
+
31
+ def __get__(self, instance, cls=None):
32
+ return self.fget(cls)
33
+
34
+ def getter(self, method):
35
+ self.fget = method
36
+ return self
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: openepd
3
- Version: 7.7.0
3
+ Version: 7.8.0
4
4
  Summary: Python library to work with OpenEPD format
5
5
  License: Apache-2.0
6
6
  Author: C-Change Labs
@@ -1,5 +1,5 @@
1
1
  openepd/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
2
- openepd/__version__.py,sha256=yl4wQF-1qgdO4jZxe2wV3xfKlACh5SDmznbBqByduEM,638
2
+ openepd/__version__.py,sha256=2mlh9sal3db56SKHVMoUwUYhIvx-ppxfbnS1SZRr774,638
3
3
  openepd/api/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
4
4
  openepd/api/average_dataset/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
5
5
  openepd/api/average_dataset/generic_estimate_sync_api.py,sha256=mjTT8eGtfj6Fgp-wcs0cCWA7DJo1KL_iQ75rgKkaY3c,8037
@@ -35,6 +35,8 @@ openepd/bundle/base.py,sha256=2tv7KbxG9zC_nuMOGudorxZcTl5rU6ABJmEbO2WTPas,8400
35
35
  openepd/bundle/model.py,sha256=4pmOCgK-kdBu7_PLm5QhlrVZRmab_18o0EGvcUjI8FQ,2722
36
36
  openepd/bundle/reader.py,sha256=H1mfuFxV2G0q9ld0dJ6SRucTwcTSEi-sFoKJLsBk4IQ,7767
37
37
  openepd/bundle/writer.py,sha256=cyFikYTtZCcX0rhdpbuvOaOBG4CS1nE8JjHUdB7Wghs,8708
38
+ openepd/constants/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
39
+ openepd/constants/scope_phases.py,sha256=zcK7ytSbCNE76tX0vZMWbEUAFgFSifXU9YG_s3vvMqw,4035
38
40
  openepd/m49/__init__.py,sha256=AApOMp9PJPMXZbPB4piedqKtgHE01mlj_MyF3kf519U,718
39
41
  openepd/m49/const.py,sha256=lxp2bzwD4d95VHo5ULKFN8ryzjjfKTwpe9_MdUFIoXw,32104
40
42
  openepd/m49/utils.py,sha256=0UvdtC9gtvRA5WT_hJDIuQR0RSrnx-S34wwwBRM_tsM,7807
@@ -42,13 +44,13 @@ openepd/model/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
42
44
  openepd/model/base.py,sha256=4D8BaSoNeY8RZfjkmJOSyfg0B34dKzM76lZbQT9AIXg,13622
43
45
  openepd/model/category.py,sha256=iyzzAsiVwW4zJ61oYsm9Sy-sEBA71-aMFXcJP1Y-dPI,1734
44
46
  openepd/model/common.py,sha256=D-FmaKk_ay6Of3HdUiloagc2nUiOLp97781BDRZMp8U,14662
45
- openepd/model/declaration.py,sha256=v-X2JBOK-7ZYWziEUP7GOSrQFK4pI9EMZvp3Z7-mwwM,14669
47
+ openepd/model/declaration.py,sha256=n55PqeIsBGT4UGHjGyb92txuoPB_S0eZ3lcmUAuS4NQ,14843
46
48
  openepd/model/epd.py,sha256=FL8g-dKb4SaCF_xIrtVx21tmNoofARaxN-yp6_Vv_bY,12748
47
49
  openepd/model/factory.py,sha256=UWSGpfCr3GiMTP4rzBkwqxzbXB6GKZ_5Okb1Dqa_4aA,2701
48
50
  openepd/model/generic_estimate.py,sha256=_R18Uz-hvxtSBl53D0_OkwVCWvoa2nIDjBdec6vEPDE,4304
49
51
  openepd/model/geography.py,sha256=Jx7NIDdk_sIvwyh-7YxnIjAwIHW2HCQK7UtFGM2xKtw,42095
50
52
  openepd/model/industry_epd.py,sha256=Cqn01IUNSZqRkyU05TwtOLXDKlg0YnGzqvKL8A__zbI,4061
51
- openepd/model/lcia.py,sha256=IfSLZER6kI1tb0tKZW1FeHxFqeumznurELNLtYR6TC8,32756
53
+ openepd/model/lcia.py,sha256=6o6GNwLaQaWyYAXCnHl2aAgDa12_v7DwpME5BfVMezk,32780
52
54
  openepd/model/org.py,sha256=zYZXTwU5Xah-MAiG0dP8SNRACpb79TmTWF6mUoROk8M,8181
53
55
  openepd/model/pcr.py,sha256=cu3EakCAjBCkcb_AaLXB-xEjY0mlG-wJe74zGc5tdS0,5637
54
56
  openepd/model/specs/README.md,sha256=UGhSiFJ9hOxT1mZl-5ZrhkOrPKf1W_gcu5CI9hzV7LU,2430
@@ -147,11 +149,12 @@ openepd/model/validation/quantity.py,sha256=M9dz3byTK6Lrys43I0Gq7n2b0aE8WYys-idx
147
149
  openepd/model/versioning.py,sha256=QzPeWiRCNvSUmlXANg4Vl4WqsPtlrCr8gSwDNUhZGvM,4577
148
150
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
151
  openepd/utils/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
152
+ openepd/utils/functional.py,sha256=sm7od2_UE-cNToezBlwFQ1TCUJub1tz6VykA1X8XH-I,1274
150
153
  openepd/utils/mapping/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
151
154
  openepd/utils/mapping/common.py,sha256=hxfN-WW2WLwE_agQzf_mhvz6OHq5WWlr24uZ1S81k4Y,8426
152
155
  openepd/utils/mapping/geography.py,sha256=1_-dvLk11Hqn-K58yUI5pQ5X5gsnJPFlFT7JK2Rdoeg,2396
153
156
  openepd/utils/markdown.py,sha256=RQmudPhb4QU1I4-S-VV2WFbzzq2Po09kbpjjKbwkA9E,1830
154
- openepd-7.7.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
155
- openepd-7.7.0.dist-info/METADATA,sha256=pyqC4h1XAG1lwB2uZQ82w2XAmgelS-7sqwGCVnsxYgg,9810
156
- openepd-7.7.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
157
- openepd-7.7.0.dist-info/RECORD,,
157
+ openepd-7.8.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
158
+ openepd-7.8.0.dist-info/METADATA,sha256=_ovpdq84mYXrf918um6k0gPGqIuMXt13t2DLL0A1xRI,9810
159
+ openepd-7.8.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
160
+ openepd-7.8.0.dist-info/RECORD,,