Skip to content

Add Stats API#62

Merged
piobeny merged 2 commits intomainfrom
stats-api
Mar 23, 2026
Merged

Add Stats API#62
piobeny merged 2 commits intomainfrom
stats-api

Conversation

@piobeny
Copy link
Copy Markdown
Contributor

@piobeny piobeny commented Mar 6, 2026

Motivation

  • Add support for the Email Sending Stats API (/api/accounts/{account_id}/stats) to the Python SDK, enabling users to retrieve aggregated email sending statistics.

Changes

  • Add SendingStats and SendingStatGroup pydantic dataclasses with delivery, bounce, open, click, and spam counts/rates
  • Add StatsFilterParams dataclass extending RequestParams for filter handling
  • Add StatsApi class with 5 methods: get, by_domains, by_categories, by_email_service_providers, by_date
  • Add api_query_params to RequestParams for automatic [] serialization of list query params
  • Add usage example in examples/general/stats.py
  • Update README with Stats API reference
  • Update CHANGELOG with entry for v2.5.0

How to test

  • stats_api.get(account_id, params) with different parameters (start_date, end_date, sending_domain_ids, sending_streams, categories, email_service_providers)
  • Test grouped endpoints (by_domain, by_category, by_email_service_provider, by_date) with filters

Examples

import mailtrap as mt                                                                                                                                                                              
from mailtrap.models.stats import StatsFilterParams                                                                                                                                                
                                                                                                                                                                                                   
client = mt.MailtrapClient(token="api_key")                                                                                                                                                        
stats_api = client.general_api.stats                                                                                                                                                               
                                                                                                                                                                                                   
# Get aggregated stats with optional filters                                                                                                                                                       
params = StatsFilterParams(                                                                                                                                                                        
    start_date="2026-01-01",                                                                                                                                                                       
    end_date="2026-01-31",                                                                                                                                                                         
    categories=["Welcome email"],                                                                                                                                                                  
)                                                                                                                                                                                                  
result = stats_api.get(account_id=account_id, params=params)

Summary by CodeRabbit

  • New Features

    • Added a Stats API for retrieving sending statistics with domain/category/provider/date grouping and filtering.
    • Improved automatic serialization of list-based query parameters.
    • Exposed StatsFilterParams at the package top-level for easier access.
  • Documentation

    • Updated API documentation link.
    • Added a Stats API usage example.
  • Tests

    • Added unit tests covering Stats API endpoints and query serialization.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 6, 2026

Warning

Rate limit exceeded

@piobeny has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 4 minutes and 33 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.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 409ba024-de89-40cc-859b-29f64678692f

📥 Commits

Reviewing files that changed from the base of the PR and between 852a1a7 and cce1388.

📒 Files selected for processing (11)
  • .github/workflows/main.yml
  • CHANGELOG.md
  • README.md
  • examples/stats/stats.py
  • mailtrap/__init__.py
  • mailtrap/api/resources/stats.py
  • mailtrap/client.py
  • mailtrap/models/common.py
  • mailtrap/models/stats.py
  • pyproject.toml
  • tests/unit/api/test_stats.py
📝 Walkthrough

Walkthrough

Adds a new Stats API client and models for retrieving aggregated sending statistics, wire-up in the main client, list-serialization support for query params, example usage, changelog/README updates, and comprehensive unit tests.

Changes

Cohort / File(s) Summary
Stats API Core
mailtrap/api/resources/stats.py, mailtrap/models/stats.py
Adds StatsApi with get() and grouped endpoints (by_domain, by_category, by_email_service_provider, by_date) and models SendingStats, SendingStatGroup, StatsFilterParams.
Client Integration & Models
mailtrap/client.py, mailtrap/__init__.py, mailtrap/models/common.py
Exposes stats_api property on MailtrapClient; exports StatsFilterParams at package level; adds RequestParams.api_query_params to serialize list query params as key[].
Examples & Docs
examples/stats/stats.py, README.md, CHANGELOG.md, pyproject.toml
Adds example script for stats usage; updates README to list the Stats API; adds unreleased changelog entries; updates "API documentation" URL.
Tests
tests/unit/api/test_stats.py
New unit tests covering error handling, success responses, request serialization (array-style keys), and grouped endpoints.
Minor Formatting
mailtrap/api/general.py
Whitespace/formatting/trailing blank-line adjustment.

Sequence Diagram

sequenceDiagram
    participant Client as MailtrapClient
    participant StatsApi as StatsApi
    participant HttpClient as HttpClient
    participant Server as API Server
    participant Parser as Response Parser

    Client->>StatsApi: get(account_id, params)
    StatsApi->>StatsApi: _base_path(account_id)
    StatsApi->>StatsApi: api_query_params (serialize lists)
    StatsApi->>HttpClient: GET /api/accounts/{id}/stats?params
    HttpClient->>Server: HTTP GET Request
    Server-->>HttpClient: JSON Response
    HttpClient-->>StatsApi: Response JSON
    StatsApi->>Parser: SendingStats(**response)
    Parser-->>StatsApi: SendingStats instance
    StatsApi-->>Client: SendingStats

    Client->>StatsApi: by_domain(account_id, params)
    StatsApi->>HttpClient: GET /api/accounts/{id}/stats/domains?params
    HttpClient->>Server: HTTP GET Request
    Server-->>HttpClient: JSON Response (grouped items)
    HttpClient-->>StatsApi: Response JSON
    StatsApi->>Parser: [SendingStatGroup(...) for item in response]
    Parser-->>StatsApi: list[SendingStatGroup]
    StatsApi-->>Client: Grouped stats list
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested reviewers

  • VladimirTaytor
  • IgorDobryn

Poem

🐰✨ Hopping through metrics, I tally each mail,

Domains and categories down every trail.
Brackets for lists, groups neat and spry,
Stats bloom like clover beneath the sky.
A rabbit-approved feature—numbers that fly!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Add Stats API' clearly and concisely summarizes the main change—introducing a new Stats API to the SDK—which aligns with the primary objective across all modified files.
Description check ✅ Passed The description covers motivation, changes, and testing guidance. Although it deviates from the template structure (missing the exact checklist format and images/GIFs section), the core required information is present and substantive.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch stats-api

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

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@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: 4

🧹 Nitpick comments (1)
examples/general/stats.py (1)

1-4: Consider consolidating imports.

The three imports from mailtrap.models.stats can be combined into a single line for brevity.

Proposed fix
 import mailtrap as mt
-from mailtrap.models.stats import SendingStatGroup
-from mailtrap.models.stats import SendingStats
-from mailtrap.models.stats import StatsFilterParams
+from mailtrap.models.stats import SendingStatGroup, SendingStats, StatsFilterParams
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@examples/general/stats.py` around lines 1 - 4, Consolidate the three separate
imports from mailtrap.models.stats into a single statement: replace the three
lines importing SendingStatGroup, SendingStats, and StatsFilterParams with one
combined import that lists those symbols together (keep the existing import
mailtrap as mt intact); ensure the combined import includes SendingStatGroup,
SendingStats, and StatsFilterParams exactly as named.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@examples/general/stats.py`:
- Around line 6-7: The example defines ACCOUNT_ID as a string while helper
functions expect account_id: int; update the example to provide an integer
ACCOUNT_ID (replace "YOUR_ACCOUNT_ID" with a numeric literal) or explicitly
cast/convert it before passing to functions so the value matches the account_id:
int signatures (look for the ACCOUNT_ID constant and any functions/methods that
declare account_id: int).

In `@mailtrap/api/resources/stats.py`:
- Around line 18-39: Reformat the oversized function signatures and long calls
in this file to satisfy Black/E501: wrap long parameter lists and chained calls
for the methods get, by_domains, by_categories, by_email_service_providers, and
by_date so no line exceeds the max width; specifically break the signature and
the return/_grouped_stats call lines that pass StatsFilterParams (e.g., the
by_email_service_providers(...) -> return self._grouped_stats(...)) across
multiple lines consistent with Black's style, then run Black on
mailtrap/api/resources/stats.py to ensure CI passes.

In `@mailtrap/models/stats.py`:
- Around line 31-33: The StatsFilterParams class uses empty-string defaults for
start_date/end_date causing RequestParams.api_data(..., exclude_none=True) to
still serialize them; change both fields in StatsFilterParams to use
Optional[str] with default None (and add the typing import if missing) so when
unset they are omitted from api_data serialization; update any related
validation or consumers that expect empty strings to handle None instead.

In `@tests/unit/api/general/test_stats.py`:
- Line 146: The test function signature for test_get_with_filter_params is too
long and must be wrapped to satisfy line-length rules; edit the def
test_get_with_filter_params(self, client: StatsApi, sample_stats_dict: dict) ->
None: signature to break parameters across multiple lines (e.g., place each
parameter on its own line or use a hanging indent inside the def parentheses) so
the line length is under the configured limit, then re-run/commit Black (or run
the project's formatter) to ensure the file passes CI formatting checks.

---

Nitpick comments:
In `@examples/general/stats.py`:
- Around line 1-4: Consolidate the three separate imports from
mailtrap.models.stats into a single statement: replace the three lines importing
SendingStatGroup, SendingStats, and StatsFilterParams with one combined import
that lists those symbols together (keep the existing import mailtrap as mt
intact); ensure the combined import includes SendingStatGroup, SendingStats, and
StatsFilterParams exactly as named.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c0ad3c1f-6b85-4473-a950-b27b381aec46

📥 Commits

Reviewing files that changed from the base of the PR and between 8821498 and d5c86be.

📒 Files selected for processing (9)
  • CHANGELOG.md
  • examples/general/stats.py
  • mailtrap/__init__.py
  • mailtrap/api/general.py
  • mailtrap/api/resources/stats.py
  • mailtrap/models/common.py
  • mailtrap/models/stats.py
  • pyproject.toml
  • tests/unit/api/general/test_stats.py

@piobeny piobeny force-pushed the stats-api branch 3 times, most recently from 5bbca85 to a8a254b Compare March 6, 2026 11:59
@piobeny piobeny closed this Mar 9, 2026
@piobeny piobeny reopened this Mar 10, 2026
@piobeny piobeny force-pushed the stats-api branch 2 times, most recently from 908dbe5 to 72004fc Compare March 10, 2026 11:21
Copy link
Copy Markdown

@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

🧹 Nitpick comments (1)
tests/unit/api/general/test_stats.py (1)

145-169: Cover scalar filters and the “unset params are omitted” case too.

This test locks in the list serialization, but it still misses the other half of the contract: start_date / end_date being sent under the expected keys, and StatsFilterParams() omitting unset fields entirely. Adding those assertions here would make regressions in RequestParams.api_data(..., exclude_none=True) much easier to catch.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@examples/general/stats.py`:
- Around line 1-2: The import block in examples/general/stats.py was reordered
by the project's isort pre-commit hook and must be committed to pass CI; run
your local import formatter (isort) or the project's pre-commit hooks against
this file, accept the rewritten import ordering (affecting the top-level import
"mailtrap as mt" and the from-import of SendingStatGroup, SendingStats,
StatsFilterParams from mailtrap.models.stats), and commit the resulting changes
so the file matches the repo's canonical import ordering.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4782846c-b227-4e63-b0b8-0be945578cf9

📥 Commits

Reviewing files that changed from the base of the PR and between d5c86be and 908dbe5.

📒 Files selected for processing (9)
  • CHANGELOG.md
  • examples/general/stats.py
  • mailtrap/__init__.py
  • mailtrap/api/general.py
  • mailtrap/api/resources/stats.py
  • mailtrap/models/common.py
  • mailtrap/models/stats.py
  • pyproject.toml
  • tests/unit/api/general/test_stats.py
🚧 Files skipped from review as they are similar to previous changes (5)
  • mailtrap/init.py
  • mailtrap/models/common.py
  • CHANGELOG.md
  • mailtrap/api/resources/stats.py
  • pyproject.toml

@piobeny
Copy link
Copy Markdown
Contributor Author

piobeny commented Mar 10, 2026

@mklocek it's same but wanted to have another PR for version release

@piobeny piobeny requested a review from IgorDobryn March 16, 2026 07:32

@property
def stats(self) -> StatsApi:
return StatsApi(client=self._client)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Similar like in other SDKs, I would move it outside "general" namespace

@piobeny piobeny force-pushed the stats-api branch 2 times, most recently from b15fa11 to 8351152 Compare March 23, 2026 09:23
Copy link
Copy Markdown

@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

🧹 Nitpick comments (2)
examples/stats/stats.py (1)

13-35: Consider extracting default date params to a helper.

The same date-range construction repeats across multiple functions; a small helper would reduce duplication in this example.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@examples/stats/stats.py` around lines 13 - 35, The repeated
StatsFilterParams(start_date="2026-01-01", end_date="2026-01-31") should be
extracted into a small helper (e.g., make_default_stats_params or
build_stats_params) and then used by get_stats, get_stats_by_domain,
get_stats_by_category, get_stats_by_email_service_provider, and
get_stats_by_date so each function passes the helper's return value into
stats_api.get / stats_api.by_domain / stats_api.by_category /
stats_api.by_email_service_provider / stats_api.by_date; implement the helper
near the top of the file and replace the duplicated constructions with a single
call to that helper.
mailtrap/models/common.py (1)

23-27: Avoid mutating the api_data object in place.

Line 23 currently reuses self.api_data and then mutates it with pop. A defensive copy prevents accidental side effects if any subclass returns a reused dict.

♻️ Proposed refactor
 `@property`
 def api_query_params(self: T) -> dict[str, Any]:
-    data = self.api_data
+    data = dict(self.api_data)
     for key, value in list(data.items()):
         if isinstance(value, list):
             data[f"{key}[]"] = data.pop(key)
     return data
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@mailtrap/models/common.py` around lines 23 - 27, The method currently assigns
data = self.api_data and mutates it with pop, which can cause side effects;
instead create a shallow copy (e.g., data = dict(self.api_data) or
self.api_data.copy()) or build a new dict, iterate over the original to detect
list values and add keys like f"{key}[]" to the copy without calling pop on the
original, then return the copied/constructed dict; reference the api_data
attribute and the loop that checks isinstance(value, list) to locate where to
change the mutation.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@examples/stats/stats.py`:
- Around line 6-10: Replace hard-coded credentials with environment variables:
stop using the token literal API_TOKEN and numeric ACCOUNT_ID in the example and
instead read them from the environment (e.g., using os.getenv/os.environ.get)
before constructing mt.MailtrapClient and accessing stats_api; validate that the
token exists and raise a clear error or exit if it’s missing so accidental
commits don’t include credentials, and reference the symbols API_TOKEN,
ACCOUNT_ID, and mt.MailtrapClient to locate and update the example.

---

Nitpick comments:
In `@examples/stats/stats.py`:
- Around line 13-35: The repeated StatsFilterParams(start_date="2026-01-01",
end_date="2026-01-31") should be extracted into a small helper (e.g.,
make_default_stats_params or build_stats_params) and then used by get_stats,
get_stats_by_domain, get_stats_by_category, get_stats_by_email_service_provider,
and get_stats_by_date so each function passes the helper's return value into
stats_api.get / stats_api.by_domain / stats_api.by_category /
stats_api.by_email_service_provider / stats_api.by_date; implement the helper
near the top of the file and replace the duplicated constructions with a single
call to that helper.

In `@mailtrap/models/common.py`:
- Around line 23-27: The method currently assigns data = self.api_data and
mutates it with pop, which can cause side effects; instead create a shallow copy
(e.g., data = dict(self.api_data) or self.api_data.copy()) or build a new dict,
iterate over the original to detect list values and add keys like f"{key}[]" to
the copy without calling pop on the original, then return the copied/constructed
dict; reference the api_data attribute and the loop that checks
isinstance(value, list) to locate where to change the mutation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c6cd02c2-1a11-47c3-ab19-d811cd418c42

📥 Commits

Reviewing files that changed from the base of the PR and between 908dbe5 and 8351152.

📒 Files selected for processing (11)
  • CHANGELOG.md
  • README.md
  • examples/stats/stats.py
  • mailtrap/__init__.py
  • mailtrap/api/general.py
  • mailtrap/api/resources/stats.py
  • mailtrap/client.py
  • mailtrap/models/common.py
  • mailtrap/models/stats.py
  • pyproject.toml
  • tests/unit/api/test_stats.py
✅ Files skipped from review due to trivial changes (6)
  • mailtrap/api/general.py
  • mailtrap/init.py
  • pyproject.toml
  • CHANGELOG.md
  • README.md
  • mailtrap/api/resources/stats.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • mailtrap/models/stats.py

Comment on lines +6 to +10
API_TOKEN = "YOUR_API_TOKEN"
ACCOUNT_ID = 123456

client = mt.MailtrapClient(token=API_TOKEN)
stats_api = client.stats_api
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Use environment variables for credentials in the example.

Line 6 uses a token literal, which triggers security lint and can normalize unsafe copy/paste patterns. Prefer env vars for both token and account id.

🔐 Proposed fix
+import os
 import mailtrap as mt
 from mailtrap.models.stats import SendingStatGroup
 from mailtrap.models.stats import SendingStats
 from mailtrap.models.stats import StatsFilterParams

-API_TOKEN = "YOUR_API_TOKEN"
-ACCOUNT_ID = 123456
+API_TOKEN = os.environ["MAILTRAP_API_TOKEN"]
+ACCOUNT_ID = int(os.environ["MAILTRAP_ACCOUNT_ID"])

 client = mt.MailtrapClient(token=API_TOKEN)
 stats_api = client.stats_api
🧰 Tools
🪛 Ruff (0.15.6)

[error] 6-6: Possible hardcoded password assigned to: "API_TOKEN"

(S105)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@examples/stats/stats.py` around lines 6 - 10, Replace hard-coded credentials
with environment variables: stop using the token literal API_TOKEN and numeric
ACCOUNT_ID in the example and instead read them from the environment (e.g.,
using os.getenv/os.environ.get) before constructing mt.MailtrapClient and
accessing stats_api; validate that the token exists and raise a clear error or
exit if it’s missing so accidental commits don’t include credentials, and
reference the symbols API_TOKEN, ACCOUNT_ID, and mt.MailtrapClient to locate and
update the example.

Copy link
Copy Markdown

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@examples/stats/stats.py`:
- Line 7: ACCOUNT_ID is defined as a string but the example functions expect
account_id: int; change the placeholder for ACCOUNT_ID from "YOUR_ACCOUNT_ID" to
an integer placeholder (e.g., 12345) and update any other similar placeholders
at the mentioned locations so they match the annotated parameter type for
functions that accept account_id (look for occurrences of account_id: int in the
example functions and the constant ACCOUNT_ID).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: cabea9d3-d065-4a5b-af39-dd13a4b61ac1

📥 Commits

Reviewing files that changed from the base of the PR and between 8351152 and 852a1a7.

📒 Files selected for processing (11)
  • CHANGELOG.md
  • README.md
  • examples/stats/stats.py
  • mailtrap/__init__.py
  • mailtrap/api/general.py
  • mailtrap/api/resources/stats.py
  • mailtrap/client.py
  • mailtrap/models/common.py
  • mailtrap/models/stats.py
  • pyproject.toml
  • tests/unit/api/test_stats.py
✅ Files skipped from review due to trivial changes (8)
  • mailtrap/api/general.py
  • README.md
  • mailtrap/init.py
  • pyproject.toml
  • CHANGELOG.md
  • tests/unit/api/test_stats.py
  • mailtrap/api/resources/stats.py
  • mailtrap/models/stats.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • mailtrap/models/common.py

from mailtrap.models.stats import StatsFilterParams

API_TOKEN = "YOUR_API_TOKEN"
ACCOUNT_ID = "YOUR_ACCOUNT_ID"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Type mismatch between ACCOUNT_ID and function signatures.

ACCOUNT_ID is declared as a string ("YOUR_ACCOUNT_ID"), but all functions annotate account_id: int. This inconsistency could confuse users copying the example.

🐛 Proposed fix — use an integer placeholder
-ACCOUNT_ID = "YOUR_ACCOUNT_ID"
+ACCOUNT_ID = 123456  # Replace with your account ID

Also applies to: 13-13, 61-61

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@examples/stats/stats.py` at line 7, ACCOUNT_ID is defined as a string but the
example functions expect account_id: int; change the placeholder for ACCOUNT_ID
from "YOUR_ACCOUNT_ID" to an integer placeholder (e.g., 12345) and update any
other similar placeholders at the mentioned locations so they match the
annotated parameter type for functions that accept account_id (look for
occurrences of account_id: int in the example functions and the constant
ACCOUNT_ID).

@piobeny piobeny force-pushed the stats-api branch 2 times, most recently from a6ee126 to aeb6125 Compare March 23, 2026 09:46
Comment on lines +24 to +34
include:
- python: "3.9"
tox-env: "py39"
- python: "3.10"
tox-env: "py310"
- python: "3.11"
tox-env: "py311"
- python: "3.12"
tox-env: "py312"
- python: "3.13"
tox-env: "py313"
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

it's needed as new tox version is not accepting previous format:

Image

@piobeny piobeny requested a review from mklocek March 23, 2026 09:57
@piobeny
Copy link
Copy Markdown
Contributor Author

piobeny commented Mar 23, 2026

@mklocek can you take another look? I added fix for our pipeline and move stats out of general API

@piobeny piobeny merged commit 55778ba into main Mar 23, 2026
16 checks passed
@piobeny piobeny deleted the stats-api branch March 23, 2026 13:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants