Skip to content

Commit

Permalink
Merge pull request #5 from InteractionDesignFoundation/dependencies
Browse files Browse the repository at this point in the history
Improve CI: Add Psalm and PHP-CS-Fixer
  • Loading branch information
alies-dev authored Feb 28, 2024
2 parents 3481a6e + b758dcb commit d251b45
Show file tree
Hide file tree
Showing 11 changed files with 238 additions and 16 deletions.
34 changes: 34 additions & 0 deletions .github/workflows/psalm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Psalm

on:
push:
paths:
- '**.php'
- 'psalm*'

jobs:
psalm:
name: psalm
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
coverage: none

- name: Cache composer dependencies
uses: actions/cache@v4
with:
path: vendor
key: composer-${{ hashFiles('composer.json') }}

- name: Run composer install
run: |
composer config "http-basic.nova.laravel.com" "${{ secrets.NOVA_USERNAME }}" "${{ secrets.NOVA_4_LICENSE_KEY }}"
composer install -n --prefer-dist
- name: Run Psalm
run: ./vendor/bin/psalm --shepherd
9 changes: 3 additions & 6 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
name: run-tests

on:
- push
- pull_request
on: [ push, pull_request ]

jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: true
matrix:
php: ['8.1', '8.2']
php: [ 8.3, 8.2 ]
dependency-version: ['--prefer-lowest', '--prefer-stable']
laravel: [10.*]
include:
Expand All @@ -21,13 +19,12 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v2
uses: actions/checkout@v4

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo
coverage: none

- name: Setup problem matchers
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ auth.json

phpunit.xml
.phpunit.result.cache
.phpunit.cache/

.DS_Store
Thumbs.db
Expand Down
132 changes: 132 additions & 0 deletions .php-cs-fixer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
<?php

declare(strict_types=1);

/**
* @see https://mlocati.github.io/php-cs-fixer-configurator/
*/
$finder = \PhpCsFixer\Finder::create()
->in(__DIR__)
->exclude(
[
'vendor',
]
)
->name('*.php')
->ignoreDotFiles(false)
->ignoreVCS(true)
->ignoreVCSIgnored(true);

return (new \PhpCsFixer\Config())
->setUsingCache(true)
->setRiskyAllowed(true)
->setIndent(' ')
->setLineEnding("\n")
->setRules([
// Basic PER Coding Style 2.0 ruleset plus our "fixes" for it
'@PER-CS2.0' => true, // https://www.php-fig.org/per/coding-style/}
// 'concat_space' => ['spacing' => 'none'], // make strings shorter "'hello' . $name . '!'" => "'hello'.$name.'!'"
// 'blank_line_after_opening_tag' => false, // it makes "<?php declare(strict_types=1);" multiline (and more verbose)
'function_declaration' => false, // It makes "fn ()" into "fn()" and conflicts with our PHPCS ruleset
'single_line_empty_body' => false, // It has conflict with PSR2.Classes.ClassDeclaration.OpenBraceNewLine
// 'unary_operator_spaces' => false, // It has conflict with PHPCS ruleset

// Additional rules on the top of PER-CS2
// Please keep these rules alphabetically
'align_multiline_comment' => ['comment_type' => 'phpdocs_only'],
'array_indentation' => true,
'assign_null_coalescing_to_coalesce_equal' => true,
'binary_operator_spaces' => ['default' => 'single_space'],
'cast_spaces' => ['space' => 'single'],
'class_attributes_separation' => ['elements' => ['method' => 'one']],
'declare_strict_types' => true,
'explicit_string_variable' => true,
// 'final_public_method_for_abstract_class' => true, // @todo enable it
'general_phpdoc_annotation_remove' => [
'annotations' => [
'api',
'access',
'author',
'category',
'copyright',
'created',
'license',
'link',
'package',
'since',
'subpackage',
'version',
],
],
'modernize_types_casting' => true,
'no_alias_functions' => true,
'no_binary_string' => true,
'no_empty_comment' => true,
'no_empty_phpdoc' => true,
'no_empty_statement' => true,
'no_extra_blank_lines' => ['tokens' => ['extra', 'curly_brace_block']],
'no_homoglyph_names' => true,
'no_leading_namespace_whitespace' => true,
'no_mixed_echo_print' => true,
'no_short_bool_cast' => true,
'no_singleline_whitespace_before_semicolons' => true,
'no_spaces_around_offset' => true,
'no_trailing_comma_in_singleline' => false, // it's a good marker that there are more elements in an array
'no_unneeded_braces' => true,
'no_unneeded_control_parentheses' => true,
'no_unneeded_final_method' => true,
'no_unreachable_default_argument_value' => true,
'no_unused_imports' => true,
'no_useless_concat_operator' => true,
'no_useless_return' => true,
'no_whitespace_before_comma_in_array' => true,
'normalize_index_brace' => true,
'nullable_type_declaration' => ['syntax' => 'question_mark'],
'object_operator_without_whitespace' => true,
/*
* @see https://github.com/slevomat/coding-standard/issues/1620#issuecomment-1758006718
* 'ordered_class_elements' => [
'order' => [
'use_trait',
'constant',
'case', // for enums only
'property',
'method',
]
],*/
'php_unit_construct' => true,
'php_unit_dedicate_assert' => ['target' => 'newest'],
'php_unit_expectation' => true,
'php_unit_fqcn_annotation' => true,
'php_unit_method_casing' => ['case' => 'snake_case'],
'php_unit_no_expectation_annotation' => true,
'php_unit_set_up_tear_down_visibility' => true,
'php_unit_strict' => true,
'php_unit_test_annotation' => ['style' => 'annotation'],
'php_unit_test_class_requires_covers' => true,
'phpdoc_align' => ['align' => 'left'],
'phpdoc_indent' => true,
'phpdoc_line_span' => ['const' => 'single', 'property' => 'single', 'method' => 'single'],
'phpdoc_param_order' => true,
'phpdoc_scalar' => true,
'phpdoc_single_line_var_spacing' => true,
'phpdoc_tag_casing' => true,
'phpdoc_types' => true,
'protected_to_private' => true,
'psr_autoloading' => true,
'self_accessor' => true,
'self_static_accessor' => true,
'single_line_comment_spacing' => true,
'single_line_comment_style' => ['comment_types' => ['asterisk', 'hash']],
'space_after_semicolon' => true,
'standardize_not_equals' => true,
'strict_param' => true,
'ternary_to_null_coalescing' => true,
'trim_array_spaces' => true,
'trailing_comma_in_multiline' => true,
'type_declaration_spaces' => true,
'types_spaces' => ['space' => 'single'],
'whitespace_after_comma_in_array' => true,
'yoda_style' => ['equal' => false, 'identical' => false, 'less_and_greater' => false],
])
->setFinder($finder);
17 changes: 12 additions & 5 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@
"laravel/nova": "^4.20"
},
"require-dev": {
"interaction-design-foundation/coding-standard": "^0.0.5",
"orchestra/testbench": "^8.5",
"phpunit/phpunit": "^10.2"
"interaction-design-foundation/coding-standard": "^0.2.0",
"orchestra/testbench": "^8.3",
"phpunit/phpunit": "^10.5 || ^11.0",
"vimeo/psalm": "^5.22"
},
"repositories": [
{
"type": "composer",
"url": "https://nova.laravel.com"
"url": "https://nova.laravel.com",
"only": [
"laravel/nova"
]
}
],
"minimum-stability": "dev",
Expand All @@ -40,7 +44,8 @@
},
"config": {
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
"dealerdirect/phpcodesniffer-composer-installer": true,
"ergebnis/composer-normalize": true
},
"sort-packages": true
},
Expand All @@ -52,8 +57,10 @@
}
},
"scripts": {
"cs": "@cs:fix",
"cs:check": "phpcs -p -s --colors --report-full --report-summary",
"cs:fix": "phpcbf -p --colors",
"psalm": "vendor/bin/psalm",
"test": "phpunit --colors=always"
}
}
27 changes: 27 additions & 0 deletions psalm-baseline.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="5.22.2@d768d914152dbbf3486c36398802f74e80cfde48">
<file src="src/CardServiceProvider.php">
<UndefinedInterfaceMethod>
<code><![CDATA[routesAreCached]]></code>
</UndefinedInterfaceMethod>
</file>
<file src="src/Http/Controllers/WorldClockController.php">
<LessSpecificReturnStatement>
<code><![CDATA[$times]]></code>
</LessSpecificReturnStatement>
<MixedArgument>
<code><![CDATA[$timeFormat]]></code>
</MixedArgument>
<MixedAssignment>
<code><![CDATA[$timeFormat]]></code>
</MixedAssignment>
<MoreSpecificReturnType>
<code><![CDATA[array{string, array{name: string, time: string, night: bool}}]]></code>
</MoreSpecificReturnType>
</file>
<file src="src/WorldClock.php">
<PropertyNotSetInConstructor>
<code><![CDATA[WorldClock]]></code>
</PropertyNotSetInConstructor>
</file>
</files>
22 changes: 22 additions & 0 deletions psalm.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0"?>
<psalm
errorLevel="1"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
findUnusedBaselineEntry="true"
findUnusedCode="false"
errorBaseline="psalm-baseline.xml"
>
<projectFiles>
<directory name="src" />
<ignoreFiles>
<directory name="vendor" />
</ignoreFiles>
</projectFiles>
<disableExtensions>
<extension name="random"/>
<extension name="redis"/>
</disableExtensions>
</psalm>
3 changes: 1 addition & 2 deletions src/CardServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
use Laravel\Nova\Events\ServingNova;
use Laravel\Nova\Nova;

class CardServiceProvider extends ServiceProvider
Expand All @@ -16,7 +15,7 @@ public function boot(): void
$this->routes();
});

Nova::serving(static function (ServingNova $event) {
Nova::serving(static function (): void {
Nova::script('worldclock-card', __DIR__.'/../dist/js/card.js');
});
}
Expand Down
2 changes: 2 additions & 0 deletions src/Http/Controllers/WorldClockController.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ public function timezones(Request $request): array
$timeFormat = $request->input('timeFormat', 'h:i:s');

$nightHours = $request->input('nightHours');
assert(is_array($nightHours) && array_is_list($nightHours) && count($nightHours) === 2, 'Night hours must be an array with two elements');
$hideContinents = $request->json('hideContinents') === true;

$times = [];
/** @var string $timezone */
foreach ($request->input('timezones', []) as $timezone) {
$time = now($timezone);
$night = $this->isNight($time, (int) $nightHours[0], (int) $nightHours[1]);
Expand Down
2 changes: 1 addition & 1 deletion src/WorldClock.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class WorldClock extends Card
* The width of the card (1/3, 1/2, or full).
* @var string
*/
public $width = '1/3';
public $width = self::ONE_THIRD_WIDTH;

/**
* Create a new element.
Expand Down
5 changes: 3 additions & 2 deletions tests/Http/Controllers/WorldClockControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
namespace InteractionDesignFoundation\WorldClockCard\Tests\Http\Controllers;

use InteractionDesignFoundation\WorldClockCard\Tests\TestCase;
use PHPUnit\Framework\Attributes\Test;

final class WorldClockControllerTest extends TestCase
{
/** @test */
#[Test]
public function it_can_return_a_response(): void
{
$response = $this->post('nova-vendor/interaction-design-foundation/worldclock/timezones', [
Expand All @@ -18,7 +19,7 @@ public function it_can_return_a_response(): void
$response->assertSuccessful();
}

/** @test */
#[Test]
public function it_accepts_empty_array_of_timezones(): void
{
$response = $this->post('nova-vendor/interaction-design-foundation/worldclock/timezones', [
Expand Down

0 comments on commit d251b45

Please sign in to comment.