Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.13']
python-version: ['3.11', '3.13']
steps:
- uses: actions/checkout@v7

Expand Down Expand Up @@ -101,7 +101,8 @@ jobs:
# pode subir o piso de uma dependência base (claude-agent-sdk puxa pydantic
# >= 2.12) e esconder um piso quebrado. Uma dependência transitiva na versão
# mais alta ainda pode subir um piso direto, como o langgraph faz com o
# langchain-core. Roda em 3.10 porque o pandas no piso não tem wheel para 3.13.
# langchain-core. Roda em 3.11 porque o pandas no piso não tem wheel para 3.13
# e o pyarrow no piso não tem para 3.12.
lowest-direct:
runs-on: ubuntu-latest
strategy:
Expand All @@ -114,7 +115,7 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v7
with:
python-version: '3.10'
python-version: '3.11'

- name: Setup uv
uses: astral-sh/setup-uv@v10.2.0
Expand All @@ -127,8 +128,8 @@ jobs:
run: |
flags="--extra dev"
for extra in $EXTRAS; do flags="$flags --extra $extra"; done
uv pip compile pyproject.toml $flags --resolution lowest-direct --python-version 3.10 -o "$RUNNER_TEMP/requisitos.txt"
uv venv --python 3.10 "$RUNNER_TEMP/venv"
uv pip compile pyproject.toml $flags --resolution lowest-direct --python-version 3.11 -o "$RUNNER_TEMP/requisitos.txt"
uv venv --python 3.11 "$RUNNER_TEMP/venv"
export VIRTUAL_ENV="$RUNNER_TEMP/venv"
uv pip install -r "$RUNNER_TEMP/requisitos.txt"
uv pip install --no-deps -e .
Expand All @@ -139,7 +140,7 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.13']
python-version: ['3.11', '3.13']
steps:
- uses: actions/checkout@v7

Expand Down
2 changes: 1 addition & 1 deletion .python-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.10
3.11
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR
- Com `resume=True` e `checkpoint_path` existente, rodar a mesma chamada de novo continua do checkpoint, sem carregá-lo à mão; antes, a execução recomeçava e o sobrescrevia. `<checkpoint>.dataframeit.json`, gravado a cada gravação do checkpoint, guarda a assinatura da execução, o hash do texto de cada linha e o do próprio arquivo, e o checkpoint só é retomado quando os três batem; com outra configuração ou entrada, a execução avisa e recomeça como antes. Das linhas concluídas, com sucesso ou com erro, vêm também os campos do modelo, sobre o que a entrada trazia neles.
- No provider `codex`, o app-server roda com `HOME` no diretório isolado da execução, e as skills do usuário, como as de `~/.agents/skills`, deixam de ser carregadas.
- Com `search_per_field=True`, o modo por grupo também devolve `search_provider` no uso, e o modo por campo devolve os campos na ordem do modelo, como o modo por grupo. O campo pulado por condição é registrado uma vez no log, e não duas.
- O Python mínimo sobe para 3.11. O 3.10 saiu de suporte em outubro de 2026, e as versões atuais do numpy e do pandas já não o aceitam (#229).
- O piso do pyarrow nos extras `polars` e `all` sobe para 10.0.1, a primeira versão com wheel para Python 3.11 (#229).

### Corrigido

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Os testes não chamam nenhum provider de verdade e não precisam de chave de API
1. Abra uma issue antes de uma mudança grande, para combinar o desenho.
2. Crie uma branch a partir da `main` com o prefixo do tipo de mudança: `feature/`, `fix/`, `docs/` ou `refactor/`.
3. Escreva o teste junto com a mudança. Uma correção de bug vem com o teste que falhava antes dela.
4. Abra o PR contra a `main`. O CI roda lint, testes em Python 3.10 e 3.13, os testes com as versões mínimas das dependências e o build da documentação.
4. Abra o PR contra a `main`. O CI roda lint, testes em Python 3.11 e 3.13, os testes com as versões mínimas das dependências e o build da documentação.

## Convenções

Expand Down
2 changes: 1 addition & 1 deletion README.es.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# DataFrameIt

[![PyPI version](https://badge.fury.io/py/dataframeit.svg)](https://badge.fury.io/py/dataframeit)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Tests](https://github.com/bdcdo/dataframeit/actions/workflows/tests.yml/badge.svg)](https://github.com/bdcdo/dataframeit/actions/workflows/tests.yml)

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# DataFrameIt

[![PyPI version](https://badge.fury.io/py/dataframeit.svg)](https://badge.fury.io/py/dataframeit)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Tests](https://github.com/bdcdo/dataframeit/actions/workflows/tests.yml/badge.svg)](https://github.com/bdcdo/dataframeit/actions/workflows/tests.yml)

Expand Down
2 changes: 1 addition & 1 deletion README.pt-BR.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# DataFrameIt

[![PyPI version](https://badge.fury.io/py/dataframeit.svg)](https://badge.fury.io/py/dataframeit)
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Tests](https://github.com/bdcdo/dataframeit/actions/workflows/tests.yml/badge.svg)](https://github.com/bdcdo/dataframeit/actions/workflows/tests.yml)

Expand Down
2 changes: 1 addition & 1 deletion docs/en/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<div class="badges">
<a href="https://pypi.org/project/dataframeit/"><img src="https://badge.fury.io/py/dataframeit.svg" alt="PyPI version"></a>
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" alt="Python 3.10+"></a>
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.11+-blue.svg" alt="Python 3.11+"></a>
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
</div>

Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<div class="badges">
<a href="https://pypi.org/project/dataframeit/"><img src="https://badge.fury.io/py/dataframeit.svg" alt="PyPI version"></a>
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.10+-blue.svg" alt="Python 3.10+"></a>
<a href="https://www.python.org/downloads/"><img src="https://img.shields.io/badge/python-3.11+-blue.svg" alt="Python 3.11+"></a>
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
</div>

Expand Down
10 changes: 5 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ version = "0.10.0"
description = "Enrich DataFrames with LLM-based text analysis. Extract structured information from text with Pydantic."
readme = "README.md"
license = "MIT"
requires-python = ">=3.10"
requires-python = ">=3.11"
authors = [
{ name = "Bruno da Cunha de Oliveira" }
]
Expand Down Expand Up @@ -41,7 +41,6 @@ classifiers = [
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
Expand Down Expand Up @@ -87,7 +86,8 @@ codex = [
]
polars = [
"polars>=1.0",
"pyarrow>=10",
# A 10.0.0 não tem wheel para Python 3.11, e a compilação do fonte falha.
"pyarrow>=10.0.1",
]
excel = [
"openpyxl>=3.1",
Expand All @@ -111,7 +111,7 @@ all = [
"langchain-exa>=1.0.0",
"claude-agent-sdk>=0.1.48",
"polars>=1.0",
"pyarrow>=10",
"pyarrow>=10.0.1",
"openpyxl>=3.1",
]
dev = [
Expand Down Expand Up @@ -145,7 +145,7 @@ include = [
packages = ["src/dataframeit"]

[tool.ruff]
target-version = "py310"
target-version = "py311"
line-length = 100

[tool.ruff.lint]
Expand Down
2 changes: 1 addition & 1 deletion src/dataframeit/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -2740,7 +2740,7 @@ def process_single_row(row_data: tuple) -> dict:
# a retomada. Como 'error', o resume=True a preservaria.
try:
futures[executor.submit(process_single_row, row)] = row
except Exception as e: # noqa: BLE001, PERF203 (ver o comentário acima)
except Exception as e: # noqa: BLE001 (ver o comentário acima)
with lock:
token_stats.setdefault("abort", _error_text(e))
abort_event.set()
Expand Down
2 changes: 1 addition & 1 deletion src/dataframeit/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ def is_complex_type(field_type: object) -> bool:
args = get_args(field_type)
return any(is_complex_type(arg) for arg in args if arg is not type(None))

# types.UnionType para sintaxe X | Y (Python 3.10+)
# types.UnionType para sintaxe X | Y
if isinstance(field_type, types.UnionType):
args = get_args(field_type)
return any(is_complex_type(arg) for arg in args if arg is not type(None))
Expand Down
3 changes: 2 additions & 1 deletion tests/test_tipo_de_retorno.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from typing import assert_type

import pandas as pd
import polars as pl
from pydantic import BaseModel
from typing_extensions import assert_type

from dataframeit import dataframeit

Expand Down
Loading