Repository: vacanza/holidays (python)

Issue:
Add French Southern Territories holidays
URLs:
 - https://holidayapi.com/countries/tf/2022

Pull request:
Add French Southern Territories holidays
## Proposed change

Add French Southern Territories holidays.
Resolves #2434.

## Type of change


- [X] New country/market holidays support (thank you!)

## Checklist

- [X] I've followed the [contributing guidelines][contributing-guidelines]
- [X] I've successfully run `make check`, all checks and tests are green

Patch:
diff --git a/AUTHORS.md b/AUTHORS.md
index 06637117..44746aaa 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -83,6 +83,7 @@ Kelsey Karin Hawley
 Koert van der Veer
 Koki Nomura
 Kriti Birda
+Lucca Augusto
 Maina Kamau
 Malthe Borch
 Marek Šuppa
diff --git a/README.md b/README.md
index 91cbcabd..52e1fe87 100644
--- a/README.md
+++ b/README.md
@@ -99,7 +99,7 @@ and detailed information.
 
 ## Available Countries
 
-We currently support 168 country codes. The standard way to refer to a country is by using its [ISO
+We currently support 169 country codes. The standard way to refer to a country is by using its [ISO
 3166-1 alpha-2 code](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes), the same used
 for domain names, and for a subdivision its [ISO 3166-2
 code](https://en.wikipedia.org/wiki/ISO_3166-2). Some countries have common or foreign names or
@@ -526,6 +526,13 @@ any) in brackets, available languages and additional holiday categories. All cou
 <td></td>
 </tr>
 <tr>
+<td>French Southern Territories</td>
+<td>TF</td>
+<td></td>
+<td>en_US, <strong>fr</strong>, uk</td>
+<td></td>
+</tr>
+<tr>
 <td>Gabon</td>
 <td>GA</td>
 <td></td>
diff --git a/holidays/countries/__init__.py b/holidays/countries/__init__.py
index 9ecae532..dfa001f3 100644
--- a/holidays/countries/__init__.py
+++ b/holidays/countries/__init__.py
@@ -67,6 +67,7 @@ from .ethiopia import Ethiopia, ET, ETH
 from .fiji import Fiji, FJ, FJI
 from .finland import Finland, FI, FIN
 from .france import France, FR, FRA
+from .french_southern_territories import FrenchSouthernTerritories, TF, ATF, HolidaysTF
 from .gabon import Gabon, GA, GAB
 from .georgia import Georgia, GE, GEO
 from .germany import Germany, DE, DEU
diff --git a/holidays/countries/france.py b/holidays/countries/france.py
index aee49e89..3b19e2e5 100644
--- a/holidays/countries/france.py
+++ b/holidays/countries/france.py
@@ -31,7 +31,7 @@ class France(HolidayBase, ChristianHolidays, InternationalHolidays):
     country = "FR"
     default_language = "fr"
     supported_languages = ("en_US", "fr", "uk")
-    subdivisions = (
+    subdivisions: tuple[str, ...] = (
         "BL",  # Saint-Barthélemy.
         "GES",  # Alsace, Champagne-Ardenne, Lorraine(Moselle).
         "GP",  # Guadeloupe.
diff --git a/holidays/countries/french_southern_territories.py b/holidays/countries/french_southern_territories.py
new file mode 100644
index 00000000..fd12dc8e
--- /dev/null
+++ b/holidays/countries/french_southern_territories.py
@@ -0,0 +1,53 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see AUTHORS.md file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from holidays.countries.france import France
+
+
+class HolidaysTF(France):
+    """French Southern Territories holidays.
+
+    Alias of a French subdivision that is also officially assigned
+    its own country code in ISO 31661.
+
+    !!! note "Note"
+        Since most islands doesn't have a permanent population,
+        the holidays are just the public ones from France.
+
+    References:
+        * <https://www.iso.org/obp/ui#iso:code:3166:TF>
+        * <https://en.wikipedia.org/wiki/French_Southern_and_Antarctic_Lands>
+        * <https://en.wikipedia.org/wiki/Public_holidays_in_France>
+    """
+
+    country = "TF"
+    parent_entity = France
+    subdivisions = ()  # Override France subdivisions.
+    subdivisions_aliases = {}  # Override France subdivisions aliases.
+    # This overseas territory was separated in 1955.
+    start_year = 1956
+
+    def _populate_public_holidays(self) -> None:
+        self.subdiv = "TF"
+        super()._populate_public_holidays()
+
+
+class FrenchSouthernTerritories(HolidaysTF):
+    pass
+
+
+class TF(HolidaysTF):
+    pass
+
+
+class ATF(HolidaysTF):
+    pass
diff --git a/holidays/locale/en_US/LC_MESSAGES/TF.po b/holidays/locale/en_US/LC_MESSAGES/TF.po
new file mode 100644
index 00000000..df08b508
--- /dev/null
+++ b/holidays/locale/en_US/LC_MESSAGES/TF.po
@@ -0,0 +1,28 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see AUTHORS.md file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+#
+# French Southern Territories holidays en_US localization.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.71\n"
+"POT-Creation-Date: 2023-03-23 14:44+0200\n"
+"PO-Revision-Date: 2023-03-23 14:47+0200\n"
+"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: en_US\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Generated-By: Lingua 4.15.0\n"
+"X-Generator: Poedit 3.2.2\n"
diff --git a/holidays/locale/fr/LC_MESSAGES/TF.po b/holidays/locale/fr/LC_MESSAGES/TF.po
new file mode 100644
index 00000000..a1411fd6
--- /dev/null
+++ b/holidays/locale/fr/LC_MESSAGES/TF.po
@@ -0,0 +1,28 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see AUTHORS.md file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+#
+# French Southern Territories holidays.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.71\n"
+"POT-Creation-Date: 2023-03-23 14:44+0200\n"
+"PO-Revision-Date: 2023-03-23 14:45+0200\n"
+"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"Generated-By: Lingua 4.15.0\n"
+"X-Generator: Poedit 3.2.2\n"
diff --git a/holidays/locale/uk/LC_MESSAGES/TF.po b/holidays/locale/uk/LC_MESSAGES/TF.po
new file mode 100644
index 00000000..06c38c96
--- /dev/null
+++ b/holidays/locale/uk/LC_MESSAGES/TF.po
@@ -0,0 +1,28 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see AUTHORS.md file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+#
+# French Southern Territories holidays uk localization.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.71\n"
+"POT-Creation-Date: 2023-03-23 14:44+0200\n"
+"PO-Revision-Date: 2024-01-23 20:54+0200\n"
+"Last-Translator: ~Jhellico <jhellico@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
+"Generated-By: Lingua 4.15.0\n"
+"X-Generator: Poedit 3.4\n"
diff --git a/holidays/registry.py b/holidays/registry.py
index 300d832a..561d6662 100644
--- a/holidays/registry.py
+++ b/holidays/registry.py
@@ -76,6 +76,7 @@ COUNTRIES: RegistryDict = {
     "fiji": ("Fiji", "FJ", "FJI"),
     "finland": ("Finland", "FI", "FIN"),
     "france": ("France", "FR", "FRA"),
+    "french_southern_territories": ("FrenchSouthernTerritories", "TF", "ATF", "HolidaysTF"),
     "gabon": ("Gabon", "GA", "GAB"),
     "georgia": ("Georgia", "GE", "GEO"),
     "germany": ("Germany", "DE", "DEU"),


Test patch:
diff --git a/tests/countries/test_french_southern_territories.py b/tests/countries/test_french_southern_territories.py
new file mode 100644
index 00000000..7db901ac
--- /dev/null
+++ b/tests/countries/test_french_southern_territories.py
@@ -0,0 +1,46 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see AUTHORS.md file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from unittest import TestCase
+
+from holidays.countries.french_southern_territories import (
+    HolidaysTF,
+    FrenchSouthernTerritories,
+    TF,
+    ATF,
+)
+from tests.common import CommonCountryTests
+
+
+class TestTF(CommonCountryTests, TestCase):
+    @classmethod
+    def setUpClass(cls):
+        super().setUpClass(HolidaysTF)
+
+    def test_country_aliases(self):
+        self.assertAliases(HolidaysTF, FrenchSouthernTerritories, TF, ATF)
+
+    def test_2022(self):
+        self.assertHolidayDates(
+            HolidaysTF(years=2022),
+            "2022-01-01",
+            "2022-04-18",
+            "2022-05-01",
+            "2022-05-08",
+            "2022-05-26",
+            "2022-06-06",
+            "2022-07-14",
+            "2022-08-15",
+            "2022-11-01",
+            "2022-11-11",
+            "2022-12-25",
+        )