openepd 6.7.0__tar.gz → 6.7.1__tar.gz

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 (142) hide show
  1. {openepd-6.7.0 → openepd-6.7.1}/PKG-INFO +1 -1
  2. {openepd-6.7.0 → openepd-6.7.1}/pyproject.toml +1 -1
  3. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/__version__.py +1 -1
  4. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/common.py +46 -1
  5. {openepd-6.7.0 → openepd-6.7.1}/LICENSE +0 -0
  6. {openepd-6.7.0 → openepd-6.7.1}/README.md +0 -0
  7. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/__init__.py +0 -0
  8. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/__init__.py +0 -0
  9. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/average_dataset/__init__.py +0 -0
  10. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/average_dataset/generic_estimate_sync_api.py +0 -0
  11. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/average_dataset/industry_epd_sync_api.py +0 -0
  12. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/base_sync_client.py +0 -0
  13. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/category/__init__.py +0 -0
  14. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/category/dto.py +0 -0
  15. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/category/sync_api.py +0 -0
  16. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/common.py +0 -0
  17. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/dto/__init__.py +0 -0
  18. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/dto/base.py +0 -0
  19. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/dto/common.py +0 -0
  20. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/dto/meta.py +0 -0
  21. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/dto/mf.py +0 -0
  22. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/dto/params.py +0 -0
  23. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/epd/__init__.py +0 -0
  24. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/epd/dto.py +0 -0
  25. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/epd/sync_api.py +0 -0
  26. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/errors.py +0 -0
  27. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/pcr/__init__.py +0 -0
  28. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/pcr/sync_api.py +0 -0
  29. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/sync_client.py +0 -0
  30. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/test/__init__.py +0 -0
  31. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/api/utils.py +0 -0
  32. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/bundle/__init__.py +0 -0
  33. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/bundle/base.py +0 -0
  34. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/bundle/model.py +0 -0
  35. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/bundle/reader.py +0 -0
  36. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/bundle/writer.py +0 -0
  37. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/compat/__init__.py +0 -0
  38. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/compat/compat_functional_validators.py +0 -0
  39. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/compat/pydantic.py +0 -0
  40. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/__init__.py +0 -0
  41. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/base.py +0 -0
  42. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/category.py +0 -0
  43. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/declaration.py +0 -0
  44. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/epd.py +0 -0
  45. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/factory.py +0 -0
  46. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/generic_estimate.py +0 -0
  47. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/geography.py +0 -0
  48. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/industry_epd.py +0 -0
  49. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/lcia.py +0 -0
  50. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/org.py +0 -0
  51. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/pcr.py +0 -0
  52. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/README.md +0 -0
  53. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/__init__.py +0 -0
  54. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/asphalt.py +0 -0
  55. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/base.py +0 -0
  56. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/concrete.py +0 -0
  57. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/enums.py +0 -0
  58. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/__init__.py +0 -0
  59. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/accessories.py +0 -0
  60. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/aggregates.py +0 -0
  61. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/aluminium.py +0 -0
  62. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/asphalt.py +0 -0
  63. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/bulk_materials.py +0 -0
  64. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/cast_decks_and_underlayment.py +0 -0
  65. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/cladding.py +0 -0
  66. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/cmu.py +0 -0
  67. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/concrete.py +0 -0
  68. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/conveying_equipment.py +0 -0
  69. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/electrical.py +0 -0
  70. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py +0 -0
  71. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/electricity.py +0 -0
  72. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/finishes.py +0 -0
  73. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/fire_and_smoke_protection.py +0 -0
  74. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/furnishings.py +0 -0
  75. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/grouting.py +0 -0
  76. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/manufacturing_inputs.py +0 -0
  77. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/masonry.py +0 -0
  78. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/material_handling.py +0 -0
  79. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/mechanical.py +0 -0
  80. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/mechanical_insulation.py +0 -0
  81. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/network_infrastructure.py +0 -0
  82. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/openings.py +0 -0
  83. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/other_electrical_equipment.py +0 -0
  84. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/other_materials.py +0 -0
  85. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/plumbing.py +0 -0
  86. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/precast_concrete.py +0 -0
  87. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/sheathing.py +0 -0
  88. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/steel.py +0 -0
  89. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/thermal_moisture_protection.py +0 -0
  90. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/utility_piping.py +0 -0
  91. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/wood.py +0 -0
  92. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/range/wood_joists.py +0 -0
  93. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/__init__.py +0 -0
  94. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/accessories.py +0 -0
  95. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/aggregates.py +0 -0
  96. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/aluminium.py +0 -0
  97. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/asphalt.py +0 -0
  98. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/bulk_materials.py +0 -0
  99. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/cast_decks_and_underlayment.py +0 -0
  100. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/cladding.py +0 -0
  101. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/cmu.py +0 -0
  102. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/common.py +0 -0
  103. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/concrete.py +0 -0
  104. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/conveying_equipment.py +0 -0
  105. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/deprecated/__init__.py +0 -0
  106. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/deprecated/concrete.py +0 -0
  107. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/deprecated/steel.py +0 -0
  108. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/electrical.py +0 -0
  109. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/electrical_transmission_and_distribution_equipment.py +0 -0
  110. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/electricity.py +0 -0
  111. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/finishes.py +0 -0
  112. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/fire_and_smoke_protection.py +0 -0
  113. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/furnishings.py +0 -0
  114. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/grouting.py +0 -0
  115. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/manufacturing_inputs.py +0 -0
  116. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/masonry.py +0 -0
  117. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/material_handling.py +0 -0
  118. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/mechanical.py +0 -0
  119. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/mechanical_insulation.py +0 -0
  120. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/mixins/__init__.py +0 -0
  121. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/mixins/conduit_mixin.py +0 -0
  122. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/network_infrastructure.py +0 -0
  123. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/openings.py +0 -0
  124. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/other_electrical_equipment.py +0 -0
  125. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/other_materials.py +0 -0
  126. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/plumbing.py +0 -0
  127. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/precast_concrete.py +0 -0
  128. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/sheathing.py +0 -0
  129. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/steel.py +0 -0
  130. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/thermal_moisture_protection.py +0 -0
  131. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/utility_piping.py +0 -0
  132. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/wood.py +0 -0
  133. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/specs/singular/wood_joists.py +0 -0
  134. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/standard.py +0 -0
  135. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/validation/__init__.py +0 -0
  136. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/validation/common.py +0 -0
  137. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/validation/enum.py +0 -0
  138. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/validation/numbers.py +0 -0
  139. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/validation/quantity.py +0 -0
  140. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/model/versioning.py +0 -0
  141. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/patch_pydantic.py +0 -0
  142. {openepd-6.7.0 → openepd-6.7.1}/src/openepd/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 6.7.0
3
+ Version: 6.7.1
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,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "openepd"
3
- version = "6.7.0"
3
+ version = "6.7.1"
4
4
  license = "Apache-2.0"
5
5
  description = "Python library to work with OpenEPD format"
6
6
  authors = ["C-Change Labs <support@c-change-labs.com>"]
@@ -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 = "6.7.0"
16
+ VERSION = "6.7.1"
@@ -149,10 +149,55 @@ class Location(BaseOpenEpdSchema):
149
149
  )
150
150
 
151
151
 
152
+ ATTACHMENT_KNOWN_KEYS: dict[str, str] = {
153
+ "OpenEPD": "A Product EPD in OpenEPD format",
154
+ "openEPD": "Equivalent to OpenEPD",
155
+ "ILCD_EPD": "A Product EPD in ILCD+EPD format. An underscore is used in place of '+' for compatability purposes.",
156
+ "OpenIndustryEPD": "An Industry EPD in OpenEPD format",
157
+ "openIndustryEPD": "Equivalent to OpenIndustryEPD",
158
+ "LCA_Model": "An underlying LCA model from which one could replicate these EPD results, in LCA Commons 2.0 format",
159
+ "LCA_Report": "An underlying LCA report, in PDF or other document format",
160
+ "lca_software": "A url, optionally with an #anchor tag, pointing to the version of the software used, generally one provided by the software vendor. ",
161
+ "lca_dataset_reference": "A URL link to an lca dataset used in the analysis. Multiple dataset references can be added by appending a number or string after _reference, e.g. lca_dataset_reference_3 or lca_dataset_reference_steel",
162
+ "EPD": "Environmental Product Declaration, verified by a third party, not in OpenEPD format.",
163
+ "IndustryEPD": "EPD for an industry, sector, or group of companies, not in OpenEPD format.",
164
+ "Datasheet": "A technical data sheet describing the product.",
165
+ "PCR": "Product Category Rules for EPD generation",
166
+ "Contact_Us": "A url to contact. May be an email (mailto:) link.",
167
+ "URL": "A link to a relevant resource. No particular format is specified. Each URL should be uniquely named. ",
168
+ "VOC": "Volatile Organic Compound declaration",
169
+ "HPD": "Material Health Product Declaration",
170
+ "PEF": "Product Environmental Footprint (without 3rd party verification)",
171
+ "MSDS": "Material Safety Data Sheet",
172
+ "Developer": "Link to the website of the group who performed the LCA and/or prepared the EPD.",
173
+ }
174
+
175
+
176
+ class AttachmentDict(dict[str, pyd.AnyUrl]):
177
+ """Special form of dict for attachments."""
178
+
179
+ @classmethod
180
+ def __modify_schema__(cls, field_schema: dict[str, Any], field: pyd.fields.ModelField | None):
181
+ # This may be generalized later to combine, for example, enum descriptions and field descriptions to provide
182
+ # a better result.
183
+ field_description = field.field_info.description if field else ""
184
+ if field_description:
185
+ field_description = field_description.strip()
186
+ if not field_description.endswith("."):
187
+ field_description += "."
188
+ field_description += " "
189
+
190
+ field_schema["description"] = field_description + "Extra properties of string -> URL allowed."
191
+ field_schema["properties"] = {
192
+ k: {"type": "string", "format": "uri", "description": v} for k, v in ATTACHMENT_KNOWN_KEYS.items()
193
+ }
194
+ field_schema["additionalProperties"] = True
195
+
196
+
152
197
  class WithAttachmentsMixin(pyd.BaseModel):
153
198
  """Mixin for objects that can have attachments."""
154
199
 
155
- attachments: dict[Annotated[str, pyd.Field(max_length=200)], pyd.AnyUrl] | None = pyd.Field(
200
+ attachments: AttachmentDict = pyd.Field(
156
201
  description="Dict of URLs relevant to this entry",
157
202
  example={
158
203
  "Contact Us": "https://www.c-change-labs.com/en/contact-us/",
File without changes
File without changes
File without changes
File without changes