<div align="center">
<picture>
<source type="image/webp" srcset="docs/assets/logo.webp">
<img src="docs/assets/logo.png" alt="ESO Logs Python" width="300">
</picture>
</div>
# ESO Logs Python Client
[](https://www.python.org/downloads/)
[](https://esologs-python.readthedocs.io/)
[](https://github.com/knowlen/esologs-python)
[](https://github.com/knowlen/esologs-python/actions/workflows/ci.yml)
A comprehensive Python client library for the [ESO Logs API v2](https://www.esologs.com/v2-api-docs/eso/). This library provides both synchronous and asynchronous interfaces to access Elder Scrolls Online combat logging data, with built-in support for data transformation and analysis.
## Project Status
| Metric | Status |
|--------|--------|
| **Current Version** | 0.2.0-alpha |
| **API Coverage** | ~83% (comprehensive analysis shows 6/8 API sections fully implemented) |
| **Development Stage** | Active development |
| **Documentation** | [Read the Docs](https://esologs-python.readthedocs.io/) |
| **Tests** | 278 tests across unit, integration, documentation, and sanity suites |
### Current API Coverage
**Implemented (6/8 sections):**
1. ✅ **gameData** - 13 methods
2. ✅ **characterData** - 5 methods
3. ✅ **reportData** - 9 methods
4. ✅ **worldData** - 4 methods
5. ✅ **rateLimitData** - 1 method
6. 🟡 **guildData** - 2 methods (PARTIAL - missing 4 advanced methods)
**Missing (2/8 sections):**
- ❌ **userData** - 0/3 methods (MISSING - requires user auth)
- ❌ **progressRaceData** - 0/1 method (MISSING - niche racing feature)
### Roadmap
- 🚧 Progress race tracking
- 🚧 User account integration
- 🚧 Client architecture refactor (modular design)
## Installation
```bash
# Install from PyPI (recommended)
pip install esologs-python
# For development or latest features
pip install git+https://github.com/knowlen/esologs-python.git@main
```
### Development Installation
```bash
# Clone for development
git clone https://github.com/knowlen/esologs-python.git
cd esologs-python
pip install -e ".[dev]"
```
## API Setup
1. **Create an ESO Logs API Client**
- Visit [ESO Logs API Clients](https://www.esologs.com/api/clients/)
- Create a new v2 client application
- Note your Client ID and Client Secret
2. **Set Environment Variables**
```bash
export ESOLOGS_ID="your_client_id_here"
export ESOLOGS_SECRET="your_client_secret_here"
```
3. **Alternative: Use .env file**
```bash
# Create .env file in your project root
echo "ESOLOGS_ID=your_client_id_here" >> .env
echo "ESOLOGS_SECRET=your_client_secret_here" >> .env
```
## Quickstart
For comprehensive documentation, visit [esologs-python.readthedocs.io](https://esologs-python.readthedocs.io/)
### Basic Usage
```python
import asyncio
from esologs.client import Client
from esologs.auth import get_access_token
async def main():
# Get authentication token
token = get_access_token()
# Create client
async with Client(
url="https://www.esologs.com/api/v2/client",
headers={"Authorization": f"Bearer {token}"}
) as client:
# Get character information
character = await client.get_character_by_id(id=12345)
print(f"Character: {character.character_data.character.name}") # noqa: T201
# Get recent reports for character
reports = await client.get_character_reports(character_id=12345, limit=10)
for report in reports.character_data.character.recent_reports.data:
print(f"Report: {report.code} - {report.zone.name}") # noqa: T201
# Get game data
abilities = await client.get_abilities(limit=50, page=1)
for ability in abilities.game_data.abilities.data:
print(f"Ability: {ability.name}") # noqa: T201
# Run the async function
asyncio.run(main())
```
### Authentication Only
```python
from esologs.auth import get_access_token
# Using environment variables
token = get_access_token()
# Using explicit credentials
token = get_access_token(
client_id="your_client_id",
client_secret="your_client_secret"
)
```
### Character Rankings (NEW)
```python
import asyncio
from esologs.client import Client
from esologs.enums import CharacterRankingMetricType, RoleType
from esologs.auth import get_access_token
async def main():
token = get_access_token()
async with Client(
url="https://www.esologs.com/api/v2/client",
headers={"Authorization": f"Bearer {token}"}
) as client:
# Get character encounter rankings with filtering
encounter_rankings = await client.get_character_encounter_rankings(
character_id=12345,
encounter_id=27,
metric=CharacterRankingMetricType.dps,
role=RoleType.DPS,
difficulty=125
)
# Get zone-wide character leaderboards
zone_rankings = await client.get_character_zone_rankings(
character_id=12345,
zone_id=1,
metric=CharacterRankingMetricType.playerscore
)
# Access ranking data
if encounter_rankings.character_data.character.encounter_rankings:
rankings_data = encounter_rankings.character_data.character.encounter_rankings
print(f"Best DPS: {rankings_data.get('bestAmount', 0)}")
print(f"Total Kills: {rankings_data.get('totalKills', 0)}")
asyncio.run(main())
```
### Advanced Report Search (NEW)
```python
import asyncio
from esologs.client import Client
from esologs.auth import get_access_token
async def main():
token = get_access_token()
async with Client(
url="https://www.esologs.com/api/v2/client",
headers={"Authorization": f"Bearer {token}"}
) as client:
# Search reports with flexible criteria
reports = await client.search_reports(
guild_id=123,
zone_id=456,
start_time=1672531200000, # Jan 1, 2023
end_time=1672617600000, # Jan 2, 2023
limit=25,
page=1
)
# Convenience methods for common searches
guild_reports = await client.get_guild_reports(
guild_id=123,
limit=50
)
user_reports = await client.get_user_reports(
user_id=789,
zone_id=456,
limit=20
)
# Process search results
if reports.report_data and reports.report_data.reports:
for report in reports.report_data.reports.data:
print(f"Report: {report.code} - {report.zone.name}")
print(f"Duration: {report.end_time - report.start_time}ms")
asyncio.run(main())
```
## Available API Methods
### Game Data
- `get_ability(id)` - Get specific ability information
- `get_abilities(limit, page)` - List abilities with pagination
- `get_class(id)` - Get character class information
- `get_classes(faction_id, zone_id)` - List character classes
- `get_factions()` - Get available factions
- `get_item(id)` - Get specific item information
- `get_items(limit, page)` - List items with pagination
- `get_item_set(id)` - Get item set information
- `get_item_sets(limit, page)` - List item sets with pagination
- `get_map(id)` - Get map information
- `get_maps(limit, page)` - List maps with pagination
- `get_npc(id)` - Get NPC information
- `get_npcs(limit, page)` - List NPCs with pagination
### Character Data
- `get_character_by_id(id)` - Get character profile
- `get_character_reports(character_id, limit)` - Get character's reports
- `get_character_encounter_ranking(character_id, encounter_id)` - Get character rankings (legacy)
- `get_character_encounter_rankings(character_id, encounter_id, **kwargs)` - **NEW**: Advanced encounter rankings with full filtering
- `get_character_zone_rankings(character_id, zone_id, **kwargs)` - **NEW**: Zone-wide character leaderboards
### Guild Data
- `get_guild_by_id(guild_id)` - Get guild information
### World Data
- `get_world_data()` - Get comprehensive world information
- `get_regions()` - Get available regions
- `get_zones()` - Get available zones
- `get_encounters_by_zone(zone_id)` - Get encounters in specific zone
### Report Data
- `get_report_by_code(code)` - Get specific report by code
- `get_reports(**kwargs)` - **NEW**: Advanced report search with comprehensive filtering
- `search_reports(**kwargs)` - **NEW**: Flexible report search with multiple criteria
- `get_guild_reports(guild_id, **kwargs)` - **NEW**: Convenience method for guild reports
- `get_user_reports(user_id, **kwargs)` - **NEW**: Convenience method for user reports
- `get_report_events(code, **kwargs)` - Get event-by-event combat log data with comprehensive filtering
- `get_report_graph(code, **kwargs)` - Get time-series performance graphs and metrics
- `get_report_table(code, **kwargs)` - Get tabular analysis data with sorting and filtering
- `get_report_rankings(code, **kwargs)` - Get report rankings and leaderboard data
- `get_report_player_details(code, **kwargs)` - Get detailed player performance data from reports
### System
- `get_rate_limit_data()` - Check API usage and rate limits
## Development
### Setup Development Environment
```bash
# Clone and install
git clone https://github.com/knowlen/esologs-python.git
cd esologs-python
# Production installation
pip install -e .
# Development installation with all tools
pip install -e ".[dev]"
# Install pre-commit hooks
pre-commit install
# Run tests
pytest tests/
```
### Code Quality Tools
This project uses several tools to maintain code quality:
- **Black**: Code formatting
- **isort**: Import sorting
- **Ruff**: Fast Python linting
- **MyPy**: Static type checking
- **pytest**: Testing framework
- **pre-commit**: Git hooks for code quality
### Project Structure
```
esologs-python/
├── esologs/ # Main package
│ ├── client.py # Main client implementation
│ ├── async_base_client.py # Base async GraphQL client
│ ├── exceptions.py # Custom exceptions
│ ├── validators.py # Parameter validation utilities
│ └── get_*.py # Generated GraphQL query modules
├── tests/ # Test suite (278 tests)
│ ├── unit/ # Unit tests (76 tests)
│ ├── integration/ # Integration tests (85 tests)
│ ├── docs/ # Documentation tests (98 tests)
│ └── sanity/ # Sanity tests (19 tests)
├── docs/ # Documentation source
├── access_token.py # OAuth2 authentication
├── schema.graphql # GraphQL schema
├── queries.graphql # GraphQL queries
├── pyproject.toml # Project configuration
└── README.md # This file
```
## API Reference
### GraphQL Schema
The complete GraphQL schema is available at: https://www.esologs.com/v2-api-docs/eso/
### Rate Limiting
- The ESO Logs API uses rate limiting based on points per hour
- Use `get_rate_limit_data()` to check your current usage
- The client includes automatic retry logic for rate limit errors
### Data Models
All API responses are validated using Pydantic models for type safety and data validation.
## Contributing
We welcome contributions! Please see our contributing guidelines:
1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Install dependencies (`pip install -e ".[dev]"`)
4. Make your changes
5. Run tests (`pytest`)
6. Run code quality checks (`pre-commit run --all-files`)
7. Commit your changes (`git commit -m 'Add amazing feature'`)
8. Push to the branch (`git push origin feature/amazing-feature`)
9. Open a Pull Request
### Development Roadmap
- **Phase 1** ✅: Security fixes and foundation improvements
- **Phase 2** 🚧: Core architecture and missing API functionality
- ✅ PR #1: Character Rankings Implementation (Merged)
- ✅ PR #2: Report Analysis Implementation (Merged)
- ✅ PR #3: Integration Test Suite (Merged)
- ✅ PR #4: Advanced Report Search (Merged)
- 🚧 PR #5: Client Architecture Refactor (Next)
- **Phase 3** 🚧: Data transformation and pandas integration
- **Phase 4** ✅: Comprehensive testing and documentation (278 tests)
- **Phase 5** 🚧: Performance optimization and caching
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
## Acknowledgments
- [ESO Logs](https://www.esologs.com/) for providing the API
- [ariadne-codegen](https://github.com/mirumee/ariadne-codegen) for GraphQL code generation
- The Elder Scrolls Online community
## Support
- **Issues**: [GitHub Issues](https://github.com/knowlen/esologs-python/issues)
- **Documentation**: [Read the Docs](https://esologs-python.readthedocs.io/)
- **ESO Logs API**: [Official Documentation](https://www.esologs.com/v2-api-docs/eso/)
---
**Note**: This library is not officially affiliated with ESO Logs or ZeniMax Online Studios.
Raw data
{
"_id": null,
"home_page": null,
"name": "esologs-python",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "eso, elder-scrolls-online, esologs, api, graphql, combat-logs, mmorpg, gaming, api-client, python",
"author": "Nick Knowles",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/e1/25/98dfe48e7aefec3fab6e059d7ec5470b8902c3fcf9be3bc48f363bbc82f8/esologs_python-0.2.0a2.tar.gz",
"platform": null,
"description": "<div align=\"center\">\n <picture>\n <source type=\"image/webp\" srcset=\"docs/assets/logo.webp\">\n <img src=\"docs/assets/logo.png\" alt=\"ESO Logs Python\" width=\"300\">\n </picture>\n</div>\n\n# ESO Logs Python Client\n\n[](https://www.python.org/downloads/)\n[](https://esologs-python.readthedocs.io/)\n[](https://github.com/knowlen/esologs-python)\n[](https://github.com/knowlen/esologs-python/actions/workflows/ci.yml)\n\nA comprehensive Python client library for the [ESO Logs API v2](https://www.esologs.com/v2-api-docs/eso/). This library provides both synchronous and asynchronous interfaces to access Elder Scrolls Online combat logging data, with built-in support for data transformation and analysis.\n\n## Project Status\n\n| Metric | Status |\n|--------|--------|\n| **Current Version** | 0.2.0-alpha |\n| **API Coverage** | ~83% (comprehensive analysis shows 6/8 API sections fully implemented) |\n| **Development Stage** | Active development |\n| **Documentation** | [Read the Docs](https://esologs-python.readthedocs.io/) |\n| **Tests** | 278 tests across unit, integration, documentation, and sanity suites |\n\n### Current API Coverage\n**Implemented (6/8 sections):**\n1. \u2705 **gameData** - 13 methods\n2. \u2705 **characterData** - 5 methods\n3. \u2705 **reportData** - 9 methods\n4. \u2705 **worldData** - 4 methods\n5. \u2705 **rateLimitData** - 1 method\n6. \ud83d\udfe1 **guildData** - 2 methods (PARTIAL - missing 4 advanced methods)\n\n**Missing (2/8 sections):**\n- \u274c **userData** - 0/3 methods (MISSING - requires user auth)\n- \u274c **progressRaceData** - 0/1 method (MISSING - niche racing feature)\n\n### Roadmap\n- \ud83d\udea7 Progress race tracking\n- \ud83d\udea7 User account integration\n- \ud83d\udea7 Client architecture refactor (modular design)\n\n## Installation\n\n```bash\n# Install from PyPI (recommended)\npip install esologs-python\n\n# For development or latest features\npip install git+https://github.com/knowlen/esologs-python.git@main\n```\n\n### Development Installation\n\n```bash\n# Clone for development\ngit clone https://github.com/knowlen/esologs-python.git\ncd esologs-python\npip install -e \".[dev]\"\n```\n\n## API Setup\n\n1. **Create an ESO Logs API Client**\n - Visit [ESO Logs API Clients](https://www.esologs.com/api/clients/)\n - Create a new v2 client application\n - Note your Client ID and Client Secret\n\n2. **Set Environment Variables**\n ```bash\n export ESOLOGS_ID=\"your_client_id_here\"\n export ESOLOGS_SECRET=\"your_client_secret_here\"\n ```\n\n3. **Alternative: Use .env file**\n ```bash\n # Create .env file in your project root\n echo \"ESOLOGS_ID=your_client_id_here\" >> .env\n echo \"ESOLOGS_SECRET=your_client_secret_here\" >> .env\n ```\n\n## Quickstart\n\nFor comprehensive documentation, visit [esologs-python.readthedocs.io](https://esologs-python.readthedocs.io/)\n\n### Basic Usage\n\n```python\nimport asyncio\nfrom esologs.client import Client\nfrom esologs.auth import get_access_token\n\nasync def main():\n # Get authentication token\n token = get_access_token()\n\n # Create client\n async with Client(\n url=\"https://www.esologs.com/api/v2/client\",\n headers={\"Authorization\": f\"Bearer {token}\"}\n ) as client:\n\n # Get character information\n character = await client.get_character_by_id(id=12345)\n print(f\"Character: {character.character_data.character.name}\") # noqa: T201\n\n # Get recent reports for character\n reports = await client.get_character_reports(character_id=12345, limit=10)\n for report in reports.character_data.character.recent_reports.data:\n print(f\"Report: {report.code} - {report.zone.name}\") # noqa: T201\n\n # Get game data\n abilities = await client.get_abilities(limit=50, page=1)\n for ability in abilities.game_data.abilities.data:\n print(f\"Ability: {ability.name}\") # noqa: T201\n\n# Run the async function\nasyncio.run(main())\n```\n\n### Authentication Only\n\n```python\nfrom esologs.auth import get_access_token\n\n# Using environment variables\ntoken = get_access_token()\n\n# Using explicit credentials\ntoken = get_access_token(\n client_id=\"your_client_id\",\n client_secret=\"your_client_secret\"\n)\n```\n\n### Character Rankings (NEW)\n\n```python\nimport asyncio\nfrom esologs.client import Client\nfrom esologs.enums import CharacterRankingMetricType, RoleType\nfrom esologs.auth import get_access_token\n\nasync def main():\n token = get_access_token()\n\n async with Client(\n url=\"https://www.esologs.com/api/v2/client\",\n headers={\"Authorization\": f\"Bearer {token}\"}\n ) as client:\n\n # Get character encounter rankings with filtering\n encounter_rankings = await client.get_character_encounter_rankings(\n character_id=12345,\n encounter_id=27,\n metric=CharacterRankingMetricType.dps,\n role=RoleType.DPS,\n difficulty=125\n )\n\n # Get zone-wide character leaderboards\n zone_rankings = await client.get_character_zone_rankings(\n character_id=12345,\n zone_id=1,\n metric=CharacterRankingMetricType.playerscore\n )\n\n # Access ranking data\n if encounter_rankings.character_data.character.encounter_rankings:\n rankings_data = encounter_rankings.character_data.character.encounter_rankings\n print(f\"Best DPS: {rankings_data.get('bestAmount', 0)}\")\n print(f\"Total Kills: {rankings_data.get('totalKills', 0)}\")\n\nasyncio.run(main())\n```\n\n### Advanced Report Search (NEW)\n\n```python\nimport asyncio\nfrom esologs.client import Client\nfrom esologs.auth import get_access_token\n\nasync def main():\n token = get_access_token()\n\n async with Client(\n url=\"https://www.esologs.com/api/v2/client\",\n headers={\"Authorization\": f\"Bearer {token}\"}\n ) as client:\n\n # Search reports with flexible criteria\n reports = await client.search_reports(\n guild_id=123,\n zone_id=456,\n start_time=1672531200000, # Jan 1, 2023\n end_time=1672617600000, # Jan 2, 2023\n limit=25,\n page=1\n )\n\n # Convenience methods for common searches\n guild_reports = await client.get_guild_reports(\n guild_id=123,\n limit=50\n )\n\n user_reports = await client.get_user_reports(\n user_id=789,\n zone_id=456,\n limit=20\n )\n\n # Process search results\n if reports.report_data and reports.report_data.reports:\n for report in reports.report_data.reports.data:\n print(f\"Report: {report.code} - {report.zone.name}\")\n print(f\"Duration: {report.end_time - report.start_time}ms\")\n\nasyncio.run(main())\n```\n\n## Available API Methods\n\n### Game Data\n- `get_ability(id)` - Get specific ability information\n- `get_abilities(limit, page)` - List abilities with pagination\n- `get_class(id)` - Get character class information\n- `get_classes(faction_id, zone_id)` - List character classes\n- `get_factions()` - Get available factions\n- `get_item(id)` - Get specific item information\n- `get_items(limit, page)` - List items with pagination\n- `get_item_set(id)` - Get item set information\n- `get_item_sets(limit, page)` - List item sets with pagination\n- `get_map(id)` - Get map information\n- `get_maps(limit, page)` - List maps with pagination\n- `get_npc(id)` - Get NPC information\n- `get_npcs(limit, page)` - List NPCs with pagination\n\n### Character Data\n- `get_character_by_id(id)` - Get character profile\n- `get_character_reports(character_id, limit)` - Get character's reports\n- `get_character_encounter_ranking(character_id, encounter_id)` - Get character rankings (legacy)\n- `get_character_encounter_rankings(character_id, encounter_id, **kwargs)` - **NEW**: Advanced encounter rankings with full filtering\n- `get_character_zone_rankings(character_id, zone_id, **kwargs)` - **NEW**: Zone-wide character leaderboards\n\n### Guild Data\n- `get_guild_by_id(guild_id)` - Get guild information\n\n### World Data\n- `get_world_data()` - Get comprehensive world information\n- `get_regions()` - Get available regions\n- `get_zones()` - Get available zones\n- `get_encounters_by_zone(zone_id)` - Get encounters in specific zone\n\n### Report Data\n- `get_report_by_code(code)` - Get specific report by code\n- `get_reports(**kwargs)` - **NEW**: Advanced report search with comprehensive filtering\n- `search_reports(**kwargs)` - **NEW**: Flexible report search with multiple criteria\n- `get_guild_reports(guild_id, **kwargs)` - **NEW**: Convenience method for guild reports\n- `get_user_reports(user_id, **kwargs)` - **NEW**: Convenience method for user reports\n- `get_report_events(code, **kwargs)` - Get event-by-event combat log data with comprehensive filtering\n- `get_report_graph(code, **kwargs)` - Get time-series performance graphs and metrics\n- `get_report_table(code, **kwargs)` - Get tabular analysis data with sorting and filtering\n- `get_report_rankings(code, **kwargs)` - Get report rankings and leaderboard data\n- `get_report_player_details(code, **kwargs)` - Get detailed player performance data from reports\n\n### System\n- `get_rate_limit_data()` - Check API usage and rate limits\n\n## Development\n\n### Setup Development Environment\n\n```bash\n# Clone and install\ngit clone https://github.com/knowlen/esologs-python.git\ncd esologs-python\n\n# Production installation\npip install -e .\n\n# Development installation with all tools\npip install -e \".[dev]\"\n\n# Install pre-commit hooks\npre-commit install\n\n# Run tests\npytest tests/\n```\n\n### Code Quality Tools\n\nThis project uses several tools to maintain code quality:\n\n- **Black**: Code formatting\n- **isort**: Import sorting\n- **Ruff**: Fast Python linting\n- **MyPy**: Static type checking\n- **pytest**: Testing framework\n- **pre-commit**: Git hooks for code quality\n\n### Project Structure\n\n```\nesologs-python/\n\u251c\u2500\u2500 esologs/ # Main package\n\u2502 \u251c\u2500\u2500 client.py # Main client implementation\n\u2502 \u251c\u2500\u2500 async_base_client.py # Base async GraphQL client\n\u2502 \u251c\u2500\u2500 exceptions.py # Custom exceptions\n\u2502 \u251c\u2500\u2500 validators.py # Parameter validation utilities\n\u2502 \u2514\u2500\u2500 get_*.py # Generated GraphQL query modules\n\u251c\u2500\u2500 tests/ # Test suite (278 tests)\n\u2502 \u251c\u2500\u2500 unit/ # Unit tests (76 tests)\n\u2502 \u251c\u2500\u2500 integration/ # Integration tests (85 tests)\n\u2502 \u251c\u2500\u2500 docs/ # Documentation tests (98 tests)\n\u2502 \u2514\u2500\u2500 sanity/ # Sanity tests (19 tests)\n\u251c\u2500\u2500 docs/ # Documentation source\n\u251c\u2500\u2500 access_token.py # OAuth2 authentication\n\u251c\u2500\u2500 schema.graphql # GraphQL schema\n\u251c\u2500\u2500 queries.graphql # GraphQL queries\n\u251c\u2500\u2500 pyproject.toml # Project configuration\n\u2514\u2500\u2500 README.md # This file\n```\n\n## API Reference\n\n### GraphQL Schema\nThe complete GraphQL schema is available at: https://www.esologs.com/v2-api-docs/eso/\n\n### Rate Limiting\n- The ESO Logs API uses rate limiting based on points per hour\n- Use `get_rate_limit_data()` to check your current usage\n- The client includes automatic retry logic for rate limit errors\n\n### Data Models\nAll API responses are validated using Pydantic models for type safety and data validation.\n\n## Contributing\n\nWe welcome contributions! Please see our contributing guidelines:\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Install dependencies (`pip install -e \".[dev]\"`)\n4. Make your changes\n5. Run tests (`pytest`)\n6. Run code quality checks (`pre-commit run --all-files`)\n7. Commit your changes (`git commit -m 'Add amazing feature'`)\n8. Push to the branch (`git push origin feature/amazing-feature`)\n9. Open a Pull Request\n\n### Development Roadmap\n\n- **Phase 1** \u2705: Security fixes and foundation improvements\n- **Phase 2** \ud83d\udea7: Core architecture and missing API functionality\n - \u2705 PR #1: Character Rankings Implementation (Merged)\n - \u2705 PR #2: Report Analysis Implementation (Merged)\n - \u2705 PR #3: Integration Test Suite (Merged)\n - \u2705 PR #4: Advanced Report Search (Merged)\n - \ud83d\udea7 PR #5: Client Architecture Refactor (Next)\n- **Phase 3** \ud83d\udea7: Data transformation and pandas integration\n- **Phase 4** \u2705: Comprehensive testing and documentation (278 tests)\n- **Phase 5** \ud83d\udea7: Performance optimization and caching\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n## Acknowledgments\n\n- [ESO Logs](https://www.esologs.com/) for providing the API\n- [ariadne-codegen](https://github.com/mirumee/ariadne-codegen) for GraphQL code generation\n- The Elder Scrolls Online community\n\n## Support\n\n- **Issues**: [GitHub Issues](https://github.com/knowlen/esologs-python/issues)\n- **Documentation**: [Read the Docs](https://esologs-python.readthedocs.io/)\n- **ESO Logs API**: [Official Documentation](https://www.esologs.com/v2-api-docs/eso/)\n\n---\n\n**Note**: This library is not officially affiliated with ESO Logs or ZeniMax Online Studios.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A Python client library for the ESO Logs API v2",
"version": "0.2.0a2",
"project_urls": {
"Changelog": "https://github.com/knowlen/esologs-python/wiki/Changelog",
"Documentation": "https://esologs-python.readthedocs.io/",
"Homepage": "https://github.com/knowlen/esologs-python",
"Issues": "https://github.com/knowlen/esologs-python/issues",
"Repository": "https://github.com/knowlen/esologs-python",
"Wiki": "https://github.com/knowlen/esologs-python/wiki"
},
"split_keywords": [
"eso",
" elder-scrolls-online",
" esologs",
" api",
" graphql",
" combat-logs",
" mmorpg",
" gaming",
" api-client",
" python"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "c3c2586ce8c360906aa43cc1dc685ac972c3a1c491fb7db7e4ff799a5000ff34",
"md5": "a39853de8004b14edcbc2b2850d83d71",
"sha256": "996c5097d00a4e0029f51a5a43a5da0d2fb7307b3e9444b1983003ca896375d5"
},
"downloads": -1,
"filename": "esologs_python-0.2.0a2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a39853de8004b14edcbc2b2850d83d71",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 38205,
"upload_time": "2025-07-16T04:26:47",
"upload_time_iso_8601": "2025-07-16T04:26:47.386023Z",
"url": "https://files.pythonhosted.org/packages/c3/c2/586ce8c360906aa43cc1dc685ac972c3a1c491fb7db7e4ff799a5000ff34/esologs_python-0.2.0a2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e12598dfe48e7aefec3fab6e059d7ec5470b8902c3fcf9be3bc48f363bbc82f8",
"md5": "0f91a00fa68624dad5434cd82341cda4",
"sha256": "2d5665b9c461fa226d2fb0ae51a04e18bbfbaf68b1d3442fc31fd02acf278ad3"
},
"downloads": -1,
"filename": "esologs_python-0.2.0a2.tar.gz",
"has_sig": false,
"md5_digest": "0f91a00fa68624dad5434cd82341cda4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 33455,
"upload_time": "2025-07-16T04:26:48",
"upload_time_iso_8601": "2025-07-16T04:26:48.779109Z",
"url": "https://files.pythonhosted.org/packages/e1/25/98dfe48e7aefec3fab6e059d7ec5470b8902c3fcf9be3bc48f363bbc82f8/esologs_python-0.2.0a2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-16 04:26:48",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "knowlen",
"github_project": "esologs-python",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "esologs-python"
}