diff --git a/.circleci/config.yml b/.circleci/config.yml index c3411c8..69382d0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,27 +1,180 @@ -version: 2.0 -jobs: - build: - environment: - CC_TEST_REPORTER_ID: 8ec926841c6dfead9c848fd063c569e11b06be11442a8175d588e10607ee2150 - XDEBUG_MODE: coverage - docker: - - image: circleci/php:7-cli-node-browsers-legacy - working_directory: ~/repo +# PHPUnit Composer min/max test. +# TODO: Make our own orb out of this. + +version: 2.1 +orbs: + php: circleci/php@1.1.0 + +commands: + update-packages: + description: | + Update your composer packages with automated caching and best practices applied. + parameters: + app-dir: + default: ~/project + description: Path to the directory containing your composer.json file. Not needed if composer.json lives in the root. + type: string + cache-files-dir: + default: /home/circleci/.composer/cache/files + description: Absolute path to the file cache folder. This should be inline with "composer global config cache-files-dir --absolute". + type: string + cache-key: + default: composer.lock + description: If this file is updated a new cache bucket will be created. Recommended to use composer.lock. Use composer.json when composer.lock is absent. + type: string + cache-version: + default: v1 + description: Change the default cache version if you need to clear the cache for any reason. + type: string + install-flags: + default: --no-interaction --prefer-dist + description: | + By default, packages will be installed with "composer install --no-interaction --prefer-dist", use this to override the standard install flags. + type: string + vendor-dir: + default: vendor + description: Relative path to the vendor folder. Relative to "app-dir". This should be inline with "composer config vendor-dir". + type: string + with-cache: + default: true + description: Enable automatic caching of your dependencies for increased speed. + type: boolean steps: - - checkout + - when: + condition: << parameters.with-cache >> + steps: + - restore_cache: + keys: + - composer-deps-<>-{{ checksum "<>/<>" }} - run: - name: Setup dependencies command: | - sudo composer self-update - composer install -n --prefer-dist + if [ ! -f "composer.json" ] && [ ! -f "composer.lock" ]; then + echo + echo "---" + echo "Unable to find your composer.json and composer.lock files. Did you forget to set the app-dir parameter?" + echo "---" + echo + echo "Current directory: $(pwd)" + echo + echo + echo "List directory: " + echo + ls + exit 1 + fi + name: Verify composer.json and/or composer.lock exist + working_directory: <> + - run: + command: composer update <> + name: Updating Composer Packages + working_directory: <> + - when: + condition: << parameters.with-cache >> + steps: + - save_cache: + key: composer-deps-<>-{{ checksum "<>/<>" }} + paths: + - <>/<> + - <> + install-xdebug: + steps: + - run: + name: Install XDebug + command: sudo -E install-php-extensions xdebug && sudo -E docker-php-ext-enable xdebug + + install-cc-test-reporter: + # TODO: Parameterize location. + steps: - run: - name: Setup Code Climate test-reporter + name: Install Codeclimate test reporter command: | curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter chmod +x ./cc-test-reporter - - run: - name: Run tests - command: | - ./cc-test-reporter before-build - vendor/bin/phpunit --testsuite all --coverage-clover clover.xml - ./cc-test-reporter after-build --coverage-input-type clover --exit-code $? + + run-phpunit-tests: + description: | + Run PHPUnit tests. + parameters: + app-dir: + default: ~/project + description: Path to the directory containing your composer.json file. Not needed if composer.json lives in the root. + type: string + install-flags: + default: "" + description: Arguments to `composer update`. + type: string + test-command: + default: test + description: The name of the script within your composer.json which will run your tests. + type: string + report-to-codeclimate: + type: boolean + default: false + description: Report coverage info to Codeclimate. + steps: + - checkout + - update-packages: + app-dir: <> + cache-key: composer.json + install-flags: <> + - when: + condition: <> + steps: + - install-xdebug + - install-cc-test-reporter + - run: | + ./cc-test-reporter before-build + XDEBUG_MODE=coverage composer <> -- --coverage-clover clover.xml + ./cc-test-reporter after-build --coverage-input-type clover --exit-code $? + - when: + condition: + not: <> + steps: + - run: | + XDEBUG_MODE=off composer <> + +jobs: + matrix-conditions: + environment: + CC_TEST_REPORTER_ID: 8ec926841c6dfead9c848fd063c569e11b06be11442a8175d588e10607ee2150 + description: Run tests for matrix + executor: + name: php/default + tag: << parameters.version >> + parameters: + version: + default: "7.4" + description: The `cimg/php` Docker image version tag. + type: string + install-flags: + default: "" + description: Arguments to `composer update`. + type: string + steps: + - when: + condition: + and: + - equal: [ "8.1", <> ] + - equal: [ "", <> ] + steps: + - run-phpunit-tests: + report-to-codeclimate: true + install-flags: << parameters.install-flags >> + - when: + condition: + not: + and: + - equal: [ "8.1", <> ] + - equal: [ "", <> ] + steps: + - run-phpunit-tests: + install-flags: << parameters.install-flags >> + +workflows: + all-tests: + jobs: + - matrix-conditions: + matrix: + parameters: + version: ["7.4", "8.0", "8.1"] + install-flags: ["", "--prefer-lowest"] diff --git a/.gitignore b/.gitignore index 13a6327..1952f1d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,6 @@ vendor/ .phpunit* .vscode/ -/.idea/codeStyles/codeStyleConfig.xml /composer.lock -/.idea/modules.xml -/.idea/php.xml -/.idea/RootedJsonData.iml -/.idea/vcs.xml -/.idea/workspace.xml +.idea +.ddev \ No newline at end of file diff --git a/README.md b/README.md index 6531c6e..9c393c0 100644 --- a/README.md +++ b/README.md @@ -16,4 +16,4 @@ echo $data->{"$.number"}; // 3 echo $data->{"$[number]"}; // 3 echo "{$data}"; // {"number":3} $data->{"$.number"} = "three"; // EXCEPTION -``` +``` \ No newline at end of file diff --git a/composer.json b/composer.json index 2ccaa86..0129825 100644 --- a/composer.json +++ b/composer.json @@ -1,31 +1,43 @@ { "name": "getdkan/rooted-json-data", "description": "Access and modify JSON-based data objects while enforcing JSON Schema", - "type": "library", "license": "GPL-3.0-or-later", + "type": "library", + "authors": [ + { + "name": "fmizzell", + "email": "fmizzell.dev@gmail.com" + }, + { + "name": "Dan Feder", + "email": "dafeder@mailbox.org" + } + ], "require": { - "opis/json-schema": "^1.0", + "ext-json": "*", "galbar/jsonpath": "^1.1", - "ext-json": "*" + "opis/json-schema": "^1.0.8" }, "require-dev": { - "phpunit/phpunit": "^9.4" + "phpunit/phpunit": "^9.4", + "rector/rector": "^0.15.19", + "squizlabs/php_codesniffer": "^3.7" }, "autoload": { "psr-4": { - "RootedData\\": "src/", - "RootedDataTest\\": "tests/" + "RootedData\\": "src/" } }, - "authors": [ - { - "name": "fmizzell", - "email": "fmizzell.dev@gmail.com" - }, - { - "name": "Dan Feder", - "email": "dafeder@mailbox.org" + "autoload-dev": { + "psr-4": { + "RootedDataTest\\": "tests/" } - - ] + }, + "scripts": { + "phpcbf": "./vendor/bin/phpcbf", + "phpcs": "./vendor/bin/phpcs", + "rector": "./vendor/bin/rector process", + "rector-dry-run": "./vendor/bin/rector process --dry-run", + "test": "./vendor/bin/phpunit --testsuite all" + } } diff --git a/phpcs.xml b/phpcs.xml new file mode 100644 index 0000000..5c4a459 --- /dev/null +++ b/phpcs.xml @@ -0,0 +1,14 @@ + + + + + PHP CodeSniffer configuration for GetDKAN. + + src + tests + rector.php + + + + + diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..f36950f --- /dev/null +++ b/rector.php @@ -0,0 +1,17 @@ +paths([ + __DIR__ . '/src', + __DIR__ . '/tests', + ]); + + $rectorConfig->sets([ + LevelSetList::UP_TO_PHP_74, + ]); +};