Repository: joke2k/faker
Pull request #2066 (2024-06-26 04:42:53)

Added passport provider for ru_RU language
### What does this change

Added new passport provider for ru_RU language

### What was wrong

It looks like based on an issue https://github.com/joke2k/faker/issues/2061 for passport_owners we need to return first surname and then given_name

### How this fixes it

I created a new provider class in the path: faker/providers/passport/ru_RU/__init__.py and overloaded the function passport_owner




Abdujabbar: > Can you add a test for the new provider?

@fcurella  I have added a simple use case for testing, let's try to check. 

But for now it looks like some pipelines failed, I guess it's not related into my changes, am I right? 

Patch:
diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index e073e37a..28e649b5 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 30.3.0
+current_version = 30.5.0
 files = VERSION faker/__init__.py docs/conf.py
 commit = True
 tag = True
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5bffacfa..e6e915bc 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -256,7 +256,7 @@ jobs:
     - name: Set up Python
       uses: actions/setup-python@v5
       with:
-        python-version: '3.x'
+        python-version: '3.12'
     - name: Install dependencies
       run: |
         python -m pip install tox==3.27.1 setuptools
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e69f7edc..4d8a997d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
 ## Changelog
 
+### [v30.5.0 - 2024-10-16](https://github.com/joke2k/faker/compare/v30.4.0...v30.5.0)
+
+* Add Providers for `ka_GE` locale. Thanks @onesch.
+
+### [v30.4.0 - 2024-10-15](https://github.com/joke2k/faker/compare/v30.3.0...v30.4.0)
+
+* Add separate male/female names along with prefix/suffix for `hi_IN` locale. Thanks @wh0th3h3llam1.
+
 ### [v30.3.0 - 2024-10-07](https://github.com/joke2k/faker/compare/v30.2.0...v30.3.0)
 
 * Add decorator to optionally format dates as string. Thanks @browniebroke.
diff --git a/VERSION b/VERSION
index 96332141..fa6ef6c4 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-30.3.0
+30.5.0
diff --git a/build-alpine.sh b/build-alpine.sh
index 7fac5b44..e5d4642b 100755
--- a/build-alpine.sh
+++ b/build-alpine.sh
@@ -5,7 +5,7 @@ if [[ -z "${TEST_ALPINE}" ]]; then
     exit 0
 fi
 
-docker run -v ${PWD}:/code -e INSTALL_REQUIREMENTS=${INSTALL_REQUIREMENTS} python:3-alpine sh -c "
+docker run -v ${PWD}:/code -e INSTALL_REQUIREMENTS=${INSTALL_REQUIREMENTS} python:3.12-alpine sh -c "
     apk update \
     && apk add git build-base jpeg-dev zlib-dev \
     && pip install tox coveralls \
diff --git a/docs/coding_style.rst b/docs/coding_style.rst
index 95f88ac2..de611d6b 100644
--- a/docs/coding_style.rst
+++ b/docs/coding_style.rst
@@ -58,6 +58,13 @@ included in other parts of the code. If you add a generic type, please specify i
    * - ``typing.GenderType``
      - String variable that can only have values ``"F"`` (female) and ``"M"`` (male)
 
+Tests
+-----
+
+Please add tests for all new providers.
+
+When adding a new test class, please find its place in alphabetical order.
+
 .. _`tox.ini`: https://github.com/joke2k/faker/blob/master/tox.ini
 .. _`pep 8`: https://python.org/dev/peps/pep-0008
 .. _`pep 263`: https://python.org/dev/peps/pep-0263
diff --git a/docs/conf.py b/docs/conf.py
index 08f8e7a1..dced2f47 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -51,9 +51,9 @@ copyright = f"2014-{datetime.now().year}, Daniele Faraglia"
 # built documents.
 #
 # The short X.Y version.
-version = "30.3.0"
+version = "30.5.0"
 # The full version, including alpha/beta/rc tags.
-release = "30.3.0"
+release = "30.5.0"
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/faker/__init__.py b/faker/__init__.py
index e866a61b..a1d674ca 100644
--- a/faker/__init__.py
+++ b/faker/__init__.py
@@ -2,6 +2,6 @@ from faker.factory import Factory
 from faker.generator import Generator
 from faker.proxy import Faker
 
-VERSION = "30.3.0"
+VERSION = "30.5.0"
 
 __all__ = ("Factory", "Generator", "Faker")
diff --git a/faker/providers/color/ka_GE/__init__.py b/faker/providers/color/ka_GE/__init__.py
new file mode 100644
index 00000000..c1ed2236
--- /dev/null
+++ b/faker/providers/color/ka_GE/__init__.py
@@ -0,0 +1,92 @@
+from collections import OrderedDict
+
+from .. import Provider as ColorProvider
+
+localized = True
+
+
+class Provider(ColorProvider):
+    """Implement color provider for ``ka_GE`` locale."""
+
+    all_colors = OrderedDict(
+        (
+            ("ანტიკური თეთრი", "#FAEBD7"),
+            ("აკვამარინი", "#7FFFD4"),
+            ("ლურჯი", "#F0FFFF"),
+            ("ბეჟი", "#F5F5DC"),
+            ("შავი", "#000000"),
+            ("ცისფერი", "#0000FF"),
+            ("საზღვაო ლურჯი", "#8A2BE2"),
+            ("ყავისფერი", "#A52A2A"),
+            ("შოკოლადისფერი", "#D2691E"),
+            ("კორალისფერი", "#FF7F50"),
+            ("ვერცხლისფერი", "#6495ED"),
+            ("ჟოლოსფერი", "#DC143C"),
+            ("მუქი ლურჯი", "#00008B"),
+            ("მუქი ცისფერი", "#008B8B"),
+            ("მუქი ნაცრისფერი", "#A9A9A9"),
+            ("მუქი მწვანე", "#006400"),
+            ("მუქი ხაკისფერი", "#BDB76B"),
+            ("მუქი ნარინჯისფერი", "#FF8C00"),
+            ("მუქი წითელი", "#8B0000"),
+            ("მუქი ზღვისფერი", "#00CED1"),
+            ("მუქი იასამნისფერი", "#9400D3"),
+            ("მუქი ვარდისფერი", "#FF1493"),
+            ("მკვდარი ნაცრისფერი", "#696969"),
+            ("ფუქსია", "#FF00FF"),
+            ("ოქროსფერი", "#FFD700"),
+            ("ნაცრისფერი", "#808080"),
+            ("მწვანე", "#008000"),
+            ("ყვითელ-მწვანე", "#ADFF2F"),
+            ("ინტენსიური ვარდისფერი", "#FF69B4"),
+            ("ინდიგო", "#4B0082"),
+            ("სპილოს ძვალი", "#FFFFF0"),
+            ("ხაკისფერი", "#F0E68C"),
+            ("ლავანდისფერი ვარდისფერი", "#FFF0F5"),
+            ("ღია ლურჯი", "#ADD8E6"),
+            ("ღია ცისფერი", "#E0FFFF"),
+            ("ღია ნაცრისფერი", "#D3D3D3"),
+            ("ღია მწვანე", "#90EE90"),
+            ("ღია ვარდისფერი", "#FFB6C1"),
+            ("ღია ცისფერი", "#87CEFA"),
+            ("ღია ყვითელი", "#FFFFE0"),
+            ("მეწამული", "#800000"),
+            ("ნარინჯისფერი", "#FFA500"),
+            ("ნარინჯისფერი წითელი", "#FF4500"),
+            ("ღია მწვანე", "#98FB98"),
+            ("ღია ზღვისფერი", "#AFEEEE"),
+            ("ვარდისფერი", "#FFC0CB"),
+            ("ქლიავისფერი", "#DDA0DD"),
+            ("იასამნისფერი", "#800080"),
+            ("წითელი", "#FF0000"),
+            ("ზღვისფერი", "#2E8B57"),
+            ("ვერცხლისფერი", "#C0C0C0"),
+            ("თურქული ლურჯი", "#40E0D0"),
+            ("იისფერი", "#EE82EE"),
+            ("თეთრი", "#FFFFFF"),
+            ("ყვითელი", "#FFFF00"),
+            ("ყვითელ-მწვანე", "#9ACD32"),
+            ("ბრინჯაოსფერი", "#CD7F32"),
+            ("მსხლისფერი", "#D1E231"),
+            ("თითბერისფერი", "#D5A642"),
+            ("მანდარინისფერი", "#FF8800"),
+            ("ფიჭვისფერი", "#01796F"),
+            ("ზეთისხილისფერი", "#808000"),
+        )
+    )
+
+    safe_colors = (
+        "შავი",
+        "მუქი წითელი",
+        "მწვანე",
+        "ხაკისფერი",
+        "იასამნისფერი",
+        "თურმანჯურა",
+        "ცაცხვისფერი",
+        "ცისფერი",
+        "ვერცხლისფერი",
+        "ნაცრისფერი",
+        "ყვითელი",
+        "ფუქსია",
+        "თეთრი",
+    )
diff --git a/faker/providers/date_time/ka_GE/__init__.py b/faker/providers/date_time/ka_GE/__init__.py
new file mode 100644
index 00000000..dff9764d
--- /dev/null
+++ b/faker/providers/date_time/ka_GE/__init__.py
@@ -0,0 +1,37 @@
+from .. import Provider as DateTimeProvider
+
+
+class Provider(DateTimeProvider):
+    # Sourse: https://www.ganmarteba.ge/
+    DAY_NAMES = {
+        "0": "კვირა",
+        "1": "ორშაბათი",
+        "2": "სამშაბათი",
+        "3": "ოთხშაბათი",
+        "4": "ხუთშაბათი",
+        "5": "პარასკევი",
+        "6": "შაბათი",
+    }
+
+    MONTH_NAMES = {
+        "01": "იანვარი",
+        "02": "თებერვალი",
+        "03": "მარტი",
+        "04": "აპრილი",
+        "05": "მაისი",
+        "06": "ივნისი",
+        "07": "ივლისი",
+        "08": "აგვისტო",
+        "09": "სექტემბერი",
+        "10": "ოქტომბერი",
+        "11": "ნოემბერი",
+        "12": "დეკემბერი",
+    }
+
+    def day_of_week(self):
+        day = self.date("%w")
+        return self.DAY_NAMES[day]
+
+    def month_name(self):
+        month = self.month()
+        return self.MONTH_NAMES[month]
diff --git a/faker/providers/job/ka_GE/__init__.py b/faker/providers/job/ka_GE/__init__.py
new file mode 100644
index 00000000..e98bdd56
--- /dev/null
+++ b/faker/providers/job/ka_GE/__init__.py
@@ -0,0 +1,392 @@
+from .. import Provider as BaseProvider
+
+
+class Provider(BaseProvider):
+    # Sourse: https://www.ganmarteba.ge/
+    jobs = [
+        "ავიადისპეტჩერი",
+        "ამწე ოპერატორი",
+        "ავიატექნიკოსი",
+        "ავიაციის ტექნიკოსი",
+        "აეროპლანის მფრინავი",
+        "აკუსტიკის ინჟინერი",
+        "აღმზრდელი",
+        "აღმოსავლეთმცოდნე",
+        "ავტოელექტრიკოსი",
+        "აგრონომი",
+        "არტისტი",
+        "აგრონომ-ნიადაგმცოდნე",
+        "ადვოკატი",
+        "აკუმულატორების სპეციალისტი",
+        "აქტუარი",
+        "ალერგოლოგი",
+        "ანალიტიკოსი",
+        "ანდროლოგი",
+        "ანთროპოლოგი",
+        "არტილერისტი",
+        "არქეოლოგი",
+        "არქივარიუსი",
+        "არქიტექტორი",
+        "ასტრონომი",
+        "ასტрофიზიკოსი",
+        "ასტროქიმიკოსი",
+        "ბაქტერიოლოგი",
+        "ბალერინა",
+        "ბალეტმაისტერი",
+        "ბანკირი",
+        "ბარმენი",
+        "ბატალერი",
+        "ბიბლიოთეკარი",
+        "ბიბლიოთეკმცოდნე",
+        "ბიონჟინერი",
+        "ბიოლოგი",
+        "ბიოფიზიკოსი",
+        "ბიოქიმიკოსი",
+        "ბლოგერი",
+        "ბორტ-ინჟინერი",
+        "ბორტ-მექანიკოსი",
+        "ბორტ-რადისტი",
+        "ბოტანიკოსი",
+        "ბრეიდერი",
+        "ბროკერი",
+        "პურის მცხობელი",
+        "ბულდოზერისტი",
+        "ბუღალტერი",
+        "გასტროენტეროლოგი",
+        "გემის კაპიტანი",
+        "გაუპვახტის უფროსი",
+        "გამომძიებელი",
+        "გალვანიკური ინჟინერი",
+        "გამომცემელი",
+        "გამომგონებელი",
+        "გენეტიკოსი",
+        "გეოგრაფი",
+        "გეოდეზისტი",
+        "გამყიდველი",
+        "გეოლოგი",
+        "გინეკოლოგი",
+        "გიტარისტი",
+        "გლაციოლოგი",
+        "გრანატომტყორცნელი",
+        "გრეიდერის ოპერატორი",
+        "გრენადერი",
+        "გრიმიორი",
+        "გამომცემელი რედაქტორი",
+        "დიზაინის ინჟინერი",
+        "დეკანი",
+        "დეკორატორი",
+        "დურგალი",
+        "დერმატოლოგი",
+        "დეტექტივი",
+        "დეფექტოლოგი",
+        "დიჯეი",
+        "დიეტოლოგი",
+        "დიზაინერი",
+        "დიზაინერი-კონსტრუქტორი",
+        "დიქტორი",
+        "დილერი",
+        "დიპლომატი",
+        "დიპლომატიური მუშაკი",
+        "დირიჟორი",
+        "დრეპერი",
+        "დამლაგებელი",
+        "ეკოლოგი",
+        "ეკონომისტი",
+        "ექსპედიტორი",
+        "ექიმი ულტრაბგერითი დიაგნოსტიკის",
+        "ეგვიპტოლოგი",
+        "ექსპერტ-კრიმინალისტი",
+        "ელექტრიკოსი",
+        "ელექტროინჟინერი",
+        "ენერგეტიკის ინჟინერი",
+        "ენდოკრინოლოგი",
+        "ენდოსკოპისტი",
+        "ენტომოლოგი",
+        "ეპიდემიოლოგი",
+        "ეფერენტოლოგი",
+        "ვებ-ინტეგრატორი",
+        "ვებ-მასტერი",
+        "ვებ-პროგრამისტი",
+        "ვეტერინარი",
+        "ვიზაჟისტი",
+        "ვაზის მეღვინე",
+        "ვირუსოლოგი",
+        "ვოკალისტი",
+        "ზეინკალი",
+        "ზოოლოგი",
+        "თეოლოგი",
+        "თერაპევტი",
+        "თერიოლოგი",
+        "თიფლოპედაგოგი",
+        "თორაკალური ქირურგი",
+        "თარჯიმანი",
+        "ილუსტრატორი",
+        "იმიჯმეიკერი",
+        "იმუნოლოგი",
+        "იუველირი",
+        "იურიდიული მრჩეველი",
+        "იურისტი",
+        "ინჟინერი",
+        "ინკასატორი",
+        "ინტენდანტი",
+        "ინფექციონისტი",
+        "ისტორიკოსი",
+        "იქთიოლოგი",
+        "კომპიუტერული ინჟინერი",
+        "კინოსა და ტელევიზიის ოპერატორი",
+        "კარდიოლოგი",
+        "კარდიოქირურგი",
+        "კასკადიორი",
+        "კომპიუტერის ოპერატორი",
+        "კასირი",
+        "კინოლოგი",
+        "კრიპტოგრაფი",
+        "კინომექანიკოსი",
+        "კინოოპერატორი",
+        "კინორეჟისორი",
+        "კლიენტთა ურთიერთობის მენეჯერი",
+        "კოდერი",
+        "კომენდანტი",
+        "კომერციული დირექტორი",
+        "კომპოზიტორი",
+        "კონდიტერი",
+        "კონდუქტორი",
+        "კონტენტის მენეჯერი",
+        "კოპირაიტერი",
+        "კორექტორ-მთავარი",
+        "კორექტორი",
+        "კოსმეტოლოგი",
+        "კოსმონავტი",
+        "კრიპტოზოოლოგი",
+        "კრიტიკოსი",
+        "კულტუროლოგი",
+        "ლაბორანტი",
+        "ლიმფოლოგი",
+        "ლინგვისტი",
+        "ლოგოპედი",
+        "ლოცმანი",
+        "ლაბორანტი-ინჟინერი",
+        "ლოკომოტივის მძღოლი",
+        "ლექტორი",
+        "მალარი",
+        "მამმოლოგი",
+        "მხატვარი",
+        "მცხობელი",
+        "მანუალისტი",
+        "მარკეტოლოგი",
+        "მასაჟისტი",
+        "მწყემსი",
+        "მანიკიურის ოსტატი",
+        "მათემატიკოსი",
+        "მატარებლის მძღოლი",
+        "მცენარეთა სპეციალისტი",
+        "მეწარმე",
+        "მექანიზაციის ინჟინერი",
+        "მოცეკვავე",
+        "მძღოლი",
+        "მსახიობი",
+        "მეანე",
+        "მესაზღვრე",
+        "მეხანძრე",
+        "მეხორბლე",
+        "მიმტანი",
+        "მეფუტკრე",
+        "მწერალი",
+        "მენეჯერი",
+        "მეტალურგი",
+        "მეტეოროლოგი",
+        "მჭედელი",
+        "მებაჟე",
+        "მექანიკოსი",
+        "მეცხოველეობის სპეციალისტი",
+        "მეტყევე-ინჟინერი",
+        "მედესანტე",
+        "მექანიკის ინჟინერი",
+        "მცენარეთა დაცვის აგრონომი",
+        "მკერავი",
+        "მტვირთავი",
+        "მიკრობიოლოგი",
+        "მინისტრი",
+        "მოდელი",
+        "მოდელიერი",
+        "მებაღე",
+        "მასწავლებელი",
+        "მაღაროელი",
+        "მეცნიერი",
+        "მეწაღე",
+        "მოქანდაკე",
+        "მთამსვლელი",
+        "მყვინთავი",
+        "მეურნე",
+        "მონტაჟნიკი",
+        "მსაჯი",
+        "მონაცემთა ბაზის ადმინისტრატორი",
+        "მუსიკოსი",
+        "მშენებელი",
+        "ნარკოლოგი",
+        "ნევროლოგი",
+        "ნევროპათოლოგი",
+        "ნეიროქირურგი",
+        "ნეონატოლოგი",
+        "ნეფროლოგი",
+        "ნოტარიუსი",
+        "ოკეანოლოგი",
+        "ონკოლოგი",
+        "ორნითოლოგი",
+        "ორთოდონტი",
+        "ორთოპედი",
+        "ოტორინოლარინგოლოგი",
+        "ოფთალმოლოგი",
+        "ოჯახის ექიმი",
+        "პილოტი",
+        "პალეონტოლოგი",
+        "პედიკიურის ოსტატი",
+        "პარფიუმერი",
+        "პასტორალისტი",
+        "პათოლოგანატომი",
+        "პედაგოგი",
+        "პედიატრი",
+        "პლასტიკური ქირურგი",
+        "პოლიტოლოგი",
+        "პოლიციელი",
+        "პოეტი",
+        "პროგრამისტი",
+        "პროდიუსერი",
+        "პირადი მცველი",
+        "პროქტოლოგი",
+        "პროფესიული პათოლოგი",
+        "პულმონოლოგი",
+        "ჟურნალისტი",
+        "რეკლამის დიზაინერი",
+        "რადიოლოგი",
+        "რადიომექანიკოსი",
+        "რადიოტელეფონისტი",
+        "რადისტი",
+        "რადიოლოკაციური სისტემის ოპერატორი",
+        "რეანიმატოლოგი",
+        "რევმატოლოგი",
+        "რედაქტორი",
+        "რეჟისორი",
+        "რელიგიური მეცნიერი",
+        "რენტგენოლოგი",
+        "რესტავრატორი",
+        "რეფლექსოთერაპევტი",
+        "რიხტოვშიკი",
+        "რობოტოტექნიკოსი",
+        "სანიტარი",
+        "სანტექნიკოსი",
+        "საპიორი",
+        "სასულიერო პირი",
+        "სექსოლოგი",
+        "სექსოპათოლოგი",
+        "სერპენტოლოგი",
+        "სისტემური ადმინისტრატორი",
+        "სნაიპერი",
+        "სომელიე",
+        "სასაქონლო ექსპერტი",
+        "სპილენძის მჭედელი",
+        "სომნოლოგი",
+        "სოციოლოგი",
+        "სპორტული ექიმი",
+        "სახელმწიფო აღმასრულებელი",
+        "სამხედრო ქირურგი",
+        "სამხედრო მოსამსახურე",
+        "სამხედრო გამომძიებელი",
+        "სამხედრო კონსულტანტი",
+        "სამხედრო მთარგმნელი",
+        "სამხედრო პოლიციელი",
+        "საგადასახადო ინსპექტორი",
+        "საწყობის უფროსი",
+        "სამხედრო პროკურორი",
+        "სამხედრო მოსამართლე",
+        "სამედიცინო და სოციალური ექსპერტიზის ექიმი",
+        "სამხედრო ინჟინერი",
+        "საკრედიტო კონსულტანტი",
+        "სამხედრო იურისტი",
+        "სასწრაფო დახმარების ექიმი",
+        "სტიუარდი",
+        "სტომატოლოგი",
+        "სამართალმცოდნე",
+        "სადაზღვევო აგენტი",
+        "სასამართლო აღსრულების სპეციალისტი",
+        "სტილისტი",
+        "სამხედრო ორკესტრის უფროსი",
+        "სურდოლოგი",
+        "სურდოპედაგოგი",
+        "სცენარისტი",
+        "სისტემატიკის ინჟინერი",
+        "სამშენებლო ინჟინერი",
+        "ტაქსის მძღოლი",
+        "ტალმანი",
+        "ტანატოლოგი",
+        "ტანკისტი",
+        "ტატუს ოსტატი",
+        "ტელეგრაფისტი",
+        "ტელეჟურნალისტი",
+        "ტელევიზიის ოსტატი",
+        "ტესტირების სპეციალისტი",
+        "ტექნიკოსი",
+        "ტექნოლოგი",
+        "ტიპოგრაფი",
+        "ტექნოლოგიური ინჟინერი",
+        "ტოქსიკოლოგი",
+        "ტოპოგრაფი",
+        "ტრავმატოლოგი",
+        "ტრაქტორისტი",
+        "ტრანსფუზიოლოგი",
+        "ტრედერი",
+        "ტრენდ-ვოჩერი",
+        "უროლოგი",
+        "უმუშევარი",
+        "უსაფრთხოების ტექნიკის ინჟინერი",
+        "უჯრედული ტექნოლოგიების სპეციალისტი",
+        "ფიზიკის ინჟინერი",
+        "ფოსტალიონი",
+        "ფსიქიატრი",
+        "ფარმაცევტი",
+        "ფიზიკოსი",
+        "ფიზიოთერაპევტი",
+        "ფილოლოგი",
+        "ფილოსოფოსი",
+        "ფინანსისტი",
+        "ფლებოლოგი",
+        "ფლორისტი",
+        "ფოტოგრაფი",
+        "ფოტომოდელი",
+        "ფურაჟირი",
+        "ფუტუროლოგი",
+        "ფოლადის მწარმოებელი",
+        "ფსიქონევროპათოლოგი",
+        "ფუნქციური დიაგნოსტიკის ექიმი",
+        "ფსიქოთერაპევტი",
+        "ფსიქოლოგი",
+        "ქვისმთლელი",
+        "ქიმიის ინჟინერი",
+        "ქიმიკოსი",
+        "ქიმიკოს-ტექნოლოგი",
+        "ქირურგი",
+        "ქორეოგრაფი",
+        "ქოლცენტრის ოპერატორი",
+        "ქორწილების ორგანიზატორი",
+        "ქვაფენილი",
+        "ქუჩის დამლაგებელი",
+        "ყველის მწარმოებელი",
+        "შტაბის უფროსი",
+        "შემკრებავი",
+        "შემდუღებელი",
+        "ცხვრის მჭრელი სპეციალისტი",
+        "ცირკის არტისტი",
+        "ცხენმშენებელი",
+        "ციხის ზედამხედველი",
+        "ძიძა",
+        "ხარატი",
+        "ხმის ინჟინერი",
+        "ხელოვნებათმცოდნე",
+        "ჯალათი",
+        "ჰემატოლოგი",
+        "ჰეპატოლოგი",
+        "ჰიდროლოგი",
+        "ჰომეოპათი",
+        "ჰირუდოთერაპევტი",
+        "ჰიდრავლიკის ინჟინერი",
+    ]
diff --git a/faker/providers/misc/__init__.py b/faker/providers/misc/__init__.py
index 240249cb..287c3065 100644
--- a/faker/providers/misc/__init__.py
+++ b/faker/providers/misc/__init__.py
@@ -11,6 +11,8 @@ import zipfile
 
 from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Tuple, Type, Union
 
+from typing_extensions import TypeAlias
+
 from faker.exceptions import UnsupportedFeature
 
 from .. import BaseProvider
@@ -21,6 +23,10 @@ localized = True
 csv.register_dialect("faker-csv", csv.excel, quoting=csv.QUOTE_ALL)
 
 
+ColumnSpec: TypeAlias = Union[Tuple[int, str], Tuple[int, str, Dict[str, Any]]]
+DataColumns: TypeAlias = List[ColumnSpec]
+
+
 class Provider(BaseProvider):
     def boolean(self, chance_of_getting_true: int = 50) -> bool:
         """Generate a random boolean value based on ``chance_of_getting_true``.
@@ -643,7 +649,7 @@ class Provider(BaseProvider):
         _dict = {self.generator.word(): _dict}
         return xmltodict.unparse(_dict)
 
-    def fixed_width(self, data_columns: Optional[list] = None, num_rows: int = 10, align: str = "left") -> str:
+    def fixed_width(self, data_columns: Optional[DataColumns] = None, num_rows: int = 10, align: str = "left") -> str:
         """
         Generate random fixed width values.
 
@@ -683,7 +689,8 @@ class Provider(BaseProvider):
             (20, "name"),
             (3, "pyint", {"max_value": 20}),
         ]
-        data_columns = data_columns if data_columns else default_data_columns
+        if data_columns is None:
+            data_columns: DataColumns = default_data_columns  # type: ignore
         align_map = {
             "left": "<",
             "middle": "^",
@@ -694,7 +701,7 @@ class Provider(BaseProvider):
         for _ in range(num_rows):
             row = []
 
-            for width, definition, *arguments in data_columns:
+            for width, definition, *arguments in data_columns:  # type: ignore
                 kwargs = arguments[0] if arguments else {}
 
                 if not isinstance(kwargs, dict):
diff --git a/faker/providers/passport/ru_RU/__init__.py b/faker/providers/passport/ru_RU/__init__.py
new file mode 100644
index 00000000..e29ecad8
--- /dev/null
+++ b/faker/providers/passport/ru_RU/__init__.py
@@ -0,0 +1,11 @@
+from typing import Tuple
+
+from faker.typing import SexLiteral
+
+from .. import Provider as PassportProvider
+
+
+class Provider(PassportProvider):
+    def passport_owner(self, gender: SexLiteral = "M") -> Tuple[str, str]:
+        given_name, surname = super().passport_owner(gender)
+        return surname, given_name
diff --git a/faker/providers/phone_number/ka_GE/__init__.py b/faker/providers/phone_number/ka_GE/__init__.py
new file mode 100644
index 00000000..74e5bfc2
--- /dev/null
+++ b/faker/providers/phone_number/ka_GE/__init__.py
@@ -0,0 +1,16 @@
+from .. import Provider as PhoneNumberProvider
+
+
+class Provider(PhoneNumberProvider):
+    # Sourse: https://en.wikipedia.org/wiki/Telephone_numbers_in_Georgia_(country)
+    formats = (
+        "+995 ### ### ###",
+        "+995 (###) ### ###",
+        "+995#########",
+        "0 ### ### ###",
+        "+995 32 ### ## ##",
+        "+995 34# ### ###",
+        "+995 (34#) ### ###",
+        "0 32 ### ## ##",
+        "0 34# ### ###",
+    )
diff --git a/faker/proxy.pyi b/faker/proxy.pyi
index 56782d25..0e5190d4 100644
--- a/faker/proxy.pyi
+++ b/faker/proxy.pyi
@@ -2008,7 +2008,12 @@ class Faker:
         """
         ...
 
-    def fixed_width(self, data_columns: Optional[list] = ..., num_rows: int = ..., align: str = ...) -> str:
+    def fixed_width(
+        self,
+        data_columns: Optional[List[Union[Tuple[int, str], Tuple[int, str, Dict[str, Any]]]]] = ...,
+        num_rows: int = ...,
+        align: str = ...,
+    ) -> str:
         """
         Generate random fixed width values.
 


Test patch:
diff --git a/tests/providers/test_color.py b/tests/providers/test_color.py
index 609c4cf7..df83f0f5 100644
--- a/tests/providers/test_color.py
+++ b/tests/providers/test_color.py
@@ -16,6 +16,7 @@ from faker.providers.color.fa_IR import Provider as FaIrColorProvider
 from faker.providers.color.he_IL import Provider as HeILColorProvider
 from faker.providers.color.hy_AM import Provider as HyAmColorProvider
 from faker.providers.color.id_ID import Provider as IdIdColorProvider
+from faker.providers.color.ka_GE import Provider as KaGEColorProvider
 from faker.providers.color.sk_SK import Provider as SkSkColorProvider
 from faker.providers.color.vi_VN import Provider as ViVNColorProvider
 
@@ -446,6 +447,22 @@ class TestIdId:
             assert safe_color_name in IdIdColorProvider.safe_colors
 
 
+class TestKaGe:
+    """Test Ka_GE color provider methods"""
+
+    def test_color_name(self, faker, num_samples):
+        for _ in range(num_samples):
+            color_name = faker.color_name()
+            assert isinstance(color_name, str)
+            assert color_name in KaGEColorProvider.all_colors.keys()
+
+    def test_safe_color_name(self, faker, num_samples):
+        for _ in range(num_samples):
+            safe_color_name = faker.safe_color_name()
+            assert isinstance(safe_color_name, str)
+            assert safe_color_name in KaGEColorProvider.safe_colors
+
+
 class TestViVn:
     """Test vi_VN color provider methods"""
 
diff --git a/tests/providers/test_date_time.py b/tests/providers/test_date_time.py
index 9d221c6c..0ad57b03 100644
--- a/tests/providers/test_date_time.py
+++ b/tests/providers/test_date_time.py
@@ -29,6 +29,7 @@ from faker.providers.date_time.fr_FR import Provider as FrFrProvider
 from faker.providers.date_time.hy_AM import Provider as HyAmProvider
 from faker.providers.date_time.it_IT import Provider as ItItProvider
 from faker.providers.date_time.ja_JP import Provider as JaJpProvider
+from faker.providers.date_time.ka_GE import Provider as KaGeProvider
 from faker.providers.date_time.nl_NL import Provider as NlProvider
 from faker.providers.date_time.no_NO import Provider as NoNoProvider
 from faker.providers.date_time.pl_PL import Provider as PlProvider
@@ -1374,6 +1375,24 @@ class TestJaJp(unittest.TestCase):
         assert month in JaJpProvider.TRADITIONAL_MONTH_NAMES.values()
 
 
+class TestKaGe(unittest.TestCase):
+    """Test Ka_GE date_time provider methods"""
+
+    def setUp(self):
+        self.fake = Faker("Ka_GE")
+        Faker.seed(0)
+
+    def test_day(self):
+        day = self.fake.day_of_week()
+        assert isinstance(day, str)
+        assert day in KaGeProvider.DAY_NAMES.values()
+
+    def test_month(self):
+        month = self.fake.month_name()
+        assert isinstance(month, str)
+        assert month in KaGeProvider.MONTH_NAMES.values()
+
+
 class TestViVn(unittest.TestCase):
     """Tests date_time in the vi_VN locale"""
 
diff --git a/tests/providers/test_job.py b/tests/providers/test_job.py
index 607fbe3c..76d3bffc 100644
--- a/tests/providers/test_job.py
+++ b/tests/providers/test_job.py
@@ -8,6 +8,7 @@ from faker.providers.job.fr_FR import Provider as FrFrJobProvider
 from faker.providers.job.hu_HU import Provider as HuHuJobProvider
 from faker.providers.job.hy_AM import Provider as HyAmJobProvider
 from faker.providers.job.ja_JP import Provider as JaJpJobProvider
+from faker.providers.job.ka_GE import Provider as KaGeJobProvider
 from faker.providers.job.ko_KR import Provider as KoKrJobProvider
 from faker.providers.job.pt_BR import Provider as PtBrJobProvider
 from faker.providers.job.pt_PT import Provider as PtPtJobProvider
@@ -26,6 +27,14 @@ class TestJobProvider:
             assert faker.job() in JobProvider.jobs
 
 
+class TestAzAz:
+    """Test az_AZ job provider"""
+
+    def test_job(self, faker, num_samples):
+        for _ in range(num_samples):
+            assert faker.job() in AzAzJobProvider.jobs
+
+
 class TestCsCz:
     """Test cs_CZ job provider"""
 
@@ -36,28 +45,36 @@ class TestCsCz:
             assert job in CsCzJobProvider.jobs
 
 
-class TestAzAz:
-    """Test az_AZ job provider"""
+class TestDeDe:
+    """Test de_DE job provider"""
 
     def test_job(self, faker, num_samples):
         for _ in range(num_samples):
-            assert faker.job() in AzAzJobProvider.jobs
+            assert faker.job() in DeDeJobProvider.jobs
 
 
-class TestJaJp:
-    """Test ja_JP job provider"""
+class TestElGr:
+    """Test el_GR job provider"""
 
     def test_job(self, faker, num_samples):
         for _ in range(num_samples):
-            assert faker.job() in JaJpJobProvider.jobs
+            assert faker.job() in ElGrJobProvider.jobs
 
 
-class TestKoKr:
-    """Test ko_KR job provider"""
+class TestEsEs:
+    """Test es job provider"""
 
     def test_job(self, faker, num_samples):
         for _ in range(num_samples):
-            assert faker.job() in KoKrJobProvider.jobs
+            assert faker.job() in EsEsJobProvider.jobs
+
+
+class TestFrFr:
+    """Test fr_FR job provider"""
+
+    def test_job(self, faker, num_samples):
+        for _ in range(num_samples):
+            assert faker.job() in FrFrJobProvider.jobs
 
 
 class TestHuHu:
@@ -76,36 +93,38 @@ class TestHyAm:
             assert faker.job() in HyAmJobProvider.jobs
 
 
-class TestDeDe:
-    """Test de_DE job provider"""
+class TestJaJp:
+    """Test ja_JP job provider"""
 
     def test_job(self, faker, num_samples):
         for _ in range(num_samples):
-            assert faker.job() in DeDeJobProvider.jobs
+            assert faker.job() in JaJpJobProvider.jobs
 
 
-class TestFrFr:
-    """Test fr_FR job provider"""
+class TestKaGe:
+    """Test ka_GE job provider"""
 
     def test_job(self, faker, num_samples):
         for _ in range(num_samples):
-            assert faker.job() in FrFrJobProvider.jobs
+            job = faker.job()
+            assert isinstance(job, str)
+            assert job in KaGeJobProvider.jobs
 
 
-class TestElGr:
-    """Test el_GR job provider"""
+class TestKoKr:
+    """Test ko_KR job provider"""
 
     def test_job(self, faker, num_samples):
         for _ in range(num_samples):
-            assert faker.job() in ElGrJobProvider.jobs
+            assert faker.job() in KoKrJobProvider.jobs
 
 
-class TestEsEs:
-    """Test es job provider"""
+class TestPtBr:
+    """Test pt_BR job provider"""
 
     def test_job(self, faker, num_samples):
         for _ in range(num_samples):
-            assert faker.job() in EsEsJobProvider.jobs
+            assert faker.job() in PtBrJobProvider.jobs
 
 
 class TestPtPt:
@@ -116,12 +135,11 @@ class TestPtPt:
             assert faker.job() in PtPtJobProvider.jobs
 
 
-class TestPtBr:
-    """Test pt_BR job provider"""
+class TestRoRo:
+    """Test Ro_RO job provider"""
 
     def test_job(self, faker, num_samples):
-        for _ in range(num_samples):
-            assert faker.job() in PtBrJobProvider.jobs
+        assert faker.job() in RoRoJobProvider.jobs
 
 
 class TestSkSk:
@@ -148,13 +166,6 @@ class TestTrTr:
         assert faker.job() in TrTrJobProvider.jobs
 
 
-class TestRoRo:
-    """Test tr_TR job provider"""
-
-    def test_job(self, faker, num_samples):
-        assert faker.job() in RoRoJobProvider.jobs
-
-
 class TestViVn:
     """Test vi_VN job provider"""
 
diff --git a/tests/providers/test_person.py b/tests/providers/test_person.py
index a8b1b4d0..16bf309e 100644
--- a/tests/providers/test_person.py
+++ b/tests/providers/test_person.py
@@ -332,7 +332,6 @@ class TestEnIN(unittest.TestCase):
 
 
 class TestEnPk(unittest.TestCase):
-
     def setUp(self):
         """Set up the Faker instance with the Pakistani locale."""
         self.fake = Faker("en_PK")
@@ -1215,6 +1214,11 @@ class TestRuRU(unittest.TestCase):
         language_name = self.fake.language_name()
         assert language_name in RuProvider.language_names
 
+    def test_passport_owner(self):
+        surname, given_name = self.fake.passport_owner()
+        assert surname in RuProvider.last_names
+        assert given_name in RuProvider.first_names
+
 
 class TestSvSE(unittest.TestCase):
     def setUp(self):
diff --git a/tests/providers/test_phone_number.py b/tests/providers/test_phone_number.py
index 75608369..9de8045b 100644
--- a/tests/providers/test_phone_number.py
+++ b/tests/providers/test_phone_number.py
@@ -22,6 +22,50 @@ class TestPhoneNumber:
             assert msisdn.isdigit()
 
 
+class TestArAe:
+    """Test ar_AE phone number provider methods"""
+
+    cellphone_pattern: str = r"(?:\+|00)971\s?5[024568]\s?\d{3}\s?\d{4}|" r"05[024568]\s?\d{3}\s?\d{4}"
+    telephone_pattern: str = r"(?:\+|00)971\s?[1234679]\s?\d{3}\s?\d{4}|" r"0[1234679]\s?\d{3}\s?\d{4}"
+    toll_pattern: str = r"200\d{4}|" r"600\d{6}|" r"800\d{3,7}"
+    service_phone_pattern: str = r"9(?:9(?:9|8|7|6|1)|01|22)"
+
+    def test_cellphone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(self.cellphone_pattern)
+        for _ in range(num_samples):
+            cellphone = faker.cellphone_number()
+            assert pattern.fullmatch(cellphone)
+
+    def test_telephone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(self.telephone_pattern)
+        for _ in range(num_samples):
+            telephone = faker.telephone_number()
+            assert pattern.fullmatch(telephone)
+
+    def test_toll_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(self.toll_pattern)
+        for _ in range(num_samples):
+            toll = faker.toll_number()
+            assert pattern.fullmatch(toll)
+
+    def test_service_phone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(self.service_phone_pattern)
+        for _ in range(num_samples):
+            service = faker.service_phone_number()
+            assert pattern.fullmatch(service)
+
+    def test_phone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(
+            rf"{self.cellphone_pattern}|"
+            rf"{self.telephone_pattern}|"
+            rf"{self.toll_pattern}|"
+            rf"{self.service_phone_pattern}",
+        )
+        for _ in range(num_samples):
+            phone = faker.phone_number()
+            assert pattern.fullmatch(phone)
+
+
 class TestAzAz:
     """Test az_AZ phone number provider methods"""
 
@@ -53,16 +97,6 @@ class TestAzAz:
             assert self.landline_patterns.fullmatch(landline_number)
 
 
-class TestJaJp:
-    """Test ja_JP phone number provider methods"""
-
-    def test_phone_number(self, faker, num_samples):
-        for _ in range(num_samples):
-            pattern: Pattern = re.compile(r"(?:0[789]0|\d{2})-\d{4}-\d{4}")
-            phone_number = faker.phone_number()
-            assert pattern.fullmatch(phone_number)
-
-
 class TestCsCz:
     """Test cs_CZ phone number provider methods"""
 
@@ -73,98 +107,6 @@ class TestCsCz:
             assert pattern.fullmatch(phone_number)
 
 
-class TestSkSk:
-    """Test sk_SK phone number provider methods"""
-
-    def test_phone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(
-            r"(^(00421|\+421)? ?[2] ?[0-9]{8}$)|"
-            r"(^(00421|\+421)? ?[3-5][0-9] ?[0-9]{3} ?[0-9]{4}$)|"
-            r"(^(00421|\+421)? ?[9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$)"
-        )
-
-        for _ in range(num_samples):
-            phone_number = faker.phone_number()
-            assert pattern.fullmatch(phone_number)
-
-
-class TestPtBr:
-    """Test pt_BR phone number provider methods"""
-
-    def test_phone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(
-            r"(?:\+55 )?" r"(?:[1-8]1|84|\((?:0[1-8]1|084)\))" r" \d{4}[ -]\d{4}|" r"\d{4}?[ -]\d{3}[ -]\d{4}",
-        )
-        for _ in range(num_samples):
-            phone_number = faker.phone_number()
-            assert pattern.fullmatch(phone_number)
-
-    def test_msisdn(self, faker, num_samples):
-        pattern: Pattern = re.compile(r"55(?:[1-8]19|849)\d{8}")
-        for _ in range(num_samples):
-            msisdn = faker.msisdn()
-            assert pattern.fullmatch(msisdn)
-
-    def test_cellphone(self, faker, num_samples):
-        pattern: Pattern = re.compile(
-            r"(?:\+55 )?" r"(?:\d{2}|\(0?\d{2}\))" r" 9 ?\d{4}[ -]\d{4}",
-        )
-        for _ in range(num_samples):
-            cellphone = faker.cellphone_number()
-            assert pattern.fullmatch(cellphone)
-
-    def test_service_phone(self, faker, num_samples):
-        pattern: Pattern = re.compile(r"1(?:0|2|5|8|9)?(?:[0-9])")
-        for _ in range(num_samples):
-            service = faker.service_phone_number()
-            assert pattern.fullmatch(service)
-
-
-class TestHuHu:
-    """Test hu_HU phone number provider methods"""
-
-    def test_phone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(
-            r"(?:" r"\+36 \d{2} |" r"\(06\)\d{2}/|" r"\(\d{2}\)/|" r"\d{2}/|" r"06-\d{1,2}/" r")\d{3}[- ]\d{4}",
-        )
-        for _ in range(num_samples):
-            phone_number = faker.phone_number()
-            assert isinstance(phone_number, str)
-            assert pattern.fullmatch(phone_number)
-
-
-class TestThTh:
-    """Test th_TH phone number provider methods"""
-
-    def test_phone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(
-            # leading zero or internaional code
-            r"((\+66)|\+66[ -]?\(0\)|0)[ -]?"
-            # landline or mobile
-            r"([23457][ -]?(\d[ -]?){6}\d|[689][ -]?(\d[ -]?){7}\d)"
-            # extension
-            r"([ ]?(x|ext|ต่อ)[\.]?[ ]?\d{1,5})?",
-            re.IGNORECASE,
-        )
-        for _ in range(num_samples):
-            phone_number = faker.phone_number()
-            assert isinstance(phone_number, str)
-            assert pattern.fullmatch(phone_number)
-
-
-class TestHyAm:
-    """Test hy_AM phone number provider methods"""
-
-    def test_phone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(
-            r"(?:[23]\d{2}-|\([23]\d{2}\) |[23]\d{2}\.)\d{5}|" r"(?:(?:10|9\d)-|\((?:10|9\d)\) |(?:10|9\d)\.)\d{6}",
-        )
-        for _ in range(num_samples):
-            phone_number = faker.phone_number()
-            assert isinstance(phone_number, str)
-            assert pattern.fullmatch(phone_number)
-
-
 class TestEnPh:
     """Test en_PH phone number provider methods"""
 
@@ -269,28 +211,25 @@ class TestEnPh:
                 assert non_area2_match.group(1) in self.non_area2_landline_area_codes
 
 
-class TestFilPh(TestEnPh):
-    """Test fil_PH phone number provider methods"""
-
-    pass
-
-
-class TestTlPh(TestEnPh):
-    """Test tl_PH phone number provider methods"""
-
-    pass
-
-
-class TestTaIn:
-    """Test ta_IN phone number provider methods"""
+class TestEnUs:
+    """Test En_US phone provider methods"""
 
-    def test_phone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(
-            r"\+91 \d{3} ?\d{7}|" r"0\d{2}(-)?\d{2}(?(1)| ?)\d{6}",
+    def test_basic_phone_number(self, faker, num_samples):
+        pattern_no_whitespaces: Pattern = re.compile(
+            r"\d{9}",
         )
+        pattern_dashes: Pattern = re.compile(r"\d{3}-\d{3}-\d{4}")
+        pattern_parens: Pattern = re.compile(r"\(\d{3}\)\d{3}-\d{4}")
+        patterns = [pattern_no_whitespaces, pattern_dashes, pattern_parens]
         for _ in range(num_samples):
-            phone_number = faker.phone_number()
-            assert pattern.fullmatch(phone_number)
+            phone_number = faker.basic_phone_number()
+
+            pattern_is_found = False
+            for pattern in patterns:
+                if re.match(pattern, phone_number):
+                    pattern_is_found = True
+                    break
+            assert pattern_is_found
 
 
 class TestEsCo:
@@ -322,48 +261,10 @@ class TestEsEs:
             assert pattern.fullmatch(phone_number)
 
 
-class TestArAe:
-    """Test ar_AE phone number provider methods"""
-
-    cellphone_pattern: str = r"(?:\+|00)971\s?5[024568]\s?\d{3}\s?\d{4}|" r"05[024568]\s?\d{3}\s?\d{4}"
-    telephone_pattern: str = r"(?:\+|00)971\s?[1234679]\s?\d{3}\s?\d{4}|" r"0[1234679]\s?\d{3}\s?\d{4}"
-    toll_pattern: str = r"200\d{4}|" r"600\d{6}|" r"800\d{3,7}"
-    service_phone_pattern: str = r"9(?:9(?:9|8|7|6|1)|01|22)"
-
-    def test_cellphone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(self.cellphone_pattern)
-        for _ in range(num_samples):
-            cellphone = faker.cellphone_number()
-            assert pattern.fullmatch(cellphone)
-
-    def test_telephone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(self.telephone_pattern)
-        for _ in range(num_samples):
-            telephone = faker.telephone_number()
-            assert pattern.fullmatch(telephone)
-
-    def test_toll_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(self.toll_pattern)
-        for _ in range(num_samples):
-            toll = faker.toll_number()
-            assert pattern.fullmatch(toll)
-
-    def test_service_phone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(self.service_phone_pattern)
-        for _ in range(num_samples):
-            service = faker.service_phone_number()
-            assert pattern.fullmatch(service)
+class TestFilPh(TestEnPh):
+    """Test fil_PH phone number provider methods"""
 
-    def test_phone_number(self, faker, num_samples):
-        pattern: Pattern = re.compile(
-            rf"{self.cellphone_pattern}|"
-            rf"{self.telephone_pattern}|"
-            rf"{self.toll_pattern}|"
-            rf"{self.service_phone_pattern}",
-        )
-        for _ in range(num_samples):
-            phone = faker.phone_number()
-            assert pattern.fullmatch(phone)
+    pass
 
 
 class TestFrFr:
@@ -398,25 +299,148 @@ class TestFrFr:
             assert pattern_is_found
 
 
-class TestEnUs:
-    """Test En_US phone provider methods"""
+class TestHuHu:
+    """Test hu_HU phone number provider methods"""
 
-    def test_basic_phone_number(self, faker, num_samples):
-        pattern_no_whitespaces: Pattern = re.compile(
-            r"\d{9}",
+    def test_phone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(
+            r"(?:" r"\+36 \d{2} |" r"\(06\)\d{2}/|" r"\(\d{2}\)/|" r"\d{2}/|" r"06-\d{1,2}/" r")\d{3}[- ]\d{4}",
         )
-        pattern_dashes: Pattern = re.compile(r"\d{3}-\d{3}-\d{4}")
-        pattern_parens: Pattern = re.compile(r"\(\d{3}\)\d{3}-\d{4}")
-        patterns = [pattern_no_whitespaces, pattern_dashes, pattern_parens]
         for _ in range(num_samples):
-            phone_number = faker.basic_phone_number()
+            phone_number = faker.phone_number()
+            assert isinstance(phone_number, str)
+            assert pattern.fullmatch(phone_number)
 
-            pattern_is_found = False
-            for pattern in patterns:
-                if re.match(pattern, phone_number):
-                    pattern_is_found = True
-                    break
-            assert pattern_is_found
+
+class TestHyAm:
+    """Test hy_AM phone number provider methods"""
+
+    def test_phone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(
+            r"(?:[23]\d{2}-|\([23]\d{2}\) |[23]\d{2}\.)\d{5}|" r"(?:(?:10|9\d)-|\((?:10|9\d)\) |(?:10|9\d)\.)\d{6}",
+        )
+        for _ in range(num_samples):
+            phone_number = faker.phone_number()
+            assert isinstance(phone_number, str)
+            assert pattern.fullmatch(phone_number)
+
+
+class TestJaJp:
+    """Test ja_JP phone number provider methods"""
+
+    def test_phone_number(self, faker, num_samples):
+        for _ in range(num_samples):
+            pattern: Pattern = re.compile(r"(?:0[789]0|\d{2})-\d{4}-\d{4}")
+            phone_number = faker.phone_number()
+            assert pattern.fullmatch(phone_number)
+
+
+class TestKaGe:
+    """Test ka_GE phone number provider methods"""
+
+    pattern = re.compile(
+        r"(?:"
+        r"\+995 \d{3} \d{3} \d{3}|"  # Example: +995 123 456 789
+        r"\+995 \(\d{3}\) \d{3} \d{3}|"  # Example: +995 (123) 456 789
+        r"\+995\d{9}|"  # Example: +995123456789
+        r"0 \d{3} \d{3} \d{3}|"  # Example: 0 123 456 789
+        r"\+995 32 \d{3} \d{2} \d{2}|"  # Example: +995 32 123 12 12
+        r"\+995 34\d \d{3} \d{3}|"  # Example: +995 34x 123 456
+        r"\+995 \(34\d\) \d{3} \d{3}|"  # Example: +995 (34x) 123 456
+        r"0 32 \d{3} \d{2} \d{2}|"  # Example: 0 32 123 12 12
+        r"0 34\d \d{3} \d{3}"  # Example: 0 34x 123 456
+        r")"
+    )
+
+    def test_phone_number(self, faker, num_samples):
+        for _ in range(num_samples):
+            phone_number = faker.phone_number()
+            assert isinstance(phone_number, str)
+            assert self.pattern.fullmatch(phone_number)
+
+
+class TestPtBr:
+    """Test pt_BR phone number provider methods"""
+
+    def test_phone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(
+            r"(?:\+55 )?" r"(?:[1-8]1|84|\((?:0[1-8]1|084)\))" r" \d{4}[ -]\d{4}|" r"\d{4}?[ -]\d{3}[ -]\d{4}",
+        )
+        for _ in range(num_samples):
+            phone_number = faker.phone_number()
+            assert pattern.fullmatch(phone_number)
+
+    def test_msisdn(self, faker, num_samples):
+        pattern: Pattern = re.compile(r"55(?:[1-8]19|849)\d{8}")
+        for _ in range(num_samples):
+            msisdn = faker.msisdn()
+            assert pattern.fullmatch(msisdn)
+
+    def test_cellphone(self, faker, num_samples):
+        pattern: Pattern = re.compile(
+            r"(?:\+55 )?" r"(?:\d{2}|\(0?\d{2}\))" r" 9 ?\d{4}[ -]\d{4}",
+        )
+        for _ in range(num_samples):
+            cellphone = faker.cellphone_number()
+            assert pattern.fullmatch(cellphone)
+
+    def test_service_phone(self, faker, num_samples):
+        pattern: Pattern = re.compile(r"1(?:0|2|5|8|9)?(?:[0-9])")
+        for _ in range(num_samples):
+            service = faker.service_phone_number()
+            assert pattern.fullmatch(service)
+
+
+class TestSkSk:
+    """Test sk_SK phone number provider methods"""
+
+    def test_phone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(
+            r"(^(00421|\+421)? ?[2] ?[0-9]{8}$)|"
+            r"(^(00421|\+421)? ?[3-5][0-9] ?[0-9]{3} ?[0-9]{4}$)|"
+            r"(^(00421|\+421)? ?[9][0-9]{2} ?[0-9]{3} ?[0-9]{3}$)"
+        )
+
+        for _ in range(num_samples):
+            phone_number = faker.phone_number()
+            assert pattern.fullmatch(phone_number)
+
+
+class TestTaIn:
+    """Test ta_IN phone number provider methods"""
+
+    def test_phone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(
+            r"\+91 \d{3} ?\d{7}|" r"0\d{2}(-)?\d{2}(?(1)| ?)\d{6}",
+        )
+        for _ in range(num_samples):
+            phone_number = faker.phone_number()
+            assert pattern.fullmatch(phone_number)
+
+
+class TestThTh:
+    """Test th_TH phone number provider methods"""
+
+    def test_phone_number(self, faker, num_samples):
+        pattern: Pattern = re.compile(
+            # leading zero or internaional code
+            r"((\+66)|\+66[ -]?\(0\)|0)[ -]?"
+            # landline or mobile
+            r"([23457][ -]?(\d[ -]?){6}\d|[689][ -]?(\d[ -]?){7}\d)"
+            # extension
+            r"([ ]?(x|ext|ต่อ)[\.]?[ ]?\d{1,5})?",
+            re.IGNORECASE,
+        )
+        for _ in range(num_samples):
+            phone_number = faker.phone_number()
+            assert isinstance(phone_number, str)
+            assert pattern.fullmatch(phone_number)
+
+
+class TestTlPh(TestEnPh):
+    """Test tl_PH phone number provider methods"""
+
+    pass
 
 
 class TestViVn: