summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/faker/providers/passport
diff options
context:
space:
mode:
Diffstat (limited to 'venv/lib/python3.11/site-packages/faker/providers/passport')
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/passport/__init__.py45
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/passport/__pycache__/__init__.cpython-311.pycbin0 -> 2836 bytes
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/passport/en_US/__init__.py99
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/passport/en_US/__pycache__/__init__.cpython-311.pycbin0 -> 5348 bytes
4 files changed, 144 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/faker/providers/passport/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/passport/__init__.py
new file mode 100644
index 0000000..0641ed7
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/passport/__init__.py
@@ -0,0 +1,45 @@
+import datetime
+import re
+
+from string import ascii_uppercase
+from typing import Tuple
+
+from .. import BaseProvider, ElementsType
+
+localized = True
+
+
+class Provider(BaseProvider):
+ """Implement default Passport provider for Faker."""
+
+ passport_number_formats: ElementsType = ()
+
+ def passport_dob(self) -> datetime.date:
+ """Generate a datetime date of birth."""
+ birthday = self.generator.date_of_birth()
+ return birthday
+
+ def passport_owner(self, gender: str = "X") -> Tuple[str, str]:
+ """Generate a given_name and surname for a passport owner
+ The ``gender`` argument is the gender marker of a passport owner, which is a one character string
+ that is either male, female, or non-binary.
+ """
+ if gender == "M":
+ given_name = self.generator.parse("{{first_name_male}}")
+ elif gender == "F":
+ given_name = self.generator.parse("{{first_name_female}}")
+ else:
+ given_name = self.generator.parse("{{first_name_nonbinary}}")
+
+ surname = self.generator.parse("{{last_name}}")
+
+ return given_name, surname
+
+ def passport_number(self) -> str:
+ """Generate a passport number by replacing tokens to be alphanumeric"""
+ temp = re.sub(
+ r"\?",
+ lambda x: self.random_element(ascii_uppercase),
+ self.random_element(self.passport_number_formats),
+ )
+ return self.numerify(temp)
diff --git a/venv/lib/python3.11/site-packages/faker/providers/passport/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/passport/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..e99eee8
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/passport/__pycache__/__init__.cpython-311.pyc
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/faker/providers/passport/en_US/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/passport/en_US/__init__.py
new file mode 100644
index 0000000..b0afb53
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/passport/en_US/__init__.py
@@ -0,0 +1,99 @@
+import random
+
+from datetime import date, timedelta
+from typing import Tuple
+
+from .. import Provider as PassportProvider
+
+
+class Provider(PassportProvider):
+ """Implement passport provider for ``en_US`` locale.
+
+ Sources:
+
+ - https://travel.state.gov/content/travel/en/passports/passport-help/next-generation-passport.html
+ - https://www.vitalrecordsonline.com/glossary/passport-book-number
+ """
+
+ passport_number_formats = (
+ # NGP
+ "?########",
+ # Pre-NGP
+ "#########",
+ )
+
+ def passport_dates(self, birthday: date = date.today()) -> Tuple[str, str, str]:
+ """Generates a formatted date of birth, issue, and expiration dates.
+ issue and expiration dates are conditioned to fall within U.S. standards of 5 and 10 year expirations
+
+
+ The ``birthday`` argument is a datetime.date object representing a date of birth.
+
+ Sources:
+
+ -https://travel.state.gov/content/travel/en/passports/passport-help/faqs.html
+ """
+ birth_date = birthday.strftime("%d ") + birthday.strftime("%b ") + birthday.strftime("%Y")
+ today = date.today()
+ age = (today - birthday).days // 365
+ if age < 16:
+ expiry_years = 5
+ issue_date = self.generator.date_time_between(today - timedelta(days=expiry_years * 365 - 1), today)
+ # Checks if age is less than 5 so issue date is not before birthdate
+ if age < 5:
+ issue_date = self.generator.date_time_between(birthday, today)
+ elif age >= 26:
+ expiry_years = 10
+ issue_date = self.generator.date_time_between(today - timedelta(days=expiry_years * 365 - 1), today)
+ else:
+ # In cases between age 16 and 26, the issue date is 5 years ago, but expiry may be in 10 or 5 years
+ expiry_years = 5
+ issue_date = self.generator.date_time_between(
+ today - timedelta(days=expiry_years * 365 - 1), birthday + timedelta(days=16 * 365 - 1)
+ )
+ # all people over 21 must have been over 16 when they recieved passport or it will be expired otherwise
+ if age >= 21:
+ issue_date = self.generator.date_time_between(today - timedelta(days=expiry_years * 365 - 1), today)
+ expiry_years = 10
+
+ if issue_date.day == 29 and issue_date.month == 2:
+ issue_date -= timedelta(days=1)
+ expiry_date = issue_date.replace(year=issue_date.year + expiry_years)
+
+ issue_date_format = issue_date.strftime("%d ") + issue_date.strftime("%b ") + issue_date.strftime("%Y")
+ expiry_date_format = expiry_date.strftime("%d ") + expiry_date.strftime("%b ") + expiry_date.strftime("%Y")
+ return birth_date, issue_date_format, expiry_date_format
+
+ def passport_gender(self, seed: int = 0) -> str:
+ """Generates a string representing the gender displayed on a passport
+
+ Sources:
+
+ - https://williamsinstitute.law.ucla.edu/publications/x-gender-markers-passports/
+ """
+ if seed != 0:
+ random.seed(seed)
+
+ genders = ["M", "F", "X"]
+ gender = random.choices(genders, weights=[0.493, 0.493, 0.014], k=1)[0]
+ return gender
+
+ def passport_full(self) -> str:
+ """Generates a formatted sting with US Passport information"""
+ dob = self.passport_dob()
+ birth_date, issue_date, expiry_date = self.passport_dates(dob)
+ gender_g = self.passport_gender()
+ given_name, surname = self.passport_owner(gender=gender_g)
+ number = self.passport_number()
+
+ full_rep = """{first_name}\n{second_name}\n{gender}\n{dob}\n{issue}\n{expire}\n{num}\n"""
+ full_rep = full_rep.format(
+ first_name=given_name,
+ second_name=surname,
+ gender=gender_g,
+ dob=birth_date,
+ issue=issue_date,
+ expire=expiry_date,
+ num=number,
+ )
+ return full_rep
diff --git a/venv/lib/python3.11/site-packages/faker/providers/passport/en_US/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/passport/en_US/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..5b5268c
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/passport/en_US/__pycache__/__init__.cpython-311.pyc
Binary files differ