Repository: vacanza/holidays
Pull request #2395 (2025-03-31 14:09:04)

Add Antigua and Barbuda holidays
<!--
  Thanks for contributing to holidays!
-->

## Proposed change

Add holidays for Antigua and Barbuda

<!--
  Describe the big picture of your changes.
  Don't forget to link your PR to an existing issue if any.
-->

Resolves #1146.

## Type of change

<!--
  Type of change you want to introduce. Please, check one (1) box only!
  If your PR requires multiple boxes to be checked, most likely it needs to
  be split into multiple PRs.
-->

- [X] New country/market holidays support (thank you!)
- [ ] Supported country/market holidays update (calendar discrepancy fix, localization)
- [ ] Existing code/documentation/test/process quality improvement (best practice, cleanup, refactoring, optimization)
- [ ] Dependency update (version deprecation/pin/upgrade)
- [ ] Bugfix (non-breaking change which fixes an issue)
- [ ] Breaking change (a code change causing existing functionality to break)
- [ ] New feature (new `holidays` functionality in general)

## Checklist

<!--
  Put an `x` in the boxes that apply. You can change them after PR is created.
-->

- [X] I've followed the [contributing guidelines][contributing-guidelines]
- [X] I've successfully run `make check`, all checks and tests are green

<!--
  Thanks again for your contribution!
-->

[contributing-guidelines]: https://github.com/vacanza/holidays/blob/dev/CONTRIBUTING.md
[docs]: https://github.com/vacanza/holidays/tree/dev/docs/source


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2395) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2395&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2395&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2395)


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/vacanza/holidays/pull/2395?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 100.00%. Comparing base [(`4d89284`)](https://app.codecov.io/gh/vacanza/holidays/commit/4d8928448428603b332943c979cedb6c7c3cb408?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza) to head [(`9d035c4`)](https://app.codecov.io/gh/vacanza/holidays/commit/9d035c460dffe0d8d93ff51c3bed6e43bbaa5212?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff            @@
##               dev     #2395   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          205       206    +1     
  Lines        13054     13096   +42     
  Branches      1869      1874    +5     
=========================================
+ Hits         13054     13096   +42     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/vacanza/holidays/pull/2395?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=vacanza).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2395) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2395&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2395&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2395)


KJhellico: I found a few more legislative acts on Antigua holidays:
- [Aug 3, 1993 holiday](https://laws.gov.ag/wp-content/uploads/2021/08/No.-42-of-1993-Proclamation-dated-the-22nd-day-of-July-1993-appointing-Tuesday-the-3rd-day-of-August-1993-as-a-public-holiday-throughout-Antigua-and-Barbuda..pdf)
- [2006 National Heroes Day moved to Dec, 11](https://laws.gov.ag/wp-content/uploads/2022/06/No.-24-of-2006-Proclamation-dated-29th-November2006-Appointing-the-11th-of-December2006.pdf)
- [Feb 13, 2008 holiday (State Funeral of Charlesworth T. Samuel)](https://laws.gov.ag/wp-content/uploads/2022/12/No.-7-of-2008-Proclamation-dated-the-13th-day-of-February-2008-Appointing-Tuesday-19th-February-2008-as-a-Public-Holiday.pdf)
- [Mar 18, 2008 holiday (State Funeral of Sir George Herbert Walter)](https://laws.gov.ag/wp-content/uploads/2022/12/No.-9-of-2008-Proclamation-dated-the-13th-day-of-March-2008-Appointing-Tuesday-18th-March-2008-as-a-Public-Holiday.pdf)
- [Sep 1, 2008 half-day holiday](https://laws.gov.ag/wp-content/uploads/2018/08/Statutory_Instruments_No_39_2008.pdf) (this can be implemented in `HALF_DAY` category, but you can also just skip it)
- [Dec 10, 2012 holiday](https://laws.gov.ag/wp-content/uploads/2021/08/No.-40-of-2012-Proclamation-dated-the-27th-day-of-November-2012-Apponting-the-27th-of-December-2012-as-a-Public-Holiday-throughout-Antigua-and-Barbuda.pdf)
- [2019 Amendments](https://laws.gov.ag/wp-content/uploads/2020/02/No.-23-of-2019-Public-Holidays-Amendment-Act-2019.pdf)
kritibirda26: Update the holidays according the new acts (skipped the half day).
sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2395) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2395&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2395&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2395)


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2395) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=vacanza_python-holidays&pullRequest=2395&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2395&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2395&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2395)



Patch:
diff --git a/README.md b/README.md
index fa562832..af2ec29c 100644
--- a/README.md
+++ b/README.md
@@ -99,7 +99,7 @@ and detailed information.
 
 ## Available Countries
 
-We currently support 162 country codes. The standard way to refer to a country is by using its [ISO
+We currently support 163 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
@@ -183,6 +183,13 @@ any) in brackets, available languages and additional holiday categories. All cou
 <td></td>
 </tr>
 <tr>
+<td>Antigua and Barbuda</td>
+<td>AG</td>
+<td></td>
+<td></td>
+<td></td>
+</tr>
+<tr>
 <td>Argentina</td>
 <td>AR</td>
 <td>Provinces: A (Salta), B (Buenos Aires), C (Ciudad Autónoma de Buenos Aires), D (San Luis), E (Entre Ríos), F (La Rioja), G (Santiago del Estero), H (Chaco), J (San Juan), K (Catamarca), L (La Pampa), M (Mendoza), N (Misiones), P (Formosa), Q (Neuquén), R (Río Negro), S (Santa Fe), T (Tucumán), U (Chubut), V (Tierra del Fuego), W (Corrientes), X (Córdoba), Y (Jujuy), Z (Santa Cruz)</td>
diff --git a/holidays/countries/__init__.py b/holidays/countries/__init__.py
index 97dd3d39..1c80849f 100644
--- a/holidays/countries/__init__.py
+++ b/holidays/countries/__init__.py
@@ -18,6 +18,7 @@ from .algeria import Algeria, DZ, DZA
 from .american_samoa import AmericanSamoa, AS, ASM, HolidaysAS
 from .andorra import Andorra, AD, AND
 from .angola import Angola, AO, AGO
+from .antigua_and_barbuda import AntiguaAndBarbuda, AG, ATG
 from .argentina import Argentina, AR, ARG
 from .armenia import Armenia, AM, ARM
 from .aruba import Aruba, AW, ABW
diff --git a/holidays/countries/antigua_and_barbuda.py b/holidays/countries/antigua_and_barbuda.py
new file mode 100644
index 00000000..2f383473
--- /dev/null
+++ b/holidays/countries/antigua_and_barbuda.py
@@ -0,0 +1,145 @@
+#  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.calendars.gregorian import JAN, FEB, MAR, AUG
+from holidays.groups import ChristianHolidays, InternationalHolidays, StaticHolidays
+from holidays.observed_holiday_base import (
+    ObservedHolidayBase,
+    SUN_TO_NEXT_MON,
+    SAT_SUN_TO_NEXT_MON_TUE,
+    SAT_SUN_TO_NEXT_MON,
+)
+
+
+class AntiguaAndBarbuda(
+    ObservedHolidayBase, ChristianHolidays, InternationalHolidays, StaticHolidays
+):
+    """Antigua and Barbuda holidays.
+
+    References:
+        * [The Public Holidays Act, 1954](https://laws.gov.ag/wp-content/uploads/2018/08/cap-354.pdf)
+        * [The Public Holidays (Amendment) Act, 2005](https://laws.gov.ag/wp-content/uploads/2018/08/a2005-8.pdf)
+        * [The Public Holidays (Amendment) Act, 2014](https://laws.gov.ag/wp-content/uploads/2019/03/Public-Holidays-Amendment-Act.pdf)
+        * [The Public Holidays (Amendment) Act, 2019](https://laws.gov.ag/wp-content/uploads/2020/02/No.-23-of-2019-Public-Holidays-Amendment-Act-2019.pdf)
+        * [No. 24 of 2006 Proclamation](https://laws.gov.ag/wp-content/uploads/2022/06/No.-24-of-2006-Proclamation-dated-29th-November2006-Appointing-the-11th-of-December2006.pdf)
+        * [No. 40 of 2012 Proclamation](https://laws.gov.ag/wp-content/uploads/2021/08/No.-40-of-2012-Proclamation-dated-the-27th-day-of-November-2012-Apponting-the-27th-of-December-2012-as-a-Public-Holiday-throughout-Antigua-and-Barbuda.pdf)
+        * <https://en.wikipedia.org/wiki/Public_holidays_in_Antigua_and_Barbuda>
+
+    Notes:
+        In accordance with No. 24 of 2006 Proclamation, National Heroes Day was celebrated on
+        Dec 11, 2006. In accordance with No. 40 of 2012 Proclamation, National Heroes Day was
+        celebrated on Dec 10, 2012.
+    """
+
+    country = "AG"
+    observed_label = "%s (observed)"
+    start_year = 1955
+
+    def __init__(self, *args, **kwargs):
+        ChristianHolidays.__init__(self)
+        InternationalHolidays.__init__(self)
+        StaticHolidays.__init__(self, AntiguaAndBarbudaStaticHolidays)
+        kwargs.setdefault("observed_rule", SUN_TO_NEXT_MON)
+        super().__init__(*args, **kwargs)
+
+    def _populate_public_holidays(self):
+        # New Year's Day.
+        self._add_observed(self._add_new_years_day("New Year's Day"))
+
+        # Good Friday.
+        self._add_good_friday("Good Friday")
+
+        # Easter Monday.
+        self._add_easter_monday("Easter Monday")
+
+        # Labour Day.
+        self._add_holiday_1st_mon_of_may("Labour Day")
+
+        # Whit Monday.
+        self._add_whit_monday("Whit Monday")
+
+        if self._year <= 2005:
+            # Caribbean Community (Caricom) Day.
+            self._add_holiday_1st_mon_of_jul("Caribbean Community (Caricom) Day")
+
+        # Carnival Monday.
+        self._add_holiday_1st_mon_of_aug("Carnival Monday")
+
+        if self._year >= 2006:
+            # Carnival Tuesday.
+            self._add_holiday_1_day_past_1st_mon_of_aug("Carnival Tuesday")
+
+        # Independence Day.
+        dt = self._add_holiday_nov_1("Independence Day")
+        if self._year >= 2005:
+            self._add_observed(dt, rule=SAT_SUN_TO_NEXT_MON)
+
+        if self._year >= 2005:
+            name = (
+                # Sir Vere Cornwall Bird Snr. Day.
+                "Sir Vere Cornwall Bird Snr. Day"
+                if self._year >= 2014
+                # National Heroes Day.
+                else "National Heroes Day"
+            )
+            if self._year == 2006:
+                self._add_holiday_dec_11(name)
+            elif self._year == 2012:
+                self._add_holiday_dec_10(name)
+            else:
+                dt = self._add_holiday_dec_9(name)
+                if self._year >= 2020:
+                    self._add_observed(dt, rule=SAT_SUN_TO_NEXT_MON)
+
+        # Christmas Day.
+        self._add_observed(self._add_christmas_day("Christmas Day"), rule=SAT_SUN_TO_NEXT_MON_TUE)
+
+        # Boxing Day.
+        self._add_observed(self._add_christmas_day_two("Boxing Day"), rule=SAT_SUN_TO_NEXT_MON_TUE)
+
+
+class AG(AntiguaAndBarbuda):
+    pass
+
+
+class ATG(AntiguaAndBarbuda):
+    pass
+
+
+class AntiguaAndBarbudaStaticHolidays:
+    """Antigua and Barbuda special holidays.
+
+    References:
+        * [August 3, 1993 Holiday](https://laws.gov.ag/wp-content/uploads/2021/08/No.-42-of-1993-Proclamation-dated-the-22nd-day-of-July-1993-appointing-Tuesday-the-3rd-day-of-August-1993-as-a-public-holiday-throughout-Antigua-and-Barbuda..pdf)
+        * [State Funeral of the late The Honourable Charlesworth T. Samuel](https://laws.gov.ag/wp-content/uploads/2022/12/No.-7-of-2008-Proclamation-dated-the-13th-day-of-February-2008-Appointing-Tuesday-19th-February-2008-as-a-Public-Holiday.pdf)
+        * [State Funeral of the late The Honourable Sir George Herbert Walter](https://laws.gov.ag/wp-content/uploads/2022/12/No.-9-of-2008-Proclamation-dated-the-13th-day-of-March-2008-Appointing-Tuesday-18th-March-2008-as-a-Public-Holiday.pdf)
+        * According to the Public Holidays (Amendment) Act, 2014, the day after the general
+          election is a holiday.
+            * [2018 Antiguan general election](https://en.wikipedia.org/wiki/2018_Antiguan_general_election)
+            * [2023 Antiguan general election](https://en.wikipedia.org/wiki/2023_Antiguan_general_election)
+            * [The Public Holidays (Amendment) Act, 2014](https://laws.gov.ag/wp-content/uploads/2019/03/Public-Holidays-Amendment-Act.pdf)
+    """
+
+    # Day after the General Election.
+    day_after_the_general_election = "Day after the General Election"
+
+    special_public_holidays = {
+        1993: (AUG, 3, "Public Holiday"),
+        2008: (
+            # State Funeral of the late The Honourable Charlesworth T. Samuel.
+            (FEB, 19, "State Funeral of the late The Honourable Charlesworth T. Samuel"),
+            # State Funeral of the late The Honourable Sir George Herbert Walter.
+            (MAR, 18, "State Funeral of the late The Honourable Sir George Herbert Walter"),
+        ),
+        2018: (MAR, 22, day_after_the_general_election),
+        2023: (JAN, 19, day_after_the_general_election),
+    }
diff --git a/holidays/holiday_base.py b/holidays/holiday_base.py
index 94a7c1c6..65e50dcd 100644
--- a/holidays/holiday_base.py
+++ b/holidays/holiday_base.py
@@ -1172,26 +1172,40 @@ class HolidayBase(dict[date, str]):
 
         return dict.pop(self, self.__keytransform__(key), default)
 
-    def pop_named(self, name: str) -> list[date]:
+    def pop_named(self, holiday_name: str, lookup: str = "icontains") -> list[date]:
         """Remove all holidays matching the given name.
 
         This method removes all dates associated with a holiday name, so they are
-        no longer considered holidays. The match is case-insensitive, and partial
-        matches are also removed.
+        no longer considered holidays. The search by default is case-insensitive and
+        includes partial matches.
 
         Args:
-            name:
+            holiday_name:
                 The holiday's name to try to match.
 
+            lookup:
+                The holiday name lookup type:
+
+                * contains - case sensitive contains match;
+                * exact - case sensitive exact match;
+                * startswith - case sensitive starts with match;
+                * icontains - case insensitive contains match;
+                * iexact - case insensitive exact match;
+                * istartswith - case insensitive starts with match;
+
         Returns:
             A list of dates removed.
 
         Raises:
             KeyError: if date is not a holiday.
         """
-        use_exact_name = HOLIDAY_NAME_DELIMITER in name
-        if not (dts := self.get_named(name, split_multiple_names=not use_exact_name)):
-            raise KeyError(name)
+        use_exact_name = HOLIDAY_NAME_DELIMITER in holiday_name
+        if not (
+            dts := self.get_named(
+                holiday_name, lookup=lookup, split_multiple_names=not use_exact_name
+            )
+        ):
+            raise KeyError(holiday_name)
 
         popped = []
         for dt in dts:
@@ -1200,16 +1214,35 @@ class HolidayBase(dict[date, str]):
             popped.append(dt)
 
             # Keep the rest of holidays falling on the same date.
-            if not use_exact_name:
-                name_lower = name.lower()
+            if use_exact_name:
+                continue
+            if lookup == "icontains":
+                holiday_name_lower = holiday_name.lower()
                 holiday_names = [
-                    holiday_name
-                    for holiday_name in holiday_names
-                    if name_lower not in holiday_name.lower()
+                    name for name in holiday_names if holiday_name_lower not in name.lower()
                 ]
-
-                if holiday_names:
-                    self[dt] = HOLIDAY_NAME_DELIMITER.join(holiday_names)
+            elif lookup == "iexact":
+                holiday_name_lower = holiday_name.lower()
+                holiday_names = [
+                    name for name in holiday_names if holiday_name_lower != name.lower()
+                ]
+            elif lookup == "istartswith":
+                holiday_name_lower = holiday_name.lower()
+                holiday_names = [
+                    name
+                    for name in holiday_names
+                    if holiday_name_lower != name[: len(holiday_name)].lower()
+                ]
+            elif lookup == "contains":
+                holiday_names = [name for name in holiday_names if holiday_name not in name]
+            elif lookup == "exact":
+                holiday_names = [name for name in holiday_names if holiday_name != name]
+            else:  # startswith
+                holiday_names = [
+                    name for name in holiday_names if holiday_name != name[: len(holiday_name)]
+                ]
+            if holiday_names:
+                self[dt] = HOLIDAY_NAME_DELIMITER.join(holiday_names)
 
         return popped
 
diff --git a/holidays/registry.py b/holidays/registry.py
index a75947b1..08c7a852 100644
--- a/holidays/registry.py
+++ b/holidays/registry.py
@@ -26,6 +26,7 @@ COUNTRIES: RegistryDict = {
     "american_samoa": ("AmericanSamoa", "AS", "ASM", "HolidaysAS"),
     "andorra": ("Andorra", "AD", "AND"),
     "angola": ("Angola", "AO", "AGO"),
+    "antigua_and_barbuda": ("AntiguaAndBarbuda", "AG", "ATG"),
     "argentina": ("Argentina", "AR", "ARG"),
     "armenia": ("Armenia", "AM", "ARM"),
     "aruba": ("Aruba", "AW", "ABW"),


Test patch:
diff --git a/tests/countries/test_antigua_and_barbuda.py b/tests/countries/test_antigua_and_barbuda.py
new file mode 100644
index 00000000..3d027119
--- /dev/null
+++ b/tests/countries/test_antigua_and_barbuda.py
@@ -0,0 +1,218 @@
+#  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.antigua_and_barbuda import AntiguaAndBarbuda, AG, ATG
+from tests.common import CommonCountryTests
+
+
+class TestAntiguaAndBarbuda(CommonCountryTests, TestCase):
+    @classmethod
+    def setUpClass(cls):
+        years = range(1955, 2050)
+        super().setUpClass(AntiguaAndBarbuda, years=years, years_non_observed=years)
+
+    def test_country_aliases(self):
+        self.assertAliases(AntiguaAndBarbuda, AG, ATG)
+
+    def test_no_holidays(self):
+        self.assertNoHolidays(AntiguaAndBarbuda(years=1954))
+
+    def test_special_holidays(self):
+        name_day_after_general_election = "Day after the General Election"
+        for dt, name in (
+            ("1993-08-03", "Public Holiday"),
+            ("2008-02-19", "State Funeral of the late The Honourable Charlesworth T. Samuel"),
+            ("2008-03-18", "State Funeral of the late The Honourable Sir George Herbert Walter"),
+            ("2018-03-22", name_day_after_general_election),
+            ("2023-01-19", name_day_after_general_election),
+        ):
+            self.assertHolidayName(name, dt)
+
+    def test_new_years_day(self):
+        name = "New Year's Day"
+        self.assertHolidayName(name, (f"{year}-01-01" for year in range(1955, 2050)))
+        dt = (
+            "1995-01-02",
+            "2006-01-02",
+            "2012-01-02",
+            "2017-01-02",
+            "2023-01-02",
+        )
+        self.assertHolidayName(f"{name} (observed)", dt)
+        self.assertNoNonObservedHoliday(dt)
+
+    def test_good_friday(self):
+        name = "Good Friday"
+        self.assertHolidayName(
+            name,
+            "2021-04-02",
+            "2022-04-15",
+            "2023-04-07",
+            "2024-03-29",
+            "2025-04-18",
+        )
+        self.assertHolidayName(name, range(1955, 2050))
+
+    def test_easter_monday(self):
+        name = "Easter Monday"
+        self.assertHolidayName(
+            name,
+            "2021-04-05",
+            "2022-04-18",
+            "2023-04-10",
+            "2024-04-01",
+            "2025-04-21",
+        )
+        self.assertHolidayName(name, range(1955, 2050))
+
+    def test_labour_day(self):
+        name = "Labour Day"
+        self.assertHolidayName(
+            name,
+            "2021-05-03",
+            "2022-05-02",
+            "2023-05-01",
+            "2024-05-06",
+            "2025-05-05",
+        )
+        self.assertHolidayName(name, range(1955, 2050))
+
+    def test_whit_monday(self):
+        name = "Whit Monday"
+        self.assertHolidayName(
+            name,
+            "2021-05-24",
+            "2022-06-06",
+            "2023-05-29",
+            "2024-05-20",
+            "2025-06-09",
+        )
+        self.assertHolidayName(name, range(1955, 2050))
+
+    def test_caribbean_community_day(self):
+        name = "Caribbean Community (Caricom) Day"
+        self.assertHolidayName(
+            name,
+            "1995-07-03",
+            "2000-07-03",
+            "2004-07-05",
+            "2005-07-04",
+        )
+        self.assertHolidayName(name, range(1955, 2006))
+        self.assertNoHolidayName(name, range(2006, 2050))
+
+    def test_carnival_monday(self):
+        name = "Carnival Monday"
+        self.assertHolidayName(
+            name,
+            "2021-08-02",
+            "2022-08-01",
+            "2023-08-07",
+            "2024-08-05",
+            "2025-08-04",
+        )
+        self.assertHolidayName(name, range(1955, 2050))
+
+    def test_carnival_tuesday(self):
+        name = "Carnival Tuesday"
+        self.assertHolidayName(
+            name,
+            "2021-08-03",
+            "2022-08-02",
+            "2023-08-08",
+            "2024-08-06",
+            "2025-08-05",
+        )
+        self.assertHolidayName(name, range(2006, 2050))
+        self.assertNoHolidayName(name, range(1955, 2006))
+
+    def test_independence_day(self):
+        name = "Independence Day"
+        self.assertHolidayName(name, (f"{year}-11-01" for year in range(1955, 2050)))
+        dt = (
+            "2008-11-03",
+            "2009-11-02",
+            "2014-11-03",
+            "2015-11-02",
+            "2020-11-02",
+            "2025-11-03",
+        )
+        self.assertHolidayName(f"{name} (observed)", dt)
+        self.assertNoNonObservedHoliday(dt)
+
+    def test_national_heroes_and_sir_vere_cornwall_bird_snr_day(self):
+        name_1 = "National Heroes Day"
+        name_2 = "Sir Vere Cornwall Bird Snr. Day"
+        self.assertHolidayName(
+            name_1,
+            "2005-12-09",
+            "2006-12-11",
+            "2007-12-09",
+            "2008-12-09",
+            "2009-12-09",
+            "2010-12-09",
+            "2011-12-09",
+            "2012-12-10",
+            "2013-12-09",
+        )
+        self.assertHolidayName(name_2, (f"{year}-12-09" for year in range(2014, 2050)))
+        self.assertNoHoliday(f"{year}-12-09" for year in range(1955, 2005))
+        self.assertNoHolidayName(name_1, range(1955, 2005), range(2014, 2050))
+        self.assertNoHolidayName(name_2, range(1955, 2014))
+
+        dt = ("2023-12-11",)
+        self.assertHolidayName(f"{name_2} (observed)", dt)
+        self.assertNoNonObservedHoliday(dt)
+
+    def test_christmas_day(self):
+        name = "Christmas Day"
+        self.assertHolidayName(name, (f"{year}-12-25" for year in range(1955, 2050)))
+        dt = (
+            "2004-12-27",
+            "2005-12-27",
+            "2010-12-27",
+            "2011-12-27",
+            "2016-12-27",
+            "2022-12-27",
+        )
+        self.assertHolidayName(f"{name} (observed)", dt)
+        self.assertNoNonObservedHoliday(dt)
+
+    def test_boxing_day(self):
+        name = "Boxing Day"
+        self.assertHolidayName(name, (f"{year}-12-26" for year in range(1955, 2050)))
+        dt = (
+            "2004-12-28",
+            "2010-12-28",
+            "2021-12-28",
+        )
+        self.assertHolidayName(f"{name} (observed)", dt)
+        self.assertNoNonObservedHoliday(dt)
+
+    def test_2025(self):
+        self.assertHolidays(
+            AntiguaAndBarbuda(years=2025),
+            ("2025-01-01", "New Year's Day"),
+            ("2025-04-18", "Good Friday"),
+            ("2025-04-21", "Easter Monday"),
+            ("2025-05-05", "Labour Day"),
+            ("2025-06-09", "Whit Monday"),
+            ("2025-08-04", "Carnival Monday"),
+            ("2025-08-05", "Carnival Tuesday"),
+            ("2025-11-01", "Independence Day"),
+            ("2025-11-03", "Independence Day (observed)"),
+            ("2025-12-09", "Sir Vere Cornwall Bird Snr. Day"),
+            ("2025-12-25", "Christmas Day"),
+            ("2025-12-26", "Boxing Day"),
+        )
diff --git a/tests/test_holiday_base.py b/tests/test_holiday_base.py
index 59b003bc..4951411c 100644
--- a/tests/test_holiday_base.py
+++ b/tests/test_holiday_base.py
@@ -839,6 +839,82 @@ class TestPopNamed(unittest.TestCase):
             self.assertNotIn(dt, self.hb)
         self.assertRaises(KeyError, lambda: self.hb.pop_named("New Year"))
 
+    def test_contains(self):
+        self.assertIn("2022-01-01", self.hb)
+        removed_dates = self.hb.pop_named("Day", lookup="contains")
+        self.assertEqual(len(removed_dates), 6)
+        self.assertNotIn("2022-01-01", self.hb)
+        self.assertNotIn("2022-06-19", self.hb)
+        self.assertNotIn("2022-06-20", self.hb)
+        self.assertNotIn("2022-07-04", self.hb)
+        self.assertNotIn("2022-12-25", self.hb)
+        self.assertNotIn("2022-12-26", self.hb)
+
+    def test_icontains(self):
+        self.assertIn("2022-01-01", self.hb)
+        removed_dates = self.hb.pop_named("day", lookup="icontains")
+        self.assertEqual(len(removed_dates), 6)
+        self.assertNotIn("2022-01-01", self.hb)
+        self.assertNotIn("2022-06-19", self.hb)
+        self.assertNotIn("2022-06-20", self.hb)
+        self.assertNotIn("2022-07-04", self.hb)
+        self.assertNotIn("2022-12-25", self.hb)
+        self.assertNotIn("2022-12-26", self.hb)
+
+    def test_exact(self):
+        self.assertIn("2022-01-01", self.hb)
+        removed_dates = self.hb.pop_named("Independence Day", lookup="exact")
+        self.assertEqual(len(removed_dates), 1)
+        self.assertNotIn("2022-07-04", self.hb)
+        self.assertIn("2022-06-19", self.hb)
+        self.assertIn("2022-06-20", self.hb)
+
+        hb = CountryStub1(years=2025)
+        hb["2024-02-02"] = "Big Groundhog Day; Groundhog Day"
+        removed_dates = hb.pop_named("Groundhog Day", lookup="exact")
+        self.assertEqual(len(removed_dates), 1)
+        self.assertEqual(hb["2024-02-02"], "Big Groundhog Day")
+
+    def test_iexact(self):
+        self.assertIn("2022-01-01", self.hb)
+        removed_dates = self.hb.pop_named("independence day", lookup="iexact")
+        self.assertEqual(len(removed_dates), 1)
+        self.assertNotIn("2022-07-04", self.hb)
+        self.assertIn("2022-06-19", self.hb)
+        self.assertIn("2022-06-20", self.hb)
+
+        hb = CountryStub1(years=2025)
+        hb["2024-02-02"] = "Big Groundhog Day; Groundhog Day"
+        removed_dates = hb.pop_named("Groundhog day", lookup="iexact")
+        self.assertEqual(len(removed_dates), 1)
+        self.assertEqual(hb["2024-02-02"], "Big Groundhog Day")
+
+    def test_startswith(self):
+        self.assertIn("2022-01-01", self.hb)
+        removed_dates = self.hb.pop_named("Independence", lookup="startswith")
+        self.assertEqual(len(removed_dates), 1)
+        self.assertNotIn("2022-07-04", self.hb)
+        self.assertIn("2022-06-19", self.hb)
+        self.assertIn("2022-06-20", self.hb)
+
+        removed_dates = self.hb.pop_named("Christmas", lookup="startswith")
+        self.assertEqual(len(removed_dates), 2)
+        self.assertNotIn("2022-12-25", self.hb)
+        self.assertNotIn("2022-12-26", self.hb)
+
+    def test_istartswith(self):
+        self.assertIn("2022-01-01", self.hb)
+        removed_dates = self.hb.pop_named("independence", lookup="istartswith")
+        self.assertEqual(len(removed_dates), 1)
+        self.assertNotIn("2022-07-04", self.hb)
+        self.assertIn("2022-06-19", self.hb)
+        self.assertIn("2022-06-20", self.hb)
+
+        removed_dates = self.hb.pop_named("christmas", lookup="istartswith")
+        self.assertEqual(len(removed_dates), 2)
+        self.assertNotIn("2022-12-25", self.hb)
+        self.assertNotIn("2022-12-26", self.hb)
+
 
 class TestRepr(unittest.TestCase):
     def test_base(self):