From 7fc27a1b13fb4617bca9f454c0bf5409003cb7f8 Mon Sep 17 00:00:00 2001 From: amecea Date: Mon, 8 Aug 2022 16:51:16 +0300 Subject: [PATCH 1/5] Add drone yaml Add Makefile for build Ignore build files and move composer files --- .ac-php-conf.json | 22 + .drone.jsonnet | 76 + .drone.yml | 42 + .gitignore | 7 +- .phpcs.xml.dist | 47 + Makefile | 14 + bin/deploy.sh | 0 src/composer.json => composer.json | 3 + composer.lock | 2894 ++++++++++++++++++++++++++++ phpunit.xml | 17 +- src/composer.lock | 1278 ------------ tests/bootstrap.php | 25 +- tests/wp-tests-config.php | 50 + 13 files changed, 3176 insertions(+), 1299 deletions(-) create mode 100644 .ac-php-conf.json create mode 100644 .drone.jsonnet create mode 100644 .drone.yml create mode 100644 .phpcs.xml.dist create mode 100644 Makefile mode change 100644 => 100755 bin/deploy.sh rename src/composer.json => composer.json (95%) create mode 100644 composer.lock delete mode 100644 src/composer.lock create mode 100644 tests/wp-tests-config.php diff --git a/.ac-php-conf.json b/.ac-php-conf.json new file mode 100644 index 00000000..7edd623f --- /dev/null +++ b/.ac-php-conf.json @@ -0,0 +1,22 @@ +{ + "use-cscope": null, + "tag-dir": null, + "filter": { + "php-file-ext-list": [ + "php" + ], + "php-path-list": [ + "." + ], + "ignore-ruleset": [ + "# like .gitignore file ", + "/vendor/**/[tT]ests/**/*.php", + "/vendor/**/[Ee]xamples/**/*.php", + "/vendor/composer/*.php", + "/vendor/*.php", + "# not need php_codesniffer", + "/vendor/squizlabs/php_codesniffer/**/*.php", + "# -- end -- " + ] + } +} \ No newline at end of file diff --git a/.drone.jsonnet b/.drone.jsonnet new file mode 100644 index 00000000..7b688c3b --- /dev/null +++ b/.drone.jsonnet @@ -0,0 +1,76 @@ + +local Pipeline(php_version, wp_version = "latest") = + { + kind: 'pipeline', + name: 'php-' + php_version, + + clone: { + disable: true + }, + + steps: [ + { + name: "git", + pull: "default", + image: "plugins/git", + settings: { + depth: 0, + tags: true + } + }, + { + name: "install deps", + image: "quay.io/presslabs/build:latest", + environment: { + WP_CORE_DIR: "/workspace/presslabs/toplytics/wordpress", + WP_TEST_DIR: "/workspace/presslabs/toplytics/wordpress-test-lib", + }, + commands: [ + // install build deps + "make build.tools", + // install wordpress + "make wordpress.build WP_VERSION=%s" % wp_version, + ], + }, + { + name: "test", + image: "docker.io/presslabs/php-runtime:%s" % php_version, + commands: [ + "make test", + //"WP_MULTISITE=1 phpunit", + ], + }, + { + name: "publish", + image: "quay.io/presslabs/build:latest", + group: "publish", + commands: [ + "/usr/local/bin/setup-credentials-helper.sh", + ], + when: { + event: { + include: ['tag'] + } + } + } + ], + + services: [ + { + name: "database", + image: "percona:5.7", + pull: "always", + environment: { + MYSQL_DATABASE: "wordpress_test", + MYSQL_USER: "wordpress", + MYSQL_PASSWORD: "wordpress", + MYSQL_ROOT_PASSWORD: "test" + } + } + ], + }; + +[ + Pipeline('8.0'), + //Pipeline('7.4'), +] diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 00000000..efd1173c --- /dev/null +++ b/.drone.yml @@ -0,0 +1,42 @@ +--- +clone: + disable: true +kind: pipeline +name: php-8.0 +services: +- environment: + MYSQL_DATABASE: wordpress_test + MYSQL_PASSWORD: wordpress + MYSQL_ROOT_PASSWORD: test + MYSQL_USER: wordpress + image: percona:5.7 + name: database + pull: always +steps: +- image: plugins/git + name: git + pull: default + settings: + depth: 0 + tags: true +- commands: + - make build.tools + - make wordpress.build WP_VERSION=latest + environment: + WP_CORE_DIR: /workspace/presslabs/toplytics/wordpress + WP_TEST_DIR: /workspace/presslabs/toplytics/wordpress-test-lib + image: quay.io/presslabs/build:latest + name: install deps +- commands: + - make test + image: docker.io/presslabs/php-runtime:8.0 + name: test +- commands: + - /usr/local/bin/setup-credentials-helper.sh + group: publish + image: quay.io/presslabs/build:latest + name: publish + when: + event: + include: + - tag diff --git a/.gitignore b/.gitignore index 73060851..9bdefb4d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,9 @@ Thumbs.db vendor/ .idea/ *.sql -*.zip \ No newline at end of file +*.zip + +.cache/ +.work/ +_output/ +bin/ diff --git a/.phpcs.xml.dist b/.phpcs.xml.dist new file mode 100644 index 00000000..a86cfdaf --- /dev/null +++ b/.phpcs.xml.dist @@ -0,0 +1,47 @@ + + + Generally-applicable sniffs for WordPress plugins. + + + . + /vendor/ + /node_modules/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..63b75480 --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +PROJECT_NAME := toplytics +PROJECT_REPO := github.com/presslabs/toplytics + +include build/makelib/common.mk +include build/makelib/wordpress.mk +include build/makelib/php.mk + +WP_CLI_VERSION:=2.6.0 +WP_CLI_DOWNLOAD_URL:=https://github.com/wp-cli/wp-cli/releases/download/v$(WP_CLI_VERSION)/wp-cli-$(WP_CLI_VERSION).phar +$(eval $(call tool.download,wp,$(WP_CLI_VERSION),$(WP_CLI_DOWNLOAD_URL))) + +# override php tests because of wordpress.mk +.php.test.init: + @$(INFO) test wordpress pass diff --git a/bin/deploy.sh b/bin/deploy.sh old mode 100644 new mode 100755 diff --git a/src/composer.json b/composer.json similarity index 95% rename from src/composer.json rename to composer.json index fd478c3e..374bd487 100755 --- a/src/composer.json +++ b/composer.json @@ -18,6 +18,9 @@ "php": "~7.0", "google/apiclient": "^2.10" }, + "require-dev": { + "phpunit/phpunit": "<8" + }, "scripts": { "pre-autoload-dump": "Google\\Task\\Composer::cleanup" }, diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000..72f90b7a --- /dev/null +++ b/composer.lock @@ -0,0 +1,2894 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "d378a9a7a6240d9a3bbf32957c601c79", + "packages": [ + { + "name": "firebase/php-jwt", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", + "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", + "shasum": "" + }, + "require": { + "php": "^7.1||^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^1.1", + "phpunit/phpunit": "^7.5||^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.3.0" + }, + "time": "2022-07-15T16:48:45+00:00" + }, + { + "name": "google/apiclient", + "version": "v2.12.6", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-api-php-client.git", + "reference": "f92aa126903a9e2da5bd41a280d9633cb249e79e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/f92aa126903a9e2da5bd41a280d9633cb249e79e", + "reference": "f92aa126903a9e2da5bd41a280d9633cb249e79e", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "~2.0||~3.0||~4.0||~5.0||~6.0", + "google/apiclient-services": "~0.200", + "google/auth": "^1.10", + "guzzlehttp/guzzle": "~5.3.3||~6.0||~7.0", + "guzzlehttp/psr7": "^1.8.4||^2.2.1", + "monolog/monolog": "^1.17||^2.0||^3.0", + "php": "^5.6|^7.0|^8.0", + "phpseclib/phpseclib": "~2.0||^3.0.2" + }, + "require-dev": { + "cache/filesystem-adapter": "^0.3.2|^1.1", + "composer/composer": "^1.10.22", + "phpcompatibility/php-compatibility": "^9.2", + "phpspec/prophecy-phpunit": "^1.1||^2.0", + "phpunit/phpunit": "^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/css-selector": "~2.1", + "symfony/dom-crawler": "~2.1", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/aliases.php" + ], + "psr-4": { + "Google\\": "src/" + }, + "classmap": [ + "src/aliases.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Client library for Google APIs", + "homepage": "http://developers.google.com/api-client-library/php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/google-api-php-client/issues", + "source": "https://github.com/googleapis/google-api-php-client/tree/v2.12.6" + }, + "time": "2022-06-06T20:00:19+00:00" + }, + { + "name": "google/apiclient-services", + "version": "v0.261.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-api-php-client-services.git", + "reference": "c91c5a694e3b8bca37136b830072a23f2c1250fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/c91c5a694e3b8bca37136b830072a23f2c1250fa", + "reference": "c91c5a694e3b8bca37136b830072a23f2c1250fa", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^5.7||^8.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "autoload.php" + ], + "psr-4": { + "Google\\Service\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Client library for Google APIs", + "homepage": "http://developers.google.com/api-client-library/php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/google-api-php-client-services/issues", + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.261.0" + }, + "time": "2022-08-08T01:28:12+00:00" + }, + { + "name": "google/auth", + "version": "v1.21.1", + "source": { + "type": "git", + "url": "https://github.com/googleapis/google-auth-library-php.git", + "reference": "aa3b9ca29258ac6347ce3c8937a2418c5d78f840" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/aa3b9ca29258ac6347ce3c8937a2418c5d78f840", + "reference": "aa3b9ca29258ac6347ce3c8937a2418c5d78f840", + "shasum": "" + }, + "require": { + "firebase/php-jwt": "^5.5||^6.0", + "guzzlehttp/guzzle": "^6.2.1|^7.0", + "guzzlehttp/psr7": "^1.7|^2.0", + "php": "^7.1||^8.0", + "psr/cache": "^1.0|^2.0|^3.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "guzzlehttp/promises": "0.1.1|^1.3", + "kelvinmo/simplejwt": "^0.2.5|^0.5.1", + "phpseclib/phpseclib": "^2.0.31", + "phpspec/prophecy-phpunit": "^1.1", + "phpunit/phpunit": "^7.5||^8.5", + "sebastian/comparator": ">=1.2.3", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Auth\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google Auth Library for PHP", + "homepage": "http://github.com/google/google-auth-library-php", + "keywords": [ + "Authentication", + "google", + "oauth2" + ], + "support": { + "docs": "https://googleapis.github.io/google-auth-library-php/main/", + "issues": "https://github.com/googleapis/google-auth-library-php/issues", + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.21.1" + }, + "time": "2022-05-16T19:34:15+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.4.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.4-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.4.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-06-20T22:16:13+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:56:57+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "13388f00956b1503577598873fffb5ae994b5737" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737", + "reference": "13388f00956b1503577598873fffb5ae994b5737", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2022-06-20T21:43:11+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", + "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2022-07-24T11:55:47+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.6.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "58c3f47f650c94ec05a151692652a868995d2938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2022-06-14T06:56:20+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.14", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2f0b7af658cbea265cbb4a791d6c29a6613f98ef", + "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.14" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2022-04-04T05:15:45+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + } + ], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-03-03T08:28:38+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2022-03-03T13:19:32+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/master" + }, + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "77a32518733312af16a44300404e945338981de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" + }, + "time": "2022-03-15T21:29:03+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.15.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.2", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0 || ^7.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" + }, + "time": "2021-12-08T12:19:24+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "6.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.1", + "phpunit/php-file-iterator": "^2.0", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.1 || ^4.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "ext-xdebug": "^2.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/master" + }, + "time": "2018-10-31T16:06:48+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:42:26+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + }, + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:20:02+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "9c1da83261628cb24b6a6df371b6e312b3954768" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768", + "reference": "9c1da83261628cb24b6a6df371b6e312b3954768", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "abandoned": true, + "time": "2021-07-26T12:15:06+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "7.5.20", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "9467db479d1b0487c99733bb1e7944d32deded2c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c", + "reference": "9467db479d1b0487c99733bb1e7944d32deded2c", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.7", + "phar-io/manifest": "^1.0.2", + "phar-io/version": "^2.0", + "php": "^7.1", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^6.0.7", + "phpunit/php-file-iterator": "^2.0.1", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", + "sebastian/environment": "^4.0", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpunit/phpunit-mock-objects": "*" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/7.5.20" + }, + "time": "2020-01-08T08:45:45+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:15:22+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:04:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:59:04+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:53:42+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-11-11T13:51:24+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0" + }, + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:40:27+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:37:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:34:24+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:30:19+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "~7.0" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/phpunit.xml b/phpunit.xml index 23a6bdc4..fbe233ac 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -6,15 +6,10 @@ convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" - > - - - ./tests/ - - - +> + + + ./tests/ + + diff --git a/src/composer.lock b/src/composer.lock deleted file mode 100644 index 15fe05b8..00000000 --- a/src/composer.lock +++ /dev/null @@ -1,1278 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "5bb48cfc408710b4be0eb405071842c4", - "packages": [ - { - "name": "firebase/php-jwt", - "version": "v6.2.0", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "d28e6df83830252650da4623c78aaaf98fb385f3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d28e6df83830252650da4623c78aaaf98fb385f3", - "reference": "d28e6df83830252650da4623c78aaaf98fb385f3", - "shasum": "" - }, - "require": { - "php": "^7.1||^8.0" - }, - "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", - "phpspec/prophecy-phpunit": "^1.1", - "phpunit/phpunit": "^7.5||^9.5", - "psr/cache": "^1.0||^2.0", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0" - }, - "suggest": { - "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "keywords": [ - "jwt", - "php" - ], - "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.2.0" - }, - "time": "2022-05-13T20:54:50+00:00" - }, - { - "name": "google/apiclient", - "version": "v2.12.6", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "f92aa126903a9e2da5bd41a280d9633cb249e79e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/f92aa126903a9e2da5bd41a280d9633cb249e79e", - "reference": "f92aa126903a9e2da5bd41a280d9633cb249e79e", - "shasum": "" - }, - "require": { - "firebase/php-jwt": "~2.0||~3.0||~4.0||~5.0||~6.0", - "google/apiclient-services": "~0.200", - "google/auth": "^1.10", - "guzzlehttp/guzzle": "~5.3.3||~6.0||~7.0", - "guzzlehttp/psr7": "^1.8.4||^2.2.1", - "monolog/monolog": "^1.17||^2.0||^3.0", - "php": "^5.6|^7.0|^8.0", - "phpseclib/phpseclib": "~2.0||^3.0.2" - }, - "require-dev": { - "cache/filesystem-adapter": "^0.3.2|^1.1", - "composer/composer": "^1.10.22", - "phpcompatibility/php-compatibility": "^9.2", - "phpspec/prophecy-phpunit": "^1.1||^2.0", - "phpunit/phpunit": "^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0", - "squizlabs/php_codesniffer": "^3.0", - "symfony/css-selector": "~2.1", - "symfony/dom-crawler": "~2.1", - "yoast/phpunit-polyfills": "^1.0" - }, - "suggest": { - "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "files": [ - "src/aliases.php" - ], - "psr-4": { - "Google\\": "src/" - }, - "classmap": [ - "src/aliases.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Client library for Google APIs", - "homepage": "http://developers.google.com/api-client-library/php", - "keywords": [ - "google" - ], - "support": { - "issues": "https://github.com/googleapis/google-api-php-client/issues", - "source": "https://github.com/googleapis/google-api-php-client/tree/v2.12.6" - }, - "time": "2022-06-06T20:00:19+00:00" - }, - { - "name": "google/apiclient-services", - "version": "v0.252.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "9941c959f6a1f781e49019b78f453d54554dff73" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/9941c959f6a1f781e49019b78f453d54554dff73", - "reference": "9941c959f6a1f781e49019b78f453d54554dff73", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "phpunit/phpunit": "^5.7||^8.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "autoload.php" - ], - "psr-4": { - "Google\\Service\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Client library for Google APIs", - "homepage": "http://developers.google.com/api-client-library/php", - "keywords": [ - "google" - ], - "support": { - "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.252.0" - }, - "time": "2022-06-06T01:20:11+00:00" - }, - { - "name": "google/auth", - "version": "v1.21.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "73392bad2eb6852eea9084b6bbdec752515cb849" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/73392bad2eb6852eea9084b6bbdec752515cb849", - "reference": "73392bad2eb6852eea9084b6bbdec752515cb849", - "shasum": "" - }, - "require": { - "firebase/php-jwt": "^5.5||^6.0", - "guzzlehttp/guzzle": "^6.2.1|^7.0", - "guzzlehttp/psr7": "^1.7|^2.0", - "php": "^7.1||^8.0", - "psr/cache": "^1.0|^2.0|^3.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "guzzlehttp/promises": "0.1.1|^1.3", - "kelvinmo/simplejwt": "^0.2.5|^0.5.1", - "phpseclib/phpseclib": "^2.0.31", - "phpspec/prophecy-phpunit": "^1.1", - "phpunit/phpunit": "^7.5||^8.5", - "sebastian/comparator": ">=1.2.3", - "squizlabs/php_codesniffer": "^3.5" - }, - "suggest": { - "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\Auth\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google Auth Library for PHP", - "homepage": "http://github.com/google/google-auth-library-php", - "keywords": [ - "Authentication", - "google", - "oauth2" - ], - "support": { - "docs": "https://googleapis.github.io/google-auth-library-php/main/", - "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.21.0" - }, - "time": "2022-04-13T20:35:52+00:00" - }, - { - "name": "guzzlehttp/guzzle", - "version": "7.4.4", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "e3ff079b22820c2029d4c2a87796b6a0b8716ad8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/e3ff079b22820c2029d4c2a87796b6a0b8716ad8", - "reference": "e3ff079b22820c2029d4c2a87796b6a0b8716ad8", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", - "php": "^7.2.5 || ^8.0", - "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" - }, - "provide": { - "psr/http-client-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "ext-curl": "*", - "php-http/client-integration-tests": "^3.0", - "phpunit/phpunit": "^8.5.5 || ^9.3.5", - "psr/log": "^1.1 || ^2.0 || ^3.0" - }, - "suggest": { - "ext-curl": "Required for CURL handler support", - "ext-intl": "Required for Internationalized Domain Name (IDN) support", - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "7.4-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Jeremy Lindblom", - "email": "jeremeamia@gmail.com", - "homepage": "https://github.com/jeremeamia" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "psr-18", - "psr-7", - "rest", - "web service" - ], - "support": { - "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.4" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", - "type": "tidelift" - } - ], - "time": "2022-06-09T21:39:15+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "symfony/phpunit-bridge": "^4.4 || ^5.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "support": { - "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/1.5.1" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", - "type": "tidelift" - } - ], - "time": "2021-10-22T20:56:57+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "83260bb50b8fc753c72d14dc1621a2dac31877ee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/83260bb50b8fc753c72d14dc1621a2dac31877ee", - "reference": "83260bb50b8fc753c72d14dc1621a2dac31877ee", - "shasum": "" - }, - "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "ralouphie/getallheaders": "^3.0" - }, - "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4.1", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.8 || ^9.3.10" - }, - "suggest": { - "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3-dev" - } - }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk", - "homepage": "https://github.com/GrahamCampbell" - }, - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "George Mponos", - "email": "gmponos@gmail.com", - "homepage": "https://github.com/gmponos" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/Nyholm" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://github.com/sagikazarmark" - }, - { - "name": "Tobias Schultze", - "email": "webmaster@tubo-world.de", - "homepage": "https://github.com/Tobion" - }, - { - "name": "Márk Sági-Kazár", - "email": "mark.sagikazar@gmail.com", - "homepage": "https://sagikazarmark.hu" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "psr-7", - "request", - "response", - "stream", - "uri", - "url" - ], - "support": { - "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.3.0" - }, - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://github.com/Nyholm", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", - "type": "tidelift" - } - ], - "time": "2022-06-09T08:26:02+00:00" - }, - { - "name": "monolog/monolog", - "version": "2.7.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/monolog.git", - "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5579edf28aee1190a798bfa5be8bc16c563bd524", - "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" - }, - "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", - "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7 || ^8", - "ext-json": "*", - "graylog2/gelf-php": "^1.4.2", - "guzzlehttp/guzzle": "^7.4", - "guzzlehttp/psr7": "^2.2", - "mongodb/mongodb": "^1.8", - "php-amqplib/php-amqplib": "~2.4 || ^3", - "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3 || ^2 || ^3", - "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", - "symfony/mailer": "^5.4 || ^6", - "symfony/mime": "^5.4 || ^6" - }, - "suggest": { - "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", - "doctrine/couchdb": "Allow sending log messages to a CouchDB server", - "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", - "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", - "ext-mbstring": "Allow to work properly with unicode symbols", - "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", - "ext-openssl": "Required to send log messages using SSL", - "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", - "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", - "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", - "php-console/php-console": "Allow sending log messages to Google Chrome", - "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Monolog\\": "src/Monolog" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Sends your logs to files, sockets, inboxes, databases and various web services", - "homepage": "https://github.com/Seldaek/monolog", - "keywords": [ - "log", - "logging", - "psr-3" - ], - "support": { - "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.7.0" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], - "time": "2022-06-09T08:59:12+00:00" - }, - { - "name": "paragonie/constant_time_encoding", - "version": "v2.6.0", - "source": { - "type": "git", - "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "3f3bf06406244a94aeffd5818ba05b41a1754ae5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/3f3bf06406244a94aeffd5818ba05b41a1754ae5", - "reference": "3f3bf06406244a94aeffd5818ba05b41a1754ae5", - "shasum": "" - }, - "require": { - "php": "^7|^8" - }, - "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", - "vimeo/psalm": "^1|^2|^3|^4" - }, - "type": "library", - "autoload": { - "psr-4": { - "ParagonIE\\ConstantTime\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https://www.tobtu.com", - "role": "Original Developer" - } - ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", - "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/constant_time_encoding/issues", - "source": "https://github.com/paragonie/constant_time_encoding" - }, - "time": "2022-06-10T07:38:28+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.100", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", - "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", - "shasum": "" - }, - "require": { - "php": ">= 7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/random_compat/issues", - "source": "https://github.com/paragonie/random_compat" - }, - "time": "2020-10-15T08:29:30+00:00" - }, - { - "name": "phpseclib/phpseclib", - "version": "3.0.14", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2f0b7af658cbea265cbb4a791d6c29a6613f98ef", - "reference": "2f0b7af658cbea265cbb4a791d6c29a6613f98ef", - "shasum": "" - }, - "require": { - "paragonie/constant_time_encoding": "^1|^2", - "paragonie/random_compat": "^1.4|^2.0|^9.99.99", - "php": ">=5.6.1" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "suggest": { - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib3\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "support": { - "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.14" - }, - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ], - "time": "2022-04-04T05:15:45+00:00" - }, - { - "name": "psr/cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/master" - }, - "time": "2016-08-06T20:24:11+00:00" - }, - { - "name": "psr/http-client", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "shasum": "" - }, - "require": { - "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Client\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP clients", - "homepage": "https://github.com/php-fig/http-client", - "keywords": [ - "http", - "http-client", - "psr", - "psr-18" - ], - "support": { - "source": "https://github.com/php-fig/http-client/tree/master" - }, - "time": "2020-06-29T06:28:15+00:00" - }, - { - "name": "psr/http-factory", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "shasum": "" - }, - "require": { - "php": ">=7.0.0", - "psr/http-message": "^1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for PSR-7 HTTP message factories", - "keywords": [ - "factory", - "http", - "message", - "psr", - "psr-17", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" - }, - "time": "2019-04-30T12:38:16+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" - }, - "time": "2019-03-08T08:55:37+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - } - ], - "packages-dev": [], - "aliases": [], - "minimum-stability": "dev", - "stability-flags": [], - "prefer-stable": true, - "prefer-lowest": false, - "platform": { - "php": "~7.0" - }, - "platform-dev": [], - "plugin-api-version": "2.1.0" -} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 8afeccc4..f6e0e1dc 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -1,31 +1,38 @@ Date: Wed, 10 Aug 2022 15:24:42 +0300 Subject: [PATCH 2/5] Squashed 'build/' content from commit 6800217 git-subtree-dir: build git-subtree-split: 680021764ea226db2a3d10b1561014ebeab2f015 --- .drone.yml | 95 ++++ .gitignore | 6 + LICENSE | 201 ++++++++ Makefile | 16 + README.md | 74 +++ bin/po-diff.sh | 30 ++ images/build/Dockerfile | 195 +++++++ images/build/Makefile | 21 + .../build/build-scripts/install-packages.sh | 24 + images/build/root/build/rsyncd.sh | 51 ++ images/build/root/build/run.sh | 34 ++ .../usr/local/bin/setup-credentials-helper.sh | 81 +++ images/build/root/usr/local/bin/xvfb-chrome | 29 ++ makelib/cache.mk | 59 +++ makelib/common.mk | 488 ++++++++++++++++++ makelib/gcp.mk | 32 ++ makelib/gettext.mk | 81 +++ makelib/git-publish.mk | 147 ++++++ makelib/golang.mk | 447 ++++++++++++++++ makelib/helm.mk | 141 +++++ makelib/image.mk | 338 ++++++++++++ makelib/k8s-tools.mk | 37 ++ makelib/kubebuilder.mk | 116 +++++ makelib/nodejs.mk | 149 ++++++ makelib/php.mk | 157 ++++++ makelib/protobuf.mk | 113 ++++ makelib/react.mk | 114 ++++ makelib/utils.mk | 84 +++ makelib/wordpress.mk | 91 ++++ 29 files changed, 3451 insertions(+) create mode 100644 .drone.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100755 bin/po-diff.sh create mode 100644 images/build/Dockerfile create mode 100644 images/build/Makefile create mode 100755 images/build/build-scripts/install-packages.sh create mode 100755 images/build/root/build/rsyncd.sh create mode 100755 images/build/root/build/run.sh create mode 100755 images/build/root/usr/local/bin/setup-credentials-helper.sh create mode 100755 images/build/root/usr/local/bin/xvfb-chrome create mode 100644 makelib/cache.mk create mode 100644 makelib/common.mk create mode 100644 makelib/gcp.mk create mode 100644 makelib/gettext.mk create mode 100644 makelib/git-publish.mk create mode 100644 makelib/golang.mk create mode 100644 makelib/helm.mk create mode 100644 makelib/image.mk create mode 100644 makelib/k8s-tools.mk create mode 100644 makelib/kubebuilder.mk create mode 100644 makelib/nodejs.mk create mode 100644 makelib/php.mk create mode 100644 makelib/protobuf.mk create mode 100644 makelib/react.mk create mode 100644 makelib/utils.mk create mode 100644 makelib/wordpress.mk diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 00000000..ab4c7da7 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,95 @@ +kind: pipeline +name: default + +clone: + disable: true + +workspace: + base: /workspace + path: src/github.com/presslabs/build + +steps: +- name: clone + image: plugins/git + settings: + depth: 0 + tags: true + +- name: install dependencies + image: presslabs/build:stable + commands: + - make -j4 build.tools + +- name: build + pull: true + image: presslabs/build:stable + environment: + DOCKER_HOST: "unix:///workspace/docker.sock" + commands: + - make -j4 build + +- name: publish + image: presslabs/build:stable + commands: + - /usr/local/bin/setup-credentials-helper.sh + - make publish + environment: + DOCKER_HOST: "unix:///workspace/docker.sock" + DOCKER_USERNAME: presslabsbot + DOCKER_PASSWORD: + from_secret: DOCKERHUB_TOKEN + when: + ref: + - refs/heads/master + - refs/heads/release-* + +services: +- name: docker + image: docker:dind + privileged: true + commands: + - /usr/local/bin/dockerd-entrypoint.sh dockerd --host "unix:///workspace/docker.sock" --storage-driver overlay2 --log-level error + + +trigger: + ref: + - refs/pull/** + - refs/heads/** + event: + exclude: + - promote + - tag + +--- +kind: pipeline +name: promote + +clone: + disable: true + +workspace: + base: /workspace + path: src/github.com/presslabs/build + +steps: +- name: clone + image: plugins/git + settings: + depth: 0 + tags: true + +- name: promote + image: presslabs/build:stable + commands: + - /usr/local/bin/setup-credentials-helper.sh + - make promote CHANNEL=${DRONE_DEPLOY_TO} PROMOTE_IMAGE_TAG=${PUBLISH_TAG} + - '[ "$PUBLISH_TAG" = "" ] || make tag VERSION=${PUBLISH_TAG}' + environment: + DOCKER_HOST: "unix:///workspace/docker.sock" + DOCKER_USERNAME: presslabsbot + DOCKER_PASSWORD: + from_secret: DOCKERHUB_TOKEN + +trigger: + event: + - promote diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..54768b76 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +_output +.cache +.work +/bin/ + +.#* \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..ca30b715 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +# Project Setup +PROJECT_NAME := presslabs-build +PROJECT_REPO := github.com/presslabs/build + +PLATFORMS = linux_amd64 + +# this is required, since by default, the makelib files are under a ./build path prefix, but here, +# they are under root +ROOT_DIR := $(abspath $(shell cd ./ && pwd -P)) + +include makelib/common.mk + +IMAGES ?= build +DOCKER_REGISTRY ?= presslabs + +include makelib/image.mk diff --git a/README.md b/README.md new file mode 100644 index 00000000..190c97e9 --- /dev/null +++ b/README.md @@ -0,0 +1,74 @@ +# build +Presslabs GNU make based build system + +## Goals + +1. Allow building locally the same way the project is build on CI +2. Provide a sane test, build, publish flow +3. Provide stable toolchain for building (eg. pinned tool versions) +4. Enables caching for speeding up builds. + +## Quickstart + +```sh +git subtree add -P build https://github.com/presslabs/build.git + +cat < Makefile +# Project Setup +PROJECT_NAME := mysql-operator +PROJECT_REPO := github.com/presslabs/mysql-operator + +include build/makelib/common.mk +``` + +### Push back changes + +An [workaround](https://github.com/rust-lang/rust-clippy/issues/5565#issuecomment-623489754) on how +to bypass the segfault of git subtree command on repose with more commits. + +```sh +ulimit -s 60000 # workaround to fix segfault + +git subtree push -P build/ git@github.com:presslabs/build.git +``` + +## Development workflow + +The image publishing will work as follows: + +On a feature branch (e.g. `feat-*`): + * Drone build runs without image publishing + * Can't trigger a promotion (it will fail) + +On a release branch (e.i. `release-*` or `master`): + * Drone build will publish images using git-semver using the following tags: `$(git-semver)`, `$(git-semver)-$ARCH` + * Manually can promote to the following channels (`$CHANNEL`): `stable`, `beta`, `alpha`, `master` + * *On promote*: the images are published with the following tags: `$CHANNEL`, `$CHANNEL-$(git-semver)`, `$(git-semver)`, `$(git-semver)-$ARCH` + * *On promote* and parameter `PUBLISH_TAG` is set: a new git tag will be created and images will be published under the following tags: `$CHANNEL`, `$CHANNEL-$PUBLISH_TAG`, `$PUBLISH_TAG` (if channel is `stable`). + +On git tag event the CI will not run. + +## Usage + +``` +Usage: make [make-options] [options] + +Common Targets: + build Build source code and other artifacts for host platform. + build.all Build source code and other artifacts for all platforms. + build.tools Install the required build tools. + clean Remove all files created during the build. + distclean Remove all files created during the build including cached tools. + generate Run code generation tools. + fmt Run code auto-formatting tools. + lint Run lint and code analysis tools. + test Runs unit tests. + e2e Runs end-to-end integration tests. + translate Collect translation strings and post-process the .pot/.po files. + help Show this help info. +``` + +## Acknowledgement + +This work is based on https://github.com/bitpoke/build +This work is based on https://github.com/upbound/build. diff --git a/bin/po-diff.sh b/bin/po-diff.sh new file mode 100755 index 00000000..4ef21a48 --- /dev/null +++ b/bin/po-diff.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +# Copyright 2019 Pressinfra SRL +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +export ROOT_DIR=$(dirname "${BASH_SOURCE}")/../.. + +# Install tools we need, but only from vendor/... +cd "${ROOT_DIR}" + +diff -u \ + <(grep -E '^msgid' "${1}" | sort | sed 's/msgid[[:space:]]*//g') \ + <(grep -E '^msgid' "${2}" | sort | sed 's/msgid[[:space:]]*//g') + +exit 0 diff --git a/images/build/Dockerfile b/images/build/Dockerfile new file mode 100644 index 00000000..dc721def --- /dev/null +++ b/images/build/Dockerfile @@ -0,0 +1,195 @@ +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM google/cloud-sdk:367.0.0 + +ARG ARCH + +ENV DEBIAN_FRONTEND noninteractive + +COPY build-scripts /usr/local/build-scripts + +COPY --from=docker/buildx-bin:0.6.1 /buildx /usr/libexec/docker/cli-plugins/docker-buildx +RUN docker buildx version + +# ------------------------------------------------------------------------------------------------ +# install build and release tools +RUN /usr/local/build-scripts/install-packages.sh \ + apt-transport-https \ + gettext \ + jq \ + lsb-release \ + make \ + rsync \ + runit \ + sudo \ + wget \ + zip +# ------------------------------------------------------------------------------------------------ +# PHP +RUN sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' \ + && wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg \ + && /usr/local/build-scripts/install-packages.sh \ + php7.4-bcmath \ + php7.4-curl \ + php7.4-cli \ + php7.4-fpm \ + php7.4-gd \ + php7.4-mbstring \ + php7.4-mysql \ + php7.4-opcache \ + php7.4-tidy \ + php7.4-xml \ + php7.4-xmlrpc \ + php7.4-xsl \ + php7.4-zip \ + php-apcu \ + php-apcu-bc \ + php-geoip \ + php-imagick \ + php-memcached \ + php-redis \ + php-sodium \ + php-yaml \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +# ------------------------------------------------------------------------------------------------ +# git config +RUN git config --global user.email "bot@presslabs.com" \ + && git config --global user.name "RoBot" \ + && git config --global diff.tar-filelist.binary true \ + && git config --global diff.tar-filelist.textconv 'tar -tvf' \ + && git config --global diff.tar.binary true \ + && git config --global diff.tar.textconv 'tar -xvOf' + +# ------------------------------------------------------------------------------------------------ +# Go support +RUN GO_VERSION=1.18.1 && \ + GO_HASH=b3b815f47ababac13810fc6021eb73d65478e0b2db4b09d348eefad9581a2334 && \ + curl -fsSL https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz -o golang.tar.gz && \ + echo "${GO_HASH} golang.tar.gz" | sha256sum -c - && \ + tar -C /usr/local -xzf golang.tar.gz && \ + rm golang.tar.gz +ENV GOPATH /workspace +ENV PATH /workspace/bin:/usr/local/go/bin:$PATH + +# precompile the go standard library for all supported platforms and configurations +# the install suffixes match those in golang.mk so please keep them in sync +RUN platforms="darwin_amd64 windows_amd64 linux_amd64 linux_arm64" && \ + for p in $platforms; do CGO_ENABLED=0 GOOS=${p%_*} GOARCH=${p##*_} GOARM=7 go install -installsuffix static -a std; done + +# ------------------------------------------------------------------------------------------------ +# Node JS and chrome support +RUN curl -fsSL https://deb.nodesource.com/setup_14.x | bash - && \ + curl -fsSL https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \ + echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google.list && \ + /usr/local/build-scripts/install-packages.sh \ + nodejs \ + google-chrome-stable \ + xvfb && \ + rm -f /etc/apt/sources.list.d/google.list && \ + ln -fs /usr/local/bin/xvfb-chrome /usr/bin/google-chrome && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* +ENV CHROME_BIN /usr/bin/google-chrome + +# ------------------------------------------------------------------------------------------------ +# Yarn +RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \ + echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && \ + /usr/local/build-scripts/install-packages.sh \ + yarn && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +# ------------------------------------------------------------------------------------------------ +# rclone +RUN set -ex \ + && export RCLONE_VERSION=1.57.0 \ + && curl -sL -o rclone-v${RCLONE_VERSION}-linux-amd64.deb https://github.com/rclone/rclone/releases/download/v${RCLONE_VERSION}/rclone-v${RCLONE_VERSION}-linux-amd64.deb \ + && dpkg -i rclone-v${RCLONE_VERSION}-linux-amd64.deb \ + && rm rclone-v${RCLONE_VERSION}-linux-amd64.deb \ + && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +# ------------------------------------------------------------------------------------------------ +# dockerize +RUN set -ex \ + && export DOCKERIZE_VERSION="2.1.0" \ + && curl -sL -o dockerize.tar.gz "https://github.com/presslabs/dockerize/releases/download/v${DOCKERIZE_VERSION}/dockerize-linux-amd64-v${DOCKERIZE_VERSION}.tar.gz" \ + && tar -C /usr/local/bin -xzvf dockerize.tar.gz \ + && rm dockerize.tar.gz \ + && chmod 0755 /usr/local/bin/dockerize \ + && chown root:root /usr/local/bin/dockerize + +# ------------------------------------------------------------------------------------------------ +# sops +RUN set -ex \ + && export SOPS_VERSION="3.7.1" \ + && curl -sL -o /usr/local/bin/sops "https://github.com/mozilla/sops/releases/download/v${SOPS_VERSION}/sops-v${SOPS_VERSION}.linux" \ + && chmod 0755 /usr/local/bin/sops \ + && chown root:root /usr/local/bin/sops + +# ------------------------------------------------------------------------------------------------ +# helm +RUN set -ex \ + && export HELM_VERSION="3.8.2" \ + && curl -sL -o helm.tar.gz "https://get.helm.sh/helm-v${HELM_VERSION}-linux-amd64.tar.gz" \ + && tar -C /usr/local/bin -xzvf helm.tar.gz --strip-components 1 linux-amd64/helm \ + && rm helm.tar.gz \ + && chmod 0755 /usr/local/bin/helm \ + && chown root:root /usr/local/bin/helm + +# ------------------------------------------------------------------------------------------------ +# helm secrets plugin +RUN set -ex \ + && export HELM_SECRETS_VERSION="3.8.3" \ + && helm plugin install https://github.com/jkroepke/helm-secrets --version ${HELM_SECRETS_VERSION} + +# ------------------------------------------------------------------------------------------------ +# kustomize +RUN set -ex \ + && export KUSTOMIZE_VERSION="4.5.4" \ + && curl -sL -o kustomize.tar.gz "https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_linux_amd64.tar.gz" \ + && tar -C /usr/local/bin -xzvf kustomize.tar.gz \ + && rm kustomize.tar.gz \ + && chmod 0755 /usr/local/bin/kustomize \ + && chown root:root /usr/local/bin/kustomize + +# ------------------------------------------------------------------------------------------------ +# docker-compose + +RUN set -ex \ + && export DOCKER_COMPOSE_VERSION="1.29.2" \ + && curl -sL -o /usr/local/bin/docker-compose "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-Linux-x86_64" \ + && chmod +x /usr/local/bin/docker-compose \ + && chown root:root /usr/local/bin/docker + +# ------------------------------------------------------------------------------------------------ +# Run tini as PID 1 and avoid signal handling issues + +RUN set -ex \ + && export TINI_VERSION=v0.19.0 \ + && curl -sL -o /tini https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${ARCH} \ + && chmod +x /tini + +# ------------------------------------------------------------------------------------------------ +# yq + +RUN set -ex \ + && export YQ_VERSION=4.24.5 \ + && curl -sL -o /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/yq_linux_amd64" \ + && chmod 0755 /usr/local/bin/yq \ + && chown root:root /usr/local/bin/yq + +COPY root / + +ENTRYPOINT [ "/tini", "-g", "--", "/build/run.sh" ] diff --git a/images/build/Makefile b/images/build/Makefile new file mode 100644 index 00000000..70913081 --- /dev/null +++ b/images/build/Makefile @@ -0,0 +1,21 @@ +PLATFORMS := linux_amd64 +include ../../makelib/common.mk + +# this is required, since by default, the makelib files are under a ./build path prefix, but here, +# they are under root +ROOT_DIR := $(abspath $(shell cd ./../.. && pwd -P)) + +IMAGE = $(BUILD_REGISTRY)/build-$(ARCH) +CACHE_IMAGES = $(IMAGE) +include ../../makelib/image.mk + +img.build: + @$(INFO) docker build $(IMAGE) $(IMAGE_PLATFORM) + @cp -La . $(IMAGE_TEMP_DIR) + @mkdir -p $(IMAGE_TEMP_DIR)/rootfs + @docker buildx build $(BUILD_ARGS) \ + --platform $(IMAGE_PLATFORM) \ + -t $(IMAGE) \ + --build-arg ARCH=$(ARCH) \ + $(IMAGE_TEMP_DIR) + @$(OK) docker build $(IMAGE) diff --git a/images/build/build-scripts/install-packages.sh b/images/build/build-scripts/install-packages.sh new file mode 100755 index 00000000..20520572 --- /dev/null +++ b/images/build/build-scripts/install-packages.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +# Copyright 2019 Pressinfra +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +apt-get update +apt-get install -yy -q --no-install-recommends "${@}" +apt-get clean +rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* diff --git a/images/build/root/build/rsyncd.sh b/images/build/root/build/rsyncd.sh new file mode 100755 index 00000000..35ff953f --- /dev/null +++ b/images/build/root/build/rsyncd.sh @@ -0,0 +1,51 @@ +#!/bin/bash -e + +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +VOLUME=${VOLUME:-/volume} +ALLOW=${ALLOW:-192.168.0.0/16 172.16.0.0/12 10.0.0.0/8} +OWNER=${OWNER:-nobody} +GROUP=${GROUP:-nogroup} + +if [[ "${GROUP}" != "nogroup" && "${GROUP}" != "root" ]]; then + groupadd -g ${GROUP} rsync +fi + +if [[ "${OWNER}" != "nobody" && "${OWNER}" != "root" ]]; then + groupadd -u ${OWNER} -G rsync rsync +fi + +chown "${OWNER}:${GROUP}" "${VOLUME}" + +[ -f /etc/rsyncd.conf ] || cat < /etc/rsyncd.conf +uid = ${OWNER} +gid = ${GROUP} +use chroot = yes +log file = /dev/stdout +reverse lookup = no +[volume] + hosts deny = * + hosts allow = ${ALLOW} + read only = false + path = ${VOLUME} + comment = volume +EOF + +for dir in ${MKDIRS}; do + mkdir -p ${dir} + chown "${OWNER}:${GROUP}" ${dir} +done + +exec /usr/bin/rsync --no-detach --daemon --config /etc/rsyncd.conf "$@" diff --git a/images/build/root/build/run.sh b/images/build/root/build/run.sh new file mode 100755 index 00000000..27b9abaf --- /dev/null +++ b/images/build/root/build/run.sh @@ -0,0 +1,34 @@ +#!/bin/bash -e + +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ARGS="$@" +if [ $# -eq 0 ]; then + ARGS=/bin/bash +fi + +BUILDER_USER=${BUILDER_USER:-upbound} +BUILDER_GROUP=${BUILDER_GROUP:-upbound} +BUILDER_UID=${BUILDER_UID:-1000} +BUILDER_GID=${BUILDER_GID:-1000} + +groupadd -o -g $BUILDER_GID $BUILDER_GROUP 2> /dev/null +useradd -o -m -g $BUILDER_GID -u $BUILDER_UID $BUILDER_USER 2> /dev/null +echo "$BUILDER_USER ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers +export HOME=/home/${BUILDER_USER} +echo "127.0.0.1 $(cat /etc/hostname)" >> /etc/hosts +[[ -S /var/run/docker.sock ]] && chmod 666 /var/run/docker.sock +chown -R $BUILDER_UID:$BUILDER_GID $HOME +exec chpst -u :$BUILDER_UID:$BUILDER_GID ${ARGS} diff --git a/images/build/root/usr/local/bin/setup-credentials-helper.sh b/images/build/root/usr/local/bin/setup-credentials-helper.sh new file mode 100755 index 00000000..e7d01f19 --- /dev/null +++ b/images/build/root/usr/local/bin/setup-credentials-helper.sh @@ -0,0 +1,81 @@ +#!/bin/bash +: "${GOOGLE_CREDENTIALS:="$(cat "$PLUGIN_GOOGLE_CREDENTIALS_FILE" 2>/dev/null)"}" +: "${GOOGLE_CLOUD_PROJECT:="$PLUGIN_GOOGLE_CLOUD_PROJECT"}" +: "${GOOGLE_CLOUD_CLUSTER:="$PLUGIN_GOOGLE_CLOUD_CLUSTER"}" +: "${GOOGLE_CLOUD_ZONE:="$PLUGIN_GOOGLE_CLOUD_ZONE"}" +: "${SSH_KEY:="$PLUGIN_SSH_KEY"}" +: "${DOCKER_USERNAME:="$PLUGIN_DOCKER_USERNAME"}" +: "${DOCKER_PASSWORD:="$PLUGIN_DOCKER_PASSWORD"}" +: "${DOCKER_REGISTRY:="${PLUGIN_DOCKER_REGISTRY:-docker.io}"}" + +DOCKER_REGISTRY_HOST="$(echo "${DOCKER_REGISTRY}" | awk 'BEGIN{ FS="/" }{print $1}')" + +export PATH="$CI_WORKSPACE/bin:$PATH" + +require_param() { + declare name="$1" + local env_name + env_name="$(echo "$name" | tr /a-z/ /A-Z/)" + if [ -z "${!env_name}" ] ; then + echo "You must define \"$name\" parameter or define $env_name environment variable" >&2 + exit 2 + fi +} + +require_google_credentials() { + if [ -z "$GOOGLE_CREDENTIALS" ] ; then + echo "You must define \"google_credentials_file\" parameter or define GOOGLE_CREDENTIALS environment variable" >&2 + exit 2 + fi +} + +run() { + echo "+" "$@" + "$@" +} + +if [ -n "$DOCKER_PASSWORD" ] ; then + require_param DOCKER_USERNAME + echo "+ docker login $DOCKER_REGISTRY_HOST -u $DOCKER_USERNAME" + echo "$DOCKER_PASSWORD" | docker login "$DOCKER_REGISTRY_HOST" -u "$DOCKER_USERNAME" --password-stdin +fi + +if [ -n "$GOOGLE_CREDENTIALS" ] ; then + echo "$GOOGLE_CREDENTIALS" > /run/google-credentials.json + run gcloud auth activate-service-account --quiet --key-file=/run/google-credentials.json + run gcloud auth configure-docker --quiet +fi + +if [ -n "$GOOGLE_CLOUD_PROJECT" ] ; then + run gcloud config set project "$GOOGLE_CLOUD_PROJECT" +fi + +if [ -n "$GOOGLE_CLOUD_CLUSTER" ] ; then + require_google_credentials + require_param "google_cloud_project" + require_param "google_cloud_zone" + + run gcloud container clusters get-credentials "$GOOGLE_CLOUD_CLUSTER" --project "$GOOGLE_CLOUD_PROJECT" --zone "$GOOGLE_CLOUD_ZONE" + # Display kubernetees versions (usefull for debugging) + run kubectl version +fi + +if [ -n "$SSH_KEY" ] ; then + require_param "home" + test -d "$HOME/.ssh" || mkdir -p "$HOME/.ssh" + echo "$SSH_KEY" > "$HOME/.ssh/id_rsa" + chmod 0400 "$HOME/.ssh/id_rsa" + echo "Installed ssh key into $HOME/.ssh/id_rsa" + run ssh-keygen -y -f "$HOME/.ssh/id_rsa" +fi + +if [[ -n "${GIT_USER}" && -n "${GIT_PASSWORD}" ]] ; then + git config --global user.email "${GIT_EMAIL:-bot@presslabs.com}" + git config --global user.name "${GIT_USER:-presslabs-bot}" + + cat <> ~/.netrc +machine ${GIT_HOST:-github.com} + login ${GIT_USER} + password ${GIT_PASSWORD} +EOF +fi diff --git a/images/build/root/usr/local/bin/xvfb-chrome b/images/build/root/usr/local/bin/xvfb-chrome new file mode 100755 index 00000000..ae88a91c --- /dev/null +++ b/images/build/root/usr/local/bin/xvfb-chrome @@ -0,0 +1,29 @@ +#!/bin/bash + +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +_kill_procs() { + kill -TERM $chrome + wait $chrome +} + +# Setup a trap to catch SIGTERM and relay it to child processes +trap _kill_procs SIGTERM + +# Start Chrome inside xvfb +xvfb-run -a -s "-screen 0 1920x1080x24 -nolisten tcp" /opt/google/chrome/chrome --no-sandbox $@ & +chrome=$! + +wait $chrome diff --git a/makelib/cache.mk b/makelib/cache.mk new file mode 100644 index 00000000..77621c7f --- /dev/null +++ b/makelib/cache.mk @@ -0,0 +1,59 @@ +# Copyright 2019 Pressinfra SRL. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __CACHE_MAKEFILE__ +__CACHE_MAKEFILE__ := included + +RCLONE_BIN ?= RCLONE_VERSION=true rclone +RCLONE_ARGS ?= -q --config /dev/null + +ifeq ($(CACHE_BACKEND),) +$(error You must define CACHE_BACKEND before adding cache support. See format at https://rclone.org/docs/#backend-path-to-dir) +endif + +CACHE_COMPRESSION ?= gzip + +ifneq ($(DRONE_PULL_REQUEST),) +CACHE_NAME ?= $(PROJECT_NAME)-pr$(DRONE_PULL_REQUEST)-cache +else ifneq ($(DRONE_TAG),) +CACHE_NAME ?= $(PROJECT_NAME)-$(DRONE_TAG)-cache +else +CACHE_NAME ?= $(PROJECT_NAME)-$(BRANCH_NAME)-cache +endif + + +RCLONE := $(RCLONE_BIN) $(RCLONE_ARGS) + +ifeq ($(CACHE_COMPRESSION),gzip) +TAR_COMPRESS_ARGS += -z +CACHE_EXTENSION_SUFFIX := .gz +endif + +CACHE_FILE := $(CACHE_NAME).tar$(CACHE_EXTENSION_SUFFIX) + +.PHONY: cache.store cache.restore + +cache.store: + @$(INFO) storing cache $(CACHE_FILE) into $(CACHE_BACKEND) + @$(RCLONE) mkdir $(CACHE_BACKEND) || $(FAIL) + @tar -C $(CACHE_DIR) $(TAR_COMPRESS_ARGS) -cf - ./ | $(RCLONE) rcat $(CACHE_BACKEND)/$(CACHE_FILE) || $(FAIL) + @$(OK) cache store + +cache.restore: |$(CACHE_DIR) + @$(INFO) restoring cache from $(CACHE_BACKEND)/$(CACHE_FILE) + @$(RCLONE) cat $(CACHE_BACKEND)/$(CACHE_FILE) | tar -C $(CACHE_DIR) $(TAR_COMPRESS_ARGS) -x \ + && $(OK) cache restore \ + || $(WARN) cache restore failed + +endif # __CACHE_MAKEFILE__ diff --git a/makelib/common.mk b/makelib/common.mk new file mode 100644 index 00000000..8397e33c --- /dev/null +++ b/makelib/common.mk @@ -0,0 +1,488 @@ +# Copyright 2019 Pressinfra SRL. All rights reserved. +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __COMMON_MAKEFILE__ +__COMMON_MAKEFILE__ := included + +# include the common make file +COMMON_SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST))) + +include $(COMMON_SELF_DIR)/utils.mk + +# remove default suffixes as we dont use them +.SUFFIXES: + +# set the shell to bash always +SHELL := /bin/bash + +# ==================================================================================== +# Host information +# This is defined earlier so that it can be used down the road + +# Set the host's OS. Only linux and darwin supported for now +HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]') +ifeq ($(filter darwin linux,$(HOSTOS)),) +$(error build only supported on linux and darwin host currently) +endif + +# Set the host's arch. Only amd64 support for now +HOSTARCH := $(shell uname -m) +ifeq ($(HOSTARCH),x86_64) +HOSTARCH := amd64 +endif +ifneq ($(HOSTARCH),amd64) + $(error build only supported on amd64 host currently) +endif +HOST_PLATFORM := $(HOSTOS)_$(HOSTARCH) + +# default target is build +.PHONY: all +all: build + +# ==================================================================================== +# Colors + +BLACK := $(shell printf "\033[30m") +BLACK_BOLD := $(shell printf "\033[30;1m") +RED := $(shell printf "\033[31m") +RED_BOLD := $(shell printf "\033[31;1m") +GREEN := $(shell printf "\033[32m") +GREEN_BOLD := $(shell printf "\033[32;1m") +YELLOW := $(shell printf "\033[33m") +YELLOW_BOLD := $(shell printf "\033[33;1m") +BLUE := $(shell printf "\033[34m") +BLUE_BOLD := $(shell printf "\033[34;1m") +MAGENTA := $(shell printf "\033[35m") +MAGENTA_BOLD := $(shell printf "\033[35;1m") +CYAN := $(shell printf "\033[36m") +CYAN_BOLD := $(shell printf "\033[36;1m") +WHITE := $(shell printf "\033[37m") +WHITE_BOLD := $(shell printf "\033[37;1m") +CNone := $(shell printf "\033[0m") + +# ==================================================================================== +# Logger + +TIME_LONG = `date +%Y-%m-%d' '%H:%M:%S` +TIME_SHORT = `date +%H:%M:%S` +TIME = $(TIME_SHORT) + +INFO = echo ${TIME} ${BLUE}[ .. ]${CNone} +WARN = echo ${TIME} ${YELLOW}[WARN]${CNone} +ERR = echo ${TIME} ${RED}[FAIL]${CNone} +OK = echo ${TIME} ${GREEN}[ OK ]${CNone} +FAIL = (echo ${TIME} ${RED}[FAIL]${CNone} && false) + +# ==================================================================================== +# Helpers + +ifeq ($(HOSTOS),darwin) +SED?=sed -i '' -E +else +SED?=sed -i -r +endif + +# ==================================================================================== +# Build Options + +# Set V=1 to turn on more verbose build +V ?= 0 +ifeq ($(V),1) +MAKEFLAGS += VERBOSE=1 +else +MAKEFLAGS += --no-print-directory +endif + +ifeq ($(V),$(filter $(V),1 2 3 4)) # Print verbose make info, iv V>0 +ifneq ($(PLATFORM),) +VERBOSE_BUILD_INFO += PLATFORM=$(BLUE)$(PLATFORM)$(CNone) +endif + +$(info ---- $(BLUE_BOLD)$(MAKECMDGOALS)$(CNone) $(VERBOSE_BUILD_INFO) ) +endif + +# Set DEBUG=1 to turn on a debug build +DEBUG ?= 0 + +# ==================================================================================== +# Platform and cross build options + +# all supported platforms we build for this can be set to other platforms if desired +# we use the golang os and arch names for convenience +PLATFORMS ?= darwin_amd64 windows_amd64 linux_amd64 linux_arm64 + +# Set the platform to build if not currently defined +ifeq ($(origin PLATFORM),undefined) + +PLATFORM := $(HOST_PLATFORM) + +# if the host platform is on the supported list add it to the single build target +ifneq ($(filter $(PLATFORMS),$(HOST_PLATFORM)),) +BUILD_PLATFORMS = $(HOST_PLATFORM) +endif + +# for convenience always build the linux platform when building on mac +ifneq ($(HOSTOS),linux) +BUILD_PLATFORMS += linux_amd64 +endif + +else +BUILD_PLATFORMS = $(PLATFORM) +endif + +OS := $(word 1, $(subst _, ,$(PLATFORM))) +ARCH := $(word 2, $(subst _, ,$(PLATFORM))) + +ifeq ($(HOSTOS),darwin) +NPROCS := $(shell sysctl -n hw.ncpu) +else +NPROCS := $(shell nproc) +endif + +# ==================================================================================== +# Setup directories and paths + +# include the common make file +COMMON_SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST))) + +MAKELIB_BIN_DIR := $(abspath $(shell cd $(COMMON_SELF_DIR)/../bin && pwd -P)) + +# the root directory of this repo +ifeq ($(origin ROOT_DIR),undefined) +ROOT_DIR := $(abspath $(shell cd $(COMMON_SELF_DIR)/../.. && pwd -P)) +endif + +# the output directory which holds final build produced artifacts +ifeq ($(origin OUTPUT_DIR),undefined) +OUTPUT_DIR := $(ROOT_DIR)/_output +endif +$(OUTPUT_DIR): + @mkdir -p "$@" + +# the output directory for staged files. The staged files are generated files which are commited to the main repo and +# staged for being pushed to an upstream repo. (eg. generated protobuf client code) +ifeq ($(origin STAGING_DIR),undefined) +STAGING_DIR:= $(ROOT_DIR)/staging/src +endif +$(STAGING_DIR): + @mkdir -p "$@" + +# a working directory that holds all temporary or working items generated +# during the build. The items will be discarded on a clean build and they +# will never be cached. +ifeq ($(origin WORK_DIR), undefined) +WORK_DIR := $(ROOT_DIR)/.work +endif +$(WORK_DIR): + @mkdir -p "$@" + +# a directory that holds tools and other items that are safe to cache +# across build invocations. removing this directory will trigger a +# re-download and waste time. Its safe to cache this directory on CI systems +ifeq ($(origin CACHE_DIR), undefined) +CACHE_DIR := $(ROOT_DIR)/.cache +endif +$(CACHE_DIR): + @mkdir -p "$@" + +TOOLS_DIR := $(CACHE_DIR)/tools +TOOLS_HOST_DIR := $(TOOLS_DIR)/$(HOST_PLATFORM) +TOOLS_BIN_DIR := $(ROOT_DIR)/bin +PATH := $(TOOLS_BIN_DIR):$(PATH) +export PATH + +$(TOOLS_HOST_DIR): + @mkdir -p "$@" + +$(TOOLS_BIN_DIR): + @mkdir -p "$@" + +ifeq ($(origin HOSTNAME), undefined) +HOSTNAME := $(shell hostname) +endif + +YQ_VERSION ?= 4.24.5 +YQ_DOWNLOAD_URL ?= https://github.com/mikefarah/yq/releases/download/v$(YQ_VERSION)/yq_$(HOST_PLATFORM) +$(eval $(call tool.download,yq,$(YQ_VERSION),$(YQ_DOWNLOAD_URL))) + +GIT_SEMVER_VERSION ?= 6.1.1 +GIT_SEMVER_DOWNLOAD_URL ?= https://github.com/mdomke/git-semver/releases/download/v$(GIT_SEMVER_VERSION)/git-semver_$(GIT_SEMVER_VERSION)_$(HOST_PLATFORM).tar.gz +$(eval $(call tool.download.tar.gz,git-semver,$(GIT_SEMVER_VERSION),$(GIT_SEMVER_DOWNLOAD_URL),git-semver,0)) + +$(TOOLS_DIR)/git-semver.mk: $(GIT_SEMVER) + @echo '# dummy target to require installing git-semver before making everything' > "$@" + @touch "$@" + +include $(TOOLS_DIR)/git-semver.mk + +# ==================================================================================== +# git introspection + +ifeq ($(COMMIT_HASH),) +override COMMIT_HASH := $(shell git rev-parse HEAD) +endif + +TAGS := $(shell git tag -l --points-at HEAD) + +ifeq ($(origin BRANCH_NAME), undefined) +BRANCH_NAME := $(shell git rev-parse --abbrev-ref HEAD) +endif + +# Set default GIT_TREE_STATE +ifeq ($(shell git status -s | head -c1 | wc -c | tr -d '[[:space:]]'), 0) +GIT_TREE_STATE = clean +else +GIT_TREE_STATE = dirty +endif + +# ==================================================================================== +# Release Options + +CHANNEL ?= master +ifeq ($(filter master alpha beta stable,$(CHANNEL)),) +$(error invalid channel $(CHANNEL)) +endif + +REMOTE_NAME ?= origin +REMOTE_URL ?= $(shell git remote get-url $(REMOTE_NAME)) + +# ==================================================================================== +# Version and Tagging +# + +BUILD_DATE ?= $(shell date -u +'%Y-%m-%dT%H:%M:%SZ') + +# set a semantic version number from git if VERSION is undefined. +ifeq ($(origin VERSION), undefined) +ifeq ($(GIT_TREE_STATE),clean) +VERSION := $(shell $(GIT_SEMVER) -prefix v $(ROOT_DIR)) +else +VERSION := $(shell $(GIT_SEMVER) -prefix v -set-meta $(shell echo "$(COMMIT_HASH)" | head -c8)-dirty $(ROOT_DIR)) +endif +else +endif +export VERSION + +VERSION_REGEX := ^v([0-9]*)[.]([0-9]*)[.]([0-9]*)(-(alpha|beta|rc)[.][0-9]+)?(\+[[:alnum:].+_-]+)?$$ +VERSION_VALID := $(shell echo "$(VERSION)" | grep -E -q '$(VERSION_REGEX)' && echo 1 || echo 0) +VERSION_MAJOR := $(shell echo "$(VERSION)" | sed -E -e 's/$(VERSION_REGEX)/\1/') +VERSION_MINOR := $(shell echo "$(VERSION)" | sed -E -e 's/$(VERSION_REGEX)/\2/') +VERSION_PATCH := $(shell echo "$(VERSION)" | sed -E -e 's/$(VERSION_REGEX)/\3/') + +.publish.tag: .version.require.clean.tree +ifneq ($(VERSION_VALID),1) + $(error invalid version $(VERSION). must be a semantic semver version (eg. with v[Major].[Minor].[Patch])) +endif + @$(INFO) tagging commit hash $(COMMIT_HASH) with $(VERSION) + git tag -f -m "release $(VERSION)" $(VERSION) $(COMMIT_HASH) + git push $(REMOTE_NAME) $(VERSION) + @set -e; if ! git ls-remote --heads $(REMOTE_NAME) | grep -q refs/heads/release-$(VERSION_MAJOR).$(VERSION_MINOR); then \ + echo === creating new release branch release-$(VERSION_MAJOR).$(VERSION_MINOR) ;\ + git branch -f release-$(VERSION_MAJOR).$(VERSION_MINOR) $(COMMIT_HASH) ;\ + git push $(REMOTE_NAME) release-$(VERSION_MAJOR).$(VERSION_MINOR) ;\ + fi + @$(OK) tagging + +# fail publish if the version is dirty +.version.require.clean.tree: + @if [[ $$ALLOW_DIRTY_TREE != "true" ]] && [[ $(GIT_TREE_STATE) = dirty ]]; then \ + $(ERR) version '$(VERSION)' is dirty. The following files changed: ;\ + git status --short;\ + exit 1; \ + fi + +.PHONY: .publish.tag .version.require.clean.tree + +# ==================================================================================== +# Common Targets - Build and Test workflow + +# A common target registers a target and calls in order the following targets +# .TARGET.init .TARGET.run .TARGET.done +define common.target +.$(1).init: ; @: +.$(1).run: ; @: +.$(1).done: ; @: + +$(1): + @$$(MAKE) .$(1).init + @$$(MAKE) .$(1).run + @$$(MAKE) .$(1).done + +.PHONY: $(1) .$(1).init .$(1).run .$(1).done +endef + +# lint the code +$(eval $(call common.target,lint)) + +# run tests +$(eval $(call common.target,test)) + +# run e2e tests +$(eval $(call common.target,e2e)) + +# run code generation (eg. compile protocol buffers, collect translations) +$(eval $(call common.target,generate)) + +# run code auto-formatting tools +$(eval $(call common.target,fmt)) + +# ==================================================================================== +# Release Targets + +# publish artifacts +$(eval $(call common.target,publish)) +publish: .version.require.clean.tree + +# promote all artifacts to a release channel +$(eval $(call common.target,promote)) + +# tag a release +tag: .publish.tag + +.PHONY: tag + +# ==================================================================================== +# Build targets +# +# These targets are use to build the project artifacts. + +# run init steps before building code +# these will run once regardless of how many platforms we are building +.build.init: ; @: + +# check the code with fmt, lint, vet and other source level checks pre build +# these will run once regardless of how many platforms we are building +.build.check: ; @: + +# check the code with fmt, lint, vet and other source level checks pre build +# these will run for each platform being built +.build.check.platform: ; @: + +# build code. this will run once regardless of platform +.build.code: ; @: + +# build code. this will run for each platform built +.build.code.platform: ; @: + +# build releasable artifacts. this will run once regardless of platform +.build.artifacts: ; @: + +# build releasable artifacts. this will run for each platform being built +.build.artifacts.platform: ; @: + +# runs at the end of the build to do any cleanup, caching etc. +# these will run once regardless of how many platforms we are building +.build.done: ; @: + +# helper targets for building multiple platforms +.do.build.platform.%: + @$(MAKE) .build.check.platform PLATFORM=$* + @$(MAKE) .build.code.platform PLATFORM=$* +.do.build.platform: $(foreach p,$(PLATFORMS), .do.build.platform.$(p)) + +# helper targets for building multiple platforms +.do.build.artifacts.%: + @$(MAKE) .build.artifacts.platform PLATFORM=$* +.do.build.artifacts: $(foreach p,$(PLATFORMS), .do.build.artifacts.$(p)) + +# build for all platforms +build.all: + @$(MAKE) .build.init + @$(MAKE) .build.check + @$(MAKE) .build.code + @$(MAKE) .do.build.platform + @$(MAKE) .build.artifacts + @$(MAKE) .do.build.artifacts + @$(MAKE) .build.done + +# build for a single platform if it's supported +build: +ifneq ($(BUILD_PLATFORMS),) + @$(MAKE) build.all PLATFORMS="$(BUILD_PLATFORMS)" +else + @: +endif + +# Install required build tools. This can be used to generate a docker container with all the required tools for example. +build.tools: |$(TOOLS_HOST_DIR) + +# clean all files created during the build. +clean: + @rm -fr $(OUTPUT_DIR) $(WORK_DIR) + +# clean all files created during the build, including caches across builds +distclean: clean + @rm -fr $(CACHE_DIR) + +.PHONY: .build.init .build.check .build.check.platform .build.code .build.code.platform .build.artifacts .build.artifacts.platform +.PHONY: .build.done .do.build.platform.% .do.build.platform .do.build.artifacts.% .do.build.artifacts +.PHONY: build.tools build.info build.all build clean distclean + +build.info: + @echo "build version: $(VERSION)" + @echo "git commit: $(COMMIT_HASH)" + @echo "git branch: $(BRANCH_NAME)" + @echo "git tree state: $(GIT_TREE_STATE)" + @echo "git tags: $(TAGS)" + +# ==================================================================================== +# Help + +define HELPTEXT +Usage: make [make-options] [options] + +Common Targets: + build Build source code and other artifacts for host platform. + build.all Build source code and other artifacts for all platforms. + build.tools Install the required build tools. + build.vars Show build vars. + clean Remove all files created during the build. + distclean Remove all files created during the build including cached tools. + generate Run code generation tools. + fmt Run code auto-formatting tools. + lint Run lint and code analysis tools. + test Runs unit tests. + e2e Runs end-to-end integration tests. + translate Collect translation strings and post-process the .pot/.po files. + help Show this help info. + +Common Options: + DEBUG Whether to generate debug symbols. Default is 0. + PLATFORM The platform to build. + SUITE The test suite to run. + TESTFILTER Tests to run in a suite. + V Build verbosity level (1-4). Default is 0. + +Release Targets: + publish Build and publish final releasable artifacts + promote Promote a release to a release channel + tag Tag a release + +Release Options: + VERSION The version information for binaries and releases. + CHANNEL Sets the release channel. Can be set to master, alpha, beta, or stable. + +endef +export HELPTEXT + +.help: ; @: + +help: + @echo "$$HELPTEXT" + @$(MAKE) .help + +.PHONY: help .help + +endif # __COMMON_MAKEFILE__ diff --git a/makelib/gcp.mk b/makelib/gcp.mk new file mode 100644 index 00000000..28f3f87f --- /dev/null +++ b/makelib/gcp.mk @@ -0,0 +1,32 @@ +# Copyright 2019 Pressinfra SRL. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __GOOGLE_CLOUD_MAKEFILE__ +__GOOGLE_CLOUD_MAKEFILE__ := included + +ifeq ($(origin GOOGLE_CLOUD_PROJECT),undefined) +ifneq ($(GCLOUD_PROJECT),) +GOOGLE_CLOUD_PROJECT := $(GCLOUD_PROJECT) +else +GOOGLE_CLOUD_PROJECT := $(shell gcloud config get-value project) +endif +endif + +ifeq ($(GOOGLE_CLOUD_PROJECT),) +$(error Could not determine current Google Cloud Project. Set the GOOGLE_CLOUD_PROJECT environment variable or set with `gcloud config`) +else +export GOOGLE_CLOUD_PROJECT +endif + +endif # __GOOGLE_CLOUD_MAKEFILE__ diff --git a/makelib/gettext.mk b/makelib/gettext.mk new file mode 100644 index 00000000..bd163cfa --- /dev/null +++ b/makelib/gettext.mk @@ -0,0 +1,81 @@ +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __GETTEXT_MAKEFILE__ +__GETTEXT_MAKEFILE__ := included + +# ==================================================================================== +# Options + +# ==================================================================================== +# Translations + +# The list of languages to generate translations for +LANGUAGES ?= + +LOCALES_DIR ?= $(ROOT_DIR)/locales +$(LOCALES_DIR): + @mkdir -p $(LOCALES_DIR) + +ifeq ($(LANGUAGES),) +$(error You must specify the LANGUAGES variable in order to handle translations) +endif + +ifeq ($(HOSTOS),darwin) +MSGFMT = /usr/local/opt/gettext/bin/msgfmt +MSGMERGE = /usr/local/opt/gettext/bin/msgmerge +else +MSGFMT = msgfmt +MSGMERGE = msgmerge +endif + +PO_FILES := $(shell find $(LOCALES_DIR) -name '*.po') +POT_FILES := $(shell find $(LOCALES_DIR) -mindepth 1 -maxdepth 1 -name '*.pot') + +# lint the code +$(eval $(call common.target,translations)) + +gettext.lint: + @$(INFO) msgfmt check + $(foreach p,$(PO_FILES),@$(MSGFMT) -c $(p) || $(FAIL) ${\n}) + @$(OK) msgfmt check + +.gettext.merge: + @$(INFO) msgmerge + $(foreach l,$(LANGUAGES),@mkdir -p $(LOCALES_DIR)/$(l) || $(FAIL) ${\n}) + $(foreach pot,$(POT_FILES),$(foreach l,$(LANGUAGES), \ + @touch $(LOCALES_DIR)/$(l)/$(basename $(notdir $(pot))).po || $(FAIL) ${\n} \ + @$(MSGMERGE) -q --no-wrap --sort-output --no-fuzzy-matching --lang=$(l) -U "$(LOCALES_DIR)/$(l)/$(basename $(notdir $(pot))).po" "$(pot)" || $(FAIL) ${\n} \ + )) + @find $(LOCALES_DIR) -name '*.po~' -delete + @find $(LOCALES_DIR) -name '*.pot~' -delete + @$(OK) msgmerge + +.gettext.build: + @$(INFO) copying translations + @rm -rf $(OUTPUT_DIR)/locales + @cp -a $(LOCALES_DIR) $(OUTPUT_DIR)/locales + @$(OK) copying translations + +.PHONY: gettext.lint .gettext.build .gettext.merge + +# ==================================================================================== +# Common Targets +.lint.run: gettext.lint + +.translations.run: .gettext.merge + +.build.code: .gettext.build + +endif # __GETTEXT_MAKEFILE__ diff --git a/makelib/git-publish.mk b/makelib/git-publish.mk new file mode 100644 index 00000000..31947de0 --- /dev/null +++ b/makelib/git-publish.mk @@ -0,0 +1,147 @@ +# Copyright 2019 The Pressinfra Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __GIT_PUBLISH_MAKEFILE__ +__GIT_PUBLISH_MAKEFILE__ := included + +# ==================================================================================== +# Options + +PUBLISH_BRANCH ?= master +PUBLISH_PREFIX ?= / +PUBLISH_TAGS ?= true + +ifeq ($(PUBLISH_DIRS),) +PUBLISH_DIR ?= $(CURDIR:$(abspath $(ROOT_DIR))/%=%) +endif + +PUBLISH_WORK_BRANCH := build/split-$(COMMIT_HASH)/$(PUBLISH_DIR) +PUBLISH_WORK_DIR := $(WORK_DIR)/git-publish/$(PUBLISH_DIR) +PUBLISH_GIT := git -C $(PUBLISH_WORK_DIR) + +GIT_MERGE_ARGS ?= --ff-only +GIT_SUBTREE_MERGE_ARGS ?= --squash +ifeq ($(PUBLISH_TAGS),true) +GIT_PUSH_ARGS := --follow-tags +endif + +PUBLISH_DIRS ?= $(PUBLISH_DIR) + +# ==================================================================================== +# git publish targets + +git.urlize = $(patsubst %,https://%,$(patsubst %.git,%,$(patsubst https://%,%,$(patsubst git@github.com:%,https://github.com/%,$(1))))) +git.workbranch = build/split-$(COMMIT_HASH)/$(1) + +# 1 publish directory +define git.publish + +$(ROOT_DIR)/.git/refs/heads/$(call git.workbranch,$(1)): + @$(INFO) git subtree split $(1) + @cd $(ROOT_DIR) && git subtree split -q -P $(1) -b $(call git.workbranch,$(1)) $(COMMIT_HASH) + @$(OK) git subtree split $(1) +.PHONY: .git.build.artifacts.$(1) +.git.build.artifacts.$(1): $(ROOT_DIR)/.git/refs/heads/$(call git.workbranch,$(1)) +.git.build.artifacts: .git.build.artifacts.$(1) + +.PHONY: .git.clean.$(1) +.git.clean.$(1): + @cd $(ROOT_DIR) && git branch -D $(call git.workbranch,$(1)) || true +.git.clean: .git.clean.$(1) + +.PHONY: .do.git.publish.$(1) +.do.git.publish.$(1): |$(ROOT_DIR)/.git/refs/heads/$(call git.workbranch,$(1)) + @$(MAKE) -C $(1) .git.publish + +endef + +ifeq ($(filter-out $(PUBLISH_DIR),$(PUBLISH_DIRS)),) +.git.publish: |$(ROOT_DIR)/.git/refs/heads/$(PUBLISH_WORK_BRANCH) + @$(INFO) Publishing $(1) to $(PUBLISH_REPO)@$(PUBLISH_BRANCH) under $(PUBLISH_PREFIX) + @rm -rf $(PUBLISH_WORK_DIR) && mkdir -p $(PUBLISH_WORK_DIR) + @$(PUBLISH_GIT) init -q + @$(PUBLISH_GIT) remote add origin $(PUBLISH_REPO) + @$(PUBLISH_GIT) remote add upstream $(ROOT_DIR)/.git + @$(PUBLISH_GIT) fetch -q upstream +refs/heads/$(PUBLISH_WORK_BRANCH): + @$(PUBLISH_GIT) checkout -q -b $(PUBLISH_BRANCH) + @set -e; cd $(PUBLISH_WORK_DIR); if git ls-remote --heads origin | grep -q refs/heads/$(PUBLISH_BRANCH); then \ + $(PUBLISH_GIT) fetch -q origin +refs/heads/$(PUBLISH_BRANCH): ;\ + $(PUBLISH_GIT) reset -q --hard origin/$(PUBLISH_BRANCH) ;\ + $(PUBLISH_GIT) branch -q -u origin/$(PUBLISH_BRANCH) ;\ + fi +ifeq ($(PUBLISH_PREFIX),/) + @set -e; \ + $(PUBLISH_GIT) merge -q $(GIT_MERGE_ARGS) \ + -m "Merge '$(PUBLISH_DIR)' from $(patsubst https://github.com/%,%,$(call git.urlize,$(REMOTE_URL)))@$(COMMIT_HASH)" \ + upstream/$(PUBLISH_WORK_BRANCH) ;\ + if [ "$(PUBLISH_TAGS)" == "true" ] ; then \ + for t in $(TAGS) ; do \ + $(PUBLISH_GIT) tag -a -m "$$t" $$t ;\ + done ;\ + fi +else + @set -e; \ + if [ -d "$(PUBLISH_WORK_DIR)/$(PUBLISH_PREFIX)" ] ; then \ + $(PUBLISH_GIT) subtree -q merge -P $(PUBLISH_PREFIX) $(GIT_SUBTREE_MERGE_ARGS) \ + -m "Merge '$(PUBLISH_DIR)' from $(patsubst https://github.com/%,%,$(call git.urlize,$(REMOTE_URL)))@$(COMMIT_HASH)" \ + upstream/$(PUBLISH_WORK_BRANCH) ;\ + else \ + $(PUBLISH_GIT) subtree add -q -P $(PUBLISH_PREFIX) $(GIT_SUBTREE_MERGE_ARGS) \ + -m "Add '$(PUBLISH_DIR)' from $(patsubst https://github.com/%,%,$(call git.urlize,$(REMOTE_URL)))@$(COMMIT_HASH)" \ + $(ROOT_DIR)/.git $(PUBLISH_WORK_BRANCH) ;\ + fi +endif + @$(PUBLISH_GIT) push -u origin $(GIT_PUSH_ARGS) $(PUBLISH_BRANCH) + @$(OK) Published $(1) to $(PUBLISH_REPO)@$(PUBLISH_BRANCH) +else +.git.publish: $(foreach d,$(PUBLISH_DIRS),.do.git.publish.$(d)) +endif + +$(foreach d,$(PUBLISH_DIRS), $(eval $(call git.publish,$(d)))) + +.PHONY: .git.clean .git.build.artifacts .git.publish + +# ==================================================================================== +# Common Targets + +# if PUBLISH_DIRS is defined the invoke publish for each dir +ifneq ($(filter-out $(PUBLISH_DIR),$(PUBLISH_DIRS)),) + +.publish.init: .git.build.artifacts +clean: .git.clean + +# only publish for master and release branches +# also, if publishing for tags is enabled, +# publish if the current commit is a tag +ifneq ($(filter master release-%,$(BRANCH_NAME)),) +.publish.run: $(addprefix .do.git.publish.,$(PUBLISH_DIRS)) +else ifeq ($(PUBLISH_TAGS),true) +ifneq ($(TAGS),) +.publish.run: $(addprefix .do.git.publish.,$(PUBLISH_DIRS)) +endif +endif + +else # assume this .mk file is being included for a single dir + +ifeq ($(PUBLISH_REPO),) +$(error You must specify the PUBLISH_REPO variable in order to handle git publishing) +endif + +.publish.init: .git.build.artifacts +clean: .git.clean + +endif # PUBLISH_DIRS + + +endif # __GIT_PUBLISH_MAKEFILE__ diff --git a/makelib/golang.mk b/makelib/golang.mk new file mode 100644 index 00000000..3b7da7be --- /dev/null +++ b/makelib/golang.mk @@ -0,0 +1,447 @@ +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __GOLANG_MAKEFILE__ +__GOLANG_MAKEFILE__ := included + +# ==================================================================================== +# Options + +# The go project including repo name, for example, github.com/rook/rook +GO_PROJECT ?= $(PROJECT_REPO) + +# Optional. These are subdirs that we look for all go files to test, vet, and fmt +GO_SUBDIRS ?= cmd pkg + +# Optional. Additional subdirs used for integration or e2e testings +GO_INTEGRATION_TESTS_SUBDIRS ?= + +# Optional directories (relative to CURDIR) +GO_VENDOR_DIR ?= vendor +GO_PKG_DIR ?= $(WORK_DIR)/pkg +GO_CACHE_DIR ?= $(CACHE_DIR)/go + +# Optional build flags passed to go tools +GO_BUILDFLAGS ?= +GO_LDFLAGS ?= +GO_TAGS ?= +GO_TEST_TOOL ?= ginkgo +GO_TEST_FLAGS ?= +GO_TEST_SUITE ?= +GO_NOCOV ?= + +GO_SRCS := $(shell find $(GO_SUBDIRS) -type f -name '*.go' | grep -v '_test.go') + +# ==================================================================================== +# Setup go environment + +# turn on more verbose build when V=2 +ifeq ($(V),2) +GO_LDFLAGS += -v -n +GO_BUILDFLAGS += -x +endif + +# whether to generate debug information in binaries. this includes DWARF and symbol tables. +ifeq ($(DEBUG),0) +GO_LDFLAGS += -s -w +endif + +# supported go versions +GO_SUPPORTED_VERSIONS ?= 1.17|1.18 + +# set GOOS and GOARCH +GOOS := $(OS) +GOARCH := $(ARCH) +GOCACHE := $(GO_CACHE_DIR) +export GOOS GOARCH GOCACHE + +# set GOOS and GOARCH +GOHOSTOS := $(HOSTOS) +GOHOSTARCH := $(HOSTARCH) + +GO_PACKAGES := $(foreach t,$(GO_SUBDIRS),$(GO_PROJECT)/$(t)/...) +GO_TEST_PACKAGES ?= $(shell go list -f '{{ if or .TestGoFiles .XTestGoFiles }}{{ .ImportPath }}{{ end }}' $(foreach t,$(GO_SUBDIRS),$(GO_PROJECT)/$(t)/...)) +GO_INTEGRATION_TEST_PACKAGES ?= $(foreach t,$(GO_INTEGRATION_TESTS_SUBDIRS),$(GO_PROJECT)/$(t)/integration) + +ifneq ($(GO_TEST_PARALLEL),) +GO_TEST_FLAGS += -p $(GO_TEST_PARALLEL) +endif + +ifneq ($(GO_TEST_SUITE),) +ifeq ($(GO_TEST_TOOL),ginkgo) +GO_TEST_FLAGS += -focus '$(GO_TEST_SUITE)' +else # GO_TEST_TOOL != ginkgo +GO_TEST_FLAGS += -run '$(GO_TEST_SUITE)' +endif # GO_TEST_TOOL +endif # GO_TEST_SUITE + +GOPATH := $(shell go env GOPATH) + +GO := go +GOHOST := GOOS=$(GOHOSTOS) GOARCH=$(GOHOSTARCH) $(GO) +GO_VERSION := $(shell $(GO) version | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*/\1/p') + +GO_BIN_DIR := $(abspath $(OUTPUT_DIR)/bin) +GO_OUT_DIR := $(GO_BIN_DIR)/$(PLATFORM) +GO_TEST_DIR := $(abspath $(OUTPUT_DIR)/tests) +GO_TEST_OUTPUT := $(GO_TEST_DIR)/$(PLATFORM) +GO_LINT_DIR := $(abspath $(OUTPUT_DIR)/lint) +GO_LINT_OUTPUT := $(GO_LINT_DIR)/$(PLATFORM) + +ifeq ($(GOOS),windows) +GO_OUT_EXT := .exe +endif + +ifeq ($(GO_TEST_TOOL),ginkgo) +GO_TEST_FLAGS += -randomize-all -randomize-suites +endif + +# NOTE: the install suffixes are matched with the build container to speed up the +# the build. Please keep them in sync. + +# we run go build with -i which on most system's would want to install packages +# into the system's root dir. using our own pkg dir avoid thats +ifneq ($(GO_PKG_DIR),) +GO_PKG_BASE_DIR := $(abspath $(GO_PKG_DIR)/$(PLATFORM)) +GO_PKG_STATIC_FLAGS := -pkgdir $(GO_PKG_BASE_DIR)_static +endif + +GO_COMMON_FLAGS = $(GO_BUILDFLAGS) -tags '$(GO_TAGS)' +GO_STATIC_FLAGS = $(GO_COMMON_FLAGS) $(GO_PKG_STATIC_FLAGS) -installsuffix static -ldflags '$(GO_LDFLAGS)' +GO_GENERATE_FLAGS = $(GO_BUILDFLAGS) -tags 'generate $(GO_TAGS)' +GO_XGETTEXT_ARGS ?= +GO_LOCALE_PREFIX ?= default + +export GO111MODULE + +# switch for go modules +ifeq ($(GO111MODULE),on) + +# set GOPATH to $(GO_PKG_DIR), so that the go modules are installed there, instead of the default $HOME/go/pkg/mod +export GOPATH=$(abspath $(GO_PKG_DIR)) + +GO_SRCS += go.mod go.sum + +else + +GO_SRCS += Gopkg.toml Gopkg.lock + +endif + +# ==================================================================================== +# Go Tools macros + +# Creates a target for downloading and compiling a go tool from source +# 1 tool, 2 version, 3 tool url, 4 go env vars +define tool.go.get +$(call tool,$(1),$(2)) + +$$(TOOLS_HOST_DIR)/$(1)-v$(2): |$$(TOOLS_HOST_DIR) + @echo ${TIME} ${BLUE}[TOOL]${CNone} go get $(3)@$(2) + @mkdir -p $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL) + @mkdir -p $$(TOOLS_DIR)/go/$(1)-v$(2)/ && cd $$(TOOLS_DIR)/go/$(1)-v$(2)/ && $(GOHOST) mod init tools && \ + $(4) GO111MODULE=on GOPATH=$$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) $(GOHOST) get -u $(3)@$(2) || $$(FAIL) + @find $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) -type f -print0 | xargs -0 chmod 0644 || $$(FAIL) + @find $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) -type d -print0 | xargs -0 chmod 0755 || $$(FAIL) + @mv $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)/bin/$(1) $$@ || $$(FAIL) + @chmod +x $$@ + @rm -rf $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) + @$$(OK) go get $(3) +endef # tool.go.get + +# Creates a target for installing a go tool from source +# 1 tool, 2 version, 3 tool url, 4 go env vars +define tool.go.install +$(call tool,$(1),$(2)) + +$$(TOOLS_HOST_DIR)/$(1)-v$(2): |$$(TOOLS_HOST_DIR) + @echo ${TIME} ${BLUE}[TOOL]${CNone} go install $(3)@$(2) + @mkdir -p $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL) + @mkdir -p $$(TOOLS_DIR)/go/$(1)-v$(2)/ && cd $$(TOOLS_DIR)/go/$(1)-v$(2)/ && $(GOHOST) mod init tools && \ + $(4) GO111MODULE=on GOPATH=$$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) $(GOHOST) install $(3)@$(2) || $$(FAIL) + @find $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) -type f -print0 | xargs -0 chmod 0644 || $$(FAIL) + @find $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) -type d -print0 | xargs -0 chmod 0755 || $$(FAIL) + @mv $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)/bin/$(1) $$@ || $$(FAIL) + @chmod +x $$@ + @rm -rf $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) + @$$(OK) go install $(3) +endef # tool.go.install + +# Creates a target for compiling a vendored go tool +# 1 tool, 2 package +define tool.go.vendor.install +$(subst -,_,$(call upper,$(1))) := $$(TOOLS_BIN_DIR)/$(1) + +build.tools: $$(TOOLS_BIN_DIR)/$(1) +$$(TOOLS_BIN_DIR)/$(1): vendor/$(2) + @echo ${TIME} ${BLUE}[TOOL]${CNone} installing go vendored $(2) + @GOBIN=$$(TOOLS_BIN_DIR) $$(GOHOST) install ./vendor/$(2) + @$$(OK) installing go vendored $(2) + +endef # tool.go.vendor.install + +# ==================================================================================== +# Tools install targets + +ifneq ($(GO111MODULE),on) +DEP_VERSION ?= 0.5.4 +DEP_DOWNLOAD_URL ?= https://github.com/golang/dep/releases/download/v$(DEP_VERSION)/dep-$(HOSTOS)-$(HOSTARCH) +$(eval $(call tool.download,dep,$(DEP_VERSION),$(DEP_DOWNLOAD_URL))) +endif + +GOLANGCI_LINT_VERSION ?= 1.45.2 +GOLANGCI_LINT_DOWNLOAD_URL ?= https://github.com/golangci/golangci-lint/releases/download/v$(GOLANGCI_LINT_VERSION)/golangci-lint-$(GOLANGCI_LINT_VERSION)-$(HOSTOS)-$(HOSTARCH).tar.gz +$(eval $(call tool.download.tar.gz,golangci-lint,$(GOLANGCI_LINT_VERSION),$(GOLANGCI_LINT_DOWNLOAD_URL))) + +ifneq ($(LANGUAGES),) +GO_XGETTEXT_VERSION ?= v0.0.0-20180127124228-c366ce0fe48d +GO_XGETTEXT_URL ?= github.com/presslabs/gettext/go-xgettext +$(eval $(call tool.go.install,go-xgettext,$(GO_XGETTEXT_VERSION),$(GO_XGETTEXT_URL))) +endif + +# we use a consistent version of gofmt even while running different go compilers. +# see https://github.com/golang/go/issues/26397 for more details +GOFMT_VERSION ?= 1.18.1 +GOFMT_DOWNLOAD_URL ?= https://dl.google.com/go/go$(GOFMT_VERSION).$(HOSTOS)-$(HOSTARCH).tar.gz +ifneq ($(findstring $(GOFMT_VERSION),$(GO_VERSION)),) +GOFMT := $(shell which gofmt) +else +$(eval $(call tool.download.tar.gz,gofmt,$(GOFMT_VERSION),$(GOFMT_DOWNLOAD_URL),bin/gofmt)) +endif + +GOIMPORTS_VERSION ?= v0.1.10 +GOIMPORTS_URL ?= golang.org/x/tools/cmd/goimports +$(eval $(call tool.go.install,goimports,$(GOIMPORTS_VERSION),$(GOIMPORTS_URL))) + +ifeq ($(GO_TEST_TOOL),ginkgo) +GINKGO_VERSION ?= v2.1.4 +GINKGO_URL ?= github.com/onsi/ginkgo/v2/ginkgo +$(eval $(call tool.go.install,ginkgo,$(GINKGO_VERSION),$(GINKGO_URL))) +else # GO_TEST_TOOL != ginkgo +GO_JUNIT_REPORT_VERSION ?= v0.9.2-0.20191008195320-984a47ca6b0a +GO_JUNIT_REPORT_URL ?= github.com/jstemmer/go-junit-report +$(eval $(call tool.go.install,go-junit-report,$(GO_JUNIT_REPORT_VERSION),$(GO_JUNIT_REPORT_URL),go-junit-report)) +endif # GO_TEST_TOOL + +# ==================================================================================== +# Go Targets + +.go.init: + @if ! `$(GO) version | grep -q -E '\bgo($(GO_SUPPORTED_VERSIONS))\b'`; then \ + $(ERR) unsupported go version. Please make install one of the following supported version: '$(GO_SUPPORTED_VERSIONS)' ;\ + exit 1 ;\ + fi + @if [ "$(GO111MODULE)" != "on" ] && [ "$(realpath ../../../..)" != "$(realpath $(GOPATH))" ]; then \ + $(WARN) the source directory is not relative to the GOPATH at $(GOPATH) or you are you using symlinks. The build might run into issue. Please move the source directory to be at $(GOPATH)/src/$(GO_PROJECT) ;\ + fi + +# common target for building a node js project +$(eval $(call common.target,go.build)) +.go.build.run: .do.go.build +.do.go.build: + @$(INFO) go build $(PLATFORM) $(GO_TAGS) + $(foreach p,$(GO_STATIC_PACKAGES),@CGO_ENABLED=0 $(GO) build -v -i -o $(GO_OUT_DIR)/$(call list-join,_,$(lastword $(subst /, ,$(p))) $(call lower,$(GO_TAGS)))$(GO_OUT_EXT) $(GO_STATIC_FLAGS) $(p) || $(FAIL) ${\n}) + @$(OK) go build $(PLATFORM) $(GO_TAGS) + +ifeq ($(GO_TEST_TOOL),ginkgo) +go.test.unit: $(GINKGO) + @$(INFO) ginkgo unit-tests + @mkdir -p $(GO_TEST_OUTPUT) + @CGO_ENABLED=0 $(GINKGO) $(GO_TEST_FLAGS) $(GO_STATIC_FLAGS) $(patsubst $(ROOT_DIR)/%,./%,$(shell go list -f '{{ .Dir }}' $(GO_TEST_PACKAGES))) || $(FAIL) + @$(OK) go test unit-tests + +go.test.integration: $(GINKGO) + @$(INFO) ginkgo integration-tests + @mkdir -p $(GO_TEST_OUTPUT) || $(FAIL) + @CGO_ENABLED=0 $(GINKGO) $(GO_TEST_FLAGS) $(GO_STATIC_FLAGS) $(foreach t,$(GO_INTEGRATION_TESTS_SUBDIRS),./$(t)/...) $(TEST_FILTER_PARAM) || $(FAIL) + @$(OK) go test integration-tests + +else # GO_TEST_TOOL != ginkgo +go.test.unit: $(GO_JUNIT_REPORT) + @$(INFO) go test unit-tests + @mkdir -p $(GO_TEST_OUTPUT) + @CGO_ENABLED=0 $(GOHOST) test -i $(GO_STATIC_FLAGS) $(GO_TEST_PACKAGES) || $(FAIL) + @CGO_ENABLED=0 $(GOHOST) test $(GO_TEST_FLAGS) $(GO_STATIC_FLAGS) $(GO_TEST_PACKAGES) $(TEST_FILTER_PARAM) 2>&1 | tee $(GO_TEST_OUTPUT)/unit-tests.log || $(FAIL) + @cat $(GO_TEST_OUTPUT)/unit-tests.log | $(GO_JUNIT_REPORT) -set-exit-code > $(GO_TEST_OUTPUT)/unit-tests.xml || $(FAIL) + @$(OK) go test unit-tests + +go.test.integration: $(GO_JUNIT_REPORT) + @$(INFO) go test integration-tests + @mkdir -p $(GO_TEST_OUTPUT) || $(FAIL) + @CGO_ENABLED=0 $(GOHOST) test -i $(GO_STATIC_FLAGS) $(GO_INTEGRATION_TEST_PACKAGES) || $(FAIL) + @CGO_ENABLED=0 $(GOHOST) test $(GO_TEST_FLAGS) $(GO_STATIC_FLAGS) $(GO_INTEGRATION_TEST_PACKAGES) $(TEST_FILTER_PARAM) 2>&1 | tee $(GO_TEST_OUTPUT)/integration-tests.log || $(FAIL) + @cat $(GO_TEST_OUTPUT)/integration-tests.log | $(GO_JUNIT_REPORT) -set-exit-code > $(GO_TEST_OUTPUT)/integration-tests.xml || $(FAIL) + @$(OK) go test integration-tests + +endif # GO_TEST_TOOL + +$(GO_LINT_OUTPUT)/stylecheck.xml: $(GO_SRCS) $(GOLANGCI_LINT) + @$(INFO) golangci-lint + @mkdir -p $(GO_LINT_OUTPUT) + @$(GOLANGCI_LINT) run $(GO_LINT_ARGS) || $(FAIL) + @touch $(GO_LINT_OUTPUT)/stylecheck.xml + @$(OK) golangci-lint + +go.lint: $(GO_LINT_OUTPUT)/stylecheck.xml + +go.fmt.verify: $(GOFMT) .go.imports.verify + @$(INFO) go fmt verify + @gofmt_out=$$($(GOFMT) -s -d -e $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) 2>&1) && [ -z "$${gofmt_out}" ] || (echo "$${gofmt_out}" 1>&2; $(FAIL)) + @$(OK) go fmt verify + +go.fmt: $(GOFMT) .go.imports.fix + @$(INFO) gofmt simplify + @$(GOFMT) -l -s -w $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) || $(FAIL) + @$(OK) gofmt simplify + +.go.imports.verify: $(GOIMPORTS) + @$(INFO) goimports verify + @goimports_out=$$($(GOIMPORTS) -d -e -local $(GO_PROJECT) $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) 2>&1) && [ -z "$${goimports_out}" ] || (echo "$${goimports_out}" 1>&2; $(FAIL)) + @$(OK) goimports verify + +.go.imports.fix: $(GOIMPORTS) + @$(INFO) goimports fix + @$(GOIMPORTS) -l -w -local $(GO_PROJECT) $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) || $(FAIL) + @$(OK) goimports fix + +ifeq ($(GO111MODULE),on) + +.go.vendor.lite go.vendor.check: + @$(INFO) verify dependencies have expected content + @$(GOHOST) mod verify || $(FAIL) + @$(OK) go modules dependencies verified + +go.vendor.update: + @$(INFO) update go modules + @$(GOHOST) get -u ./... || $(FAIL) + @$(OK) update go modules + +go.vendor: + @$(INFO) go mod vendor + @$(GOHOST) mod vendor || $(FAIL) + @$(OK) go mod vendor + +else + +.go.vendor.lite: $(DEP) +# dep ensure blindly updates the whole vendor tree causing everything to be rebuilt. This workaround +# will only call dep ensure if the .lock file changes or if the vendor dir is non-existent. + @if [ ! -d $(GO_VENDOR_DIR) ]; then \ + $(MAKE) go.vendor; \ + elif ! $(DEP) ensure -no-vendor -dry-run &> /dev/null; then \ + $(MAKE) go.vendor; \ + fi + +go.vendor.check: $(DEP) + @$(INFO) checking if vendor deps changed + @$(DEP) check -skip-vendor || $(FAIL) + @$(OK) vendor deps have not changed + +go.vendor.update: $(DEP) + @$(INFO) updating vendor deps + @$(DEP) ensure -update -v || $(FAIL) + @$(OK) updating vendor deps + +go.vendor: $(DEP) + @$(INFO) dep ensure + @$(DEP) ensure || $(FAIL) + @$(OK) dep ensure + +endif + +.go.clean: + @# `go modules` creates read-only folders under WORK_DIR + @# make all folders within WORK_DIR writable, so they can be deleted + @if [ -d $(WORK_DIR) ]; then chmod -R +w $(WORK_DIR); fi + + @rm -fr $(GO_BIN_DIR) $(GO_TEST_DIR) + +.go.distclean: + @rm -rf $(GO_VENDOR_DIR) $(GO_PKG_DIR) + +go.generate: $(GOIMPORTS) + @$(INFO) go generate $(PLATFORM) + @CGO_ENABLED=0 $(GOHOST) generate $(GO_GENERATE_FLAGS) $(GO_PACKAGES) $(GO_INTEGRATION_TEST_PACKAGES) || $(FAIL) + @find $(GO_SUBDIRS) $(GO_INTEGRATION_TESTS_SUBDIRS) -type f -name 'zz_generated*' -exec $(GOIMPORTS) -l -w -local $(GO_PROJECT) {} \; + @$(OK) go generate $(PLATFORM) + +ifneq ($(LANGUAGES),) +.PHONY: go.collect-translations +go.collect-translations: $(GO_XGETTEXT) |$(WORK_DIR) + @$(INFO) go-xgettext collect translations + @$(GO_XGETTEXT) -sort-output -output "$(WORK_DIR)/$(GO_LOCALE_PREFIX).pot" $(GO_XGETTEXT_ARGS) \ + $(shell find $(GO_SUBDIRS) $(STAGING_DIR) -type f -name '*.go' -not -name '*test.go' -not -name '*pb.go') + @$(SED) 's|$(STAGING_DIR)/||g' "$(WORK_DIR)/$(GO_LOCALE_PREFIX).pot" || $(FAIL) + $(foreach p,$(GO_SUBDIRS),@$(SED) 's|([[:space:]])($(p)/[[:alnum:]/]+.go)|\1$(GO_PROJECT)/\2|g' "$(WORK_DIR)/$(GO_LOCALE_PREFIX).pot" || $(FAIL) ${\n}) +# +# Update the .pot file only if there are changes to actual messages. We need this because the collector always updates +# the POT-Creation-Date +# + @$(MAKELIB_BIN_DIR)/po-diff.sh $(LOCALES_DIR)/$(GO_LOCALE_PREFIX).pot $(WORK_DIR)/$(GO_LOCALE_PREFIX).pot || \ + mv $(WORK_DIR)/$(GO_LOCALE_PREFIX).pot $(LOCALES_DIR)/$(GO_LOCALE_PREFIX).pot + @rm -f $(WORK_DIR)/$(GO_LOCALE_PREFIX).pot +# + @$(OK) go-xgettext collect translations + +.translations.init: go.collect-translations +endif + +.PHONY: .go.init .do.go.build go.test.unit go.test.integration go.test.codecov go.lint go.fmt go.generate +.PHONY: .go.vendor.lite go.vendor go.vendor.check go.vendor.update .go.clean .go.distclean + +# ==================================================================================== +# Common Targets + +.build.init: .go.init .go.vendor.lite +.build.check: go.lint +.build.code.platform: go.build +.clean: .go.clean +.distclean: .go.distclean + +.lint.init: .go.init +.lint.run: go.fmt.verify go.lint + +.test.init: .go.init +.test.run: go.test.unit + +.e2e.init: .go.init +.e2e.run: go.test.integration + +.fmt.run: go.fmt + +.generate.run: go.generate + +# ==================================================================================== +# Special Targets + +define GO_HELPTEXT +Go Targets: + go.vendor Updates vendor packages. + go.vendor.check Fail the build if vendor packages have changed. + go.vendor.update Update vendor dependencies. + +Go Options: + GO_TEST_PACKAGES Packages to run the tests for. + GO_TEST_SUITE Regex filter for the tests. + +endef +export GO_HELPTEXT + +.PHONY: .go.help +.go.help: + @echo "$$GO_HELPTEXT" + +.help: .go.help + +endif # __GOLANG_MAKEFILE__ diff --git a/makelib/helm.mk b/makelib/helm.mk new file mode 100644 index 00000000..1ba313dc --- /dev/null +++ b/makelib/helm.mk @@ -0,0 +1,141 @@ +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __HELM_MAKEFILE__ +__HELM_MAKEFILE__ := included + +include $(COMMON_SELF_DIR)/k8s-tools.mk + +# the charts directory +HELM_CHARTS_DIR ?= deploy/charts + +HELM_CHARTS ?= $(patsubst $(HELM_CHARTS_DIR)/%,%,$(shell find $(HELM_CHARTS_DIR) -mindepth 1 -maxdepth 1 -type d)) + +# the base url where helm charts are published +# ifeq ($(HELM_BASE_URL),) +# $(error the variable HELM_BASE_URL must be set prior to including helm.mk) +# endif + +# the charts output directory +HELM_OUTPUT_DIR ?= $(OUTPUT_DIR)/charts + +# the helm index file +HELM_INDEX := $(HELM_OUTPUT_DIR)/index.yaml + +# helm home +HELM_HOME := $(abspath $(WORK_DIR)/helm) +HELM_CHARTS_WORK_DIR := $(abspath $(WORK_DIR)/charts) +export HELM_HOME + +# remove the leading `v` for helm chart versions +HELM_CHART_VERSION := $(VERSION:v%=%) +HELM_APP_VERSION ?= $(VERSION) + +# ==================================================================================== +# Tools install targets + +HELM_VERSION := 3.8.2 +HELM_DOWNLOAD_URL := https://get.helm.sh/helm-v$(HELM_VERSION)-$(HOSTOS)-$(HOSTARCH).tar.gz +$(eval $(call tool.download.tar.gz,helm,$(HELM_VERSION),$(HELM_DOWNLOAD_URL))) + +# ==================================================================================== +# Helm Targets + +$(HELM_HOME): $(HELM) + @mkdir -p $(HELM_HOME) + +$(HELM_OUTPUT_DIR): + @mkdir -p $(HELM_OUTPUT_DIR) + +$(HELM_CHARTS_WORK_DIR): + @mkdir -p $(HELM_CHARTS_WORK_DIR) + +define helm.chart + +.helm.package.init.$(1): $(HELM_CHARTS_WORK_DIR) + @rm -rf $(HELM_CHARTS_WORK_DIR)/$(1) + @cp -a $(abspath $(HELM_CHARTS_DIR)/$(1)) $(HELM_CHARTS_WORK_DIR)/$(1) +.helm.package.run.$(1): $(HELM_OUTPUT_DIR) $(HELM_HOME) + @$(INFO) helm package $(1) $(HELM_CHART_VERSION) + @$(HELM) package --version $(HELM_CHART_VERSION) --app-version $(HELM_APP_VERSION) -d $(HELM_OUTPUT_DIR) $(HELM_CHARTS_WORK_DIR)/$(1) + @$(OK) helm package $(1) $(HELM_CHART_VERSION) +.helm.package.done.$(1): ; @: +.helm.package.$(1): + @$(MAKE) .helm.package.init.$(1) + @$(MAKE) .helm.package.run.$(1) + @$(MAKE) .helm.package.done.$(1) + +.PHONY: .helm.package.init.$(1) .helm.package.run.$(1) .helm.package.done.$(1) .helm.package.$(1) + +$(HELM_OUTPUT_DIR)/$(1)-$(HELM_CHART_VERSION).tgz: $(HELM_HOME) $(HELM_OUTPUT_DIR) $(shell find $(HELM_CHARTS_DIR)/$(1) -type f) + +.PHONY: .helm.lint.$(1) +.helm.lint.$(1): $(HELM_HOME) .helm.dep.$(1) + @$(INFO) helm lint $(1) + @rm -rf $(abspath $(HELM_CHARTS_DIR)/$(1)/charts) + @$(HELM) dependency build $(abspath $(HELM_CHARTS_DIR)/$(1)) + @$(HELM) lint $(abspath $(HELM_CHARTS_DIR)/$(1)) $(HELM_CHART_LINT_ARGS_$(1)) --strict || $$(FAIL) + @$(OK) helm lint $(1) + +helm.lint: .helm.lint.$(1) + +.PHONY: .helm.dep.$(1) +.helm.dep.$(1): $(HELM_HOME) + @$(INFO) helm dep $(1) $(HELM_CHART_VERSION) + @$(HELM) dependency update $(abspath $(HELM_CHARTS_DIR)/$(1)) + @$(OK) helm dep $(1) $(HELM_CHART_VERSION) + +helm.dep: .helm.dep.$(1) + +$(HELM_INDEX): .helm.package.$(1) +endef +$(foreach p,$(HELM_CHARTS),$(eval $(call helm.chart,$(p)))) + +$(HELM_INDEX): $(HELM_HOME) $(HELM_OUTPUT_DIR) + @$(INFO) helm index + @$(HELM) repo index $(HELM_OUTPUT_DIR) + @$(OK) helm index + +helm.build: $(HELM_INDEX) + +.helm.clean: + @rm -fr $(HELM_OUTPUT_DIR) + +.PHONY: helm.lint helm.build helm.dep .helm.clean + +# ==================================================================================== +# Common Targets + +.build.check: helm.lint +.build.artifacts: helm.build +.lint.run: helm.lint +clean: .helm.clean + +# ==================================================================================== +# Special Targets + +define HELM_HELPTEXT +Helm Targets: + helm.dep Upgrade charts dependencies + +endef +export HELM_HELPTEXT + +.PHONY: .helm.help +.helm.help: + @echo "$$HELM_HELPTEXT" + +.help: .helm.help + +endif # __HELM_MAKEFILE__ diff --git a/makelib/image.mk b/makelib/image.mk new file mode 100644 index 00000000..3adbe760 --- /dev/null +++ b/makelib/image.mk @@ -0,0 +1,338 @@ +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ==================================================================================== +# Options + +ifndef __DOCKER_MAKEFILE__ +__DOCKER_MAKEFILE__ := included + +ifeq ($(origin IMAGE_DIR),undefined) +IMAGE_DIR := $(ROOT_DIR)/images +endif + +ifeq ($(origin IMAGE_OUTPUT_DIR),undefined) +IMAGE_OUTPUT_DIR := $(OUTPUT_DIR)/images/$(PLATFORM) +endif + +ifeq ($(origin IMAGE_TEMP_DIR),undefined) +IMAGE_TEMP_DIR := $(shell mktemp -d) +endif + +ifeq ($(DRONE),true) +DOCKER_HOST ?= tcp://docker:2375 +export DOCKER_HOST +endif + +# a registry that is scoped to the current build tree on this host. this enables +# us to have isolation between concurrent builds on the same system, as in the case +# of multiple working directories or on a CI system with multiple executors. All images +# tagged with this build registry can safely be untagged/removed at the end of the build. +ifeq ($(origin BUILD_REGISTRY), undefined) +ifeq ($(CI_BUILD_NUMBER),) +BUILD_REGISTRY := build/$(shell echo $(HOSTNAME)-$(ROOT_DIR) | shasum -a 256 | cut -c1-8) +else +BUILD_REGISTRY := build/$(CI_BUILD_NUMBER) +endif +endif + +# In order to reduce built time especially on jenkins, we maintain a cache +# of already built images. This cache contains images that can be used to help speed +# future docker build commands using docker's content addressable schemes. +# All cached images go in in a 'cache/' local registry and we follow an MRU caching +# policy -- keeping images that have been referenced around and evicting images +# that have to been referenced in a while (and according to a policy). Note we can +# not rely on the image's .CreatedAt date since docker only updates then when the +# image is created and not referenced. Instead we keep a date in the Tag. +CACHE_REGISTRY := cache + +# prune images that are at least this many hours old +PRUNE_HOURS ?= 48 + +# prune keeps at least this many images regardless of how old they are +PRUNE_KEEP ?= 24 + +# don't actually prune just show what prune would do. +PRUNE_DRYRUN ?= 0 + +# the cached image format +CACHE_DATE_FORMAT := "%Y-%m-%d.%H%M%S" +CACHE_PRUNE_DATE := $(shell export TZ="UTC+$(PRUNE_HOURS)"; date +"$(CACHE_DATE_FORMAT)") +CACHE_TAG := $(shell date -u +"$(CACHE_DATE_FORMAT)") + +REGISTRIES ?= $(DOCKER_REGISTRY) + +# docker accepted image platform format +# eg linux/arm64 -> linux/arm64/v8, linux/armv7 -> linux/arm/v7, linux/armv6 -> linux/arm/v6 +dockerify-platform = $(subst armv7,arm/v7,$(subst arm64,arm64/v8,$(1))) +IMAGE_ARCHS := $(subst linux_,,$(filter linux_%,$(PLATFORMS))) +IMAGE_PLATFORMS := $(call dockerify-platform,$(subst _,/,$(filter linux_%,$(PLATFORMS)))) +IMAGE_PLATFORM = $(call dockerify-platform,linux/$(ARCH)) + +IMAGE_TAG ?= $(subst +,-,$(VERSION)) +PROMOTE_TAG := $(if $(PROMOTE_IMAGE_TAG),$(PROMOTE_IMAGE_TAG),$(IMAGE_TAG)) + +# if set to 1 docker image caching will not be used. +CACHEBUST ?= 0 +ifeq ($(CACHEBUST),1) +BUILD_ARGS += --no-cache +endif + +# if V=0 avoid showing verbose output from docker build +ifeq ($(V),0) +BUILD_ARGS ?= -q +endif + +# if PULL=1 we will always check if there is a newer base image +PULL ?= 1 +ifeq ($(PULL),1) +BUILD_BASE_ARGS += --pull +endif +BUILD_BASE_ARGS += $(BUILD_ARGS) +export PULL + +ifeq ($(HOSTOS),Linux) +SELF_CID := $(shell cat /proc/self/cgroup | grep docker | grep -o -E '[0-9a-f]{64}' | head -n 1) +endif + +# ===================================================================================== +# Image Targets + +.do.img.clean: + @for i in $(CLEAN_IMAGES); do \ + if [ -n "$$(docker images -q $$i)" ]; then \ + for c in $$(docker ps -a -q --no-trunc --filter=ancestor=$$i); do \ + if [ "$$c" != "$(SELF_CID)" ]; then \ + $(INFO) stopping and removing container $${c} referencing image $$i; \ + docker stop $${c}; \ + docker rm $${c}; \ + fi; \ + done; \ + $(INFO) cleaning image $$i; \ + docker rmi $$i > /dev/null 2>&1 || true; \ + fi; \ + done + +# this will clean everything for this build +.img.clean: + @$(INFO) cleaning images for $(BUILD_REGISTRY) + @$(MAKE) .do.img.clean CLEAN_IMAGES="$(shell docker images | grep -E '^$(BUILD_REGISTRY)/' | awk '{print $$1":"$$2}')" + @$(OK) cleaning images for $(BUILD_REGISTRY) + +.img.done: + @rm -fr $(IMAGE_TEMP_DIR) + +.img.cache: + @for i in $(CACHE_IMAGES); do \ + IMGID=$$(docker images -q $$i); \ + if [ -n "$$IMGID" ]; then \ + $(INFO) caching image $$i; \ + CACHE_IMAGE=$(CACHE_REGISTRY)/$${i#*/}; \ + docker tag $$i $${CACHE_IMAGE}:$(CACHE_TAG); \ + for r in $$(docker images --format "{{.ID}}#{{.Repository}}:{{.Tag}}" | grep $$IMGID | grep $(CACHE_REGISTRY)/ | grep -v $${CACHE_IMAGE}:$(CACHE_TAG)); do \ + docker rmi $${r#*#} > /dev/null 2>&1 || true; \ + done; \ + fi; \ + done + +# prune removes old cached images +img.prune: + @$(INFO) pruning images older than $(PRUNE_HOURS) keeping a minimum of $(PRUNE_KEEP) images + @EXPIRED=$$(docker images --format "{{.Tag}}#{{.Repository}}:{{.Tag}}" \ + | grep -E '$(CACHE_REGISTRY)/' \ + | sort -r \ + | awk -v i=0 -v cd="$(CACHE_PRUNE_DATE)" -F "#" '{if ($$1 <= cd && i >= $(PRUNE_KEEP)) print $$2; i++ }') &&\ + for i in $$EXPIRED; do \ + $(INFO) removing expired cache image $$i; \ + [ $(PRUNE_DRYRUN) = 1 ] || docker rmi $$i > /dev/null 2>&1 || true; \ + done + @for i in $$(docker images -q -f dangling=true); do \ + $(INFO) removing dangling image $$i; \ + docker rmi $$i > /dev/null 2>&1 || true; \ + done + @$(OK) pruning + +debug.nuke: + @for c in $$(docker ps -a -q --no-trunc); do \ + if [ "$$c" != "$(SELF_CID)" ]; then \ + $(INFO) stopping and removing container $${c}; \ + docker stop $${c}; \ + docker rm $${c}; \ + fi; \ + done + @for i in $$(docker images -q); do \ + $(INFO) removing image $$i; \ + docker rmi -f $$i > /dev/null 2>&1; \ + done + + +# 1: registry 2: image, 3: arch +define repo.targets +.PHONY: .img.release.build.$(1).$(2).$(3) +.img.release.build.$(1).$(2).$(3): + @$(INFO) docker build $(1)/$(2):$(IMAGE_TAG)-$(3) + @docker tag $(BUILD_REGISTRY)/$(2)-$(3) $(1)/$(2):$(IMAGE_TAG)-$(3) || $(FAIL) + @$(OK) docker build $(1)/$(2):$(IMAGE_TAG)-$(3) +.img.release.build: .img.release.build.$(1).$(2).$(3) + +.PHONY: .img.release.publish.$(1).$(2).$(3) +.img.release.publish.$(1).$(2).$(3): + @$(INFO) docker push $(1)/$(2):$(IMAGE_TAG)-$(3) + @docker push $(1)/$(2):$(IMAGE_TAG)-$(3) || $(FAIL) + @$(OK) docker push $(1)/$(2):$(IMAGE_TAG)-$(3) +.img.release.publish: .img.release.publish.$(1).$(2).$(3) + +.PHONY: .img.release.promote.$(1).$(2).$(3) +.img.release.promote.$(1).$(2).$(3): + @$(INFO) docker promote $(1)/$(2):$(IMAGE_TAG)-$(3) to $(1)/$(2):$(CHANNEL)-$(PROMOTE_TAG)-$(3) + + @[ "$(CHANNEL)" = "master" ] ||\ + docker buildx imagetools create \ + --tag $(1)/$(2):$(CHANNEL)-$(PROMOTE_TAG)-$(3) \ + $(1)/$(2):$(IMAGE_TAG)-$(3) || $(FAIL) + + @$(OK) docker promote +.img.release.promote: .img.release.promote.$(1).$(2).$(3) + +.PHONY: .img.release.clean.$(1).$(2).$(3) +.img.release.clean.$(1).$(2).$(3): + @[ -z "$$$$(docker images -q $(1)/$(2):$(IMAGE_TAG)-$(3))" ] || docker rmi $(1)/$(2):$(IMAGE_TAG)-$(3) +.img.release.clean: .img.release.clean.$(1).$(2).$(3) +endef +$(foreach r,$(REGISTRIES), $(foreach i,$(IMAGES), $(foreach a,$(IMAGE_ARCHS),$(eval $(call repo.targets,$(r),$(i),$(a)))))) + + +.PHONY: .img.release.manifest.publish.% +.img.release.manifest.publish.%: .img.release.publish + @$(INFO) docker buildx imagetools create \ + --tag $(DOCKER_REGISTRY)/$*:$(IMAGE_TAG) \ + $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) + + @docker buildx imagetools create \ + --tag $(DOCKER_REGISTRY)/$*:$(IMAGE_TAG) \ + $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) || $(FAIL) + + @$(OK) docker buildx imagetools create + +.PHONY: .img.release.manifest.promote.% +.img.release.manifest.promote.%: .img.release.promote + @$(INFO) docker buildx imagetools create --tag $(DOCKER_REGISTRY)/$*:$(CHANNEL) $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) + @[ "$(CHANNEL)" = "master" ] ||\ + docker buildx imagetools create \ + --tag $(DOCKER_REGISTRY)/$*:$(CHANNEL)-$(PROMOTE_TAG) \ + $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) || $(FAIL) + + @# Republish images to the PROMOTE_TAG when promoting on stable channel + @[ "$(CHANNEL)" != "stable" ] || [ "$(PROMOTE_TAG)" = "$(IMAGE_TAG)" ] ||\ + docker buildx imagetools create \ + --tag $(DOCKER_REGISTRY)/$*:$(PROMOTE_TAG) \ + $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) || $(FAIL) + + @docker buildx imagetools create \ + --tag $(DOCKER_REGISTRY)/$*:$(CHANNEL) \ + $(patsubst %,$(DOCKER_REGISTRY)/$*:$(IMAGE_TAG)-%,$(IMAGE_ARCHS)) || $(FAIL) + + @$(OK) docker buildx imagetools create + +.img.release.build: ;@ +.img.release.publish: ;@ +.img.release.promote: ;@ +.img.release.clean: ;@ + +.PHONY: img.prune .img.done .img.clean .do.img.clean .img.release.build .img.release.publish .img.release.promote +.PHONY: .img.release.clean .img.cache img.publish + +# ==================================================================================== +# Common Targets + +# if IMAGES is defined then invoke and build each image identified +ifneq ($(IMAGES),) + +ifeq ($(DOCKER_REGISTRY),) +$(error the variable DOCKER_REGISTRY must be set prior to including image.mk) +endif + +.do.build.image.%: +ifeq ($(filter linux_%,$(PLATFORM)),) + @$(WARN) skipping docker build for $* on PLATFORM=$(PLATFORM) +else + @$(MAKE) -C $(IMAGE_DIR)/$* PLATFORM=$(PLATFORM) +endif + +.do.build.images: $(foreach i,$(IMAGES), .do.build.image.$(i)) ; +.build.artifacts.platform: .do.build.images +.build.done: .img.cache .img.done +clean: .img.clean .img.release.clean + +.publish.init: .img.release.build + +img.publish: $(addprefix .img.release.manifest.publish.,$(IMAGES)) + +# only publish images for master and release branches +ifneq ($(filter master release-%,$(BRANCH_NAME)),) +.publish.run: img.publish +endif + +# publish images at tag also +ifneq ($(TAGS),) +.publish.run: img.publish +endif + + +.promote.run: $(addprefix .img.release.manifest.promote.,$(IMAGES)) + +else # assume this .mk file is being included to build a single image + +ifeq ($(PLATFORM),darwin_amd64) # when building docker image on macOS pretend we are building for linux +PLATFORM := linux_amd64 +endif + +ifneq ($(filter $(PLATFORM),$(PLATFORMS)),) +.build.artifacts.platform: img.build +.build.done: .img.cache .img.done +clean: .img.clean +else # trying to build a docker image for an invalid platform +.DEFAULT_GOAL := .skip +.PHONY: .skip +.skip: + @$(WARN) skipping docker build for $(IMAGE) for PLATFORM=$(PLATFORM) +endif + +endif + +# ==================================================================================== +# Special Targets + +define IMAGE_HELPTEXT +Image Targets: + img.prune Prune orphaned and cached images. + +Image Options: + PRUNE_HOURS The number of hours from when an image is last used + for it to be considered a target for pruning. + Default is 48 hours. + PRUNE_KEEP The minimum number of cached images to keep. + Default is 24 images. + +endef +export IMAGE_HELPTEXT + +.img.help: + @echo "$$IMAGE_HELPTEXT" + +.help: .img.help + +.PHONY: .img.help + +endif # __DOCKER_MAKEFILE__ diff --git a/makelib/k8s-tools.mk b/makelib/k8s-tools.mk new file mode 100644 index 00000000..71afadb9 --- /dev/null +++ b/makelib/k8s-tools.mk @@ -0,0 +1,37 @@ +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __K8S_TOOLS_MAKEFILE__ +__K8S_TOOLS_MAKEFILE__ := included + +# ==================================================================================== +# tools + +# kubectl download and install +KUBECTL_VERSION ?= 1.22.4 +KUBECTL_DOWNLOAD_URL ?= https://storage.googleapis.com/kubernetes-release/release/v$(KUBECTL_VERSION)/bin/$(HOSTOS)/$(HOSTARCH)/kubectl +$(eval $(call tool.download,kubectl,$(KUBECTL_VERSION),$(KUBECTL_DOWNLOAD_URL))) + +# kind download and install +KIND_VERSION ?= 0.12.0 +KIND_DOWNLOAD_URL ?= https://github.com/kubernetes-sigs/kind/releases/download/v$(KIND_VERSION)/kind-$(HOSTOS)-$(HOSTARCH) +$(eval $(call tool.download,kind,$(KIND_VERSION),$(KIND_DOWNLOAD_URL))) + +# kind download and install +KUSTOMIZE_VERSION ?= 4.5.4 +KUSTOMIZE_DOWNLOAD_URL ?=https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v$(KUSTOMIZE_VERSION)/kustomize_v$(KUSTOMIZE_VERSION)_$(HOST_PLATFORM).tar.gz +$(eval $(call tool.download.tar.gz,kustomize,$(KUSTOMIZE_VERSION),$(KUSTOMIZE_DOWNLOAD_URL),kustomize,0)) + +endif # __K8S_TOOLS_MAKEFILE__ + diff --git a/makelib/kubebuilder.mk b/makelib/kubebuilder.mk new file mode 100644 index 00000000..366d4782 --- /dev/null +++ b/makelib/kubebuilder.mk @@ -0,0 +1,116 @@ +# Copyright 2019 Pressinfra Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __KUBEBUILDER_MAKEFILE__ +__KUBEBUILDER_MAKEFILE__ := included + +include $(COMMON_SELF_DIR)/golang.mk + +# ==================================================================================== +# Options + +CRD_DIR ?= config/crd/bases +RBAC_DIR ?= config/rbac + +BOILERPLATE_FILE ?= hack/boilerplate.go.txt + +CONTROLLER_GEN_CRD_OPTIONS ?= crd:generateEmbeddedObjectMeta=true output:crd:artifacts:config=$(CRD_DIR) +CONTROLLER_GEN_RBAC_OPTIONS ?= rbac:roleName=manager-role output:rbac:artifacts:config=$(RBAC_DIR) +CONTROLLER_GEN_WEBHOOK_OPTIONS ?= webhook +CONTROLLER_GEN_OBJECT_OPTIONS ?= object:headerFile=$(BOILERPLATE_FILE) +CONTROLLER_GEN_PATHS ?= $(foreach t,$(GO_SUBDIRS),paths=./$(t)/...) + +KUBEBUILDER_ASSETS_VERSION ?= 1.21.2 +KUBEBUILDER_ASSETS = $(CACHE_DIR)/kubebuilder/k8s/$(KUBEBUILDER_ASSETS_VERSION)-$(HOSTOS)-$(HOSTARCH) +export KUBEBUILDER_ASSETS + +# ==================================================================================== +# tools + +# setup-envtest download and install +SETUP_ENVTEST_VERSION ?= 0.0.0-20220808123420-bcde6f084dd1 +SETUP_ENVTEST_DOWNLOAD_URL ?= sigs.k8s.io/controller-runtime/tools/setup-envtest +$(eval $(call tool.go.install,setup-envtest,v$(SETUP_ENVTEST_VERSION),$(SETUP_ENVTEST_DOWNLOAD_URL))) + +# kubebuilder download and install +KUBEBUILDER_VERSION ?= 3.6.0 +KUBEBUILDER_DOWNLOAD_URL ?= https://github.com/kubernetes-sigs/kubebuilder/releases/download/v$(KUBEBUILDER_VERSION)/kubebuilder_$(HOST_PLATFORM) +$(eval $(call tool.download,kubebuilder,$(KUBEBUILDER_VERSION),$(KUBEBUILDER_DOWNLOAD_URL))) + +# controller-gen download and install +CONTROLLER_GEN_VERSION ?= 0.9.2 +CONTROLLER_GEN_DOWNLOAD_URL ?= sigs.k8s.io/controller-tools/cmd/controller-gen +$(eval $(call tool.go.install,controller-gen,v$(CONTROLLER_GEN_VERSION),$(CONTROLLER_GEN_DOWNLOAD_URL))) + +build.tools: |$(KUBEBUILDER_ASSETS) +$(KUBEBUILDER_ASSETS): $(SETUP_ENVTEST) + @echo ${TIME} ${BLUE}[TOOL]${CNone} installing kubebuilder assets for Kubernetes $(KUBEBUILDER_ASSETS_VERSION) + @$(SETUP_ENVTEST) --bin-dir=$(CACHE_DIR)/kubebuilder --os=$(HOSTOS) --arch=$(HOSTARCH) use $(KUBEBUILDER_ASSETS_VERSION) + @$(OK) installing kubebuilder assets for Kubernetes $(KUBEBUILDER_ASSETS_VERSION) + +# ==================================================================================== +# Kubebuilder Targets + +$(eval $(call common.target,kubebuilder.manifests)) +# Generate manifests e.g. CRD, RBAC etc. +.do.kubebuilder.manifests: $(CONTROLLER_GEN) + @$(INFO) Generating Kubernetes \(CRDs, RBAC, WebhookConfig, etc.\) manifests + @$(CONTROLLER_GEN) \ + $(CONTROLLER_GEN_CRD_OPTIONS) \ + $(CONTROLLER_GEN_RBAC_OPTIONS) \ + $(CONTROLLER_CONTROLLER_GEN_WEBHOOK_OPTIONS) \ + $(CONTROLLER_GEN_PATHS) + @$(OK) Generating Kubernetes \(CRDs, RBAC, WebhookConfig, etc.\) manifests +.PHONY: .do.kubebuilder.manifests +.kubebuilder.manifests.run: .do.kubebuilder.manifests + +$(eval $(call common.target,kubebuilder.code)) +# Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. +.do.kubebuilder.code: $(CONTROLLER_GEN) + @$(INFO) Generating DeepCopy, DeepCopyInto, and DeepCopyObject code + @$(CONTROLLER_GEN) \ + $(CONTROLLER_GEN_OBJECT_OPTIONS) \ + $(CONTROLLER_GEN_PATHS) + @$(OK) Generating DeepCopy, DeepCopyInto, and DeepCopyObject code +.PHONY: .do.kubebuilder.code +.kubebuilder.code.run: .do.kubebuilder.code + +# ==================================================================================== +# Common Targets + +.test.init: |$(KUBEBUILDER_ASSETS) +go.test.unit: |$(KUBEBUILDER_ASSETS) +go.generate: kubebuilder.code +.generate.init: .kubebuilder.manifests.init +.generate.run: .kubebuilder.manifests.run +.generate.done: .kubebuilder.manifests.done + +# ==================================================================================== +# Special Targets + +define KUBEBULDER_HELPTEXT +Kubebuilder Targets: + kubebuilder.manifests Generates Kubernetes custom resources manifests (e.g. CRDs RBACs, ...) + kubebuilder.code Generates DeepCopy, DeepCopyInto, and DeepCopyObject code + +endef +export KUBEBULDER_HELPTEXT + +.kubebuilder.help: + @echo "$$KUBEBULDER_HELPTEXT" + +.help: .kubebuilder.help +.PHONY: .kubebuilder.help + +endif # __KUBEBUILDER_MAKEFILE__ \ No newline at end of file diff --git a/makelib/nodejs.mk b/makelib/nodejs.mk new file mode 100644 index 00000000..67ee3e96 --- /dev/null +++ b/makelib/nodejs.mk @@ -0,0 +1,149 @@ +# Copyright 2016 The Upbound Authors. All rights reserved. +# Copyright 2019 The Pressinfra Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __NODEJS_MAKEFILE__ +__NODEJS_MAKEFILE__ := included + +# ==================================================================================== +# Options + +# supported node versions +NODE_SUPPORTED_VERSIONS ?= 10|12 +NODE := node + +SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST))) + +# The location of node application within this git repo. +NODE_ROOT_DIR ?= $(SELF_DIR)/../.. + +# The location of node application source code, relative to the NODE_ROOT_DIR +NODE_SRC_DIR ?= src + +NODE_ENV ?= production +export NODE_ENV + +YARN := yarn +YARN_MODULE_DIR := $(NODE_ROOT_DIR)/node_modules +YARN_BIN_DIR := $(abspath $(NODE_ROOT_DIR)/node_modules/.bin) +YARN_PACKAGE_FILE := $(NODE_ROOT_DIR)/package.json +YARN_PACKAGE_LOCK_FILE := $(NODE_ROOT_DIR)/yarn.lock + +NODE_SRCS ?= $(abspath $(YARN_PACKAGE_FILE)) $(abspath $(YARN_PACKAGE_LOCK_FILE)) $(shell find $(abspath $(NODE_ROOT_DIR)/$(NODE_SRC_DIR)) -type f | grep -v '__tests__') + +YARN_CACHE_FOLDER ?= $(CACHE_DIR)/yarn +export YARN_CACHE_FOLDER + +YARN_OUTDIR ?= $(OUTPUT_DIR)/yarn +export YARN_OUTDIR + +EXTEND_ESLINT ?= true +export EXTEND_ESLINT + +ESLINT_OUTPUT_DIR := $(OUTPUT_DIR)/lint/eslint + +# ==================================================================================== +# NodeJS Tools Targets + +ESLINT := $(YARN_BIN_DIR)/eslint +$(ESLINT): |yarn.install +build.tools: $(ESLINT) + +# ==================================================================================== +# YARN Targets + +.PHONY: .yarn.init +.yarn.init: + @if ! `$(NODE) --version | grep -q -E '^v($(NODE_SUPPORTED_VERSIONS))\.'`; then \ + $(ERR) unsupported node version. Please install one of the following supported version: '$(NODE_SUPPORTED_VERSIONS)' ;\ + exit 1 ;\ + fi + +# some node packages like node-sass require platform/arch specific install. we need +# to run yarn for each platform. As a result we track a stamp file per host +YARN_INSTALL_STAMP := $(YARN_MODULE_DIR)/.yarn.install.$(HOST_PLATFORM).stamp + +# only run "yarn" if the package.json has changed +$(YARN_INSTALL_STAMP): $(YARN_PACKAGE_FILE) $(YARN_PACKAGE_LOCK_FILE) + @echo ${TIME} $(BLUE)[TOOL]$(CNone) yarn install + @cd $(NODE_ROOT_DIR); $(YARN) --silent --frozen-lockfile --non-interactive --production=false || $(FAIL) + @touch $(YARN_INSTALL_STAMP) + @$(OK) yarn install + +yarn.install: .yarn.init $(YARN_INSTALL_STAMP) + +.yarn.clean: + @rm -rf $(YARN_MODULE_DIR) + +.PHONY: yarn.install .yarn.clean + +# ==================================================================================== +# NodeJS Targets + +$(ESLINT_OUTPUT_DIR)/stylecheck.xml: $(ESLINT) $(NODE_SRCS) + @$(INFO) eslint + @mkdir -p $(ESLINT_OUTPUT_DIR) + @cd $(NODE_ROOT_DIR); $(ESLINT) '$(NODE_SRC_DIR)/**/*.{ts,tsx}' --color + @touch $@ + @$(OK) eslint + +js.lint: $(ESLINT_OUTPUT_DIR)/stylecheck.xml + +js.lint.fix: + @$(INFO) eslint fix + @cd $(NODE_ROOT_DIR); $(ESLINT) '$(NODE_SRC_DIR)/**/*.{ts,tsx}' --color + @$(OK) eslint fix + +# common target for building a node js project +$(eval $(call common.target,js.build)) + +# common target for testing a node js project +$(eval $(call common.target,js.test)) + +.PHONY: js.lint js.lint.fix + +# ==================================================================================== +# Common Targets + +.build.init: .yarn.init .js.build.init +.build.check: js.lint +.build.code: .js.build.run +.build.done: .js.build.done + +.test.init: .js.test.init +.test.run: .js.test.run +.test.done: .js.test.done + +clean: .yarn.clean + +.lint.run: js.lint +.fmt.run: js.lint.fix + +# ==================================================================================== +# Special Targets + +define NODEJS_HELPTEXT +nodejs Targets: + yarn.install Installs dependencies in a make friendly manner. + +endef +export NODEJS_HELPTEXT + +.PHONY: .js.help +.js.help: + @echo "$$NODEJS_HELPTEXT" + +.help: .js.help + +endif # __NODEJS_MAKEFILE__ diff --git a/makelib/php.mk b/makelib/php.mk new file mode 100644 index 00000000..caef53f2 --- /dev/null +++ b/makelib/php.mk @@ -0,0 +1,157 @@ +# Copyright 2020 The Pressinfra Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __PHP_MAKEFILE__ +__PHP_MAKEFILE__ := included + +# ==================================================================================== +# Options + +# supported php versions +PHP_SUPPORTED_VERSIONS ?= 7.3|7.4|8.0|8.1 +PHP := php + +SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST))) + +# The location of php application within this git repo. +PHP_ROOT_DIR ?= $(SELF_DIR)/../.. + +# The location of php application source code, relative to the PHP_ROOT_DIR +PHP_SRC_DIR ?= src + +COMPOSER_VERSION ?= 2.3.5 +COMPOSER_DOWNLOAD_URL ?= https://getcomposer.org/download/$(COMPOSER_VERSION)/composer.phar +$(eval $(call tool.download,composer,$(COMPOSER_VERSION),$(COMPOSER_DOWNLOAD_URL))) + +COMPOSER_INSTALL_ARGS ?= --prefer-dist --classmap-authoritative +COMPOSER_VENDOR_DIR := $(PHP_ROOT_DIR)/vendor +COMPOSER_BIN_DIR := $(abspath $(PHP_ROOT_DIR)/vendor/bin) +COMPOSER_JSON_FILE := $(PHP_ROOT_DIR)/composer.json +COMPOSER_LOCK_FILE := $(PHP_ROOT_DIR)/composer.lock + +COMPOSER_CACHE_DIR := $(CACHE_DIR)/composer +export COMPOSER_CACHE_DIR + +# ==================================================================================== +# PHP Tools Targets + +PHPUNIT := $(COMPOSER_BIN_DIR)/phpunit +$(PHPUNIT): |composer.install +build.tools: $(PHPUNIT) + +PHPCS := $(COMPOSER_BIN_DIR)/phpcs +$(PHPCS): |composer.install +build.tools: $(PHPCS) + +PHPCBF := $(COMPOSER_BIN_DIR)/phpcbf +$(PHPCBF): |composer.install +build.tools: $(PHPCBF) + +# ==================================================================================== +# Composer targets + +.PHONY: .composer.init +.composer.init: + @if ! `$(PHP) --version | grep -q -E '^PHP ($(PHP_SUPPORTED_VERSIONS))\.'`; then \ + $(ERR) unsupported PHP version. Please install one of the following supported version: '$(PHP_SUPPORTED_VERSIONS)' ;\ + exit 1 ;\ + fi +$(COMPOSER): .composer.init + +COMPOSER_INSTALL_STAMP := $(COMPOSER_VENDOR_DIR)/.composer.install.stamp + +# only run "composer" if the composer.json has changed +$(COMPOSER_INSTALL_STAMP): $(COMPOSER) $(COMPOSER_JSON_FILE) $(COMPOSER_LOCK_FILE) + @echo ${TIME} $(BLUE)[TOOL]$(CNone) composer install + @cd $(PHP_ROOT_DIR); $(COMPOSER) install --no-interaction || $(FAIL) + @touch $(COMPOSER_INSTALL_STAMP) + @$(OK) composer install + +composer.install: $(COMPOSER_INSTALL_STAMP) + +composer.update: $(COMPOSER) + @echo ${TIME} $(BLUE)[TOOL]$(CNone) composer update + @cd $(PHP_ROOT_DIR); $(COMPOSER) update || $(FAIL) + @touch $(COMPOSER_INSTALL_STAMP) + @$(OK) composer install + + +.composer.clean: + @rm -rf $(COMPOSER_VENDOR_DIR) + +.PHONY: composer.install composer.update .composer.clean + +# ==================================================================================== +# PHP Targets + +php.lint: + @$(INFO) phpcs $(PHP_SRC_DIR) + @cd $(PHP_ROOT_DIR); $(PHPCS) $(PHP_SRC_DIR) + @$(OK) phpcs $(PHP_SRC_DIR) + +php.lint.fix: + @$(INFO) phpcbf $(PHP_SRC_DIR) + @cd $(PHP_ROOT_DIR); $(PHPCBF) $(PHP_SRC_DIR) + @$(OK) phpcbf $(PHP_SRC_DIR) +.PHONY: php.lint php.lint.fix + +# common target for building a php project +$(eval $(call common.target,php.build)) + +# common target for testing a php project +$(eval $(call common.target,php.test)) + +.PHONY: .do.php.test +.php.test.run: .do.php.test +.do.php.test: $(PHPUNIT) + @$(INFO) phpunit + @$(PHPUNIT) $(PHPUNIT_ARGS) + @$(OK) phpunit + + +# ==================================================================================== +# Common Targets + +.build.init: .composer.init +.build.check: php.lint +.build.code: .php.build.run +.build.done: .php.build.done + +.test.init: .php.test.init +.test.run: .php.test.run +.test.done: .php.test.done + +clean: .composer.clean + +.lint.run: php.lint +.fmt.run: php.lint.fix + +# ==================================================================================== +# Special Targets + +define PHP_HELPTEXT +PHP Targets: + composer.install Installs dependencies in a make friendly manner. + composer.update Updates dependencies in a make friendly manner. + +endef +export PHP_HELPTEXT + +.PHONY: .php.help +.php.help: + @echo "$$PHP_HELPTEXT" + +.help: .php.help + +endif # __PHP_MAKEFILE__ diff --git a/makelib/protobuf.mk b/makelib/protobuf.mk new file mode 100644 index 00000000..ce31604a --- /dev/null +++ b/makelib/protobuf.mk @@ -0,0 +1,113 @@ +# Copyright 2016 The Upbound Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __PROTOBUF_MAKEFILE__ +__PROTOBUF_MAKEFILE__ := included + +# ==================================================================================== +# Setup protobuf environment + +PROTOBUF_DIR ?= proto +PROTOBUF_FILES ?= $(sort $(shell find $(PROTOBUF_DIR) -name "*.proto")) + +PROTOC_VERSION ?= 3.10.1 + +# ==================================================================================== +# Tools install targets + +PROTOTOOL_VERSION ?= 1.9.0 +PROTOTOOL_CACHE_PATH := $(TOOLS_HOST_DIR)/prototool +export PROTOTOOL_CACHE_PATH + +PROTOTOOL_DOWNLOAD_URL ?= https://github.com/uber/prototool/releases/download/v$(PROTOTOOL_VERSION)/prototool-$(HOSTOS)-x86_64 +$(eval $(call tool.download,prototool,$(PROTOTOOL_VERSION),$(PROTOTOOL_DOWNLOAD_URL))) + +# ==================================================================================== +# Protobuf Targets + +build.tools: .pb.prototool.cache.update +.pb.prototool.cache.update: $(PROTOTOOL_CACHE_PATH)/.update +$(PROTOTOOL_CACHE_PATH)/.update: $(PROTOBUF_DIR)/prototool.yaml |$(PROTOTOOL) + @echo ${TIME} $(BLUE)[TOOL]$(CNone) updating prototool cache + @$(PROTOTOOL) cache update $(PROTOBUF_DIR) + @touch $@ + @$(OK) updating prototool cache + +.pb.init: .pb.prototool.cache.update + +pb.lint: $(PROTOTOOL) + @$(INFO) prototool lint + @$(PROTOTOOL) lint $(PROTOBUF_DIR) || $(FAIL) + @$(OK) prototool lint + +pb.fmt.verify: $(PROTOTOOL) + @$(INFO) prototool format verify + @$(PROTOTOOL) format -l $(PROTOBUF_DIR) || $(FAIL) + @$(OK) prototool format verify + +pb.fmt: $(PROTOTOOL) + @$(INFO) prototool format + @$(PROTOTOOL) format -w $(PROTOBUF_DIR) || $(FAIL) + @$(OK) prototool format + +# expose as common target so that we can hook in other generators +# eg. https://github.com/dcodeIO/protobuf.js +$(eval $(call common.target,pb.generate)) + +.pb.prototool.generate: + @$(INFO) prototool generate + @$(PROTOTOOL) generate $(PROTOBUF_DIR) + @$(OK) prototool generate + +.pb.generate.init: .pb.init +.pb.generate.run: .pb.prototool.generate + +.PHONY: .go.init go.lint go.fmt go.generate .pb.clean .pb.distclean +.PHONY: .pb.prototool.cache.update .pb.prototool.generate + +# ==================================================================================== +# Common Targets + +.lint.init: .pb.init +.lint.run: pb.fmt.verify pb.lint + +.fmt.run: pb.fmt + +.generate.init: .pb.init +.generate.run: pb.generate + +# ==================================================================================== +# Special Targets + +define PROTOBUF_HELPTEXT +Protobuf Targets: + pb.generate Generate code from protobuf files in $(PROTOBUF_DIR) + +endef +export PROTOBUF_HELPTEXT + +.PHONY: .go.help +.pb.help: + @echo "$$PROTOBUF_HELPTEXT" + +.help: .pb.help + + +# # we use a consistent version of gofmt even while running different go compilers. +# # see https://github.com/golang/go/issues/26397 for more details +# PROTOC_VERSION ?= 3.10.1 +# PROTOC_DOWNLOAD_URL ?= https://github.com/protocolbuffers/protobuf/releases/download/v$(PROTOC_VERSION)/protoc-$(PROTOC_VERSION)-$(HOSTOS)-$(HOSTARCH).zip +# $(eval $(call tool.download.zip,protoc,$(PROTOC_VERSION),$(PROTOC_DOWNLOAD_URL),bin/protoc)) + +endif # __PROTOBUF_MAKEFILE__ diff --git a/makelib/react.mk b/makelib/react.mk new file mode 100644 index 00000000..cedec8e0 --- /dev/null +++ b/makelib/react.mk @@ -0,0 +1,114 @@ +# Copyright 2019 The Pressinfra Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __REACT_MAKEFILE__ +__REACT_MAKEFILE__ := included + +SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST))) +include $(SELF_DIR)/nodejs.mk + +# ==================================================================================== +# Options + +REACT_OUTPUT_DIR ?= $(OUTPUT_DIR)/react + +REACT_LOCALE_PREFIX ?= messages + +# ==================================================================================== +# React app Targets + +REACT := $(YARN_BIN_DIR)/react-scripts --max_old_space_size=4096 +$(REACT): yarn.install +build.tools: $(REACT) + +$(REACT_OUTPUT_DIR)/index.html: $(REACT) $(NODE_SRCS) + @$(INFO) react-scripts build + @cd $(NODE_ROOT_DIR); $(REACT) build + @mkdir -p $(REACT_OUTPUT_DIR) + @rm -rf $(REACT_OUTPUT_DIR) + @mv $(NODE_ROOT_DIR)/build $(REACT_OUTPUT_DIR) + @$(OK) react-scripts build +react.build: $(REACT_OUTPUT_DIR)/index.html + +react.test: $(REACT) + @$(INFO) react-scripts test + @cd $(NODE_ROOT_DIR); TZ='UTC' $(REACT) test --env=jsdom --verbose --colors + @$(OK) react-scripts test + +react.run: $(REACT) + @cd $(NODE_ROOT_DIR); NODE_ENV=development BROWSER=none $(REACT) start + +.react.clean: + @rm -rf $(REACT_OUTPUT_DIR) + +.PHONY: react.build react.test .react.clean + +ifneq ($(LANGUAGES),) +I18NEXT_CONV := $(YARN_BIN_DIR)/i18next-conv +REACT_GETTEXT_PARSER := $(YARN_BIN_DIR)/react-gettext-parser + +$(I18NEXT_CONV): yarn.install +$(REACT_GETTEXT_PARSER): yarn.install +build.tools: $(REACT_GETTEXT_PARSER) $(I18NEXT_CONV) + +.PHONY: react.collect-translations +react.collect-translations: $(REACT_GETTEXT_PARSER) |$(WORK_DIR) + @$(INFO) react-gettext-parser collect translations + @cd $(NODE_ROOT_DIR); $(REACT_GETTEXT_PARSER) --config .gettextparser --no-wrap --output $(abspath $(WORK_DIR))/$(REACT_LOCALE_PREFIX).pot '$(NODE_SRC_DIR)/**/*.{js,ts,tsx}' +# Update the .pot file only if there are changes to actual messages. We need this because the collector always updates +# the POT-Creation-Date +# + @$(MAKELIB_BIN_DIR)/po-diff.sh $(LOCALES_DIR)/$(REACT_LOCALE_PREFIX).pot $(WORK_DIR)/$(REACT_LOCALE_PREFIX).pot || \ + mv $(WORK_DIR)/$(REACT_LOCALE_PREFIX).pot $(LOCALES_DIR)/$(REACT_LOCALE_PREFIX).pot + @rm -f $(WORK_DIR)/$(REACT_LOCALE_PREFIX).pot +# + @$(OK) react-gettext-parser collect translations + +react.convert-translations: $(I18NEXT_CONV) + @$(INFO) i18next convert translations to json + $(foreach l,$(LANGUAGES),@$(I18NEXT_CONV) --language $(l) --skipUntranslated \ + --source $(LOCALES_DIR)/$(l)/$(REACT_LOCALE_PREFIX).po \ + --target $(NODE_ROOT_DIR)/$(NODE_SRC_DIR)/locales/$(l).json \ + > /dev/null || $(FAIL) ${\n}\ + ) + @$(OK) i18next convert translations to json + +.translations.init: react.collect-translations +.translations.done: react.convert-translations +endif + +# ==================================================================================== +# Common Targets + +.js.build.run: react.build +.js.test.run: react.test +clean: .react.clean + +# ==================================================================================== +# Special Targets + +define REACT_HELPTEXT +React Targets: + react.run Run the react application for development. + +endef +export REACT_HELPTEXT + +.PHONY: .react.help +.react.help: + @echo "$$REACT_HELPTEXT" + +.help: .react.help + +endif # __REACT_MAKEFILE__ diff --git a/makelib/utils.mk b/makelib/utils.mk new file mode 100644 index 00000000..1d0149c6 --- /dev/null +++ b/makelib/utils.mk @@ -0,0 +1,84 @@ +# Copyright 2019 Pressinfra SRL. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __UTILS_MAKEFILE__ +__UTILS_MAKEFILE__ := included + +COMMA := , +noop= +SPACE = $(noop) $(noop) + +# define a newline +define \n + + +endef + +lower = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1)))))))))))))))))))))))))) +upper = $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$1)))))))))))))))))))))))))) +list-join = $(subst $(SPACE),$(1),$(strip $(2))) + +# ==================================================================================== +# Tools macros +# +# Theses macros are used to install tools in an idempotent, cache friendly way. + +define tool +$(subst -,_,$(call upper,$(1))) := $$(TOOLS_BIN_DIR)/$(1) + +build.tools: $$(TOOLS_BIN_DIR)/$(1) +$$(TOOLS_BIN_DIR)/$(1): $$(TOOLS_HOST_DIR)/$(1)-v$(2) |$$(TOOLS_BIN_DIR) + @ln -sf $$< $$@ +endef + +# Creates a target for downloading a tool from a given url +# 1 tool, 2 version, 3 download url +define tool.download +$(call tool,$(1),$(2)) + +$$(TOOLS_HOST_DIR)/$(1)-v$(2): |$$(TOOLS_HOST_DIR) + @echo ${TIME} ${BLUE}[TOOL]${CNone} installing $(1) version $(2) from $(3) + @curl -fsSLo $$@ $(3) || $$(FAIL) + @chmod +x $$@ + @$$(OK) installing $(1) version $(2) from $(3) +endef # tool.download + +# Creates a target for downloading and unarchiving a tool from a given url +# 1 tool, 2 version, 3 download url, 4 tool path within archive, 5 tar strip components +define tool.download.tar.gz +$(call tool,$(1),$(2)) + +ifeq ($(4),) +$(1)_TOOL_ARCHIVE_PATH = $(1) +else +$(1)_TOOL_ARCHIVE_PATH = $(4) +endif + + +$$(TOOLS_HOST_DIR)/$(1)-v$(2): |$$(TOOLS_HOST_DIR) + @echo ${TIME} ${BLUE}[TOOL]${CNone} installing $(1) version $(2) from $(3) + @mkdir -p $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL) +ifeq ($(5),) + @curl -fsSL $(3) | tar -xz --strip-components=1 -C $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL) +else + @curl -fsSL $(3) | tar -xz --strip-components=$(5) -C $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) || $$(FAIL) +endif + @mv $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2)/$$($(1)_TOOL_ARCHIVE_PATH) $$@ || $(FAIL) + @chmod +x $$@ + @rm -rf $$(TOOLS_HOST_DIR)/tmp-$(1)-v$(2) + @$$(OK) installing $(1) version $(2) from $(3) +endef # tool.download.tar.gz + + +endif # __UTILS_MAKEFILE__ diff --git a/makelib/wordpress.mk b/makelib/wordpress.mk new file mode 100644 index 00000000..2df20cb3 --- /dev/null +++ b/makelib/wordpress.mk @@ -0,0 +1,91 @@ +# Copyright 2020 The Pressinfra Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +ifndef __WORDPRESS_MAKEFILE__ +__WORDPRESS_MAKEFILE__ := included + +SELF_DIR := $(dir $(lastword $(MAKEFILE_LIST))) +include $(SELF_DIR)/php.mk + +# ==================================================================================== +# Options + +WP_VERSION ?= master + +WP_OUTPUT_DIR := $(OUTPUT_DIR)/wordpress-$(WP_VERSION) + +ifeq ($(WP_VERSION),master) +WP_DOWNLOAD_URL ?= https://github.com/WordPress/wordpress-develop/archive/$(WP_VERSION).tar.gz +else +WP_DOWNLOAD_URL ?= https://wordpress.org/wordpress-$(WP_VERSION).tar.gz +endif +WP_ARCHIVE := $(CACHE_DIR)/wordpress-$(WP_VERSION).tar.gz + + +WP_TESTS_VERSION ?= $(WP_VERSION) +WP_TESTS_DIR ?= $(WORK_DIR)/wordpress-develop-$(WP_VERSION) +WP_TESTS_CONFIG ?= $(abspath $(PHP_ROOT_DIR))/tests/wp-tests-config.php +WP_TESTS_DOWNLOAD_URL ?= https://github.com/WordPress/wordpress-develop/archive/$(WP_VERSION).tar.gz +WP_TESTS_ARCHIVE := $(CACHE_DIR)/wordpress-develop-$(WP_VERSION).tar.gz + +# ===================================================================================== +# WordPress Targets + +$(WP_TESTS_ARCHIVE): + @$(INFO) fetching $(notdir $@) from $(WP_TESTS_DOWNLOAD_URL) + @curl -sLo "$@" "$(WP_TESTS_DOWNLOAD_URL)" || $(FAIL) + @$(OK) fetching $(notdir $@) from $(WP_TESTS_DOWNLOAD_URL) + +$(WP_TESTS_DIR)/src/wp-includes/version.php: $(WP_TESTS_ARCHIVE) + @$(INFO) unpacking $< + @rm -rf $(WP_TESTS_DIR) && mkdir -p $(WP_TESTS_DIR) + @tar -zxf $< -C $(WP_TESTS_DIR) --strip-components 1 + @cp tests/wp-tests-config.php $(WP_TESTS_DIR) + @mkdir -p $(WP_TESTS_DIR)/src/wp-content/uploads + @test -f $@ && touch $@ || $(FAIL) + @$(OK) unpacking $< + +$(WP_TESTS_DIR)/wp-tests-config.php: $(WP_TESTS_CONFIG) $(WP_TESTS_DIR)/src/wp-includes/version.php + @cp $(WP_TESTS_CONFIG) $@ + +# add WP_TESTS_DIR env var for running tests +.do.php.test: PHPUNIT:=WP_TESTS_DIR=$(WP_TESTS_DIR) $(PHPUNIT) + +$(WP_ARCHIVE): + @$(INFO) fetching $(notdir $@) from $(WP_DOWNLOAD_URL) + @curl -sLo "$@" "$(WP_DOWNLOAD_URL)" || $(FAIL) + @$(OK) fetching $(notdir $@) from $(WP_DOWNLOAD_URL) + +$(WP_OUTPUT_DIR)/wp-includes/version.php: $(WP_ARCHIVE) + @$(INFO) unpacking $< + @rm -rf $(WP_OUTPUT_DIR) && mkdir -p $(WP_OUTPUT_DIR) + @tar -zxf $< -C $(WP_OUTPUT_DIR) --strip-components 1 + @test -f $@ && touch $@ || $(FAIL) + @$(OK) unpacking $< + +$(eval $(call common.target,wordpress.build)) +.wordpress.build.init: $(WP_OUTPUT_DIR)/wp-includes/version.php + +# ==================================================================================== +# Common Targets + +.php.test.init: $(WP_TESTS_DIR)/wp-tests-config.php .php.test.init.composer + +.php.test.init.composer: + @# run composer install to fix: Error: The PHPUnit Polyfills library is a requirement + cd $(WP_TESTS_DIR) && composer install + +.build.artifacts: wordpress.build + +endif # __WORDPRESS_MAKEFILE__ From bad84d7a16e94a088ae2847c471cdba41733c9d1 Mon Sep 17 00:00:00 2001 From: amecea Date: Wed, 10 Aug 2022 18:35:53 +0300 Subject: [PATCH 3/5] Update tests config --- .drone.jsonnet | 9 ++---- .drone.yml | 3 +- Makefile | 10 ++----- composer.json | 3 +- composer.lock | 63 ++++++++++++++++++++++++++++++++++++++- tests/wp-tests-config.php | 21 +++++++++++++ 6 files changed, 92 insertions(+), 17 deletions(-) diff --git a/.drone.jsonnet b/.drone.jsonnet index 7b688c3b..1f673b5f 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -1,5 +1,5 @@ -local Pipeline(php_version, wp_version = "latest") = +local Pipeline(php_version, wp_version) = { kind: 'pipeline', name: 'php-' + php_version, @@ -28,16 +28,13 @@ local Pipeline(php_version, wp_version = "latest") = commands: [ // install build deps "make build.tools", - // install wordpress - "make wordpress.build WP_VERSION=%s" % wp_version, ], }, { name: "test", image: "docker.io/presslabs/php-runtime:%s" % php_version, commands: [ - "make test", - //"WP_MULTISITE=1 phpunit", + "make test WP_VERSION=%s" % wp_version, ], }, { @@ -71,6 +68,6 @@ local Pipeline(php_version, wp_version = "latest") = }; [ - Pipeline('8.0'), + Pipeline('8.0', '6.0.1'), //Pipeline('7.4'), ] diff --git a/.drone.yml b/.drone.yml index efd1173c..ad9ee2ad 100644 --- a/.drone.yml +++ b/.drone.yml @@ -21,14 +21,13 @@ steps: tags: true - commands: - make build.tools - - make wordpress.build WP_VERSION=latest environment: WP_CORE_DIR: /workspace/presslabs/toplytics/wordpress WP_TEST_DIR: /workspace/presslabs/toplytics/wordpress-test-lib image: quay.io/presslabs/build:latest name: install deps - commands: - - make test + - make test WP_VERSION=6.0.1 image: docker.io/presslabs/php-runtime:8.0 name: test - commands: diff --git a/Makefile b/Makefile index 63b75480..fa707458 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,10 @@ PROJECT_NAME := toplytics PROJECT_REPO := github.com/presslabs/toplytics +WP_VERSION ?= 6.0.1 + include build/makelib/common.mk include build/makelib/wordpress.mk include build/makelib/php.mk -WP_CLI_VERSION:=2.6.0 -WP_CLI_DOWNLOAD_URL:=https://github.com/wp-cli/wp-cli/releases/download/v$(WP_CLI_VERSION)/wp-cli-$(WP_CLI_VERSION).phar -$(eval $(call tool.download,wp,$(WP_CLI_VERSION),$(WP_CLI_DOWNLOAD_URL))) - -# override php tests because of wordpress.mk -.php.test.init: - @$(INFO) test wordpress pass +.php.test.init: $(WP_TESTS_DIR)/src/wp-includes/version.php $(WP_TESTS_DIR)/includes $(WP_TESTS_DIR)/data diff --git a/composer.json b/composer.json index 374bd487..6e154651 100755 --- a/composer.json +++ b/composer.json @@ -19,7 +19,8 @@ "google/apiclient": "^2.10" }, "require-dev": { - "phpunit/phpunit": "<8" + "phpunit/phpunit": "<8", + "yoast/phpunit-polyfills": "^1.0" }, "scripts": { "pre-autoload-dump": "Google\\Task\\Composer::cleanup" diff --git a/composer.lock b/composer.lock index 72f90b7a..1f7d523f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d378a9a7a6240d9a3bbf32957c601c79", + "content-hash": "a7c435b9fe9d0f451365118047f818bb", "packages": [ { "name": "firebase/php-jwt", @@ -2879,6 +2879,67 @@ "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "yoast/phpunit-polyfills", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", + "reference": "5ea3536428944955f969bc764bbe09738e151ada" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/5ea3536428944955f969bc764bbe09738e151ada", + "reference": "5ea3536428944955f969bc764bbe09738e151ada", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "require-dev": { + "yoast/yoastcs": "^2.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "files": [ + "phpunitpolyfills-autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Team Yoast", + "email": "support@yoast.com", + "homepage": "https://yoast.com" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Yoast/PHPUnit-Polyfills/graphs/contributors" + } + ], + "description": "Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests", + "homepage": "https://github.com/Yoast/PHPUnit-Polyfills", + "keywords": [ + "phpunit", + "polyfill", + "testing" + ], + "support": { + "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", + "source": "https://github.com/Yoast/PHPUnit-Polyfills" + }, + "time": "2021-11-23T01:37:03+00:00" } ], "aliases": [], diff --git a/tests/wp-tests-config.php b/tests/wp-tests-config.php index 969e7247..4efbc00f 100644 --- a/tests/wp-tests-config.php +++ b/tests/wp-tests-config.php @@ -48,3 +48,24 @@ * Authentication Unique Keys and Salts. * * Change these to different unique phrases! + * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service} + */ +define( 'AUTH_KEY', 'put your unique phrase here' ); +define( 'SECURE_AUTH_KEY', 'put your unique phrase here' ); +define( 'LOGGED_IN_KEY', 'put your unique phrase here' ); +define( 'NONCE_KEY', 'put your unique phrase here' ); +define( 'AUTH_SALT', 'put your unique phrase here' ); +define( 'SECURE_AUTH_SALT', 'put your unique phrase here' ); +define( 'LOGGED_IN_SALT', 'put your unique phrase here' ); +define( 'NONCE_SALT', 'put your unique phrase here' ); + +$table_prefix = 'wptests_'; // Only numbers, letters, and underscores please! + +define( 'WP_TESTS_DOMAIN', 'example.org' ); +define( 'WP_TESTS_EMAIL', 'admin@example.org' ); +define( 'WP_TESTS_TITLE', 'Test Blog' ); + +define( 'WP_PHP_BINARY', 'php' ); + +define( 'WPLANG', '' ); + From 7f14fefd5e13b69c138eeb040c411f70ec824395 Mon Sep 17 00:00:00 2001 From: amecea Date: Wed, 10 Aug 2022 18:36:38 +0300 Subject: [PATCH 4/5] Update wordpress.mk to configure for plugin tests --- build/makelib/wordpress.mk | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/build/makelib/wordpress.mk b/build/makelib/wordpress.mk index 2df20cb3..d9e62f3b 100644 --- a/build/makelib/wordpress.mk +++ b/build/makelib/wordpress.mk @@ -59,6 +59,13 @@ $(WP_TESTS_DIR)/src/wp-includes/version.php: $(WP_TESTS_ARCHIVE) $(WP_TESTS_DIR)/wp-tests-config.php: $(WP_TESTS_CONFIG) $(WP_TESTS_DIR)/src/wp-includes/version.php @cp $(WP_TESTS_CONFIG) $@ +$(WP_TESTS_DIR)/includes: $(WP_TESTS_DIR) + @cp -r $(WP_TESTS_DIR)/tests/phpunit/includes $@ + +$(WP_TESTS_DIR)/data: $(WP_TESTS_DIR) + @cp -r $(WP_TESTS_DIR)/tests/phpunit/data $@ + + # add WP_TESTS_DIR env var for running tests .do.php.test: PHPUNIT:=WP_TESTS_DIR=$(WP_TESTS_DIR) $(PHPUNIT) From f1d7dae2344bca8c0b505d076df97641c892ba0d Mon Sep 17 00:00:00 2001 From: amecea Date: Wed, 10 Aug 2022 18:46:13 +0300 Subject: [PATCH 5/5] Fix file permissions and move composer vendor --- .drone.jsonnet | 16 +- .drone.yml | 10 +- Makefile | 2 +- composer.json | 8 +- composer.lock | 931 ++++++++++++++++++++--------- tests/bootstrap.php | 2 +- tests/wp-tests-config.php | 9 +- src/toplytics.php => toplytics.php | 2 +- 8 files changed, 682 insertions(+), 298 deletions(-) rename src/toplytics.php => toplytics.php (98%) diff --git a/.drone.jsonnet b/.drone.jsonnet index 1f673b5f..53c7d85b 100644 --- a/.drone.jsonnet +++ b/.drone.jsonnet @@ -18,21 +18,13 @@ local Pipeline(php_version, wp_version) = tags: true } }, - { - name: "install deps", - image: "quay.io/presslabs/build:latest", - environment: { - WP_CORE_DIR: "/workspace/presslabs/toplytics/wordpress", - WP_TEST_DIR: "/workspace/presslabs/toplytics/wordpress-test-lib", - }, - commands: [ - // install build deps - "make build.tools", - ], - }, { name: "test", image: "docker.io/presslabs/php-runtime:%s" % php_version, + user: "root", + environment: { + WORDPRESS_TEST_DB_HOST: "database" + }, commands: [ "make test WP_VERSION=%s" % wp_version, ], diff --git a/.drone.yml b/.drone.yml index ad9ee2ad..2f969897 100644 --- a/.drone.yml +++ b/.drone.yml @@ -19,17 +19,13 @@ steps: settings: depth: 0 tags: true -- commands: - - make build.tools - environment: - WP_CORE_DIR: /workspace/presslabs/toplytics/wordpress - WP_TEST_DIR: /workspace/presslabs/toplytics/wordpress-test-lib - image: quay.io/presslabs/build:latest - name: install deps - commands: - make test WP_VERSION=6.0.1 + environment: + WORDPRESS_TEST_DB_HOST: database image: docker.io/presslabs/php-runtime:8.0 name: test + user: root - commands: - /usr/local/bin/setup-credentials-helper.sh group: publish diff --git a/Makefile b/Makefile index fa707458..ba3871fd 100644 --- a/Makefile +++ b/Makefile @@ -7,4 +7,4 @@ include build/makelib/common.mk include build/makelib/wordpress.mk include build/makelib/php.mk -.php.test.init: $(WP_TESTS_DIR)/src/wp-includes/version.php $(WP_TESTS_DIR)/includes $(WP_TESTS_DIR)/data +.php.test.init: $(WP_TESTS_DIR)/wp-tests-config.php $(WP_TESTS_DIR)/includes $(WP_TESTS_DIR)/data diff --git a/composer.json b/composer.json index 6e154651..f75bf6b6 100755 --- a/composer.json +++ b/composer.json @@ -15,11 +15,11 @@ } ], "require": { - "php": "~7.0", - "google/apiclient": "^2.10" + "php": ">=7.4 <8.2", + "google/apiclient": "^2.12" }, "require-dev": { - "phpunit/phpunit": "<8", + "phpunit/phpunit": "<10", "yoast/phpunit-polyfills": "^1.0" }, "scripts": { @@ -31,7 +31,7 @@ ] }, "autoload": { - "psr-4": {"Toplytics\\": "components"} + "psr-4": {"Toplytics\\": "src/components"} }, "minimum-stability": "dev", "prefer-stable": true diff --git a/composer.lock b/composer.lock index 1f7d523f..730fea26 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a7c435b9fe9d0f451365118047f818bb", + "content-hash": "ca5766db17fe777b97d0088ad90896ca", "packages": [ { "name": "firebase/php-jwt", @@ -565,27 +565,27 @@ }, { "name": "monolog/monolog", - "version": "2.8.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50" + "reference": "305444bc6fb6c89e490f4b34fa6e979584d7fa81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/720488632c590286b88b80e62aa3d3d551ad4a50", - "reference": "720488632c590286b88b80e62aa3d3d551ad4a50", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/305444bc6fb6c89e490f4b34fa6e979584d7fa81", + "reference": "305444bc6fb6c89e490f4b34fa6e979584d7fa81", "shasum": "" }, "require": { - "php": ">=7.2", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" }, "provide": { - "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + "psr/log-implementation": "3.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "aws/aws-sdk-php": "^3.0", "doctrine/couchdb": "~1.0@dev", "elasticsearch/elasticsearch": "^7 || ^8", "ext-json": "*", @@ -594,13 +594,12 @@ "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", - "predis/predis": "^1.1 || ^2.0", - "rollbar/rollbar": "^1.3 || ^2 || ^3", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^9.5.16", + "predis/predis": "^1.1", "ruflin/elastica": "^7", - "swiftmailer/swiftmailer": "^5.3|^6.0", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -623,7 +622,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.x-dev" + "dev-main": "3.x-dev" } }, "autoload": { @@ -651,7 +650,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.8.0" + "source": "https://github.com/Seldaek/monolog/tree/3.2.0" }, "funding": [ { @@ -663,7 +662,7 @@ "type": "tidelift" } ], - "time": "2022-07-24T11:55:47+00:00" + "time": "2022-07-24T12:00:55+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -893,20 +892,20 @@ }, { "name": "psr/cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", - "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { @@ -926,7 +925,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for caching libraries", @@ -936,9 +935,9 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/master" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2016-08-06T20:24:11+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { "name": "psr/http-client", @@ -1102,30 +1101,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1146,9 +1145,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { "name": "ralouphie/getallheaders", @@ -1196,25 +1195,25 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.2", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", + "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.1-dev" }, "thanks": { "name": "symfony/contracts", @@ -1243,7 +1242,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1" }, "funding": [ { @@ -1259,7 +1258,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-02-25T11:15:52+00:00" } ], "packages-dev": [ @@ -1392,30 +1391,87 @@ ], "time": "2022-03-03T13:19:32+00:00" }, + { + "name": "nikic/php-parser", + "version": "v4.14.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + }, + "time": "2022-05-31T20:59:12+00:00" + }, { "name": "phar-io/manifest", - "version": "1.0.3", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", - "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", - "phar-io/version": "^2.0", - "php": "^5.6 || ^7.0" + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1447,26 +1503,26 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" + "source": "https://github.com/phar-io/manifest/tree/2.0.3" }, - "time": "2018-07-08T19:23:20+00:00" + "time": "2021-07-20T11:28:43+00:00" }, { "name": "phar-io/version", - "version": "2.0.1", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", - "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -1498,9 +1554,9 @@ "description": "Library for handling version information and constraints", "support": { "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/master" + "source": "https://github.com/phar-io/version/tree/3.2.1" }, - "time": "2018-07-08T19:19:57+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -1731,40 +1787,44 @@ }, { "name": "phpunit/php-code-coverage", - "version": "6.1.4", + "version": "9.2.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" + "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", - "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "php": "^7.1", - "phpunit/php-file-iterator": "^2.0", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1 || ^4.0", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" + "nikic/php-parser": "^4.13.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-xdebug": "^2.6.0" + "ext-pcov": "*", + "ext-xdebug": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.1-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -1792,34 +1852,40 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/master" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" }, - "time": "2018-10-31T16:06:48+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-03-07T09:28:20+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -1846,7 +1912,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -1854,26 +1920,38 @@ "type": "github" } ], - "time": "2021-12-02T12:42:26+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1890,41 +1968,47 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "template" + "process" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "phpunit/php-timer", - "version": "2.1.3", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1943,14 +2027,14 @@ "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "timer" + "template" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, "funding": [ { @@ -1958,33 +2042,32 @@ "type": "github" } ], - "time": "2020-11-30T08:20:02+00:00" + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "3.1.3", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "9c1da83261628cb24b6a6df371b6e312b3954768" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768", - "reference": "9c1da83261628cb24b6a6df371b6e312b3954768", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1999,17 +2082,18 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "tokenizer" + "timer" ], "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3" + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { @@ -2017,58 +2101,58 @@ "type": "github" } ], - "abandoned": true, - "time": "2021-07-26T12:15:06+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", - "version": "7.5.20", + "version": "9.5.21", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9467db479d1b0487c99733bb1e7944d32deded2c" + "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c", - "reference": "9467db479d1b0487c99733bb1e7944d32deded2c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1", + "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.1", + "doctrine/instantiator": "^1.3.1", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "^1.7", - "phar-io/manifest": "^1.0.2", - "phar-io/version": "^2.0", - "php": "^7.1", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^6.0.7", - "phpunit/php-file-iterator": "^2.0.1", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1", - "sebastian/comparator": "^3.0", - "sebastian/diff": "^3.0", - "sebastian/environment": "^4.0", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0", - "sebastian/version": "^2.0.1" - }, - "conflict": { - "phpunit/phpunit-mock-objects": "*" + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.0", + "sebastian/version": "^3.0.2" }, "require-dev": { - "ext-pdo": "*" + "phpspec/prophecy-phpunit": "^2.0.1" }, "suggest": { "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0" + "ext-xdebug": "*" }, "bin": [ "phpunit" @@ -2076,10 +2160,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.5-dev" + "dev-master": "9.5-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -2104,34 +2191,156 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/7.5.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-06-19T12:14:25+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] }, - "time": "2020-01-08T08:45:45+00:00" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2153,7 +2362,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { @@ -2161,34 +2370,34 @@ "type": "github" } ], - "time": "2020-11-30T08:15:22+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.3", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", "shasum": "" }, "require": { - "php": ">=7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2227,7 +2436,64 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:49:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" }, "funding": [ { @@ -2235,33 +2501,33 @@ "type": "github" } ], - "time": "2020-11-30T08:04:30+00:00" + "time": "2020-10-26T15:52:27+00:00" }, { "name": "sebastian/diff", - "version": "3.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2293,7 +2559,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" }, "funding": [ { @@ -2301,27 +2567,27 @@ "type": "github" } ], - "time": "2020-11-30T07:59:04+00:00" + "time": "2020-10-26T13:10:38+00:00" }, { "name": "sebastian/environment", - "version": "4.2.4", + "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" @@ -2329,7 +2595,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -2356,7 +2622,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" }, "funding": [ { @@ -2364,34 +2630,34 @@ "type": "github" } ], - "time": "2020-11-30T07:53:42+00:00" + "time": "2022-04-03T09:37:03+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.4", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2426,14 +2692,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" }, "funding": [ { @@ -2441,27 +2707,30 @@ "type": "github" } ], - "time": "2021-11-11T13:51:24+00:00" + "time": "2021-11-11T14:18:36+00:00" }, { "name": "sebastian/global-state", - "version": "2.0.0", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "ext-dom": "*", + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" @@ -2469,7 +2738,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2494,36 +2763,99 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" }, - "time": "2017-04-27T15:39:26+00:00" + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.4", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2545,7 +2877,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { @@ -2553,32 +2885,32 @@ "type": "github" } ], - "time": "2020-11-30T07:40:27+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.2", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2600,7 +2932,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { @@ -2608,32 +2940,32 @@ "type": "github" } ], - "time": "2020-11-30T07:37:18+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.1", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2663,7 +2995,7 @@ "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" }, "funding": [ { @@ -2671,29 +3003,32 @@ "type": "github" } ], - "time": "2020-11-30T07:34:24+00:00" + "time": "2020-10-26T13:17:30+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2715,7 +3050,63 @@ "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" }, "funding": [ { @@ -2723,29 +3114,29 @@ "type": "github" } ], - "time": "2020-11-30T07:30:19+00:00" + "time": "2022-03-15T09:54:48+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2768,9 +3159,15 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, - "time": "2016-10-03T07:35:21+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { "name": "theseer/tokenizer", @@ -2948,7 +3345,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "~7.0" + "php": ">=7.4 <8.2" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/tests/bootstrap.php b/tests/bootstrap.php index f6e0e1dc..ddce2c58 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -29,7 +29,7 @@ * Manually load the plugin being tested. */ function _manually_load_plugin() { - require dirname( dirname( __FILE__ ) ) . '/testtest.php'; + require dirname( dirname( __FILE__ ) ) . '/toplytics.php'; } tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' ); diff --git a/tests/wp-tests-config.php b/tests/wp-tests-config.php index 4efbc00f..a7c0404e 100644 --- a/tests/wp-tests-config.php +++ b/tests/wp-tests-config.php @@ -37,13 +37,12 @@ * DO NOT use a production database or one that is shared with something else. */ -define( 'DB_NAME', 'wordpress_test' ); -define( 'DB_USER', 'wordpress' ); -define( 'DB_PASSWORD', 'wordpress' ); -define( 'DB_HOST', 'localhost' ); +define( 'DB_HOST', getenv('WORDPRESS_TEST_DB_HOST', true) ?: '127.0.0.1' ); +define( 'DB_NAME', getenv('WORDPRESS_TEST_DB_NAME', true) ?: 'wordpress_test' ); +define( 'DB_USER', getenv('WORDPRESS_TEST_DB_USER', true) ?: 'wordpress' ); +define( 'DB_PASSWORD', getenv('WORDPRESS_TEST_DB_PASSWORD') ?: 'wordpress' ); define( 'DB_CHARSET', 'utf8' ); define( 'DB_COLLATE', '' ); - /**#@+ * Authentication Unique Keys and Salts. * diff --git a/src/toplytics.php b/toplytics.php similarity index 98% rename from src/toplytics.php rename to toplytics.php index af974c46..25f8b2dd 100755 --- a/src/toplytics.php +++ b/toplytics.php @@ -115,4 +115,4 @@ function toplytics_ready() * * @since 3.0.0 */ -require_once plugin_dir_path(__FILE__) . 'backward-compatibility.php'; +require_once plugin_dir_path(__FILE__) . 'src/backward-compatibility.php';