• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

joke2k / faker / 13059236656

30 Jan 2025 06:54PM UTC coverage: 95.923% (-0.01%) from 95.935%
13059236656

push

github

fcurella
Merge branch 'ChristinaRau-fix/master/new-de-providers'

193 of 197 new or added lines in 24 files covered. (97.97%)

7 existing lines in 4 files now uncovered.

10400 of 10842 relevant lines covered (95.92%)

18.18 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.56
/faker/providers/passport/en_US/__init__.py
1
import random
19✔
2

3
from datetime import date, timedelta
19✔
4
from typing import Tuple
19✔
5

6
from faker.typing import SexLiteral
19✔
7

8
from .. import Provider as PassportProvider
19✔
9

10

11
class Provider(PassportProvider):
19✔
12
    """Implement passport provider for ``en_US`` locale.
13

14
    Sources:
15

16
    - https://travel.state.gov/content/travel/en/passports/passport-help/next-generation-passport.html
17
    - https://www.vitalrecordsonline.com/glossary/passport-book-number
18
    """
19

20
    passport_number_formats = (
19✔
21
        # NGP
22
        "?########",
23
        # Pre-NGP
24
        "#########",
25
    )
26

27
    def passport_dates(self, birthday: date = date.today()) -> Tuple[str, str, str]:
19✔
28
        """Generates a formatted date of birth, issue, and expiration dates.
29
        issue and expiration dates are conditioned to fall within U.S. standards of 5 and 10 year expirations
30

31

32
        The ``birthday`` argument is a datetime.date object representing a date of birth.
33

34
        Sources:
35

36
        -https://travel.state.gov/content/travel/en/passports/passport-help/faqs.html
37
        """
38
        birth_date = birthday.strftime("%d ") + birthday.strftime("%b ") + birthday.strftime("%Y")
19✔
39
        today = date.today()
19✔
40
        age = (today - birthday).days // 365
19✔
41
        if age < 16:
19✔
42
            expiry_years = 5
19✔
43
            issue_date = self.generator.date_time_between(today - timedelta(days=expiry_years * 365 - 1), today)
19✔
44
            # Checks if age is less than 5 so issue date is not before birthdate
45
            if age < 5:
19✔
46
                issue_date = self.generator.date_time_between(birthday, today)
19✔
47
        elif age >= 26:
18✔
48
            expiry_years = 10
16✔
49
            issue_date = self.generator.date_time_between(today - timedelta(days=expiry_years * 365 - 1), today)
16✔
50
        else:
51
            # In cases between age 16 and 26, the issue date is 5 years ago, but expiry may be in 10 or 5 years
52
            expiry_years = 5
2✔
53
            issue_date = self.generator.date_time_between(
2✔
54
                today - timedelta(days=expiry_years * 365 - 1), birthday + timedelta(days=16 * 365 - 1)
55
            )
56
            # all people over 21 must have been over 16 when they recieved passport or it will be expired otherwise
57
            if age >= 21:
2✔
58
                issue_date = self.generator.date_time_between(today - timedelta(days=expiry_years * 365 - 1), today)
1✔
59
                expiry_years = 10
1✔
60

61
        if issue_date.day == 29 and issue_date.month == 2:
19✔
62
            issue_date -= timedelta(days=1)
×
63
        expiry_date = issue_date.replace(year=issue_date.year + expiry_years)
19✔
64

65
        issue_date_format = issue_date.strftime("%d ") + issue_date.strftime("%b ") + issue_date.strftime("%Y")
19✔
66
        expiry_date_format = expiry_date.strftime("%d ") + expiry_date.strftime("%b ") + expiry_date.strftime("%Y")
19✔
67
        return birth_date, issue_date_format, expiry_date_format
19✔
68

69
    def passport_gender(self, seed: int = 0) -> SexLiteral:
19✔
70
        """Generates a string representing the gender displayed on a passport
71

72
        Sources:
73

74
        - https://williamsinstitute.law.ucla.edu/publications/x-gender-markers-passports/
75
        """
76
        if seed != 0:
19✔
UNCOV
77
            random.seed(seed)
×
78

79
        genders = ["M", "F", "X"]
19✔
80
        gender: SexLiteral = random.choices(genders, weights=[0.493, 0.493, 0.014], k=1)[0]  # type: ignore
19✔
81
        return gender
19✔
82

83
    def passport_full(self) -> str:
19✔
84
        """Generates a formatted sting with US Passport information"""
85
        dob = self.passport_dob()
19✔
86
        birth_date, issue_date, expiry_date = self.passport_dates(dob)
19✔
87
        gender_g = self.passport_gender()
19✔
88
        given_name, surname = self.passport_owner(gender=gender_g)
19✔
89
        number = self.passport_number()
19✔
90

91
        full_rep = """{first_name}\n{second_name}\n{gender}\n{dob}\n{issue}\n{expire}\n{num}\n"""
19✔
92
        full_rep = full_rep.format(
19✔
93
            first_name=given_name,
94
            second_name=surname,
95
            gender=gender_g,
96
            dob=birth_date,
97
            issue=issue_date,
98
            expire=expiry_date,
99
            num=number,
100
        )
101
        return full_rep
19✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc