ean-tools 0.1.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,72 @@
1
+ import re
2
+ from typing import Optional
3
+
4
+ from ean_tools.check_digits import get_correct_check_digit, has_correct_check_digit, isbn10_has_correct_check_digit
5
+
6
+
7
+ def normalize_barcode(barcode: str, is_isbn: Optional[bool] = None) -> str:
8
+ """Normalizes a barcode.
9
+
10
+ Args:
11
+ barcode (str): The barcode string.
12
+ is_isbn (Optional[bool]): Flag to indicate whether the barcode is an ISBN
13
+ (to resolve possible ambiguity between ISBN-10 and EAN barcodes).
14
+
15
+ Returns:
16
+ str: The normalized barcode string.
17
+
18
+ Raises:
19
+ ValueError: If the barcode is invalid or ambiguous.
20
+ """
21
+ barcode = re.sub(r'[\s-]', '', barcode)
22
+ if not barcode or not barcode.isdigit() or barcode == '0' * len(barcode):
23
+ raise ValueError("Doesn't look like a barcode")
24
+
25
+ barcode_len = len(barcode)
26
+ barcode_stripped = barcode.lstrip('0')
27
+ barcode_stripped_len = len(barcode_stripped)
28
+
29
+ if len(barcode) < 8:
30
+ raise ValueError('Too short for a barcode')
31
+
32
+ if barcode_stripped_len > 14:
33
+ raise ValueError('Too long for a barcode')
34
+
35
+ is_valid_isbn10 = barcode_len == 10 and isbn10_has_correct_check_digit(barcode)
36
+
37
+ if is_isbn:
38
+ if is_valid_isbn10:
39
+ return convert_isbn10_to_isbn13(barcode)
40
+
41
+ if barcode_len == 10 and not is_valid_isbn10:
42
+ raise ValueError('Invalid ISBN')
43
+
44
+ if barcode_len != 13 or not re.match(r'^97[8-9]', barcode):
45
+ raise ValueError('Invalid ISBN')
46
+
47
+ if barcode_len == 10 and is_isbn is None:
48
+ is_valid_ean = has_correct_check_digit(barcode)
49
+
50
+ if not is_valid_ean and is_valid_isbn10:
51
+ return convert_isbn10_to_isbn13(barcode)
52
+
53
+ if is_valid_ean is is_valid_isbn10:
54
+ raise ValueError('Ambiguous ISBN-10 / EAN')
55
+
56
+ if barcode_stripped_len in (13, 14, 8):
57
+ return barcode_stripped
58
+
59
+ return barcode_stripped.rjust(13, '0')
60
+
61
+
62
+ def convert_isbn10_to_isbn13(isbn10: str) -> str:
63
+ """Converts an ISBN-10 barcode to ISBN-13 format.
64
+
65
+ Args:
66
+ isbn10 (str): The ISBN-10 barcode string.
67
+
68
+ Returns:
69
+ str: The corresponding ISBN-13 barcode string.
70
+ """
71
+ barcode = '978' + isbn10
72
+ return barcode[:-1] + get_correct_check_digit(barcode)
@@ -0,0 +1,62 @@
1
+ Metadata-Version: 2.3
2
+ Name: ean-tools
3
+ Version: 0.1.0
4
+ Summary: Collection of tools for validating and getting information about EAN (UPC, GTIN) and ISBN barcodes.
5
+ Home-page: https://github.com/ean-db/ean-tools
6
+ License: MIT
7
+ Keywords: barcode,ean,upc,isbn,gtin
8
+ Author: EAN-DB
9
+ Author-email: support@ean-db.com
10
+ Requires-Python: >=3.12
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
16
+ Requires-Dist: PyYaml (>=6)
17
+ Requires-Dist: affix-tree (>=0.1.1)
18
+ Project-URL: Repository, https://github.com/ean-db/ean-tools
19
+ Description-Content-Type: text/markdown
20
+
21
+ # ean-tools
22
+
23
+ Collection of tools for validating and getting information about EAN (UPC, GTIN) and ISBN barcodes.
24
+
25
+ ## Installation
26
+
27
+ ```commandline
28
+ pip install affix-tree
29
+ ```
30
+
31
+ ## Usage
32
+
33
+ ### Barcode normalization
34
+
35
+ ```pycon
36
+ >>> from ean_tools.normalization import normalize_barcode
37
+
38
+ >>> normalize_barcode('978-84865-4608-3')
39
+
40
+ '9788486546083'
41
+ ```
42
+
43
+ ### Check digit validation
44
+
45
+ ```pycon
46
+ >>> from ean_tools.check_digits import has_correct_check_digit
47
+
48
+ >>> has_correct_check_digit('8510000076279')
49
+
50
+ False
51
+ ```
52
+
53
+ ### Getting additional barcode information
54
+
55
+ ```pycon
56
+ >>> from ean_tools.barcode_info import get_barcode_info, BarcodeType
57
+
58
+ >>> get_barcode_info('4000000001140')
59
+
60
+ BarcodeInfo(barcode_type=BarcodeType.REGULAR, description='GS1 Germany', country='de')
61
+ ```
62
+
@@ -0,0 +1,11 @@
1
+ ean_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ ean_tools/barcode_info.py,sha256=AYr9muXXai8NBYeLR5Usls94R3Yifh5bxqWoJ0gPtMQ,1948
3
+ ean_tools/barcode_prefixes.py,sha256=hG6wPO4-3GkIp8iIC0wT4c1fKM6kRkHmYPtEmEeJKco,1843
4
+ ean_tools/check_digits.py,sha256=UZKDWJm6mSqNCOk_DDx9yrwCar70RCZsu9B86gHHwc8,1270
5
+ ean_tools/data/gs1-8-prefixes.yaml,sha256=8_QfQic9KoEd91nTqT8UdbA5gDtKKSEkmvYepmyYh_A,374
6
+ ean_tools/data/gs1-prefixes.yaml,sha256=rEwlAPPCOgph-4PKuW5IkTE3EXbNmyvwfO9PHVKPsBA,10876
7
+ ean_tools/data/isbn-prefixes.yaml,sha256=ABFMVsiKa7TXLl9UPVJReN-DB6_0ka0qGfwSA71RC2U,11790
8
+ ean_tools/normalization.py,sha256=SIAd4MSawVhTnDIQvu5uyqDhcnRprkhCvaFS2sKHdyc,2234
9
+ ean_tools-0.1.0.dist-info/METADATA,sha256=1Lm5R4IJAYQ5C-H9hMsjbH3ObBzZaFXzfhOVLzUtGeg,1525
10
+ ean_tools-0.1.0.dist-info/WHEEL,sha256=RaoafKOydTQ7I_I3JTrPCg6kUmTgtm4BornzOqyEfJ8,88
11
+ ean_tools-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.0.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any