summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/faker/providers/isbn/isbn.py
diff options
context:
space:
mode:
authorcyfraeviolae <cyfraeviolae>2024-04-03 03:10:44 -0400
committercyfraeviolae <cyfraeviolae>2024-04-03 03:10:44 -0400
commit6d7ba58f880be618ade07f8ea080fe8c4bf8a896 (patch)
treeb1c931051ffcebd2bd9d61d98d6233ffa289bbce /venv/lib/python3.11/site-packages/faker/providers/isbn/isbn.py
parent4f884c9abc32990b4061a1bb6997b4b37e58ea0b (diff)
venv
Diffstat (limited to 'venv/lib/python3.11/site-packages/faker/providers/isbn/isbn.py')
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/isbn/isbn.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/faker/providers/isbn/isbn.py b/venv/lib/python3.11/site-packages/faker/providers/isbn/isbn.py
new file mode 100644
index 0000000..b712a83
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/isbn/isbn.py
@@ -0,0 +1,85 @@
+"""
+This module is responsible for generating the check digit and formatting
+ISBN numbers.
+"""
+from typing import Any, Optional
+
+
+class ISBN:
+ MAX_LENGTH = 13
+
+ def __init__(
+ self,
+ ean: Optional[str] = None,
+ group: Optional[str] = None,
+ registrant: Optional[str] = None,
+ publication: Optional[str] = None,
+ ) -> None:
+ self.ean = ean
+ self.group = group
+ self.registrant = registrant
+ self.publication = publication
+
+
+class ISBN13(ISBN):
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
+ super().__init__(*args, **kwargs)
+ self.check_digit = self._check_digit()
+
+ def _check_digit(self) -> str:
+ """Calculate the check digit for ISBN-13.
+ See https://en.wikipedia.org/wiki/International_Standard_Book_Number
+ for calculation.
+ """
+ weights = (1 if x % 2 == 0 else 3 for x in range(12))
+ body = "".join([part for part in [self.ean, self.group, self.registrant, self.publication] if part is not None])
+ remainder = sum(int(b) * w for b, w in zip(body, weights)) % 10
+ diff = 10 - remainder
+ check_digit = 0 if diff == 10 else diff
+ return str(check_digit)
+
+ def format(self, separator: str = "") -> str:
+ return separator.join(
+ [
+ part
+ for part in [
+ self.ean,
+ self.group,
+ self.registrant,
+ self.publication,
+ self.check_digit,
+ ]
+ if part is not None
+ ]
+ )
+
+
+class ISBN10(ISBN):
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
+ super().__init__(*args, **kwargs)
+ self.check_digit = self._check_digit()
+
+ def _check_digit(self) -> str:
+ """Calculate the check digit for ISBN-10.
+ See https://en.wikipedia.org/wiki/International_Standard_Book_Number
+ for calculation.
+ """
+ weights = range(1, 10)
+ body = "".join([part for part in [self.group, self.registrant, self.publication] if part is not None])
+ remainder = sum(int(b) * w for b, w in zip(body, weights)) % 11
+ check_digit = "X" if remainder == 10 else str(remainder)
+ return str(check_digit)
+
+ def format(self, separator: str = "") -> str:
+ return separator.join(
+ [
+ part
+ for part in [
+ self.group,
+ self.registrant,
+ self.publication,
+ self.check_digit,
+ ]
+ if part is not None
+ ]
+ )