Skip to content

chore(tooling): adopt pekral checkers, ai-olympus and supported PHP versions - #48

Merged
pekral merged 11 commits into
masterfrom
chore/pekral-tooling
Nov 12, 2026
Merged

pekral merged 11 commits into
masterfrom
chore/pekral-tooling

Conversation

@pekral

@pekral pekral commented Nov 12, 2026 •

Copy link
Copy Markdown
Collaborator

TL;DR

Balíček přechází na nástroje pekral (phpcs-rules, phpstan-rules, rector-rules) a na pekral/ai-olympus. Podporuje jen aktuálně udržované verze PHP: 8.2–8.5. Kód je upravený tak, aby všechny checkery prošly, a přitom zůstal kompatibilní s PHP 8.2.

Změny

Nástroje (dev závislosti)

  • Přidáno: pekral/ai-olympus ^0.4, pekral/phpcs-rules, pekral/phpstan-rules, pekral/rector-rules (všechny dev-master, jako v oficiálních repozitářích) a rector/rector ^2.8.
  • PHPStan ^1.10 → ^2.1 (deprecation-rules ^2.0, phpunit ^2.0). Úroveň max, analyzuje src i tests, rozsah PHP 8.2–8.5.
  • fzaninotto/faker (opuštěný, composer audit selhával) → oficiální nástupce fakerphp/faker ^1.24 se stejným API.
  • Odebráno: phing/phing (+ build.xml), slevomat/coding-standard (teď přichází přes phpcs-rules), phpstan/phpstan-strict-rules (teď přes phpstan-rules) a php-parallel-lint.
  • ruleset.xml dědí vendor/pekral/phpcs-rules/ruleset.xml s php_version 80200. rector.php importuje sadu pekral s PhpVersion::PHP_82. Nástroje tak nenavrhnou syntaxi novější než 8.2.
  • Composer skripty: check, fix, build, phpcs-check, rector-check, analyse, test, test:integration, security-audit, composer-normalize-check, ai-olympus:install.
  • ai-olympus: plugin je povolený v allow-plugins. Vygenerované .claude/, .codex/, .agents/ a AGENTS.md jsou v .gitignore. Po composer install je obnovíš příkazem composer ai-olympus:install.

GitHub Actions (podle pekral/phpcs-rules ci.yml a pekral/rector-rules pr.yml)

  • Starý build.yml (phing, PHP 8.0, jen push) je nahrazený souborem checks.yml, který běží na push i PR do master.
  • Job checks na PHP 8.4 a 8.5 spouští security audit, composer normalize, PHPCS, Rector, PHPStan a unit testy.
  • Job runtime na PHP 8.2 a 8.3 validuje composer.json, ověří, že runtime závislosti jdou na dané verzi nainstalovat (bez require-dev, které vyžaduje 8.4+), a lintuje src/.

Úpravy kódu kvůli checkerům

  • Zúžení typů u netypovaných JSON dat z API (ResponseFactory, ResponseHydrator, Client). Duplicitní logika v ResponseHydrator je sloučená do privátních metod.
  • ResponseFactory::createFromOutput je rozdělená na menší privátní metody (status kódy přes match), chování zůstává stejné.
  • tests/Config.php už nedědí z odstraněné třídy Consistence\ObjectPrototype. Kvůli tomu dosud na master padaly všechny testy v ClientTest.
  • phpunit.xml ukazoval testsuite na . (včetně vendor/) a coverage na ../src. Opraveno na tests a src.
  • Rector/PHPCS: readonly vlastnosti a třídy (PHP 8.2), pojmenované argumenty, abecedně seřazené klíče polí, kde na pořadí nezáleží.

Opravy z code review

  • Ověření TLS se při přihlášení přes session vypínalo i při verifySSLCertificate: true. Session token tak byl vystavený útoku MITM. Opraveno.
  • CompanyClient nepředával debugMode rodičovské třídě, takže ladění u backup()/restore() nefungovalo. Opraveno.
  • Sestavení cURL voleb je v nové třídě CurlOptionsFactory (vstup CurlRequest DTO). HttpClient jde do Client předat, takže je celá HTTP vrstva testovatelná bez sítě.
  • Nové unit testy pokrývají všech 197 změněných spustitelných řádků v src/ (měřeno PCOV). Celkem 70 unit testů, prochází i na PHP 8.2.35.
  • Dev závislost phpstan/phpstan-mockery ^2.0.

Opravené chyby (nalezené PHPStanem)

  • CompanyClient::backup() a restore() volaly neexistující Method::get(...), zbytek po přechodu na enumy, a padaly na fatal error. Teď používají Method::GET a Method::PUT.
  • SearchQueryOperator: převod operátorů závisel na pořadí klíčů pole. Nově se používá strtr(), které vždy nahrazuje nejdelší shodu (<= před <) bez ohledu na pořadí.
  • CURLOPT_HTTPAUTH dostával true/false. Teď dostává CURLAUTH_BASIC/0 (hodnoty se nemění). CURLOPT_SSL_VERIFYHOST dostává 2/0.

Merge danger

  • Dveře: two-way (revert commitu vrátí původní stav).
  • Dopad na uživatele balíčku:
    • minimální PHP zůstává ^8.2, veřejné API se nemění;
    • když nejde serializovat data k odeslání, save() a další volání nově vyhodí EcomailFlexibeeRequestFail (původní JsonException je v previous) místo tichého odeslání false;
    • ověření TLS certifikátu se už při přihlášení přes session (authSessionId) nevypíná. Řídí se jen volbou verifySSLCertificate. Kdo session přihlášení používá proti serveru s neplatným certifikátem, musí předat verifySSLCertificate: false;
    • Client a CompanyClient mají nový volitelný poslední parametr ?HttpClient $httpClient, HttpClient už není final;
    • prázdná URL vyhodí EcomailFlexibeeRequestFail;
    • u Response::getStatistics() se PHPDoc změnil z array<string> na array<mixed>, protože to odpovídá skutečným datům.
  • Vědomé výjimky z pravidel (cílené v ruleset.xml, ne anotace v kódu):
    • Config::verifySSLCertificate() (název metody, veřejné API);
    • délka třídy Client (vstupní bod balíčku, rozdělení by byl BC break).
  • rakit/validation je odstraněný (opuštěný balíček, na PHP 8.4+ vypisoval deprecations). Používal se jen na kontrolu kódu (max. 20 znaků, velká písmena). Tu teď ParameterValidator dělá přes mb_strlen()/mb_strtoupper(). BC break: ParameterValidator už nedědí z Rakit\Validation\Validator a EcomailFlexibeeInvalidRequestParameter je obyčejná výjimka bez rakit parametru.
  • Deprecations se v testech už globálně nepotlačují. tests/bootstrap.php načte jen Purl\AbstractPart s vypnutým E_DEPRECATED, dokud purl neodstraní refactor(http): build FlexiBee URLs natively instead of ecomailcz/purl #51. Deprecations z vlastního kódu se v testech projeví.

Testování

  • composer check (normalize, PHPCS, Rector, PHPStan max, unit testy) lokálně na PHP 8.5: ✅
  • Unit testy na PHP 8.2.35 v Dockeru (runtime závislosti + PHPUnit 9): ✅ 70/70
  • php -l celého src/ na PHP 8.2 a 8.3: ✅
  • Integrační testy (ClientTest, skupina integration, běží proti živému demo.flexibee.eu) nejsou v CI. Na této větvi padá stejná sada 16 testů jako na master, ověřeno srovnáním na master s opraveným tests/Config.php. Nejde tedy o regresi. Demo přístupy winstrom/winstrom jsou podle dokumentace ABRA Flexi stále platné a server odpovídá. Pády způsobuje aktuální stav demo dat a API a je potřeba je řešit samostatně. Spuštění: composer test:integration.
  • Odstraněný test: testRunBackendProcesses. Byl trvale přeskočený (markTestSkipped a za ním nedosažitelný kód), a s ním i jím jediným volaná checkResponseStructure().
  • Nové testy: ano, unit testy pro ResponseFactory, ResponseHydrator, CurlOptionsFactory, HttpClient, Client (offline přes mock HttpClient) a CompanyClient.

Zdroje

…ersions

Replace phing, the local slevomat ruleset and PHPStan 1 with
pekral/phpcs-rules, pekral/phpstan-rules (PHPStan 2, level max) and
pekral/rector-rules, all pinned to the PHP 8.2 minimum. Install
pekral/ai-olympus as a dev dependency; its generated agent files are
git-ignored.

Make the code pass the new checkers: narrow untyped JSON data, fix the
Method::get() calls left over from the enum migration, make operator
conversion independent of key order, and point phpunit.xml at tests/.

Replace the PHP 8.0 build workflow with checks on PHP 8.4/8.5 and a
runtime lint/resolve job on PHP 8.2/8.3.
@pekral
pekral marked this pull request as ready for review November 12, 2026 13:21
@pekral

pekral commented Nov 12, 2026 •

Copy link
Copy Markdown
Collaborator Author

Code Review

Status: clean
Counts: Critical 0 · Moderate 0 · Minor 0 · Refactoring 0
Last updated: 2026-11-12T14:25:19Z (head 3d71328)
Issue tracker summary: no linked issue — issue summary skipped


Summary: 0 Critical · 0 Moderate · 0 Minor · 0 Refactoring · assignment conformance: no linked issue · reviewer comments: none · no linked issue — issue summary skipped

CR finding: "Refactored HTTP/response layer has no test coverage in CI"
(part 1 of 2: the seams the tests need).

- Client and CompanyClient accept an optional HttpClient, so tests can
  replace the network boundary with a double.
- HttpClient is no longer final/readonly: Mockery cannot double either.
- cURL options are built by the new CurlOptionsFactory as a plain array,
  which tests can assert without executing a request. Behavior is
  unchanged.
…client

CompanyClient built its parent Client without the debug flag from the
given Config, so debug mode (request headers in Forbidden errors) never
worked for company-level calls such as backup() and restore().
CR finding: "TLS verification is forced off whenever session auth is used".

Requests carrying X-authSessionId disabled CURLOPT_SSL_VERIFYPEER and
CURLOPT_SSL_VERIFYHOST even when the caller asked for verification,
exposing the session token to a man-in-the-middle. Verification now
follows the verifySSLCertificate option for every auth method.
CR finding: "JSON encoding failure now escapes as a non-domain JsonException".

Post fields that cannot be JSON-encoded (e.g. invalid UTF-8) now raise
EcomailFlexibeeRequestFail with the JsonException as previous, so callers
handling the package exceptions also handle this failure.
CR finding: "Empty-URL guard hidden inside a curl_setopt() argument".

The check now runs first, before any cURL option is built, instead of
being an inline throw expression inside the option list.
CR finding: "Refactored HTTP/response layer has no test coverage in CI"
(part 2 of 2: the tests).

Unit tests for ResponseFactory, ResponseHydrator, CurlOptionsFactory,
HttpClient (through a local file:// fixture) and Client (through a
Mockery double of HttpClient). Every line changed in src/ by this pull
request is now covered by `composer test`.
CR finding (iteration 2): CurlOptionsFactory::create() took six
parameters, above the four-parameter limit in the PHP core standards.
The request part now travels as the CurlRequest DTO; the public
HttpCurlBuilder::build() signature stays unchanged.
@pekral

pekral commented Nov 12, 2026 •

Copy link
Copy Markdown
Collaborator Author

CR status — converged

Status: converged · Critical 0 · Moderate 0 · Minor 0

Resolved items

  • E_DEPRECATED is silenced for the whole test run (Minor 1, previously deferred)
    • Why: the global error_reporting override in phpunit.xml also hid deprecations from this package's own code.
    • Reason: the abandoned rakit/validation (and ecomailcz/purl) emit PHP 8.4+ deprecations when loaded.
    • Solution: rakit/validation is replaced by a native check in ParameterValidator; the global override is removed; tests/bootstrap.php loads only Purl\AbstractPart with E_DEPRECATED off until refactor(http): build FlexiBee URLs natively instead of ecomailcz/purl #51 removes purl.
    • Commit: 3d71328 — fix(validator): replace rakit/validation and stop silencing deprecations

CR finding (Minor): "E_DEPRECATED is silenced for the whole test run".

The global error_reporting override in phpunit.xml hid deprecations from
this package's own code. Its main source, the abandoned rakit/validation,
was used for a single rule (code: max 20 characters, uppercase), which
ParameterValidator now checks with mb_strlen()/mb_strtoupper(). The
override is gone; tests/bootstrap.php only loads Purl\AbstractPart with
E_DEPRECATED off until ecomailcz/purl is removed (#49).

BREAKING CHANGE: ParameterValidator no longer extends
Rakit\Validation\Validator and EcomailFlexibeeInvalidRequestParameter no
longer takes a Rakit\Validation\Validation; it is a plain exception.
@pekral
pekral merged commit 4852ea6 into master Nov 12, 2026
4 checks passed
@pekral
pekral deleted the chore/pekral-tooling branch November 12, 2026 14:26
@pekral
pekral restored the chore/pekral-tooling branch November 12, 2026 14:26
@pekral
pekral deleted the chore/pekral-tooling branch November 12, 2026 14:27
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