Repository navigation
fix: v3.5.1 — gerador lê as specs atuais, enum negativo (#39), deprecations (#36) e gate de php -l - #42
Open
andrenfe wants to merge 8 commits into
Open
fix: v3.5.1 — gerador lê as specs atuais, enum negativo (#39), deprecations (#36) e gate de php -l#42andrenfe wants to merge 8 commits into
andrenfe wants to merge 8 commits into
Conversation
O teste de FailurePhase supunha que o TLD .invalid nunca resolve. Em rede com DNS curinga o host resolve e o teste falha. Agora ele reserva uma porta efêmera livre em 127.0.0.1, libera e conecta no IP literal: a conexão é recusada (CURLE_COULDNT_CONNECT, errno 7) de forma determinística e offline, e a classificação continua sendo ConnectionNotEstablished.
O lint do gerador usa token_get_all, que só verifica sintaxe e deixa passar erros de compilação, como case de enum duplicado (#39), e deprecations de assinatura (#36). O novo scripts/lint.sh roda `php -l` com E_ALL em cada arquivo de src/ e reprova qualquer saída diferente de "No syntax errors". Entra como job próprio no CI (PHP 8.2), como passo do verify da release e como `composer lint` / `make lint`. Nesta revisão o gate ainda falha: 1 fatal (#39) e 4 deprecations (#36), corrigidos nos commits seguintes.
As specs atuais de NF-e v2, v3 e RTC de produto (texto "Indisponível no momento" dos eventos de autoridade) trazem descriptions entre aspas com linhas de continuação na coluna 0. PyYAML e js-yaml aceitam; o symfony/yaml recusa com "Malformed inline YAML string", porque o YAML 1.2 exige que essas linhas fiquem indentadas além do nó pai. O SpecLoader agora tenta o parse do arquivo como está e, só se o symfony/yaml recusar, tenta uma segunda vez depois de reindentar as linhas de continuação de escalares entre aspas que estejam na coluna da chave ou à esquerda dela (YamlNormalizer). Dentro de string entre aspas, o espaço inicial da continuação não é conteúdo, então o valor lido não muda. Blocos | e >, comentários e strings que fecham na mesma linha não são tocados. Spec que já era lida não passa pelo normalizador, e o hash do cabeçalho continua sendo o dos bytes em disco. O resumo do `composer generate` informa quantas linhas foram reindentadas por spec, para o reparo nunca ficar silencioso e o caso ser reportado ao time de docs. Nas 3 specs atuais da fonte, o documento lido é idêntico ao do PyYAML.
… em colisão (#39) O gerador descartava o sinal ao nomear o case: 1 e -1 viravam Value_1, e ConsultaCteV2\DFe_NetCore_Domain_Enums_EntityStatus dava erro fatal ("Cannot redefine class constant") no carregamento, em `php -l` e em --classmap-authoritative. Valores numéricos negativos agora recebem o prefixo Value_Minus (-1 vira Value_Minus1), seguindo o padrão Value_<n> já usado nos positivos. O único valor negativo nas specs vendoradas é esse -1, então nenhum outro case muda de nome. O EnumCompiler passa a recusar, com erro que cita spec, schema e valores, dois valores que gerem o mesmo nome de case ou o mesmo valor de backing, em vez de emitir um enum que não compila. Regerado a partir das specs vendoradas: só o enum do #39 muda.
…atório (#36) Propriedade obrigatória e nullable vira `?T $x = null` entre as obrigatórias. Quando uma obrigatória não nullable vem depois, o PHP 8.1+ emite "Optional parameter declared before required parameter is implicitly treated as a required parameter". Isso acontecia em 3 DTOs de ConsultaNfeDistribuicaoV1 (Sucessonarequisio, Sucessonarequisio2 e Sucessonarequisio6). O SchemaCompiler agora remove o `= null` de todo parâmetro declarado antes de outro sem default. A ordem dos parâmetros não muda (quem chama posicionalmente não quebra) e o tipo `?T` continua. O default já era inalcançável: omitir o argumento, inclusive por nome, já lançava ArgumentCountError, e a Reflection já o tratava como não opcional (conferido em PHP 8.2, 8.3 e 8.4). Regerado a partir das specs vendoradas: só esses 3 arquivos mudam, nos 4 parâmetros apontados pelas deprecations.
VERSION estava em 3.4.1 enquanto src/Version.php e o Packagist dizem 3.5.0. Nada no repositório lê esse arquivo: scripts/release.sh só atualiza src/Version.php e o release.yml confere a tag contra src/Version.php. Como não está em export-ignore, ele vai no dist do Composer com valor defasado. Por ora só alinha; a remoção fica para decisão do mantenedor.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Descrição
Correções do gerador e da base que destravam a atualização das specs às APIs atuais. O resync das specs vem num PR seguinte; este PR não altera
openapi/.Diagnóstico de origem: um ensaio de resync com as specs atuais do
nfe/docsparou em três pontos. O gerador não lia 3 specs de NF-e, um enum gerado de CT-e dava erro fatal (#39) e um teste dependia do DNS da máquina.Corrigido
ConsultaCteV2\DFe_NetCore_Domain_Enums_EntityStatusdeclaravaValue_1duas vezes (para1e-1) e dava erro fatal ao carregar, emphp -le com--classmap-authoritative. Valores negativos agora viramValue_MinusN, seguindo o padrãoValue_<n>. O gerador passa a falhar, citando spec, schema e valores, quando dois valores geram o mesmo nome de case ou o mesmo valor de backing.ConsultaNfeDistribuicaoV1. Os DTOs declaravam parâmetro opcional antes de obrigatório. O gerador não emite mais esse default, que já era inalcançável. A ordem dos parâmetros e o tipo?stringnão mudam.nf-produto-v2,nf-produto-v3eproduct-invoice-rtc-v1passaram a ter esse formato. PyYAML e js-yaml aceitam, mas osymfony/yamlrecusava, e ocomposer generatenão rodava.composer generateinforma quantas linhas foram reindentadas.FailurePhaseindependente de DNS. O teste supunha que.invalidnunca resolve e falhava em rede com DNS curinga. Agora força conexão recusada numa porta livre de127.0.0.1.Adicionado
composer lint(scripts/lint.sh):php -lcomE_ALLem todosrc/, falhando em erro ou deprecation. Roda como job próprio no CI (PHP 8.2) e no verify da release. Pega o que o lint do gerador (token_get_all) deixava passar.Removido
VERSIONda raiz. Era resto da linha v2, dizia3.4.1e nada no repositório o lia. A versão vem só deNfe\Version::CURRENT.Versão
Version::CURRENTsobe para3.5.1e o CHANGELOG ganha a seção[3.5.1] — 2026-10-17.v3.5.1fica para depois do merge.Tipo de mudança
Arquivos gerados alterados: 4
Todos explicados: 1 pela #39 (o enum) e 3 pela #36 (os 4 parâmetros que geravam deprecation).
Validação (Docker)
composer stan: sem erros.composer cs: 0 arquivos a corrigir.composer generate:check: em sincronia.composer lint: 933 arquivos limpos. Antes das correções, falhava com 1 erro fatal (Fatal error na v3.5.0: enum gerado com case duplicado (ConsultaCteV2/DFe_NetCore_Domain_Enums_EntityStatus) #39) e 4 deprecations (DTOs gerados de ConsultaNfeDistribuicaoV1 emitem Deprecated em PHP 8.2 (parâmetro opcional antes de obrigatório) #36).composer generatecom as 3 specs atuais da fonte: 925 arquivos,php -llimpo.Compatibilidade
Sem quebra:
scripts/, fora do pacote distribuído.Fora deste PR
nfe/docs.nfe/docssobre as continuações em coluna 0. A tabela markdown dos eventos de autoridade vira uma linha só, porque dentro de aspas a quebra simples vira espaço; o certo é usar bloco|.Closes #39
Closes #36