labfreed 0.2.12__py3-none-any.whl → 0.3.0a0__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.
Potentially problematic release.
This version of labfreed might be problematic. Click here for more details.
- labfreed/__init__.py +1 -1
- labfreed/labfreed_infrastructure.py +3 -3
- labfreed/pac_attributes/api_data_models/request.py +56 -0
- labfreed/pac_attributes/api_data_models/response.py +184 -0
- labfreed/pac_attributes/api_data_models/server_capabilities_response.py +7 -0
- labfreed/pac_attributes/client/__init__.py +1 -0
- labfreed/pac_attributes/client/attribute_cache.py +78 -0
- labfreed/pac_attributes/client/client.py +148 -0
- labfreed/pac_attributes/server/attribute_data_sources.py +69 -0
- labfreed/pac_attributes/server/server.py +237 -0
- labfreed/pac_attributes/server/translation_data_sources.py +60 -0
- labfreed/pac_attributes/well_knonw_attribute_keys.py +11 -0
- labfreed/pac_cat/category_base.py +19 -0
- labfreed/pac_cat/pac_cat.py +1 -1
- labfreed/pac_id/extension.py +32 -7
- labfreed/pac_id/pac_id.py +2 -2
- labfreed/pac_id/url_parser.py +4 -4
- labfreed/pac_id/url_serializer.py +11 -5
- labfreed/pac_id_resolver/cit_common.py +1 -1
- labfreed/pac_id_resolver/cit_v1.py +0 -3
- labfreed/pac_id_resolver/cit_v2.py +1 -6
- labfreed/pac_id_resolver/resolver.py +12 -7
- labfreed/pac_id_resolver/services.py +0 -1
- labfreed/trex/python_convenience/quantity.py +86 -5
- labfreed/trex/value_segments.py +1 -1
- labfreed/utilities/ensure_utc_time.py +6 -0
- labfreed/utilities/translations.py +60 -0
- labfreed/well_known_extensions/display_name_extension.py +3 -3
- labfreed/well_known_keys/gs1/gs1_ai_enum_sorted.py +4 -0
- labfreed/well_known_keys/labfreed/well_known_keys.py +12 -2
- labfreed/well_known_keys/unece/unece_units.py +2 -1
- {labfreed-0.2.12.dist-info → labfreed-0.3.0a0.dist-info}/METADATA +8 -1
- labfreed-0.3.0a0.dist-info/RECORD +56 -0
- labfreed/well_known_keys/gs1/gs1.py +0 -4
- labfreed-0.2.12.dist-info/RECORD +0 -45
- {labfreed-0.2.12.dist-info → labfreed-0.3.0a0.dist-info}/WHEEL +0 -0
- {labfreed-0.2.12.dist-info → labfreed-0.3.0a0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import re
|
|
1
2
|
from pydantic import BaseModel, model_validator
|
|
2
3
|
from labfreed.well_known_keys.unece.unece_units import unece_units
|
|
3
4
|
|
|
@@ -9,19 +10,27 @@ class Quantity(BaseModel):
|
|
|
9
10
|
'''unit. Use SI symbols. Set to None of the Quantity is dimensionless'''
|
|
10
11
|
log_least_significant_digit: int|None = None
|
|
11
12
|
|
|
13
|
+
|
|
12
14
|
@model_validator(mode='before')
|
|
13
15
|
@classmethod
|
|
14
16
|
def transform_inputs(cls, d:dict):
|
|
15
17
|
if not isinstance(d, dict):
|
|
16
18
|
return d
|
|
19
|
+
|
|
17
20
|
# decimals_to_log_significant_digits
|
|
18
21
|
if decimals:= d.pop('decimals', None):
|
|
19
22
|
d['log_least_significant_digit'] = - decimals
|
|
20
23
|
|
|
21
24
|
#dimensionless_unit
|
|
22
|
-
unit= d.get('unit')
|
|
25
|
+
unit:str= d.get('unit')
|
|
23
26
|
if unit and unit in ['1', '', 'dimensionless']:
|
|
24
27
|
d['unit'] = None
|
|
28
|
+
|
|
29
|
+
#try to coerce to ucum. catch the two most likely mistakes to use blanks for multiplication and ^ for exponents.
|
|
30
|
+
if unit:
|
|
31
|
+
unit = unit.replace('/ ', '/').replace(' /', '/').replace(' ', '.').replace('^', '')
|
|
32
|
+
d['unit'] = unit
|
|
33
|
+
|
|
25
34
|
return d
|
|
26
35
|
|
|
27
36
|
|
|
@@ -36,14 +45,86 @@ class Quantity(BaseModel):
|
|
|
36
45
|
''' for clarity returns the value'''
|
|
37
46
|
return self.value
|
|
38
47
|
|
|
48
|
+
@classmethod
|
|
49
|
+
def from_str_value(cls, value:str, unit:str|None, log_least_significant_digit=None):
|
|
50
|
+
'''
|
|
51
|
+
Creates a quantity from a string representing a number (e.g. -12.345E-8 ).
|
|
52
|
+
It does some magic to find the least significant digit. NOTE: for numbers like 11000 it is ambiguous if the
|
|
53
|
+
trailing zeros are significant. They will be treated as significant. Use scientific notation to be specific (i.e. 11e3 if the zeros are not significant)
|
|
54
|
+
'''
|
|
55
|
+
if '.' not in value and 'E' not in value:
|
|
56
|
+
num_val = int(value)
|
|
57
|
+
else:
|
|
58
|
+
num_val = float(value)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
if log_least_significant_digit is None:
|
|
62
|
+
log_least_significant_digit = cls._find_log_significant_digits(value)
|
|
63
|
+
|
|
64
|
+
q = Quantity(value = num_val, unit=unit, log_least_significant_digit=log_least_significant_digit)
|
|
65
|
+
return q
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_str_with_unit(cls, value:str):
|
|
69
|
+
''' assumes value and unit are separated by " " '''
|
|
70
|
+
try:
|
|
71
|
+
parts = value.strip().split(' ', 1)
|
|
72
|
+
if len(parts) == 2:
|
|
73
|
+
str_value = parts[0]
|
|
74
|
+
unit = parts[1]
|
|
75
|
+
return cls.from_str_value(str_value, unit)
|
|
76
|
+
except Exception:
|
|
77
|
+
return None
|
|
78
|
+
|
|
79
|
+
@staticmethod
|
|
80
|
+
def _find_log_significant_digits(value:str):
|
|
81
|
+
s = value.strip()
|
|
82
|
+
m = re.match(r'^(?P<mantissa>-?\d+(\.\d+)?)([Ee]-?(?P<exponent>\d+))?$', s)
|
|
83
|
+
if m:
|
|
84
|
+
exponent = int( m.group('exponent') or 0 )
|
|
85
|
+
mantissa = m.group('mantissa')
|
|
86
|
+
|
|
87
|
+
if '.' not in mantissa:
|
|
88
|
+
digits_after_decimal = 0
|
|
89
|
+
int_part = mantissa
|
|
90
|
+
m = re.match(r'-?\d+?(?P<trailing_zeros>0*)(\.\d+)?$', int_part)
|
|
91
|
+
if m:
|
|
92
|
+
trailing_zeros = m.group('trailing_zeros')
|
|
93
|
+
possible_non_significant_digits = len(trailing_zeros) # there is no way to know if they are really insignificant. # noqa: F841
|
|
94
|
+
log_least_significant_digit = exponent
|
|
95
|
+
|
|
96
|
+
else:
|
|
97
|
+
int_part, frac_part = mantissa.rsplit('.', 1)
|
|
98
|
+
digits_after_decimal = len(frac_part)
|
|
99
|
+
|
|
100
|
+
log_least_significant_digit = -digits_after_decimal + exponent
|
|
101
|
+
|
|
102
|
+
return log_least_significant_digit
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def value_as_str(self):
|
|
111
|
+
if self.log_least_significant_digit is not None:
|
|
112
|
+
log_digit = self.log_least_significant_digit
|
|
113
|
+
if log_digit <= 0:
|
|
114
|
+
val = f"{self.value:.{-log_digit}f}"
|
|
115
|
+
else:
|
|
116
|
+
factor = 10 ** log_digit
|
|
117
|
+
rounded = round(self.value / factor) * factor
|
|
118
|
+
val = str(int(rounded))
|
|
119
|
+
else:
|
|
120
|
+
val = str(self.value)
|
|
121
|
+
return val
|
|
122
|
+
|
|
39
123
|
def __str__(self):
|
|
40
124
|
unit_symbol = self.unit
|
|
41
125
|
if self.unit == "dimensionless" or not self.unit:
|
|
42
126
|
unit_symbol = ""
|
|
43
|
-
|
|
44
|
-
val = f"{self.value:.{self.log_least_significant_digit}f}"
|
|
45
|
-
else:
|
|
46
|
-
val = str(self.value)
|
|
127
|
+
val = self.value_as_str()
|
|
47
128
|
return f"{val} {unit_symbol}"
|
|
48
129
|
|
|
49
130
|
def __repr__(self):
|
labfreed/trex/value_segments.py
CHANGED
|
@@ -14,7 +14,7 @@ class ValueSegment(TREX_Segment, Value, ABC):
|
|
|
14
14
|
|
|
15
15
|
@model_validator(mode='after')
|
|
16
16
|
def _validate_type(self):
|
|
17
|
-
valid_types =
|
|
17
|
+
valid_types = unece_unit_codes() + ['T.D', 'T.B', 'T.A', 'T.T', 'T.X', 'E']
|
|
18
18
|
if self.type not in valid_types:
|
|
19
19
|
self._add_validation_message(
|
|
20
20
|
source=f"TREX value segment {self.key}",
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from datetime import datetime, timezone
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def ensure_utc(dt: datetime) -> datetime:
|
|
5
|
+
'''Converts to UTC time. If dt has no timezone it is assumed to be in UTC and the utc timezone is explicitly added'''
|
|
6
|
+
return dt.replace(tzinfo=timezone.utc) if dt.tzinfo is None else dt.astimezone(timezone.utc)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from pydantic import BaseModel, model_validator
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Translation(BaseModel):
|
|
7
|
+
language_code: str
|
|
8
|
+
text: str
|
|
9
|
+
|
|
10
|
+
@staticmethod
|
|
11
|
+
def create(language_code:str, text:str):
|
|
12
|
+
'''provides a shorter form to init the model without the need to use keywords only'''
|
|
13
|
+
return Translation(language_code=language_code, text=text)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@model_validator(mode="after")
|
|
17
|
+
def validate_language(self):
|
|
18
|
+
if not re.fullmatch(r"^[a-z]{2,3}(-[a-z]{2,3})?$", self.language_code.lower()):
|
|
19
|
+
raise ValueError(f"Invalid language code: {self.language_code}")
|
|
20
|
+
return self
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def language(self) -> str:
|
|
25
|
+
return self.language_code.split("-")[0].lower()
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def region(self) -> Optional[str]:
|
|
29
|
+
parts = self.language_code.split("-")
|
|
30
|
+
return parts[1].upper() if len(parts) == 2 else None
|
|
31
|
+
|
|
32
|
+
class Term(BaseModel):
|
|
33
|
+
key: str
|
|
34
|
+
translations: List[Translation]
|
|
35
|
+
|
|
36
|
+
@staticmethod
|
|
37
|
+
def create(key:str, translations:List[Translation]|List[tuple]):
|
|
38
|
+
'''provides a shorter form to init the model without the need to use keywords only'''
|
|
39
|
+
translations = [ t if isinstance(t, Translation) else Translation.create(*t) for t in translations]
|
|
40
|
+
return Term(key=key, translations=translations)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def in_language(self, language_key: str) -> str | None:
|
|
44
|
+
for t in self.translations:
|
|
45
|
+
if t.language_code == language_key:
|
|
46
|
+
return t.text
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
class Terms(BaseModel):
|
|
50
|
+
terms: List[Term]
|
|
51
|
+
|
|
52
|
+
def translations_for_term(self, term_key: str) -> Term | None:
|
|
53
|
+
for t in self.terms:
|
|
54
|
+
if t.key == term_key:
|
|
55
|
+
return t
|
|
56
|
+
return None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
@@ -8,7 +8,7 @@ from labfreed.utilities.base36 import from_base36, to_base36
|
|
|
8
8
|
|
|
9
9
|
class DisplayNameExtension(ExtensionBase, LabFREED_BaseModel):
|
|
10
10
|
name:Literal['N'] = 'N'
|
|
11
|
-
type:Literal['
|
|
11
|
+
type:Literal['TEXT'] = 'TEXT'
|
|
12
12
|
display_name: str
|
|
13
13
|
|
|
14
14
|
@computed_field
|
|
@@ -28,8 +28,8 @@ class DisplayNameExtension(ExtensionBase, LabFREED_BaseModel):
|
|
|
28
28
|
if name != 'N':
|
|
29
29
|
logging.warning(f'Name {name} was given, but this extension should only be used with name "N". Will ignore input')
|
|
30
30
|
|
|
31
|
-
if type != '
|
|
32
|
-
logging.warning(f'Type {name} was given, but this extension should only be used with type "
|
|
31
|
+
if type != 'TEXT':
|
|
32
|
+
logging.warning(f'Type {name} was given, but this extension should only be used with type "TEXT". Will try to parse data as display names')
|
|
33
33
|
|
|
34
34
|
display_name = from_base36(data)
|
|
35
35
|
|
|
@@ -4,7 +4,7 @@ from enum import Enum
|
|
|
4
4
|
class WellKnownKeys(Enum):
|
|
5
5
|
GTIN = '01'
|
|
6
6
|
BATCH = '10'
|
|
7
|
-
|
|
7
|
+
VARIANT = '20'
|
|
8
8
|
SERIAL = '21'
|
|
9
9
|
ADDITIONAL_IDENTIFIER = '240'
|
|
10
10
|
SECONDARY_SERIAL = '250'
|
|
@@ -15,4 +15,14 @@ class WellKnownKeys(Enum):
|
|
|
15
15
|
METHOD_ID = 'MTD'
|
|
16
16
|
REPORT_ID = 'RPT'
|
|
17
17
|
TIMESTAMP = 'TS'
|
|
18
|
-
VERSION = 'V'
|
|
18
|
+
VERSION = 'V'
|
|
19
|
+
|
|
20
|
+
MAXWEIGHT = "MAXWEIGHT"
|
|
21
|
+
LASTCALIBRATION = "LASTCAL"
|
|
22
|
+
NOMINALWEIGHT = "NOMINALWEIGHT"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def as_url(self) -> str:
|
|
26
|
+
# prefix the enum’s name to point to the description in the web
|
|
27
|
+
return f"labfreed.org/wkk/{self.name}"
|
|
28
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: labfreed
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0a0
|
|
4
4
|
Summary: Python implementation of LabFREED building blocks
|
|
5
5
|
Author-email: Reto Thürer <thuerer.r@buchi.com>
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -28,16 +28,23 @@ Requires-Dist: pytest>=8.3.5 ; extra == "dev"
|
|
|
28
28
|
Requires-Dist: pdoc>=15.0.1 ; extra == "dev"
|
|
29
29
|
Requires-Dist: flit>=3.12.0 ; extra == "dev"
|
|
30
30
|
Requires-Dist: ruff>=0.11.5 ; extra == "dev"
|
|
31
|
+
Requires-Dist: Flask>=3.1.1 ; extra == "extended"
|
|
32
|
+
Requires-Dist: openpyxl>=3.1.5 ; extra == "extended"
|
|
31
33
|
Project-URL: Documentation, https://github.com/retothuerer/LabFREED?tab=readme-ov-file#readme
|
|
32
34
|
Project-URL: Homepage, https://github.com/retothuerer/LabFREED
|
|
33
35
|
Project-URL: Source, https://github.com/retothuerer/LabFREED
|
|
34
36
|
Project-URL: Tracker, https://github.com/retothuerer/LabFREED/issues
|
|
35
37
|
Provides-Extra: dev
|
|
38
|
+
Provides-Extra: extended
|
|
36
39
|
|
|
37
40
|
# LabFREED for Python
|
|
38
41
|
|
|
39
42
|
[](https://pypi.org/project/labfreed/)  [](https://github.com/retothuerer/LabFREED/actions/workflows/run-tests.yml) [](LICENSE)
|
|
40
43
|
|
|
44
|
+
<!--
|
|
45
|
+
[](https://github.com/astral-sh/ruff)
|
|
46
|
+
-->
|
|
47
|
+
|
|
41
48
|
|
|
42
49
|
This is a Python implementation of [LabFREED](https://labfreed.org/) building blocks.
|
|
43
50
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
labfreed/__init__.py,sha256=NXi5VbeTAbNd98NSoKvzjqrmIRUlYv0SdoaalKH_8XM,337
|
|
2
|
+
labfreed/labfreed_infrastructure.py,sha256=YZmU-kgopyB1tvpTR_k_uIt1Q2ezexMrWvu-HaP65IE,10104
|
|
3
|
+
labfreed/pac_attributes/well_knonw_attribute_keys.py,sha256=ruHawnr1AffuhdKz1j1Nx67QphvcpmWsObgZhkuwkH0,318
|
|
4
|
+
labfreed/pac_attributes/api_data_models/request.py,sha256=x-GuFYhCIpqAKa1AHs968OfD8O2cJKg14YUw2hTKVg4,1871
|
|
5
|
+
labfreed/pac_attributes/api_data_models/response.py,sha256=czqQ59myLsN4WNgCdI_dnxRG8hSw4YI062XOPydfePU,5715
|
|
6
|
+
labfreed/pac_attributes/api_data_models/server_capabilities_response.py,sha256=ypDm4f8xZZl036fp8PuIe6lJHNW5Zg1fItgUlnV75V0,178
|
|
7
|
+
labfreed/pac_attributes/client/__init__.py,sha256=li-kVhzIH-Udpmp68e6YXrLXd2pByIbJLmzwwWtmwtE,38
|
|
8
|
+
labfreed/pac_attributes/client/attribute_cache.py,sha256=eWFy7h-T6gd25ENj9pLvSadNFRrzzIineqBoov2cGyw,2688
|
|
9
|
+
labfreed/pac_attributes/client/client.py,sha256=EdGWxi22DBx67-t_ICvm3YJGy0wwU1sMn4efwXtkvWg,6231
|
|
10
|
+
labfreed/pac_attributes/server/attribute_data_sources.py,sha256=6TRSpfqXJbArnKu2gQ5llWzciAkXorO89eaZtvgKWNk,2215
|
|
11
|
+
labfreed/pac_attributes/server/server.py,sha256=P2lqbUH9El2L4VDr2xXql0aVsJw3La7u6lhfR8EZSFs,10773
|
|
12
|
+
labfreed/pac_attributes/server/translation_data_sources.py,sha256=axALOqfP840sOSdVCRYtrens97mm-hpfONMUyuVlCrY,2145
|
|
13
|
+
labfreed/pac_cat/__init__.py,sha256=KNPtQzBD1XVohvG_ucOs7RJj-oi6biUTGB1k-T2o6pk,568
|
|
14
|
+
labfreed/pac_cat/category_base.py,sha256=nFa-y1IiTnPV1xz3RibqkEINISvP045329z8QgbsJ-4,2483
|
|
15
|
+
labfreed/pac_cat/pac_cat.py,sha256=wcb_fhvgjS2xmqTsxS8_Oibvr1nsQt5zr8aUajLfK1E,5578
|
|
16
|
+
labfreed/pac_cat/predefined_categories.py,sha256=5wnMCj-CrACV2W4lH13w7qynWIwi506G3uLNcxuJQGg,8832
|
|
17
|
+
labfreed/pac_id/__init__.py,sha256=NGMbzkwQ4txKeT5pxdIZordwHO8J3_q84jzPanjKoHg,675
|
|
18
|
+
labfreed/pac_id/extension.py,sha256=NgLexs1LbRMMm4ETrn5m4EY2iWoMDgOTb0UV556jatQ,2227
|
|
19
|
+
labfreed/pac_id/id_segment.py,sha256=r5JU1SJuRXhZJJxy5T3xjrb598wIDTLpivSJhIUAzjQ,4526
|
|
20
|
+
labfreed/pac_id/pac_id.py,sha256=DDcSYJ8DBWqIoW_usOT7eDjHZ9700cTYxeUgenHluOA,5378
|
|
21
|
+
labfreed/pac_id/url_parser.py,sha256=9_VHqklm7veknmZitKXw0-Yerl99bmeKYqnPUQPMDAw,5964
|
|
22
|
+
labfreed/pac_id/url_serializer.py,sha256=01LB30pNMBtv2rYHsiE_4Ga2iVA515Boj4ikOIYhiBQ,3511
|
|
23
|
+
labfreed/pac_id_resolver/__init__.py,sha256=RNBlrDOSR42gmSNH9wJVhK_xwEX45cvTKVgWW2bjh7Q,113
|
|
24
|
+
labfreed/pac_id_resolver/cit_common.py,sha256=jzoDOxog8YW68q7vyvDGCZcVcgIzJHXlMt8KwgVnx6o,2885
|
|
25
|
+
labfreed/pac_id_resolver/cit_v1.py,sha256=TVvOWJA6-wmBkwzoHBqNuwV-tndRTSKAK07k56eoJBU,9326
|
|
26
|
+
labfreed/pac_id_resolver/cit_v2.py,sha256=1Nywuv9cpROiOt7X326ePpgajPAe4F9nGqylqaZcsxY,11794
|
|
27
|
+
labfreed/pac_id_resolver/resolver.py,sha256=Rh_pccjFhtvpR5Bz_F0GPjZunl07eh42u3gQgacumYc,3079
|
|
28
|
+
labfreed/pac_id_resolver/services.py,sha256=vtnxLm38t4PNOf73cXh6UZOtWZZOGxfBCfXUDRxGHog,2592
|
|
29
|
+
labfreed/qr/__init__.py,sha256=fdKwP6W2Js--yMbBUdn-g_2uq2VqPpfQJeDLHsMDO-Y,61
|
|
30
|
+
labfreed/qr/generate_qr.py,sha256=mSt-U872O3ReHB_UdS-MzYu0wRgdlKcAOEfTxg5CLRk,16616
|
|
31
|
+
labfreed/trex/__init__.py,sha256=r0MYrGk_XxsqSKo9c2i9jRXApTDeTZD8QRXcRpkOVXY,428
|
|
32
|
+
labfreed/trex/table_segment.py,sha256=qlItBK1x3Qr7KUSM_L6dcmv3Y2fNhiqTaiXbXm5BKs0,9154
|
|
33
|
+
labfreed/trex/trex.py,sha256=WDoPvuhiilLtRSIkntCmDGkFBnD6oRZg0E6hhoV-I2g,2400
|
|
34
|
+
labfreed/trex/trex_base_models.py,sha256=591559BISc82fyIoEP_dq_GHDbPCVzApx7FM3TRQPlY,7545
|
|
35
|
+
labfreed/trex/value_segments.py,sha256=_fbDHDRfo7pxIWpzcbyjppv1VNd8Tnd-VXhbd6igI8g,3698
|
|
36
|
+
labfreed/trex/python_convenience/__init__.py,sha256=dyAQG7t-uYN6VfGXbWIq2bHxGcGI63l7FS2-VPYs2RQ,137
|
|
37
|
+
labfreed/trex/python_convenience/data_table.py,sha256=De0UMVCUUPeK-bUTToRTvL88EywHf6EOPYjgoUHsUpA,3158
|
|
38
|
+
labfreed/trex/python_convenience/pyTREX.py,sha256=mja3EDF4yPCfPyotlG6FEtIuGC0_q9mk3X1VFq5lz-U,10165
|
|
39
|
+
labfreed/trex/python_convenience/quantity.py,sha256=CzK3kCXopTl11qOCirkaiThDvMN6m1FbpLMrsHy2NkI,5336
|
|
40
|
+
labfreed/utilities/base36.py,sha256=_yX8aQ1OwrK5tnJU1NUEzQSFGr9xAVnNvPObpNzCPYs,2895
|
|
41
|
+
labfreed/utilities/ensure_utc_time.py,sha256=1ZTTzyIt7IimQ4ArTzdgw5hxiabkkplltbQe3Wdt2ZQ,307
|
|
42
|
+
labfreed/utilities/translations.py,sha256=XY4Wud_BfXswUOpebdh0U_D2bMzb2vqluuGWzFK-3uU,1851
|
|
43
|
+
labfreed/well_known_extensions/__init__.py,sha256=CjZTjx8Cn8763Hhnv_--Wj1LcFpFs2cyQwWrrzOS4xM,246
|
|
44
|
+
labfreed/well_known_extensions/default_extension_interpreters.py,sha256=3-BkJrAyBa99NN5Q2QPAm59CcWmPket-rvLzgltp8KY,201
|
|
45
|
+
labfreed/well_known_extensions/display_name_extension.py,sha256=Si2uJ0IGSO3-XyqlYwG7MovnT10oJ3JdOQAyjoZt2Rc,1477
|
|
46
|
+
labfreed/well_known_extensions/trex_extension.py,sha256=tffklaambkFPExcIDRAG9GJ7CHXeuFAagl6FuwS-2kI,929
|
|
47
|
+
labfreed/well_known_keys/gs1/__init__.py,sha256=LOFycgqS6OuV8t22TmtHy-ZI2iuXc3jJfVFwRFVDM3I,103
|
|
48
|
+
labfreed/well_known_keys/gs1/gs1_ai_enum_sorted.py,sha256=qSWD7bpTJQdQhXbZHJc20TRdqrnrxICD79goXWr6B-g,1405
|
|
49
|
+
labfreed/well_known_keys/labfreed/well_known_keys.py,sha256=p-hXwEEIs7p2SKn9DQeL9M6xdx3VI5doem-pZfddtmg,659
|
|
50
|
+
labfreed/well_known_keys/unece/UneceUnits.json,sha256=kwfQSp_nTuWbADfBBgqTWrvPl6XtM5SedEVLbMJrM7M,898953
|
|
51
|
+
labfreed/well_known_keys/unece/__init__.py,sha256=MSP9lmjg9_D9iqG9Yq2_ajYfQSNS9wIT7FXA1c--59M,122
|
|
52
|
+
labfreed/well_known_keys/unece/unece_units.py,sha256=J20d64H69qKDE3XlGdJoXIIh0G-d0jKoiIDsg9an5pk,1655
|
|
53
|
+
labfreed-0.3.0a0.dist-info/licenses/LICENSE,sha256=gHFOv9FRKHxO8cInP3YXyPoJnuNeqrvcHjaE_wPSsQ8,1100
|
|
54
|
+
labfreed-0.3.0a0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
55
|
+
labfreed-0.3.0a0.dist-info/METADATA,sha256=0Fl6mtbyjD7ihk836WY79Shb-hsUXfw-HTbk9cSjYcU,19707
|
|
56
|
+
labfreed-0.3.0a0.dist-info/RECORD,,
|
labfreed-0.2.12.dist-info/RECORD
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
labfreed/__init__.py,sha256=t3gO6v5Ul6ergdi4-pLhvP-H26Zd1G4UdvD56f6bwHs,337
|
|
2
|
-
labfreed/labfreed_infrastructure.py,sha256=EPDSCaGxWakAoPpHyc6ltf-pOuKyS5829lj_EG6wa74,10072
|
|
3
|
-
labfreed/pac_cat/__init__.py,sha256=KNPtQzBD1XVohvG_ucOs7RJj-oi6biUTGB1k-T2o6pk,568
|
|
4
|
-
labfreed/pac_cat/category_base.py,sha256=lFQNiTUukyhWdaSCAI7CZxLtj6kNtnBCE4UsePwsGqE,1801
|
|
5
|
-
labfreed/pac_cat/pac_cat.py,sha256=FVp65Yf6AnwCB2bKQPgSRWMw3urwAELrdW8sfqsUGw8,5575
|
|
6
|
-
labfreed/pac_cat/predefined_categories.py,sha256=5wnMCj-CrACV2W4lH13w7qynWIwi506G3uLNcxuJQGg,8832
|
|
7
|
-
labfreed/pac_id/__init__.py,sha256=NGMbzkwQ4txKeT5pxdIZordwHO8J3_q84jzPanjKoHg,675
|
|
8
|
-
labfreed/pac_id/extension.py,sha256=zuHI8e51otPbpO1r1xDFh32uXTT8L5pCJn74B-aOUpI,1112
|
|
9
|
-
labfreed/pac_id/id_segment.py,sha256=r5JU1SJuRXhZJJxy5T3xjrb598wIDTLpivSJhIUAzjQ,4526
|
|
10
|
-
labfreed/pac_id/pac_id.py,sha256=PyOa5y2IVLEcmj7ZkFuURC1lrP3BU0Yj8pzAllhtatw,5309
|
|
11
|
-
labfreed/pac_id/url_parser.py,sha256=TAQHxFf7Li8GA517mfOivmnJAJgh782oaSDzmOOkyTE,5942
|
|
12
|
-
labfreed/pac_id/url_serializer.py,sha256=Thh41ejth2xv5OcvLDlhVMAzKvu4bDX563cQbJHMxFc,3301
|
|
13
|
-
labfreed/pac_id_resolver/__init__.py,sha256=RNBlrDOSR42gmSNH9wJVhK_xwEX45cvTKVgWW2bjh7Q,113
|
|
14
|
-
labfreed/pac_id_resolver/cit_common.py,sha256=xEkSSumj_IYgnXn3yKvoTBbgExnIfPY7E-RHU-7pcX8,2905
|
|
15
|
-
labfreed/pac_id_resolver/cit_v1.py,sha256=W7UCO0Gm0w09FSo_USFB1-V2tl3iErDxoe2OHh4fkvc,9383
|
|
16
|
-
labfreed/pac_id_resolver/cit_v2.py,sha256=wM1wf8UWbepatWNgkJ3l0l-HNJHqsqqPMql5k8fkVso,12127
|
|
17
|
-
labfreed/pac_id_resolver/resolver.py,sha256=UfSxRwTTjSgL4VoHfsQiaGTj3tt8dTDDd2wVcbr2Xvc,2817
|
|
18
|
-
labfreed/pac_id_resolver/services.py,sha256=fCt-CBUKoEm4-SZqlkt94Or-BnmJ91Q5kZO9ydPw55s,2609
|
|
19
|
-
labfreed/qr/__init__.py,sha256=fdKwP6W2Js--yMbBUdn-g_2uq2VqPpfQJeDLHsMDO-Y,61
|
|
20
|
-
labfreed/qr/generate_qr.py,sha256=mSt-U872O3ReHB_UdS-MzYu0wRgdlKcAOEfTxg5CLRk,16616
|
|
21
|
-
labfreed/trex/__init__.py,sha256=r0MYrGk_XxsqSKo9c2i9jRXApTDeTZD8QRXcRpkOVXY,428
|
|
22
|
-
labfreed/trex/table_segment.py,sha256=qlItBK1x3Qr7KUSM_L6dcmv3Y2fNhiqTaiXbXm5BKs0,9154
|
|
23
|
-
labfreed/trex/trex.py,sha256=WDoPvuhiilLtRSIkntCmDGkFBnD6oRZg0E6hhoV-I2g,2400
|
|
24
|
-
labfreed/trex/trex_base_models.py,sha256=591559BISc82fyIoEP_dq_GHDbPCVzApx7FM3TRQPlY,7545
|
|
25
|
-
labfreed/trex/value_segments.py,sha256=qizDsinE-ddta8jzkJbGT3OUjHpYhI2GwxjZ6InzLDs,3712
|
|
26
|
-
labfreed/trex/python_convenience/__init__.py,sha256=dyAQG7t-uYN6VfGXbWIq2bHxGcGI63l7FS2-VPYs2RQ,137
|
|
27
|
-
labfreed/trex/python_convenience/data_table.py,sha256=De0UMVCUUPeK-bUTToRTvL88EywHf6EOPYjgoUHsUpA,3158
|
|
28
|
-
labfreed/trex/python_convenience/pyTREX.py,sha256=mja3EDF4yPCfPyotlG6FEtIuGC0_q9mk3X1VFq5lz-U,10165
|
|
29
|
-
labfreed/trex/python_convenience/quantity.py,sha256=Uwu43SKCLN5C8MssRHEdiZbBIJ4C4hhLHVr25UUG_7I,2261
|
|
30
|
-
labfreed/utilities/base36.py,sha256=_yX8aQ1OwrK5tnJU1NUEzQSFGr9xAVnNvPObpNzCPYs,2895
|
|
31
|
-
labfreed/well_known_extensions/__init__.py,sha256=CjZTjx8Cn8763Hhnv_--Wj1LcFpFs2cyQwWrrzOS4xM,246
|
|
32
|
-
labfreed/well_known_extensions/default_extension_interpreters.py,sha256=3-BkJrAyBa99NN5Q2QPAm59CcWmPket-rvLzgltp8KY,201
|
|
33
|
-
labfreed/well_known_extensions/display_name_extension.py,sha256=1BZY3Tffak4bNeirBKAktYCG1u2dhEvx8RqamUT6TxU,1465
|
|
34
|
-
labfreed/well_known_extensions/trex_extension.py,sha256=tffklaambkFPExcIDRAG9GJ7CHXeuFAagl6FuwS-2kI,929
|
|
35
|
-
labfreed/well_known_keys/gs1/__init__.py,sha256=LOFycgqS6OuV8t22TmtHy-ZI2iuXc3jJfVFwRFVDM3I,103
|
|
36
|
-
labfreed/well_known_keys/gs1/gs1.py,sha256=LIyy-W89m9L0gVxOu-lpBotsHN6CHvmdE3Vu2VwxUQA,79
|
|
37
|
-
labfreed/well_known_keys/gs1/gs1_ai_enum_sorted.py,sha256=D8hE6vm-GedS7W2uC52oYrvAKa4zM-7X11JeT_k23oM,1252
|
|
38
|
-
labfreed/well_known_keys/labfreed/well_known_keys.py,sha256=050ED8qlZ-5iKKnAZ48WZ1JSXVH4zgbXy8QMWUVxuqA,388
|
|
39
|
-
labfreed/well_known_keys/unece/UneceUnits.json,sha256=kwfQSp_nTuWbADfBBgqTWrvPl6XtM5SedEVLbMJrM7M,898953
|
|
40
|
-
labfreed/well_known_keys/unece/__init__.py,sha256=MSP9lmjg9_D9iqG9Yq2_ajYfQSNS9wIT7FXA1c--59M,122
|
|
41
|
-
labfreed/well_known_keys/unece/unece_units.py,sha256=gNDQk6KGl-nGMf9Ycq_fQ8P2xxKITgLkcQWPd4H49gI,1630
|
|
42
|
-
labfreed-0.2.12.dist-info/licenses/LICENSE,sha256=gHFOv9FRKHxO8cInP3YXyPoJnuNeqrvcHjaE_wPSsQ8,1100
|
|
43
|
-
labfreed-0.2.12.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
44
|
-
labfreed-0.2.12.dist-info/METADATA,sha256=b1XEweCYclOc9ApV18nvX4555dN0136b9Iu4IAaruWc,19450
|
|
45
|
-
labfreed-0.2.12.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|