summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/faker/providers/credit_card
diff options
context:
space:
mode:
Diffstat (limited to 'venv/lib/python3.11/site-packages/faker/providers/credit_card')
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/__init__.py213
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/__pycache__/__init__.cpython-311.pycbin0 -> 9421 bytes
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/en_US/__init__.py7
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/en_US/__pycache__/__init__.cpython-311.pycbin0 -> 577 bytes
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/fa_IR/__init__.py123
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/fa_IR/__pycache__/__init__.cpython-311.pycbin0 -> 5111 bytes
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/pt_PT/__init__.py298
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/pt_PT/__pycache__/__init__.cpython-311.pycbin0 -> 3535 bytes
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/ru_RU/__init__.py115
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/ru_RU/__pycache__/__init__.cpython-311.pycbin0 -> 3617 bytes
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/uk_UA/__init__.py58
-rw-r--r--venv/lib/python3.11/site-packages/faker/providers/credit_card/uk_UA/__pycache__/__init__.cpython-311.pycbin0 -> 3033 bytes
12 files changed, 814 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/credit_card/__init__.py
new file mode 100644
index 0000000..e3c5b95
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/__init__.py
@@ -0,0 +1,213 @@
+from collections import OrderedDict
+from typing import Dict, List, Optional, TypeVar
+
+from ...typing import DateParseType
+from .. import BaseProvider
+
+localized = True
+
+CardType = TypeVar("CardType", "CreditCard", str)
+
+
+class CreditCard:
+ def __init__(
+ self,
+ name: str,
+ prefixes: List[str],
+ length: int = 16,
+ security_code: str = "CVC",
+ security_code_length: int = 3,
+ ) -> None:
+ self.name = name
+ self.prefixes = prefixes
+ self.length = length
+ self.security_code = security_code
+ self.security_code_length = security_code_length
+
+
+class Provider(BaseProvider):
+ """Implement default credit card provider for Faker.
+
+ For all methods that take ``card_type`` as an argument, a random card type
+ will be used if the supplied value is ``None``. The list of valid card types
+ includes ``'amex'``, ``'diners'``, ``'discover'``, ``'jcb'``, ``'jcb15'``,
+ ``'jcb16'``, ``'maestro'``, ``'mastercard'``, ``'visa'``, ``'visa13'``,
+ ``'visa16'``, and ``'visa19'``.
+
+ Sources:
+
+ - https://en.wikipedia.org/wiki/Payment_card_number#Issuer_identification_number_.28IIN.29
+ - https://www.regular-expressions.info/creditcard.html
+ - https://creditcardjs.com/credit-card-type-detection
+ """
+
+ prefix_maestro: List[str] = [
+ "5018",
+ "5020",
+ "5038",
+ "56##",
+ "57##",
+ "58##",
+ "6304",
+ "6759",
+ "6761",
+ "6762",
+ "6763",
+ "0604",
+ "6390",
+ ]
+ prefix_mastercard: List[str] = [
+ "51",
+ "52",
+ "53",
+ "54",
+ "55",
+ "222%",
+ "223",
+ "224",
+ "225",
+ "226",
+ "227",
+ "228",
+ "229",
+ "23",
+ "24",
+ "25",
+ "26",
+ "270",
+ "271",
+ "2720",
+ ]
+ prefix_visa: List[str] = ["4"]
+ prefix_amex: List[str] = ["34", "37"]
+ prefix_discover: List[str] = ["6011", "65"]
+ prefix_diners: List[str] = ["300", "301", "302", "303", "304", "305", "36", "38"]
+ prefix_jcb16: List[str] = ["35"]
+ prefix_jcb15: List[str] = ["2131", "1800"]
+
+ credit_card_types: Dict[str, CreditCard] = OrderedDict(
+ (
+ ("maestro", CreditCard("Maestro", prefix_maestro, 12, security_code="CVV")),
+ (
+ "mastercard",
+ CreditCard("Mastercard", prefix_mastercard, 16, security_code="CVV"),
+ ),
+ ("visa16", CreditCard("VISA 16 digit", prefix_visa)),
+ ("visa13", CreditCard("VISA 13 digit", prefix_visa, 13)),
+ ("visa19", CreditCard("VISA 19 digit", prefix_visa, 19)),
+ (
+ "amex",
+ CreditCard(
+ "American Express",
+ prefix_amex,
+ 15,
+ security_code="CID",
+ security_code_length=4,
+ ),
+ ),
+ ("discover", CreditCard("Discover", prefix_discover)),
+ ("diners", CreditCard("Diners Club / Carte Blanche", prefix_diners, 14)),
+ ("jcb15", CreditCard("JCB 15 digit", prefix_jcb15, 15)),
+ ("jcb16", CreditCard("JCB 16 digit", prefix_jcb16)),
+ )
+ )
+ credit_card_types["visa"] = credit_card_types["visa16"]
+ credit_card_types["jcb"] = credit_card_types["jcb16"]
+
+ luhn_lookup = {
+ "0": 0,
+ "1": 2,
+ "2": 4,
+ "3": 6,
+ "4": 8,
+ "5": 1,
+ "6": 3,
+ "7": 5,
+ "8": 7,
+ "9": 9,
+ }
+
+ def credit_card_provider(self, card_type: Optional[CardType] = None) -> str:
+ """Generate a credit card provider name."""
+ if card_type is None:
+ card_type = self.random_element(self.credit_card_types.keys()) # type: ignore[assignment]
+ return self._credit_card_type(card_type).name
+
+ def credit_card_number(self, card_type: Optional[CardType] = None) -> str:
+ """Generate a valid credit card number."""
+ card = self._credit_card_type(card_type)
+ prefix: str = self.random_element(card.prefixes)
+ number = self._generate_number(self.numerify(prefix), card.length)
+ return number
+
+ def credit_card_expire(
+ self,
+ start: DateParseType = "now",
+ end: DateParseType = "+10y",
+ date_format: str = "%m/%y",
+ ) -> str:
+ """Generate a credit card expiry date.
+
+ This method uses |date_time_between| under the hood to generate the
+ expiry date, so the ``start`` and ``end`` arguments work in the same way
+ here as it would in that method. For the actual formatting of the expiry
+ date, |strftime| is used and ``date_format`` is simply passed
+ to that method.
+ """
+ expire_date = self.generator.date_time_between(start, end)
+ return expire_date.strftime(date_format)
+
+ def credit_card_full(self, card_type: Optional[CardType] = None) -> str:
+ """Generate a set of credit card details."""
+ card = self._credit_card_type(card_type)
+
+ tpl = "{provider}\n" "{owner}\n" "{number} {expire_date}\n" "{security}: {security_nb}\n"
+
+ tpl = tpl.format(
+ provider=card.name,
+ owner=self.generator.parse("{{first_name}} {{last_name}}"),
+ number=self.credit_card_number(card),
+ expire_date=self.credit_card_expire(),
+ security=card.security_code,
+ security_nb=self.credit_card_security_code(card),
+ )
+
+ return self.generator.parse(tpl)
+
+ def credit_card_security_code(self, card_type: Optional[CardType] = None) -> str:
+ """Generate a credit card security code."""
+ sec_len = self._credit_card_type(card_type).security_code_length
+ return self.numerify("#" * sec_len)
+
+ def _credit_card_type(self, card_type: Optional[CardType] = None) -> CreditCard:
+ """Generate a random CreditCard instance of the specified card type."""
+ if card_type is None:
+ card_type = self.random_element(self.credit_card_types.keys()) # type: ignore[assignment]
+ elif isinstance(card_type, CreditCard):
+ return card_type
+ return self.credit_card_types[card_type] # type: ignore[index]
+
+ def _generate_number(self, prefix: str, length: int) -> str:
+ """Generate a credit card number.
+
+ The ``prefix`` argument is the start of the CC number as a string which
+ may contain any number of digits. The ``length`` argument is the length
+ of the CC number to generate which is typically 13 or 16.
+ """
+ number = prefix
+ # Generate random char digits
+ number += "#" * (length - len(prefix) - 1)
+ number = self.numerify(number)
+ reverse = number[::-1]
+ # Calculate sum
+ tot = 0
+ pos = 0
+ while pos < length - 1:
+ tot += Provider.luhn_lookup[reverse[pos]]
+ if pos != (length - 2):
+ tot += int(reverse[pos + 1])
+ pos += 2
+ # Calculate check digit
+ check_digit = (10 - (tot % 10)) % 10
+ number += str(check_digit)
+ return number
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/credit_card/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..221b334
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/__pycache__/__init__.cpython-311.pyc
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/en_US/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/credit_card/en_US/__init__.py
new file mode 100644
index 0000000..07d1f3a
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/en_US/__init__.py
@@ -0,0 +1,7 @@
+from .. import Provider as CreditCardProvider
+
+
+class Provider(CreditCardProvider):
+ """Implement credit card provider for ``en_US`` locale."""
+
+ pass
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/en_US/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/credit_card/en_US/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..8c784d2
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/en_US/__pycache__/__init__.cpython-311.pyc
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/fa_IR/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/credit_card/fa_IR/__init__.py
new file mode 100644
index 0000000..b10f0fa
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/fa_IR/__init__.py
@@ -0,0 +1,123 @@
+from collections import OrderedDict
+
+from .. import CreditCard
+from .. import Provider as CreditCardProvider
+
+
+class Provider(CreditCardProvider):
+ """Implement credit card provider for ``fa_IR`` locale.
+
+ For all methods that take ``card_type`` as an argument, a random card type
+ will be used if the supplied value is ``None``. The list of valid card types
+ includes ``'ansar'``, ``'bim'``, ``'day'``, ``'eghtesad_novin'``,
+ ``'ghavamin'``, ``'hekmat'``, ``'iran_zamin'``, ``'kar_afarin'``,
+ ``'keshavarzi'``, ``'kosar'``, ``'maskan'``, ``'mehre_ghtesad'``,
+ ``'meli'``, ``'mellal'``, ``'mellat'``, ``'parsian'``, ``'pasargad'``,
+ ``'post_bank'``, ``'refah'``, ``'saderat'``, ``'saman'``, ``'sarmayeh'``,
+ ``'sepah'``, ``'shahr'``, ``'sina'``, ``'tat'``, ``'tejarat'``, ``'tose'``,
+ and ``'tourism_bank'``.
+
+ Sources:
+
+ - https://way2pay.ir/21653
+ """
+
+ prefix_ansar = ["627381"]
+ prefix_iran_zamin = ["505785"]
+ prefix_hekmat = ["636949"]
+ prefix_keshavarzi = ["603770"]
+ prefix_shahr = ["502806"]
+ prefix_mehr_eghtesad = ["606373"]
+ prefix_sarmayeh = ["639607"]
+ prefix_post_bank = ["627760"]
+ prefix_tose = ["628157"]
+ prefix_eghtesad_novin = ["627412"]
+ prefix_meli = ["603799"]
+ prefix_pasargad = ["502229"]
+ prefix_tourism_bank = ["505416"]
+ prefix_ghavamin = ["639599"]
+ prefix_day = ["502938"]
+ prefix_mellat = ["610433"]
+ prefix_tejarat = ["585983"]
+ prefix_moasse_mellal = ["606256"]
+ prefix_saman_bank = ["621986"]
+ prefix_kosar = ["505801"]
+ prefix_refah = ["589463"]
+ prefix_saderat = ["603761"]
+ prefix_tat = ["621986"]
+ prefix_sina = ["639346"]
+ prefix_kar_afarin = ["627488"]
+ prefix_sepah = ["589210"]
+ prefix_maskan = ["628023"]
+ prefix_parsian = ["622106"]
+ prefix_bim = ["627961"]
+
+ credit_card_types = OrderedDict(
+ (
+ ("ansar", CreditCard("انصار", prefix_ansar, 16, security_code="CVV2")),
+ (
+ "iran_zamin",
+ CreditCard("ایران زمین", prefix_iran_zamin, 16, security_code="CVV2"),
+ ),
+ ("hekmat", CreditCard("حکمت", prefix_hekmat, 16, security_code="CVV2")),
+ (
+ "keshavarzi",
+ CreditCard("کشاورزی", prefix_keshavarzi, 16, security_code="CVV2"),
+ ),
+ ("shahr", CreditCard("شهر", prefix_shahr, 16, security_code="CVV2")),
+ (
+ "mehre_ghtesad",
+ CreditCard("مهراقتصاد", prefix_mehr_eghtesad, 16, security_code="CVV2"),
+ ),
+ (
+ "sarmayeh",
+ CreditCard("سرمایه", prefix_sarmayeh, 16, security_code="CVV2"),
+ ),
+ (
+ "post_bank",
+ CreditCard("پست بانک", prefix_post_bank, 16, security_code="CVV2"),
+ ),
+ ("tose", CreditCard("توسعه", prefix_tose, 16, security_code="CVV2")),
+ (
+ "eghtesad_novin",
+ CreditCard("اقتصاد نوین", prefix_eghtesad_novin, 16, security_code="CVV2"),
+ ),
+ ("meli", CreditCard("ملی", prefix_meli, 16, security_code="CVV2")),
+ (
+ "pasargad",
+ CreditCard("پاسارگاد", prefix_pasargad, 16, security_code="CVV2"),
+ ),
+ (
+ "tourism_bank",
+ CreditCard("گردشگری", prefix_tourism_bank, 16, security_code="CVV2"),
+ ),
+ (
+ "ghavamin",
+ CreditCard("قوامین", prefix_ghavamin, 16, security_code="CVV2"),
+ ),
+ ("day", CreditCard("دی", prefix_day, 16, security_code="CVV2")),
+ ("mellat", CreditCard("ملت", prefix_mellat, 16, security_code="CVV2")),
+ ("tejarat", CreditCard("تجارت", prefix_tejarat, 16, security_code="CVV2")),
+ (
+ "mellal",
+ CreditCard("ملل", prefix_moasse_mellal, 16, security_code="CVV2"),
+ ),
+ ("saman", CreditCard("سامان", prefix_saman_bank, 16, security_code="CVV2")),
+ ("kosar", CreditCard("کوثر", prefix_kosar, 16, security_code="CVV2")),
+ ("refah", CreditCard("رفاه", prefix_refah, 16, security_code="CVV2")),
+ ("saderat", CreditCard("صادرات", prefix_saderat, 16, security_code="CVV2")),
+ ("tat", CreditCard("تات", prefix_tat, 16, security_code="CVV2")),
+ ("sina", CreditCard("سینا", prefix_sina, 16, security_code="CVV2")),
+ (
+ "kar_afarin",
+ CreditCard("کار آفرین", prefix_kar_afarin, 16, security_code="CVV2"),
+ ),
+ ("sepah", CreditCard("سپه", prefix_sepah, 16, security_code="CVV2")),
+ ("maskan", CreditCard("مسکن", prefix_maskan, 16, security_code="CVV2")),
+ (
+ "parsian",
+ CreditCard("پارسیان", prefix_parsian, 16, security_code="CVV2"),
+ ),
+ ("bim", CreditCard("صنعت و معدن", prefix_bim, 16, security_code="CVV2")),
+ )
+ )
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/fa_IR/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/credit_card/fa_IR/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..1f4bb79
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/fa_IR/__pycache__/__init__.cpython-311.pyc
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/pt_PT/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/credit_card/pt_PT/__init__.py
new file mode 100644
index 0000000..bfb500b
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/pt_PT/__init__.py
@@ -0,0 +1,298 @@
+from collections import OrderedDict
+
+from .. import CreditCard
+from .. import Provider as CreditCardProvider
+
+
+class Provider(CreditCardProvider):
+ """Implementation of ``pt_PT`` locale credit card
+
+ For all methods that take ``card_type`` as an argument a random card type
+ will be used if the supplied value is ``None``. The list of valid card types
+ includes ``'visa'``, ``'mastercard'`` and ``'maestro'``.
+
+ Source: https://bincheck.org/portugal
+ """
+
+ prefix_visa = [
+ "400131",
+ "400190",
+ "400817",
+ "402192",
+ "402947",
+ "402956",
+ "403005",
+ "403006",
+ "403007",
+ "403008",
+ "403271",
+ "404520",
+ "404530",
+ "405758",
+ "406170",
+ "406475",
+ "407548",
+ "407549",
+ "407575",
+ "408237",
+ "408239",
+ "409842",
+ "409843",
+ "410000",
+ "410344",
+ "410345",
+ "410553",
+ "410557",
+ "411635",
+ "411700",
+ "411701",
+ "411869",
+ "412487",
+ "412488",
+ "412489",
+ "412657",
+ "412782",
+ "412990",
+ "413014",
+ "413793",
+ "413871",
+ "415158",
+ "415159",
+ "415170",
+ "415171",
+ "415174",
+ "415175",
+ "415194",
+ "415195",
+ "415238",
+ "415272",
+ "415273",
+ "415403",
+ "415404",
+ "415405",
+ "415440",
+ "415441",
+ "415569",
+ "415920",
+ "415961",
+ "416952",
+ "416963",
+ "416970",
+ "417005",
+ "417091",
+ "417092",
+ "417337",
+ "418847",
+ "419022",
+ "419682",
+ "419683",
+ "419684",
+ "421149",
+ "421510",
+ "422080",
+ "422240",
+ "422241",
+ "422414",
+ "422417",
+ "422597",
+ "422869",
+ "423392",
+ "423393",
+ "424118",
+ "424184",
+ "424208",
+ "424661",
+ "425509",
+ "425510",
+ "425906",
+ "426150",
+ "426360",
+ "426370",
+ "427256",
+ "427304",
+ "427729",
+ "427770",
+ "427867",
+ "428139",
+ "428184",
+ "428185",
+ "428186",
+ "428187",
+ "429711",
+ "430240",
+ "430241",
+ "431926",
+ "433390",
+ "433391",
+ "433511",
+ "433512",
+ "433513",
+ "433599",
+ "433618",
+ "433622",
+ "433966",
+ "437886",
+ "438257",
+ "439070",
+ "440637",
+ "440644",
+ "440645",
+ "442664",
+ "443977",
+ "443978",
+ "444224",
+ "444227",
+ "445961",
+ "445962",
+ "446140",
+ "446144",
+ "449389",
+ "450915",
+ "451156",
+ "451166",
+ "454755",
+ "455250",
+ "455290",
+ "455292",
+ "455658",
+ "456811",
+ "456812",
+ "457031",
+ "458058",
+ "458059",
+ "459432",
+ "459433",
+ "459449",
+ "460340",
+ "460341",
+ "460342",
+ "461247",
+ "461248",
+ "461249",
+ "462731",
+ "462732",
+ "464406",
+ "465964",
+ "476066",
+ "476067",
+ "476068",
+ "476069",
+ "476070",
+ "476071",
+ "476329",
+ "477920",
+ "477921",
+ "477922",
+ "477947",
+ "477989",
+ "478062",
+ "478063",
+ "479702",
+ "479736",
+ "483088",
+ "485672",
+ "486449",
+ "486457",
+ "489434",
+ "489485",
+ "490772",
+ "490830",
+ "490831",
+ "490832",
+ "490841",
+ "490863",
+ "491213",
+ "491546",
+ "491547",
+ "491613",
+ "492194",
+ "493402",
+ "493480",
+ "493800",
+ "493801",
+ "493830",
+ "498800",
+ "499968",
+ "499969",
+ "499986",
+ "422239",
+ "422041",
+ "464409",
+ "464408",
+ ]
+
+ prefix_mastercard = [
+ "510122",
+ "510123",
+ "512556",
+ "518772",
+ "519744",
+ "519774",
+ "520342",
+ "524552",
+ "524878",
+ "525625",
+ "525808",
+ "526819",
+ "527014",
+ "528024",
+ "529119",
+ "530267",
+ "530770",
+ "532355",
+ "536468",
+ "541171",
+ "541557",
+ "542081",
+ "542098",
+ "542858",
+ "543099",
+ "543116",
+ "543123",
+ "544051",
+ "544052",
+ "544233",
+ "547260",
+ "547459",
+ "548168",
+ "548169",
+ "552727",
+ "552755",
+ "553057",
+ "554506",
+ "554517",
+ "554518",
+ "556660",
+ "557836",
+ "557882",
+ "557883",
+ "557888",
+ ]
+
+ prefix_maestro = [
+ "501654",
+ "501659",
+ "670530",
+ "670811",
+ "670812",
+ "676938",
+ "676938",
+ "677393",
+ "677707",
+ "670835",
+ "670817",
+ ]
+
+ credit_card_types = OrderedDict(
+ (
+ (
+ "maestro",
+ CreditCard("Maestro", prefix_maestro, 16, security_code="CVV2"),
+ ),
+ (
+ "mastercard",
+ CreditCard("Mastercard", prefix_mastercard, 16, security_code="CVV2"),
+ ),
+ ("visa", CreditCard("Visa", prefix_visa, 16, security_code="CVV2")),
+ )
+ )
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/pt_PT/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/credit_card/pt_PT/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..663350d
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/pt_PT/__pycache__/__init__.cpython-311.pyc
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/ru_RU/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/credit_card/ru_RU/__init__.py
new file mode 100644
index 0000000..34f2a97
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/ru_RU/__init__.py
@@ -0,0 +1,115 @@
+from collections import OrderedDict
+from typing import Optional
+
+from faker.providers.person.ru_RU import translit
+
+from .. import CardType, CreditCard
+from .. import Provider as CreditCardProvider
+
+
+class Provider(CreditCardProvider):
+ """Implement credit card provider for ``ru_RU`` locale.
+
+ For all methods that take ``card_type`` as an argument, a random card type
+ will be used if the supplied value is ``None``. The list of valid card types
+ includes ``'amex'``, ``'maestro'``, ``'mastercard'``, ``'mir'``,
+ ``'unionpay'``, and ``'visa'``.
+
+ Sources:
+
+ - https://en.wikipedia.org/wiki/Payment_card_number#Issuer_identification_number_(IIN)
+ """
+
+ prefix_visa = ["4"]
+ prefix_mastercard = [
+ "51",
+ "52",
+ "53",
+ "54",
+ "55",
+ "222%",
+ "223",
+ "224",
+ "225",
+ "226",
+ "227",
+ "228",
+ "229",
+ "23",
+ "24",
+ "25",
+ "26",
+ "270",
+ "271",
+ "2720",
+ ]
+ prefix_mir = ["2200", "2201", "2202", "2203", "2204"]
+ prefix_maestro = [
+ "50",
+ "56",
+ "57",
+ "58",
+ "59",
+ "60",
+ "61",
+ "62",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ ]
+ prefix_amex = ["34", "37"]
+ prefix_unionpay = ["62", "81"]
+
+ credit_card_types = OrderedDict(
+ (
+ ("visa", CreditCard("Visa", prefix_visa, security_code="CVV2")),
+ (
+ "mastercard",
+ CreditCard("Mastercard", prefix_mastercard, security_code="CVC2"),
+ ),
+ ("mir", CreditCard("МИР", prefix_mir)),
+ ("maestro", CreditCard("Maestro", prefix_maestro, security_code="CVV2")),
+ (
+ "amex",
+ CreditCard(
+ "American Express",
+ prefix_amex,
+ 15,
+ security_code="CID",
+ security_code_length=4,
+ ),
+ ),
+ ("unionpay", CreditCard("Union Pay", prefix_unionpay)),
+ )
+ )
+
+ def credit_card_full(self, card_type: Optional[CardType] = None) -> str:
+ """Generate a set of credit card details."""
+ card = self._credit_card_type(card_type)
+
+ tpl = "{provider}\n" "{owner}\n" "{number} {expire_date}\n" "{security}: {security_nb}\n" "{issuer}"
+
+ tpl = tpl.format(
+ provider=card.name,
+ owner=translit(
+ self.generator.parse(
+ self.random_element(
+ [
+ "{{first_name_male}} {{last_name_male}}",
+ "{{first_name_female}} {{last_name_female}}",
+ ]
+ )
+ )
+ ),
+ number=self.credit_card_number(card),
+ expire_date=self.credit_card_expire(),
+ security=card.security_code,
+ security_nb=self.credit_card_security_code(card),
+ issuer=self.generator.parse("{{bank}}"),
+ )
+
+ return self.generator.parse(tpl)
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/ru_RU/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/credit_card/ru_RU/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..9dbf258
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/ru_RU/__pycache__/__init__.cpython-311.pyc
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/uk_UA/__init__.py b/venv/lib/python3.11/site-packages/faker/providers/credit_card/uk_UA/__init__.py
new file mode 100644
index 0000000..3ced366
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/uk_UA/__init__.py
@@ -0,0 +1,58 @@
+from collections import OrderedDict
+from typing import Optional
+
+from faker.providers.person.uk_UA import translit
+
+from .. import CardType, CreditCard
+from .. import Provider as CreditCardProvider
+
+
+class Provider(CreditCardProvider):
+ """Implement credit card provider for ``uk_UA`` locale.
+ https://blog.ipay.ua/uk/sekrety-bankovskix-kart-kak-identificirovat-bank-po-nomeru-karty/
+ """
+
+ prefix_visa = ["4"]
+ prefix_mastercard = ["51", "52", "53", "54"]
+ prefix_prostir = ["9"]
+ prefix_maestro = ["6762"]
+
+ credit_card_types = OrderedDict(
+ (
+ ("visa", CreditCard("Visa", prefix_visa, security_code="CVV2")),
+ ("mastercard", CreditCard("Mastercard", prefix_mastercard, security_code="CVC2")),
+ ("prostir", CreditCard("ПРОСТІР", prefix_prostir, security_code="CVC2")),
+ ("maestro", CreditCard("Maestro", prefix_maestro, security_code="CVV")),
+ )
+ )
+
+ def credit_card_full(self, card_type: Optional[CardType] = None) -> str:
+ """Generate UA Credit Card:
+ Supported card types 'visa', 'mastercard', 'prostir', 'maestro'
+
+ :sample:
+ :sample: card_type="prostir"
+ :sample: card_type="mastercard"
+ """
+ card = self._credit_card_type(card_type)
+ tpl = "{provider}\n" "{owner}\n" "{number} {expire_date}\n" "{security}: {security_nb}\n" "{issuer}"
+ tpl = tpl.format(
+ provider=card.name,
+ owner=translit(
+ self.generator.parse(
+ self.random_element(
+ [
+ "{{first_name_male}} {{last_name_male}}",
+ "{{first_name_female}} {{last_name_female}}",
+ ]
+ )
+ )
+ ),
+ number=self.credit_card_number(card),
+ expire_date=self.credit_card_expire(),
+ security=card.security_code,
+ security_nb=self.credit_card_security_code(card),
+ issuer=self.generator.parse("{{bank}}"),
+ )
+
+ return self.generator.parse(tpl)
diff --git a/venv/lib/python3.11/site-packages/faker/providers/credit_card/uk_UA/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/faker/providers/credit_card/uk_UA/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000..f8a32e3
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/faker/providers/credit_card/uk_UA/__pycache__/__init__.cpython-311.pyc
Binary files differ