esologs-python


Nameesologs-python JSON
Version 0.2.0a2 PyPI version JSON
download
home_pageNone
SummaryA Python client library for the ESO Logs API v2
upload_time2025-07-16 04:26:48
maintainerNone
docs_urlNone
authorNick Knowles
requires_python>=3.8
licenseMIT
keywords eso elder-scrolls-online esologs api graphql combat-logs mmorpg gaming api-client python
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <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

[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![Documentation](https://readthedocs.org/projects/esologs-python/badge/?version=latest)](https://esologs-python.readthedocs.io/)
[![Development Status](https://img.shields.io/badge/status-alpha-orange.svg)](https://github.com/knowlen/esologs-python)
[![Tests](https://github.com/knowlen/esologs-python/actions/workflows/ci.yml/badge.svg)](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[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![Documentation](https://readthedocs.org/projects/esologs-python/badge/?version=latest)](https://esologs-python.readthedocs.io/)\n[![Development Status](https://img.shields.io/badge/status-alpha-orange.svg)](https://github.com/knowlen/esologs-python)\n[![Tests](https://github.com/knowlen/esologs-python/actions/workflows/ci.yml/badge.svg)](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"
}
        
Elapsed time: 2.03475s