diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..a5b10e1 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: stancl diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..b8c2e07 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,37 @@ +name: CI + +on: + push: + pull_request: + branches: [ master ] + +jobs: + phpunit: + name: Tests (Pest) L${{ matrix.laravel }} + runs-on: ubuntu-latest + strategy: + matrix: + laravel: [8, 9] + + steps: + - uses: actions/checkout@v2 + - name: Install composer dependencies + run: composer require "laravel/framework:^${{matrix.laravel}}.0" + - name: Run tests + run: vendor/bin/pest + + php-cs-fixer: + name: Code style (php-cs-fixer) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install php-cs-fixer + run: composer global require friendsofphp/php-cs-fixer + - name: Run php-cs-fixer + run: $HOME/.composer/vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.php + - name: Commit changes from php-cs-fixer + uses: EndBug/add-and-commit@v5 + with: + author_name: Samuel Štancl + author_email: samuel.stancl@gmail.com + message: Fix code style (php-cs-fixer) diff --git a/.gitignore b/.gitignore index 7137bf2..20734e1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ composer.lock node_modules package-lock.json .phpunit.result.cache +.php-cs-fixer.cache diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php new file mode 100644 index 0000000..a96d781 --- /dev/null +++ b/.php-cs-fixer.php @@ -0,0 +1,141 @@ + ['syntax' => 'short'], + 'binary_operator_spaces' => [ + 'default' => 'single_space', + 'operators' => [ + '=>' => null, + '|' => 'no_space', + ], + ], + 'blank_line_after_namespace' => true, + 'blank_line_after_opening_tag' => true, + 'no_superfluous_phpdoc_tags' => true, + 'blank_line_before_statement' => [ + 'statements' => ['return'], + ], + 'braces' => true, + 'cast_spaces' => true, + 'class_definition' => true, + 'concat_space' => [ + 'spacing' => 'one', + ], + 'declare_equal_normalize' => true, + 'elseif' => true, + 'encoding' => true, + 'full_opening_tag' => true, + 'declare_strict_types' => true, + 'fully_qualified_strict_types' => true, // added by Shift + 'function_declaration' => true, + 'function_typehint_space' => true, + 'heredoc_to_nowdoc' => true, + 'include' => true, + 'increment_style' => ['style' => 'post'], + 'indentation_type' => true, + 'linebreak_after_opening_tag' => true, + 'line_ending' => true, + 'lowercase_cast' => true, + 'constant_case' => true, + 'lowercase_keywords' => true, + 'lowercase_static_reference' => true, // added from Symfony + 'magic_method_casing' => true, // added from Symfony + 'magic_constant_casing' => true, + 'method_argument_space' => true, + 'native_function_casing' => true, + 'no_alias_functions' => true, + 'no_extra_blank_lines' => [ + 'tokens' => [ + 'extra', + 'throw', + 'use', + 'use_trait', + ], + ], + 'no_blank_lines_after_class_opening' => true, + 'no_blank_lines_after_phpdoc' => true, + 'no_closing_tag' => true, + 'no_empty_phpdoc' => true, + 'no_empty_statement' => true, + 'no_leading_import_slash' => true, + 'no_leading_namespace_whitespace' => true, + 'no_mixed_echo_print' => [ + 'use' => 'echo', + ], + 'no_multiline_whitespace_around_double_arrow' => true, + 'multiline_whitespace_before_semicolons' => [ + 'strategy' => 'no_multi_line', + ], + 'no_short_bool_cast' => true, + 'no_singleline_whitespace_before_semicolons' => true, + 'no_spaces_after_function_name' => true, + 'no_spaces_around_offset' => true, + 'no_spaces_inside_parenthesis' => true, + 'no_trailing_comma_in_list_call' => true, + 'no_trailing_comma_in_singleline_array' => true, + 'no_trailing_whitespace' => true, + 'no_trailing_whitespace_in_comment' => true, + 'no_unneeded_control_parentheses' => true, + 'no_unreachable_default_argument_value' => true, + 'no_useless_return' => true, + 'no_whitespace_before_comma_in_array' => true, + 'no_whitespace_in_blank_line' => true, + 'normalize_index_brace' => true, + 'not_operator_with_successor_space' => true, + 'object_operator_without_whitespace' => true, + 'ordered_imports' => ['sort_algorithm' => 'alpha'], + 'phpdoc_indent' => true, + 'general_phpdoc_tag_rename' => true, + 'phpdoc_no_access' => true, + 'phpdoc_no_package' => true, + 'phpdoc_no_useless_inheritdoc' => true, + 'phpdoc_scalar' => true, + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_summary' => true, + 'phpdoc_to_comment' => false, + 'phpdoc_trim' => true, + 'phpdoc_types' => true, + 'phpdoc_var_without_name' => true, + 'psr_autoloading' => true, + 'self_accessor' => true, + 'short_scalar_cast' => true, + 'simplified_null_return' => false, // disabled by Shift + 'single_blank_line_at_eof' => true, + 'single_blank_line_before_namespace' => true, + 'single_class_element_per_statement' => true, + 'single_import_per_statement' => false, + 'single_line_after_imports' => true, + 'no_unused_imports' => true, + 'single_line_comment_style' => [ + 'comment_types' => ['hash'], + ], + 'single_quote' => true, + 'space_after_semicolon' => true, + 'standardize_not_equals' => true, + 'switch_case_semicolon_to_colon' => true, + 'switch_case_space' => true, + 'ternary_operator_spaces' => true, + 'trailing_comma_in_multiline' => true, + 'trim_array_spaces' => true, + 'unary_operator_spaces' => true, + 'whitespace_after_comma_in_array' => true, +]; + +$project_path = getcwd(); +$finder = Finder::create() + ->in([ + $project_path . '/src', + ]) + ->name('*.php') + ->notName('*.blade.php') + ->ignoreDotFiles(true) + ->ignoreVCS(true); + +return (new Config()) + ->setFinder($finder) + ->setRules($rules) + ->setRiskyAllowed(true) + ->setUsingCache(true); diff --git a/check b/check new file mode 100755 index 0000000..4eb5950 --- /dev/null +++ b/check @@ -0,0 +1,47 @@ +#!/bin/bash +set -e + +offer_run() { + read -p "For more output, run $1. Run it now (Y/n)? " run + + case ${run:0:1} in + n|N ) + exit 1 + ;; + * ) + $1 + ;; + esac + + exit 1 +} + +if (php-cs-fixer fix --dry-run --config=.php-cs-fixer.php > /dev/null 2>/dev/null); then + echo '✅ php-cs-fixer OK' +else + read -p "⚠️ php-cs-fixer found issues. Fix (Y/n)? " fix + case ${fix:0:1} in + n|N ) + echo '❌ php-cs-fixer FAIL' + offer_run 'php-cs-fixer fix --config=.php-cs-fixer.php' + ;; + * ) + if (php-cs-fixer fix --config=.php-cs-fixer.php > /dev/null 2>/dev/null); then + echo '✅ php-cs-fixer OK' + else + echo '❌ php-cs-fixer FAIL' + offer_run 'php-cs-fixer fix --config=.php-cs-fixer.php' + fi + ;; + esac +fi + +if (./vendor/bin/pest > /dev/null 2>/dev/null); then + echo '✅ Pest OK' +else + echo '❌ Pest FAIL' + offer_run './vendor/bin/pest' +fi + +echo '==================' +echo '✅ Everything OK' diff --git a/composer.json b/composer.json index c7267e7..a73ef7c 100644 --- a/composer.json +++ b/composer.json @@ -21,13 +21,13 @@ }, "require-dev": { "pestphp/pest": "^1.2", - "illuminate/testing": "^8.42", - "orchestra/testbench": "^6.17", + "illuminate/testing": "^8.42|^9.0", + "orchestra/testbench": "^6.17|^7.0", "pestphp/pest-plugin-laravel": "^1.0.0" }, "require": { - "illuminate/support": "^8.42", - "illuminate/console": "^8.42" + "illuminate/support": "^8.42|^9.0", + "illuminate/console": "^8.42|^9.0" }, "extra": { "laravel": { @@ -35,5 +35,7 @@ "Airwire\\AirwireServiceProvider" ] } - } + }, + "minimum-stability": "dev", + "prefer-stable": true } diff --git a/src/Airwire.php b/src/Airwire.php index f89a0bb..419a04c 100644 --- a/src/Airwire.php +++ b/src/Airwire.php @@ -1,5 +1,7 @@ changed($changes); - } catch (ValidationException) {} + } catch (ValidationException) { + } } } @@ -77,7 +80,8 @@ trait ManagesActions $result = array_merge($readonly, $result); $this->readonly = array_unique(array_merge( - $this->readonly, array_keys($readonly) + $this->readonly, + array_keys($readonly) )); } } diff --git a/src/Concerns/ManagesLifecycle.php b/src/Concerns/ManagesLifecycle.php index 776eb11..76cdb9c 100644 --- a/src/Concerns/ManagesLifecycle.php +++ b/src/Concerns/ManagesLifecycle.php @@ -1,5 +1,7 @@ call([$this, 'dehydrate'], $this->requestState); } - } catch (ValidationException) {} + } catch (ValidationException) { + } if (isset($this->errors) && ! $this->hasBeenReset) { $this->metadata['errors'] = $this->errors->toArray(); diff --git a/src/Concerns/ManagesState.php b/src/Concerns/ManagesState.php index 479f756..2af545d 100644 --- a/src/Concerns/ManagesState.php +++ b/src/Concerns/ManagesState.php @@ -1,12 +1,14 @@ ['nullable', function ($attribute, $value, $fail) { - if (! is_array($value)) $fail('State must be an array.'); + if (! is_array($value)) { + $fail('State must be an array.'); + } foreach ($value as $k => $v) { - if (! is_string($k)) $fail("[State] Property name must be a string, {$k} given."); + if (! is_string($k)) { + $fail("[State] Property name must be a string, {$k} given."); + } } }], 'changes' => ['nullable', function ($attribute, $value, $fail) { - if (! is_array($value)) $fail('Changes must be an array.'); + if (! is_array($value)) { + $fail('Changes must be an array.'); + } foreach ($value as $k => $v) { - if (! is_string($k)) $fail("[Changes] Property name must be a string, {$k} given."); + if (! is_string($k)) { + $fail("[Changes] Property name must be a string, {$k} given."); + } } }], 'calls' => ['nullable', function ($attribute, $value, $fail) { - if (! is_array($value)) $fail('Calls must be an array.'); + if (! is_array($value)) { + $fail('Calls must be an array.'); + } foreach ($value as $k => $v) { - if (! is_string($k)) $fail("[Calls] Method name must be a string, {$k} given."); + if (! is_string($k)) { + $fail("[Calls] Method name must be a string, {$k} given."); + } } }], ]); diff --git a/src/Testing/AirwireResponse.php b/src/Testing/AirwireResponse.php index f4054a8..a4da853 100644 --- a/src/Testing/AirwireResponse.php +++ b/src/Testing/AirwireResponse.php @@ -1,5 +1,7 @@ getName()] = join(' | ', array_map(fn (ReflectionNamedType $type) => $this->convertType($type->getName(), 'parameter'), $types)); + $parameters[$parameter->getName()] = implode(' | ', array_map(fn (ReflectionNamedType $type) => $this->convertType($type->getName(), 'parameter'), $types)); } $parameters = collect($parameters)->map(fn (string $type, string $name) => "{$name}: {$type}")->join(', ');