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 +1 -1
- openepd/constants/__init__.py +15 -0
- openepd/constants/scope_phases.py +168 -0
- openepd/model/declaration.py +3 -0
- openepd/model/lcia.py +1 -0
- openepd/utils/functional.py +36 -0
- {openepd-7.7.0.dist-info → openepd-7.8.0.dist-info}/METADATA +1 -1
- {openepd-7.7.0.dist-info → openepd-7.8.0.dist-info}/RECORD +10 -7
- {openepd-7.7.0.dist-info → openepd-7.8.0.dist-info}/LICENSE +0 -0
- {openepd-7.7.0.dist-info → openepd-7.8.0.dist-info}/WHEEL +0 -0
openepd/__version__.py
CHANGED
@@ -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)
|
openepd/model/declaration.py
CHANGED
@@ -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
@@ -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,5 +1,5 @@
|
|
1
1
|
openepd/__init__.py,sha256=9THJcV3LT7JDBOMz1px-QFf_sdJ0LOqJ5dmA9Dvvtd4,620
|
2
|
-
openepd/__version__.py,sha256=
|
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=
|
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=
|
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.
|
155
|
-
openepd-7.
|
156
|
-
openepd-7.
|
157
|
-
openepd-7.
|
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,,
|
File without changes
|
File without changes
|