Skip to content

fix(codegen): sanitiza type-hints de $ref, lint sintático fail-loud e remove spec duplicada — v3.4.1 - #33

Merged
andrenfe merged 1 commit into
masterfrom
fix/harden-openapi-generator
Aug 1, 2026
Merged

fix(codegen): sanitiza type-hints de $ref, lint sintático fail-loud e remove spec duplicada — v3.4.1#33
andrenfe merged 1 commit into
masterfrom
fix/harden-openapi-generator

Conversation

@andrenfe

Copy link
Copy Markdown
Member

Change openspec: harden-openapi-generator (onda 2 da review OpenAPI ↔ SDK, P0-3)

Por quê

O gerador emitia PHP sintaticamente inválido e falhava em silêncio: 79 arquivos em 4 namespaces de src/Generated/ (ContribuintesV2 41, ConsultaNfConsumidorV3 41, ConsumerInvoiceV3 41, ConsultaCteV2 6 — hits) carregavam type-hints com ponto, ex.:

public ?DFeTech.TaxPayers.Resources.MunicipalTaxResourceItem $municipalTax = null,

Erro de parse fatal se autoload classmap-authoritative, opcache.preload ou análise estática do consumidor tocasse a classe. Latente porque nada em runtime usa Nfe\Generated\* (e o PHPStan exclui o diretório) — por isso patch.

O que muda

  1. Fix na causa raizTypeMapper::resolveRef() agora aplica a mesma sanitização de identificador do nome de classe, via helper único NameMapper::phpIdentifier() (classe e hint nunca mais divergem). Cobre ref direto, nullable, oneOf e items de array.
  2. Lint sintático fail-loudscripts/generate.php valida cada arquivo emitido com token_get_all(…, TOKEN_PARSE) in-process e falha listando os ofensores, tanto no generate quanto no --check (o CI generate-check passa a pegar PHP inválido embarcado). A classe inteira do bug vira falha de build.
  3. Fim do skip silencioso — sumário por spec no output: Swagger 2.0 (5 specs, fora do alcance do gerador por design) = informativo; OpenAPI 3.x com 0 schemas = aviso destacado (possível regressão de sync), sem falhar — quem falha é o lint.
  4. Spec duplicada removidaopenapi/consumer-invoice-v3.yaml era byte-idêntica a consulta-nf-consumidor-v3.yaml (1 linha x-displayName); saem também os 49 arquivos de src/Generated/ConsumerInvoiceV3/. Nenhum código referenciava o namespace.
  5. Regeneração completa — 576 arquivos; grep de hint pontuado: zero; generate-check verde.

Testes

  • Novos: TypeMapperTest (6), LinterTest (3), GeneratorSummaryTest (2)
  • tests/Generator: 30 passed; suite completa: 275 passed (única falha local é a conhecida CurlTransportFailurePhaseTest, ambiental — passa no CI)
  • PHPStan e php-cs-fixer verdes

Validação

Mudança 100% offline (sem sondas de API — nada de rede muda).

Release

src/Version.php3.4.1 dentro deste PR (release.yml confere Version vs tag). Tag v3.4.1 após o merge.

… remove spec duplicada — v3.4.1

- TypeMapper::resolveRef() passa pela mesma sanitização de identificador do
  nome de classe (novo NameMapper::phpIdentifier(), fonte única) — corrige
  79 arquivos de PHP inválido em 4 namespaces de src/Generated/
- scripts/generate.php: lint sintático in-process (token_get_all TOKEN_PARSE)
  de todo arquivo emitido, no generate e no --check; falha listando ofensores
- Sumário por spec no generate: Swagger 2.0 informativo, OpenAPI 3.x com
  0 schemas vira aviso destacado (fim do skip silencioso)
- Remove openapi/consumer-invoice-v3.yaml (duplicata byte-idêntica de
  consulta-nf-consumidor-v3.yaml) e src/Generated/ConsumerInvoiceV3/
- Regeneração completa: 576 arquivos, zero hints pontuados
- Version 3.4.1 + CHANGELOG (patch: nada em runtime usa Nfe\Generated\*)
@andrenfe
andrenfe merged commit 5b08c73 into master Aug 1, 2026
9 checks passed
@andrenfe
andrenfe deleted the fix/harden-openapi-generator branch August 1, 2026 00:29
@andrenfe andrenfe self-assigned this Aug 1, 2026
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.

1 participant