Python utility library for generating and manipulating ICS calendar files
Project description
📅 ICS Calendar Utils
A Python library for processing events and generating ICS calendar files from various data sources.
✨ Features
- Event Processing: Normalize events from any source with customizable field mappings
- Date/Time Parsing: Handles various date and time formats
- Event Validation: Data quality validation before calendar generation
- Statistics & Analytics: Event data insights and reporting
- Error Handling: Detailed error reporting for invalid data
- ICS Generation: RFC 5545 compliant ICS calendar files
- Modern Python: Built with Python 3.11+ type hints
� Installation
pip install ics-calendar-utils
🚀 Usage
Basic Usage
from ics_calendar_utils import create_calendar
# Your event data from any source
events = [
{
'title': 'Team Meeting',
'date': '2024-12-20',
'time': '14:00',
'location': 'Conference Room A',
'description': 'Weekly team sync'
},
{
'title': 'Project Deadline',
'date': 'Dec 25, 2024',
'location': 'Online'
}
]
# Simple field mapping
field_mapping = {
'title': 'summary',
'date': 'dtstart_date',
'time': 'dtstart_time'
}
# Generate ICS calendar
ics_content = create_calendar(
events,
calendar_name="My Calendar",
filename="my_events.ics",
field_mapping=field_mapping
)
print("Calendar generated successfully!")
⚙️ Configuration
Advanced Usage
For more control over processing and detailed results:
from ics_calendar_utils import process_and_generate
# Events with custom field names
events = [
{
'event_name': 'Rugby Match: England vs Wales',
'event_date': '2024-12-21',
'kickoff_time': '15:00',
'venue': 'Twickenham Stadium',
'competition': 'Six Nations',
'ticket_url': 'https://example.com/tickets'
}
]
# Custom field mapping
field_mapping = {
'event_name': 'summary',
'event_date': 'dtstart_date',
'kickoff_time': 'dtstart_time',
'venue': 'location',
'competition': 'categories',
'ticket_url': 'url'
}
# Process with detailed results
result = process_and_generate(
events,
calendar_name="Rugby Fixtures",
output_file="rugby_calendar.ics",
field_mapping=field_mapping,
validate=True
)
# Access detailed information
print(f"Processed {result['stats']['total_events']} events")
print(f"Events with times: {result['stats']['events_with_time']}")
print(f"Date range: {result['stats']['date_range']['earliest']} to {result['stats']['date_range']['latest']}")
if result['processing_errors']:
print("Processing errors:", result['processing_errors'])
Low-Level API
For maximum control:
from ics_calendar_utils import EventProcessor, ICSGenerator
# Initialize components
processor = EventProcessor()
processor.add_mapping({
'event_title': 'summary',
'start_date': 'dtstart_date'
})
generator = ICSGenerator(calendar_name="Custom Calendar")
# Process events
processed_events = processor.process_events(raw_events)
# Validate before generation
validation_errors = generator.validate_events(processed_events)
if validation_errors:
print("Validation issues:", validation_errors)
# Generate ICS
ics_content = generator.generate_ics(processed_events)
🎯 Supported Date/Time Formats
The library parses various date and time formats:
Date Formats
- ISO format:
2024-12-20 - US format:
Dec 20, 2024orDecember 20, 2024 - European format:
20/12/2024or20 December 2024 - Various separators: dots, slashes, spaces, hyphens
Time Formats
- 24-hour:
14:30,09:00 - 12-hour:
2:30pm,9am,noon - Multiple times:
14:30 & 16:45 - Flexible separators and spacing
🧪 Error Handling
The library provides error handling:
result = process_and_generate(events, validate=True)
# Check for issues
if result['processing_errors']:
print("Data processing issues:")
for error in result['processing_errors']:
print(f" - {error}")
if result['validation_errors']:
print("Validation issues:")
for error in result['validation_errors']:
print(f" - {error}")
🛠️ Development
Setup
# Clone the repository
git clone https://github.com/ronschaeffer/ics-calendar-utils.git
cd ics-calendar-utils
# Install with Poetry (recommended)
poetry install
# Or install in development mode
pip install -e .
Running Tests
# Run all tests
poetry run pytest
# Run with coverage
poetry run pytest --cov=ics_calendar_utils
# Run specific test
poetry run pytest tests/test_event_processor.py
Code Quality
# Format code
poetry run ruff format
# Lint code
poetry run ruff check
# Fix auto-fixable issues
poetry run ruff check --fix
📋 Examples
Check out the examples/ directory for working examples:
- Basic Usage: Simple calendar generation
- Processing Examples: Custom field mapping and error handling
- Rugby Fixtures: Sports calendar example
🧪 Testing
# Run all tests
poetry run pytest
# Run with coverage
poetry run pytest --cov=ics_calendar_utils
# Run specific test
poetry run pytest tests/test_event_processor.py
Code Quality
# Format code
poetry run ruff format
# Lint code
poetry run ruff check
# Fix auto-fixable issues
poetry run ruff check --fix
🤝 Contributing
Contributions are welcome! Please open an issue to discuss proposed changes or submit a pull request.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
📞 Support
For questions, issues, or contributions, please open an issue on GitHub.
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 ronschaeffer_ics_calendar_utils-0.2.1.tar.gz.
File metadata
- Download URL: ronschaeffer_ics_calendar_utils-0.2.1.tar.gz
- Upload date:
- Size: 12.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0e59fe8f7307c81e9c140d31069907c6a428de0167fd1ca7828c0d805ae8dcf
|
|
| MD5 |
68c35d7c3095f2221fdc3029700c7381
|
|
| BLAKE2b-256 |
f17c17bd66f87bf6b80dec15bb3006d9cd91666ca812716b2016ce555e6c6e98
|
Provenance
The following attestation bundles were made for ronschaeffer_ics_calendar_utils-0.2.1.tar.gz:
Publisher:
release.yml on ronschaeffer/ics_calendar_utils
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ronschaeffer_ics_calendar_utils-0.2.1.tar.gz -
Subject digest:
f0e59fe8f7307c81e9c140d31069907c6a428de0167fd1ca7828c0d805ae8dcf - Sigstore transparency entry: 362976024
- Sigstore integration time:
-
Permalink:
ronschaeffer/ics_calendar_utils@d594feac0bdde34a728547b5a8acc51d5cf3d35b -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/ronschaeffer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d594feac0bdde34a728547b5a8acc51d5cf3d35b -
Trigger Event:
push
-
Statement type:
File details
Details for the file ronschaeffer_ics_calendar_utils-0.2.1-py3-none-any.whl.
File metadata
- Download URL: ronschaeffer_ics_calendar_utils-0.2.1-py3-none-any.whl
- Upload date:
- Size: 11.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03df6bb2955f150f216360755507c87730b0b7f8a4172a91111aa562b41975f1
|
|
| MD5 |
e9b4aa5e824a0b1b907daae47c08a22d
|
|
| BLAKE2b-256 |
00f7652fe2ae539929e568c771044db6883989226ba3f3b52f445b4552bc0b85
|
Provenance
The following attestation bundles were made for ronschaeffer_ics_calendar_utils-0.2.1-py3-none-any.whl:
Publisher:
release.yml on ronschaeffer/ics_calendar_utils
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ronschaeffer_ics_calendar_utils-0.2.1-py3-none-any.whl -
Subject digest:
03df6bb2955f150f216360755507c87730b0b7f8a4172a91111aa562b41975f1 - Sigstore transparency entry: 362976030
- Sigstore integration time:
-
Permalink:
ronschaeffer/ics_calendar_utils@d594feac0bdde34a728547b5a8acc51d5cf3d35b -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/ronschaeffer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d594feac0bdde34a728547b5a8acc51d5cf3d35b -
Trigger Event:
push
-
Statement type: