Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
/README.md export-ignore
/LICENSE export-ignore
/Makefile export-ignore
/phpmd.xml export-ignore
/phpunit.xml export-ignore
/phpstan.neon.dist export-ignore
/infection.json.dist export-ignore
Expand Down
53 changes: 47 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,43 @@ permissions:
contents: read

env:
PHP_VERSION: '8.3'
PHP_VERSION: '8.5'
COMPOSER_ROOT_VERSION: '1.2.0'

jobs:
build:
name: Build
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Configure PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ env.PHP_VERSION }}
extensions: bcmath
tools: composer:2

- name: Validate composer.json
run: composer validate --no-interaction

- name: Install dependencies
run: composer install --no-progress --optimize-autoloader --prefer-dist --no-interaction

- name: Upload vendor and composer.lock as artifact
uses: actions/upload-artifact@v6
Comment thread
gustavofreze marked this conversation as resolved.
with:
name: vendor-artifact
path: |
vendor
composer.lock

auto-review:
name: Auto review
runs-on: ubuntu-latest
needs: build

steps:
- name: Checkout
Expand All @@ -23,28 +53,39 @@ jobs:
uses: shivammathur/setup-php@v2
with:
php-version: ${{ env.PHP_VERSION }}
extensions: bcmath
tools: composer:2

- name: Install dependencies
run: composer update --no-progress --optimize-autoloader
- name: Download vendor artifact from build
uses: actions/upload-artifact@v6
with:
name: vendor-artifact
path: .
Comment thread
gustavofreze marked this conversation as resolved.

- name: Run review
run: composer review

tests:
name: Tests
runs-on: ubuntu-latest
needs: auto-review

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Use PHP ${{ env.PHP_VERSION }}
- name: Configure PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ env.PHP_VERSION }}
extensions: bcmath
tools: composer:2

- name: Install dependencies
run: composer update --no-progress --optimize-autoloader
- name: Download vendor artifact from build
uses: actions/upload-artifact@v6
with:
name: vendor-artifact
path: .
Comment thread
gustavofreze marked this conversation as resolved.

- name: Run tests
run: composer tests
60 changes: 45 additions & 15 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,38 +1,68 @@
ifeq ($(OS),Windows_NT)
PWD := $(shell cd)
else
PWD := $(shell pwd -L)
endif

PWD := $(CURDIR)
ARCH := $(shell uname -m)
PLATFORM :=

ifeq ($(ARCH),arm64)
PLATFORM := --platform=linux/amd64
endif

DOCKER_RUN = docker run ${PLATFORM} --rm -it --net=host -v ${PWD}:/app -w /app gustavofreze/php:8.3
DOCKER_RUN = docker run ${PLATFORM} --rm -it --net=host -v ${PWD}:/app -w /app gustavofreze/php:8.5-alpine

.PHONY: configure test test-file test-no-coverage review show-reports clean
RESET := \033[0m
GREEN := \033[0;32m
YELLOW := \033[0;33m

configure:
.DEFAULT_GOAL := help

.PHONY: configure
configure: ## Configure development environment
@${DOCKER_RUN} composer update --optimize-autoloader

test:
.PHONY: test
test: ## Run all tests with coverage
@${DOCKER_RUN} composer tests

test-file:
.PHONY: test-file
test-file: ## Run tests for a specific file (usage: make test-file FILE=path/to/file)
@${DOCKER_RUN} composer test-file ${FILE}

test-no-coverage:
.PHONY: test-no-coverage
test-no-coverage: ## Run all tests without coverage
@${DOCKER_RUN} composer tests-no-coverage

review:
.PHONY: review
review: ## Run static code analysis
@${DOCKER_RUN} composer review

show-reports:
.PHONY: show-reports
show-reports: ## Open static analysis reports (e.g., coverage, lints) in the browser
@sensible-browser report/coverage/coverage-html/index.html report/coverage/mutation-report.html

clean:
.PHONY: clean
clean: ## Remove dependencies and generated artifacts
@sudo chown -R ${USER}:${USER} ${PWD}
@rm -rf report vendor .phpunit.cache *.lock

.PHONY: help
help: ## Display this help message
@echo "Usage: make [target]"
@echo ""
@echo "$$(printf '$(GREEN)')Setup$$(printf '$(RESET)')"
@grep -E '^(configure):.*?## .*$$' $(MAKEFILE_LIST) \
| awk 'BEGIN {FS = ":.*? ## "}; {printf "$(YELLOW)%-25s$(RESET) %s\n", $$1, $$2}'
@echo ""
@echo "$$(printf '$(GREEN)')Testing$$(printf '$(RESET)')"
@grep -E '^(test|test-file|test-no-coverage):.*?## .*$$' $(MAKEFILE_LIST) \
| awk 'BEGIN {FS = ":.*?## "}; {printf "$(YELLOW)%-25s$(RESET) %s\n", $$1, $$2}'
@echo ""
@echo "$$(printf '$(GREEN)')Quality$$(printf '$(RESET)')"
@grep -E '^(review):.*?## .*$$' $(MAKEFILE_LIST) \
| awk 'BEGIN {FS = ":.*?## "}; {printf "$(YELLOW)%-25s$(RESET) %s\n", $$1, $$2}'
@echo ""
@echo "$$(printf '$(GREEN)')Reports$$(printf '$(RESET)')"
@grep -E '^(show-reports):.*?## .*$$' $(MAKEFILE_LIST) \
| awk 'BEGIN {FS = ":.*?## "}; {printf "$(YELLOW)%-25s$(RESET) %s\n", $$1, $$2}'
@echo ""
@echo "$$(printf '$(GREEN)')Cleanup$$(printf '$(RESET)')"
@grep -E '^(clean):.*?## .*$$' $(MAKEFILE_LIST) \
| awk 'BEGIN {FS = ":.*?## "}; {printf "$(YELLOW)%-25s$(RESET) %s\n", $$1, $$2}'
30 changes: 16 additions & 14 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
"issues": "https://github.com/tiny-blocks/mapper/issues",
"source": "https://github.com/tiny-blocks/mapper"
},
"extra": {
"branch-alias": {
"dev-develop": "1.3.x-dev"
}
},
"config": {
"sort-packages": true,
"allow-plugins": {
Expand All @@ -42,27 +47,24 @@
}
},
"require": {
"php": "^8.3"
"php": "^8.5"
},
"require-dev": {
"phpmd/phpmd": "^2.15",
"phpunit/phpunit": "^12.1",
"phpstan/phpstan": "^2.1",
"phpunit/phpunit": "^11.5",
Comment thread
gustavofreze marked this conversation as resolved.
"phpstan/phpstan": "^1.12",
Comment thread
gustavofreze marked this conversation as resolved.
Outdated
"infection/infection": "^0.32",
"tiny-blocks/collection": "^1.10",
"squizlabs/php_codesniffer": "^3.11"
"tiny-blocks/collection": "1.10.*",
"squizlabs/php_codesniffer": "^3.13"
},
"scripts": {
"test": "phpunit --configuration phpunit.xml tests",
"phpcs": "phpcs --standard=PSR12 --extensions=php ./src",
"phpmd": "phpmd ./src text phpmd.xml --suffixes php --ignore-violations-on-exit",
"phpstan": "phpstan analyse -c phpstan.neon.dist --quiet --no-progress",
"test-file": "phpunit --configuration phpunit.xml --no-coverage --filter",
"mutation-test": "infection --threads=max --logger-html=report/coverage/mutation-report.html --coverage=report/coverage",
"test-no-coverage": "phpunit --configuration phpunit.xml --no-coverage tests",
"test": "php -d memory_limit=2G ./vendor/bin/phpunit --configuration phpunit.xml tests",
"phpcs": "php ./vendor/bin/phpcs --standard=PSR12 --extensions=php ./src",
"phpstan": "php ./vendor/bin/phpstan analyse -c phpstan.neon.dist --quiet --no-progress",
"test-file": "php ./vendor/bin/phpunit --configuration phpunit.xml --no-coverage --filter",
"mutation-test": "php ./vendor/bin/infection --threads=max --logger-html=report/coverage/mutation-report.html --coverage=report/coverage",
"test-no-coverage": "php ./vendor/bin/phpunit --configuration phpunit.xml --no-coverage tests",
"review": [
"@phpcs",
"@phpmd",
"@phpstan"
],
"tests": [
Expand Down
65 changes: 0 additions & 65 deletions phpmd.xml

This file was deleted.

6 changes: 3 additions & 3 deletions src/Internal/Mappers/Collection/ValueMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
public function map(mixed $value, KeyPreservation $keyPreservation): mixed
{
return match (true) {
is_a($value, UnitEnum::class) => (new EnumMapper())->map(value: $value),
is_a($value, DateTimeInterface::class) => (new DateTimeMapper())->map(value: $value),
is_object($value) => (new ArrayMapper())->map(
is_a($value, UnitEnum::class) => new EnumMapper()->map(value: $value),
is_a($value, DateTimeInterface::class) => new DateTimeMapper()->map(value: $value),
is_object($value) => new ArrayMapper()->map(
value: $value,
keyPreservation: $keyPreservation
),
Expand Down
2 changes: 1 addition & 1 deletion src/Internal/Mappers/Object/Casters/CollectionCaster.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public function castValue(mixed $value): Collectible
$mapped = [];

foreach ($value as $item) {
$mapped[] = (new ObjectMapper())->map(iterable: $item, class: $type);
$mapped[] = new ObjectMapper()->map(iterable: $item, class: $type);
}

return $instance->createFrom(elements: $mapped);
Expand Down
2 changes: 1 addition & 1 deletion src/Internal/Mappers/Object/Casters/DefaultCaster.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ public function castValue(mixed $value): mixed
return $value;
}

return (new ObjectMapper())->map(iterable: $value, class: $this->class);
return new ObjectMapper()->map(iterable: $value, class: $this->class);
}
}
4 changes: 2 additions & 2 deletions src/Internal/Mappers/Object/Reflector.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function getParameters(): array
return $this->parameters;
}

public function newInstance(array $constructorArguments): mixed
public function newInstance(array $constructorArguments): ?object
{
$instance = $this->constructor && $this->constructor->isPrivate()
? $this->newInstanceWithoutConstructor()
Expand All @@ -42,7 +42,7 @@ public function newInstance(array $constructorArguments): mixed
return $instance;
}

public function newInstanceWithoutConstructor(): mixed
public function newInstanceWithoutConstructor(): object
{
return $this->reflectionClass->newInstanceWithoutConstructor();
}
Expand Down
Loading