Repository: joke2k/faker

Issue:
Summary ticket for ``hu_HU`` provider
Summary ticket for issues with the ``hu_HU`` provider (I'm working on a PR to fix these).

- [x] ``providers.address.street_name`` (and descendants): incorrectly capitalises street/place/etc.
- [x] ``providers.address.street_address_with_county``: does not capitalise place name
- [x] ``providers.automotive.license_plate``: seems to be the UK licence plate structure, the correct Hungarian licence plate regex is ``\d{3}-[A-Z]{3}``
- [x] ``provides.company.company_suffix``: misspellings and miscapitalizations (e.g. ``Zrt.`` as ``ZRT``
- [x] ``providers.job``: this could be replaced with a professions list from KSH


Discussion:

Patch:
diff --git a/faker/providers/address/hu_HU/__init__.py b/faker/providers/address/hu_HU/__init__.py
index e9e82b9a..4e74b61d 100644
--- a/faker/providers/address/hu_HU/__init__.py
+++ b/faker/providers/address/hu_HU/__init__.py
@@ -20,9 +20,6 @@ class Provider(AddressProvider):
 
     city_formats = ('{{city_prefix}}{{city_part}}{{city_suffix}}', '{{city_part}}{{city_suffix}}', '{{real_city_name}}')
 
-    street_address_with_county_formats = (
-        '{{street_name}} {{building_number}}\n{{county}} megye\n{{postcode}} {{city}}',)
-
     street_address_formats = ('{{street_name}} {{building_number}}',)
 
     address_formats = ("{{street_address}}\n{{postcode}} {{city}}",)
@@ -106,8 +103,10 @@ class Provider(AddressProvider):
         return self.random_element(self.counties)
 
     def street_address_with_county(self):
-        pattern = self.random_element(self.street_address_with_county_formats)
-        return self.generator.parse(pattern)
+        return "{street_address}\n{county} megye\n{postcode} {city}".format(street_address=self.street_address(),
+                                                                            county=self.county(),
+                                                                            postcode=self.postcode(),
+                                                                            city=self.city().capitalize())
 
     def city_prefix(self):
         return self.random_element(self.city_prefs)
@@ -127,7 +126,7 @@ class Provider(AddressProvider):
                                    super(Provider, self).random_digit())
 
     def street_name(self):
-        return super(Provider, self).street_name().title()
+        return super(Provider, self).street_name().capitalize()
 
     def building_number(self):
         numeric_part = super(Provider, self).random_int(1, 250)
diff --git a/faker/providers/automotive/hu_HU/__init__.py b/faker/providers/automotive/hu_HU/__init__.py
new file mode 100644
index 00000000..7bbc3fd9
--- /dev/null
+++ b/faker/providers/automotive/hu_HU/__init__.py
@@ -0,0 +1,11 @@
+# coding=utf-8
+
+
+from __future__ import unicode_literals
+from .. import Provider as AutomotiveProvider
+
+class Provider(AutomotiveProvider):
+    # from https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_Hungary
+    license_formats = (
+            '???-###',
+        )
diff --git a/faker/providers/color/hu_HU/__init__.py b/faker/providers/color/hu_HU/__init__.py
new file mode 100644
index 00000000..f5c378f5
--- /dev/null
+++ b/faker/providers/color/hu_HU/__init__.py
@@ -0,0 +1,14 @@
+# coding=utf-8
+from collections import OrderedDict
+
+from faker.providers import BaseProvider
+
+
+class Provider(BaseProvider):
+
+    safe_colors = (
+        'fekete', 'bordó', 'zöld', 'királykék', 'oliva',
+        'bíbor', 'kékeszöld', 'citromzöld', 'kék', 'ezüst',
+        'szürke', 'sárga', 'mályva', 'akvamarin', 'fehér',
+    )
+
diff --git a/faker/providers/company/hu_HU/__init__.py b/faker/providers/company/hu_HU/__init__.py
index 3ace97c2..879c3f21 100644
--- a/faker/providers/company/hu_HU/__init__.py
+++ b/faker/providers/company/hu_HU/__init__.py
@@ -8,17 +8,11 @@ class Provider(CompanyProvider):
     formats = (
         '{{last_name}} {{company_suffix}}',
         '{{last_name}} {{last_name}} {{company_suffix}}',
-        '{{last_name}}'
+        '{{last_name}} és {{last_name}} {{company_suffix}}',
+        '{{last_name}} és társa {{company_suffix}}'
     )
 
-    company_suffixes = (
-        'Kft',
-        'és Tsa',
-        'Kht',
-        'ZRT',
-        'NyRT',
-        'BT'
-    )
+    company_suffixes = ('Kft.', 'Kht.', 'Zrt.', 'Bt.', 'Nyrt.', 'Kkt.')
 
     def company_suffix(self):
         return self.random_element(self.company_suffixes)
diff --git a/faker/providers/job/hu_HU/__init__.py b/faker/providers/job/hu_HU/__init__.py
new file mode 100644
index 00000000..3f296a95
--- /dev/null
+++ b/faker/providers/job/hu_HU/__init__.py
@@ -0,0 +1,9 @@
+# coding=utf-8
+from .. import BaseProvider
+
+class Provider(BaseProvider):
+    # Derived from KSH's FEOR'08
+    jobs = ('Titkár(nő)', 'Értékbecslő', 'Közterület-felügyelő', 'Építőmérnök', 'Köszörűs', 'Gépjármű- és motorkarbantartó', 'Mezőgazdasági mérnök', 'Számítógéphálózat- és rendszertechnikus', 'Adósságbehajtó', 'Fémöntőminta-készítő', 'Gyümölcs- és zöldségfeldolgozó', 'Telekommunikációs mérnök', 'Könyv- és lapkiadó szerkesztője', 'Geológus', 'Manikűrös', 'Energetikus', 'Kézbesítő', 'Kontroller', 'Mentőtiszt', 'Háztartási takarító és kisegítő', 'Dekoratőr', 'Tejfeldolgozó', 'Gyógytornász', 'Csomagkihordó', 'Kádár', 'Színész', 'Anyaggazdálkodó', 'Szoftverfejlesztő', 'Adó- és illetékhivatali ügyintéző', 'Utaskísérő', 'Táj- és kertépítészmérnök', 'Muzeológus', 'Koreográfus', 'Tetőfedő', 'Telepőr', 'Pedikűrös', 'Fémfeldolgozó', 'Intézményi takarító és kisegítő', 'Irodai szakmai irányító', 'Recepciós', 'Gépíró, szövegszerkesztő', 'Ifjúságsegítő', 'Pap', 'Adatbázis- és hálózati elemző', 'Szoftver- és alkalmazásfejlesztő', 'Burkoló', 'Történész', 'Intézményi takarító és kisegítő ', 'Kohó- és anyagtechnikus', 'Jogi asszisztens', 'Tőzsde- és pénzügyi ügynök', 'Varró', 'Bolti pénztáros', 'Kémikus', 'Kőműves', 'Szakorvos', 'Elemző közgazdász', 'Kézi mosó, vasaló', 'Irattáros', 'Földmérő és térinformatikus', 'Vendéglős', 'Élelmiszer-ipari mérnök', 'Kisállattartó és -tenyésztő', 'Szociológus', 'Lakatos', 'Pszichológus', 'Utcaseprő', 'Adatbázis-tervező és -üzemeltető', 'Gyermekfelügyelő', 'Metróvezető', 'Háztartási alkalmazott', 'Könyvelő', 'Általános irodai adminisztrátor', 'Épületasztalos', 'Ékszerkészítő', 'Üvegező', 'Könyvtári, levéltári nyilvántartó', 'Általános iskolai tanár, tanító', 'Szemétgyűjtő', 'Rendőr', 'Orvosi laboratóriumi asszisztens', 'Kubikos', 'Adatrögzítő', 'Informatikatanár', 'Fizikus', 'Vegyésztechnikus', 'Hímző', 'Ügynök', 'Kalapos', 'Egyéb művészetek tanára', 'Zöldségtermesztő', 'Dísznövény-, virág- és faiskolai kertész, csemetenevelő', 'Csipkeverő', 'Postai ügyfélkapcsolati foglalkozású', 'Tolmács', 'Kódoló', 'Fa- és könnyűipari mérnök', 'Szarvasmarha-, ló-, sertés-, juhtartó és -tenyésztő ', 'Település- és közlekedéstervező mérnök', 'Rendszergazda', 'Állatorvosi asszisztens', 'Újságíró', 'Piaci, utcai étel- és italárus', 'Néprajzkutató', 'Vám- és pénzügyőr', 'Hordár', 'Webrendszer-technikus', 'Hivatalsegéd', 'Üzletpolitikai elemző', 'Fogorvos', 'Statisztikus', 'Stukkózó', 'Utazásszervező', 'Épületbádogos', 'Szociális gondozó', 'Villamosipari technikus (elektronikai technikus)', 'Iratkezelő', 'Matróz', 'Trolibuszvezető', 'Banki pénztáros', 'Szikvízkészítő', 'Kovács', 'Minőségbiztosítási mérnök', 'Csillagász', 'Író', 'Könyvtáros', 'Fényképész', 'Bányászati technikus', 'Üzletpolitikai elemző, szervező', 'Jelnyelvi tolmács', 'Alkalmazásprogramozó', 'Cipőkészítő', 'Drágakőcsiszoló', 'Botanikus', 'Járműtakarító', 'Biztosítási ügynök', 'Gépészmérnök', 'Légiforgalmi irányító', 'Üveggyártó', 'Gumitermékgyártó', 'Repülőgépmotor-karbantartó', 'Építészmérnök', 'Tűzoltó', 'Könyvkötő', 'Pultos', 'Borász', 'Gyógyszerész', 'Kozmetikus', 'Segédápoló', 'Ápoló', 'Fordító', 'Munkavédelmi és üzembiztonsági foglalkozású', 'Végrehajtó, adósságbehajtó', 'Gyógyszertári asszisztens', 'Szőrmefestő', 'Bőrtermékkészítő', 'Műsorszóró és audiovizuális technikus', 'Kártevőirtó', 'Rakodómunkás', 'Szabásminta-készítő', 'Hulladékosztályozó', 'Erdő- és természetvédelmi mérnök', 'Készlet- és anyagnyilvántartó', 'Fogászati asszisztens', 'Séf', 'Könyvszakértő', 'Bróker', 'Áru- és divatbemutató', 'Kölcsönző', 'Épületgondnok', 'Telekommunikációs technikus', 'Környezetvédelmi technikus', 'Házvezető', 'Famegmunkáló', 'Szállodai recepciós', 'Kézi csomagoló', 'Ötvös', 'Csecsemő- és kisgyermeknevelő', 'Kerékpár-karbantartó', 'Operatőr', 'Ügyvéd', 'Szigetelő', 'Fizioterápiás asszisztens', 'Kereskedő', 'Biológus', 'Ruházati gép kezelője és gyártósor mellett dolgozó', 'Szűcs', 'Ügyféltájékoztató', 'Gyógynövénytermesztő', 'Lelkész', 'Énekes', 'Munka- és termelésszervező ', 'Légiforgalmi irányítástechnikus', 'Számítógép-hálózati elemző', 'Szabó', 'Szakács', 'Növényorvos ', 'Testőr', 'Erdő- és természetvédelmi technikus', 'Kőfaragó', 'Bányászati szakmai irányító', 'Régész', 'Lakossági kérdező', 'Számviteli ügyintéző', 'Természetvédelmi őr', 'Egyetemi, főiskolai oktató', 'Óvodapedagógus', 'Gyomírtó', 'Növényvédelmi szakértő', 'Védőnő', 'Egészségügyi dokumentátor ', 'Finommechanikai műszerész', 'Műszaki rajzoló', 'Demográfus', 'Általános orvos', 'Fedélzeti tiszt', 'Vagyonőr', 'Rendszerelemző', 'Tímár', 'Hajózómérnök', 'Hálózat- és multimédia-fejlesztő', 'Konyhai kisegítő', 'Mozigépész', 'Épületvillamossági szerelő', 'Bionövény-termesztő', 'Fogtechnikus', 'Büntetés-végrehajtási őr', 'Erdész', 'Vízgazdálkodási gépkezelő', 'Szerszámkészítő', 'Vegyészmérnök', 'Festő', 'Iratkezelő, irattáros', 'Légiforgalmi irányítástechnikai berendezések üzemeltetője', 'Masszőr', 'Zenetanár', 'Zálogházi ügyintéző és pénzkölcsönző', 'Jogtanácsos', 'Tehergépkocsi-vezető', 'Bolti eladó', 'Pénzintézeti ügyintéző', 'Növényorvosi asszisztens', 'Fitnesz- és rekreációs program irányítója', 'Zeneszerző', 'Építményszerkezet-szerelő', 'Vegyes profilú gazdálkodó', 'Pultfeltöltő', 'Képzőművész', 'Végrehajtó', 'Szerencsejáték-szervező', 'Jegypénztáros', 'Konyhafőnök', 'Műtőssegéd', 'Adótanácsadó', 'Jogász', 'Orvosi képalkotó diagnosztikai asszisztens', 'Zoológus', 'Látszerész', 'Szállítási, szállítmányozási nyilvántartó', 'Kárpitos', 'Házi gondozó', 'Táncművész', 'Cipész', 'Élelmiszer-ipari technikus', 'Zenész', 'Könyvelő (analitikus)', 'Felvásárló', 'Személyzeti és pályaválasztási szakértő', 'Bányamérnök', 'Pincér', 'Mosodai gép kezelője', 'Dietetikus', 'Rendező', 'Bognár', 'Targoncavezető', 'Hobbiállat-gondozó', 'Segédrendező', 'Marketing- és PR-ügyintéző', 'Bőrdíszműves', 'Darukezelő', 'Hallás- és beszédterapeuta', 'Konduktor', 'Villamosmérnök (energetikai mérnök)', 'Meteorológus', 'Táplálkozási tanácsadó', 'Cirkuszi előadóművész', 'Húsfeldolgozó', 'Vezető eladó', 'Könyvvizsgáló', 'Feldolgozóipari szakmai irányító', 'Pedagógiai szakértő', 'Telefonos értékesítési ügynök', 'Villamosvezető', 'Baromfitartó és -tenyésztő', 'Politológus', 'Mérőóra-leolvasó', 'Egyéb növénytermesztési foglalkozású', 'Méhész', 'Felvonószerelő', 'Személygépkocsi-vezető', 'Textilműves', 'Építő- és építésztechnikus', 'Bőröndös', 'Gipszkartonozó', 'Kalauz', 'Járművezető-oktató', 'Bérelszámoló', 'Bútorasztalos', 'Villanyszerelő', 'Kesztyűs', 'Nyomdai előkészítő', 'Mezőgazdasági technikus', 'Szőlő-, gyümölcstermesztő', 'Oktatási asszisztens', 'Édesiparitermék-gyártó', 'Fodrász', 'Nyomdász', 'Keramikus', 'Általános egészségügyi asszisztens', 'Ács', 'Kereskedelmi ügyintéző', 'Környezetfelmérő', 'Kéményseprő', 'Fotó- és mozgófilmlaboráns', 'Statisztikai ügyintéző', 'Szakképzett edző', 'Fa- és könnyűipari technikus', 'Múzeumi gyűjteménygondnok', 'Árufeltöltő', 'Idegenvezető', 'Mozdonyvezető', 'Kohó- és anyagmérnök', 'Műköves', 'Állatorvos', 'Földmérő és térinformatikai technikus ', 'Nyelvtanár', 'Ügyész', 'Sportoló', 'Címfestő', 'Nyelvész', 'Gyógypedagógus', 'Üzemanyagtöltő állomás kezelője', 'Fémcsiszoló', 'Kulturális szervező', 'Lakberendező', 'Grafikus és multimédia-tervező ', 'Középiskolai tanár', 'Cukrász', 'Légijármű-vezető', 'Sportszervező', 'Parkolóőr', 'Favágó', 'Matematikus', 'Pénzügyi elemző és befektetési tanácsadó', 'Konferencia- és rendezvényszervező', 'Faesztergályos', 'Kályha- és kandallóépítő', 'Közjegyző', 'Festékszóró', 'Statiszta', 'Minőségbiztosítási technikus', 'Épületszerkezet-tisztító', 'Menetjegyellenőr', 'Kereskedelmi tervező ', 'Munkaerő-piaci szolgáltatási ügyintéző', 'Adószakértő', 'Hegesztő', 'Gyorséttermi eladó', 'Iparművész', 'Díszítő', 'Szociálpolitikus', 'Gyártmány- és ruhatervező', 'Ingatlanforgalmazási ügyintéző', 'Kormányos', 'Díszletező', 'Segédszínész', 'Levéltáros', 'Robbantómester', 'Villamosipari technikus (energetikai technikus)', 'Ortopédiai eszközkészítő', 'Gépésztechnikus', 'Szociális segítő', 'Pék', 'Ipari alpinista', 'Villamosmérnök (elektronikai mérnök)', 'Személyi asszisztens', 'Ablaktisztító', 'Portás', 'Filozófus', 'Forgácsoló', 'Bábművész', 'Kárszakértő', 'Humánpolitikai adminisztrátor', 'Hangszerkészítő', 'Társadalombiztosítási és segélyezési hatósági ügyintéző', 'Optometrista', 'Szántóföldinövény-termesztő', 'Ingatlanügynök', 'Nyomozó', 'Egyéb, máshova nem sorolható technikus', 'Vezető takarító', 'Autóbuszvezető', 'Kárbecslő', 'Piaci árus', 'Bíró', 'Általános iskolai tanár', 'Szerszámköszörűs', 'Építőipari szakmai irányító')
+
+    def job(self):
+        return self.random_element(self.jobs)


Test patch:
diff --git a/tests/providers/test_address.py b/tests/providers/test_address.py
index af0aaf46..f7dd5b71 100644
--- a/tests/providers/test_address.py
+++ b/tests/providers/test_address.py
@@ -221,7 +221,43 @@ class TestHuHU(unittest.TestCase):
             assert pcd[2] > "0"
 
     def test_street_address(self):
-        """ Tests the street address in the hu_HU locale """
+        """Tests street address. A street address must consist of a street name, a place type and a number, and end in a period point."""
+        address = self.factory.street_address()
+        assert address[-1] == '.'
+        # Check for correct capitalisation of place type
+        assert address.split(" ")[-2][0].islower()
+        # Check for street number format
+        assert re.match(r"\d{1,4}\.", address.split(" ")[-1])
+
+    def test_street_address_with_county(self):
+        """Tests street address with country. A street address must be:
+        - in three rows,
+        - starting with a valid street address,
+        - contain a valid post code,
+        - contain the place name validly capitalized.
+        """
+        address = self.factory.street_address_with_county()
+        # Number of rows
+        assert len(address.split("\n")) == 3
+        first, second, last = address.split("\n")
+
+        # Test street address
+        assert first[0].isupper()
+        assert first.split(" ")[-2][0].islower()
+        assert re.match(r"\d{1,4}\.", first.split(" ")[-1])
+
+        # Test county line
+        assert second.split(" ")[-1][0].islower()
+        assert second.split(" ")[0][0].isupper()
+
+        # Test postcode
+        assert re.match(r"H-[1-9]\d{3}", last.split(" ")[0])
+
+        # Test place name capitalization
+        assert last.split(" ")[-1][0].isupper()
+
+    def test_address(self):
+        """ Tests the address provider in the hu_HU locale """
         address = self.factory.address()
         assert isinstance(address, string_types)
         address_with_county = self.factory.street_address_with_county()
diff --git a/tests/providers/test_automotive.py b/tests/providers/test_automotive.py
index 9f2984d4..ddabaa2b 100644
--- a/tests/providers/test_automotive.py
+++ b/tests/providers/test_automotive.py
@@ -18,3 +18,13 @@ class TestPtBR(unittest.TestCase):
         plate = self.factory.license_plate()
         assert isinstance(plate, string_types)
         assert self.format.match(plate)
+
+class TestHuHU(unittest.TestCase):
+
+    def setUp(self):
+        self.factory = Faker('hu_HU')
+
+    def test_hu_HU_plate_format(self):
+        plate = self.factory.license_plate()
+
+        assert re.match("[A-Z]{3}-\d{3}", plate)
diff --git a/tests/providers/test_company.py b/tests/providers/test_company.py
index c7146ede..495b0498 100644
--- a/tests/providers/test_company.py
+++ b/tests/providers/test_company.py
@@ -59,16 +59,23 @@ class TestHuHU(unittest.TestCase):
 
     def setUp(self):
         self.factory = Faker('hu_HU')
+        self.valid_suffixes = ('Kft.',
+                          'Kht.',
+                          'Zrt.',
+                          'Bt.',
+                          'Nyrt.',
+                          'Kkt.')
+
 
     def test_company_suffix(self):
-        suffixes = HuProvider.company_suffixes
         suffix = self.factory.company_suffix()
         assert isinstance(suffix, string_types)
-        assert suffix in suffixes
+        assert suffix in self.valid_suffixes
 
     def test_company(self):
         company = self.factory.company()
         assert isinstance(company, string_types)
+        assert company.split(" ")[-1] in self.valid_suffixes
 
 
 class TestPlPL(unittest.TestCase):
diff --git a/tests/providers/test_internet.py b/tests/providers/test_internet.py
index 3e3094e8..555e7975 100644
--- a/tests/providers/test_internet.py
+++ b/tests/providers/test_internet.py
@@ -65,7 +65,7 @@ class TestHuHU(unittest.TestCase):
     """ Tests internet module in the hu_HU locale. """
 
     def setUp(self):
-        self.factory = Faker('hu')
+        self.factory = Faker('hu_HU')
 
     def test_internet(self):
         domain_name = self.factory.domain_name()
diff --git a/tests/providers/test_job.py b/tests/providers/test_job.py
index 4b0f88a8..a6cb19c5 100644
--- a/tests/providers/test_job.py
+++ b/tests/providers/test_job.py
@@ -9,6 +9,7 @@ from faker import Faker
 from tests import string_types
 
 
+
 class TestJob(unittest.TestCase):
     """
     Test Job
@@ -33,3 +34,13 @@ class TestKoKR(unittest.TestCase):
     def test_job(self):
         job = self.factory.job()
         assert isinstance(job, string_types)
+
+class TestHuHU(unittest.TestCase):
+    "Tests the job module in the Hungarian locale."
+
+    def setUp(self):
+        self.factory = Faker('hu_HU')
+
+    def test_job(self):
+        job = self.factory.job()
+        assert isinstance(job, string_types)
diff --git a/tests/providers/test_phone_number.py b/tests/providers/test_phone_number.py
index d1b8dd61..ed4c22c9 100644
--- a/tests/providers/test_phone_number.py
+++ b/tests/providers/test_phone_number.py
@@ -2,6 +2,7 @@
 
 from __future__ import unicode_literals
 
+import re
 import unittest
 
 from faker import Faker
@@ -61,3 +62,12 @@ class TestPhoneNumber(unittest.TestCase):
         assert len(msisdn) == 13
         assert msisdn.isdigit()
         assert msisdn[0:4] in formats
+
+class TestHuHU(unittest.TestCase):
+
+    def setUp(self):
+        self.factory = Faker('hu_HU')
+
+    def test_phone_number(self):
+        phone_number = self.factory.phone_number()
+        re.match(r"[1-9]\d/\d{3} \d{4}", phone_number)