Repository: vacanza/holidays
Pull request #2330 (2025-03-05 22:46:20)

Bump ruff from 0.9.7 to 0.9.9
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.9.7 to 0.9.9.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/astral-sh/ruff/releases">ruff's releases</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h2>Release Notes</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is enabled (<a href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>Contributors</h2>
<ul>
<li><a href="https://github.com/InSyncWithFoo"><code>@​InSyncWithFoo</code></a></li>
<li><a href="https://github.com/MichaReiser"><code>@​MichaReiser</code></a></li>
<li><a href="https://github.com/dhruvmanila"><code>@​dhruvmanila</code></a></li>
<li><a href="https://github.com/ntBre"><code>@​ntBre</code></a></li>
</ul>
<h2>Install ruff 0.9.9</h2>
<h3>Install prebuilt binaries via shell script</h3>
<pre lang="sh"><code>curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.sh | sh
</code></pre>
<h3>Install prebuilt binaries via powershell script</h3>
<pre lang="sh"><code>powershell -ExecutionPolicy ByPass -c &quot;irm https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-installer.ps1 | iex&quot;
</code></pre>
<h2>Download ruff 0.9.9</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Platform</th>
<th>Checksum</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz">ruff-aarch64-apple-darwin.tar.gz</a></td>
<td>Apple Silicon macOS</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz">ruff-x86_64-apple-darwin.tar.gz</a></td>
<td>Intel macOS</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-apple-darwin.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip">ruff-aarch64-pc-windows-msvc.zip</a></td>
<td>ARM64 Windows</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip">ruff-i686-pc-windows-msvc.zip</a></td>
<td>x86 Windows</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip">ruff-x86_64-pc-windows-msvc.zip</a></td>
<td>x64 Windows</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-pc-windows-msvc.zip.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz">ruff-aarch64-unknown-linux-gnu.tar.gz</a></td>
<td>ARM64 Linux</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz">ruff-i686-unknown-linux-gnu.tar.gz</a></td>
<td>x86 Linux</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-i686-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz">ruff-powerpc64-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64 Linux</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz">ruff-powerpc64le-unknown-linux-gnu.tar.gz</a></td>
<td>PPC64LE Linux</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-powerpc64le-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz">ruff-s390x-unknown-linux-gnu.tar.gz</a></td>
<td>S390x Linux</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-s390x-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz">ruff-x86_64-unknown-linux-gnu.tar.gz</a></td>
<td>x64 Linux</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-x86_64-unknown-linux-gnu.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz">ruff-armv7-unknown-linux-gnueabihf.tar.gz</a></td>
<td>ARMv7 Linux</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-armv7-unknown-linux-gnueabihf.tar.gz.sha256">checksum</a></td>
</tr>
<tr>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz">ruff-aarch64-unknown-linux-musl.tar.gz</a></td>
<td>ARM64 MUSL Linux</td>
<td><a href="https://github.com/astral-sh/ruff/releases/download/0.9.9/ruff-aarch64-unknown-linux-musl.tar.gz.sha256">checksum</a></td>
</tr>
</tbody>
</table>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md">ruff's changelog</a>.</em></p>
<blockquote>
<h2>0.9.9</h2>
<h3>Preview features</h3>
<ul>
<li>Fix caching of unsupported-syntax errors (<a href="https://redirect.github.com/astral-sh/ruff/pull/16425">#16425</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>Only show unsupported-syntax errors in editors when preview mode is enabled (<a href="https://redirect.github.com/astral-sh/ruff/pull/16429">#16429</a>)</li>
</ul>
<h2>0.9.8</h2>
<h3>Preview features</h3>
<ul>
<li>Start detecting version-related syntax errors in the parser (<a href="https://redirect.github.com/astral-sh/ruff/pull/16090">#16090</a>)</li>
</ul>
<h3>Rule changes</h3>
<ul>
<li>[<code>pylint</code>] Mark fix unsafe (<code>PLW1507</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/16343">#16343</a>)</li>
<li>[<code>pylint</code>] Catch <code>case np.nan</code>/<code>case math.nan</code> in <code>match</code> statements (<code>PLW0177</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/16378">#16378</a>)</li>
<li>[<code>ruff</code>] Add more Pydantic models variants to the list of default copy semantics (<code>RUF012</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/16291">#16291</a>)</li>
</ul>
<h3>Server</h3>
<ul>
<li>Avoid indexing the project if <code>configurationPreference</code> is <code>editorOnly</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/16381">#16381</a>)</li>
<li>Avoid unnecessary info at non-trace server log level (<a href="https://redirect.github.com/astral-sh/ruff/pull/16389">#16389</a>)</li>
<li>Expand <code>ruff.configuration</code> to allow inline config (<a href="https://redirect.github.com/astral-sh/ruff/pull/16296">#16296</a>)</li>
<li>Notify users for invalid client settings (<a href="https://redirect.github.com/astral-sh/ruff/pull/16361">#16361</a>)</li>
</ul>
<h3>Configuration</h3>
<ul>
<li>Add <code>per-file-target-version</code> option (<a href="https://redirect.github.com/astral-sh/ruff/pull/16257">#16257</a>)</li>
</ul>
<h3>Bug fixes</h3>
<ul>
<li>[<code>refurb</code>] Do not consider docstring(s) (<code>FURB156</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/16391">#16391</a>)</li>
<li>[<code>flake8-self</code>] Ignore attribute accesses on instance-like variables (<code>SLF001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/16149">#16149</a>)</li>
<li>[<code>pylint</code>] Fix false positives, add missing methods, and support positional-only parameters (<code>PLE0302</code>) (<a href="https://redirect.github.com/astral-sh/ruff/pull/16263">#16263</a>)</li>
<li>[<code>flake8-pyi</code>] Mark <code>PYI030</code> fix unsafe when comments are deleted (<a href="https://redirect.github.com/astral-sh/ruff/pull/16322">#16322</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Fix example for <code>S611</code> (<a href="https://redirect.github.com/astral-sh/ruff/pull/16316">#16316</a>)</li>
<li>Normalize inconsistent markdown headings in docstrings (<a href="https://redirect.github.com/astral-sh/ruff/pull/16364">#16364</a>)</li>
<li>Document MSRV policy (<a href="https://redirect.github.com/astral-sh/ruff/pull/16384">#16384</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/astral-sh/ruff/commit/091d0af2ab026a08b82d4aa7d3ab6b1ca4db778c"><code>091d0af</code></a> Bump version to Ruff 0.9.9 (<a href="https://redirect.github.com/astral-sh/ruff/issues/16434">#16434</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/3d72138740ed8c3ec9f733ace10fd40af0ff77eb"><code>3d72138</code></a> Check <code>LinterSettings::preview</code> for version-related syntax errors (<a href="https://redirect.github.com/astral-sh/ruff/issues/16429">#16429</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/4a237560244ecc1c2b4217724bcbaf605c844468"><code>4a23756</code></a> Avoid caching files with unsupported syntax errors (<a href="https://redirect.github.com/astral-sh/ruff/issues/16425">#16425</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/af62f7932bfee8a35b411c8351fbb81068caf7a6"><code>af62f79</code></a> Prioritize &quot;bug&quot; label for changelog sections (<a href="https://redirect.github.com/astral-sh/ruff/issues/16433">#16433</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/0ced8d053c2ff6ff86f3329f24c7c0854fa8466b"><code>0ced8d0</code></a> [<code>flake8-copyright</code>] Add links to applicable options (<code>CPY001</code>) (<a href="https://redirect.github.com/astral-sh/ruff/issues/16421">#16421</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/a8e171f82c14d7a6d617b204eca39978eb2ad2df"><code>a8e171f</code></a> Fix string-length limit in documentation for PYI054 (<a href="https://redirect.github.com/astral-sh/ruff/issues/16432">#16432</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/cf83584abb130574059064ad5f0dd806c22e45d5"><code>cf83584</code></a> Show version-related syntax errors in the playground (<a href="https://redirect.github.com/astral-sh/ruff/issues/16419">#16419</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/764aa0e6a1b16284c1c939332c19d742dae8aee1"><code>764aa0e</code></a> Allow passing <code>ParseOptions</code> to inline tests (<a href="https://redirect.github.com/astral-sh/ruff/issues/16357">#16357</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/568cf88c6c5b5551a675ae2b13deedec0fe226cb"><code>568cf88</code></a> Bump version to 0.9.8 (<a href="https://redirect.github.com/astral-sh/ruff/issues/16414">#16414</a>)</li>
<li><a href="https://github.com/astral-sh/ruff/commit/040071bbc5b21306f2759693ca6ee2c3fc5420bf"><code>040071b</code></a> [red-knot] Ignore surrounding whitespace when looking for `&lt;!-- snapshot-diag...</li>
<li>Additional commits viewable in <a href="https://github.com/astral-sh/ruff/compare/0.9.7...0.9.9">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ruff&package-manager=pip&previous-version=0.9.7&new-version=0.9.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

coderabbitai[bot]: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: skip review by coderabbit.ai -->

> [!IMPORTANT]
> ## Review skipped
> 
> Bot user detected.
> 
> To trigger a single review, invoke the `@coderabbitai review` command.
> 
> You can disable this status message by setting the `reviews.review_status` to `false` in the CodeRabbit configuration file.

<!-- end of auto-generated comment: skip review by coderabbit.ai -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=vacanza/holidays&utm_content=2330):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
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=2330) **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=2330&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=2330&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=2330&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=2330&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=2330&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2330)



Patch:
diff --git a/.github/workflows/pre-commit-autoupdate.yml b/.github/workflows/pre-commit-autoupdate.yml
index f0d15672..495a3ce8 100644
--- a/.github/workflows/pre-commit-autoupdate.yml
+++ b/.github/workflows/pre-commit-autoupdate.yml
@@ -40,7 +40,7 @@ jobs:
           pre-commit autoupdate
           pre-commit run --all-files
 
-      - uses: peter-evans/create-pull-request@v7.0.7
+      - uses: peter-evans/create-pull-request@v7.0.8
         with:
           base: dev
           body: Update pre-commit hooks to their latest versions.
diff --git a/.github/workflows/update-snapshots.yml b/.github/workflows/update-snapshots.yml
index 247c1d70..fcfc3aed 100644
--- a/.github/workflows/update-snapshots.yml
+++ b/.github/workflows/update-snapshots.yml
@@ -38,7 +38,7 @@ jobs:
         run: |
           make snapshot
 
-      - uses: peter-evans/create-pull-request@v7.0.7
+      - uses: peter-evans/create-pull-request@v7.0.8
         with:
           base: dev
           body: Automatically generated snapshots update.
diff --git a/holidays/countries/united_states.py b/holidays/countries/united_states.py
index 3ca39fba..fd238851 100644
--- a/holidays/countries/united_states.py
+++ b/holidays/countries/united_states.py
@@ -62,6 +62,7 @@ class UnitedStates(ObservedHolidayBase, ChristianHolidays, InternationalHolidays
         - IN: https://digital.statelib.lib.in.us/infoexpress/holidays.aspx
               https://www.in.gov/spd/benefits/state-holidays/
         - MD: https://msa.maryland.gov/msa/mdmanual/01glance/html/holidayl.html
+        - MI: https://www.michigan.gov/som/government/state-holidays
         - MN: https://www.revisor.mn.gov/statutes/cite/645.44
         - MT: https://archive.legmt.gov/bills/mca/title_0010/chapter_0010/part_0020/section_0160/0010-0010-0020-0160.html
         - NJ: https://nj.gov/nj/about/facts/holidays/
@@ -684,6 +685,14 @@ class UnitedStates(ObservedHolidayBase, ChristianHolidays, InternationalHolidays
             # New Year's Eve
             self._add_observed(self._add_new_years_eve("New Year's Eve"))
 
+        # Election Day
+        if self._year >= 2008 and self._year % 2 == 0:
+            self._add_holiday_1_day_past_1st_mon_of_nov("Election Day")
+
+        # Day after Thanksgiving
+        if self._year >= 2017:
+            self._add_holiday_1_day_past_4th_thu_of_nov("Day After Thanksgiving")
+
     def _populate_subdiv_mn_public_holidays(self):
         # Washington's Birthday
         if self._year >= 1971:
diff --git a/requirements/dev.txt b/requirements/dev.txt
index 6568f220..084afede 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -7,7 +7,7 @@ hijridate==2.5.0
 lingva==5.0.5
 pre-commit==4.1.0
 pygithub==2.6.1
-ruff==0.9.7
+ruff==0.9.9
 tox==4.24.1
 urllib3>=2.2.2 # not directly required, pinned by Snyk to avoid a vulnerability
 zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability
diff --git a/snapshots/countries/US_MI.json b/snapshots/countries/US_MI.json
index 0dc399be..0fb436d9 100644
--- a/snapshots/countries/US_MI.json
+++ b/snapshots/countries/US_MI.json
@@ -835,6 +835,7 @@
     "2010-07-05": "Independence Day (observed)",
     "2010-09-06": "Labor Day",
     "2010-10-31": "Halloween",
+    "2010-11-02": "Election Day",
     "2010-11-11": "Veterans Day",
     "2010-11-25": "Thanksgiving",
     "2010-12-24": "Christmas Day (observed)",
@@ -895,6 +896,7 @@
     "2014-07-04": "Independence Day",
     "2014-09-01": "Labor Day",
     "2014-10-31": "Halloween",
+    "2014-11-04": "Election Day",
     "2014-11-11": "Veterans Day",
     "2014-11-27": "Thanksgiving",
     "2014-12-24": "Christmas Eve",
@@ -949,6 +951,7 @@
     "2017-11-10": "Veterans Day (observed)",
     "2017-11-11": "Veterans Day",
     "2017-11-23": "Thanksgiving",
+    "2017-11-24": "Day After Thanksgiving",
     "2017-12-22": "Christmas Eve (observed)",
     "2017-12-24": "Christmas Eve",
     "2017-12-25": "Christmas Day",
@@ -963,9 +966,11 @@
     "2018-07-04": "Independence Day",
     "2018-09-03": "Labor Day",
     "2018-10-31": "Halloween",
+    "2018-11-06": "Election Day",
     "2018-11-11": "Veterans Day",
     "2018-11-12": "Veterans Day (observed)",
     "2018-11-22": "Thanksgiving",
+    "2018-11-23": "Day After Thanksgiving",
     "2018-12-24": "Christmas Eve",
     "2018-12-25": "Christmas Day",
     "2018-12-31": "New Year's Eve",
@@ -981,6 +986,7 @@
     "2019-10-31": "Halloween",
     "2019-11-11": "Veterans Day",
     "2019-11-28": "Thanksgiving",
+    "2019-11-29": "Day After Thanksgiving",
     "2019-12-24": "Christmas Eve",
     "2019-12-25": "Christmas Day",
     "2019-12-31": "New Year's Eve",
@@ -998,6 +1004,7 @@
     "2020-11-03": "Election Day",
     "2020-11-11": "Veterans Day",
     "2020-11-26": "Thanksgiving",
+    "2020-11-27": "Day After Thanksgiving",
     "2020-12-24": "Christmas Eve",
     "2020-12-25": "Christmas Day",
     "2020-12-31": "New Year's Eve",
@@ -1016,6 +1023,7 @@
     "2021-10-31": "Halloween",
     "2021-11-11": "Veterans Day",
     "2021-11-25": "Thanksgiving",
+    "2021-11-26": "Day After Thanksgiving",
     "2021-12-23": "Christmas Eve (observed)",
     "2021-12-24": "Christmas Day (observed); Christmas Eve",
     "2021-12-25": "Christmas Day",
@@ -1032,8 +1040,10 @@
     "2022-07-04": "Independence Day",
     "2022-09-05": "Labor Day",
     "2022-10-31": "Halloween",
+    "2022-11-08": "Election Day",
     "2022-11-11": "Veterans Day",
     "2022-11-24": "Thanksgiving",
+    "2022-11-25": "Day After Thanksgiving",
     "2022-12-23": "Christmas Eve (observed)",
     "2022-12-24": "Christmas Eve",
     "2022-12-25": "Christmas Day",
@@ -1055,6 +1065,7 @@
     "2023-11-10": "Veterans Day (observed)",
     "2023-11-11": "Veterans Day",
     "2023-11-23": "Thanksgiving",
+    "2023-11-24": "Day After Thanksgiving",
     "2023-12-22": "Christmas Eve (observed)",
     "2023-12-24": "Christmas Eve",
     "2023-12-25": "Christmas Day",
@@ -1073,6 +1084,7 @@
     "2024-11-05": "Election Day",
     "2024-11-11": "Veterans Day",
     "2024-11-28": "Thanksgiving",
+    "2024-11-29": "Day After Thanksgiving",
     "2024-12-24": "Christmas Eve",
     "2024-12-25": "Christmas Day",
     "2024-12-31": "New Year's Eve",
@@ -1089,6 +1101,7 @@
     "2025-10-31": "Halloween",
     "2025-11-11": "Veterans Day",
     "2025-11-27": "Thanksgiving",
+    "2025-11-28": "Day After Thanksgiving",
     "2025-12-24": "Christmas Eve",
     "2025-12-25": "Christmas Day",
     "2025-12-31": "New Year's Eve",
@@ -1104,8 +1117,10 @@
     "2026-07-04": "Independence Day",
     "2026-09-07": "Labor Day",
     "2026-10-31": "Halloween",
+    "2026-11-03": "Election Day",
     "2026-11-11": "Veterans Day",
     "2026-11-26": "Thanksgiving",
+    "2026-11-27": "Day After Thanksgiving",
     "2026-12-24": "Christmas Eve",
     "2026-12-25": "Christmas Day",
     "2026-12-31": "New Year's Eve",
@@ -1124,6 +1139,7 @@
     "2027-10-31": "Halloween",
     "2027-11-11": "Veterans Day",
     "2027-11-25": "Thanksgiving",
+    "2027-11-26": "Day After Thanksgiving",
     "2027-12-23": "Christmas Eve (observed)",
     "2027-12-24": "Christmas Day (observed); Christmas Eve",
     "2027-12-25": "Christmas Day",
@@ -1143,6 +1159,7 @@
     "2028-11-10": "Veterans Day (observed)",
     "2028-11-11": "Veterans Day",
     "2028-11-23": "Thanksgiving",
+    "2028-11-24": "Day After Thanksgiving",
     "2028-12-22": "Christmas Eve (observed)",
     "2028-12-24": "Christmas Eve",
     "2028-12-25": "Christmas Day",
@@ -1161,6 +1178,7 @@
     "2029-11-11": "Veterans Day",
     "2029-11-12": "Veterans Day (observed)",
     "2029-11-22": "Thanksgiving",
+    "2029-11-23": "Day After Thanksgiving",
     "2029-12-24": "Christmas Eve",
     "2029-12-25": "Christmas Day",
     "2029-12-31": "New Year's Eve",
@@ -1175,8 +1193,10 @@
     "2030-07-04": "Independence Day",
     "2030-09-02": "Labor Day",
     "2030-10-31": "Halloween",
+    "2030-11-05": "Election Day",
     "2030-11-11": "Veterans Day",
     "2030-11-28": "Thanksgiving",
+    "2030-11-29": "Day After Thanksgiving",
     "2030-12-24": "Christmas Eve",
     "2030-12-25": "Christmas Day",
     "2030-12-31": "New Year's Eve",
@@ -1193,6 +1213,7 @@
     "2031-10-31": "Halloween",
     "2031-11-11": "Veterans Day",
     "2031-11-27": "Thanksgiving",
+    "2031-11-28": "Day After Thanksgiving",
     "2031-12-24": "Christmas Eve",
     "2031-12-25": "Christmas Day",
     "2031-12-31": "New Year's Eve",
@@ -1212,6 +1233,7 @@
     "2032-11-02": "Election Day",
     "2032-11-11": "Veterans Day",
     "2032-11-25": "Thanksgiving",
+    "2032-11-26": "Day After Thanksgiving",
     "2032-12-23": "Christmas Eve (observed)",
     "2032-12-24": "Christmas Day (observed); Christmas Eve",
     "2032-12-25": "Christmas Day",
@@ -1230,6 +1252,7 @@
     "2033-10-31": "Halloween",
     "2033-11-11": "Veterans Day",
     "2033-11-24": "Thanksgiving",
+    "2033-11-25": "Day After Thanksgiving",
     "2033-12-23": "Christmas Eve (observed)",
     "2033-12-24": "Christmas Eve",
     "2033-12-25": "Christmas Day",
@@ -1248,9 +1271,11 @@
     "2034-07-04": "Independence Day",
     "2034-09-04": "Labor Day",
     "2034-10-31": "Halloween",
+    "2034-11-07": "Election Day",
     "2034-11-10": "Veterans Day (observed)",
     "2034-11-11": "Veterans Day",
     "2034-11-23": "Thanksgiving",
+    "2034-11-24": "Day After Thanksgiving",
     "2034-12-22": "Christmas Eve (observed)",
     "2034-12-24": "Christmas Eve",
     "2034-12-25": "Christmas Day",
@@ -1269,6 +1294,7 @@
     "2035-11-11": "Veterans Day",
     "2035-11-12": "Veterans Day (observed)",
     "2035-11-22": "Thanksgiving",
+    "2035-11-23": "Day After Thanksgiving",
     "2035-12-24": "Christmas Eve",
     "2035-12-25": "Christmas Day",
     "2035-12-31": "New Year's Eve",
@@ -1286,6 +1312,7 @@
     "2036-11-04": "Election Day",
     "2036-11-11": "Veterans Day",
     "2036-11-27": "Thanksgiving",
+    "2036-11-28": "Day After Thanksgiving",
     "2036-12-24": "Christmas Eve",
     "2036-12-25": "Christmas Day",
     "2036-12-31": "New Year's Eve",
@@ -1303,6 +1330,7 @@
     "2037-10-31": "Halloween",
     "2037-11-11": "Veterans Day",
     "2037-11-26": "Thanksgiving",
+    "2037-11-27": "Day After Thanksgiving",
     "2037-12-24": "Christmas Eve",
     "2037-12-25": "Christmas Day",
     "2037-12-31": "New Year's Eve",
@@ -1319,8 +1347,10 @@
     "2038-07-05": "Independence Day (observed)",
     "2038-09-06": "Labor Day",
     "2038-10-31": "Halloween",
+    "2038-11-02": "Election Day",
     "2038-11-11": "Veterans Day",
     "2038-11-25": "Thanksgiving",
+    "2038-11-26": "Day After Thanksgiving",
     "2038-12-23": "Christmas Eve (observed)",
     "2038-12-24": "Christmas Day (observed); Christmas Eve",
     "2038-12-25": "Christmas Day",
@@ -1339,6 +1369,7 @@
     "2039-10-31": "Halloween",
     "2039-11-11": "Veterans Day",
     "2039-11-24": "Thanksgiving",
+    "2039-11-25": "Day After Thanksgiving",
     "2039-12-23": "Christmas Eve (observed)",
     "2039-12-24": "Christmas Eve",
     "2039-12-25": "Christmas Day",
@@ -1361,6 +1392,7 @@
     "2040-11-11": "Veterans Day",
     "2040-11-12": "Veterans Day (observed)",
     "2040-11-22": "Thanksgiving",
+    "2040-11-23": "Day After Thanksgiving",
     "2040-12-24": "Christmas Eve",
     "2040-12-25": "Christmas Day",
     "2040-12-31": "New Year's Eve",
@@ -1377,6 +1409,7 @@
     "2041-10-31": "Halloween",
     "2041-11-11": "Veterans Day",
     "2041-11-28": "Thanksgiving",
+    "2041-11-29": "Day After Thanksgiving",
     "2041-12-24": "Christmas Eve",
     "2041-12-25": "Christmas Day",
     "2041-12-31": "New Year's Eve",
@@ -1391,8 +1424,10 @@
     "2042-07-04": "Independence Day",
     "2042-09-01": "Labor Day",
     "2042-10-31": "Halloween",
+    "2042-11-04": "Election Day",
     "2042-11-11": "Veterans Day",
     "2042-11-27": "Thanksgiving",
+    "2042-11-28": "Day After Thanksgiving",
     "2042-12-24": "Christmas Eve",
     "2042-12-25": "Christmas Day",
     "2042-12-31": "New Year's Eve",
@@ -1410,6 +1445,7 @@
     "2043-10-31": "Halloween",
     "2043-11-11": "Veterans Day",
     "2043-11-26": "Thanksgiving",
+    "2043-11-27": "Day After Thanksgiving",
     "2043-12-24": "Christmas Eve",
     "2043-12-25": "Christmas Day",
     "2043-12-31": "New Year's Eve",
@@ -1428,6 +1464,7 @@
     "2044-11-08": "Election Day",
     "2044-11-11": "Veterans Day",
     "2044-11-24": "Thanksgiving",
+    "2044-11-25": "Day After Thanksgiving",
     "2044-12-23": "Christmas Eve (observed)",
     "2044-12-24": "Christmas Eve",
     "2044-12-25": "Christmas Day",
@@ -1449,6 +1486,7 @@
     "2045-11-10": "Veterans Day (observed)",
     "2045-11-11": "Veterans Day",
     "2045-11-23": "Thanksgiving",
+    "2045-11-24": "Day After Thanksgiving",
     "2045-12-22": "Christmas Eve (observed)",
     "2045-12-24": "Christmas Eve",
     "2045-12-25": "Christmas Day",
@@ -1464,9 +1502,11 @@
     "2046-07-04": "Independence Day",
     "2046-09-03": "Labor Day",
     "2046-10-31": "Halloween",
+    "2046-11-06": "Election Day",
     "2046-11-11": "Veterans Day",
     "2046-11-12": "Veterans Day (observed)",
     "2046-11-22": "Thanksgiving",
+    "2046-11-23": "Day After Thanksgiving",
     "2046-12-24": "Christmas Eve",
     "2046-12-25": "Christmas Day",
     "2046-12-31": "New Year's Eve",
@@ -1483,6 +1523,7 @@
     "2047-10-31": "Halloween",
     "2047-11-11": "Veterans Day",
     "2047-11-28": "Thanksgiving",
+    "2047-11-29": "Day After Thanksgiving",
     "2047-12-24": "Christmas Eve",
     "2047-12-25": "Christmas Day",
     "2047-12-31": "New Year's Eve",
@@ -1501,6 +1542,7 @@
     "2048-11-03": "Election Day",
     "2048-11-11": "Veterans Day",
     "2048-11-26": "Thanksgiving",
+    "2048-11-27": "Day After Thanksgiving",
     "2048-12-24": "Christmas Eve",
     "2048-12-25": "Christmas Day",
     "2048-12-31": "New Year's Eve",
@@ -1519,6 +1561,7 @@
     "2049-10-31": "Halloween",
     "2049-11-11": "Veterans Day",
     "2049-11-25": "Thanksgiving",
+    "2049-11-26": "Day After Thanksgiving",
     "2049-12-23": "Christmas Eve (observed)",
     "2049-12-24": "Christmas Day (observed); Christmas Eve",
     "2049-12-25": "Christmas Day",
@@ -1535,8 +1578,10 @@
     "2050-07-04": "Independence Day",
     "2050-09-05": "Labor Day",
     "2050-10-31": "Halloween",
+    "2050-11-08": "Election Day",
     "2050-11-11": "Veterans Day",
     "2050-11-24": "Thanksgiving",
+    "2050-11-25": "Day After Thanksgiving",
     "2050-12-23": "Christmas Eve (observed)",
     "2050-12-24": "Christmas Eve",
     "2050-12-25": "Christmas Day",


Test patch:
diff --git a/tests/countries/test_united_states.py b/tests/countries/test_united_states.py
index e2fe7b75..6c38473d 100644
--- a/tests/countries/test_united_states.py
+++ b/tests/countries/test_united_states.py
@@ -1655,7 +1655,7 @@ class TestUnitedStates(CommonCountryTests, TestCase):
             "2020-11-03",
             "2022-11-08",
         )
-        for subdiv in ("DE", "HI", "IL", "LA", "MP", "MT", "NH", "NJ", "WV"):
+        for subdiv in ("DE", "HI", "IL", "LA", "MI", "MP", "MT", "NH", "NJ", "WV"):
             self.assertHolidayName(name, self.state_hols[subdiv], dt)
             self.assertNoHolidayName(
                 name, self.state_hols[subdiv], range(1865, 2008), range(2009, 2050, 2)
@@ -1806,13 +1806,6 @@ class TestUnitedStates(CommonCountryTests, TestCase):
 
     def test_day_after_thanksgiving(self):
         dt = (
-            "2010-11-26",
-            "2011-11-25",
-            "2012-11-23",
-            "2013-11-29",
-            "2014-11-28",
-            "2015-11-27",
-            "2016-11-25",
             "2017-11-24",
             "2018-11-23",
             "2019-11-29",
@@ -1820,6 +1813,7 @@ class TestUnitedStates(CommonCountryTests, TestCase):
             "2021-11-26",
             "2022-11-25",
             "2023-11-24",
+            "2024-11-29",
         )
         for subdiv, name, start_year in (
             ("CA", "Day After Thanksgiving", 1975),
@@ -1827,6 +1821,7 @@ class TestUnitedStates(CommonCountryTests, TestCase):
             ("FL", "Friday After Thanksgiving", 1975),
             ("IN", "Lincoln's Birthday", 2010),
             ("MD", "American Indian Heritage Day", 2008),
+            ("MI", "Day After Thanksgiving", 2017),
             ("NC", "Day After Thanksgiving", 1975),
             ("NH", "Day After Thanksgiving", 1975),
             ("NM", "Presidents' Day", None),