diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 45f5bbf..50dee97 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -13,8 +13,25 @@ on:
jobs:
+ composer-normalize:
+ name: Composer normalization
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.4'
+ coverage: none
+ tools: composer-normalize
+ env:
+ fail-fast: true
+ - name: Composer normalize
+ run: composer-normalize --dry-run
+
phpcs:
- name: Code Style (phpcs)
+ name: Coding standards (phpcs)
runs-on: "ubuntu-latest"
steps:
- name: Checkout
@@ -22,7 +39,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
- php-version: '8.3'
+ php-version: '8.4'
coverage: none
tools: cs2pr, phpcs
env:
@@ -31,7 +48,7 @@ jobs:
run: phpcs -q --report=checkstyle | cs2pr
php-cs-fixer:
- name: Code style (php-cs-fixer)
+ name: Coding standards (php-cs-fixer)
runs-on: "ubuntu-latest"
steps:
- name: Checkout
@@ -39,7 +56,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
- php-version: '8.3'
+ php-version: '8.4'
coverage: none
tools: cs2pr, php-cs-fixer
env:
@@ -56,7 +73,7 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
- php-version: '8.3'
+ php-version: '8.4'
coverage: none
tools: composer:v2, phpstan
env:
@@ -80,7 +97,7 @@ jobs:
runs-on: "ubuntu-latest"
strategy:
matrix:
- php-version: ['8.2', '8.3']
+ php-version: ['8.2', '8.3', '8.4']
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -88,7 +105,7 @@ jobs:
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
- coverage: xdebug
+ coverage: none
tools: composer:v2
env:
fail-fast: true
@@ -104,4 +121,4 @@ jobs:
- name: Install project dependencies
run: composer upgrade --no-interaction --no-progress --prefer-dist
- name: Tests (phpunit)
- run: vendor/bin/phpunit --testsuite=complete --testdox --coverage-xml=build/coverage --coverage-clover=build/coverage/clover.xml --log-junit=build/coverage/junit.xml
+ run: vendor/bin/phpunit --testsuite=complete --testdox
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
new file mode 100644
index 0000000..48f17e1
--- /dev/null
+++ b/.github/workflows/docker.yml
@@ -0,0 +1,42 @@
+name: docker
+on:
+ release:
+ branches: [ "main" ]
+ types: [ "published" ]
+ tags: [ "v*" ]
+
+# Actions
+# docker/setup-buildx-action@v3 https://github.com/marketplace/actions/docker-setup-buildx
+# docker/login-action@v3 https://github.com/marketplace/actions/docker-login
+# docker/metadata-action@v5 https://github.com/marketplace/actions/docker-metadata-action
+# docker/build-push-action@v6 https://github.com/marketplace/actions/build-and-push-docker-images
+
+jobs:
+ docker:
+ name: Docker image
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Set application version
+ run: sed -i "s#@box_git_version@#${{ github.ref_name }}#" bin/*
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+ - name: Extract metadata for Docker
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: "${{ github.repository }}"
+ tags: "type=semver,pattern={{version}}"
+ - name: Build and push
+ uses: docker/build-push-action@v6
+ with:
+ context: .
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml
deleted file mode 100644
index 0bbedc7..0000000
--- a/.github/workflows/sonarcloud.yml
+++ /dev/null
@@ -1,109 +0,0 @@
-name: sonarcloud
-on:
- workflow_dispatch:
- push:
- branches: [ "main" ]
-
-# Actions
-# shivammathur/setup-php@v2 https://github.com/marketplace/actions/setup-php-action
-# sonarsource/sonarcloud-github-action@master https://github.com/marketplace/actions/sonarcloud-scan
-
-jobs:
-
- tests-coverage:
- name: Create code coverage
- runs-on: "ubuntu-latest"
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
- with:
- php-version: '8.3'
- coverage: xdebug
- tools: composer:v2
- env:
- fail-fast: true
- - name: Get composer cache directory
- id: composer-cache
- run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- - name: Cache dependencies
- uses: actions/cache@v4
- with:
- path: ${{ steps.composer-cache.outputs.dir }}
- key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
- restore-keys: ${{ runner.os }}-composer-
- - name: Install project dependencies
- run: composer upgrade --no-interaction --no-progress --prefer-dist
- - name: Create code coverage
- run: vendor/bin/phpunit --testdox --coverage-xml=build/coverage --coverage-clover=build/coverage/clover.xml --log-junit=build/coverage/junit.xml
- - name: Store code coverage
- uses: actions/upload-artifact@v4
- with:
- name: code-coverage
- path: build/coverage
-
- sonarcloud-secrets:
- name: SonarCloud check secrets are present
- runs-on: ubuntu-latest
- outputs:
- github: ${{ steps.check-secrets.outputs.github }}
- sonar: ${{ steps.check-secrets.outputs.sonar }}
- steps:
- - name: Check secrets are present
- id: check-secrets
- run: |
- if [ -n "${{ secrets.GITHUB_TOKEN }}" ]; then
- echo "github=yes" >> $GITHUB_OUTPUT
- else
- echo "github=no" >> $GITHUB_OUTPUT
- echo "::warning ::GITHUB_TOKEN non set"
- fi
- if [ -n "${{ secrets.SONAR_TOKEN }}" ]; then
- echo "sonar=yes" >> $GITHUB_OUTPUT
- else
- echo "sonar=no" >> $GITHUB_OUTPUT
- echo "::warning ::SONAR_TOKEN non set"
- fi
-
- sonarcloud:
- name: SonarCloud Scan and Report
- needs: [ "tests-coverage", "sonarcloud-secrets" ]
- if: ${{ needs.sonarcloud-secrets.outputs.github == 'yes' && needs.sonarcloud-secrets.outputs.sonar == 'yes' }}
- runs-on: "ubuntu-latest"
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- - name: Unshallow clone to provide blame information
- run: git fetch --unshallow
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
- with:
- php-version: '8.3'
- coverage: none
- tools: composer:v2
- - name: Get composer cache directory
- id: composer-cache
- run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
- - name: Cache dependencies
- uses: actions/cache@v4
- with:
- path: ${{ steps.composer-cache.outputs.dir }}
- key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
- restore-keys: ${{ runner.os }}-composer-
- - name: Install project dependencies
- run: composer upgrade --no-interaction --no-progress --prefer-dist
- - name: Obtain code coverage
- uses: actions/download-artifact@v4
- with:
- name: code-coverage
- path: build/coverage
- - name: Prepare SonarCloud Code Coverage Files
- run: |
- sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/junit.xml > build/sonar-junit.xml
- sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/clover.xml > build/sonar-coverage.xml
- - name: SonarCloud Scan
- uses: sonarsource/sonarcloud-github-action@master
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
diff --git a/.github/workflows/sonarqube-cloud.yml b/.github/workflows/sonarqube-cloud.yml
new file mode 100644
index 0000000..5592b98
--- /dev/null
+++ b/.github/workflows/sonarqube-cloud.yml
@@ -0,0 +1,53 @@
+name: "SonarQube Cloud"
+on:
+ workflow_dispatch:
+ push:
+ branches: [ "main" ]
+
+# Actions
+# shivammathur/setup-php@v2 https://github.com/marketplace/actions/setup-php-action
+# SonarSource/sonarqube-scan-action@v6 https://github.com/marketplace/actions/official-sonarqube-scan
+
+jobs:
+
+ sonarqube-cloud:
+ name: SonarCloud Scan and Report
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: Check SONAR_TOKEN secret
+ run: |
+ if [ -z "${{ secrets.SONAR_TOKEN }}" ]; then
+ echo "::warning ::SONAR_TOKEN non set"
+ exit 1
+ fi
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Unshallow clone to provide blame information
+ run: git fetch --unshallow
+ - name: Setup PHP
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: '8.4'
+ coverage: xdebug
+ tools: composer:v2
+ - name: Get composer cache directory
+ id: composer-cache
+ run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT
+ - name: Cache dependencies
+ uses: actions/cache@v4
+ with:
+ path: ${{ steps.composer-cache.outputs.dir }}
+ key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }}
+ restore-keys: ${{ runner.os }}-composer-
+ - name: Install project dependencies
+ run: composer upgrade --no-interaction --no-progress --prefer-dist
+ - name: Create code coverage
+ run: vendor/bin/phpunit --testdox --testsuite=complete --coverage-xml=build/coverage --coverage-clover=build/coverage/clover.xml --log-junit=build/coverage/junit.xml
+ - name: Prepare SonarCloud Code Coverage Files
+ run: |
+ sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/junit.xml > build/sonar-junit.xml
+ sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/clover.xml > build/sonar-coverage.xml
+ - name: SonarCloud Scan
+ uses: SonarSource/sonarqube-scan-action@v6
+ env:
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
diff --git a/.github/workflows/system.yml b/.github/workflows/system.yml
index 1e98597..e89ef6f 100644
--- a/.github/workflows/system.yml
+++ b/.github/workflows/system.yml
@@ -19,7 +19,7 @@ jobs:
runs-on: "ubuntu-latest"
strategy:
matrix:
- php-version: ['8.2', '8.3']
+ php-version: ['8.2', '8.3', '8.4']
steps:
- name: Checkout
uses: actions/checkout@v4
diff --git a/.phive/phars.xml b/.phive/phars.xml
index c776c4e..9293a13 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -1,8 +1,8 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php
index ceed8fa..712e3dc 100644
--- a/.php-cs-fixer.dist.php
+++ b/.php-cs-fixer.dist.php
@@ -15,15 +15,16 @@
->setRules([
'@PSR12' => true,
'@PSR12:risky' => true,
- '@PHP82Migration' => true,
- '@PHP80Migration:risky' => true,
+ '@PHP8x2Migration' => true,
+ '@PHP8x2Migration:risky' => true,
// symfony
+ 'array_indentation' => true,
'class_attributes_separation' => true,
'whitespace_after_comma_in_array' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => true,
'type_declaration_spaces' => true,
- 'trailing_comma_in_multiline' => ['after_heredoc' => true, 'elements' => ['arrays']],
+ 'trailing_comma_in_multiline' => ['after_heredoc' => true, 'elements' => ['array_destructuring', 'arrays', 'match', 'arguments', 'parameters']],
'no_blank_lines_after_phpdoc' => true,
'object_operator_without_whitespace' => true,
'binary_operator_spaces' => true,
@@ -37,6 +38,7 @@
'concat_space' => ['spacing' => 'one'],
'linebreak_after_opening_tag' => true,
'fully_qualified_strict_types' => true,
+ 'global_namespace_import' => ['import_classes' => true],
// symfony:risky
'no_alias_functions' => true,
'self_accessor' => true,
@@ -48,6 +50,6 @@
PhpCsFixer\Finder::create()
->in(__DIR__)
->append([__FILE__])
- ->exclude(['tools', 'vendor', 'build'])
+ ->exclude(['tools', 'vendor', 'build']),
)
;
diff --git a/Dockerfile b/Dockerfile
index dcdc2b6..d21be3e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM php:8.3-cli-alpine
+FROM php:8.4-cli-alpine
COPY . /opt/sat-pys-scraper
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
@@ -6,7 +6,8 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
# install dependencies for php modules
RUN set -e \
&& apk add git libzip-dev \
- && docker-php-ext-install zip
+ && docker-php-ext-install zip \
+ && apk del libzip-dev
# set up php
RUN set -e \
diff --git a/LICENSE b/LICENSE
index 8e5765a..18c632e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2023 - 2024 PhpCfdi https://www.phpcfdi.com/
+Copyright (c) 2023 - 2025 PhpCfdi https://www.phpcfdi.com/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index ce2a67c..c7b95d3 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,7 @@
[![Code Coverage][badge-coverage]][coverage]
[![Violations][badge-violations]][violations]
[![Total Downloads][badge-downloads]][downloads]
+[![Docker Downloads][badge-docker]][docker]
> Herramienta para obtener y generar un listado de las clasificaciones del catálogo de productos y servicios del SAT
@@ -38,23 +39,23 @@ propósitos, como por ejemplo, almacenar en una base de datos.
composer require phpcfdi/sat-pys-scraper
```
-## Instalación usando Docker
+## Ejecución usando Docker
-Este proyecto provee un archivo `Dockerfile` para construir una imagen con todas sus dependencias.
-Se puede usar esta imagen para correr de forma local, para más información consulte
-el archivo [`README.Docker.md`](Docker.README.md).
+Este proyecto está integrado a Docker Hub [`phpcfdi/sat-pys-scraper`][docker] por lo que puedes ejecutarlo
+desde la línea de comandos:
```shell
-# clonado del proyecto
-git clone https://github.com/phpcfdi/sat-pys-scraper.git
-
-# construcción de la imagen de Docker
-docker build -t sat-pys-scraper sat-pys-scraper/
+# obtener la imagen de docker
+docker pull phpcfdi/sat-pys-scraper
# ejecución de la herramienta
-docker run -it --rm sat-pys-scraper --help
+docker docker run -it --rm --user="$(id -u):$(id -g)" sat-pys-scraper --help
```
+Este proyecto provee un archivo `Dockerfile` para construir una imagen con todas sus dependencias.
+
+Para más información y ejemplos consulte el archivo [`README.Docker.md`](Docker.README.md).
+
### Ayuda de `sat-pys-scraper` (script)
```text
@@ -169,12 +170,12 @@ Esta librería se mantendrá compatible con al menos la versión con
También utilizamos [Versionado Semántico 2.0.0](docs/SEMVER.md) por lo que puedes usar esta librería
sin temor a romper tu aplicación.
-| Versión | PHP | Nota |
-|---------|----------|-----------------------------------|
-| 1.0.0 | 8.2, 8.3 | 2023-12-13 Fuera de mantenimiento |
-| 2.0.0 | 8.2, 8.3 | 2024-03-07 Fuera de mantenimiento |
-| 3.0.0 | 8.2, 8.3 | 2024-03-07 Fuera de mantenimiento |
-| 4.0.0 | 8.2, 8.3 | 2024-10-17 |
+| Versión | PHP | Nota |
+|---------|---------------|-----------------------------------|
+| 1.0.0 | 8.2, 8.3 | 2023-12-13 Fuera de mantenimiento |
+| 2.0.0 | 8.2, 8.3 | 2024-03-07 Fuera de mantenimiento |
+| 3.0.0 | 8.2, 8.3 | 2024-03-07 Fuera de mantenimiento |
+| 4.0.0 | 8.2, 8.3, 8.4 | 2024-10-17 |
## Contribuciones
@@ -200,6 +201,7 @@ and licensed for use under the MIT License (MIT). Please see [LICENSE][] for mor
[coverage]: https://sonarcloud.io/component_measures?id=phpcfdi_sat-pys-scraper&metric=Coverage
[violations]: https://sonarcloud.io/project/issues?id=phpcfdi_sat-pys-scraper&resolved=false
[downloads]: https://packagist.org/packages/phpcfdi/sat-pys-scraper
+[docker]: https://hub.docker.com/r/phpcfdi/sat-pys-scraper
[badge-source]: https://img.shields.io/badge/source-phpcfdi/sat--pys--scraper-blue?logo=github
[badge-php-version]: https://img.shields.io/packagist/dependency-v/phpcfdi/sat-pys-scraper/php?logo=php
@@ -208,6 +210,7 @@ and licensed for use under the MIT License (MIT). Please see [LICENSE][] for mor
[badge-build]: https://img.shields.io/github/actions/workflow/status/phpcfdi/sat-pys-scraper/build.yml?branch=main&logo=github-actions
[badge-reliability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_sat-pys-scraper&metric=reliability_rating
[badge-maintainability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_sat-pys-scraper&metric=sqale_rating
-[badge-coverage]: https://img.shields.io/sonar/coverage/phpcfdi_sat-pys-scraper/main?logo=sonarcloud&server=https%3A%2F%2Fsonarcloud.io
-[badge-violations]: https://img.shields.io/sonar/violations/phpcfdi_sat-pys-scraper/main?format=long&logo=sonarcloud&server=https%3A%2F%2Fsonarcloud.io
+[badge-coverage]: https://img.shields.io/sonar/coverage/phpcfdi_sat-pys-scraper/main?logo=sonarqubecloud&server=https%3A%2F%2Fsonarcloud.io
+[badge-violations]: https://img.shields.io/sonar/violations/phpcfdi_sat-pys-scraper/main?format=long&logo=sonarqubecloud&server=https%3A%2F%2Fsonarcloud.io
[badge-downloads]: https://img.shields.io/packagist/dt/phpcfdi/sat-pys-scraper?logo=packagist
+[badge-docker]: https://img.shields.io/docker/pulls/phpcfdi/sat-pys-scraper?logo=docker
diff --git a/composer.json b/composer.json
index ec47d3e..c85f0da 100644
--- a/composer.json
+++ b/composer.json
@@ -63,7 +63,7 @@
"dev:fix-style": [
"@php tools/composer-normalize normalize",
"@php tools/php-cs-fixer fix --verbose",
- "@php tools/phpcbf --colors -sp"
+ "@php tools/phpcbf --colors -sp || true"
],
"dev:test": [
"@dev:check-style",
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 24d573d..053d9fc 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -11,6 +11,32 @@ versión, aunque sí su incorporación en la rama principal de trabajo. Generalm
## Listado de cambios
+### Versión 4.0.1 2024-11-13
+
+Esta actualización confirma la compatibilidad (que ya existía) con PHP 8.4.
+
+Estos cambios aplican al proyecto liberado:
+
+- Cambios menores sugeridos por PHPStan (forzar escalares en lugar de usar anotaciones).
+- Se agrega la imagen en Docker Hub `phpcfdi/sat-pys-scraper`.
+- Se corrigen las insignias de SonarQube Cloud.
+- Se actualiza el año de licencia a 2025.
+
+Cambios en el entorno de desarrollo:
+
+- Se corrige la integración con SonarQube Cloud.
+- En el archivo de construcción de la imagen de Docker:
+ - Se construye usando PHP 8.4.
+ - Se eliminan las librerías de compilación.
+- En los flujos de trabajo:
+ - Se agrega PHP 8.4 a la matriz de pruebas.
+ - Se agrega PHP 8.4 a la matriz de pruebas de sistema.
+ - Se ejecutan los trabajos en PHP 8.4.
+ - Se agrega `composer-normalize` a los trabajos.
+- Se mejora la configuración de PHPUnit para mostrar todos los problemas encontrados.
+- Se actualiza el estándar de código.
+- Se actualizan las herramientas de desarrollo.
+
### Versión 4.0.0 2024-10-17
Esta es una actualización de refactorización que obliga a crear una versión mayor.
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
index 2792d14..601d073 100644
--- a/phpcs.xml.dist
+++ b/phpcs.xml.dist
@@ -1,4 +1,4 @@
-
+
The EngineWorks (PSR-12 based) coding standard.
@@ -19,7 +19,6 @@
-
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 1941425..8a22a4f 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,14 +1,13 @@
-
-
tests
@@ -23,7 +22,7 @@
- src
+ src
diff --git a/src/Scraper.php b/src/Scraper.php
index 6f645fb..7aa0d95 100644
--- a/src/Scraper.php
+++ b/src/Scraper.php
@@ -115,6 +115,7 @@ private function sendPost(array $data): Crawler
/** @return array */
private function extractSelectValues(Crawler $crawler, string $selectId): array
{
+ /** @phpstan-var array{string, string} $options */
$options = $crawler->filter("#$selectId option")->extract(['value', '_text']);
$values = array_combine(
array_column($options, 0),
@@ -123,11 +124,14 @@ private function extractSelectValues(Crawler $crawler, string $selectId): array
return array_filter($values, fn (int|string $key): bool => (bool) $key, ARRAY_FILTER_USE_KEY);
}
- /** @return array */
+ /** @return array */
private function extractState(Crawler $crawler): array
{
$form = $crawler->filter('#form1')->form();
- return $form->getPhpValues();
+ return array_filter(
+ $form->getPhpValues(),
+ static fn (mixed $value): bool => null === $value || is_scalar($value),
+ );
}
private function wrapGuzzleException(GuzzleException $exception): Exceptions\HttpException
@@ -135,13 +139,13 @@ private function wrapGuzzleException(GuzzleException $exception): Exceptions\Htt
if ($exception instanceof ServerException) {
return new Exceptions\HttpServerException(
message: $exception->getMessage(),
- previous: $exception
+ previous: $exception,
);
}
return new Exceptions\HttpException(
message: $exception->getMessage(),
- previous: $exception
+ previous: $exception,
);
}
}
diff --git a/tests/Fakes/PysSimulator.php b/tests/Fakes/PysSimulator.php
index ac01b48..6a626b8 100644
--- a/tests/Fakes/PysSimulator.php
+++ b/tests/Fakes/PysSimulator.php
@@ -32,7 +32,10 @@ public function __invoke(RequestInterface $request, array $options): PromiseInte
}
if ('POST' === $request->getMethod()) {
parse_str($request->getBody()->__toString(), $values);
- /** @phpstan-var array $values */
+ $values = array_filter(
+ $values,
+ static fn (mixed $value): bool => is_scalar($value),
+ );
$type = intval($values['cmbTipo'] ?? 0);
$segment = intval($values['cmbSegmento'] ?? 0);
$family = intval($values['cmbFamilia'] ?? 0);
diff --git a/tests/Unit/App/SatPysScraperTest.php b/tests/Unit/App/SatPysScraperTest.php
index 7cb4fd7..de6aa67 100644
--- a/tests/Unit/App/SatPysScraperTest.php
+++ b/tests/Unit/App/SatPysScraperTest.php
@@ -63,7 +63,7 @@ public function testRunWithError(): void
$this->assertStringContainsString(
'ERROR: Did not specify --xml or --json arguments',
$stdError,
- 'Expected error was not raised'
+ 'Expected error was not raised',
);
}
diff --git a/tests/Unit/TestCase.php b/tests/Unit/TestCase.php
index 61c274c..e487623 100644
--- a/tests/Unit/TestCase.php
+++ b/tests/Unit/TestCase.php
@@ -7,6 +7,7 @@
use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Psr7\Response;
use LogicException;
use PhpCfdi\SatPysScraper\Scraper;
use PhpCfdi\SatPysScraper\ScraperInterface;
@@ -71,7 +72,7 @@ public function createFakeScraper(): ScraperInterface
return new Scraper($client);
}
- /** @param array $queue */
+ /** @param list $queue */
public function createPreparedScraperQueue(array $queue): ScraperInterface
{
$mockHandler = new MockHandler($queue);