openepd 4.1.0__tar.gz → 4.2.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 (93) hide show
  1. {openepd-4.1.0 → openepd-4.2.0}/PKG-INFO +1 -1
  2. {openepd-4.1.0 → openepd-4.2.0}/pyproject.toml +1 -1
  3. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/__version__.py +1 -1
  4. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/base.py +22 -1
  5. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/common.py +4 -1
  6. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/finishes.py +0 -3
  7. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/wood.py +0 -4
  8. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/wood_joists.py +0 -2
  9. {openepd-4.1.0 → openepd-4.2.0}/LICENSE +0 -0
  10. {openepd-4.1.0 → openepd-4.2.0}/README.md +0 -0
  11. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/__init__.py +0 -0
  12. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/__init__.py +0 -0
  13. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/base_sync_client.py +0 -0
  14. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/category/__init__.py +0 -0
  15. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/category/dto.py +0 -0
  16. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/category/sync_api.py +0 -0
  17. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/common.py +0 -0
  18. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/dto/__init__.py +0 -0
  19. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/dto/base.py +0 -0
  20. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/dto/common.py +0 -0
  21. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/dto/meta.py +0 -0
  22. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/dto/mf.py +0 -0
  23. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/dto/params.py +0 -0
  24. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/epd/__init__.py +0 -0
  25. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/epd/dto.py +0 -0
  26. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/epd/sync_api.py +0 -0
  27. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/errors.py +0 -0
  28. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/pcr/__init__.py +0 -0
  29. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/pcr/sync_api.py +0 -0
  30. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/sync_client.py +0 -0
  31. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/test/__init__.py +0 -0
  32. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/api/utils.py +0 -0
  33. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/bundle/__init__.py +0 -0
  34. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/bundle/base.py +0 -0
  35. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/bundle/model.py +0 -0
  36. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/bundle/reader.py +0 -0
  37. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/bundle/writer.py +0 -0
  38. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/compat/__init__.py +0 -0
  39. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/compat/compat_functional_validators.py +0 -0
  40. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/compat/pydantic.py +0 -0
  41. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/__init__.py +0 -0
  42. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/category.py +0 -0
  43. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/common.py +0 -0
  44. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/epd.py +0 -0
  45. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/factory.py +0 -0
  46. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/lcia.py +0 -0
  47. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/org.py +0 -0
  48. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/pcr.py +0 -0
  49. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/README.md +0 -0
  50. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/__init__.py +0 -0
  51. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/asphalt.py +0 -0
  52. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/base.py +0 -0
  53. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/concrete.py +0 -0
  54. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/__init__.py +0 -0
  55. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/accessories.py +0 -0
  56. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/aggregates.py +0 -0
  57. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/aluminium.py +0 -0
  58. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/asphalt.py +0 -0
  59. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/bulk_materials.py +0 -0
  60. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/cast_decks_and_underlayment.py +0 -0
  61. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/cladding.py +0 -0
  62. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/cmu.py +0 -0
  63. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/concrete.py +0 -0
  64. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/conveying_equipment.py +0 -0
  65. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/electrical.py +0 -0
  66. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/electrical_transmission_and_distribution_equipment.py +0 -0
  67. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/electricity.py +0 -0
  68. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/enums.py +0 -0
  69. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/fire_and_smoke_protection.py +0 -0
  70. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/furnishings.py +0 -0
  71. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/grouting.py +0 -0
  72. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/manufacturing_inputs.py +0 -0
  73. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/masonry.py +0 -0
  74. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/material_handling.py +0 -0
  75. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/mechanical.py +0 -0
  76. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/mechanical_insulation.py +0 -0
  77. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/network_infrastructure.py +0 -0
  78. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/openings.py +0 -0
  79. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/other_electrical_equipment.py +0 -0
  80. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/other_materials.py +0 -0
  81. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/plumbing.py +0 -0
  82. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/precast_concrete.py +0 -0
  83. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/sheathing.py +0 -0
  84. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/steel.py +0 -0
  85. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/thermal_moisture_protection.py +0 -0
  86. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/specs/generated/utility_piping.py +0 -0
  87. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/standard.py +0 -0
  88. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/validation/__init__.py +0 -0
  89. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/validation/common.py +0 -0
  90. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/validation/numbers.py +0 -0
  91. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/validation/quantity.py +0 -0
  92. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/model/versioning.py +0 -0
  93. {openepd-4.1.0 → openepd-4.2.0}/src/openepd/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 4.1.0
3
+ Version: 4.2.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,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "openepd"
3
- version = "4.1.0"
3
+ version = "4.2.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>"]
@@ -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 = "4.1.0"
16
+ VERSION = "4.2.0"
@@ -56,7 +56,28 @@ def modify_pydantic_schema(schema_dict: dict, cls: type) -> dict:
56
56
  return schema_dict
57
57
 
58
58
 
59
- class BaseOpenEpdSchema(pyd.BaseModel):
59
+ class PydanticClassAttributeExposeModelMetaclass(pyd.main.ModelMetaclass):
60
+ """
61
+ Extension of the pydantic's ModelMetaclass which restores class attribute lookup for fields.
62
+
63
+ In pydantic, while the model fields are defined in the model as class-level attributes, in runtime they disappear
64
+ due to ModelMetaclass logic. ModelMetaclass takes the defined attributes, removes them from class dict and puts
65
+ into a special __fields__ attribute to avoid naming conflict.
66
+
67
+ We would like to be able to access the attributes via dot notation in the runtimes, since it makes refactoring
68
+ easier.
69
+
70
+ This class exposes the original fields when accessed via class name. For example, one can call `Pcr.name` and get
71
+ `ModelField`, in addition to calling `pcr.__fields__` on an instance.
72
+ """
73
+
74
+ def __getattr__(cls, name: str) -> Any:
75
+ if name in cls.__fields__:
76
+ return cls.__fields__[name]
77
+ return getattr(super, name)
78
+
79
+
80
+ class BaseOpenEpdSchema(pyd.BaseModel, metaclass=PydanticClassAttributeExposeModelMetaclass):
60
81
  """Base class for all OpenEPD models."""
61
82
 
62
83
  ext: dict[str, AnySerializable] | None = pyd.Field(alias="ext", default=None)
@@ -13,6 +13,7 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  #
16
+ from openepd.compat.pydantic import pyd
16
17
  from openepd.model.base import BaseOpenEpdSchema
17
18
  from openepd.model.org import OrgRef
18
19
 
@@ -20,4 +21,6 @@ from openepd.model.org import OrgRef
20
21
  class HasForestPracticesCertifiers(BaseOpenEpdSchema):
21
22
  """An interface for models which are linked to forest practices certifiers."""
22
23
 
23
- forest_practices_certifiers: list[OrgRef] | None
24
+ forest_practices_certifiers: list[OrgRef] | None = pyd.Field(
25
+ default=None, description="List of organizations that certify forest practices."
26
+ )
@@ -14,7 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
- from openepd.model.org import OrgRef
18
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
18
  from openepd.model.specs.generated.common import HasForestPracticesCertifiers
20
19
  from openepd.model.specs.generated.enums import (
@@ -179,7 +178,6 @@ class WoodFlooringV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
179
178
  thickness: LengthMmStr | None = pyd.Field(default=None, description="", example="10 mm")
180
179
  timber_species: WoodFlooringTimberSpecies | None = pyd.Field(default=None, description="", example="Oak")
181
180
  fabrication: WoodFlooringFabrication | None = pyd.Field(default=None, description="", example="Solid hardwood")
182
- forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
183
181
 
184
182
 
185
183
  class AcousticalCeilingsV1(BaseOpenEpdHierarchicalSpec):
@@ -425,7 +423,6 @@ class DeckingBoardsV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers)
425
423
  # Own fields:
426
424
  timber_species: SawnTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
427
425
  fabrication: AllFabrication | None = pyd.Field(default=None, description="", example="LVL")
428
- forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
429
426
  weather_exposed: bool | None = pyd.Field(default=None, description="", example=True)
430
427
  fire_retardant: bool | None = pyd.Field(default=None, description="", example=True)
431
428
  decay_resistant: bool | None = pyd.Field(default=None, description="", example=True)
@@ -14,7 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
- from openepd.model.org import OrgRef
18
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
18
  from openepd.model.specs.generated.common import HasForestPracticesCertifiers
20
19
  from openepd.model.specs.generated.enums import (
@@ -154,9 +153,6 @@ class WoodV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
154
153
  default=None, description="Timber species", example="Alaska Cedar"
155
154
  )
156
155
  fabrication: AllFabrication | None = pyd.Field(default=None, description="Timber fabrication", example="LVL")
157
- forest_practices_certifiers: list[OrgRef] | None = pyd.Field(
158
- default=None, description="List of organizations that certify forest practices."
159
- )
160
156
  weather_exposed: bool | None = pyd.Field(default=None, description="Weather exposed", example=True)
161
157
  fire_retardant: bool | None = pyd.Field(default=None, description="Fire retardant", example=True)
162
158
  decay_resistant: bool | None = pyd.Field(default=None, description="Decay resistant", example=True)
@@ -14,7 +14,6 @@
14
14
  # limitations under the License.
15
15
  #
16
16
  from openepd.compat.pydantic import pyd
17
- from openepd.model.org import OrgRef
18
17
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
19
18
  from openepd.model.specs.generated.common import HasForestPracticesCertifiers
20
19
  from openepd.model.specs.generated.enums import AllFabrication, AllTimberSpecies
@@ -33,7 +32,6 @@ class WoodJoistsV1(BaseOpenEpdHierarchicalSpec, HasForestPracticesCertifiers):
33
32
  # Own fields:
34
33
  timber_species: AllTimberSpecies | None = pyd.Field(default=None, description="", example="Alaska Cedar")
35
34
  fabrication: AllFabrication | None = pyd.Field(default=None, description="", example="LVL")
36
- forest_practices_certifiers: list[OrgRef] | None = pyd.Field(default=None, description="")
37
35
  weather_exposed: bool | None = pyd.Field(default=None, description="", example=True)
38
36
  fire_retardant: bool | None = pyd.Field(default=None, description="", example=True)
39
37
  decay_resistant: bool | None = pyd.Field(default=None, description="", example=True)
File without changes
File without changes
File without changes
File without changes