Checking the date for belonging to a non-working day, according to official decrees and orders.
Project description
🗓️ isdayoff-api
Production Calendar API Client
🐍 Async + Sync Python client for isdayoff.ru – production calendar data for 7 countries.
Check if a date is a working day, a day off, or a shortened day according to official government decrees.
This is a fork of the original kobylinsky-m/isdayoff.
📦 Installation
pip install isdayoff-api
Requires Python 3.11+.
🚀 Quick Start
Async (recommended)
import asyncio
from isdayoff import DateType, ProdCalendar
async def main():
async with ProdCalendar(locale="us") as calendar:
if await calendar.today() == DateType.WORKING:
print("Today is a working day ✅")
else:
print("Today is a day off 🎉")
asyncio.run(main())
Sync
from isdayoff import DateType, SyncProdCalendar
with SyncProdCalendar(locale="us") as calendar:
if calendar.today() == DateType.WORKING:
print("Today is a working day ✅")
else:
print("Today is a day off 🎉")
🌍 Supported Locales
| Code | Country |
|---|---|
ru |
Russia |
kz |
Kazakhstan |
by |
Belarus |
us |
United States |
uz |
Uzbekistan |
tr |
Turkey |
lv |
Latvia |
📖 API Reference
All methods are available on both ProdCalendar (async) and SyncProdCalendar (sync).
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
locale |
str |
"ru" |
Country code |
pre |
bool |
False |
Mark shortened pre‑holiday days |
covid |
bool |
False |
Mark working days due to COVID‑19 |
sd |
bool |
False |
Consider 6‑day work week |
Methods
# ── Async ──
await calendar.today(locale="ru", pre=True, covid=True, sd=True)
await calendar.tomorrow()
await calendar.date(date(2024, 8, 25))
await calendar.month(date(2024, 8, 1))
await calendar.year(date(2024, 1, 1))
await calendar.range_date(date(2024, 1, 1), date(2024, 5, 1))
calendar.is_leap(date(2024, 1, 1))
# ── Sync ──
calendar.today(locale="ru", pre=True, covid=True, sd=True)
calendar.tomorrow()
calendar.date(date(2024, 8, 25))
calendar.month(date(2024, 8, 1))
calendar.year(date(2024, 1, 1))
calendar.range_date(date(2024, 1, 1), date(2024, 5, 1))
calendar.is_leap(date(2024, 1, 1))
Return Types
| Method | Returns |
|---|---|
today() / tomorrow() / date() |
DateType (enum) |
month() / year() / range_date() |
dict[str, DateType] — ISO date → type |
is_leap() |
bool |
DateType Enum
| Value | Meaning |
|---|---|
DateType.WORKING (0) |
Working day |
DateType.NOT_WORKING (1) |
Day off / holiday |
DateType.SHORTENED (2) |
Shortened pre‑holiday day |
DateType.WORKING_DAY (4) |
Working day (special period, e.g. COVID) |
📋 Full Example
import asyncio
from datetime import date
from isdayoff import DateType, ProdCalendar
async def main():
async with ProdCalendar(locale="us") as calendar:
month_data = await calendar.month(date(2024, 8, 1), locale="ru")
days_off = sum(1 for v in month_data.values() if v == DateType.NOT_WORKING)
print(f"Days off in August 2024 (RU): {days_off}")
asyncio.run(main())
🛠 Development
# Install dependencies
uv sync
# Run unit tests (mocked, no API calls)
uv run pytest
# Run integration tests (real API calls)
uv run pytest -m integration
# Build package
uv build
Test Suite
| Type | Count | Command |
|---|---|---|
| 🔬 Unit | 40 | uv run pytest |
| 🌐 Integration | 8 | uv run pytest -m integration |
🔗 Links
- Original project: kobylinsky-m/isdayoff
- API documentation: isdayoff.ru/docs
- Database of countries: isdayoff.ru/db
- PyPI: isdayoff-api
📄 License
© 2021 Maxim Kobylinsky (original author) · © 2026 Aleksandr Bevz
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file isdayoff_api-1.0.1.tar.gz.
File metadata
- Download URL: isdayoff_api-1.0.1.tar.gz
- Upload date:
- Size: 8.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
693c40d231efd5b179b5b879afa0d75bef9bb552fd03eb0ac17c74f1f47d2331
|
|
| MD5 |
cb2510b0ff56bd79b5bcbd7713263056
|
|
| BLAKE2b-256 |
ddb9a5be9aca67bcb9b366ca1f20a52b1e94f80165d8675fcc8c8f277798c718
|
File details
Details for the file isdayoff_api-1.0.1-py3-none-any.whl.
File metadata
- Download URL: isdayoff_api-1.0.1-py3-none-any.whl
- Upload date:
- Size: 6.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
997ba4a2f18f8700c38511298ae7ecc301a6213ee43040df5b324118b8614f49
|
|
| MD5 |
9eb5092471bc68cf3b20c6bb1eb481dc
|
|
| BLAKE2b-256 |
dcc19e57a1ac37d5cb69b2d1962f252e8caae6a9ddc8977f05c20b9d3bf19ff6
|