Skip to content

Conversation

@KJhellico
Copy link
Collaborator

@KJhellico KJhellico commented Apr 22, 2025

Proposed change

Extend Chinese Lunisolar calendar support:

  • add regional calendar variations (due to time zones differences):
    • CHINESE_CALENDAR - UTC+8 timezone (default variant, applicable for China, Hong Kong, Taiwan, Macau, Malaysia, Singapore, Philippines, Indonesia, Brunei)
    • KOREAN_CALENDAR - UTC+9 timezone (applicable for South Korea)
    • VIETNAMESE_CALENDAR - UTC+7 timezone (applicable for Vietnam)
  • extend dates support up to year 2100

Type of change

  • 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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Apr 22, 2025

Warning

Rate limit exceeded

@KJhellico has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 14 minutes and 26 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 132cace and f172d50.

📒 Files selected for processing (1)
  • holidays/calendars/chinese.py (9 hunks)

Summary by CodeRabbit

  • New Features

    • Added support for Chinese, Korean, and Vietnamese lunisolar calendar variants, allowing selection of calendar type for relevant holidays.
    • Extended holiday date data for Buddhist, Hindu, and lunisolar holidays through the year 2100.
  • Bug Fixes

    • Corrected holiday dates for Buddhist, Hindu, Chinese, Korean, and Vietnamese calendars to improve historical and future accuracy.
    • Updated Vietnamese holiday snapshot data and related test to reflect accurate holiday dates.
  • Tests

    • Added a test to verify error handling for invalid lunisolar calendar input.

Summary by CodeRabbit

  • New Features
    • Added support for Korean and Vietnamese lunisolar calendars, allowing calendar-specific holiday date retrieval for select holidays.
  • Bug Fixes
    • Corrected and updated holiday dates for Buddhist, Hindu, Chinese, Korean, and Vietnamese calendars, including historical and future years.
    • Fixed and aligned Vietnamese holiday dates in the data snapshots for greater accuracy.
  • Chores
    • Extended lunisolar calendar coverage through the year 2100 and updated related data.
  • Tests
    • Added and updated tests to ensure correct calendar validation and holiday date accuracy.

Walkthrough

This update introduces multi-calendar support for lunisolar holidays, specifically adding Korean and Vietnamese calendar handling alongside the existing Chinese implementation. Holiday date dictionaries are extended or corrected for accuracy, including new entries for the year 2100 across Buddhist, Hindu, and lunisolar calendars. South Korea and Vietnam country modules are refactored to leverage the new calendar selection mechanism, removing legacy hardcoded classes. The lunar calendar generator script and Vietnamese holiday snapshots are updated for expanded year coverage and corrected dates. New unit tests are added to validate calendar selection logic and holiday calculation accuracy.

Changes

Files/Paths Change Summary
holidays/calendars/chinese.py Added multi-calendar support (Chinese, Korean, Vietnamese) to the lunisolar calendar class; updated holiday date retrieval to be calendar-aware; extended holiday date dictionaries through 2100; added validation for calendar selection; modified public methods to accept a calendar argument.
holidays/calendars/buddhist.py
holidays/calendars/hindu.py
Updated static holiday date dictionaries: corrected specific dates and added entries for 2100 (Buddhist Vesak, Hindu Diwali, Maha Shivaratri). No logic changes.
holidays/groups/chinese.py Modified constructor of ChineseCalendarHolidays to accept a calendar argument; updated internal initialization for calendar selection.
holidays/countries/south_korea.py Refactored to use calendar-based lunisolar holidays; removed hardcoded SouthKoreaLunisolarHolidays class; updated imports and constructor logic.
holidays/countries/vietnam.py Updated to use calendar-based lunisolar holidays; changed import and constructor to use VIETNAMESE_CALENDAR.
scripts/calendar/asian_generator.py Corrected lunar month days data; extended lunar calendar coverage to 2100; updated comments and year range in data generation.
snapshots/countries/VN_COMMON.json Corrected Vietnamese holiday dates and observed days for accuracy across multiple years; no new holidays added or removed.
tests/calendars/test_chinese.py Added unit test to verify calendar validation logic in _ChineseLunisolar.
tests/countries/test_vietnam.py Corrected test date for Hung Kings' Commemoration Day in 2009.

Suggested labels

l10n

Suggested reviewers

  • PPsyrius

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • 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 for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in 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 for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@codecov
Copy link

codecov bot commented Apr 22, 2025

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 100.00%. Comparing base (ad51a04) to head (f172d50).
Report is 3 commits behind head on dev.

Additional details and impacted files
@@            Coverage Diff            @@
##               dev     #2488   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          214       214           
  Lines        13527     13543   +16     
  Branches      1928      1929    +1     
=========================================
+ Hits         13527     13543   +16     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🔭 Outside diff range comments (1)
holidays/countries/south_korea.py (1)

89-96: 🧹 Nitpick (assertive)

Calendar variant injected correctly; minor future‑proofing tip.
Works with the new constructor. If show_estimated ever matters for Korea, expose it via kwargs.setdefault to avoid another touch‑up.

- ChineseCalendarHolidays.__init__(self, calendar=KOREAN_CALENDAR)
+ ChineseCalendarHolidays.__init__(
+     self,
+     calendar=KOREAN_CALENDAR,
+     # show_estimated can be toggled in one place later
+ )
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ad51a04 and ecb9d84.

📒 Files selected for processing (12)
  • holidays/calendars/buddhist.py (4 hunks)
  • holidays/calendars/chinese.py (9 hunks)
  • holidays/calendars/hindu.py (3 hunks)
  • holidays/countries/indonesia.py (2 hunks)
  • holidays/countries/south_korea.py (2 hunks)
  • holidays/countries/vietnam.py (2 hunks)
  • holidays/groups/chinese.py (2 hunks)
  • scripts/calendar/asian_generator.py (8 hunks)
  • snapshots/countries/ID_COMMON.json (1 hunks)
  • snapshots/countries/VN_COMMON.json (8 hunks)
  • tests/calendars/test_chinese.py (1 hunks)
  • tests/countries/test_vietnam.py (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (4)
holidays/countries/indonesia.py (1)
holidays/groups/chinese.py (1)
  • ChineseCalendarHolidays (21-266)
holidays/groups/chinese.py (1)
holidays/calendars/chinese.py (1)
  • _ChineseLunisolar (31-1349)
holidays/countries/south_korea.py (1)
holidays/groups/chinese.py (1)
  • ChineseCalendarHolidays (21-266)
holidays/calendars/chinese.py (4)
holidays/calendars/buddhist.py (1)
  • _get_holiday (430-434)
holidays/calendars/hindu.py (1)
  • _get_holiday (1227-1231)
holidays/calendars/islamic.py (1)
  • _get_holiday (3801-3806)
holidays/holiday_base.py (1)
  • get (967-990)
🔇 Additional comments (37)
scripts/calendar/asian_generator.py (10)

43-44: Correctly updated lunar month data for precise date calculations.

The hexadecimal value correction in G_LUNAR_MONTH_DAYS array ensures accurate lunar date calculations, which is essential for determining holidays in the Chinese lunisolar calendar.


57-59: Verified lunar data corrections around 1920.

These hex value corrections align with historical lunar calendar data, improving accuracy for this period.


63-63: Corrected critical lunar data for 1920.

The hex value update ensures correct lunar month length calculations for this year.


132-132: Fixed lunar month data for 1990.

This correction ensures accurate lunar-to-gregorian date conversions for holidays in this time period.


168-168: Corrected lunar data for 2020s period.

The updated hex value improves accuracy for modern holiday date calculations.


232-232: Fixed lunar data for 2090.

This correction is important for far-future holiday date calculations.


242-243: Corrected lunar data for year 2100.

These hex value updates complete the accurate representation of the lunisolar calendar through 2100.


247-253: Extended calendar end year and adjusted date boundaries.

The extension from 2099 to 2100 with corresponding end date adjustments aligns with the PR objective to extend date support up to year 2100.


359-362: Added time zone documentation for regional calendar variants.

This documentation clearly maps the UTC offsets for different regions, providing context for the three variants (Vietnamese, Chinese, Korean) mentioned in the PR objectives.


390-390: Extended date processing range to match new boundary.

The update to process years through 2100 ensures complete coverage for the extended date range.

holidays/calendars/buddhist.py (3)

149-149: Fixed Vesak holiday date for 2025.

Updating from May 11 to May 12 reflects the corrected lunisolar calendar calculations.


224-224: Added Vesak holiday support for year 2100.

This addition properly extends Buddhist calendar holiday support to match the extended calendar range in the generator.


427-427: Added Vesak May date for year 2100.

This addition correctly extends the alternative Vesak calculation used by some countries through 2100.

snapshots/countries/ID_COMMON.json (1)

1200-1200: Corrected Lunar New Year date for 2030 in Indonesia.

The date change from February 3rd to February 2nd aligns with using the Vietnamese calendar variant (UTC+7) for Indonesia, as specified in the PR objectives.

tests/countries/test_vietnam.py (1)

72-72: Corrected Hung Kings' Day date for 2009.

The date change from April 5th to April 4th ensures the test aligns with the Vietnamese calendar variant calculations, maintaining test consistency with the implementation changes.

tests/calendars/test_chinese.py (1)

13-20: Well-structured test for calendar validation.

This test effectively verifies that the _ChineseLunisolar class properly rejects invalid calendar types by raising a ValueError. This supports the multi-calendar enhancement that adds regional calendar variants (Chinese, Korean, Vietnamese).

holidays/countries/indonesia.py (2)

20-20: Appropriate import for the Vietnam calendar constant.

Adding the import of VIETNAM_CALENDAR from the Chinese calendars module supports the use of the correct regional calendar variant.


76-78: Correct calendar specification for Indonesia.

Using the VIETNAM_CALENDAR parameter is appropriate since Indonesia shares the UTC+7 timezone with Vietnam, as mentioned in the PR objectives. This ensures that Chinese lunar calendar holidays in Indonesia will use the correct regional variant.

holidays/calendars/hindu.py (4)

138-138: Date correction for historical accuracy.

The change corrects the Diwali date for 1914, aligning with the PR's focus on improving calendar accuracy.


144-144: Date correction for historical accuracy.

The change corrects the Diwali date for 1920, contributing to better historical precision.


324-324: Extended date support through 2100.

Adding the Diwali date for 2100 meets the PR objective to extend calendar date support.


1185-1185: Extended date support through 2100.

Adding the Thaipusam date for 2100 completes the calendar extension and ensures consistency across all holiday types.

snapshots/countries/VN_COMMON.json (9)

123-126: Calendar date correction for Vietnamese lunar calendar.

These date adjustments for Lunar New Year 1965 align with the Vietnamese calendar variant (UTC+7), ensuring accurate holiday calculations specific to Vietnam.


147-150: Calendar date correction for Vietnamese lunar calendar.

These adjustments for Lunar New Year 1968 ensure consistency with the Vietnamese calendar calculations.


155-158: Calendar date correction for Vietnamese lunar calendar.

These adjustments for Lunar New Year 1969 ensure consistency with the Vietnamese calendar calculations.


283-286: Calendar date correction for Vietnamese lunar calendar.

These adjustments for Lunar New Year 1985 ensure consistency with the Vietnamese calendar calculations.


484-489: Calendar date correction for Vietnamese lunar calendar.

These adjustments for Lunar New Year 2007 ensure consistency with the Vietnamese calendar calculations.


511-511: Correction to Hung Kings' Commemoration Day.

This adjustment from April 5 to April 4 for 2009 aligns with the PR's objective to fix calendar discrepancies for Vietnam holidays.


791-797: Calendar date correction for Vietnamese lunar calendar.

These adjustments for Lunar New Year 2030 ensure consistency with the Vietnamese calendar calculations.


896-896: Calendar date correction for Vietnamese calendar.

The adjustment to Hung Kings' Commemoration Day in 2037 helps maintain calendar accuracy for future dates.


909-909: Calendar date correction for Vietnamese calendar.

The adjustment to Hung Kings' Commemoration Day in 2038 helps maintain calendar accuracy for future dates.

holidays/countries/vietnam.py (2)

16-17: Looks good – dedicated calendar constant keeps logic explicit.
The explicit VIETNAM_CALENDAR import clarifies intent and avoids implicit defaults.


62-68: Constructor wiring aligns correctly with new calendar API.
Calling ChineseCalendarHolidays.__init__(self, calendar=VIETNAM_CALENDAR) hits the updated signature and preserves previous behaviour. No hidden side‑effects spotted.

holidays/groups/chinese.py (1)

16-17: Selective import keeps public surface tidy.
Pulling only _ChineseLunisolar and CHINESE_CALENDAR avoids namespace bloat.

holidays/countries/south_korea.py (1)

17-18: Import is minimal and purposeful.
Keeps module dependencies lean.

holidays/calendars/chinese.py (2)

1324-1331: Lookup order looks sound

exact → calendar‑override → default is intuitive; the verification guard prevents accidental fall‑through. Implementation matches the pattern used in other calendar modules.


1333-1349: Public helpers remain backward‑compatible

Passing calendar=None keeps the old call signature while enabling overrides—good call. No action needed.

Copy link
Collaborator

@PPsyrius PPsyrius left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Big improvements all around 🙏

I'm not really sure about Indonesia using GMT+7-based calculation though based on their historical observance in 2007.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (2)
holidays/calendars/chinese.py (2)

1318-1322: 🧹 Nitpick (assertive)

Reuse a single “supported” set to avoid drift

The error message repeats every constant manually. Building the set once (as suggested in the previous review) keeps the code DRY and prevents the typo above from happening again.


19-22: 🧹 Nitpick (assertive)

Consider upgrading the calendar identifiers to an Enum

Using an Enum[str] gives autocomplete & type‑safety for free while remaining backwards‑compatible.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ecb9d84 and 4e16011.

📒 Files selected for processing (3)
  • holidays/calendars/chinese.py (9 hunks)
  • holidays/countries/vietnam.py (2 hunks)
  • scripts/calendar/asian_generator.py (8 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
holidays/countries/vietnam.py (1)
holidays/groups/chinese.py (1)
  • ChineseCalendarHolidays (21-266)
🔇 Additional comments (4)
holidays/countries/vietnam.py (2)

16-17: 👍 Good catch on the constant rename

Importing VIETNAMESE_CALENDAR aligns Vietnam with the new multi‑calendar mechanism.
No further action needed here.


62-64: Side‑effect of the prefix mismatch

Because the override tables in chinese.py still start with VIETNAM_CALENDAR_…, the line below will currently not load the Vietnamese‑specific dates:

ChineseCalendarHolidays.__init__(self, calendar=VIETNAMESE_CALENDAR)

Once the tables are renamed (see earlier comment), this call will behave as intended.
Until then, Vietnam will use fallback dates. Keep an eye on the fix.

scripts/calendar/asian_generator.py (2)

359-362: Appreciate the explicit timezone comments

The quick legend (UTC+7/8/9) makes the data blocks far easier to grok.
Nice touch.


246-254:

✅ Verification successful

Array length vs. declared range

END_YEAR is bumped to 2100, and one more element was appended to G_LUNAR_MONTH_DAYS.
A quick sanity check that the list length equals END_YEAR - START_YEAR + 1 protects against off‑by‑one slips.

shell
#!/usr/bin/env bash

Ensure lunar data array length matches configured year span.

fd --extension py G_LUNAR_MONTH_DAYS -x
python - <<'PY'
import re, sys, pathlib, ast, textwrap
path = pathlib.Path("scripts/calendar/asian_generator.py")
source = path.read_text()
tree = ast.parse(source)
for node in ast.walk(tree):
if isinstance(node, ast.Assign) and any(
getattr(t, "id", None) == "G_LUNAR_MONTH_DAYS" for t in node.targets
):
count = len(node.value.elts)
start = next(n for n in ast.walk(tree)
if isinstance(n, ast.Assign) and n.targets[0].id == "START_YEAR").value.n
end = next(n for n in ast.walk(tree)
if isinstance(n, ast.Assign) and n.targets[0].id == "END_YEAR").value.n
print(f"entries={count}, span={end-start+1}")
sys.exit(0)
PY

Expected output: `entries=200, span=200`

---

🏁 Script executed:

```shell

Length of output: 139


🏁 Script executed:

#!/usr/bin/env bash
# Show the relevant lines around the assignments
sed -n '230,300p' scripts/calendar/asian_generator.py

# Count G_LUNAR_MONTH_DAYS entries and compare to END_YEAR - START_YEAR + 1
python3 - <<'PY'
import ast, pathlib
path = pathlib.Path('scripts/calendar/asian_generator.py')
src = path.read_text()
tree = ast.parse(src)

start = end = entries = None
for node in ast.walk(tree):
    if isinstance(node, ast.Assign):
        for t in node.targets:
            name = getattr(t, "id", None)
            if name == "START_YEAR":
                start = node.value.n if hasattr(node.value, "n") else node.value.value
            elif name == "END_YEAR":
                end = node.value.n if hasattr(node.value, "n") else node.value.value
            elif name == "G_LUNAR_MONTH_DAYS":
                entries = len(node.value.elts)

if None in (start, end, entries):
    print("Error: could not find START_YEAR, END_YEAR, or G_LUNAR_MONTH_DAYS")
else:
    span = end - start + 1
    print(f"entries={entries}, span={span}")
PY

Length of output: 2661


🏁 Script executed:

#!/usr/bin/env bash
# Locate where G_LUNAR_MONTH_DAYS is defined
grep -n "G_LUNAR_MONTH_DAYS" scripts/calendar/asian_generator.py

# Verify START_YEAR, END_YEAR, and count of G_LUNAR_MONTH_DAYS entries
python3 - <<'PY'
import ast, pathlib, sys
path = pathlib.Path('scripts/calendar/asian_generator.py')
src = path.read_text()
tree = ast.parse(src)

start = end = entries = None
for node in ast.walk(tree):
    if isinstance(node, ast.Assign):
        for t in node.targets:
            # module‐level tuple for lunar data
            if isinstance(t, ast.Name) and t.id == 'G_LUNAR_MONTH_DAYS':
                entries = len(node.value.elts)
            # instance attributes in __init__
            if isinstance(t, ast.Attribute) and t.attr == 'START_YEAR':
                if isinstance(node.value, ast.Constant):
                    start = node.value.value
            if isinstance(t, ast.Attribute) and t.attr == 'END_YEAR':
                if isinstance(node.value, ast.Constant):
                    end = node.value.value

if None in (start, end, entries):
    print(f"Error: could not find all values: start={start}, end={end}, entries={entries}")
    sys.exit(1)

span = end - start + 1
print(f"entries={entries}, span={span}")
PY

Length of output: 449


🏁 Script executed:

#!/usr/bin/env bash
# Verify that G_LUNAR_MONTH_DAYS entry count matches END_YEAR - START_YEAR + 1
python3 - <<'PY'
import ast, pathlib, sys

path = pathlib.Path('scripts/calendar/asian_generator.py')
src = path.read_text()
tree = ast.parse(src)

start = end = entries = None
for node in ast.walk(tree):
    if isinstance(node, ast.Assign):
        for t in node.targets:
            # capture the tuple literal on self.G_LUNAR_MONTH_DAYS
            if isinstance(t, ast.Attribute) and t.attr == 'G_LUNAR_MONTH_DAYS':
                if isinstance(node.value, ast.Tuple):
                    entries = len(node.value.elts)
            # capture START_YEAR and END_YEAR constants
            if isinstance(t, ast.Attribute) and t.attr == 'START_YEAR':
                start = node.value.value if isinstance(node.value, ast.Constant) else None
            if isinstance(t, ast.Attribute) and t.attr == 'END_YEAR':
                end = node.value.value if isinstance(node.value, ast.Constant) else None

if None in (start, end, entries):
    print(f"Error: could not find all values: start={start}, end={end}, entries={entries}")
    sys.exit(1)

span = end - start + 1
print(f"entries={entries}, span={span}")
PY

Length of output: 33


Sanity check passed: G_LUNAR_MONTH_DAYS length matches the year span
Verified entries=200, span=200—no off‑by‑one errors detected.

@sonarqubecloud
Copy link

Copy link
Collaborator

@PPsyrius PPsyrius left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 🌕

Copy link
Collaborator

@arkid15r arkid15r left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great extension!

@PPsyrius thanks for review, merging this.

@arkid15r arkid15r added this pull request to the merge queue Apr 23, 2025
Merged via the queue into vacanza:dev with commit 7f8e72a Apr 23, 2025
33 checks passed
@KJhellico KJhellico deleted the upd-chinese-calendar branch April 23, 2025 18:20
@arkid15r arkid15r mentioned this pull request May 5, 2025
@coderabbitai coderabbitai bot mentioned this pull request Jun 21, 2025
9 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants