Metadata-Version: 2.4
Name: uf90
Version: 0.1.0
Summary: Mathematical Unicode notation for portable Fortran and fpm workflows
Author: Nathanael Nardoto Batista
License-Expression: MIT
Project-URL: Homepage, https://github.com/nnardoto/uf90
Project-URL: Repository, https://github.com/nnardoto/uf90.git
Project-URL: Issues, https://github.com/nnardoto/uf90/issues
Project-URL: Changelog, https://github.com/nnardoto/uf90/blob/main/CHANGELOG.md
Keywords: fortran,fpm,unicode,preprocessor,scientific-computing
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Software Development :: Build Tools
Classifier: Topic :: Software Development :: Pre-processors
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: test
Requires-Dist: pytest>=7; extra == "test"
Dynamic: license-file

# uf90

[![CI](https://github.com/nnardoto/uf90/actions/workflows/ci.yml/badge.svg)](https://github.com/nnardoto/uf90/actions/workflows/ci.yml)
[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

`uf90` traduz identificadores matemáticos escritos em arquivos `*.f90u` para
Fortran ASCII portátil. O resultado é um arquivo `*.f90` comum, compilável com
`fpm` e compiladores Fortran existentes.

```fortran
! src/physics.f90u
program physics
  real :: α, Δt, T₁₀₀, c²
  print *, "α =", α
end program physics
```

gera:

```fortran
! src/physics.f90
program physics
  real :: uc_alpha, uc_deltat, T_100, c_p2
  print *, "α =", uc_alpha
end program physics
```

Strings e comentários são preservados por padrão.

## Instalação

Depois da primeira publicação no PyPI, a instalação recomendada será:

```bash
pipx install uf90
```

Enquanto a primeira release não estiver publicada, instale diretamente do
GitHub:

```bash
pipx install git+https://github.com/nnardoto/uf90.git
```

Para desenvolvimento local:

```bash
python3 -m pip install -e '.[test]'
```

A instalação fornece o comando `uf90` e o plugin `fpm-uf90`. O `fpm`
descobre plugins pelo padrão de executáveis `fpm-<nome>`; com o diretório de
scripts do Python no `PATH`, o plugin pode ser chamado como `fpm uf90`.

## Uso com fpm

Em um projeto que contenha `fpm.toml` e fontes `*.f90u`:

```bash
fpm uf90 build
fpm uf90 run
fpm uf90 test
fpm uf90 install --prefix ~/.local
```

O plugin executa duas etapas:

1. sincroniza recursivamente os arquivos `*.f90u` com os respectivos `*.f90`;
2. encaminha o comando e seus argumentos para o executável `fpm` instalado.

Por exemplo, `fpm uf90 build --profile release` equivale a:

```bash
uf90 sync
fpm build --profile release
```

O comando antigo continua disponível para compatibilidade:

```bash
uf90 fpm build
fpm-unicode build
```

## Comandos diretos

```bash
uf90 sync [diretório]
uf90 check [diretório]
uf90 translate arquivo.f90u [-o arquivo.f90]
uf90 fpm <comando-fpm> [argumentos]
```

`uf90 sync` mantém o cache incremental `.uf90-manifest.json`. `uf90 check`
não modifica arquivos e retorna status 1 quando alguma saída precisa ser
regenerada.

## Exemplos executáveis

A pasta [`examples`](examples/) contém seis projetos `fpm` progressivos, de
escalares a uma simulação numérica multifonte. Para traduzir, compilar e
executar todos:

```bash
python3 examples/run_all.py
```

## Mapeamento atual

- letras gregas: `α` → `uc_alpha`, `Δt` → `uc_deltat`;
- subscritos numéricos: `T₁₀₀` → `T_100`;
- subscritos alfanuméricos: `Eₙ` → `E_n`, `Aᵢⱼ` → `A_ij`,
  `vₙ₁` → `v_n1`;
- sobrescritos: `c²` → `c_p2`.

O Unicode não define uma forma subscrita para todas as letras. O `uf90`
aceita as formas latinas disponíveis `ₐ ₑ ₕ ᵢ ⱼ ₖ ₗ ₘ ₙ ₒ ₚ ᵣ ₛ ₜ ᵤ ᵥ ₓ`, além de
`ₔ` (schwa), dos dígitos e das variantes gregas `ᵦ ᵧ ᵨ ᵩ ᵪ`.

Nesta etapa o projeto é deliberadamente um tradutor fonte-a-fonte. Ele não
introduz semântica nova na linguagem e não depende de LLVM, MLIR ou de um
compilador específico.

## Publicação

O procedimento de release com PyPI Trusted Publishing está documentado em
[`docs/RELEASING.md`](docs/RELEASING.md).
