openepd 6.3.0__tar.gz → 6.4.0__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 (139) hide show
  1. {openepd-6.3.0 → openepd-6.4.0}/PKG-INFO +2 -1
  2. {openepd-6.3.0 → openepd-6.4.0}/pyproject.toml +7 -1
  3. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/__version__.py +1 -1
  4. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/declaration.py +1 -1
  5. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/epd.py +7 -0
  6. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/org.py +24 -1
  7. {openepd-6.3.0 → openepd-6.4.0}/LICENSE +0 -0
  8. {openepd-6.3.0 → openepd-6.4.0}/README.md +0 -0
  9. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/__init__.py +0 -0
  10. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/__init__.py +0 -0
  11. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/average_dataset/__init__.py +0 -0
  12. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/average_dataset/generic_estimate_sync_api.py +0 -0
  13. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/average_dataset/industry_epd_sync_api.py +0 -0
  14. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/base_sync_client.py +0 -0
  15. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/category/__init__.py +0 -0
  16. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/category/dto.py +0 -0
  17. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/category/sync_api.py +0 -0
  18. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/common.py +0 -0
  19. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/dto/__init__.py +0 -0
  20. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/dto/base.py +0 -0
  21. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/dto/common.py +0 -0
  22. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/dto/meta.py +0 -0
  23. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/dto/mf.py +0 -0
  24. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/dto/params.py +0 -0
  25. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/epd/__init__.py +0 -0
  26. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/epd/dto.py +0 -0
  27. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/epd/sync_api.py +0 -0
  28. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/errors.py +0 -0
  29. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/pcr/__init__.py +0 -0
  30. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/pcr/sync_api.py +0 -0
  31. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/sync_client.py +0 -0
  32. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/test/__init__.py +0 -0
  33. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/api/utils.py +0 -0
  34. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/bundle/__init__.py +0 -0
  35. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/bundle/base.py +0 -0
  36. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/bundle/model.py +0 -0
  37. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/bundle/reader.py +0 -0
  38. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/bundle/writer.py +0 -0
  39. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/compat/__init__.py +0 -0
  40. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/compat/compat_functional_validators.py +0 -0
  41. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/compat/pydantic.py +0 -0
  42. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/__init__.py +0 -0
  43. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/base.py +0 -0
  44. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/category.py +0 -0
  45. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/common.py +0 -0
  46. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/factory.py +0 -0
  47. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/generic_estimate.py +0 -0
  48. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/geography.py +0 -0
  49. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/industry_epd.py +0 -0
  50. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/lcia.py +0 -0
  51. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/pcr.py +0 -0
  52. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/README.md +0 -0
  53. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/__init__.py +0 -0
  54. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/asphalt.py +0 -0
  55. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/base.py +0 -0
  56. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/concrete.py +0 -0
  57. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/enums.py +0 -0
  58. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/__init__.py +0 -0
  59. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/accessories.py +0 -0
  60. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/aggregates.py +0 -0
  61. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/aluminium.py +0 -0
  62. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/asphalt.py +0 -0
  63. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/bulk_materials.py +0 -0
  64. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/cast_decks_and_underlayment.py +0 -0
  65. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/cladding.py +0 -0
  66. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/cmu.py +0 -0
  67. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/concrete.py +0 -0
  68. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/conveying_equipment.py +0 -0
  69. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/electrical.py +0 -0
  70. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/electrical_transmission_and_distribution_equipment.py +0 -0
  71. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/electricity.py +0 -0
  72. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/finishes.py +0 -0
  73. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/fire_and_smoke_protection.py +0 -0
  74. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/furnishings.py +0 -0
  75. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/grouting.py +0 -0
  76. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/manufacturing_inputs.py +0 -0
  77. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/masonry.py +0 -0
  78. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/material_handling.py +0 -0
  79. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/mechanical.py +0 -0
  80. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/mechanical_insulation.py +0 -0
  81. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/network_infrastructure.py +0 -0
  82. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/openings.py +0 -0
  83. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/other_electrical_equipment.py +0 -0
  84. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/other_materials.py +0 -0
  85. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/plumbing.py +0 -0
  86. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/precast_concrete.py +0 -0
  87. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/sheathing.py +0 -0
  88. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/steel.py +0 -0
  89. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/thermal_moisture_protection.py +0 -0
  90. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/utility_piping.py +0 -0
  91. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/wood.py +0 -0
  92. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/range/wood_joists.py +0 -0
  93. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/__init__.py +0 -0
  94. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/accessories.py +0 -0
  95. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/aggregates.py +0 -0
  96. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/aluminium.py +0 -0
  97. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/asphalt.py +0 -0
  98. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/bulk_materials.py +0 -0
  99. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/cast_decks_and_underlayment.py +0 -0
  100. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/cladding.py +0 -0
  101. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/cmu.py +0 -0
  102. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/common.py +0 -0
  103. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/concrete.py +0 -0
  104. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/conveying_equipment.py +0 -0
  105. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/electrical.py +0 -0
  106. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/electrical_transmission_and_distribution_equipment.py +0 -0
  107. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/electricity.py +0 -0
  108. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/finishes.py +0 -0
  109. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/fire_and_smoke_protection.py +0 -0
  110. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/furnishings.py +0 -0
  111. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/grouting.py +0 -0
  112. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/manufacturing_inputs.py +0 -0
  113. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/masonry.py +0 -0
  114. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/material_handling.py +0 -0
  115. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/mechanical.py +0 -0
  116. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/mechanical_insulation.py +0 -0
  117. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/mixins/__init__.py +0 -0
  118. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/mixins/conduit_mixin.py +0 -0
  119. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/network_infrastructure.py +0 -0
  120. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/openings.py +0 -0
  121. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/other_electrical_equipment.py +0 -0
  122. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/other_materials.py +0 -0
  123. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/plumbing.py +0 -0
  124. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/precast_concrete.py +0 -0
  125. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/sheathing.py +0 -0
  126. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/steel.py +0 -0
  127. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/thermal_moisture_protection.py +0 -0
  128. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/utility_piping.py +0 -0
  129. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/wood.py +0 -0
  130. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/specs/singular/wood_joists.py +0 -0
  131. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/standard.py +0 -0
  132. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/validation/__init__.py +0 -0
  133. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/validation/common.py +0 -0
  134. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/validation/enum.py +0 -0
  135. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/validation/numbers.py +0 -0
  136. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/validation/quantity.py +0 -0
  137. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/model/versioning.py +0 -0
  138. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/patch_pydantic.py +0 -0
  139. {openepd-6.3.0 → openepd-6.4.0}/src/openepd/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 6.3.0
3
+ Version: 6.4.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
@@ -20,6 +20,7 @@ Provides-Extra: api-client
20
20
  Requires-Dist: email-validator (>=1.3.1)
21
21
  Requires-Dist: idna (>=3.7)
22
22
  Requires-Dist: open-xpd-uuid (>=0.2.1,<0.3.0)
23
+ Requires-Dist: openlocationcode (>=1.0.1)
23
24
  Requires-Dist: pydantic (>=1.10,<3.0)
24
25
  Requires-Dist: requests (>=2.0) ; extra == "api-client"
25
26
  Project-URL: Repository, https://github.com/cchangelabs/openepd
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "openepd"
3
- version = "6.3.0"
3
+ version = "6.4.0"
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>"]
@@ -26,6 +26,7 @@ email-validator = ">=1.3.1"
26
26
  requests = { version = ">=2.0", optional = true }
27
27
  idna = ">=3.7"
28
28
  open-xpd-uuid = "~=0.2.1"
29
+ openlocationcode = ">=1.0.1"
29
30
 
30
31
  # Optional dependencies
31
32
  # lxml = { version = "~=4.9.2", optional = true }
@@ -140,3 +141,8 @@ exclude = ["test_.*\\.py$", ]
140
141
  module = []
141
142
  ignore_missing_imports = true
142
143
  follow_imports = "skip"
144
+
145
+
146
+ [[tool.mypy.overrides]]
147
+ module = "openlocationcode.*"
148
+ ignore_missing_imports = true
@@ -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.3.0"
16
+ VERSION = "6.4.0"
@@ -84,7 +84,7 @@ class BaseDeclaration(RootDocument, abc.ABC):
84
84
  description="Language this document is captured in, as an ISO 639-1 code",
85
85
  example="en",
86
86
  )
87
- private: bool = pyd.Field(
87
+ private: bool | None = pyd.Field(
88
88
  default=False,
89
89
  description="This document's author does not wish the contents published. "
90
90
  "Useful for draft, partial, or confidential declarations. "
@@ -23,6 +23,7 @@ from openepd.model.declaration import (
23
23
  THIRD_PARTY_VERIFIER_DESCRIPTION,
24
24
  BaseDeclaration,
25
25
  OriginalDataFormat,
26
+ RefBase,
26
27
  WithEpdDeveloperMixin,
27
28
  WithProgramOperatorMixin,
28
29
  WithVerifierMixin,
@@ -120,6 +121,12 @@ class Ec3EpdExtension(BaseOpenEpdSchema):
120
121
  original_data_format: OriginalDataFormat | None = pyd.Field(default=None)
121
122
 
122
123
 
124
+ class EpdRef(RefBase, title="EPD (Ref)"):
125
+ """Reference (short) version of EPD object."""
126
+
127
+ pass
128
+
129
+
123
130
  class EpdPreviewV0(
124
131
  WithAttachmentsMixin,
125
132
  WithProgramOperatorMixin,
@@ -15,6 +15,8 @@
15
15
  #
16
16
  from typing import Annotated, Optional
17
17
 
18
+ from openlocationcode import openlocationcode
19
+
18
20
  from openepd.compat.pydantic import pyd
19
21
  from openepd.model.base import BaseOpenEpdSchema
20
22
  from openepd.model.common import Location, WithAltIdsMixin, WithAttachmentsMixin
@@ -77,6 +79,12 @@ class Plant(WithAttachmentsMixin, WithAltIdsMixin, BaseOpenEpdSchema):
77
79
  deprecated="Pluscode field is deprecated. If users need a pluscode they can obtain it from "
78
80
  "`id` like this: `id.spit('.', maxsplit=1)[0]`",
79
81
  )
82
+ latitude: float | None = pyd.Field(
83
+ default=None, description="(deprecated) Latitude of the plant location. Use 'location' fields instead."
84
+ )
85
+ longitude: float | None = pyd.Field(
86
+ default=None, description="(deprecated) Longitude of the plant location. Use 'location' fields instead."
87
+ )
80
88
  owner: Org | None = pyd.Field(description="Organization that owns the plant", default=None)
81
89
  name: str | None = pyd.Field(
82
90
  max_length=200,
@@ -87,17 +95,32 @@ class Plant(WithAttachmentsMixin, WithAltIdsMixin, BaseOpenEpdSchema):
87
95
  address: str | None = pyd.Field(
88
96
  max_length=200,
89
97
  default=None,
90
- description="Text address, preferably geocoded",
98
+ description="(deprecated) Text address, preferably geocoded. Use 'location' fields instead",
91
99
  example="1503 Orchard Hill Rd, LaGrange, GA 30240, United States",
92
100
  )
93
101
  contact_email: pyd.EmailStr | None = pyd.Field(
94
102
  description="Email contact", example="info@interface.com", default=None
95
103
  )
104
+ location: Location | None = pyd.Field(description="Location of the plant", default=None)
96
105
 
97
106
  @classmethod
98
107
  def get_asset_type(cls) -> str | None:
99
108
  """Return the asset type of this class (see BaseOpenEpdSchema.get_asset_type for details)."""
100
109
  return "org"
101
110
 
111
+ @pyd.validator("id")
112
+ def _validate_id(cls, v: str) -> str:
113
+ try:
114
+ pluscode, web_domain = v.split(".", maxsplit=1)
115
+ except ValueError as e:
116
+ raise ValueError("Incorrectly formed id: should be pluscode.owner_web_domain") from e
117
+
118
+ if not openlocationcode.isValid(pluscode):
119
+ raise ValueError("Incorrect pluscode for plant")
120
+
121
+ if not web_domain:
122
+ raise ValueError("Incorrect web_domain for plant")
123
+ return v
124
+
102
125
  class Config(BaseOpenEpdSchema.Config):
103
126
  allow_population_by_field_name = True
File without changes
File without changes
File without changes
File without changes