Skip to content
Open
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
2 changes: 1 addition & 1 deletion .github/workflows/auto_merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
auto-merge:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- uses: ahmadnassri/action-dependabot-auto-merge@v2
with:
github-token: ${{ secrets.DEPENDABOT_AUTOMERGE }}
8 changes: 4 additions & 4 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: docs

permissions:
contents: read
contents: write

on:
release:
Expand All @@ -11,14 +11,14 @@ jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- name: Set up Python 3.13
uses: actions/setup-python@v5
uses: actions/setup-python@v7
with:
python-version: 3.13
- name: Install dependencies
run: make install-test
- name: Install mkdocs
run: pip install -qU mkdocs-material mkdocstrings
run: python -m pip install -r requirements-docs.txt
- name: Deploy Github Page
run: mkdocs gh-deploy --force
40 changes: 40 additions & 0 deletions .github/workflows/openapi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: update-openapi-client

on:
workflow_dispatch:
schedule:
- cron: '17 12 * * 1'

permissions:
contents: write
pull-requests: write

jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: '3.13'
- name: Install generator dependencies
run: python -m pip install -r requirements.txt -r requirements-test.txt
- name: Generate the SDK from the current OpenAPI document
run: python scripts/generate_openapi.py
- name: Verify generated client
run: |
make lint
pytest -x
- name: Create update pull request
uses: peter-evans/create-pull-request@v8
with:
branch: codex/update-openapi-client
delete-branch: true
commit-message: 'chore: update generated OpenAPI client'
title: 'chore: update generated OpenAPI client'
body: |
Automated SDK update generated from Facturapi's public OpenAPI
document. CI verifies formatting, typing, and tests before merge.
labels: |
automated
openapi
44 changes: 29 additions & 15 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,27 +1,41 @@
name: release

permissions:
contents: read

on:
release:
types: [published]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Set up Python
uses: actions/setup-python@v7
with:
python-version: '3.13'
- name: Build distributions
run: |
python -m pip install --upgrade build twine
python -c "import os, runpy; version = runpy.run_path('facturapi/version.py')['__version__']; assert os.environ['GITHUB_REF_NAME'] == f'v{version}', 'release tag must match package version'"
python -m build
python -m twine check dist/*
- uses: actions/upload-artifact@v7
with:
name: python-package-distributions
path: dist/

publish-pypi:
needs: build
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/facturapi
permissions:
id-token: write
steps:
- uses: actions/checkout@master
- name: Set up Python 3.8
uses: actions/setup-python@v2.2.2
- uses: actions/download-artifact@v8
with:
python-version: 3.8
- name: Install dependencies
run: pip install -qU setuptools wheel twine
- name: Generating distribution archives
run: python setup.py sdist bdist_wheel
- name: Publish distribution 📦 to PyPI
name: python-package-distributions
path: dist/
- name: Publish distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
with:
user: __token__
password: ${{ secrets.pypi_password }}
22 changes: 13 additions & 9 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- name: Set up Python
uses: actions/setup-python@v5
uses: actions/setup-python@v7
with:
python-version: 3.13
- name: Install dependencies
Expand All @@ -23,11 +23,11 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12", "3.13"]
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
Expand All @@ -37,10 +37,13 @@ jobs:

coverage:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
- name: Setup Python
uses: actions/setup-python@v5
uses: actions/setup-python@v7
with:
python-version: 3.13
- name: Install dependencies
Expand All @@ -50,8 +53,9 @@ jobs:
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./coverage.xml
use_oidc: true
slug: ${{ github.repository }}
files: ./coverage.xml
flags: unittests
name: codecov-umbrella
fail_ci_if_error: true
8 changes: 8 additions & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
include LICENSE
include README.md
include README.es-MX.md
include requirements-docs.txt
recursive-include docs *.md *.png *.svg
recursive-include examples *.py
recursive-include scripts *.py
recursive-include tests *.py *.yaml
25 changes: 17 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ SHELL := bash
PATH := ./venv/bin:${PATH}
PYTHON = python3.13
PROJECT = facturapi
isort = isort $(PROJECT) tests setup.py examples
black = black -S -l 79 --target-version py313 $(PROJECT) tests setup.py examples
isort = isort $(PROJECT) tests scripts setup.py examples
black = black -S -l 79 --target-version py313 $(PROJECT) tests scripts setup.py examples


all: test
Expand All @@ -21,15 +21,21 @@ install-test: install
test: clean install-test lint
pytest

generate:
python scripts/generate_openapi.py

generate-check:
python scripts/generate_openapi.py --check

format:
$(isort)
$(black)

lint:
flake8 $(PROJECT) tests setup.py
flake8 $(PROJECT) tests scripts setup.py
$(isort) --check-only
$(black) --check
mypy $(PROJECT) tests
mypy $(PROJECT) tests scripts

clean:
rm -rf `find . -name __pycache__`
Expand All @@ -46,9 +52,12 @@ clean:
rm -rf build
rm -rf dist

release: test clean
python setup.py sdist bdist_wheel
twine upload dist/*
build: clean
python -m build
python -m twine check dist/*

release: test build
@echo "Create a GitHub release to publish with PyPI Trusted Publishing."


.PHONY: all install-test test format lint clean release
.PHONY: all install-test test generate generate-check format lint clean build release
62 changes: 21 additions & 41 deletions README.es-MX.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,11 @@
FacturAPI – Librería de Python
</h1>

![test](https://github.com/cuenca-mx/facturapi-python/workflows/test/badge.svg)
[![codecov](https://codecov.io/gh/cuenca-mx/facturapi-python/branch/main/graph/badge.svg?token=U89Q4PR339)](https://codecov.io/gh/cuenca-mx/facturapi-python)
![test](https://github.com/FacturAPI/facturapi-python/actions/workflows/test.yml/badge.svg)
[![PyPI version](https://badge.fury.io/py/facturapi.svg)](https://badge.fury.io/py/facturapi)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)

Esta es una librería de Python para https://www.facturapi.io

**⚠️Advertencia: Esta librería NO es oficial y aún sigue en desarrollo. No es un producto final.⚠️**
SDK oficial de Python para https://www.facturapi.io

FacturAPI facilita la creación de facturas válidas para desarrolladores en México (Facturas Electrónicas o CFDI).

Expand All @@ -30,39 +27,28 @@ pip install facturapi

## 🚀 Primeros pasos

### Autenticación con API Key
### Cliente recomendado
Asegurate de crear una cuenta gratis en [FacturAPI](https://www.facturapi.io) y tener acceso a tus llaves de test y live.

Hay dos formas de configurar tus llaves para usar la librería:

1. **Variable de entorno:** Configura una variable de entorno y la librería usará la llave automáticamente:

```bash
export FACTURAPI_KEY=TU_API_KEY
```

2. **Usando el método `configure`:** Puedes configurar tu llave en el código usando el método `configure`:

```python
from facturapi import configure

configure(api_key='TU_API_KEY')
```

### Crea un Cliente
Después de configurar tu llave, puedes usar la librería para realizar varias acciones en los recursos de FacturAPI, por ejempo crear un Cliente:
El cliente por instancia incluye todos los métodos de la referencia de API:

```python
import facturapi
from facturapi.resources.customers import CustomerRequest, CustomerUpdateRequest

customer = facturapi.Customer.create(data=CustomerRequest(
legal_name='Frida Kahlo',
tax_id='ABCD111111CBA',
email='frida_kahlo@test.com',
))
from facturapi import Facturapi

facturapi = Facturapi("sk_test_...")
customer = facturapi.customers.create({
"legal_name": "Frida Kahlo",
"tax_id": "ABCD111111CBA",
"tax_system": "601",
"email": "frida@example.com",
"address": {"zip": "01234", "country": "MEX"},
})
```

También puedes omitir la llave y usar la variable de entorno
`FACTURAPI_KEY`. La API anterior basada en `facturapi.Customer` y
`facturapi.Invoice` sigue disponible por compatibilidad.

Para más detalles en los datos necesarios para crear un Cliente y otros recursos, revisa la [documentación](http://docs.facturapi.io).

Puedes encontrar más ejemplos de código de cómo crear y usar recursos en el directorio de [examples](./examples/).
Expand All @@ -71,7 +57,8 @@ Puedes encontrar más ejemplos de código de cómo crear y usar recursos en el d

Encuentra más información de Facturapi y sus recursos en sus [docs](http://docs.facturapi.io).

O para más detalles técnicos y de la librería, entra a la [documentación](https://cuenca-mx.github.io/facturapi-python/) de `facturapi-python`.
La capa de recursos se genera automáticamente desde el documento OpenAPI de
Facturapi. El workflow semanal propone un pull request cuando la API cambia.

## 💡 Contribuye
### ¿Encontraste un bug?
Expand All @@ -84,12 +71,5 @@ No olvides mantener la cobertura del código arriba de 98%, nos encanta tener c
### Contactos:
- **Facturapi:** contacto@facturapi.io

- **Cuenca:** dev@cuenca.com

---
Desarrollado y mantenido con 💙 por [Cuenca](https://cuenca.com/)
<p align="center">
<a href="https://cuenca.com/">
<img alt="Cuenca Logo" src="./docs/images/cuenca-full-logo.svg" width="200" />
</a>
</p>
Desarrollado y mantenido por [Facturapi](https://facturapi.io/).
Loading