labfreed 0.2.12__py3-none-any.whl → 0.3.0a1__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.
Files changed (43) hide show
  1. labfreed/__init__.py +1 -1
  2. labfreed/labfreed_extended/app/app_infrastructure.py +104 -0
  3. labfreed/labfreed_extended/app/pac_info.py +79 -0
  4. labfreed/labfreed_extended/pac_attributes/py_attributes.py +123 -0
  5. labfreed/labfreed_extended/pac_attributes/server/attribute_server_factory.py +103 -0
  6. labfreed/labfreed_extended/pac_attributes/server/excel_attribute_data_source.py +128 -0
  7. labfreed/labfreed_extended/utilities/formatted_print.py +64 -0
  8. labfreed/labfreed_infrastructure.py +3 -3
  9. labfreed/pac_attributes/api_data_models/request.py +56 -0
  10. labfreed/pac_attributes/api_data_models/response.py +184 -0
  11. labfreed/pac_attributes/api_data_models/server_capabilities_response.py +7 -0
  12. labfreed/pac_attributes/client/__init__.py +1 -0
  13. labfreed/pac_attributes/client/attribute_cache.py +78 -0
  14. labfreed/pac_attributes/client/client.py +148 -0
  15. labfreed/pac_attributes/server/attribute_data_sources.py +69 -0
  16. labfreed/pac_attributes/server/server.py +237 -0
  17. labfreed/pac_attributes/server/translation_data_sources.py +60 -0
  18. labfreed/pac_attributes/well_knonw_attribute_keys.py +11 -0
  19. labfreed/pac_cat/category_base.py +19 -0
  20. labfreed/pac_cat/pac_cat.py +1 -1
  21. labfreed/pac_id/extension.py +32 -7
  22. labfreed/pac_id/pac_id.py +2 -2
  23. labfreed/pac_id/url_parser.py +4 -4
  24. labfreed/pac_id/url_serializer.py +11 -5
  25. labfreed/pac_id_resolver/cit_common.py +1 -1
  26. labfreed/pac_id_resolver/cit_v1.py +0 -3
  27. labfreed/pac_id_resolver/cit_v2.py +1 -6
  28. labfreed/pac_id_resolver/resolver.py +12 -7
  29. labfreed/pac_id_resolver/services.py +0 -1
  30. labfreed/trex/python_convenience/quantity.py +86 -5
  31. labfreed/trex/value_segments.py +1 -1
  32. labfreed/utilities/ensure_utc_time.py +6 -0
  33. labfreed/utilities/translations.py +60 -0
  34. labfreed/well_known_extensions/display_name_extension.py +3 -3
  35. labfreed/well_known_keys/gs1/gs1_ai_enum_sorted.py +4 -0
  36. labfreed/well_known_keys/labfreed/well_known_keys.py +12 -2
  37. labfreed/well_known_keys/unece/unece_units.py +2 -1
  38. {labfreed-0.2.12.dist-info → labfreed-0.3.0a1.dist-info}/METADATA +8 -1
  39. labfreed-0.3.0a1.dist-info/RECORD +62 -0
  40. labfreed/well_known_keys/gs1/gs1.py +0 -4
  41. labfreed-0.2.12.dist-info/RECORD +0 -45
  42. {labfreed-0.2.12.dist-info → labfreed-0.3.0a1.dist-info}/WHEEL +0 -0
  43. {labfreed-0.2.12.dist-info → labfreed-0.3.0a1.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
- if self.log_least_significant_digit is not None:
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):
@@ -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 = valid_types = unece_unit_codes() + ['T.D', 'T.B', 'T.A', 'T.T', 'T.X', 'E']
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['N'] = 'N'
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 != 'N':
32
- logging.warning(f'Type {name} was given, but this extension should only be used with type "N". Will try to parse data as display names')
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
 
@@ -54,4 +54,8 @@ class GS1ApplicationIdentifier(Enum):
54
54
  NHRN_AIM = "714"
55
55
  NHRN_NDC = "715"
56
56
  NHRN_AIC = "716"
57
+
58
+ def as_url(self) -> str:
59
+ # prefix the enum’s name to point to the description in the web
60
+ return f"ref.gs1.org/ai/{self.name}"
57
61
 
@@ -4,7 +4,7 @@ from enum import Enum
4
4
  class WellKnownKeys(Enum):
5
5
  GTIN = '01'
6
6
  BATCH = '10'
7
- CONTAINER_CODE = '20'
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
+
@@ -26,7 +26,8 @@ def unece_unit(unit_code):
26
26
  return unit[0]
27
27
 
28
28
  def unit_symbol(unit:dict) ->str:
29
- return unit.get('symbol')
29
+ symbol:str = unit.get('symbol')
30
+ return symbol
30
31
 
31
32
  def unit_name(unit:dict) ->str:
32
33
  return unit.get('name')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: labfreed
3
- Version: 0.2.12
3
+ Version: 0.3.0a1
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
  [![PyPI](https://img.shields.io/pypi/v/labfreed.svg)](https://pypi.org/project/labfreed/) ![Python Version](https://img.shields.io/pypi/pyversions/labfreed) [![Test Labfreed](https://github.com/retothuerer/LabFREED/actions/workflows/run-tests.yml/badge.svg)](https://github.com/retothuerer/LabFREED/actions/workflows/run-tests.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
40
43
 
44
+ <!--
45
+ [![Ruff](https://img.shields.io/badge/style-Ruff-black?logo=ruff&labelColor=gray)](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,62 @@
1
+ labfreed/__init__.py,sha256=IYsUcim01YjjUCrNxMPI1Sg-waYsQ2jOFpSLVA0XB7E,338
2
+ labfreed/labfreed_infrastructure.py,sha256=YZmU-kgopyB1tvpTR_k_uIt1Q2ezexMrWvu-HaP65IE,10104
3
+ labfreed/labfreed_extended/app/app_infrastructure.py,sha256=fy6eEp1PkHuZoVPT4E3JRziJwoslvl7NC9K6WQRn1Fs,4383
4
+ labfreed/labfreed_extended/app/pac_info.py,sha256=WbjV4oY7aAxLRF__jijmsLoM-SW-mv9x_rR9gS6n4_Y,2598
5
+ labfreed/labfreed_extended/pac_attributes/py_attributes.py,sha256=5VA1NUTJA1L9Su6Rj7dhkAZaW0ZcUR8sI50qbHfY4fc,5138
6
+ labfreed/labfreed_extended/pac_attributes/server/attribute_server_factory.py,sha256=88cV80Yyt459YUkDffnOiuPXQCjKK982YQA6uvc-TaU,3853
7
+ labfreed/labfreed_extended/pac_attributes/server/excel_attribute_data_source.py,sha256=EN9fgzu4hP_1GxhShFet8FYFY-bXgVYG2_r63-HJpME,4317
8
+ labfreed/labfreed_extended/utilities/formatted_print.py,sha256=DcwWP0ix1e_wYNIdceIp6cETkJdG2DqpU8Gs3aZAL40,1930
9
+ labfreed/pac_attributes/well_knonw_attribute_keys.py,sha256=ruHawnr1AffuhdKz1j1Nx67QphvcpmWsObgZhkuwkH0,318
10
+ labfreed/pac_attributes/api_data_models/request.py,sha256=x-GuFYhCIpqAKa1AHs968OfD8O2cJKg14YUw2hTKVg4,1871
11
+ labfreed/pac_attributes/api_data_models/response.py,sha256=czqQ59myLsN4WNgCdI_dnxRG8hSw4YI062XOPydfePU,5715
12
+ labfreed/pac_attributes/api_data_models/server_capabilities_response.py,sha256=ypDm4f8xZZl036fp8PuIe6lJHNW5Zg1fItgUlnV75V0,178
13
+ labfreed/pac_attributes/client/__init__.py,sha256=li-kVhzIH-Udpmp68e6YXrLXd2pByIbJLmzwwWtmwtE,38
14
+ labfreed/pac_attributes/client/attribute_cache.py,sha256=eWFy7h-T6gd25ENj9pLvSadNFRrzzIineqBoov2cGyw,2688
15
+ labfreed/pac_attributes/client/client.py,sha256=EdGWxi22DBx67-t_ICvm3YJGy0wwU1sMn4efwXtkvWg,6231
16
+ labfreed/pac_attributes/server/attribute_data_sources.py,sha256=6TRSpfqXJbArnKu2gQ5llWzciAkXorO89eaZtvgKWNk,2215
17
+ labfreed/pac_attributes/server/server.py,sha256=P2lqbUH9El2L4VDr2xXql0aVsJw3La7u6lhfR8EZSFs,10773
18
+ labfreed/pac_attributes/server/translation_data_sources.py,sha256=axALOqfP840sOSdVCRYtrens97mm-hpfONMUyuVlCrY,2145
19
+ labfreed/pac_cat/__init__.py,sha256=KNPtQzBD1XVohvG_ucOs7RJj-oi6biUTGB1k-T2o6pk,568
20
+ labfreed/pac_cat/category_base.py,sha256=nFa-y1IiTnPV1xz3RibqkEINISvP045329z8QgbsJ-4,2483
21
+ labfreed/pac_cat/pac_cat.py,sha256=wcb_fhvgjS2xmqTsxS8_Oibvr1nsQt5zr8aUajLfK1E,5578
22
+ labfreed/pac_cat/predefined_categories.py,sha256=5wnMCj-CrACV2W4lH13w7qynWIwi506G3uLNcxuJQGg,8832
23
+ labfreed/pac_id/__init__.py,sha256=NGMbzkwQ4txKeT5pxdIZordwHO8J3_q84jzPanjKoHg,675
24
+ labfreed/pac_id/extension.py,sha256=NgLexs1LbRMMm4ETrn5m4EY2iWoMDgOTb0UV556jatQ,2227
25
+ labfreed/pac_id/id_segment.py,sha256=r5JU1SJuRXhZJJxy5T3xjrb598wIDTLpivSJhIUAzjQ,4526
26
+ labfreed/pac_id/pac_id.py,sha256=DDcSYJ8DBWqIoW_usOT7eDjHZ9700cTYxeUgenHluOA,5378
27
+ labfreed/pac_id/url_parser.py,sha256=9_VHqklm7veknmZitKXw0-Yerl99bmeKYqnPUQPMDAw,5964
28
+ labfreed/pac_id/url_serializer.py,sha256=01LB30pNMBtv2rYHsiE_4Ga2iVA515Boj4ikOIYhiBQ,3511
29
+ labfreed/pac_id_resolver/__init__.py,sha256=RNBlrDOSR42gmSNH9wJVhK_xwEX45cvTKVgWW2bjh7Q,113
30
+ labfreed/pac_id_resolver/cit_common.py,sha256=jzoDOxog8YW68q7vyvDGCZcVcgIzJHXlMt8KwgVnx6o,2885
31
+ labfreed/pac_id_resolver/cit_v1.py,sha256=TVvOWJA6-wmBkwzoHBqNuwV-tndRTSKAK07k56eoJBU,9326
32
+ labfreed/pac_id_resolver/cit_v2.py,sha256=1Nywuv9cpROiOt7X326ePpgajPAe4F9nGqylqaZcsxY,11794
33
+ labfreed/pac_id_resolver/resolver.py,sha256=Rh_pccjFhtvpR5Bz_F0GPjZunl07eh42u3gQgacumYc,3079
34
+ labfreed/pac_id_resolver/services.py,sha256=vtnxLm38t4PNOf73cXh6UZOtWZZOGxfBCfXUDRxGHog,2592
35
+ labfreed/qr/__init__.py,sha256=fdKwP6W2Js--yMbBUdn-g_2uq2VqPpfQJeDLHsMDO-Y,61
36
+ labfreed/qr/generate_qr.py,sha256=mSt-U872O3ReHB_UdS-MzYu0wRgdlKcAOEfTxg5CLRk,16616
37
+ labfreed/trex/__init__.py,sha256=r0MYrGk_XxsqSKo9c2i9jRXApTDeTZD8QRXcRpkOVXY,428
38
+ labfreed/trex/table_segment.py,sha256=qlItBK1x3Qr7KUSM_L6dcmv3Y2fNhiqTaiXbXm5BKs0,9154
39
+ labfreed/trex/trex.py,sha256=WDoPvuhiilLtRSIkntCmDGkFBnD6oRZg0E6hhoV-I2g,2400
40
+ labfreed/trex/trex_base_models.py,sha256=591559BISc82fyIoEP_dq_GHDbPCVzApx7FM3TRQPlY,7545
41
+ labfreed/trex/value_segments.py,sha256=_fbDHDRfo7pxIWpzcbyjppv1VNd8Tnd-VXhbd6igI8g,3698
42
+ labfreed/trex/python_convenience/__init__.py,sha256=dyAQG7t-uYN6VfGXbWIq2bHxGcGI63l7FS2-VPYs2RQ,137
43
+ labfreed/trex/python_convenience/data_table.py,sha256=De0UMVCUUPeK-bUTToRTvL88EywHf6EOPYjgoUHsUpA,3158
44
+ labfreed/trex/python_convenience/pyTREX.py,sha256=mja3EDF4yPCfPyotlG6FEtIuGC0_q9mk3X1VFq5lz-U,10165
45
+ labfreed/trex/python_convenience/quantity.py,sha256=CzK3kCXopTl11qOCirkaiThDvMN6m1FbpLMrsHy2NkI,5336
46
+ labfreed/utilities/base36.py,sha256=_yX8aQ1OwrK5tnJU1NUEzQSFGr9xAVnNvPObpNzCPYs,2895
47
+ labfreed/utilities/ensure_utc_time.py,sha256=1ZTTzyIt7IimQ4ArTzdgw5hxiabkkplltbQe3Wdt2ZQ,307
48
+ labfreed/utilities/translations.py,sha256=XY4Wud_BfXswUOpebdh0U_D2bMzb2vqluuGWzFK-3uU,1851
49
+ labfreed/well_known_extensions/__init__.py,sha256=CjZTjx8Cn8763Hhnv_--Wj1LcFpFs2cyQwWrrzOS4xM,246
50
+ labfreed/well_known_extensions/default_extension_interpreters.py,sha256=3-BkJrAyBa99NN5Q2QPAm59CcWmPket-rvLzgltp8KY,201
51
+ labfreed/well_known_extensions/display_name_extension.py,sha256=Si2uJ0IGSO3-XyqlYwG7MovnT10oJ3JdOQAyjoZt2Rc,1477
52
+ labfreed/well_known_extensions/trex_extension.py,sha256=tffklaambkFPExcIDRAG9GJ7CHXeuFAagl6FuwS-2kI,929
53
+ labfreed/well_known_keys/gs1/__init__.py,sha256=LOFycgqS6OuV8t22TmtHy-ZI2iuXc3jJfVFwRFVDM3I,103
54
+ labfreed/well_known_keys/gs1/gs1_ai_enum_sorted.py,sha256=qSWD7bpTJQdQhXbZHJc20TRdqrnrxICD79goXWr6B-g,1405
55
+ labfreed/well_known_keys/labfreed/well_known_keys.py,sha256=p-hXwEEIs7p2SKn9DQeL9M6xdx3VI5doem-pZfddtmg,659
56
+ labfreed/well_known_keys/unece/UneceUnits.json,sha256=kwfQSp_nTuWbADfBBgqTWrvPl6XtM5SedEVLbMJrM7M,898953
57
+ labfreed/well_known_keys/unece/__init__.py,sha256=MSP9lmjg9_D9iqG9Yq2_ajYfQSNS9wIT7FXA1c--59M,122
58
+ labfreed/well_known_keys/unece/unece_units.py,sha256=J20d64H69qKDE3XlGdJoXIIh0G-d0jKoiIDsg9an5pk,1655
59
+ labfreed-0.3.0a1.dist-info/licenses/LICENSE,sha256=gHFOv9FRKHxO8cInP3YXyPoJnuNeqrvcHjaE_wPSsQ8,1100
60
+ labfreed-0.3.0a1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
61
+ labfreed-0.3.0a1.dist-info/METADATA,sha256=D-5o498iIUfdmlBvxCx9ErKj_HX5CPu7fpKaeCAmadI,19707
62
+ labfreed-0.3.0a1.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- '''
2
- Data from
3
- https://ref.gs1.org/ai/GS1_Application_Identifiers.jsonld
4
- '''
@@ -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,,