openepd 1.7.2__py3-none-any.whl → 1.9.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
@@ -17,4 +17,4 @@
17
17
  # Charles Pankow Foundation, Microsoft Sustainability Fund, Interface, MKA Foundation, and others.
18
18
  # Find out more at www.BuildingTransparency.org
19
19
  #
20
- VERSION = "1.7.2"
20
+ VERSION = "1.9.0"
openepd/api/dto/common.py CHANGED
@@ -111,4 +111,7 @@ class OpenEpdApiResponse(GenericModel, BaseOpenEpdApiModel, Generic[TPayload, TM
111
111
  """Standard DTO representing response from OpenEPD API server."""
112
112
 
113
113
  payload: TPayload
114
- meta: TMeta
114
+ # there is an issue with using covariant type variables as parameters when used for container mutable types,
115
+ # as described in https://github.com/python/mypy/issues/7049
116
+ # However, in our workflow TMeta is not a container type which is further returned back to caller.
117
+ meta: TMeta # type: ignore[misc]
openepd/api/epd/dto.py CHANGED
@@ -37,20 +37,34 @@ class StatisticsDto(BaseOpenEpdApiModel):
37
37
  """
38
38
 
39
39
  # percentiles
40
- pct10_gwp: float = pyd.Field("10th percentile GWP for this statistics measured in kgCO2e per declared unit")
40
+ pct10_gwp: float = pyd.Field(
41
+ description="10th percentile GWP for this statistics measured in kgCO2e per declared unit"
42
+ )
41
43
  achievable_target: float = pyd.Field(
42
44
  description="Achievable target. 20th percentile of GWP measured in kgCO2e per declared unit", example=445.65
43
45
  )
44
- pct30_gwp: float = pyd.Field("30th percentile GWP for this statistics measured in kgCO2e per declared unit")
45
- pct40_gwp: float = pyd.Field("40th percentile GWP for this statistics measured in kgCO2e per declared unit")
46
- pct50_gwp: float = pyd.Field("50th percentile GWP for this statistics measured in kgCO2e per declared unit")
47
- pct60_gwp: float = pyd.Field("60th percentile GWP for this statistics measured in kgCO2e per declared unit")
48
- pct70_gwp: float = pyd.Field("70th percentile GWP for this statistics measured in kgCO2e per declared unit")
46
+ pct30_gwp: float = pyd.Field(
47
+ description="30th percentile GWP for this statistics measured in kgCO2e per declared unit"
48
+ )
49
+ pct40_gwp: float = pyd.Field(
50
+ description="40th percentile GWP for this statistics measured in kgCO2e per declared unit"
51
+ )
52
+ pct50_gwp: float = pyd.Field(
53
+ description="50th percentile GWP for this statistics measured in kgCO2e per declared unit"
54
+ )
55
+ pct60_gwp: float = pyd.Field(
56
+ description="60th percentile GWP for this statistics measured in kgCO2e per declared unit"
57
+ )
58
+ pct70_gwp: float = pyd.Field(
59
+ description="70th percentile GWP for this statistics measured in kgCO2e per declared unit"
60
+ )
49
61
  conservative_estimate: float = pyd.Field(
50
62
  description="Conservative estimate. 80th percentile of GWP per declared unit measured in kgCO2e",
51
63
  example=640.778,
52
64
  )
53
- pct90_gwp: float = pyd.Field("70th percentile GWP for this statistics measured in kgCO2e per declared unit")
65
+ pct90_gwp: float = pyd.Field(
66
+ description="70th percentile GWP for this statistics measured in kgCO2e per declared unit"
67
+ )
54
68
 
55
69
  # stats
56
70
  average: float = pyd.Field(description="Average GWP in kgCO2e per declared unit", example=554.2)
openepd/api/pcr/dto.py CHANGED
@@ -25,15 +25,14 @@ from openepd.api.dto.base import BaseOpenEpdApiModel
25
25
  class PcrRef(BaseOpenEpdApiModel):
26
26
  """Reference to a PCR."""
27
27
 
28
- id: str = pyd.Field(
28
+ id: str | None = pyd.Field(
29
29
  description="The unique ID for this PCR. To ensure global uniqueness, should be registered "
30
30
  "at open-xpd-uuid.cqd.io/register or a coordinating registry.",
31
31
  example="ec3xpgq2",
32
32
  default=None,
33
33
  )
34
- name: str = pyd.Field(
34
+ name: str | None = pyd.Field(
35
35
  max_length=200,
36
- default=None,
37
36
  description="Full document name as listed in source document",
38
37
  example="c-PCR-003 Concrete and concrete elements (EN 16757)",
39
38
  )
openepd/model/epd.py CHANGED
@@ -55,7 +55,7 @@ class EpdV0(WithAttachmentsMixin, WithAltIdsMixin, BaseEpd):
55
55
  default=None,
56
56
  )
57
57
  product_name: str | None = pyd.Field(
58
- max_length=200, description="The name of the product described by this EPD", example="Mix 12345AC"
58
+ max_length=200, description="The name of the product described by this EPD", example="Mix 12345AC", default=None
59
59
  )
60
60
  product_sku: str | None = pyd.Field(
61
61
  max_length=200, description="Unique stock keeping identifier assigned by manufacturer"
openepd/model/org.py CHANGED
@@ -29,8 +29,8 @@ from openepd.model.validation.common import ReferenceStr
29
29
  class OrgRef(BaseOpenEpdSchema):
30
30
  """Represents Organisation with minimal data."""
31
31
 
32
- web_domain: str = pyd.Field(
33
- description="A web domain owned by organization. Typically is the org's home website address"
32
+ web_domain: str | None = pyd.Field(
33
+ description="A web domain owned by organization. Typically is the org's home website address", default=None
34
34
  )
35
35
  name: str | None = pyd.Field(
36
36
  max_length=200,
@@ -43,6 +43,13 @@ class AciExposureClass(StrEnum):
43
43
  * `aci.S1` - Exposed to <1500 ppm of SO4 in water and <0.2% SO4 in soil
44
44
  * `aci.S2` - Exposed to <10000 ppm of SO4 in water and <2% SO4 in soil
45
45
  * `aci.S3` - Exposed to >10000 ppm of SO4 in water or >2% SO4 in soil
46
+
47
+ * `aci.C1` - Concrete in contact with moisture, but the external source of chloride does not reach it.
48
+ * `aci.C2` - Concrete subjected to moisture and an external source of chlorides such as deicing chemicals,
49
+ salt, brackish water, seawater, or spray from these sources.
50
+ * `aci.W0` - Concrete dry in service
51
+ * `aci.W1` - Concrete in contact with water, no requirement for low permeability
52
+ * `aci.W2` - Concrete in contact with water where low permeability is required
46
53
  """
47
54
 
48
55
  F0 = "aci.F0"
@@ -53,6 +60,11 @@ class AciExposureClass(StrEnum):
53
60
  S1 = "aci.S1"
54
61
  S2 = "aci.S2"
55
62
  S3 = "aci.S3"
63
+ C1 = "aci.C1"
64
+ C2 = "aci.C2"
65
+ W0 = "aci.W0"
66
+ W1 = "aci.W1"
67
+ W2 = "aci.W2"
56
68
 
57
69
 
58
70
  class CsaExposureClass(StrEnum):
@@ -357,39 +369,71 @@ class ConcreteV1Options(BaseOpenEpdSchema):
357
369
  fiber_reinforced: bool | None = pyd.Field(description="Fiber reinforced", default=None)
358
370
 
359
371
 
360
- class ConcreteV1Mixin(BaseOpenEpdHierarchicalSpec):
361
- """Concrete common properties mixin."""
372
+ class ReadyMixV1(BaseOpenEpdHierarchicalSpec):
373
+ """Concretes to be mixed and then poured on-site."""
362
374
 
363
- strength_28d: PressureMPaStr | None = pyd.Field(
364
- default=None, example="30 MPa", description="Concrete strength after 28 days"
365
- )
366
- w_c_ratio: RatioFloat | None = pyd.Field(description="Ratio of water to cement", example=0.3, default=None)
367
- aci_exposure_classes: list[AciExposureClass] = pyd.Field(
368
- description=(AciExposureClass.__doc__ or "").lstrip(), default=None
369
- )
370
- csa_exposure_classes: list[CsaExposureClass] = pyd.Field(
371
- description=(CsaExposureClass.__doc__ or "").lstrip(), default=None
372
- )
373
- en_exposure_classes: list[EnExposureClass] = pyd.Field(
374
- description=(EnExposureClass.__doc__ or "").lstrip(), default=None
375
- )
376
- cementitious: Cementitious | None = pyd.Field(
377
- default=None,
378
- description="List of cementitious materials, and proportion by mass. Each field is 0 to 1.",
379
- )
380
- application: TypicalApplication | None = pyd.Field(description="Typical Application", default=None)
381
- options: ConcreteV1Options = pyd.Field(description="Concrete options", default=None)
375
+ _EXT_VERSION = "1.0"
382
376
 
383
- _compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True, check_fields=False)(
384
- validate_unit_factory(OpenEPDUnit.MPa)
385
- )
386
377
 
378
+ class FlowableFillV1(BaseOpenEpdHierarchicalSpec):
379
+ """
380
+ Flowable fill is a slurry that is placed as a flowable liquid (high slump) and sets with no compaction.
381
+
382
+ It is often used in tight or restricted access areas where placing and compacting
383
+ fill is difficult. Applications include filling large voids such as abandoned underground storage
384
+ tanks, basements, tunnels, mines, and sewers. It can also be used as paving sub-base, bridge
385
+ abutment, and retaining wall backfill. Also called Controlled Density Fill (CDF) or Controlled
386
+ Low Strength Materials (CLSMs). These materials typically have compressive strengths
387
+ under 1200 psi.
388
+ """
389
+
390
+ _EXT_VERSION = "1.0"
391
+
392
+
393
+ class OilPatchV1(BaseOpenEpdHierarchicalSpec):
394
+ """
395
+ Concretes for use in petroleum extraction wells and similar applications.
396
+
397
+ Includes foamed cement; often called cement in the drilling industry. Differs from
398
+ flowable fill and grout in that it contains no sand or other aggregates.
399
+ """
400
+
401
+ _EXT_VERSION = "1.0"
402
+
403
+
404
+ class ConcretePavingV1(BaseOpenEpdHierarchicalSpec):
405
+ """Concrete paving."""
406
+
407
+ _EXT_VERSION = "1.0"
408
+
409
+
410
+ class ShotcreteV1(BaseOpenEpdHierarchicalSpec):
411
+ """Concretes sprayed on a target."""
412
+
413
+ _EXT_VERSION = "1.0"
414
+
415
+
416
+ class CementGroutV1(BaseOpenEpdHierarchicalSpec):
417
+ """
418
+ Cement grouting is a slurry that is placed as a flowable liquid.
419
+
420
+ It is an effective material for filling and
421
+ strengthening granular soils, voids in rocks, foundation underpinnings, and other underground voids. Also called
422
+ structural grout, these materials typically impart significant compressive strength to the system.
423
+
424
+ """
425
+
426
+ _EXT_VERSION = "1.0"
387
427
 
388
- class ConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
428
+
429
+ class ConcreteV1(BaseOpenEpdHierarchicalSpec):
389
430
  """Concrete spec."""
390
431
 
391
432
  _EXT_VERSION = "1.0"
392
433
 
434
+ strength_28d: PressureMPaStr | None = pyd.Field(
435
+ default=None, example="30 MPa", description="Concrete strength after 28 days"
436
+ )
393
437
  strength_early: PressureMPaStr | None = pyd.Field(
394
438
  default=None,
395
439
  example="30 MPa",
@@ -405,7 +449,34 @@ class ConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
405
449
  default=None, description="Test Day for the Late Strength"
406
450
  )
407
451
  slump: LengthMmStr | None = pyd.Field(description="Minimum test slump", example="40 mm", default=None)
452
+ w_c_ratio: RatioFloat | None = pyd.Field(description="Ratio of water to cement", example=0.3, default=None)
453
+ aci_exposure_classes: list[AciExposureClass] = pyd.Field(
454
+ description=(AciExposureClass.__doc__ or "").lstrip(), default_factory=list
455
+ )
456
+ csa_exposure_classes: list[CsaExposureClass] = pyd.Field(
457
+ description=(CsaExposureClass.__doc__ or "").lstrip(), default_factory=list
458
+ )
459
+ en_exposure_classes: list[EnExposureClass] = pyd.Field(
460
+ description=(EnExposureClass.__doc__ or "").lstrip(), default_factory=list
461
+ )
462
+ cementitious: Cementitious | None = pyd.Field(
463
+ default=None,
464
+ description="List of cementitious materials, and proportion by mass. Each field is 0 to 1.",
465
+ )
466
+ application: TypicalApplication | None = pyd.Field(description="Typical Application", default=None)
467
+ options: ConcreteV1Options | None = pyd.Field(description="Concrete options", default=None)
468
+
469
+ # Nested specs
470
+ ReadyMix: ReadyMixV1 | None = None
471
+ FlowableFill: FlowableFillV1 | None = None
472
+ OilPatch: OilPatchV1 | None = None
473
+ ConcretePaving: ConcretePavingV1 | None = None
474
+ Shotcrete: ShotcreteV1 | None = None
475
+ CementGrout: CementGroutV1 | None = None
408
476
 
477
+ _compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True, check_fields=False)(
478
+ validate_unit_factory(OpenEPDUnit.MPa)
479
+ )
409
480
  _strength_early_unit_validator = pyd.validator("strength_early", allow_reuse=True)(
410
481
  validate_unit_factory(OpenEPDUnit.MPa)
411
482
  )
@@ -424,10 +495,26 @@ class ConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
424
495
  return values
425
496
 
426
497
 
427
- class PrecastConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
498
+ class PrecastConcreteV1(BaseOpenEpdHierarchicalSpec):
428
499
  """Precast Concrete spec."""
429
500
 
430
501
  _EXT_VERSION = "1.0"
431
502
 
503
+ strength_28d: PressureMPaStr | None = pyd.Field(
504
+ default=None, example="30 MPa", description="Concrete strength after 28 days"
505
+ )
506
+
507
+ lightweight: bool | None = pyd.Field(description="Lightweight", default=None)
508
+ steel_mass_percentage: RatioFloat | None = pyd.Field(
509
+ default=None,
510
+ description="Percent of total mass that is steel reinforcement. Steel reinforcement "
511
+ "substantially changes functional performance and usually adds substantial GWP "
512
+ "per declared unit.",
513
+ )
514
+
432
515
  insulated: bool | None = pyd.Field(description="Insulated", default=None)
433
516
  gfrc: bool | None = pyd.Field(description="Glass Fiber Reinforced Concrete", default=None)
517
+
518
+ _compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True)(
519
+ validate_unit_factory(OpenEPDUnit.MPa)
520
+ )
@@ -21,12 +21,13 @@ from enum import StrEnum
21
21
 
22
22
  import pydantic as pyd
23
23
 
24
+ from openepd.model.base import BaseOpenEpdSchema
24
25
  from openepd.model.specs.base import BaseOpenEpdHierarchicalSpec
25
26
  from openepd.model.validation.numbers import PositiveInt, RatioFloat
26
27
  from openepd.model.validation.quantity import HeatConductanceUCIStr, LengthMmStr, PressureMPaStr, QuantityStr
27
28
 
28
29
 
29
- class SolarHeatGainMixin(BaseOpenEpdHierarchicalSpec):
30
+ class SolarHeatGainMixin(BaseOpenEpdSchema):
30
31
  """Solar heat gain mixin."""
31
32
 
32
33
  solar_heat_gain: RatioFloat | None = pyd.Field(
@@ -38,7 +39,7 @@ class SolarHeatGainMixin(BaseOpenEpdHierarchicalSpec):
38
39
  )
39
40
 
40
41
 
41
- class GlazingOptionsMixin(BaseOpenEpdHierarchicalSpec):
42
+ class GlazingOptionsMixin(BaseOpenEpdSchema):
42
43
  """Glazing options mixin."""
43
44
 
44
45
  low_emissivity: bool | None = pyd.Field(default=None, description="Low Emissivity coatings")
@@ -80,7 +81,7 @@ class GlazingOptionsMixin(BaseOpenEpdHierarchicalSpec):
80
81
  )
81
82
 
82
83
 
83
- class GlassPanesMixin(BaseOpenEpdHierarchicalSpec):
84
+ class GlassPanesMixin(BaseOpenEpdSchema):
84
85
  """Glass panes mixin."""
85
86
 
86
87
  glass_panes: PositiveInt | None = pyd.Field(
@@ -90,7 +91,7 @@ class GlassPanesMixin(BaseOpenEpdHierarchicalSpec):
90
91
  )
91
92
 
92
93
 
93
- class DPRatingMixin(BaseOpenEpdHierarchicalSpec):
94
+ class DPRatingMixin(BaseOpenEpdSchema):
94
95
  """Differential pressure rating mixin."""
95
96
 
96
97
  dp_rating: PressureMPaStr | None = pyd.Field(
@@ -98,7 +99,7 @@ class DPRatingMixin(BaseOpenEpdHierarchicalSpec):
98
99
  )
99
100
 
100
101
 
101
- class AirInfiltrationMixin(BaseOpenEpdHierarchicalSpec):
102
+ class AirInfiltrationMixin(BaseOpenEpdSchema):
102
103
  """Air infiltration mixin."""
103
104
 
104
105
  air_infiltration: QuantityStr | None = pyd.Field(
@@ -108,7 +109,7 @@ class AirInfiltrationMixin(BaseOpenEpdHierarchicalSpec):
108
109
  )
109
110
 
110
111
 
111
- class AssemblyUFactorMixin(BaseOpenEpdHierarchicalSpec):
112
+ class AssemblyUFactorMixin(BaseOpenEpdSchema):
112
113
  """Assembly U factor mixin."""
113
114
 
114
115
  assembly_u_factor: HeatConductanceUCIStr | None = pyd.Field(
@@ -118,7 +119,7 @@ class AssemblyUFactorMixin(BaseOpenEpdHierarchicalSpec):
118
119
  )
119
120
 
120
121
 
121
- class GlassIntendedApplicationMixin(BaseOpenEpdHierarchicalSpec):
122
+ class GlassIntendedApplicationMixin(BaseOpenEpdSchema):
122
123
  """Glass intended application mixin."""
123
124
 
124
125
  glazing_intended_application_curtain_wall: bool | None = pyd.Field(
@@ -165,13 +166,13 @@ class ThermalSeparationEnum(StrEnum):
165
166
  NON_METAL = "Nonmetal"
166
167
 
167
168
 
168
- class ThermalSeparationMixin(BaseOpenEpdHierarchicalSpec):
169
+ class ThermalSeparationMixin(BaseOpenEpdSchema):
169
170
  """Thermal separation mixin."""
170
171
 
171
172
  thermal_separation: ThermalSeparationEnum | None = pyd.Field(default=None, description="Thermal separation.")
172
173
 
173
174
 
174
- class HurricaneResistantMixin(BaseOpenEpdHierarchicalSpec):
175
+ class HurricaneResistantMixin(BaseOpenEpdSchema):
175
176
  """Hurricane resistant mixin."""
176
177
 
177
178
  hurricane_resistant: bool | None = pyd.Field(
@@ -50,12 +50,16 @@ class SteelComposition(StrEnum):
50
50
  class FabricatedOptionsMixin(pyd.BaseModel):
51
51
  """Fabricated options mixin."""
52
52
 
53
+ _EXT_VERSION = "1.0"
54
+
53
55
  fabricated: bool | None = pyd.Field(default=None, description="Fabricated")
54
56
 
55
57
 
56
58
  class WireMeshSteelV1(BaseOpenEpdHierarchicalSpec):
57
59
  """Spec for wire mesh steel."""
58
60
 
61
+ _EXT_VERSION = "1.0"
62
+
59
63
  class Options(BaseOpenEpdSchema, FabricatedOptionsMixin):
60
64
  """Wire Mesh Options."""
61
65
 
@@ -115,6 +119,8 @@ class RebarSteelV1(BaseOpenEpdHierarchicalSpec):
115
119
  class PlateSteelV1(BaseOpenEpdHierarchicalSpec):
116
120
  """Plate Steel Spec."""
117
121
 
122
+ _EXT_VERSION = "1.0"
123
+
118
124
  class Options(BaseOpenEpdSchema, FabricatedOptionsMixin):
119
125
  """Plate Steel Options."""
120
126
 
@@ -126,6 +132,8 @@ class PlateSteelV1(BaseOpenEpdHierarchicalSpec):
126
132
  class HollowV1(BaseOpenEpdHierarchicalSpec):
127
133
  """Hollow Sections Spec."""
128
134
 
135
+ _EXT_VERSION = "1.0"
136
+
129
137
  class Options(FabricatedOptionsMixin, BaseOpenEpdSchema):
130
138
  """Hollow Sections Options."""
131
139
 
@@ -137,6 +145,8 @@ class HollowV1(BaseOpenEpdHierarchicalSpec):
137
145
  class HotRolledV1(BaseOpenEpdHierarchicalSpec):
138
146
  """Hot Rolled spec."""
139
147
 
148
+ _EXT_VERSION = "1.0"
149
+
140
150
  class Options(FabricatedOptionsMixin, BaseOpenEpdSchema):
141
151
  """Hot Rolled options."""
142
152
 
@@ -69,7 +69,9 @@ def validate_unit_factory(dimensionality: OpenEPDUnit | str):
69
69
  # for abitrary non-standard quantity
70
70
  QuantityStr: TypeAlias = Annotated[str, pyd.Field()]
71
71
  PressureMPaStr: TypeAlias = Annotated[str, pyd.Field(example="30 MPa")]
72
+ MassKgStr: TypeAlias = Annotated[str, pyd.Field(example="30 kg")]
72
73
  LengthMmStr: TypeAlias = Annotated[str, pyd.Field(example="30 mm")]
74
+ AreaM2Str: TypeAlias = Annotated[str, pyd.Field(example="12 m2")]
73
75
  LengthMStr: TypeAlias = Annotated[str, pyd.Field(example="30 m")]
74
76
  TemperatureCStr: TypeAlias = Annotated[str, pyd.Field(example="45 C")]
75
77
  HeatConductanceUCIStr: TypeAlias = Annotated[str, pyd.Field(example="0.3 U")]
@@ -37,7 +37,8 @@ class WithExtVersionMixin(ABC, BaseModel):
37
37
  if hasattr(cls, "_EXT_VERSION"):
38
38
  cls.__fields__["ext_version"].default = cls._EXT_VERSION
39
39
 
40
- ext_version: str = pyd.Field(description="Extension version", example="3.22", default=None)
40
+ # Note: default is set programmatically in __init_subclass__
41
+ ext_version: str | None = pyd.Field(description="Extension version", example="3.22", default=None)
41
42
 
42
43
 
43
44
  class Version(NamedTuple):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: openepd
3
- Version: 1.7.2
3
+ Version: 1.9.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,5 +1,5 @@
1
1
  openepd/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
2
- openepd/__version__.py,sha256=9FquB-XwiRFJr8VpeRFuHdH0xZAZt8SubHoyOLnGSOM,855
2
+ openepd/__version__.py,sha256=jnF1KQQH-oe7r7Nthg1ws4gaTnagjiXOX84RVcGM0XA,855
3
3
  openepd/api/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
4
4
  openepd/api/base_sync_client.py,sha256=JcNpWsGoIK_1Eg27CAQd7nIjbcfD56jQ1nS6B48Q0cI,21142
5
5
  openepd/api/category/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
@@ -8,16 +8,16 @@ openepd/api/category/sync_api.py,sha256=QLEyga590UON9zv7864NjdSPkxSoeWObIOCUOLhD
8
8
  openepd/api/common.py,sha256=rfxjaDd7gGoen85wSooHt0W9xHdUlSlkTlkr2CO1ccg,8681
9
9
  openepd/api/dto/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
10
10
  openepd/api/dto/base.py,sha256=r3vxG3CpSS2M_L6k5mHVA4_Khunxkmh4QxEPjLOwft8,1233
11
- openepd/api/dto/common.py,sha256=eiOmV-pk4uVdbqPxIzlS5cB60EnthT3GyFSmprc4-_c,4389
11
+ openepd/api/dto/common.py,sha256=u6N-MmKoS1SZ7-IdVLHU8PQYGxPKKV8-NcZassIaKzo,4692
12
12
  openepd/api/dto/meta.py,sha256=_jrQuzmWhhitdB0_tREGLdzU2iGOZqYy84zsC3Hexhw,2361
13
13
  openepd/api/dto/mf.py,sha256=4jqhXqSGtA_MRXvJJFXtj4xMhsT9rucveyVAxt8V-oc,2195
14
14
  openepd/api/dto/params.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
15
15
  openepd/api/epd/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
16
- openepd/api/epd/dto.py,sha256=q_fJxPn-LD13bQtzw0kT691iesaEi3ffn7P080bDPa4,4893
16
+ openepd/api/epd/dto.py,sha256=-uEQRi2DBUIrtulgZ8D_qNbptBNrA-vJA09JeeY114Q,5075
17
17
  openepd/api/epd/sync_api.py,sha256=JEZR3WBZHqP4yOk1qkWsz0oKHMgegoZ7Pvoh6YTVefg,4391
18
18
  openepd/api/errors.py,sha256=K6L_T91iJLFSl_7hVS6poV_BUjZJe3qJBUzp8mItm7g,2376
19
19
  openepd/api/pcr/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
20
- openepd/api/pcr/dto.py,sha256=_TXNsKMcn0JaTb6GfDIcR-TPJEPwslrk1N6cPDkm6NU,1641
20
+ openepd/api/pcr/dto.py,sha256=CljjYK50Xz7wlIc0TfpTyyQLwdMao3SJW3hSHJpd8i4,1633
21
21
  openepd/api/pcr/sync_api.py,sha256=j8g23-FuaN2JkROVRo32v77JWpTWDIOWnIyomBbqNd4,1805
22
22
  openepd/api/sync_client.py,sha256=DBkoB8rH8OG1d1sJ77h2YvIP8aFQX5eCfaX4sTN0vEs,2504
23
23
  openepd/api/test/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
@@ -30,28 +30,28 @@ openepd/model/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
30
30
  openepd/model/base.py,sha256=R81hZd8EZBM2E9EhQbzNa9JLRzAjeNPPkZYEmoUM4v0,9132
31
31
  openepd/model/category.py,sha256=_6yFyldaDrkZk2_9ZAO2oRTz7ocvkg4T-D_aw5ncgvo,1840
32
32
  openepd/model/common.py,sha256=j-M_2T_Kl_Ea8l50pJT7LNatBW1fKrRcw4XNpeNvLU0,5635
33
- openepd/model/epd.py,sha256=BxcKJd_LuApB2v_LGN0-hYLNaUNoqMu9ZH_V1Ffil-g,14269
33
+ openepd/model/epd.py,sha256=T935Aaz6jULmFQHasqfwzgfvHKJ6tSSkbWKWUQ_XPk0,14283
34
34
  openepd/model/factory.py,sha256=qQZNb4yFN1EQWHHVS-fHnJ2gB-vsKz9hVmXXJE7YaRU,1918
35
35
  openepd/model/lcia.py,sha256=4AffuUYDZISwhJFcUC_r3JJYq4zL_q0RwS6KatYotU0,17149
36
- openepd/model/org.py,sha256=5Iciua-cKlicVzoo8y1wJjFOM1P8TGZDRhkB0Eu2kgw,3976
36
+ openepd/model/org.py,sha256=xV3MQE6iMaXtQWHHwGnjlE5LAd0Joyt-JuvOIvOLQ_4,3997
37
37
  openepd/model/pcr.py,sha256=t861yFntmy3ewrnGLP47cv3afV-aCCVRlrbpGeRh-7I,4604
38
38
  openepd/model/specs/README.md,sha256=W5LSMpZuW5x36cKS4HRfeFsClsRf8J9yHMMICghdc0s,862
39
39
  openepd/model/specs/__init__.py,sha256=nNs2nu1DIKyFC2A-Wc6Zk2VguSti3bC0gMpjop692z0,2299
40
40
  openepd/model/specs/aluminium.py,sha256=UqTX1gigGNgR9jWi4TEM-bKVGlZ_MBkdsLx4H1-H7KA,2246
41
41
  openepd/model/specs/asphalt.py,sha256=lBHTultMZqWXe9u-inGzcZRBkvW6axFZ10REZv-OBys,3533
42
42
  openepd/model/specs/base.py,sha256=S2KmHpBjjZnJ67FS3VJBA3aQ0a440OmhFFTqM8ZEOMM,2681
43
- openepd/model/specs/concrete.py,sha256=Nhe-6o6saaNQQc1E3013u4C7XmZGYg06-HLuHFS_IGU,19920
44
- openepd/model/specs/glass.py,sha256=Zn8cKTGxhoQujtv4F7HtfMkZugV5DMt_HQ6dw0sUugs,14865
45
- openepd/model/specs/steel.py,sha256=n9hnOwJ8ZixVdd9M-R_wHego35qWinGe8W184EwHASo,6334
43
+ openepd/model/specs/concrete.py,sha256=I5_KVLkHeMvOrdJRY3TOeSVQ9lQZXcaLu0zHP1RJO1M,23203
44
+ openepd/model/specs/glass.py,sha256=gsqTTylaDZTi1U1GQDvmIV08m3h-1uq3iQIm1rvWpJI,14824
45
+ openepd/model/specs/steel.py,sha256=u2Lyu69y0bewghfz3JcrKVjKc5bZJKAljA356_EKgWc,6464
46
46
  openepd/model/specs/wood.py,sha256=ehKJqqW9VfNKgM1S3gazfNNL4Af4SKZBm7HttAjokZQ,5128
47
47
  openepd/model/standard.py,sha256=YjxpC9nyz6LM8m3z1s5S0exJ1qvA3n59-FBoScg-FL0,1519
48
48
  openepd/model/validation/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsTeqbElJw,837
49
49
  openepd/model/validation/common.py,sha256=afJrWSvxMf8s9Y80-bG67Fp6W5siqtciMJ3Z6nUOPAI,2636
50
50
  openepd/model/validation/numbers.py,sha256=60Z9hT8nQwJHvUL7k5nBZsHxxWhaIxNKVbW3BnHS8zM,1088
51
- openepd/model/validation/quantity.py,sha256=-JGwdeSWuBSgtUizoSOg-6t3NFaGuumn5Ngd01rYxPs,2873
52
- openepd/model/versioning.py,sha256=Z31TgCW0POsmXLrH-Rmpy-MrIw_bU_9wwh8T4Mq1yTM,4628
51
+ openepd/model/validation/quantity.py,sha256=yYI-vJzhZTTMlHfZqZzxTgEziXp_WeIouIo7etntFfI,3005
52
+ openepd/model/versioning.py,sha256=fpj45RmphEI5u9fKZLI8FWa83cjH-wkeIU1RLLLwmX8,4700
53
53
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- openepd-1.7.2.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
55
- openepd-1.7.2.dist-info/METADATA,sha256=glbv4bqWnyusGuXAkbQZ98EjypKbNa7MFYmSNV3ZpEY,7762
56
- openepd-1.7.2.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
57
- openepd-1.7.2.dist-info/RECORD,,
54
+ openepd-1.9.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
55
+ openepd-1.9.0.dist-info/METADATA,sha256=RnFS7P2ijW63ly6LP2-dvJeYC07V1fh8dQwBoJVmf-k,7762
56
+ openepd-1.9.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
57
+ openepd-1.9.0.dist-info/RECORD,,