Repository: joke2k/faker

Issue:
fake.address does not work properly for 'de-CH'
* Faker version: 9.8.3             build: pyhd8ed1ab_0    from: conda-forge
* OS: Windows 10 / anaconda

    fake = Faker('de_CH')
    fake.address()

does not work properly. 
Instead of producing a city/village, it produces a Canton
### Steps to reproduce

from faker import Faker
fake = Faker('de_CH')
print(fake.address())

### Expected behavior

Output should be: 
street housenumber
zip_code village

### Actual behavior

Output  is
street housenumber
zip_code canton


Discussion:
Provider for `de_CH` locale is not fully filled. There's no streets or cities, only cantons list.
Streets + housenumber work fine. Ca I helf to fill de_CH ?
Feel free to submit a Pull Request with the data :)

Resolving patch:
diff --git a/faker/providers/address/de_CH/__init__.py b/faker/providers/address/de_CH/__init__.py
--- a/faker/providers/address/de_CH/__init__.py
+++ b/faker/providers/address/de_CH/__init__.py
@@ -4,7 +4,7 @@
 
 
 class Provider(AddressProvider):
-    city_formats = ("{{canton_name}}",)
+    city_formats = ("{{city_name}}",)
     building_number_formats = ("%", "%#", "%#", "%#", "%##")
     street_suffixes = ["strasse"]
     street_name_formats = ("{{last_name}}{{street_suffix}}",)
@@ -22,6 +22,171 @@ class Provider(AddressProvider):
         "9###",
     )
 
+    cities = (
+        "Aarau",
+        "Adliswil",
+        "Aesch",
+        "Affoltern",
+        "Aigle",
+        "Allschwil",
+        "Altstätten",
+        "Amriswil",
+        "Arbon",
+        "Arth",
+        "Baar",
+        "Baden",
+        "Basel",
+        "Bassersdorf",
+        "Bellinzona",
+        "Belp",
+        "Bern",
+        "Bernex",
+        "Biel/Bienne",
+        "Binningen",
+        "Birsfelden",
+        "Brig-Glis",
+        "Brugg",
+        "Buchs",
+        "Bülach",
+        "Bulle",
+        "Burgdorf",
+        "Carouge",
+        "Cham",
+        "Chêne-Bougeries",
+        "Chur",
+        "Crans-Montana",
+        "Davos",
+        "Delsberg",
+        "Dietikon",
+        "Dübendorf",
+        "Ebikon",
+        "Ecublens",
+        "Einsiedeln",
+        "Emmen",
+        "Flawil",
+        "Frauenfeld",
+        "Freiburg",
+        "Freienbach",
+        "Genf",
+        "Gland",
+        "Glarus",
+        "Glarus",
+        "Gossau",
+        "Gossau",
+        "Grenchen",
+        "Herisau",
+        "Hinwil",
+        "Horgen",
+        "Horw",
+        "Illnau-Effretikon",
+        "Ittigen",
+        "Kloten",
+        "Köniz",
+        "Kreuzlingen",
+        "Kriens",
+        "Küsnacht",
+        "Küssnacht",
+        "La Chaux-de-Fonds",
+        "La Tour-de-Peilz",
+        "Lancy",
+        "Langenthal",
+        "Lausanne",
+        "Le Grand-Saconnex",
+        "Lenzburg",
+        "Liestal",
+        "Locarno",
+        "Lugano",
+        "Lutry",
+        "Luzern",
+        "Lyss",
+        "Männedorf",
+        "Martigny",
+        "Maur",
+        "Meilen",
+        "Mendrisio",
+        "Meyrin",
+        "Möhlin",
+        "Monthey",
+        "Montreux",
+        "Morges",
+        "Münchenbuchsee",
+        "Münchenstein",
+        "Münsingen",
+        "Muri",
+        "Muttenz",
+        "Naters",
+        "Neuenburg",
+        "Neuhausen",
+        "Nyon",
+        "Oberwil",
+        "Oftringen",
+        "Olten",
+        "Onex",
+        "Opfikon",
+        "Ostermundigen",
+        "Payerne",
+        "Pfäffikon",
+        "Plan-les-Ouates",
+        "Pratteln",
+        "Prilly",
+        "Pully",
+        "Rapperswil-Jona",
+        "Regensdorf",
+        "Reinach",
+        "Renens",
+        "Rheinfelden",
+        "Richterswil",
+        "Riehen",
+        "Risch",
+        "Romanshorn",
+        "Rüti",
+        "Sarnen",
+        "Schaffhausen",
+        "Schlieren",
+        "Schwyz",
+        "Siders",
+        "Sitten",
+        "Solothurn",
+        "Spiez",
+        "Spreitenbach",
+        "St. Gallen",
+        "Stäfa",
+        "Steffisburg",
+        "Steinhausen",
+        "Suhr",
+        "Sursee",
+        "Thalwil",
+        "Thônex",
+        "Thun",
+        "Urdorf",
+        "Uster",
+        "Uzwil",
+        "Val-de-Ruz",
+        "Val-de-Travers",
+        "Vernier",
+        "Versoix",
+        "Vevey",
+        "Veyrier",
+        "Villars-sur-Glâne",
+        "Volketswil",
+        "Wädenswil",
+        "Wald",
+        "Wallisellen",
+        "Weinfelden",
+        "Wettingen",
+        "Wetzikon",
+        "Wil",
+        "Winterthur",
+        "Wohlen",
+        "Worb",
+        "Yverdon-les-Bains",
+        "Zofingen",
+        "Zollikofen",
+        "Zollikon",
+        "Zug",
+        "Zürich",
+    )
+
     cantons = (
         ("AG", "Aargau"),
         ("AI", "Appenzell Innerrhoden"),
@@ -58,6 +223,13 @@ def canton(self) -> Tuple[str, str]:
         """
         return self.random_element(self.cantons)
 
+    def city_name(self) -> str:
+        """
+        Randomly returns a swiss city.
+        :example 'Zug'
+        """
+        return self.random_element(self.cities)
+
     def administrative_unit(self) -> str:
         """
         Randomly returns a Swiss canton name.


Test patch:
diff --git a/tests/providers/test_address.py b/tests/providers/test_address.py
--- a/tests/providers/test_address.py
+++ b/tests/providers/test_address.py
@@ -1776,6 +1776,12 @@ def test_canton(self, faker, num_samples):
             assert isinstance(canton, tuple)
             assert canton in DeChAddressProvider.cantons
 
+    def test_city(self, faker, num_samples):
+        for _ in range(num_samples):
+            city = faker.city_name()
+            assert isinstance(city, str)
+            assert city in DeChAddressProvider.cities
+
 
 class TestRoRo:
     """Test ro_RO address provider methods"""