Repository: joke2k/faker
Pull request #1110 (2020-02-18 21:50:44)

[Add] pt_PT locale
### What does this changes

Add street prefix diversity which are missing for pt_PT.
Add names of streets generated from real street names from the two largest cities of the country (Lisbon and Porto). 

Add new file for pt_PT banking details 

### What was wrong

Previously, street names were generated only based on combinations of given names + surnames. 
Street names can be also dates, historical figures (real or allegorical) or allusive to certain landmarks. 

Bank information was not available for pt_PT as well. 

fcurella: Thank you! Could add tests for `place_name ` and the new bank provider?

Patch:
diff --git a/faker/providers/address/ko_KR/__init__.py b/faker/providers/address/ko_KR/__init__.py
index cafde5a0..23688706 100644
--- a/faker/providers/address/ko_KR/__init__.py
+++ b/faker/providers/address/ko_KR/__init__.py
@@ -1,5 +1,9 @@
+import string
+
 from .. import Provider as AddressProvider
 
+ALPHABET = string.ascii_uppercase
+
 
 class Provider(AddressProvider):
     """
@@ -47,7 +51,7 @@ class Provider(AddressProvider):
         '타워',
     )
     road_suffixes = ('로', '길', '거리', '가')
-    town_suffixes = ('동', '리', '마을')
+    town_suffixes = ('동', '읍', '면', '리', '마을')
     postcode_formats = ('###-###',)
     new_postal_code_formats = ('#####',)
     metropolitan_cities = (
@@ -123,6 +127,54 @@ class Provider(AddressProvider):
         '수원시 장안구',
         '의정부시',
         '여주시',
+        '춘천시',
+        '원주시',
+        '강릉시',
+        '동해시',
+        '태백시',
+        '속초시',
+        '삼척시',
+        '홍천군',
+        '횡성군',
+        '영월군',
+        '평창군',
+        '정선군',
+        '철원군',
+        '화천군',
+        '양구군',
+        '인제군',
+        '고성군',
+        '양양군',
+        '천안시 동남구',
+        '천안시 서북구',
+        '공주시',
+        '보령시',
+        '아산시',
+        '서산시',
+        '논산시',
+        '계룡시',
+        '당진시',
+        '금산군',
+        '부여군',
+        '서천군',
+        '청양군',
+        '홍성군',
+        '예산군',
+        '태안군',
+        '청주시 상당구',
+        '청주시 서원구',
+        '청주시 흥덕구',
+        '청주시 청원구',
+        '충주시',
+        '제천시',
+        '보은군',
+        '옥천군',
+        '영동군',
+        '증평군',
+        '진천군',
+        '괴산군',
+        '음성군',
+        '단양군',
     )
     road_names = (
         '압구정',
@@ -216,7 +268,7 @@ class Provider(AddressProvider):
         '바',
         '##',
         '###',
-    )
+    ) + tuple(ALPHABET)
     land_numbers = (
         '###',
         '###-#',
diff --git a/faker/providers/address/pt_PT/__init__.py b/faker/providers/address/pt_PT/__init__.py
index 5e7929b8..2ba63872 100644
--- a/faker/providers/address/pt_PT/__init__.py
+++ b/faker/providers/address/pt_PT/__init__.py
@@ -2,13 +2,15 @@ from .. import Provider as AddressProvider
 
 
 class Provider(AddressProvider):
-    street_prefixes = ('Av', 'Avenida', 'R.', 'Rua', 'Travessa', 'Largo')
+
+    street_prefixes = ('Av', 'Avenida', 'R.', 'Rua', 'Travessa', 'Largo', 'Alameda', 'Praça')
 
     city_formats = ('{{city_name}}',)
     street_name_formats = (
         '{{street_prefix}} {{last_name}}',
         '{{street_prefix}} {{first_name}} {{last_name}}',
         '{{street_prefix}} de {{last_name}}',
+        '{{street_prefix}} {{place_name}}',
     )
 
     street_address_formats = (
@@ -266,6 +268,125 @@ class Provider(AddressProvider):
         "Vila Viçosa", "Vimioso", "Vinhais", "Viseu", "Vizela", "Vouzela",
     ]
 
+    # from https://pt.wikipedia.org/wiki/Lista_de_arruamentos_de_Lisboa
+    # and https://pt.wikipedia.org/wiki/Lista_de_arruamentos_do_Porto
+    places = (
+        "da Igreja", "António Sérgio", "Cardeal Cerejeira", "Coronel Marques Júnior", "da Encarnação",
+        "da Música", "da Quinta de Santo António", "da Universidade", "das Comunidades Portuguesas",
+        "das Linhas de Torres", "de Santo António dos Capuchos", "do Beato", "Dom Afonso Henriques",
+        "dos Oceanos", "dos Pinheiros", "Edgar Cardoso", "Mahatma Gandhi",
+        "Manuel Ricardo Espírito Santo", "Padre Álvaro Proença", "Roentgen", "da Boavista",
+        "da Cova da Moura", "das Conchas", "de Caselas", "de São Francisco",
+        "do Carvalhão", "do Longo", "do Penalva", "do Varejão",
+        "dos Moinhos", "da Conceição", "das Portas do Mar", "de Jesus",
+        "do Evaristo", "do Rosário", "Escuro", "Grande de Cima",
+        "Areeiro", "Campolide", "Madrid", "Paris (Nascente)",
+        "Paris (Poente)", "Roma", "Sabugosa", "Novo (à Travessa das Águas Boas)",
+        "da Ponte da Lama", "da Praia da Galé", "do Duro", "dos Ferreiros",
+        "das Rolas", "da Lingueta", "das Naus", "do Olival",
+        "do Sodré", "dos Argonautas", "Português", "da Figueira",
+        "de Santo Estêvão", "de São Lourenço", "de São Miguel", "do Tijolo",
+        "dos Olivais", "da Feiteira", "da Rainha", "da Raposa",
+        "das Andorinhas", "das Cegonhas", "das Gaivotas ao Parque das Nações", "de Baixo da Penha",
+        "de Palma de Cima", "do Alto do Varejão", "do Arboreto", "dos Estorninhos",
+        "dos Flamingos", "dos Melros", "dos Pardais", "dos Pinheiros ao Parque das Nações",
+        "dos Rouxinóis", "Velho do Outeiro", "das Amoreiras", "das Cebolas",
+        "de Santa Clara", "dos Mártires da Pátria", "Grande", "Pequeno",
+        "de Campolide", "da Graça", "de Colares", "Norte do Bairro da Encarnação",
+        "Sul do Bairro da Encarnação", "da Torrinha", "do Castelo", "de Santa Helena",
+        "da Sé", "das Bolas", "das Chagas", "José António Marques",
+        "do Monte", "Gerais", "D. Carlos I ao Parque das Nações", "Adão Barata",
+        "Alfredo Keil", "Alice Cruz", "Amália Rodrigues", "Amélia Carvalheira",
+        "Amnistia Internacional", "Augusto Monjardino", "Bento Martins", "das Nações",
+        "Ducla Soares", "Eduardo Prado Coelho", "Elisa Baptista de Sousa Pedroso", "Fernanda de Castro",
+        "Fernando Pessa", "Ferreira de Mira", "Garcia de Orta ao Parque das Nações", "Irmã Lúcia",
+        "Jorge Luis Borges", "Luís Ferreira", "Maria da Luz Ponces de Carvalho", "Maria de Lourdes Sá Teixeira",
+        "Maria José Moura", "Mário Ruivo", "Mário Soares", "9 de Abril",
+        "Prof. António de Sousa Franco", "Prof. Francisco Caldeira Cabral", "Pulido Garcia", "Tristão da Silva",
+        "Ribeirinhos", "Sophia de Mello Breyner Andresen", "do Mirante", "do Alto de São João",
+        "General Afonso Botelho", "Eduardo VII de Inglaterra", "Silva Porto", "Artur Agostinho",
+        "da Ilha dos Amores", "da Nau Catrineta", "da Vila Expo", "das Âncoras",
+        "das Fragatas", "das Garças", "das Gáveas ao Parque das Nações", "das Musas",
+        "das Tágides", "de Neptuno", "de Ulisses", "do Adamastor",
+        "do Amazonas", "do Báltico", "do Campo da Bola", "do Cantábrico",
+        "do Levante", "do Parque", "do Ródano", "do Sapal",
+        "do Tejo", "do Trancão", "dos Aventureiros", "dos Cruzados",
+        "dos Fenícios", "dos Heróis do Mar", "dos Jacarandás", "dos Mastros",
+        "dos Navegadores", "João Jayme Faria Affonso", "Júlio Verne", "Afonso de Albuquerque",
+        "da Cruz", "da Galega", "das Canas", "das Galeotas ao Parque das Nações",
+        "das Pirogas", "de Dom Fradique", "do Carrasco", "do Peneireiro",
+        "do Pimenta", "do Pinzaleiro", "do Seabra", "do Sequeiro",
+        "do Sextante", "do Tronco", "dos Escaleres", "do Borratém",
+        "do Mar", "Adolfo Ayala", "Cuf", "da Quinta de São João Baptista",
+        "da Quinta do Guarda-Mor", "da Rua Duque de Palmela", "das Torres do Restelo", "do Chinquilho",
+        "Fernando Valle", "Maestro Ivo Cruz", "Prof. António José Saraiva", "Professor Gonçalves Ferreira",
+        "Professor José Conde", "Teófilo Ferreira", "das Necessidades", "do Mercado",
+        "dos Anjos", "do Conde de Óbidos", "de Palma", "Almirante Pinheiro de Azevedo",
+        "António Dias Lourenço", "Coronel Vítor Alves", "da Expo 98", "das Olaias",
+        "das Oliveiras", "de Pina Manique", "dos Vice-reis", "Matilde Bensaúde",
+        "Nelson Mandela", "Pupilos do Exército", "República Argentina", "República da Colômbia",
+        "Visconde de Alvalade", "do Barcal", "do Calhau", "de São Vicente",
+        "das Ondas", "dos Corvos", "Feia", "Arquitecto Carlos Ramos",
+        "das Antas", "das Fontainhas", "de 25 de Abril", "de Aquilino Ribeiro",
+        "de Basílio Teles", "de Cartes", "de Cláudio Carneiro", "de Eça de Queirós",
+        "de Manuel d'Arriaga", "do Dr. António Macedo", "do Dr. Fernando de Azeredo Antas", "do Prof. Hernâni Monteiro",
+        "do Prof. Ruy Luís Gomes", "dos Capitães de Abril", "25 de Abril", "da Associação Empresarial de Portugal",
+        "da França", "de Camilo", "de D. Afonso Henriques", "de D. Carlos I",
+        "de D. João II", "de Fernão de Magalhães", "de Fontes Pereira de Melo", "de Gustavo Eiffel",
+        "de Montevideu", "de Nun'Álvares Pereira", "de Paiva Couceiro", "de Rodrigues de Freitas",
+        "de Sidónio Pais", "de Vasco da Gama", "de Vímara Peres", "do Bessa",
+        "do Brasil (Porto)", "do Conselho da Europa", "do Dr. Antunes Guimarães", "do Marechal Gomes da Costa",
+        "dos Aliados", "dos Combatentes da Grande Guerra", "Flor da Rosa", "José Domingues dos Santos",
+        "da Agra do Amial", "da Fonte da Moura", "da Pasteleira", "da Rainha D. Leonor",
+        "de Costa Cabral", "de Francos", "de Manuel Cardoso Agrelos", "de Pio XII",
+        "de Ramalde", "de São João de Deus", "de São Roque da Lameira", "de São Vicente de Paulo",
+        "de Santo Eugénio", "do Aleixo", "do Bom Sucesso", "do Carvalhido",
+        "do Cerco do Porto", "do Dr. Nuno Pinheiro Torres", "do Falcão", "do Lagarteiro",
+        "do Leal", "do Outeiro", "do Regado", "do Viso",
+        "Herculano", "Central", "da Bela Vista", "da Beneditina",
+        "da Senhora da Luz", "de Bonjóia", "de Carreiras", "de Passos Manuel",
+        "de S. João da Foz", "de S. Macário", "de S. Marçal", "do Arrabalde",
+        "do Campo", "do Campo Alegre", "do Machado", "do Meiral",
+        "do Paço", "do Pedregulho", "do Preto", "de Baixo",
+        "de Cima", "da Alfândega", "da Estiva", "da Ribeira",
+        "das Pedras", "do Bicalho", "dos Guindais", "da Arrábida",
+        "da Boa Viagem", "da Póvoa", "da Ranha", "das Carquejeiras",
+        "das Laranjeiras", "das Virtudes", "de Chaves de Oliveira", "de D. Pedro Pitões",
+        "de Godim", "de João do Carmo", "de Maceda", "de Marques Marinho",
+        "de Monchique", "de Nova Sintra", "de São Pedro", "de Serrúbia",
+        "de Sobre-o-Douro", "de Vandoma", "do Calvário", "do Carregal",
+        "do Forno Velho", "do Monte da Lapa", "do Monte de S. João", "do Ouro",
+        "do Rego Lameiro", "dos Ingleses", "da Fonte de Cima", "das Congostas",
+        "da Asprela", "de Vinte e Quatro de Agosto", "do Rou", "de Antero de Quental",
+        "de Estêvão Vasconcelos", "de Viterbo de Campos", "do Dr. Manuel Laranjeira",
+        "Carolina Michaelis de Vasconcelos", "da Vitória", "das Sereias", "das Verdades", "de S. Francisco de Borja",
+        "do Adro", "do Barredo", "do Caminho Novo", "do Cidral de Baixo",
+        "do Cidral de Cima", "do Codeçal", "do Colégio", "do Monte Cativo",
+        "do Monte dos Judeus", "do Pinheiro", "do Recanto", "do Roleto",
+        "dos Armazéns", "do Molhe", "da Circunvalação", "de Gondomar",
+        "Nacional 108", "Nacional 209", "de Moradias Populares do Eng.º Machado Vaz",
+        "de Moradais Populares do Carriçal", "de Antero de Figueiredo", "de Arnaldo Gama", "de Belém",
+        "de Carrilho Videira", "de Guedes de Oliveira", "de João Chagas", "de Marques de Oliveira", "de Teófilo Braga",
+        "do Moreda", "do Passeio Alegre", "Machado de Asis", "Severo Portela",
+        "da Foz", "do Bolhão", "dos Bacalhoeiros", "da Luz",
+        "do Seminário", "S. Bartolomeu", "de S. Lázaro", "das Escadas do Monte dos Judeus",
+        "das Japoneiras", "de S. Salvador", "do Bonjardim", "de Luiz I",
+        "de Maria Pia", "do Freixo", "do Carvão", "da Banda de Ramalde",
+        "da Cidade da Praia", "das Mimosas", "de Adelino Amaro da Costa", "de Augusto Gomes",
+        "de Bernarda Ferreira Lacerda", "de Eduardo Soares", "de Francisco Borges", "de Irene de Castro",
+        "de João Augusto Ribeiro", "de José Régio", "de José Serra", "de Luís António Verney",
+        "de Públia Hortênsia", "de Ribeiro Sanches", "de S. Mamede", "do Dr. Jaime Cortesão",
+        "do Maestro Afonso Valentim", "do Maestro Resende Dias", "do Mestre de Aviz", "do Prof. Egas Moniz",
+        "Egito Gonçalves", "Ernesto Veiga de Oliveira", "João Glama", "José Luís Nunes",
+        "Manuel Gonçalves Moreira", "Artur Cupertino de Miranda", "Associação Empresarial de Portugal",
+        "Manuel Pinto de Azevedo Júnior", "Goelas de Pau", "de Cintura Interna", "do Almirante Gago Coutinho",
+        "do Castelo do Queijo", "Futebol Clube do Porto", "Panorâmica", "Panorâmica Edgar Cardoso",
+        "de Gonçalo Cristóvão", "do Cais das Pedras", "da Aldeia", "da Baleia", "da Bouça",
+        "da Carvalhosa", "da Companhia", "da Ilha do Ferro", "da Pedreira", "da Senhora da Lapa", "das Andrezas",
+        "de Grijó", "de Lamas", "de S. Brás", "de Santana", "do Anjo", "do Anjo da Guarda",
+        "do Buraco", "do José da Mestra", "do Monte da Pena", "do Picoto", "do Sobreirinho",
+        )
+
     def street_prefix(self):
         """
         :example 'Rua'
@@ -295,3 +416,9 @@ class Provider(AddressProvider):
         :example 'Miranda do Douro'
         """
         return self.random_element(self.freguesias)
+
+    def place_name(self):
+        """
+        :example "do Pombal"
+        """
+        return self.random_element(self.places)
diff --git a/faker/providers/bank/pt_PT/__init__.py b/faker/providers/bank/pt_PT/__init__.py
new file mode 100644
index 00000000..0f0a6734
--- /dev/null
+++ b/faker/providers/bank/pt_PT/__init__.py
@@ -0,0 +1,6 @@
+from .. import Provider as BankProvider
+
+
+class Provider(BankProvider):
+    bban_format = '#####################'
+    country_code = 'PT'


Test patch:
diff --git a/tests/providers/test_address.py b/tests/providers/test_address.py
index ddeb2557..4e3c889f 100644
--- a/tests/providers/test_address.py
+++ b/tests/providers/test_address.py
@@ -1051,6 +1051,11 @@ class TestPtPT(unittest.TestCase):
         assert isinstance(freguesia, str)
         assert freguesia in PtPtProvider.freguesias
 
+    def test_place_name(self):
+        place_name = self.fake.place_name()
+        assert isinstance(place_name, str)
+        assert place_name in PtPtProvider.places
+
 
 class TestEnPh(unittest.TestCase):
     num_sample_runs = 1000
diff --git a/tests/providers/test_bank.py b/tests/providers/test_bank.py
index d3682c24..a6cc524d 100644
--- a/tests/providers/test_bank.py
+++ b/tests/providers/test_bank.py
@@ -94,3 +94,19 @@ class TestRuRU(unittest.TestCase):
     def test_bank(self):
         bank = self.fake.bank()
         assert re.match(r"\D{3,41}", bank)
+
+
+class TestPtPt(unittest.TestCase):
+    """Tests the bank provider for pt_PT locale"""
+
+    def setUp(self):
+        self.fake = Faker('pt_PT')
+        Faker.seed(0)
+
+    def test_bban(self):
+        bban = self.fake.bban()
+        assert re.match(r"\d{21}", bban)
+
+    def test_iban(self):
+        iban = self.fake.iban()
+        assert re.match(r"PT\d{21}", iban)