openepd 1.7.1__py3-none-any.whl → 1.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 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.1"
20
+ VERSION = "1.8.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,69 @@ 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
+ pass
382
376
 
383
- _compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True, check_fields=False)(
384
- validate_unit_factory(OpenEPDUnit.MPa)
385
- )
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
+ pass
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
+ pass
402
+
403
+
404
+ class ConcretePavingV1(BaseOpenEpdHierarchicalSpec):
405
+ """Concrete paving."""
406
+
407
+ pass
386
408
 
387
409
 
388
- class ConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
410
+ class ShotcreteV1(BaseOpenEpdHierarchicalSpec):
411
+ """Concretes sprayed on a target."""
412
+
413
+ pass
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
+
427
+ class ConcreteV1(BaseOpenEpdHierarchicalSpec):
389
428
  """Concrete spec."""
390
429
 
391
430
  _EXT_VERSION = "1.0"
392
431
 
432
+ strength_28d: PressureMPaStr | None = pyd.Field(
433
+ default=None, example="30 MPa", description="Concrete strength after 28 days"
434
+ )
393
435
  strength_early: PressureMPaStr | None = pyd.Field(
394
436
  default=None,
395
437
  example="30 MPa",
@@ -405,7 +447,34 @@ class ConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
405
447
  default=None, description="Test Day for the Late Strength"
406
448
  )
407
449
  slump: LengthMmStr | None = pyd.Field(description="Minimum test slump", example="40 mm", default=None)
450
+ w_c_ratio: RatioFloat | None = pyd.Field(description="Ratio of water to cement", example=0.3, default=None)
451
+ aci_exposure_classes: list[AciExposureClass] = pyd.Field(
452
+ description=(AciExposureClass.__doc__ or "").lstrip(), default_factory=list
453
+ )
454
+ csa_exposure_classes: list[CsaExposureClass] = pyd.Field(
455
+ description=(CsaExposureClass.__doc__ or "").lstrip(), default_factory=list
456
+ )
457
+ en_exposure_classes: list[EnExposureClass] = pyd.Field(
458
+ description=(EnExposureClass.__doc__ or "").lstrip(), default_factory=list
459
+ )
460
+ cementitious: Cementitious | None = pyd.Field(
461
+ default=None,
462
+ description="List of cementitious materials, and proportion by mass. Each field is 0 to 1.",
463
+ )
464
+ application: TypicalApplication | None = pyd.Field(description="Typical Application", default=None)
465
+ options: ConcreteV1Options | None = pyd.Field(description="Concrete options", default=None)
466
+
467
+ # Nested specs
468
+ ReadyMix: ReadyMixV1 | None = None
469
+ FlowableFill: FlowableFillV1 | None = None
470
+ OilPatch: OilPatchV1 | None = None
471
+ ConcretePaving: ConcretePavingV1 | None = None
472
+ Shotcrete: ShotcreteV1 | None = None
473
+ CementGrout: CementGroutV1 | None = None
408
474
 
475
+ _compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True, check_fields=False)(
476
+ validate_unit_factory(OpenEPDUnit.MPa)
477
+ )
409
478
  _strength_early_unit_validator = pyd.validator("strength_early", allow_reuse=True)(
410
479
  validate_unit_factory(OpenEPDUnit.MPa)
411
480
  )
@@ -424,10 +493,26 @@ class ConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
424
493
  return values
425
494
 
426
495
 
427
- class PrecastConcreteV1(ConcreteV1Mixin, BaseOpenEpdHierarchicalSpec):
496
+ class PrecastConcreteV1(BaseOpenEpdHierarchicalSpec):
428
497
  """Precast Concrete spec."""
429
498
 
430
499
  _EXT_VERSION = "1.0"
431
500
 
501
+ strength_28d: PressureMPaStr | None = pyd.Field(
502
+ default=None, example="30 MPa", description="Concrete strength after 28 days"
503
+ )
504
+
505
+ lightweight: bool | None = pyd.Field(description="Lightweight", default=None)
506
+ steel_mass_percentage: RatioFloat | None = pyd.Field(
507
+ default=None,
508
+ description="Percent of total mass that is steel reinforcement. Steel reinforcement "
509
+ "substantially changes functional performance and usually adds substantial GWP "
510
+ "per declared unit.",
511
+ )
512
+
432
513
  insulated: bool | None = pyd.Field(description="Insulated", default=None)
433
514
  gfrc: bool | None = pyd.Field(description="Glass Fiber Reinforced Concrete", default=None)
515
+
516
+ _compressive_strength_unit_validator = pyd.validator("strength_28d", allow_reuse=True)(
517
+ validate_unit_factory(OpenEPDUnit.MPa)
518
+ )
@@ -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.1
3
+ Version: 1.8.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=Ez8Wg4K4dGA7L-OxPGJKL44MCHbULZpwqVUAy9hz7n0,855
2
+ openepd/__version__.py,sha256=6YlL51CiEXjMXGC4aYqdXMGp923puMgij54LxJ2lhek,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,17 +30,17 @@ 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
43
+ openepd/model/specs/concrete.py,sha256=Hu6PxoyfRAeDGInMfHayOc8FZc8w5FS3tUCKxdBpOxM,23097
44
44
  openepd/model/specs/glass.py,sha256=Zn8cKTGxhoQujtv4F7HtfMkZugV5DMt_HQ6dw0sUugs,14865
45
45
  openepd/model/specs/steel.py,sha256=n9hnOwJ8ZixVdd9M-R_wHego35qWinGe8W184EwHASo,6334
46
46
  openepd/model/specs/wood.py,sha256=ehKJqqW9VfNKgM1S3gazfNNL4Af4SKZBm7HttAjokZQ,5128
@@ -49,9 +49,9 @@ openepd/model/validation/__init__.py,sha256=rqQJWF5jpYAgRbbAycUfWMGsr5kGtfjmwzsT
49
49
  openepd/model/validation/common.py,sha256=afJrWSvxMf8s9Y80-bG67Fp6W5siqtciMJ3Z6nUOPAI,2636
50
50
  openepd/model/validation/numbers.py,sha256=60Z9hT8nQwJHvUL7k5nBZsHxxWhaIxNKVbW3BnHS8zM,1088
51
51
  openepd/model/validation/quantity.py,sha256=-JGwdeSWuBSgtUizoSOg-6t3NFaGuumn5Ngd01rYxPs,2873
52
- openepd/model/versioning.py,sha256=Z31TgCW0POsmXLrH-Rmpy-MrIw_bU_9wwh8T4Mq1yTM,4628
52
+ openepd/model/versioning.py,sha256=fpj45RmphEI5u9fKZLI8FWa83cjH-wkeIU1RLLLwmX8,4700
53
53
  openepd/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- openepd-1.7.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
55
- openepd-1.7.1.dist-info/METADATA,sha256=upVZIJSePASSpJpdz5r0rKApe3vca7KW8qgLErVqwWw,7762
56
- openepd-1.7.1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
57
- openepd-1.7.1.dist-info/RECORD,,
54
+ openepd-1.8.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
55
+ openepd-1.8.0.dist-info/METADATA,sha256=r3C2sR1Zz5kmEkaZQbnYg6LKvXK3HFidysHpUOPepcU,7762
56
+ openepd-1.8.0.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
57
+ openepd-1.8.0.dist-info/RECORD,,