Skip to content

Commit e81186f

Browse files
utility function to ease the creation of an epc from scratch (#6)
1 parent 60fedfa commit e81186f

6 files changed

Lines changed: 522 additions & 74 deletions

File tree

energyml-utils/example/main.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright (c) 2023-2024 Geosiris.
22
# SPDX-License-Identifier: Apache-2.0
33
import json
4+
import re
45
from dataclasses import fields
56

67
from energyml.eml.v2_3.commonv2 import *
@@ -464,6 +465,57 @@ def test_obj_attribs():
464465
print(get_obj_uri(tr, "coucou"))
465466

466467

468+
def test_copy_values():
469+
data_in = {
470+
"a": {"b": "v_0", "c": "v_1"},
471+
"uuid": "215f8219-cabd-4e24-9e4f-e371cabc9622",
472+
"objectVersion": "Resqml 2.0",
473+
"non_existing": 42,
474+
}
475+
data_out = {
476+
"a": None,
477+
"Uuid": "8291afd6-ae01-49f5-bc96-267e7b27450d",
478+
"object_version": "Resqml 2.0",
479+
}
480+
copy_attributes(
481+
obj_in=data_in,
482+
obj_out=data_out,
483+
only_existing_attributes=True,
484+
ignore_case=True,
485+
)
486+
487+
488+
def class_field():
489+
print(get_class_fields(tr)["citation"])
490+
print(get_class_pkg_version(tr))
491+
print(create_energyml_object("resqml22.TriangulatedSetRepresentation"))
492+
ext_20 = create_energyml_object(
493+
"application/x-eml+xml;version=2.0;type=obj_EpcExternalPartReference"
494+
)
495+
print(ext_20)
496+
print(gen_energyml_object_path(ext_20))
497+
print(create_external_part_reference("2.0", "my_h5"))
498+
499+
print(
500+
parse_content_or_qualified_type(
501+
"application/x-eml+xml;version=2.0;type=obj_EpcExternalPartReference"
502+
)
503+
)
504+
print(
505+
get_domain_version_from_content_or_qualified_type(
506+
"application/x-eml+xml;version=2.0;type=obj_EpcExternalPartReference"
507+
)
508+
)
509+
print(
510+
get_domain_version_from_content_or_qualified_type(
511+
"resqml20.obj_EpcExternalPartReference"
512+
)
513+
)
514+
515+
# print(create_external_part_reference("2.2", "myfile.h5"))
516+
# print(create_external_part_reference("2.0", "myfile.h5"))
517+
518+
467519
if __name__ == "__main__":
468520
tests_0()
469521
tests_content_type()
@@ -479,3 +531,5 @@ def test_obj_attribs():
479531
test_wellbore_marker_frame_representation()
480532

481533
test_obj_attribs()
534+
test_copy_values()
535+
class_field()

energyml-utils/src/energyml/utils/constants.py

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import datetime
22
import re
33
import uuid as uuid_mod
4-
from typing import List
4+
from typing import List, Optional
55

66
ENERGYML_NAMESPACES = {
77
"eml": "http://www.energistics.org/energyml/data/commonv2",
@@ -197,24 +197,59 @@ def flatten_concatenation(matrix) -> List:
197197
return flat_list
198198

199199

200-
def parse_content_type(ct: str):
200+
def parse_content_type(ct: str) -> Optional[re.Match[str]]:
201201
return re.search(RGX_CONTENT_TYPE, ct)
202202

203203

204-
def parse_qualified_type(ct: str):
204+
def parse_qualified_type(ct: str) -> Optional[re.Match[str]]:
205205
return re.search(RGX_QUALIFIED_TYPE, ct)
206206

207207

208-
def now(
209-
time_zone=datetime.timezone(datetime.timedelta(hours=1), "UTC")
210-
) -> float:
208+
def parse_content_or_qualified_type(cqt: str) -> Optional[re.Match[str]]:
209+
"""
210+
Give a re.Match object (or None if failed).
211+
You can access to groups like : "domainVersion", "versionNum", "domain", "type"
212+
213+
:param cqt:
214+
:return:
215+
"""
216+
parsed = None
217+
try:
218+
parsed = parse_content_type(cqt)
219+
except:
220+
try:
221+
parsed = parse_qualified_type(cqt)
222+
except:
223+
pass
224+
225+
return parsed
226+
227+
228+
def get_domain_version_from_content_or_qualified_type(cqt: str) -> str:
229+
"""
230+
return a version number like "2.2" or "2.0"
231+
232+
:param cqt:
233+
:return:
234+
"""
235+
try:
236+
parsed = parse_content_type(cqt)
237+
return parsed.group("domainVersion")
238+
except:
239+
try:
240+
parsed = parse_qualified_type(cqt)
241+
return ".".join(parsed.group("domainVersion"))
242+
except:
243+
pass
244+
return None
245+
246+
247+
def now(time_zone=datetime.timezone.utc) -> float:
211248
"""Return an epoch value"""
212249
return datetime.datetime.timestamp(datetime.datetime.now(time_zone))
213250

214251

215-
def epoch(
216-
time_zone=datetime.timezone(datetime.timedelta(hours=1), "UTC")
217-
) -> int:
252+
def epoch(time_zone=datetime.timezone.utc) -> int:
218253
return int(now(time_zone))
219254

220255

@@ -228,10 +263,14 @@ def date_to_epoch(date: str) -> int:
228263

229264
def epoch_to_date(
230265
epoch_value: int,
231-
time_zone=datetime.timezone(datetime.timedelta(hours=1), "UTC"),
232266
) -> str:
233-
date = datetime.datetime.fromtimestamp(epoch_value, time_zone)
234-
return date.strftime("%Y-%m-%dT%H:%M:%S%z")
267+
date = datetime.datetime.fromtimestamp(epoch_value, datetime.timezone.utc)
268+
return date.astimezone(datetime.timezone.utc).strftime(
269+
"%Y-%m-%dT%H:%M:%SZ"
270+
)
271+
# date = datetime.datetime.fromtimestamp(epoch_value, datetime.timezone.utc)
272+
# return date.astimezone(datetime.timezone(datetime.timedelta(hours=0), "UTC")).strftime('%Y-%m-%dT%H:%M:%SZ')
273+
# return date.strftime("%Y-%m-%dT%H:%M:%SZ%z")
235274

236275

237276
def gen_uuid() -> str:

0 commit comments

Comments
 (0)