diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..76e11428 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: + - + package-ecosystem: composer + directory: "/" + schedule: + interval: weekly + versioning-strategy: auto + groups: + dev-dependencies: + dependency-type: "development" diff --git a/.github/workflows/auto-regenerate.yml b/.github/workflows/auto-regenerate.yml index c4d4f8c0..a1d36540 100644 --- a/.github/workflows/auto-regenerate.yml +++ b/.github/workflows/auto-regenerate.yml @@ -12,22 +12,22 @@ jobs: runs-on: "ubuntu-latest" steps: - name: "Checkout" - uses: "actions/checkout@v2" + uses: "actions/checkout@v4" - name: "Install PHP with extensions" uses: "shivammathur/setup-php@v2" with: coverage: "pcov" - php-version: "8.0" + php-version: "8.3" - name: "Check out salathe/phpdoc-base" - uses: "actions/checkout@v2" + uses: "actions/checkout@v4" with: path: "generator/doc/doc-en/doc-base" repository: "salathe/phpdoc-base" - name: "Check out php/doc-en" - uses: "actions/checkout@v2" + uses: "actions/checkout@v4" with: path: "generator/doc/doc-en/en" repository: "php/doc-en" @@ -63,7 +63,7 @@ jobs: - name: "Create a pr if the files are different" if: ${{ failure() }} - uses: peter-evans/create-pull-request@v3 + uses: peter-evans/create-pull-request@v6 with: commit-message: "Automatically regenerate the files" branch: create-pull-request/regenerate-files diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 7c074738..4fceb7f0 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -16,14 +16,15 @@ jobs: strategy: matrix: php-version: - - "8.0" + - "8.2" + - "8.3" dependencies: - "highest" steps: - name: "Checkout" - uses: "actions/checkout@v2" + uses: "actions/checkout@v4" - name: "Install PHP with extensions" uses: "shivammathur/setup-php@v2" @@ -33,31 +34,32 @@ jobs: - name: "Get current date for the daily cache" id: 'date' - run: echo "::set-output name=date::$(date +'%Y-%m-%d')" + run: | + echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT - name: "Cache the php documentation" id: cache-php-doc - uses: "actions/cache@v1" + uses: "actions/cache@v4" with: path: "generator/doc/doc-en" key: php-doc-${{ steps.date.outputs.date }} - name: "Check out salathe/phpdoc-base" - uses: "actions/checkout@v2" + uses: "actions/checkout@v4" if: steps.cache-php-doc.outputs.cache-hit != 'true' with: path: "generator/doc/doc-en/doc-base" repository: "salathe/phpdoc-base" - name: "Check out php/doc-en" - uses: "actions/checkout@v2" + uses: "actions/checkout@v4" if: steps.cache-php-doc.outputs.cache-hit != 'true' with: path: "generator/doc/doc-en/en" repository: "php/doc-en" - name: "Cache dependencies installed with composer" - uses: "actions/cache@v1" + uses: "actions/cache@v4" with: path: "~/.composer/cache" key: "php-${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.lock') }}" @@ -85,6 +87,10 @@ jobs: run: "composer phpstan" working-directory: "generator" + - name: "Run static code analysis with rector/rector in generator/ directory" + run: "composer rector --dry-run" + working-directory: "generator" + - name: "Dump autoloader with composer in root directory" run: "composer dump-autoload" @@ -114,11 +120,12 @@ jobs: fi - name: "Archive code coverage results" - uses: "actions/upload-artifact@v1" + uses: "actions/upload-artifact@v3" with: name: "build" path: "generator/build" - - uses: codecov/codecov-action@v1 # upload the coverage to codecov + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v4.0.1 with: - fail_ci_if_error: true # optional (default = false) + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/rector-continuous-integration.yml b/.github/workflows/rector-continuous-integration.yml index 10f5eb98..0e747aa4 100644 --- a/.github/workflows/rector-continuous-integration.yml +++ b/.github/workflows/rector-continuous-integration.yml @@ -16,14 +16,15 @@ jobs: strategy: matrix: php-version: - - "8.0" + - "8.2" + - "8.3" dependencies: - "highest" steps: - name: "Checkout" - uses: "actions/checkout@v2" + uses: "actions/checkout@v4" - name: "Install PHP with extensions" uses: "shivammathur/setup-php@v2" diff --git a/.gitignore b/.gitignore index 4a7f4685..0598dde9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,7 @@ /generator/doc/entities/generated.ent /composer.lock vendor/ +/generator/composer.lock /generator/tests/rector/composer.lock +/generator/.phpunit.cache/ .phpunit.result.cache diff --git a/composer.json b/composer.json index e85a6593..4983bfaa 100644 --- a/composer.json +++ b/composer.json @@ -24,7 +24,6 @@ "deprecated/mysqli.php", "generated/apache.php", "generated/apcu.php", - "generated/array.php", "generated/bzip2.php", "generated/calendar.php", "generated/classobj.php", @@ -43,7 +42,6 @@ "generated/ftp.php", "generated/funchand.php", "generated/gettext.php", - "generated/gmp.php", "generated/gnupg.php", "generated/hash.php", "generated/ibase.php", @@ -73,6 +71,7 @@ "generated/ps.php", "generated/pspell.php", "generated/readline.php", + "generated/rnp.php", "generated/rpminfo.php", "generated/rrd.php", "generated/sem.php", @@ -102,16 +101,17 @@ ] }, "require": { - "php": "^8.0" + "php": ">= 8.2", + "ext-intl": "*" }, "require-dev": { - "phpstan/phpstan": "^1.5", + "phpstan/phpstan": "^1", "thecodingmachine/phpstan-strict-rules": "^1.0", - "squizlabs/php_codesniffer": "^3.2", - "phpunit/phpunit": "^9.5" + "squizlabs/php_codesniffer": "^3", + "phpunit/phpunit": "^10.0 || ^11.0" }, "scripts": { - "phpstan": "phpstan analyse lib -c phpstan.neon --level=max --no-progress -vvv", + "phpstan": "phpstan analyse", "cs-fix": "phpcbf", "cs-check": "phpcs" }, diff --git a/generated/Exceptions/ApacheException.php b/generated/Exceptions/ApacheException.php index ab2149df..fd1c5819 100644 --- a/generated/Exceptions/ApacheException.php +++ b/generated/Exceptions/ApacheException.php @@ -1,4 +1,5 @@ * * - * So, $out[0] contains array of strings that matched full pattern, - * and $out[1] contains array of strings enclosed by tags. + * So, $out[0] contains an array of strings that matched the full pattern, + * and $out[1] contains an array of strings enclosed by tags. * * * @@ -209,15 +209,15 @@ function preg_grep(string $pattern, array $array, int $flags = 0): array * ]]> * * - * So, $out[0] contains array of strings that matched full pattern, - * and $out[1] contains array of strings enclosed by tags. + * So, $out[0] contains an array of strings that matched the full pattern, + * and $out[1] contains an array of strings enclosed by tags. * * * * The above example will output: * - * So, $out[0] contains array of strings that matched full pattern, - * and $out[1] contains array of strings enclosed by tags. + * So, $out[0] contains an array of strings that matched the full pattern, + * and $out[1] contains an array of strings enclosed by tags. * * If the pattern contains named subpatterns, $matches * additionally contains entries for keys with the subpattern name. @@ -339,15 +339,15 @@ function preg_grep(string $pattern, array $array, int $flags = 0): array * ]]> * * - * So, $out[0] contains array of strings that matched full pattern, - * and $out[1] contains array of strings enclosed by tags. + * So, $out[0] contains an array of strings that matched the full pattern, + * and $out[1] contains an array of strings enclosed by tags. * * * * The above example will output: * - * So, $out[0] contains array of strings that matched full pattern, - * and $out[1] contains array of strings enclosed by tags. + * So, $out[0] contains an array of strings that matched the full pattern, + * and $out[1] contains an array of strings enclosed by tags. * * If the pattern contains named subpatterns, $matches * additionally contains entries for keys with the subpattern name. diff --git a/generated/pgsql.php b/generated/pgsql.php index 9968a5ae..70693ca6 100644 --- a/generated/pgsql.php +++ b/generated/pgsql.php @@ -935,13 +935,14 @@ function pg_ping($connection = null): void * create an unnamed statement, in which case any pre-existing unnamed * statement is automatically replaced; otherwise it is an error if the * statement name is already defined in the current session. If any parameters - * are used, they are referred to in the query as $1, $2, etc. + * are used, they are referred to in the query as $1, + * $2, etc. * * Prepared statements for use with pg_prepare can also be created by - * executing SQL PREPARE statements. (But pg_prepare is more flexible since it - * does not require parameter types to be pre-specified.) Also, although there - * is no PHP function for deleting a prepared statement, the SQL DEALLOCATE - * statement can be used for that purpose. + * executing SQL PREPARE statements. (But pg_prepare is + * more flexible since it does not require parameter types to be pre-specified.) Also, + * although there is no PHP function for deleting a prepared statement, the + * SQL DEALLOCATE statement can be used for that purpose. * * @param resource $connection An PgSql\Connection instance. * When connection is unspecified, the default connection is used. @@ -951,8 +952,8 @@ function pg_ping($connection = null): void * @param string $stmtname The name to give the prepared statement. Must be unique per-connection. If * "" is specified, then an unnamed statement is created, overwriting any * previously defined unnamed statement. - * @param string $query The parameterized SQL statement. Must contain only a single statement. - * (multiple statements separated by semi-colons are not allowed.) If any parameters + * @param string $query The parameterized SQL statement. Must contain only a single statement + * (multiple statements separated by semi-colons are not allowed). If any parameters * are used, they are referred to as $1, $2, etc. * @return resource An PgSql\Result instance on success. * @throws PgsqlException @@ -1211,10 +1212,16 @@ function pg_result_seek($result, int $row): void * array containing all records and fields that match the condition * specified by conditions. * - * If flags is specified, + * If flags is set, * pg_convert is applied to * conditions with the specified flags. * + * If mode is set, + * the return value will be in the form of an array + * with PGSQL_NUM, an associative array + * with PGSQL_ASSOC (default) or both + * with PGSQL_BOTH. + * * By default pg_select passes raw values. Values * must be escaped or PGSQL_DML_ESCAPE option must be * specified. PGSQL_DML_ESCAPE quotes and escapes @@ -1235,9 +1242,15 @@ function pg_result_seek($result, int $row): void * PGSQL_DML_EXEC, * PGSQL_DML_ASYNC or * PGSQL_DML_STRING combined. If PGSQL_DML_STRING is part of the - * flags then query string is returned. When PGSQL_DML_NO_CONV + * flags then the query string is returned. When PGSQL_DML_NO_CONV * or PGSQL_DML_ESCAPE is set, it does not call pg_convert internally. - * @param int $mode + * @param int $mode Any number of PGSQL_ASSOC, + * PGSQL_NUM or + * PGSQL_BOTH + * If PGSQL_ASSOC is set the return value will be an associative array, + * with PGSQL_NUM the return value will be an array, and + * with PGSQL_BOTH the return value will be both an associative and + * numerically indexed array. * @return mixed Returns string if PGSQL_DML_STRING is passed * via flags, otherwise it returns an array on success. * @throws PgsqlException @@ -1295,13 +1308,18 @@ function pg_socket($connection) * The default connection is the last connection made by pg_connect * or pg_pconnect. * As of PHP 8.1.0, using the default connection is deprecated. + * @param int $trace_mode An optional trace mode with the following constants + * PGSQL_TRACE_SUPPRESS_TIMESTAMPS and + * PGSQL_TRACE_REGRESS_MODE * @throws PgsqlException * */ -function pg_trace(string $filename, string $mode = "w", $connection = null): void +function pg_trace(string $filename, string $mode = "w", $connection = null, int $trace_mode = 0): void { error_clear_last(); - if ($connection !== null) { + if ($trace_mode !== 0) { + $safeResult = \pg_trace($filename, $mode, $connection, $trace_mode); + } elseif ($connection !== null) { $safeResult = \pg_trace($filename, $mode, $connection); } else { $safeResult = \pg_trace($filename, $mode); diff --git a/generated/posix.php b/generated/posix.php index ea50d848..f4522629 100644 --- a/generated/posix.php +++ b/generated/posix.php @@ -30,11 +30,37 @@ function posix_access(string $filename, int $flags = 0): void } +/** + * posix_eaccess checks the effective user's permission of a file + * + * @param string $filename The name of a file to be tested. + * @param int $flags A mask consisting of one or more of POSIX_F_OK, + * POSIX_R_OK, POSIX_W_OK and + * POSIX_X_OK. + * + * POSIX_R_OK, POSIX_W_OK and + * POSIX_X_OK request checking whether the file + * exists and has read, write and execute permissions, respectively. + * POSIX_F_OK just requests checking for the + * existence of the file. + * @throws PosixException + * + */ +function posix_eaccess(string $filename, int $flags = 0): void +{ + error_clear_last(); + $safeResult = \posix_eaccess($filename, $flags); + if ($safeResult === false) { + throw PosixException::createFromPhpError(); + } +} + + /** * Gets information about a group provided its id. * * @param int $group_id The group id. - * @return array The array elements returned are: + * @return array{name: string, passwd: string, gid: int, members: array} The array elements returned are: * * The group information array * @@ -98,7 +124,7 @@ function posix_getgrgid(int $group_id): array * Gets information about a group provided its name. * * @param string $name The name of the group - * @return array Returns an array on success. + * @return array{name: string, passwd: string, gid: int, members: array} Returns an array on success. * The array elements returned are: * * The group information array @@ -200,7 +226,7 @@ function posix_getlogin(): string * referenced by the given user ID. * * @param int $user_id The user identifier. - * @return array Returns an associative array with the following elements: + * @return array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string} Returns an associative array with the following elements: * * The user information array * @@ -298,6 +324,8 @@ function posix_getpwuid(int $user_id): array * An unprivileged process may only set its soft limit to a value * from 0 to the hard limit, and irreversibly lower its hard limit. * + * @param $resource If NULL all resource limits will be fetched. + * Otherwise, the only limits of the resource type provided will be returned. * @return array Returns an associative array of elements for each * limit that is defined. Each limit has a soft and a hard limit. * @@ -386,10 +414,14 @@ function posix_getpwuid(int $user_id): array * @throws PosixException * */ -function posix_getrlimit(): array +function posix_getrlimit($resource = null): array { error_clear_last(); - $safeResult = \posix_getrlimit(); + if ($resource !== null) { + $safeResult = \posix_getrlimit($resource); + } else { + $safeResult = \posix_getrlimit(); + } if ($safeResult === false) { throw PosixException::createFromPhpError(); } diff --git a/generated/pspell.php b/generated/pspell.php index 7ef3d259..24864bdc 100644 --- a/generated/pspell.php +++ b/generated/pspell.php @@ -57,50 +57,6 @@ function pspell_clear_session(int $dictionary): void } -/** - * Create a config used to open a dictionary. - * - * pspell_config_create has a very similar syntax to - * pspell_new. In fact, using - * pspell_config_create immediately followed by - * pspell_new_config will produce the exact same result. - * However, after creating a new config, you can also use - * pspell_config_* functions before calling - * pspell_new_config to take advantage of some - * advanced functionality. - * - * For more information and examples, check out inline manual pspell - * website:http://aspell.net/. - * - * @param string $language The language parameter is the language code which consists of the - * two letter ISO 639 language code and an optional two letter ISO - * 3166 country code after a dash or underscore. - * @param string $spelling The spelling parameter is the requested spelling for languages - * with more than one spelling such as English. Known values are - * 'american', 'british', and 'canadian'. - * @param string $jargon The jargon parameter contains extra information to distinguish - * two different words lists that have the same language and - * spelling parameters. - * @param string $encoding The encoding parameter is the encoding that words are expected to - * be in. Valid values are 'utf-8', 'iso8859-*', 'koi8-r', - * 'viscii', 'cp1252', 'machine unsigned 16', 'machine unsigned - * 32'. This parameter is largely untested, so be careful when - * using. - * @return int Returns an PSpell\Config instance on success. - * @throws PspellException - * - */ -function pspell_config_create(string $language, string $spelling = "", string $jargon = "", string $encoding = ""): int -{ - error_clear_last(); - $safeResult = \pspell_config_create($language, $spelling, $jargon, $encoding); - if ($safeResult === false) { - throw PspellException::createFromPhpError(); - } - return $safeResult; -} - - /** * This function is * currently not documented; only its argument list is available. diff --git a/generated/rnp.php b/generated/rnp.php new file mode 100644 index 00000000..b6d34c3c --- /dev/null +++ b/generated/rnp.php @@ -0,0 +1,609 @@ + - * ]]> - * - * See section 4.7 of the XML 1.0 - * spec for the definition of notation declarations. - * - * @param resource $parser A reference to the XML parser to set up notation declaration handler function. - * @param callable $handler handler is a string containing the name of a - * function that must exist when xml_parse is called - * for parser. - * - * The function named by handler must accept - * five parameters: - * - * handler - * XMLParserparser - * stringnotation_name - * stringbase - * stringsystem_id - * stringpublic_id - * - * - * - * - * parser - * - * - * - * The first parameter, parser, is a - * reference to the XML parser calling the handler. - * - * - * - * - * notation_name - * - * - * This is the notation's name, as per - * the notation format described above. - * - * - * - * - * - * base - * - * - * - * This is the base for resolving the system identifier - * (system_id) of the notation declaration. - * Currently this parameter will always be set to an empty string. - * - * - * - * - * system_id - * - * - * System identifier of the external notation declaration. - * - * - * - * - * - * public_id - * - * - * - * Public identifier of the external notation declaration. - * - * - * - * - * - * If a handler function is set to an empty string, or FALSE, the handler - * in question is disabled. - * @throws XmlException - * - */ -function xml_set_notation_decl_handler($parser, callable $handler): void -{ - error_clear_last(); - $safeResult = \xml_set_notation_decl_handler($parser, $handler); - if ($safeResult === false) { - throw XmlException::createFromPhpError(); - } -} - - -/** - * This function allows to use parser inside - * object. All callback functions could be set with - * xml_set_element_handler etc and assumed to be - * methods of object. - * - * @param resource $parser A reference to the XML parser to use inside the object. - * @param object $object The object where to use the XML parser. - * @throws XmlException - * - */ -function xml_set_object($parser, object $object): void -{ - error_clear_last(); - $safeResult = \xml_set_object($parser, $object); - if ($safeResult === false) { - throw XmlException::createFromPhpError(); - } -} - - -/** - * Sets the processing instruction (PI) handler function for the XML parser - * parser. - * - * A processing instruction has the following format: - * - * <?target - * data?> - * - * - * You can put PHP code into such a tag, but be aware of one limitation: in - * an XML PI, the PI end tag (?>) can not be quoted, - * so this character sequence should not appear in the PHP code you embed - * with PIs in XML documents.If it does, the rest of the PHP code, as well - * as the "real" PI end tag, will be treated as character data. - * - * @param resource $parser A reference to the XML parser to set up processing instruction (PI) handler function. - * @param callable $handler handler is a string containing the name of a - * function that must exist when xml_parse is called - * for parser. - * - * The function named by handler must accept - * three parameters: - * - * handler - * XMLParserparser - * stringtarget - * stringdata - * - * - * - * parser - * - * - * The first parameter, parser, is a - * reference to the XML parser calling the handler. - * - * - * - * - * target - * - * - * The second parameter, target, contains the PI - * target. - * - * - * - * - * data - * - * - * The third parameter, data, contains the PI - * data. - * - * - * - * - * - * If a handler function is set to an empty string, or FALSE, the handler - * in question is disabled. - * @throws XmlException - * - */ -function xml_set_processing_instruction_handler($parser, callable $handler): void -{ - error_clear_last(); - $safeResult = \xml_set_processing_instruction_handler($parser, $handler); - if ($safeResult === false) { - throw XmlException::createFromPhpError(); - } -} - - -/** - * Set a handler to be called when a namespace is declared. Namespace - * declarations occur inside start tags. But the namespace declaration start - * handler is called before the start tag handler for each namespace declared - * in that start tag. - * - * @param resource $parser A reference to the XML parser. - * @param callable $handler handler is a string containing the name of a - * function that must exist when xml_parse is called - * for parser. - * - * The function named by handler must accept - * three parameters, and should return an integer value. If the - * value returned from the handler is FALSE (which it will be if no - * value is returned), the XML parser will stop parsing and - * xml_get_error_code will return - * XML_ERROR_EXTERNAL_ENTITY_HANDLING. - * - * handler - * XMLParserparser - * stringprefix - * stringuri - * - * - * - * parser - * - * - * The first parameter, parser, is a - * reference to the XML parser calling the handler. - * - * - * - * - * prefix - * - * - * The prefix is a string used to reference the namespace within an XML object. - * - * - * - * - * uri - * - * - * Uniform Resource Identifier (URI) of namespace. - * - * - * - * - * - * If a handler function is set to an empty string, or FALSE, the handler - * in question is disabled. - * @throws XmlException - * - */ -function xml_set_start_namespace_decl_handler($parser, callable $handler): void -{ - error_clear_last(); - $safeResult = \xml_set_start_namespace_decl_handler($parser, $handler); - if ($safeResult === false) { - throw XmlException::createFromPhpError(); - } -} - - -/** - * Sets the unparsed entity declaration handler function for the XML parser - * parser. - * - * The handler will be called if the XML parser - * encounters an external entity declaration with an NDATA declaration, like - * the following: - * - * name {publicId | systemId} - * NDATA notationName - * ]]> - * - * - * See section 4.2.2 of - * the XML 1.0 spec for the definition of notation declared - * external entities. - * - * @param resource $parser A reference to the XML parser to set up unparsed entity declaration handler function. - * @param callable $handler handler is a string containing the name of a - * function that must exist when xml_parse is called - * for parser. - * - * The function named by handler must accept six - * parameters: - * - * handler - * XMLParserparser - * stringentity_name - * stringbase - * stringsystem_id - * stringpublic_id - * stringnotation_name - * - * - * - * parser - * - * - * The first parameter, parser, is a - * reference to the XML parser calling the - * handler. - * - * - * - * - * entity_name - * - * - * The name of the entity that is about to be defined. - * - * - * - * - * base - * - * - * This is the base for resolving the system identifier - * (systemId) of the external entity.Currently - * this parameter will always be set to an empty string. - * - * - * - * - * system_id - * - * - * System identifier for the external entity. - * - * - * - * - * public_id - * - * - * Public identifier for the external entity. - * - * + * Whether to skip values consisting of whitespace characters. * * - * notation_name * + * XML_OPTION_TARGET_ENCODING + * string * - * Name of the notation of this entity (see - * xml_set_notation_decl_handler). + * Sets which target encoding to + * use in this XML parser.By default, it is set to the same as the + * source encoding used by xml_parser_create. + * Supported target encodings are ISO-8859-1, + * US-ASCII and UTF-8. * * * * * - * If a handler function is set to an empty string, or FALSE, the handler - * in question is disabled. + * @param mixed $value The option's new value. * @throws XmlException * */ -function xml_set_unparsed_entity_decl_handler($parser, callable $handler): void +function xml_parser_set_option($parser, int $option, $value): void { error_clear_last(); - $safeResult = \xml_set_unparsed_entity_decl_handler($parser, $handler); + $safeResult = \xml_parser_set_option($parser, $option, $value); if ($safeResult === false) { throw XmlException::createFromPhpError(); } diff --git a/generated/yaml.php b/generated/yaml.php index ba518e9e..dfc1cbc9 100644 --- a/generated/yaml.php +++ b/generated/yaml.php @@ -16,7 +16,7 @@ * tag => callable mappings. See * parse callbacks for more * details. - * @return mixed Returns the value encoded in input in appropriate + * @return mixed Returns the value encoded in filename in appropriate * PHP type. If pos is -1 an * array will be returned with one entry for each document found * in the stream. @@ -52,8 +52,8 @@ function yaml_parse_file(string $filename, int $pos = 0, ?int &$ndocs = null, ar * number of documents found in stream. * @param array $callbacks Content handlers for YAML nodes. Associative array of YAML * tag => callable mappings. See - * parse callbacks for more - * @return mixed Returns the value encoded in input in appropriate + * parse callbacks for more details. + * @return mixed Returns the value encoded in url in appropriate * PHP type. If pos is * -1 an array will be returned with one entry * for each document found in the stream. diff --git a/generated/zlib.php b/generated/zlib.php index daa555ab..b83a29d0 100644 --- a/generated/zlib.php +++ b/generated/zlib.php @@ -403,28 +403,6 @@ function gzopen(string $filename, string $mode, int $use_include_path = 0) } -/** - * Reads to EOF on the given gz-file pointer from the current position and - * writes the (uncompressed) results to standard output. - * - * @param resource $stream The gz-file pointer. It must be valid, and must point to a file - * successfully opened by gzopen. - * @return int The number of uncompressed characters read from gz - * and passed through to the input. - * @throws ZlibException - * - */ -function gzpassthru($stream): int -{ - error_clear_last(); - $safeResult = \gzpassthru($stream); - if ($safeResult === false) { - throw ZlibException::createFromPhpError(); - } - return $safeResult; -} - - /** * gzread reads up to length bytes * from the given gz-file pointer. Reading stops when @@ -542,25 +520,6 @@ function inflate_get_read_len($context): int } -/** - * Usually returns either ZLIB_OK or ZLIB_STREAM_END. - * - * @param resource $context - * @return int Returns decompression status. - * @throws ZlibException - * - */ -function inflate_get_status($context): int -{ - error_clear_last(); - $safeResult = \inflate_get_status($context); - if ($safeResult === false) { - throw ZlibException::createFromPhpError(); - } - return $safeResult; -} - - /** * Incrementally inflates encoded data in the specified context. * diff --git a/generator/composer.json b/generator/composer.json index cb85fae8..5a95ff2e 100644 --- a/generator/composer.json +++ b/generator/composer.json @@ -7,23 +7,25 @@ } }, "require": { - "php": "^8.0", + "php": "^8.2", "ext-simplexml": "*", "ext-json": "*", - "symfony/console": "^4.1.4", - "symfony/process": "^4.1", - "symfony/finder": "^4.1" + "symfony/console": "^6 || ^7", + "symfony/process": "^6 || ^7", + "symfony/finder": "^6 || ^7" }, "require-dev": { - "phpunit/phpunit": "^9.5", + "phpunit/phpunit": "^10 || ^11", "thecodingmachine/phpstan-strict-rules": "^1.0", - "squizlabs/php_codesniffer": "^3.2", + "squizlabs/php_codesniffer": "^3", "php-coveralls/php-coveralls": "^2.1", - "phpstan/phpstan": "^1.5" + "phpstan/phpstan": "^1", + "rector/rector": "^1" }, "scripts": { "test": "vendor/bin/phpunit", - "phpstan": "phpstan analyse src -c phpstan.neon --level=max --no-progress -vvv", + "rector": "rector", + "phpstan": "phpstan", "cs-fix": "phpcbf", "cs-check": "phpcs" }, diff --git a/generator/composer.lock b/generator/composer.lock deleted file mode 100644 index a840c7b1..00000000 --- a/generator/composer.lock +++ /dev/null @@ -1,3966 +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": "d6c94263becd754b8ce74fbcf96c6508", - "packages": [ - { - "name": "psr/container", - "version": "1.1.2", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", - "shasum": "" - }, - "require": { - "php": ">=7.4.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" - }, - "time": "2021-11-05T16:50:12+00:00" - }, - { - "name": "symfony/console", - "version": "v4.4.38", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "5a50085bf5460f0c0d60a50b58388c1249826b8a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/5a50085bf5460f0c0d60a50b58388c1249826b8a", - "reference": "5a50085bf5460f0c0d60a50b58388c1249826b8a", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<3.4", - "symfony/event-dispatcher": "<4.3|>=5", - "symfony/lock": "<4.4", - "symfony/process": "<3.3" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^3.4|^4.0|^5.0", - "symfony/dependency-injection": "^3.4|^4.0|^5.0", - "symfony/event-dispatcher": "^4.3", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^3.4|^4.0|^5.0", - "symfony/var-dumper": "^4.3|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/console/tree/v4.4.38" - }, - "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-30T21:23:57+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" - }, - { - "name": "symfony/finder", - "version": "v4.4.37", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "b17d76d7ed179f017aad646e858c90a2771af15d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/b17d76d7ed179f017aad646e858c90a2771af15d", - "reference": "b17d76d7ed179f017aad646e858c90a2771af15d", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v4.4.37" - }, - "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:41:36+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "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": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" - }, - "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-05-24T11:49:31+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "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": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" - }, - "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": "2021-06-05T21:20:04+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" - }, - "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-03-04T08:16:47+00:00" - }, - { - "name": "symfony/process", - "version": "v4.4.37", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "b2d924e5a4cb284f293d5092b1dbf0d364cb8b67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b2d924e5a4cb284f293d5092b1dbf0d364cb8b67", - "reference": "b2d924e5a4cb284f293d5092b1dbf0d364cb8b67", - "shasum": "" - }, - "require": { - "php": ">=7.1.3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v4.4.37" - }, - "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-27T17:14:04+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "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": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" - }, - "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": "2021-11-04T16:48:04+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": "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": "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": "nikic/php-parser", - "version": "v4.13.2", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", - "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.13.2" - }, - "time": "2021-11-30T19:35:32+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "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": "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/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "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" - }, - { - "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/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "php-coveralls/php-coveralls", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/php-coveralls/php-coveralls.git", - "reference": "007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-coveralls/php-coveralls/zipball/007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4", - "reference": "007e13afdcdba2cd0efcc5f72c3b7efb356a8bd4", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-simplexml": "*", - "guzzlehttp/guzzle": "^6.0 || ^7.0", - "php": "^5.5 || ^7.0 || ^8.0", - "psr/log": "^1.0 || ^2.0", - "symfony/config": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/console": "^2.1 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/stopwatch": "^2.0 || ^3.0 || ^4.0 || ^5.0 || ^6.0", - "symfony/yaml": "^2.0.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.4.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0", - "sanmai/phpunit-legacy-adapter": "^6.1 || ^8.0" - }, - "suggest": { - "symfony/http-kernel": "Allows Symfony integration" - }, - "bin": [ - "bin/php-coveralls" - ], - "type": "library", - "autoload": { - "psr-4": { - "PhpCoveralls\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kitamura Satoshi", - "email": "with.no.parachute@gmail.com", - "homepage": "https://www.facebook.com/satooshi.jp", - "role": "Original creator" - }, - { - "name": "Takashi Matsuo", - "email": "tmatsuo@google.com" - }, - { - "name": "Google Inc" - }, - { - "name": "Dariusz Ruminski", - "email": "dariusz.ruminski@gmail.com", - "homepage": "https://github.com/keradus" - }, - { - "name": "Contributors", - "homepage": "https://github.com/php-coveralls/php-coveralls/graphs/contributors" - } - ], - "description": "PHP client library for Coveralls API", - "homepage": "https://github.com/php-coveralls/php-coveralls", - "keywords": [ - "ci", - "coverage", - "github", - "test" - ], - "support": { - "issues": "https://github.com/php-coveralls/php-coveralls/issues", - "source": "https://github.com/php-coveralls/php-coveralls/tree/v2.5.2" - }, - "time": "2021-12-06T17:05:08+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.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706", - "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706", - "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.0" - }, - "time": "2022-01-04T19:58:01+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": "phpstan/phpstan", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "2be8dd6dfa09ab1a21c49956ff591979cd5ab29e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/2be8dd6dfa09ab1a21c49956ff591979cd5ab29e", - "reference": "2be8dd6dfa09ab1a21c49956ff591979cd5ab29e", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "support": { - "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.5.0" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpstan", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], - "time": "2022-03-24T18:18:00+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.15", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "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": "^9.3" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-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/9.2.15" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-03-07T09:28:20+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "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": "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/3.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-02T12:48:52+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "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/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "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": "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/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.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": "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/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.5.19", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "35ea4b7f3acabb26f4bb640f8c30866c401da807" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/35ea4b7f3acabb26f4bb640f8c30866c401da807", - "reference": "35ea4b7f3acabb26f4bb640f8c30866c401da807", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "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": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "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/9.5.19" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-03-15T09:57:31+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": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", - "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "src" - } - }, - "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/2.0.0" - }, - "time": "2021-07-14T16:41:46+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": "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/" - ] - }, - "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": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "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" - } - ], - "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/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.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/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": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:52:27+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.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/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:10:38+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-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/5.1.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:52:38+00:00" - }, - { - "name": "sebastian/exporter", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.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": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "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/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-11-11T14:18:36+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.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/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" - }, - "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": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-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/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "" - }, - "require": { - "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" - } - ], - "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/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.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": "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/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:17:30+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "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" - } - ], - "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/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": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-03-15T09:54:48+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "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": "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/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.6.2", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "time": "2021-12-12T21:44:58+00:00" - }, - { - "name": "symfony/config", - "version": "v6.0.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "c14f32ae4cd2a3c29d8825c5093463ac08ade7d8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/c14f32ae4cd2a3c29d8825c5093463ac08ade7d8", - "reference": "c14f32ae4cd2a3c29d8825c5093463ac08ade7d8", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/filesystem": "^5.4|^6.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php81": "^1.22" - }, - "conflict": { - "symfony/finder": "<4.4" - }, - "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/finder": "^5.4|^6.0", - "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/yaml": "^5.4|^6.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v6.0.3" - }, - "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-03T09:53:43+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v6.0.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "52b888523545b0b4049ab9ce48766802484d7046" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b888523545b0b4049ab9ce48766802484d7046", - "reference": "52b888523545b0b4049ab9ce48766802484d7046", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.6" - }, - "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-03-02T12:58:14+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" - }, - "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": "2021-10-20T20:35:02+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "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": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0" - }, - "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": "2021-09-13T13:58:11+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v6.0.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "f2c1780607ec6502f2121d9729fd8150a655d337" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/f2c1780607ec6502f2121d9729fd8150a655d337", - "reference": "f2c1780607ec6502f2121d9729fd8150a655d337", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/service-contracts": "^1|^2|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides a way to profile code", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.0.5" - }, - "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-02-21T17:15:17+00:00" - }, - { - "name": "symfony/yaml", - "version": "v5.3.14", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "c441e9d2e340642ac8b951b753dea962d55b669d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c441e9d2e340642ac8b951b753dea962d55b669d", - "reference": "c441e9d2e340642ac8b951b753dea962d55b669d", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<4.4" - }, - "require-dev": { - "symfony/console": "^4.4|^5.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.3.14" - }, - "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-26T16:05:39+00:00" - }, - { - "name": "thecodingmachine/phpstan-strict-rules", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/thecodingmachine/phpstan-strict-rules.git", - "reference": "2ba8fa8b328c45f3b149c05def5bf96793c594b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/phpstan-strict-rules/zipball/2ba8fa8b328c45f3b149c05def5bf96793c594b6", - "reference": "2ba8fa8b328c45f3b149c05def5bf96793c594b6", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0", - "phpstan/phpstan": "^1.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^7.1" - }, - "type": "phpstan-extension", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - }, - "phpstan": { - "includes": [ - "phpstan-strict-rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "TheCodingMachine\\PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "David Négrier", - "email": "d.negrier@thecodingmachine.com" - } - ], - "description": "A set of additional rules for PHPStan based on best practices followed at TheCodingMachine", - "support": { - "issues": "https://github.com/thecodingmachine/phpstan-strict-rules/issues", - "source": "https://github.com/thecodingmachine/phpstan-strict-rules/tree/v1.0.0" - }, - "time": "2021-11-08T09:10:49+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.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "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.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^8.0", - "ext-simplexml": "*", - "ext-json": "*" - }, - "platform-dev": [], - "plugin-api-version": "2.3.0" -} diff --git a/generator/config/ignoredFunctions.php b/generator/config/ignoredFunctions.php index 6e0554e9..a820eb2b 100644 --- a/generator/config/ignoredFunctions.php +++ b/generator/config/ignoredFunctions.php @@ -16,4 +16,6 @@ 'apcu_delete', // apcu_delete returns false when the $key does not exist in the cache store 'filter_has_var', // this function is meant to return a boolean 'array_multisort', // this function is too buggy, see PR #113 on GitHub + 'dba_open', // int default value used for string parameter + 'dba_popen', // int default value used for string parameter ]; diff --git a/generator/phpcs.xml.dist b/generator/phpcs.xml.dist index 480486b4..b49ec5d7 100644 --- a/generator/phpcs.xml.dist +++ b/generator/phpcs.xml.dist @@ -7,7 +7,7 @@ - + src diff --git a/generator/phpstan.neon b/generator/phpstan.neon index bf8cad2d..83055c16 100644 --- a/generator/phpstan.neon +++ b/generator/phpstan.neon @@ -1,4 +1,8 @@ parameters: + paths: + - ./src + # The level 9 is the highest level (with check for mixed type) + level: 8 ignoreErrors: includes: - vendor/thecodingmachine/phpstan-strict-rules/phpstan-strict-rules.neon \ No newline at end of file diff --git a/generator/phpunit.xml.dist b/generator/phpunit.xml.dist index b04faf99..ddcfb6ab 100644 --- a/generator/phpunit.xml.dist +++ b/generator/phpunit.xml.dist @@ -1,24 +1,20 @@ - - - - - src - - - - - - - - - ./tests/ - ./tests/rector - - + + + + + + + + + + ./tests/ + ./tests/rector + + + + + src + + diff --git a/generator/rector.php b/generator/rector.php new file mode 100644 index 00000000..64176b31 --- /dev/null +++ b/generator/rector.php @@ -0,0 +1,47 @@ +withPaths([ + __DIR__.'/src', + ]) + // uncomment to reach your current PHP version + ->withPhpSets() + ->withRules([ + AddVoidReturnTypeWhereNoReturnRector::class, + ChangeConstantVisibilityRector::class, + RenameForeachValueVariableToMatchExprVariableRector::class, + ReturnTypeFromReturnNewRector::class, + CountArrayToEmptyArrayComparisonRector::class, + StrictArraySearchRector::class, + SymplifyQuoteEscapeRector::class, + DeclareStrictTypesRector::class, + ]) + ->withSets([ + PHPUnitSetList::PHPUNIT_110, + ]) + ->withPhpSets() + ->withPHPStanConfigs(['phpstan.neon']) + ->withPreparedSets( + deadCode: true, + codeQuality: true, + codingStyle: true, + typeDeclarations: true, + privatization: true, + naming: true, + instanceOf: true, + earlyReturn: true, + strictBooleans: true + ); diff --git a/generator/src/ComposerJsonEditor.php b/generator/src/ComposerJsonEditor.php index 8e3b76a5..d02915ec 100644 --- a/generator/src/ComposerJsonEditor.php +++ b/generator/src/ComposerJsonEditor.php @@ -1,5 +1,6 @@ > $composerJson */ $composerJson = \json_decode($composerContent, true); $composerJson['autoload']['files'] = self::editFileListForDeprecation($composerJson['autoload']['files'], $moduleName); @@ -30,11 +32,12 @@ public static function editComposerFileForDeprecation(string $moduleName): void */ public static function editComposerFileForGeneration(array $modules): void { - + $composerContent = file_get_contents(self::COMPOSER_FILEPATH); if ($composerContent === false) { throw new \RuntimeException('Error while loading composer.json file for edition.'); } + /** @var array> $composerJson */ $composerJson = \json_decode($composerContent, true); $composerJson['autoload']['files'] = self::editFilesListForGeneration($composerJson['autoload']['files'], $modules); @@ -42,10 +45,7 @@ public static function editComposerFileForGeneration(array $modules): void $newContent = \json_encode($composerJson, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES); \file_put_contents(self::COMPOSER_FILEPATH, $newContent); } - - - - + /** * @param string[] $oldFiles * @param string[] $modules A list of modules @@ -53,12 +53,11 @@ public static function editComposerFileForGeneration(array $modules): void */ public static function editFilesListForGeneration(array $oldFiles, array $modules): array { - $files = array_values(array_filter($oldFiles, function ($file) { - return strpos($file, 'generated/') === false; - })); + $files = array_values(array_filter($oldFiles, fn($file): bool => !str_contains($file, 'generated/'))); foreach ($modules as $module) { - $files[] = 'generated/'.lcfirst($module).'.php'; + $files[] = 'generated/' . lcfirst($module) . '.php'; } + return $files; } @@ -70,11 +69,7 @@ public static function editFileListForDeprecation(array $fileList, string $modul { $newList = []; foreach ($fileList as $fileName) { - if ($fileName === "generated/$moduleName.php") { - $newList[] = "deprecated/$moduleName.php"; - } else { - $newList[] = $fileName; - } + $newList[] = $fileName === sprintf('generated/%s.php', $moduleName) ? sprintf('deprecated/%s.php', $moduleName) : $fileName; } return $newList; diff --git a/generator/src/DeprecateCommand.php b/generator/src/DeprecateCommand.php index 3f4dd56d..6782d55c 100644 --- a/generator/src/DeprecateCommand.php +++ b/generator/src/DeprecateCommand.php @@ -1,5 +1,6 @@ getArgument('module'); - - $moduleFilePath = self::GENERATE_DIRECTORY."$moduleName.php"; + + $moduleFilePath = self::GENERATE_DIRECTORY . ($moduleName . '.php'); if (!\file_exists($moduleFilePath)) { - throw new \RuntimeException("Module $moduleName is not maintained!"); + throw new \RuntimeException(sprintf('Module %s is not maintained!', $moduleName)); } - $output->writeln("Move $moduleName.php to deprecated"); - $success = \rename($moduleFilePath, self::DEPRECATE_DIRECTORY."$moduleName.php"); + $output->writeln(sprintf('Move %s.php to deprecated', $moduleName)); + $success = \rename($moduleFilePath, self::DEPRECATE_DIRECTORY . ($moduleName . '.php')); if (!$success) { throw new \RuntimeException("Could not move the file."); } - $exceptionFilePath = self::GENERATE_DIRECTORY.self::getExceptionFilePath($moduleName); + $exceptionFilePath = self::GENERATE_DIRECTORY . self::getExceptionFilePath($moduleName); if (\file_exists($exceptionFilePath)) { $output->writeln("Move exception file to deprecated"); - $success = \rename($exceptionFilePath, self::DEPRECATE_DIRECTORY.self::getExceptionFilePath($moduleName)); + $success = \rename($exceptionFilePath, self::DEPRECATE_DIRECTORY . self::getExceptionFilePath($moduleName)); if (!$success) { throw new \RuntimeException("Could not move the file."); } @@ -51,15 +53,15 @@ protected function execute(InputInterface $input, OutputInterface $output) $output->writeln('Editing composer.json'); ComposerJsonEditor::editComposerFileForDeprecation($moduleName); - $generatedListFile = self::GENERATE_DIRECTORY.'functionsList.php'; - $deprecatedListFile = self::DEPRECATE_DIRECTORY.'functionsList.php'; - $output->writeln("Don't forget to edit $generatedListFile and $deprecatedListFile !"); - + $generatedListFile = self::GENERATE_DIRECTORY . 'functionsList.php'; + $deprecatedListFile = self::DEPRECATE_DIRECTORY . 'functionsList.php'; + $output->writeln(sprintf("Don't forget to edit %s and %s !", $generatedListFile, $deprecatedListFile)); + return 0; } - + public static function getExceptionFilePath(string $moduleName): string { - return "Exceptions/".ucfirst($moduleName)."Exception.php"; + return "Exceptions/" . ucfirst($moduleName) . "Exception.php"; } } diff --git a/generator/src/DocPage.php b/generator/src/DocPage.php index d55204e5..37edb9e8 100644 --- a/generator/src/DocPage.php +++ b/generator/src/DocPage.php @@ -1,5 +1,7 @@ path = $_path; } // Ignore function if it was removed before PHP 7.1 @@ -32,7 +28,8 @@ private function getIsDeprecated(string $file): bool } } - if (preg_match('/&warn\.removed\.function-(\d+-\d+-\d+)/', $file, $matches) && isset($matches[2])) { + if (preg_match('/&warn\.removed\.function-(\d+-\d+-\d+)/', $file, $matches)) { + // @phpstan-ignore-next-line $removedVersion = $matches[2]; [$major, $minor] = explode('-', $removedVersion); if ($major < 7 || ($major == 7 && $minor == 0)) { @@ -50,7 +47,7 @@ public function detectFalsyFunction(): bool { $file = file_get_contents($this->path); if ($file === false) { - throw new \RuntimeException('An error occurred while reading '.$this->path); + throw new \RuntimeException('An error occurred while reading ' . $this->path); } if ($this->getIsDeprecated($file)) { @@ -69,48 +66,63 @@ public function detectFalsyFunction(): bool if (preg_match('/&false;\s+on\s+error/m', $returnValuesSection)) { return true; } + if (preg_match('/&false;\s+on\s+failure/m', $returnValuesSection)) { return true; } - if (preg_match('/&false;\s+otherwise/m', $returnValuesSection) && !preg_match('/(returns\s+&true;|&true;\s+on\s+success|&true;\s+if)/im', $returnValuesSection)) { + + if (preg_match('/&false;\s+otherwise/m', $returnValuesSection) && (preg_match('/(returns\s+&true;|&true;\s+on\s+success|&true;\s+if)/im', $returnValuesSection) === 0 || preg_match('/(returns\s+&true;|&true;\s+on\s+success|&true;\s+if)/im', $returnValuesSection) === false)) { return true; } - if (preg_match('/may\s+return\s+&false;/m', $returnValuesSection) && !preg_match('/(returns\s+&true;|&true;\s+on\s+success|&true;\s+if)/im', $returnValuesSection)) { + + if (preg_match('/may\s+return\s+&false;/m', $returnValuesSection) && (preg_match('/(returns\s+&true;|&true;\s+on\s+success|&true;\s+if)/im', $returnValuesSection) === 0 || preg_match('/(returns\s+&true;|&true;\s+on\s+success|&true;\s+if)/im', $returnValuesSection) === false)) { return true; } + if (preg_match('/&false;\s+if\s+an\s+error\s+occurred/m', $returnValuesSection)) { return true; } + if (preg_match('/&return.success;/m', $returnValuesSection)) { return true; } + if (preg_match('/&return.nullorfalse;/m', $returnValuesSection)) { return true; } + if (preg_match('/&return.falseforfailure;/m', $returnValuesSection)) { return true; } + if (preg_match('/&date.datetime.return.modifiedobjectorfalseforfailure;/m', $returnValuesSection)) { return true; } + if (preg_match('/ or &false; \\(and generates an error/m', $returnValuesSection)) { return true; } + if (preg_match('/&false;\s+if\s+the\s+number\s+of\s+elements\s+for\s+each\s+array\s+isn\'t\s+equal/m', $returnValuesSection)) { return true; } + if (preg_match('/If\s+the\s+call\s+fails,\s+it\s+will\s+return\s+&false;/m', $returnValuesSection)) { return true; } + if (preg_match('/Upon\s+failure,?\s+\[\w_]{1,15}?\<\/function\>\s+returns\s+&false;/m', $returnValuesSection)) { return true; } + if (preg_match('/On\s+failure,\s+&false;\s+is\s+returned/m', $returnValuesSection)) { return true; } + if (preg_match('/on\s+success,\s+otherwise\s+&false;\s+is\s+returned/m', $returnValuesSection)) { return true; } + if (preg_match('/Returns.*on success[.\s\S]+Returns &false;\s+if/m', $returnValuesSection)) { return true; } @@ -118,9 +130,12 @@ public function detectFalsyFunction(): bool if (preg_match('/&gd\.return\.identifier;/m', $returnValuesSection)) { return true; } + //used for date - if (preg_match('/If a non-numeric value is used for - \timestamp\<\/parameter\>, &false; is returned/m', $returnValuesSection)) { + if ( + preg_match('/If a non-numeric value is used for + \timestamp\<\/parameter\>, &false; is returned/m', $returnValuesSection) + ) { return true; } @@ -135,11 +150,7 @@ public function detectFalsyFunction(): bool } //used to detect get_headers and ldap_search - if (preg_match("/&false; on failure/m", $returnValuesSection)) { - return true; - } - - return false; + return (bool) preg_match("/&false; on failure/m", $returnValuesSection); } /* @@ -149,7 +160,7 @@ public function detectNullsyFunction(): bool { $file = \file_get_contents($this->path); if ($file === false) { - throw new \RuntimeException('An error occurred while reading '.$this->path); + throw new \RuntimeException('An error occurred while reading ' . $this->path); } if ($this->getIsDeprecated($file)) { @@ -164,11 +175,8 @@ public function detectNullsyFunction(): bool if (preg_match('/&null;\s+on\s+failure/', $returnValuesSection)) { return true; } - if (preg_match('/&null;\s+if\s+an\s+error\s+occurs/', $returnValuesSection)) { - return true; - } - return false; + return (bool) preg_match('/&null;\s+if\s+an\s+error\s+occurs/', $returnValuesSection); } /* @@ -178,19 +186,15 @@ public function detectEmptyFunction(): bool { $file = file_get_contents($this->path); if ($file === false) { - throw new \RuntimeException('An error occurred while reading '.$this->path); + throw new \RuntimeException('An error occurred while reading ' . $this->path); } + if ($this->getIsDeprecated($file)) { return false; } $returnValuesSection = $this->extractSection('returnvalues', $file); - - if (preg_match('/an\s+empty\s+string\s+on\s+error/', $returnValuesSection)) { - return true; - } - - return false; + return (bool) preg_match('/an\s+empty\s+string\s+on\s+error/', $returnValuesSection); } /** @@ -203,7 +207,7 @@ public function getMethodSynopsis(): array $file = \file_get_contents($this->path); if ($file === false) { - throw new \RuntimeException('An error occurred while reading '.$this->path); + throw new \RuntimeException('An error occurred while reading ' . $this->path); } // Only evaluate the synopsis inside the `...` section of the doc page. @@ -211,7 +215,7 @@ public function getMethodSynopsis(): array // handlers, callbacks, and other callable-type arguments, not the function itself. $fileDescriptionSection = $this->extractSection('description', $file); - if (!preg_match_all('/<\/?methodsynopsis[\s\S]*?>[\s\S]*?<\/methodsynopsis>/m', $fileDescriptionSection, $functions, PREG_SET_ORDER, 0)) { + if (preg_match_all('/<\/?methodsynopsis[\s\S]*?>[\s\S]*?<\/methodsynopsis>/m', $fileDescriptionSection, $functions, PREG_SET_ORDER, 0) === 0 || preg_match_all('/<\/?methodsynopsis[\s\S]*?>[\s\S]*?<\/methodsynopsis>/m', $fileDescriptionSection, $functions, PREG_SET_ORDER, 0) === false) { return []; } @@ -222,8 +226,10 @@ public function getMethodSynopsis(): array if (!\is_string($cleaningFunction)) { throw new \RuntimeException('Error occurred in preg_replace'); } + $cleanedFunctions[] = $cleaningFunction; } + $functionObjects = []; foreach ($cleanedFunctions as $cleanedFunction) { $functionObject = \simplexml_load_string($cleanedFunction); @@ -231,36 +237,38 @@ public function getMethodSynopsis(): array $functionObjects[] = $functionObject; } } + return $functionObjects; } /** * Loads the XML file, resolving all DTD declared entities. - * - * @return \SimpleXMLElement */ public function loadAndResolveFile(): \SimpleXMLElement { $content = \file_get_contents($this->path); if ($content === false) { - throw new \RuntimeException('An error occurred while reading '.$this->path); + throw new \RuntimeException('An error occurred while reading ' . $this->path); } - $strpos = \strpos($content, '?>')+2; - if (!\file_exists(__DIR__.'/../doc/entities/generated.ent')) { + + $strpos = \strpos($content, '?>') + 2; + if (!\file_exists(__DIR__ . '/../doc/entities/generated.ent')) { self::buildEntities(); } - $path = \realpath(__DIR__.'/../doc/entities/generated.ent'); + + $path = \realpath(__DIR__ . '/../doc/entities/generated.ent'); $content = \substr($content, 0, $strpos) - .'' - .\substr($content, $strpos+1); + . '' + . \substr($content, $strpos + 1); - echo 'Loading '.$this->path."\n"; + echo 'Loading ' . $this->path . "\n"; $elem = \simplexml_load_string($content, \SimpleXMLElement::class, LIBXML_DTDLOAD | LIBXML_NOENT); if ($elem === false) { - throw new \RuntimeException('Invalid XML file for '.$this->path); + throw new \RuntimeException('Invalid XML file for ' . $this->path); } + $elem->registerXPathNamespace('docbook', 'http://docbook.org/ns/docbook'); return $elem; @@ -268,8 +276,6 @@ public function loadAndResolveFile(): \SimpleXMLElement /** * Returns the module name in Camelcase. - * - * @return string */ public function getModule(): string { @@ -281,8 +287,7 @@ private function extractSection(string $sectionName, string $file): string $regexpBase = '/[\s\S]*?<\/refsect1>/m'; $regexpString = sprintf($regexpBase, preg_quote($sectionName, '/')); preg_match_all($regexpString, $file, $output); - $output = implode('', $this->arrayFlatten((array) $output)); - return $output; + return implode('', $this->arrayFlatten($output)); } private function toCamelCase(string $str): string @@ -315,24 +320,25 @@ private function arrayFlatten(array $array): array $result[$key] = strval($value); } } + return $result; } public static function buildEntities(): void { - $file1 = \file_get_contents(__DIR__.'/../doc/doc-en/en/language-defs.ent') ?: ''; - $file2 = \file_get_contents(__DIR__.'/../doc/doc-en/en/language-snippets.ent') ?: ''; - $file3 = \file_get_contents(__DIR__.'/../doc/doc-en/en/extensions.ent') ?: ''; - $file4 = \file_get_contents(__DIR__.'/../doc/doc-en/doc-base/entities/global.ent') ?: ''; + $file1 = \file_get_contents(__DIR__ . '/../doc/doc-en/en/language-defs.ent') ?: ''; + $file2 = \file_get_contents(__DIR__ . '/../doc/doc-en/en/language-snippets.ent') ?: ''; + $file3 = \file_get_contents(__DIR__ . '/../doc/doc-en/en/extensions.ent') ?: ''; + $file4 = \file_get_contents(__DIR__ . '/../doc/doc-en/doc-base/entities/global.ent') ?: ''; $completeFile = $file1 . self::extractXmlHeader($file2) . self::extractXmlHeader($file3) . $file4; - \file_put_contents(__DIR__.'/../doc/entities/generated.ent', $completeFile); + \file_put_contents(__DIR__ . '/../doc/entities/generated.ent', $completeFile); } private static function extractXmlHeader(string $content): string { - $strpos = strpos($content, '?>')+2; + $strpos = strpos($content, '?>') + 2; return substr($content, $strpos); } } diff --git a/generator/src/EmptyTypeException.php b/generator/src/EmptyTypeException.php index cf584eca..2ad02b3c 100644 --- a/generator/src/EmptyTypeException.php +++ b/generator/src/EmptyTypeException.php @@ -1,5 +1,6 @@ $phpFunctions) { $lcModule = \lcfirst($module); - $stream = \fopen($path.$lcModule.'.php', 'w'); + $stream = \fopen($path . $lcModule . '.php', 'w'); if ($stream === false) { - throw new \RuntimeException('Unable to write to '.$path); + throw new \RuntimeException('Unable to write to ' . $path); } + \fwrite($stream, "getFunctionName(); - }, $functions); - $specialCases = require __DIR__.'/../config/specialCasesFunctions.php'; + $functionNames = array_map(fn(Method $method): string => $method->getFunctionName(), $functions); + $specialCases = require __DIR__ . '/../config/specialCasesFunctions.php'; $functionNames = array_merge($functionNames, $specialCases); natcasesort($functionNames); - $excludeCases = require __DIR__.'/../config/ignoredFunctions.php'; + $excludeCases = require __DIR__ . '/../config/ignoredFunctions.php'; return array_diff($functionNames, $excludeCases); } @@ -64,20 +65,21 @@ private function getFunctionsNameList(array $functions): array * This function generate a PHP file containing the list of functions we can handle. * * @param Method[] $functions - * @param string $path */ public function generateFunctionsList(array $functions, string $path): void { $functionNames = $this->getFunctionsNameList($functions); $stream = fopen($path, 'w'); if ($stream === false) { - throw new \RuntimeException('Unable to write to '.$path); + throw new \RuntimeException('Unable to write to ' . $path); } + fwrite($stream, " 'Safe\\$functionName',\n"); + fwrite($stream, " '{$functionName}' => 'Safe\\{$functionName}',\n"); } fwrite($stream, " ]);\n};\n"); @@ -125,9 +126,9 @@ public function generateRectorFile(array $functions, string $path): void public function createExceptionFile(string $moduleName): void { $exceptionName = self::toExceptionName($moduleName); - if (!file_exists(__DIR__.'/../../lib/Exceptions/'.$exceptionName.'.php')) { + if (!file_exists(__DIR__ . '/../../lib/Exceptions/' . $exceptionName . '.php')) { \file_put_contents( - __DIR__.'/../../generated/Exceptions/'.$exceptionName.'.php', + __DIR__ . '/../../generated/Exceptions/' . $exceptionName . '.php', <<rmGenerated(); // Let's build the DTD necessary to load the XML files. DocPage::buildEntities(); - $scanner = new Scanner(__DIR__ . '/../doc/doc-en/en/reference/'); + $scanner = new Scanner(dirname(__DIR__) . '/doc/doc-en/en/reference/'); $paths = $scanner->getFunctionsPaths(); - $res = $scanner->getMethods($paths); - $functions = $res->methods; - $overloadedFunctions = $res->overloadedFunctions; + $scannerResponse = $scanner->getMethods($paths); + $functions = $scannerResponse->methods; + $overloadedFunctions = $scannerResponse->overloadedFunctions; - $output->writeln('These functions have been ignored and must be dealt with manually: '.\implode(', ', $overloadedFunctions)); + $output->writeln('These functions have been ignored and must be dealt with manually: ' . \implode(', ', $overloadedFunctions)); $fileCreator = new FileCreator(); - $fileCreator->generatePhpFile($functions, __DIR__ . '/../../generated/'); - $fileCreator->generateFunctionsList($functions, __DIR__ . '/../../generated/functionsList.php'); - $fileCreator->generateRectorFile($functions, __DIR__ . '/../../rector-migrate.php'); + $fileCreator->generatePhpFile($functions, dirname(__DIR__, 2) . '/generated/'); + $fileCreator->generateFunctionsList($functions, dirname(__DIR__, 2) . '/generated/functionsList.php'); + $fileCreator->generateRectorFile($functions, dirname(__DIR__, 2) . '/rector-migrate.php'); $modules = []; @@ -46,14 +47,14 @@ protected function execute(InputInterface $input, OutputInterface $output) $modules[$moduleName] = $moduleName; } - foreach ($modules as $moduleName => $foo) { + foreach (array_keys($modules) as $moduleName) { $fileCreator->createExceptionFile((string) $moduleName); } $this->runCsFix($output); // Let's require the generated file to check there is no error. - $files = \glob(__DIR__.'/../../generated/*.php'); + $files = \glob(dirname(__DIR__, 2) . '/generated/*.php'); if ($files === false) { throw new \RuntimeException('Failed to require the generated file'); } @@ -62,12 +63,12 @@ protected function execute(InputInterface $input, OutputInterface $output) require($file); } - $files = \glob(__DIR__.'/../../generated/Exceptions/*.php'); + $files = \glob(dirname(__DIR__, 2) . '/generated/Exceptions/*.php'); if ($files === false) { throw new \RuntimeException('Failed to require the generated exception file'); } - require_once __DIR__.'/../../lib/Exceptions/SafeExceptionInterface.php'; + require_once dirname(__DIR__, 2) . '/lib/Exceptions/SafeExceptionInterface.php'; foreach ($files as $file) { require($file); } @@ -81,7 +82,7 @@ protected function execute(InputInterface $input, OutputInterface $output) private function rmGenerated(): void { - $exceptions = \glob(__DIR__.'/../../generated/Exceptions/*.php'); + $exceptions = \glob(dirname(__DIR__, 2) . '/generated/Exceptions/*.php'); if ($exceptions === false) { throw new \RuntimeException('Failed to require the generated exception files'); } @@ -90,7 +91,7 @@ private function rmGenerated(): void \unlink($exception); } - $files = \glob(__DIR__.'/../../generated/*.php'); + $files = \glob(dirname(__DIR__, 2) . '/generated/*.php'); if ($files === false) { throw new \RuntimeException('Failed to require the generated files'); } @@ -99,20 +100,20 @@ private function rmGenerated(): void \unlink($file); } - if (\file_exists(__DIR__.'/../doc/entities/generated.ent')) { - \unlink(__DIR__.'/../doc/entities/generated.ent'); + if (\file_exists(dirname(__DIR__, 2) . '/doc/entities/generated.ent')) { + \unlink(dirname(__DIR__, 2) . '/doc/entities/generated.ent'); } } private function runCsFix(OutputInterface $output): void { - $process = new Process(['vendor/bin/phpcbf'], __DIR__.'/../..'); + $process = new Process(['vendor/bin/phpcbf'], dirname(__DIR__, 2) . '/'); $process->setTimeout(600); - $process->run(function ($type, $buffer) use ($output) { + $process->run(function ($type, string $buffer) use ($output): void { if (Process::ERR === $type) { - echo $output->write(''.$buffer.''); + $output->write('' . $buffer . ''); } else { - echo $output->write($buffer); + $output->write($buffer); } }); } diff --git a/generator/src/Method.php b/generator/src/Method.php index d3406fd4..54eaa609 100644 --- a/generator/src/Method.php +++ b/generator/src/Method.php @@ -1,5 +1,7 @@ functionObject = $_functionObject; - $this->rootEntity = $rootEntity; - $this->moduleName = $moduleName; - $this->errorType = $errorType; $functionName = $this->getFunctionName(); - $this->phpstanSignarure = $phpStanFunctionMapReader->hasFunction($functionName) ? $phpStanFunctionMapReader->getFunction($functionName) : null; - $this->returnType = $this->phpstanSignarure ? $this->phpstanSignarure->getReturnType() : new PhpStanType($this->functionObject->type->__toString()); + $this->phpStanFunction = $phpStanFunctionMapReader->hasFunction($functionName) ? $phpStanFunctionMapReader->getFunction($functionName) : null; + $this->phpStanType = $this->phpStanFunction instanceof \Safe\PhpStanFunctions\PhpStanFunction ? $this->phpStanFunction->getReturnType() : new PhpStanType($this->functionObject->type->__toString()); } public function getFunctionName(): string @@ -64,7 +47,7 @@ public function getErrorType(): int public function getSignatureReturnType(): string { - return $this->returnType->getSignatureType($this->errorType); + return $this->phpStanType->getSignatureType($this->errorType); } /** @@ -73,41 +56,45 @@ public function getSignatureReturnType(): string public function getParams(): array { if ($this->params === null) { - if (!isset($this->functionObject->methodparam)) { + if (!property_exists($this->functionObject, 'methodparam') || $this->functionObject->methodparam === null) { return []; } - $phpStanFunction = $this->phpstanSignarure; + + $phpStanFunction = $this->phpStanFunction; $params = []; - $i=1; + $i = 1; foreach ($this->functionObject->methodparam as $param) { - $notes = $this->stripReturnFalseText($this->getStringForXPath("(//docbook:refsect1[@role='parameters']//docbook:varlistentry)[$i]//docbook:note//docbook:para")); + $notes = $this->stripReturnFalseText($this->getStringForXPath(sprintf("(//docbook:refsect1[@role='parameters']//docbook:varlistentry)[%d]//docbook:note//docbook:para", $i))); $i++; if (preg_match('/This parameter has been removed in PHP (\d+\.\d+\.\d+)/', $notes, $matches)) { $removedVersion = $matches[1]; [$major, $minor] = explode('.', $removedVersion); - if ($major < 7 || ($major == 7 && $minor == 0)) { + if ($major < 7) { + // Ignore parameter if it was removed before PHP 7.1 + continue; + } + + if ($major == 7 && $minor == 0) { // Ignore parameter if it was removed before PHP 7.1 continue; } } - $params[] = new Parameter($param, $phpStanFunction, $i-2); + $params[] = new Parameter($param, $phpStanFunction, $i - 2); } + $this->params = $params; } + return $this->params; } public function getPhpDoc(): string { - $str = "\n/**\n". - implode("\n", array_map(function (string $line) { - return rtrim(' * '.ltrim($line)); - }, \explode("\n", \strip_tags($this->getDocBlock())))) - ."\n */\n"; - - return $str; + return "\n/**\n" . + implode("\n", array_map(fn(string $line): string => rtrim(' * ' . ltrim($line)), \explode("\n", \strip_tags($this->getDocBlock())))) + . "\n */\n"; } private function getDocBlock(): string @@ -115,18 +102,16 @@ private function getDocBlock(): string $str = $this->stripReturnFalseText($this->getStringForXPath("//docbook:refsect1[@role='description']/docbook:para")); $str .= "\n\n"; - $i=1; + $i = 1; foreach ($this->getParams() as $parameter) { - $str .= '@param '.$parameter->getDocBlockType().' $'.$parameter->getParameterName().' '; - $str .= $this->getStringForXPath("(//docbook:refsect1[@role='parameters']//docbook:varlistentry)[$i]//docbook:para")."\n"; + $str .= '@param ' . $parameter->getDocBlockType() . ' $' . $parameter->getParameterName() . ' '; + $str .= $this->getStringForXPath(sprintf("(//docbook:refsect1[@role='parameters']//docbook:varlistentry)[%d]//docbook:para", $i)) . "\n"; $i++; } $str .= $this->getReturnDocBlock(); - $str .= '@throws '.FileCreator::toExceptionName($this->getModuleName()). "\n"; - - return $str; + return $str . ('@throws ' . FileCreator::toExceptionName($this->getModuleName()) . "\n"); } public function getReturnDocBlock(): string @@ -136,8 +121,9 @@ public function getReturnDocBlock(): string $bestReturnType = $this->getDocBlockReturnType(); if ($bestReturnType !== 'void') { - return '@return '.$bestReturnType. ' ' .$returnDoc."\n"; + return '@return ' . $bestReturnType . ' ' . $returnDoc . "\n"; } + return ''; } @@ -150,7 +136,7 @@ private function stripReturnFalseText(string $string): string $string = $this->removeString($string, ' and NULL on failure'); $string = $this->removeString($string, ' or NULL on failure'); break; - + case self::FALSY_TYPE: $string = $this->removeString($string, 'or FALSE on failure'); $string = $this->removeString($string, '. Returns FALSE on error'); @@ -181,29 +167,32 @@ private function stripReturnFalseText(string $string): string private function removeString(string $string, string $search): string { $search = str_replace(' ', '\s+', $search); - $result = preg_replace('/[\s\,]*'.$search.'/m', '', $string); + $result = preg_replace('/[\s\,]*' . $search . '/m', '', $string); if ($result === null) { throw new \RuntimeException('An error occurred while calling preg_replace'); } + return $result; } private function getStringForXPath(string $xpath): string { $paragraphs = $this->rootEntity->xpath($xpath); - if ($paragraphs === false) { + if ($paragraphs === false || $paragraphs === null) { throw new \RuntimeException('Error while performing Xpath request.'); } + $str = ''; foreach ($paragraphs as $paragraph) { - $str .= $this->getInnerXml($paragraph)."\n\n"; + $str .= $this->getInnerXml($paragraph) . "\n\n"; } + return trim($str); } private function getDocBlockReturnType(): string { - return $this->returnType->getDocBlockType($this->errorType); + return $this->phpStanType->getDocBlockType($this->errorType); } private function getInnerXml(\SimpleXMLElement $SimpleXMLElement): string @@ -213,9 +202,9 @@ private function getInnerXml(\SimpleXMLElement $SimpleXMLElement): string if ($inner_xml === false) { throw new \RuntimeException('Unable to serialize to XML'); } - $inner_xml = str_replace(['<'.$element_name.'>', ''], '', $inner_xml); - $inner_xml = trim($inner_xml); - return $inner_xml; + + $inner_xml = str_replace(['<' . $element_name . '>', ''], '', $inner_xml); + return trim($inner_xml); } public function getModuleName(): string @@ -225,8 +214,6 @@ public function getModuleName(): string /** * The function is overloaded if at least one parameter is optional with no default value and this parameter is not by reference. - * - * @return bool */ public function isOverloaded(): bool { @@ -235,6 +222,7 @@ public function isOverloaded(): bool return true; } } + return false; } diff --git a/generator/src/Parameter.php b/generator/src/Parameter.php index 4add27d8..e9d92a63 100644 --- a/generator/src/Parameter.php +++ b/generator/src/Parameter.php @@ -1,4 +1,7 @@ parameter = $parameter; - $phpStanParam = $phpStanFunction ? $phpStanFunction->getParameter($this->getParameterName(), $position) : null; - - $this->type = $phpStanParam ? $phpStanParam->getType() : new PhpStanType($this->parameter->type->__toString()); //todo: is this if useful? + $phpStanParam = $phpStanFunction instanceof \Safe\PhpStanFunctions\PhpStanFunction ? $phpStanFunction->getParameter($this->getParameterName(), $position) : null; + $this->phpStanType = $phpStanParam instanceof \Safe\PhpStanFunctions\PhpStanParameter ? $phpStanParam->getType() : new PhpStanType($this->parameter->type->__toString()); //todo: is this if useful? } /** @@ -29,7 +23,7 @@ public function __construct(\SimpleXMLElement $parameter, ?PhpStanFunction $phpS */ public function getSignatureType(): string { - return $this->type->getSignatureType(); + return $this->phpStanType->getSignatureType(); } /** @@ -37,7 +31,7 @@ public function getSignatureType(): string */ public function getDocBlockType(): string { - return $this->type->getDocBlockType(); + return $this->phpStanType->getDocBlockType(); } public function getParameterName(): string @@ -45,7 +39,7 @@ public function getParameterName(): string // The db2_bind_param method has parameters with a dash in it... yep... (patch submitted) return \str_replace('-', '_', $this->parameter->parameter->__toString()); } - + public function getParameterType(): string { // The db2_bind_param method has parameters with a dash in it... yep... (patch submitted) @@ -60,24 +54,20 @@ public function isByReference(): bool /** * Some parameters can be optional with no default value. In this case, the function is "overloaded" (which is not * possible in user-land but possible in core...) - * - * @return bool */ public function isOptionalWithNoDefault(): bool { if (((string)$this->parameter['choice']) !== 'opt' && !$this->isVariadic()) { return false; } + if (!$this->hasDefaultValue()) { return true; } $initializer = $this->getInitializer(); // Some default value have weird values. For instance, first parameter of "mb_internal_encoding" has default value "mb_internal_encoding()" - if ($initializer === 'null' || ($initializer !== 'array()' && strpos($initializer, '(') !== false)) { - return true; - } - return false; + return $initializer === 'null' || ($initializer !== 'array()' && str_contains($initializer, '(')); } public function isVariadic(): bool @@ -87,7 +77,7 @@ public function isVariadic(): bool public function isNullable(): bool { - return $this->type->isNullable(); + return $this->phpStanType->isNullable(); } /* @@ -100,7 +90,7 @@ public function getInitializer(): string public function hasDefaultValue(): bool { - return isset($this->parameter->initializer); + return property_exists($this->parameter, 'initializer') && $this->parameter->initializer !== null; } public function getDefaultValue(): ?string @@ -110,9 +100,8 @@ public function getDefaultValue(): ?string } $initializer = $this->getInitializer(); - - // Some default value have weird values. For instance, first parameter of "mb_internal_encoding" has default value "mb_internal_encoding()" - if (strpos($initializer, '(') !== false) { +// Some default value have weird values. For instance, first parameter of "mb_internal_encoding" has default value "mb_internal_encoding()" + if (str_contains($initializer, '(')) { return null; } @@ -126,8 +115,8 @@ private function getInnerXml(\SimpleXMLElement $SimpleXMLElement): string if ($inner_xml === false) { throw new \RuntimeException('Unable to serialize to XML'); } - $inner_xml = str_replace(['<'.$element_name.'>', '', '<'.$element_name.'/>'], '', $inner_xml); - $inner_xml = trim($inner_xml); - return $inner_xml; + + $inner_xml = str_replace(['<' . $element_name . '>', '', '<' . $element_name . '/>'], '', $inner_xml); + return trim($inner_xml); } } diff --git a/generator/src/PhpStanFunctions/PhpStanFunction.php b/generator/src/PhpStanFunctions/PhpStanFunction.php index c6054de2..5b6189fc 100644 --- a/generator/src/PhpStanFunctions/PhpStanFunction.php +++ b/generator/src/PhpStanFunctions/PhpStanFunction.php @@ -1,19 +1,17 @@ returnType = new PhpStanType(\array_shift($signature)); + + $this->phpStanType = new PhpStanType(\array_shift($signature)); foreach ($signature as $name => $type) { $param = new PhpStanParameter($name, $type); $this->parameters[$param->getName()] = $param; } } - + public function getReturnType(): PhpStanType { - return $this->returnType; + return $this->phpStanType; } /** diff --git a/generator/src/PhpStanFunctions/PhpStanFunctionMapReader.php b/generator/src/PhpStanFunctions/PhpStanFunctionMapReader.php index f6987fd1..bc4b0382 100644 --- a/generator/src/PhpStanFunctions/PhpStanFunctionMapReader.php +++ b/generator/src/PhpStanFunctions/PhpStanFunctionMapReader.php @@ -1,5 +1,6 @@ functionMap = require 'phar://'.__DIR__.'/../../vendor/phpstan/phpstan/phpstan.phar/resources/functionMap.php'; + $this->functionMap = require 'phar://' . __DIR__ . '/../../vendor/phpstan/phpstan/phpstan.phar/resources/functionMap.php'; $this->customFunctionMap = require __DIR__ . '/../../config/CustomPhpStanFunctionMap.php'; } @@ -32,10 +33,12 @@ public function getFunction(string $functionName): PhpStanFunction $customMap = $this->customFunctionMap[$functionName] ?? null; if ($map && $customMap) { if ($customMap === $map) { - throw new \RuntimeException("Useless custom function map $functionName: ".var_export($customMap, true)."\nPlease delete this line from the custom file"); + throw new \RuntimeException(sprintf('Useless custom function map %s: ', $functionName) . var_export($customMap, true) . "\nPlease delete this line from the custom file"); } + $map = $customMap; } + return new PhpStanFunction($map); } } diff --git a/generator/src/PhpStanFunctions/PhpStanParameter.php b/generator/src/PhpStanFunctions/PhpStanParameter.php index 16deedaf..ac5aa4fb 100644 --- a/generator/src/PhpStanFunctions/PhpStanParameter.php +++ b/generator/src/PhpStanFunctions/PhpStanParameter.php @@ -1,5 +1,6 @@ name = $name; - $this->type = new PhpStanType($type, $writeOnly); + + $this->phpStanType = new PhpStanType($type, $writeOnly); } - /** - * @return string - */ public function getName(): string { return $this->name; @@ -39,6 +34,6 @@ public function getName(): string public function getType(): PhpStanType { - return $this->type; + return $this->phpStanType; } } diff --git a/generator/src/PhpStanFunctions/PhpStanType.php b/generator/src/PhpStanFunctions/PhpStanType.php index bf0e8fdb..17600218 100644 --- a/generator/src/PhpStanFunctions/PhpStanType.php +++ b/generator/src/PhpStanFunctions/PhpStanType.php @@ -1,5 +1,6 @@ types = ['null']; return; } + //first we try to parse the type string to have a list as clean as possible. $nullable = false; $falsable = false; @@ -49,43 +48,69 @@ public function __construct(string $data, bool $writeOnly = false) $returnTypes = $this->explodeTypes($data); //remove 'null' from the list to identify if the signature type should be nullable - if (($nullablePosition = \array_search('null', $returnTypes)) !== false) { + if (($nullablePosition = \array_search('null', $returnTypes, true)) !== false) { $nullable = true; \array_splice($returnTypes, (int) $nullablePosition, 1); } + //remove 'false' from the list to identify if the function return false on error - if (($falsablePosition = \array_search('false', $returnTypes)) !== false) { + if (($falsablePosition = \array_search('false', $returnTypes, true)) !== false) { $falsable = true; \array_splice($returnTypes, (int) $falsablePosition, 1); } + /** @var int $count */ $count = \count($returnTypes); if ($count === 0) { - throw new \RuntimeException('Error when trying to extract parameter type'); + $returnType = ''; } + foreach ($returnTypes as &$returnType) { $pos = \strpos($returnType, '?'); if ($pos !== false) { $nullable = true; $returnType = \str_replace('?', '', $returnType); } - //remove the parenthesis only if we are not dealing with a callable - if (\strpos($returnType, 'callable') === false) { + + // remove the parenthesis only if we are not dealing with a callable + if (str_contains($returnType, 'callable') === false) { $returnType = \str_replace(['(', ')'], '', $returnType); } - //here we deal with some weird phpstan typings - if ($returnType === 'non-empty-string') { + + // here we deal with some weird phpstan typings + if (str_contains($returnType, 'non-falsy-string')) { + $returnType = 'string'; + } + + if (str_contains($returnType, 'non-empty-string')) { + $returnType = 'string'; + } + + if (str_contains($returnType, '__stringAndStringable')) { $returnType = 'string'; - } elseif ($returnType === 'positive-int') { + } + + if ($returnType === 'positive-int') { $returnType = 'int'; } elseif (is_numeric($returnType)) { $returnType = 'int'; } - if (\strpos($returnType, 'list<') !== false) { + + if (str_contains($returnType, 'list<')) { $returnType = \str_replace('list', 'array', $returnType); } + + if (str_contains($returnType, 'int<')) { + $returnType = 'int'; + } + + if (\preg_match('/__benevolent\<(.*)\>/', $returnType, $regs)) { + $returnType = $regs[1]; + } + $returnType = Type::toRootNamespace($returnType); } + $this->types = array_unique($returnTypes); $this->nullable = $nullable; $this->falsable = $falsable; @@ -100,12 +125,14 @@ public function getDocBlockType(?int $errorType = null): string } elseif ($this->nullable && $errorType !== Method::NULLSY_TYPE) { $returnTypes[] = 'null'; } - $type = join('|', $returnTypes); + + $type = implode('|', $returnTypes); if ($type === 'bool' && !$this->nullable && $errorType === Method::FALSY_TYPE) { // If the function only returns a boolean, since false is for error, true is for success. // Let's replace this with a "void". return 'void'; } + return $type; } @@ -116,20 +143,20 @@ public function getSignatureType(?int $errorType = null): string $falsable = $errorType === Method::FALSY_TYPE ? false : $this->falsable; $types = $this->types; //no typehint exists for thoses cases - if (\array_intersect(self::NO_SIGNATURE_TYPES, $types)) { + if (\array_intersect(self::NO_SIGNATURE_TYPES, $types) !== []) { return ''; } foreach ($types as &$type) { if (\strpos($type, 'callable(') > -1) { $type = 'callable'; //strip callable type of its possible parenthesis and return (ex: callable(): void) - } elseif (\strpos($type, 'array<') !== false || \strpos($type, 'array{') !== false) { + } elseif (str_contains($type, 'array<') || str_contains($type, 'array{')) { $type = 'array'; //typed array has to be untyped - } elseif (\strpos($type, '[]') !== false) { + } elseif (str_contains($type, '[]')) { $type = 'iterable'; //generics cannot be typehinted and have to be turned into iterable - } elseif (\strpos($type, 'resource') !== false) { + } elseif (str_contains($type, 'resource')) { $type = ''; // resource cant be typehinted - } elseif (\strpos($type, 'null') !== false) { + } elseif (str_contains($type, 'null')) { $type = ''; // null is a real typehint } } @@ -137,18 +164,21 @@ public function getSignatureType(?int $errorType = null): string //if there are several distinct types, no typehint (we use distinct in case doc block contains several times the same type, for example array|array) if (count(array_unique($types)) > 1) { return ''; - } elseif (\in_array('void', $types) || (count($types) === 0 && !$nullable && !$falsable)) { + } + + if (\in_array('void', $types) || ($types === [] && !$nullable && !$falsable)) { return 'void'; } - $finalType = $types[0]; + $finalType = $types[0] ?? ''; if ($finalType === 'bool' && !$nullable && $errorType === Method::FALSY_TYPE) { // If the function only returns a boolean, since false is for error, true is for success. // Let's replace this with a "void". return 'void'; } - return ($nullable !== false ? '?' : '').$finalType; + + return ($nullable ? '?' : '') . $finalType; } public function isNullable(): bool diff --git a/generator/src/ScanObjectsCommand.php b/generator/src/ScanObjectsCommand.php index 330e08af..cc7fdb3d 100644 --- a/generator/src/ScanObjectsCommand.php +++ b/generator/src/ScanObjectsCommand.php @@ -1,5 +1,6 @@ getMethodsPaths(); - $res = $scanner->getMethods($paths); + $scannerResponse = $scanner->getMethods($paths); - foreach ($res->methods as $function) { + foreach ($scannerResponse->methods as $function) { $name = $function->getFunctionName(); - $output->writeln('Found method '.$name); + $output->writeln('Found method ' . $name); } - $output->writeln('These methods are overloaded: '.\implode(', ', $res->overloadedFunctions)); + $output->writeln('These methods are overloaded: ' . \implode(', ', $scannerResponse->overloadedFunctions)); return 0; } } diff --git a/generator/src/Scanner.php b/generator/src/Scanner.php index 67835752..ea283bde 100644 --- a/generator/src/Scanner.php +++ b/generator/src/Scanner.php @@ -1,33 +1,30 @@ path = $path; } /** @@ -36,7 +33,7 @@ public function __construct(string $path) public function getFunctionsPaths(): array { $finder = new Finder(); - $finder->in($this->path.'*/functions/')->name('*.xml')->sortByName(); + $finder->in($this->path . '*/functions/')->name('*.xml')->sortByName(); return iterator_to_array($finder); } @@ -64,6 +61,7 @@ private function getIgnoredFunctions(): array $this->ignoredFunctions = array_merge($ignoredFunctions, $specialCaseFunctions); } + return $this->ignoredFunctions; } @@ -74,8 +72,9 @@ private function getIgnoredFunctions(): array private function getIgnoredModules(): array { if ($this->ignoredModules === null) { - $this->ignoredModules = require __DIR__.'/../config/ignoredModules.php'; + $this->ignoredModules = require __DIR__ . '/../config/ignoredModules.php'; } + return $this->ignoredModules; } @@ -92,15 +91,18 @@ public function getMethods(array $paths): ScannerResponse $phpStanFunctionMapReader = new PhpStanFunctionMapReader(); $ignoredFunctions = $this->getIgnoredFunctions(); $ignoredFunctions = \array_combine($ignoredFunctions, $ignoredFunctions); + $ignoredModules = $this->getIgnoredModules(); $ignoredModules = \array_combine($ignoredModules, $ignoredModules); + foreach ($paths as $path) { - $module = \basename(\dirname($path, 2)); + $module = \basename(\dirname($path->getPath())); + if (isset($ignoredModules[$module])) { continue; } - $docPage = new DocPage($path); + $docPage = new DocPage($path->getPathname()); $isFalsy = $docPage->detectFalsyFunction(); $isNullsy = $docPage->detectNullsyFunction(); $isEmpty = $docPage->detectEmptyFunction(); @@ -109,20 +111,18 @@ public function getMethods(array $paths): ScannerResponse $functionObjects = $docPage->getMethodSynopsis(); if (count($functionObjects) > 1) { - $overloadedFunctions = array_merge($overloadedFunctions, \array_map(function ($functionObject) { - return $functionObject->methodname->__toString(); - }, $functionObjects)); - $overloadedFunctions = \array_filter($overloadedFunctions, function (string $functionName) use ($ignoredFunctions) { - return !isset($ignoredFunctions[$functionName]); - }); + $overloadedFunctions = array_merge($overloadedFunctions, \array_map(fn($functionObject) => $functionObject->methodname->__toString(), $functionObjects)); + $overloadedFunctions = \array_filter($overloadedFunctions, fn(string $functionName): bool => !isset($ignoredFunctions[$functionName])); continue; } + $rootEntity = $docPage->loadAndResolveFile(); foreach ($functionObjects as $functionObject) { $function = new Method($functionObject, $rootEntity, $docPage->getModule(), $phpStanFunctionMapReader, $errorType); if (isset($ignoredFunctions[$function->getFunctionName()])) { continue; } + $functions[] = $function; } } diff --git a/generator/src/ScannerResponse.php b/generator/src/ScannerResponse.php index 647db147..8c2e2505 100644 --- a/generator/src/ScannerResponse.php +++ b/generator/src/ScannerResponse.php @@ -1,28 +1,24 @@ methods = $methods; - $this->overloadedFunctions = $overloadedFunctions; + public function __construct( + /** + * @readonly + */ + public array $methods, + /** + * @readonly + */ + public array $overloadedFunctions + ) { } } diff --git a/generator/src/Type.php b/generator/src/Type.php index b4569198..a25899c7 100644 --- a/generator/src/Type.php +++ b/generator/src/Type.php @@ -1,5 +1,6 @@ method = $method; } /* @@ -19,11 +15,12 @@ public function __construct(Method $method) */ public function getPhpPrototypeFunction(): string { - if ($this->method->getFunctionName()) { + if ($this->method->getFunctionName() !== '' && $this->method->getFunctionName() !== '0') { $returnType = $this->method->getSignatureReturnType(); - $returnType = $returnType ? ': '.$returnType : ''; - return 'function '.$this->method->getFunctionName().'('.$this->displayParamsWithType($this->method->getParams()).')'.$returnType.'{}'; + $returnType = $returnType !== '' && $returnType !== '0' ? ': ' . $returnType : ''; + return 'function ' . $this->method->getFunctionName() . '(' . $this->displayParamsWithType($this->method->getParams()) . ')' . $returnType . '{}'; } + return ''; } @@ -32,9 +29,10 @@ public function getPhpPrototypeFunction(): string */ public function getPhpFunctionalFunction(): string { - if ($this->getPhpPrototypeFunction()) { + if ($this->getPhpPrototypeFunction() !== '' && $this->getPhpPrototypeFunction() !== '0') { return $this->writePhpFunction(); } + return ''; } @@ -45,11 +43,13 @@ private function writePhpFunction(): string { $phpFunction = $this->method->getPhpDoc(); $returnType = $this->method->getSignatureReturnType(); - $returnType = $returnType ? ': '.$returnType : ''; + $returnType = $returnType !== '' && $returnType !== '0' ? ': ' . $returnType : ''; + $returnStatement = ''; if ($this->method->getSignatureReturnType() !== 'void') { $returnStatement = " return \$safeResult;\n"; } + $moduleName = $this->method->getModuleName(); $phpFunction .= "function {$this->method->getFunctionName()}({$this->displayParamsWithType($this->method->getParams())}){$returnType} @@ -58,25 +58,27 @@ private function writePhpFunction(): string "; if (!$this->method->isOverloaded()) { - $phpFunction .= ' $safeResult = '.$this->printFunctionCall($this->method); + $phpFunction .= ' $safeResult = ' . $this->printFunctionCall($this->method); } else { $method = $this->method; $inElse = false; do { - $lastParameter = $method->getParams()[count($method->getParams())-1]; + $lastParameter = $method->getParams()[count($method->getParams()) - 1]; if ($inElse) { $phpFunction .= ' else'; } else { $phpFunction .= ' '; } + if ($lastParameter->isVariadic()) { $defaultValueToString = '[]'; } else { $defaultValue = $lastParameter->getDefaultValue(); $defaultValueToString = $this->defaultValueToString($defaultValue); } - $phpFunction .= 'if ($'.$lastParameter->getParameterName().' !== '.$defaultValueToString.') {'."\n"; - $phpFunction .= ' $safeResult = '.$this->printFunctionCall($method)."\n"; + + $phpFunction .= 'if ($' . $lastParameter->getParameterName() . ' !== ' . $defaultValueToString . ') {' . "\n"; + $phpFunction .= ' $safeResult = ' . $this->printFunctionCall($method) . "\n"; $phpFunction .= ' }'; $inElse = true; $method = $method->cloneAndRemoveAParameter(); @@ -84,41 +86,33 @@ private function writePhpFunction(): string break; } } while (true); - $phpFunction .= ' else {'."\n"; - $phpFunction .= ' $safeResult = '.$this->printFunctionCall($method)."\n"; + + $phpFunction .= ' else {' . "\n"; + $phpFunction .= ' $safeResult = ' . $this->printFunctionCall($method) . "\n"; $phpFunction .= ' }'; } - $phpFunction .= $this->generateExceptionCode($moduleName, $this->method).$returnStatement. '} -'; - - return $phpFunction; + return $phpFunction . ($this->generateExceptionCode($moduleName, $this->method) . $returnStatement . '} +'); } - private function generateExceptionCode(string $moduleName, Method $method) : string + private function generateExceptionCode(string $moduleName, Method $method): string { - switch ($method->getErrorType()) { - case Method::FALSY_TYPE: - $errorValue = 'false'; - break; - case Method::NULLSY_TYPE: - $errorValue = 'null'; - break; - case Method::EMPTY_TYPE: - $errorValue = "''"; - break; - default: - throw new \LogicException("Method doesn't have an error type"); - } + $errorValue = match ($method->getErrorType()) { + Method::FALSY_TYPE => 'false', + Method::NULLSY_TYPE => 'null', + Method::EMPTY_TYPE => "''", + default => throw new \LogicException("Method doesn't have an error type"), + }; // Special case for CURL: we need the first argument of the method if this is a resource. if ($moduleName === 'Curl') { $params = $method->getParams(); - if (\count($params) > 0 && in_array($params[0]->getParameterType(), ['CurlHandle', 'CurlMultiHandle', 'CurlShareHandle'])) { + if ($params !== [] && in_array($params[0]->getParameterType(), ['CurlHandle', 'CurlMultiHandle', 'CurlShareHandle'])) { $name = $params[0]->getParameterName(); return " - if (\$safeResult === $errorValue) { - throw CurlException::createFromPhpError(\$$name); + if (\$safeResult === {$errorValue}) { + throw CurlException::createFromPhpError(\${$name}); } "; } @@ -126,7 +120,7 @@ private function generateExceptionCode(string $moduleName, Method $method) : str $exceptionName = FileCreator::toExceptionName($moduleName); return " - if (\$safeResult === $errorValue) { + if (\$safeResult === {$errorValue}) { throw {$exceptionName}::createFromPhpError(); } "; @@ -134,7 +128,6 @@ private function generateExceptionCode(string $moduleName, Method $method) : str /** * @param Parameter[] $params - * @return string */ private function displayParamsWithType(array $params): string { @@ -142,49 +135,58 @@ private function displayParamsWithType(array $params): string $optDetected = false; foreach ($params as $param) { - $paramAsString = $param->getSignatureType(); + $paramAsString = ''; + + // parameters can not have type void + if ($param->getSignatureType() !== 'void') { + $paramAsString = $param->getSignatureType(); + } + if ($paramAsString !== '') { $paramAsString .= ' '; } $paramName = $param->getParameterName(); if ($param->isVariadic()) { - $paramAsString .= ' ...$'.$paramName; + $paramAsString .= ' ...$' . $paramName; } else { if ($param->isByReference()) { $paramAsString .= '&'; } - $paramAsString .= '$'.$paramName; + + $paramAsString .= '$' . $paramName; } if ($param->hasDefaultValue() || $param->isOptionalWithNoDefault()) { $optDetected = true; } + $defaultValue = $param->getDefaultValue(); if ($defaultValue !== null) { - $paramAsString .= ' = '.$this->defaultValueToString($defaultValue); + $paramAsString .= ' = ' . $this->defaultValueToString($defaultValue); } elseif ($optDetected && !$param->isVariadic()) { $paramAsString .= ' = null'; } + $paramsAsString[] = $paramAsString; } return implode(', ', $paramsAsString); } - private function printFunctionCall(Method $function): string + private function printFunctionCall(Method $method): string { - $functionCall = '\\'.$function->getFunctionName().'('; - $functionCall .= implode(', ', \array_map(function (Parameter $parameter) { + $functionCall = '\\' . $method->getFunctionName() . '('; + $functionCall .= implode(', ', \array_map(function (Parameter $parameter): string { $str = ''; if ($parameter->isVariadic()) { $str = '...'; } - return $str.'$'.$parameter->getParameterName(); - }, $function->getParams())); - $functionCall .= ');'; - return $functionCall; + + return $str . '$' . $parameter->getParameterName(); + }, $method->getParams())); + return $functionCall . ');'; } private function defaultValueToString(?string $defaultValue): string @@ -192,9 +194,11 @@ private function defaultValueToString(?string $defaultValue): string if ($defaultValue === null) { return 'null'; } + if ($defaultValue === '') { return "''"; } + return $defaultValue; } } diff --git a/generator/tests/ComposerJsonEditorTest.php b/generator/tests/ComposerJsonEditorTest.php index dc8b9441..9d7ba9d7 100644 --- a/generator/tests/ComposerJsonEditorTest.php +++ b/generator/tests/ComposerJsonEditorTest.php @@ -1,5 +1,6 @@ expectException(DatetimeException::class); - $datetime = DateTimeImmutable::createFromFormat('lol', 'super'); + DateTimeImmutable::createFromFormat('lol', 'super'); } public function testConstructorPreserveTimeAndTimezone(): void { - $timezone = new \DateTimeZone('Pacific/Chatham'); - $datetime = new DateTimeImmutable('now', $timezone); - $this->assertInstanceOf(DateTimeImmutable::class, $datetime); - $this->assertEquals($timezone, $datetime->getTimezone()); + $dateTimeZone = new \DateTimeZone('Pacific/Chatham'); + $dateTimeImmutable = new DateTimeImmutable('now', $dateTimeZone); + $this->assertInstanceOf(DateTimeImmutable::class, $dateTimeImmutable); + $this->assertEquals($dateTimeZone, $dateTimeImmutable->getTimezone()); } public function testCreateFromFormatPreserveTimeAndTimezone(): void { - $timezone = new \DateTimeZone('Pacific/Chatham'); - $datetime = DateTimeImmutable::createFromFormat('d-m-Y', '20-03-2006', $timezone); + $dateTimeZone = new \DateTimeZone('Pacific/Chatham'); + $datetime = DateTimeImmutable::createFromFormat('d-m-Y', '20-03-2006', $dateTimeZone); $this->assertInstanceOf(DateTimeImmutable::class, $datetime); $this->assertEquals('20-03-2006', $datetime->format('d-m-Y')); - $this->assertEquals($timezone, $datetime->getTimezone()); + $this->assertEquals($dateTimeZone, $datetime->getTimezone()); } public function testSafeDatetimeImmutableIsImmutable(): void { - $datetime1 = new DateTimeImmutable(); - $datetime2 = $datetime1->add(new \DateInterval('P1W')); + $dateTimeImmutable = new DateTimeImmutable(); + $datetime2 = $dateTimeImmutable->add(new \DateInterval('P1W')); - $this->assertNotSame($datetime1, $datetime2); + $this->assertNotSame($dateTimeImmutable, $datetime2); } public function testSetDate(): void @@ -72,6 +73,7 @@ public function testModify(): void $datetime = new \DateTimeImmutable(); $datetime = $datetime->setDate(2017, 4, 6); $datetime = $datetime->modify('+1 day'); + $safeDatime = new DateTimeImmutable(); $safeDatime = $safeDatime->setDate(2017, 4, 6); $safeDatime = $safeDatime->modify('+1 day'); @@ -83,7 +85,7 @@ public function testSetTimestamp(): void { $datetime = new \DateTimeImmutable('2000-01-01'); $safeDatime = new DateTimeImmutable('2000-01-01'); - $datetime = $datetime = $datetime->setTimestamp(12); + $datetime = $datetime->setTimestamp(12); $safeDatime = $safeDatime->setTimestamp(12); $this->assertEquals($datetime->getTimestamp(), $safeDatime->getTimestamp()); @@ -91,11 +93,11 @@ public function testSetTimestamp(): void public function testSetTimezone(): void { - $timezone = new \DateTimeZone('Pacific/Chatham'); + $dateTimeZone = new \DateTimeZone('Pacific/Chatham'); $datetime = new \DateTimeImmutable('2000-01-01'); $safeDatime = new DateTimeImmutable('2000-01-01'); - $datetime = $datetime->setTimezone($timezone); - $safeDatime = $safeDatime->setTimezone($timezone); + $datetime = $datetime->setTimezone($dateTimeZone); + $safeDatime = $safeDatime->setTimezone($dateTimeZone); $this->assertEquals($datetime->getTimezone(), $safeDatime->getTimezone()); } @@ -112,30 +114,30 @@ public function testSetTime(): void public function testAdd(): void { - $interval = new \DateInterval('P1M'); + $dateInterval = new \DateInterval('P1M'); $datetime = new \DateTimeImmutable('2000-01-01'); $safeDatime = new DateTimeImmutable('2000-01-01'); - $datetime = $datetime->add($interval); - $safeDatime = $safeDatime->add($interval); + $datetime = $datetime->add($dateInterval); + $safeDatime = $safeDatime->add($dateInterval); $this->assertEquals($datetime->getTimestamp(), $safeDatime->getTimestamp()); } public function testSub(): void { - $interval = new \DateInterval('P1M'); + $dateInterval = new \DateInterval('P1M'); $datetime = new \DateTimeImmutable('2000-01-01'); $safeDatime = new DateTimeImmutable('2000-01-01'); - $datetime = $datetime->sub($interval); - $safeDatime = $safeDatime->sub($interval); + $datetime = $datetime->sub($dateInterval); + $safeDatime = $safeDatime->sub($dateInterval); $this->assertEquals($datetime->getTimestamp(), $safeDatime->getTimestamp()); } - public function testSerialize() + public function testSerialize(): void { - $timezone = new \DateTimeZone('Pacific/Chatham'); - $safeDatetime = DateTimeImmutable::createFromFormat('d-m-Y', '20-03-2006', $timezone); + $dateTimeZone = new \DateTimeZone('Pacific/Chatham'); + $safeDatetime = DateTimeImmutable::createFromFormat('d-m-Y', '20-03-2006', $dateTimeZone); /** @var DateTimeImmutable $newDatetime */ $newDatetime = unserialize(serialize($safeDatetime)); @@ -145,12 +147,12 @@ public function testSerialize() public function testComparaison(): void { - $safeDateTime = new \Safe\DateTimeImmutable(); + $dateTimeImmutable = new \Safe\DateTimeImmutable(); $phpDateTime = new \DateTimeImmutable(); - $timeLimit = \DateInterval::createFromDateString('2 hours'); + $dateInterval = \DateInterval::createFromDateString('2 hours'); - $a = $safeDateTime->modify('+3 hours') < $safeDateTime->add($timeLimit); - $b = $phpDateTime->modify('+3 hours') < $phpDateTime->add($timeLimit); + $a = $dateTimeImmutable->modify('+3 hours') < $dateTimeImmutable->add($dateInterval); + $b = $phpDateTime->modify('+3 hours') < $phpDateTime->add($dateInterval); $this->assertEquals($b, $a); } @@ -159,20 +161,20 @@ public function testEquals(): void $phpDateTime = new \DateTimeImmutable(); $safeDateTime1 = \Safe\DateTimeImmutable::createFromFormat('Y-m-d H:i:s.u', $phpDateTime->format('Y-m-d H:i:s.u')); - $safeDateTime2 = new \Safe\DateTimeImmutable($safeDateTime1->format('Y-m-d H:i:s.u')); + $dateTimeImmutable = new \Safe\DateTimeImmutable($safeDateTime1->format('Y-m-d H:i:s.u')); $this->assertEquals($phpDateTime, $safeDateTime1); - $this->assertEquals($phpDateTime, $safeDateTime2); - $this->assertEquals($safeDateTime1, $safeDateTime2); + $this->assertEquals($phpDateTime, $dateTimeImmutable); + $this->assertEquals($safeDateTime1, $dateTimeImmutable); } //DatePeriod corrupts our DateTimeImmutable by setting their inner to null. //This bug cannot be solved without editing DatePeriod itself. public function testDatePeriodBug(): void { - $start = new \Safe\DateTimeImmutable('2020-01-01'); + $dateTimeImmutable = new \Safe\DateTimeImmutable('2020-01-01'); $end = (new \Safe\DateTimeImmutable('2020-01-03'))->modify('+1 day'); - $datePeriod = new \DatePeriod($start, new \DateInterval('P1D'), $end); + $datePeriod = new \DatePeriod($dateTimeImmutable, new \DateInterval('P1D'), $end); /** @var DateTimeImmutable $date */ foreach ($datePeriod as $date) { @@ -192,8 +194,8 @@ public function testSwitchBetweenRegularAndSafe(): void public function testSwitchBetweenRegularAndSafe2(): void { - $d = new \Safe\DateTimeImmutable('2019-01-01'); - $d2 = \Safe\DateTimeImmutable::createFromRegular($d->getInnerDateTime()); - $this->assertSame($d->format('Y-m-d H:i:s.u'), $d2->format('Y-m-d H:i:s.u')); + $dateTimeImmutable = new \Safe\DateTimeImmutable('2019-01-01'); + $d2 = \Safe\DateTimeImmutable::createFromRegular($dateTimeImmutable->getInnerDateTime()); + $this->assertSame($dateTimeImmutable->format('Y-m-d H:i:s.u'), $d2->format('Y-m-d H:i:s.u')); } } diff --git a/generator/tests/DateTimeTest.php b/generator/tests/DateTimeTest.php index ce4bf502..fa6b4db8 100644 --- a/generator/tests/DateTimeTest.php +++ b/generator/tests/DateTimeTest.php @@ -1,5 +1,6 @@ expectException(DatetimeException::class); - $datetime = DateTime::createFromFormat('lol', 'super'); + DateTime::createFromFormat('lol', 'super'); } public function testCreateFromFormatPreserveTimeAndTimezone(): void { - $timezone = new \DateTimeZone('Pacific/Chatham'); - $datetime = DateTime::createFromFormat('d-m-Y', '20-03-2006', $timezone); + $dateTimeZone = new \DateTimeZone('Pacific/Chatham'); + $datetime = DateTime::createFromFormat('d-m-Y', '20-03-2006', $dateTimeZone); $this->assertInstanceOf(DateTime::class, $datetime); $this->assertEquals('20-03-2006', $datetime->format('d-m-Y')); - $this->assertEquals($timezone, $datetime->getTimezone()); + $this->assertEquals($dateTimeZone, $datetime->getTimezone()); } public function testSetDate(): void diff --git a/generator/tests/DeprecateCommandTest.php b/generator/tests/DeprecateCommandTest.php index 2caf2548..75453db3 100644 --- a/generator/tests/DeprecateCommandTest.php +++ b/generator/tests/DeprecateCommandTest.php @@ -1,5 +1,6 @@ assertEquals('Exceptions/ApcException.php', DeprecateCommand::getExceptionFilePath('apc')); } -} \ No newline at end of file +} diff --git a/generator/tests/DocPageTest.php b/generator/tests/DocPageTest.php index 27760ea7..0e4c8f8b 100644 --- a/generator/tests/DocPageTest.php +++ b/generator/tests/DocPageTest.php @@ -1,12 +1,14 @@ assertTrue($pregMatch->detectFalsyFunction()); $this->assertFalse($implode->detectFalsyFunction()); $this->assertTrue($getCwd->detectFalsyFunction()); - $this->assertTrue($setTime->detectFalsyFunction()); + $this->assertFalse($setTime->detectFalsyFunction()); $this->assertTrue($filesize->detectFalsyFunction()); $this->assertTrue($mcryptDecrypt->detectFalsyFunction()); $this->assertTrue($fsockopen->detectFalsyFunction()); $this->assertFalse($arrayReplace->detectFalsyFunction()); - $this->assertTrue($date->detectFalsyFunction()); + $this->assertFalse($date->detectFalsyFunction()); $this->assertTrue($classImplement->detectFalsyFunction()); $this->assertTrue($getHeaders->detectFalsyFunction()); $this->assertTrue($gzopen->detectFalsyFunction()); $this->assertTrue($fopen->detectFalsyFunction()); } - public function testDetectNullsyFunction() + public function testDetectNullsyFunction(): void { - $implode = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/strings/functions/implode.xml'); + $docPage = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/strings/functions/implode.xml'); - $this->assertFalse($implode->detectNullsyFunction()); + $this->assertFalse($docPage->detectNullsyFunction()); } - public function testDetectEmptyFunction() + public function testDetectEmptyFunction(): void { - $pgHost = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/pgsql/functions/pg-host.xml'); + $docPage = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/pgsql/functions/pg-host.xml'); - $this->assertTrue($pgHost->detectEmptyFunction()); + $this->assertTrue($docPage->detectEmptyFunction()); } } diff --git a/generator/tests/GeneratedFilesTest.php b/generator/tests/GeneratedFilesTest.php index 021c3b70..b8b63b5e 100644 --- a/generator/tests/GeneratedFilesTest.php +++ b/generator/tests/GeneratedFilesTest.php @@ -1,5 +1,7 @@ assertSame('foo', sprintf('foo')); + $this->assertSame('foo', 'foo'); $this->assertSame('foobar', sprintf('foo%s', 'bar')); $this->assertSame('foobarbaz', sprintf('foo%s%s', 'bar', 'baz')); - set_error_handler(function () { + set_error_handler(function (): void { }); try { $this->expectException(\ArgumentCountError::class); @@ -32,7 +34,7 @@ public function testSprintf() } } - public function testPregMatch() + public function testPregMatch(): void { require_once __DIR__ . '/../../generated/pcre.php'; require_once __DIR__ . '/../../lib/Exceptions/SafeExceptionInterface.php'; @@ -46,7 +48,7 @@ public function testPregMatch() $this->assertSame($originalMatches, $matches); } - public function testObjects() + public function testObjects(): void { require_once __DIR__ . '/../../lib/special_cases.php'; require_once __DIR__ . '/../../lib/Exceptions/SafeExceptionInterface.php'; @@ -76,7 +78,7 @@ public function testObjects() * Tests that the limit parameter is nullable. * See https://github.com/thecodingmachine/safe/issues/56 */ - public function testPregSplit() + public function testPregSplit(): void { require_once __DIR__ . '/../../generated/pcre.php'; require_once __DIR__ . '/../../lib/Exceptions/SafeExceptionInterface.php'; @@ -90,7 +92,7 @@ public function testPregSplit() /** * Tests that parameters with "time()" default value are correctly handled. */ - public function testStrtotime() + public function testStrtotime(): void { require_once __DIR__ . '/../../generated/datetime.php'; require_once __DIR__ . '/../../lib/Exceptions/SafeExceptionInterface.php'; @@ -98,7 +100,7 @@ public function testStrtotime() $this->assertSame(\strtotime('+1 day'), strtotime('+1 day')); - set_error_handler(function () { + set_error_handler(function (): void { }); try { $this->expectException(DatetimeException::class); @@ -111,7 +113,7 @@ public function testStrtotime() /** * Tests that parameters signature can be not passed. See https://github.com/thecodingmachine/safe/issues/86 */ - public function testOpenSslSign() + public function testOpenSslSign(): void { require_once __DIR__ . '/../../generated/openssl.php'; require_once __DIR__ . '/../../lib/Exceptions/SafeExceptionInterface.php'; @@ -123,7 +125,7 @@ public function testOpenSslSign() $this->assertSame($signature, $signatureSafe); } - public function testOpenSslEncrypt() + public function testOpenSslEncrypt(): void { $result = \openssl_encrypt( 'test', diff --git a/generator/tests/MethodTest.php b/generator/tests/MethodTest.php index 82723aae..9ef269ed 100644 --- a/generator/tests/MethodTest.php +++ b/generator/tests/MethodTest.php @@ -1,5 +1,7 @@ getMethodSynopsis(); @@ -16,7 +18,7 @@ public function testGetFunctionName() $this->assertEquals('preg_match', $name); } - public function testGetFunctionType() + public function testGetFunctionType(): void { $docPage = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/pcre/functions/preg-match.xml'); $xmlObject = $docPage->getMethodSynopsis(); @@ -25,7 +27,7 @@ public function testGetFunctionType() $this->assertEquals('int', $type); } - public function testGetFunctionParam() + public function testGetFunctionParam(): void { $docPage = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/pcre/functions/preg-match.xml'); $xmlObject = $docPage->getMethodSynopsis(); @@ -35,7 +37,7 @@ public function testGetFunctionParam() $this->assertEquals('pattern', $params[0]->getParameterName()); } - public function testGetTypeHintFromRessource() + public function testGetTypeHintFromResource(): void { $docPage = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/strings/functions/sprintf.xml'); $xmlObject = $docPage->getMethodSynopsis(); @@ -43,7 +45,7 @@ public function testGetTypeHintFromRessource() $params = $method->getParams(); $this->assertEquals('string', $params[0]->getDocBlockType()); $this->assertEquals('string', $params[0]->getSignatureType()); - $this->assertEquals('string|int|float|bool', $params[1]->getDocBlockType()); + $this->assertEquals('string|int|float|bool|null', $params[1]->getDocBlockType()); $this->assertTrue($params[1]->isVariadic()); $this->assertEquals('', $params[1]->getSignatureType()); @@ -52,7 +54,7 @@ public function testGetTypeHintFromRessource() $method = new Method($xmlObject[0], $docPage->loadAndResolveFile(), $docPage->getModule(), new PhpStanFunctionMapReader(), Method::FALSY_TYPE); $params = $method->getParams(); $this->assertEquals('string', $params[0]->getDocBlockType()); - $this->assertEquals('callable', $params[1]->getDocBlockType()); + $this->assertEquals('callable(array):string', $params[1]->getDocBlockType()); $this->assertEquals('string', $params[0]->getSignatureType()); $this->assertEquals('callable', $params[1]->getSignatureType()); @@ -74,7 +76,7 @@ public function testGetTypeHintFromRessource() $this->assertEquals('\HashContext', $params[0]->getSignatureType()); } - public function testImapOpen5Parameter() + public function testImapOpen5Parameter(): void { $docPage = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/imap/functions/imap-open.xml'); $xmlObject = $docPage->getMethodSynopsis(); @@ -84,7 +86,7 @@ public function testImapOpen5Parameter() $this->assertEquals('array', $params[5]->getSignatureType()); } - public function testGetInitializer() + public function testGetInitializer(): void { $docPage = new DocPage(__DIR__ . '/../doc/doc-en/en/reference/apache/functions/apache-getenv.xml'); $xmlObject = $docPage->getMethodSynopsis(); diff --git a/generator/tests/PhpStanFunctions/PhpStanFunctionMapReaderTest.php b/generator/tests/PhpStanFunctions/PhpStanFunctionMapReaderTest.php index 2af9fd3f..9c0b4a5c 100644 --- a/generator/tests/PhpStanFunctions/PhpStanFunctionMapReaderTest.php +++ b/generator/tests/PhpStanFunctions/PhpStanFunctionMapReaderTest.php @@ -1,5 +1,7 @@ assertTrue($mapReader->hasFunction('strpos')); - $this->assertFalse($mapReader->hasFunction('foobar')); + $phpStanFunctionMapReader = new PhpStanFunctionMapReader(); + $this->assertTrue($phpStanFunctionMapReader->hasFunction('strpos')); + $this->assertFalse($phpStanFunctionMapReader->hasFunction('foobar')); } public function testGet(): void { - $mapReader = new PhpStanFunctionMapReader(); - $function = $mapReader->getFunction('apcu_fetch'); + $phpStanFunctionMapReader = new PhpStanFunctionMapReader(); + $phpStanFunction = $phpStanFunctionMapReader->getFunction('apcu_fetch'); // 'apcu_fetch' => ['mixed', 'key'=>'string|string[]', '&w_success='=>'bool'], - $this->assertSame('mixed', $function->getReturnType()->getDocBlockType()); - $parameters = $function->getParameters(); + $this->assertSame('mixed', $phpStanFunction->getReturnType()->getDocBlockType()); + $parameters = $phpStanFunction->getParameters(); $this->assertCount(2, $parameters); $this->assertSame('success', $parameters['success']->getName()); $this->assertSame('bool|null', $parameters['success']->getType()->getDocBlockType()); diff --git a/generator/tests/PhpStanFunctions/PhpStanTypeTest.php b/generator/tests/PhpStanFunctions/PhpStanTypeTest.php index 6db4e257..a22f9b16 100644 --- a/generator/tests/PhpStanFunctions/PhpStanTypeTest.php +++ b/generator/tests/PhpStanFunctions/PhpStanTypeTest.php @@ -1,5 +1,6 @@ assertEquals('array|string|int', $param->getDocBlockType()); - $this->assertEquals('', $param->getSignatureType()); + $phpStanType = new PhpStanType('array|string|int'); + $this->assertEquals('array|string|int', $phpStanType->getDocBlockType()); + $this->assertEquals('', $phpStanType->getSignatureType()); } public function testCallable(): void { - $param = new PhpStanType('callable(string): void'); - $this->assertEquals('callable(string): void', $param->getDocBlockType()); - $this->assertEquals('callable', $param->getSignatureType()); + $phpStanType = new PhpStanType('callable(string): void'); + $this->assertEquals('callable(string): void', $phpStanType->getDocBlockType()); + $this->assertEquals('callable', $phpStanType->getSignatureType()); } public function testGenerics(): void @@ -79,39 +80,39 @@ public function testNullable(): void public function testParenthesisOutsideOfCallable(): void { - $param = new PhpStanType('(?int)|(?string)'); - $this->assertEquals(true, $param->isNullable()); - $this->assertEquals('int|string|null', $param->getDocBlockType()); - $this->assertEquals('', $param->getSignatureType()); + $phpStanType = new PhpStanType('(?int)|(?string)'); + $this->assertEquals(true, $phpStanType->isNullable()); + $this->assertEquals('int|string|null', $phpStanType->getDocBlockType()); + $this->assertEquals('', $phpStanType->getSignatureType()); } public function testFalsable(): void { - $param = new PhpStanType('string|false'); - $this->assertEquals(true, $param->isFalsable()); - $this->assertEquals('string|false', $param->getDocBlockType()); - $this->assertEquals('string', $param->getSignatureType()); + $phpStanType = new PhpStanType('string|false'); + $this->assertEquals(true, $phpStanType->isFalsable()); + $this->assertEquals('string|false', $phpStanType->getDocBlockType()); + $this->assertEquals('string', $phpStanType->getSignatureType()); } public function testResource(): void { - $param = new PhpStanType('resource'); - $this->assertEquals('resource', $param->getDocBlockType()); - $this->assertEquals('', $param->getSignatureType()); + $phpStanType = new PhpStanType('resource'); + $this->assertEquals('resource', $phpStanType->getDocBlockType()); + $this->assertEquals('', $phpStanType->getSignatureType()); } public function testNamespace(): void { - $param = new PhpStanType('GMP'); - $this->assertEquals('\GMP', $param->getDocBlockType()); - $this->assertEquals('\GMP', $param->getSignatureType()); + $phpStanType = new PhpStanType('GMP'); + $this->assertEquals('\GMP', $phpStanType->getDocBlockType()); + $this->assertEquals('\GMP', $phpStanType->getSignatureType()); } public function testVoid(): void { $param = new PhpStanType(''); $this->assertEquals('', $param->getDocBlockType()); - $this->assertEquals('', $param->getSignatureType()); + $this->assertEquals('void', $param->getSignatureType()); $param = new PhpStanType('void'); $this->assertEquals('void', $param->getDocBlockType()); @@ -153,44 +154,44 @@ public function testErrorTypeInteraction(): void public function testDuplicateType(): void { - $param = new PhpStanType('array|array|array>'); - $this->assertEquals('array|array|array>', $param->getDocBlockType()); - $this->assertEquals('array', $param->getSignatureType()); + $phpStanType = new PhpStanType('array|array|array>'); + $this->assertEquals('array|array|array>', $phpStanType->getDocBlockType()); + $this->assertEquals('array', $phpStanType->getSignatureType()); } public function testNullOrFalseBecomingNull(): void { - $param = new PhpStanType('null|false'); - $this->assertEquals('null', $param->getDocBlockType(Method::FALSY_TYPE)); - $this->assertEquals('', $param->getSignatureType(Method::FALSY_TYPE)); + $phpStanType = new PhpStanType('null|false'); + $this->assertEquals('null', $phpStanType->getDocBlockType(Method::FALSY_TYPE)); + $this->assertEquals('', $phpStanType->getSignatureType(Method::FALSY_TYPE)); } public function testNotEmptyStringBecomingString(): void { - $param = new PhpStanType('non-empty-string|false'); - $this->assertEquals('string', $param->getDocBlockType(Method::FALSY_TYPE)); - $this->assertEquals('string', $param->getSignatureType(Method::FALSY_TYPE)); + $phpStanType = new PhpStanType('non-empty-string|false'); + $this->assertEquals('string', $phpStanType->getDocBlockType(Method::FALSY_TYPE)); + $this->assertEquals('string', $phpStanType->getSignatureType(Method::FALSY_TYPE)); } public function testPositiveIntBecomingInt(): void { - $param = new PhpStanType('positive-int'); - $this->assertEquals('int', $param->getDocBlockType()); - $this->assertEquals('int', $param->getSignatureType()); + $phpStanType = new PhpStanType('positive-int'); + $this->assertEquals('int', $phpStanType->getDocBlockType()); + $this->assertEquals('int', $phpStanType->getSignatureType()); } public function testListBecomingArray(): void { - $param = new PhpStanType('list|false'); - $this->assertEquals('array', $param->getDocBlockType(Method::FALSY_TYPE)); - $this->assertEquals('array', $param->getSignatureType(Method::FALSY_TYPE)); + $phpStanType = new PhpStanType('list|false'); + $this->assertEquals('array', $phpStanType->getDocBlockType(Method::FALSY_TYPE)); + $this->assertEquals('array', $phpStanType->getSignatureType(Method::FALSY_TYPE)); } public function testNumbersAreRemoved(): void { - $param = new PhpStanType('0|positive-int'); - $this->assertEquals('int', $param->getDocBlockType()); - $this->assertEquals('int', $param->getSignatureType()); + $phpStanType = new PhpStanType('0|positive-int'); + $this->assertEquals('int', $phpStanType->getDocBlockType()); + $this->assertEquals('int', $phpStanType->getSignatureType()); } } diff --git a/generator/tests/ScannerTest.php b/generator/tests/ScannerTest.php index 65babe38..f285ff46 100644 --- a/generator/tests/ScannerTest.php +++ b/generator/tests/ScannerTest.php @@ -1,5 +1,7 @@ getFunctionsPaths(); @@ -16,7 +18,7 @@ public function testGetMethodsPaths() $this->assertArrayNotHasKey(__DIR__.'/../doc/doc-en/en/reference/spl/appenditerator/getarrayiterator.xml', $paths); } - public function testGetFunctionsPaths() + public function testGetFunctionsPaths(): void { $scanner = new Scanner(__DIR__ . '/../doc/doc-en/en/reference/'); $paths = $scanner->getMethodsPaths(); diff --git a/generator/tests/SpecialCasesTest.php b/generator/tests/SpecialCasesTest.php index e5f97232..bbafbcd2 100644 --- a/generator/tests/SpecialCasesTest.php +++ b/generator/tests/SpecialCasesTest.php @@ -1,5 +1,7 @@ assertEquals(['test', 'test'], $data); } + \fclose($handle); } - public function testFgetcsvReturnFalseonEndOfFile() + public function testFgetcsvReturnFalseonEndOfFile(): void { require_once __DIR__.'/../../lib/special_cases.php'; require_once __DIR__.'/../../lib/Exceptions/SafeExceptionInterface.php'; @@ -51,6 +54,7 @@ public function testFgetcsvReturnFalseonEndOfFile() while (($data = fgetcsv($handle, 1000, ",")) !== false) { $this->assertEquals(['test', 'test'], $data); } + $this->assertEquals(false, $data); \fclose($handle); } diff --git a/generator/tests/TypeTest.php b/generator/tests/TypeTest.php index d2f69e6d..aecfaa6e 100644 --- a/generator/tests/TypeTest.php +++ b/generator/tests/TypeTest.php @@ -1,12 +1,14 @@ assertSame('\\stdClass', Type::toRootNamespace('stdClass')); $this->assertSame('\\SimpleXMLElement', Type::toRootNamespace('SimpleXMLElement')); diff --git a/generator/tests/rector/src/test.php b/generator/tests/rector/src/test.php index 61b4bee7..5cb4b09a 100644 --- a/generator/tests/rector/src/test.php +++ b/generator/tests/rector/src/test.php @@ -1,3 +1,5 @@ 'PREG_BAD_UTF8_OFFSET_ERROR', PREG_JIT_STACKLIMIT_ERROR => 'PREG_JIT_STACKLIMIT_ERROR', ]; - $errMsg = $errorMap[preg_last_error()] ?? 'Unknown PCRE error: '.preg_last_error(); + $errMsg = $errorMap[preg_last_error()] ?? 'Unknown PCRE error: ' . preg_last_error(); return new self($errMsg, \preg_last_error()); } } diff --git a/lib/Exceptions/SafeExceptionInterface.php b/lib/Exceptions/SafeExceptionInterface.php index fbea6ad2..cc7f71fc 100644 --- a/lib/Exceptions/SafeExceptionInterface.php +++ b/lib/Exceptions/SafeExceptionInterface.php @@ -1,9 +1,7 @@ = 80100) { - /** @phpstan-ignore-next-line */ $result = \fputcsv($stream, $fields, $separator, $enclosure, $escape, $eol); } else { $result = \fputcsv($stream, $fields, $separator, $enclosure, $escape); diff --git a/phpcs.xml.dist b/phpcs.xml.dist index e2025189..628d9c5e 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -7,7 +7,7 @@ - + lib diff --git a/phpstan.neon b/phpstan.neon index d6b61d51..96616367 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,4 +1,8 @@ parameters: + paths: + - ./lib + # The level 9 is the highest level (with check for mixed type) + level: 8 ignoreErrors: # A lot of functions are in extensions so it is ok not to find those includes: diff --git a/rector-migrate.php b/rector-migrate.php index 8bd9d7bd..514780b8 100644 --- a/rector-migrate.php +++ b/rector-migrate.php @@ -21,8 +21,6 @@ 'apcu_inc' => 'Safe\apcu_inc', 'apcu_sma_info' => 'Safe\apcu_sma_info', 'apc_fetch' => 'Safe\apc_fetch', - 'array_walk_recursive' => 'Safe\array_walk_recursive', - 'assert_options' => 'Safe\assert_options', 'base64_decode' => 'Safe\base64_decode', 'bindtextdomain' => 'Safe\bindtextdomain', 'bzclose' => 'Safe\bzclose', @@ -39,7 +37,6 @@ 'class_parents' => 'Safe\class_parents', 'class_uses' => 'Safe\class_uses', 'cli_set_process_title' => 'Safe\cli_set_process_title', - 'closelog' => 'Safe\closelog', 'com_create_guid' => 'Safe\com_create_guid', 'com_event_sink' => 'Safe\com_event_sink', 'com_load_typelib' => 'Safe\com_load_typelib', @@ -107,19 +104,16 @@ 'curl_getinfo' => 'Safe\curl_getinfo', 'curl_init' => 'Safe\curl_init', 'curl_multi_info_read' => 'Safe\curl_multi_info_read', - 'curl_multi_init' => 'Safe\curl_multi_init', 'curl_multi_setopt' => 'Safe\curl_multi_setopt', 'curl_setopt' => 'Safe\curl_setopt', - 'curl_share_errno' => 'Safe\curl_share_errno', 'curl_share_setopt' => 'Safe\curl_share_setopt', 'curl_unescape' => 'Safe\curl_unescape', 'curl_upkeep' => 'Safe\curl_upkeep', - 'date' => 'Safe\date', - 'date_parse' => 'Safe\date_parse', + 'date_create' => 'Safe\date_create', + 'date_create_immutable' => 'Safe\date_create_immutable', 'date_parse_from_format' => 'Safe\date_parse_from_format', 'date_sunrise' => 'Safe\date_sunrise', 'date_sunset' => 'Safe\date_sunset', - 'date_sun_info' => 'Safe\date_sun_info', 'db2_autocommit' => 'Safe\db2_autocommit', 'db2_bind_param' => 'Safe\db2_bind_param', 'db2_client_info' => 'Safe\db2_client_info', @@ -129,6 +123,7 @@ 'db2_free_result' => 'Safe\db2_free_result', 'db2_free_stmt' => 'Safe\db2_free_stmt', 'db2_get_option' => 'Safe\db2_get_option', + 'db2_num_rows' => 'Safe\db2_num_rows', 'db2_pclose' => 'Safe\db2_pclose', 'db2_rollback' => 'Safe\db2_rollback', 'db2_server_info' => 'Safe\db2_server_info', @@ -202,6 +197,7 @@ 'finfo_open' => 'Safe\finfo_open', 'flock' => 'Safe\flock', 'fopen' => 'Safe\fopen', + 'fpm_get_status' => 'Safe\fpm_get_status', 'fputcsv' => 'Safe\fputcsv', 'fread' => 'Safe\fread', 'fsockopen' => 'Safe\fsockopen', @@ -221,6 +217,7 @@ 'ftp_login' => 'Safe\ftp_login', 'ftp_mkdir' => 'Safe\ftp_mkdir', 'ftp_mlsd' => 'Safe\ftp_mlsd', + 'ftp_nb_get' => 'Safe\ftp_nb_get', 'ftp_nb_put' => 'Safe\ftp_nb_put', 'ftp_nlist' => 'Safe\ftp_nlist', 'ftp_pasv' => 'Safe\ftp_pasv', @@ -252,8 +249,6 @@ 'get_include_path' => 'Safe\get_include_path', 'get_meta_tags' => 'Safe\get_meta_tags', 'glob' => 'Safe\glob', - 'gmmktime' => 'Safe\gmmktime', - 'gmp_random_seed' => 'Safe\gmp_random_seed', 'gmstrftime' => 'Safe\gmstrftime', 'gnupg_adddecryptkey' => 'Safe\gnupg_adddecryptkey', 'gnupg_addencryptkey' => 'Safe\gnupg_addencryptkey', @@ -274,12 +269,10 @@ 'gzgetss' => 'Safe\gzgetss', 'gzinflate' => 'Safe\gzinflate', 'gzopen' => 'Safe\gzopen', - 'gzpassthru' => 'Safe\gzpassthru', 'gzread' => 'Safe\gzread', 'gzrewind' => 'Safe\gzrewind', 'gzuncompress' => 'Safe\gzuncompress', 'gzwrite' => 'Safe\gzwrite', - 'hash_hkdf' => 'Safe\hash_hkdf', 'hash_update_file' => 'Safe\hash_update_file', 'header_register_callback' => 'Safe\header_register_callback', 'hex2bin' => 'Safe\hex2bin', @@ -389,8 +382,6 @@ 'imagesettile' => 'Safe\imagesettile', 'imagestring' => 'Safe\imagestring', 'imagestringup' => 'Safe\imagestringup', - 'imagesx' => 'Safe\imagesx', - 'imagesy' => 'Safe\imagesy', 'imagetruecolortopalette' => 'Safe\imagetruecolortopalette', 'imagettfbbox' => 'Safe\imagettfbbox', 'imagettftext' => 'Safe\imagettftext', @@ -405,8 +396,6 @@ 'imap_body' => 'Safe\imap_body', 'imap_bodystruct' => 'Safe\imap_bodystruct', 'imap_check' => 'Safe\imap_check', - 'imap_clearflag_full' => 'Safe\imap_clearflag_full', - 'imap_close' => 'Safe\imap_close', 'imap_createmailbox' => 'Safe\imap_createmailbox', 'imap_deletemailbox' => 'Safe\imap_deletemailbox', 'imap_fetchbody' => 'Safe\imap_fetchbody', @@ -414,7 +403,6 @@ 'imap_fetchmime' => 'Safe\imap_fetchmime', 'imap_fetchstructure' => 'Safe\imap_fetchstructure', 'imap_fetch_overview' => 'Safe\imap_fetch_overview', - 'imap_gc' => 'Safe\imap_gc', 'imap_getacl' => 'Safe\imap_getacl', 'imap_getmailboxes' => 'Safe\imap_getmailboxes', 'imap_getsubscribed' => 'Safe\imap_getsubscribed', @@ -423,7 +411,6 @@ 'imap_listscan' => 'Safe\imap_listscan', 'imap_lsub' => 'Safe\imap_lsub', 'imap_mail' => 'Safe\imap_mail', - 'imap_mailboxmsginfo' => 'Safe\imap_mailboxmsginfo', 'imap_mail_compose' => 'Safe\imap_mail_compose', 'imap_mail_copy' => 'Safe\imap_mail_copy', 'imap_mail_move' => 'Safe\imap_mail_move', @@ -436,23 +423,21 @@ 'imap_rfc822_write_address' => 'Safe\imap_rfc822_write_address', 'imap_savebody' => 'Safe\imap_savebody', 'imap_setacl' => 'Safe\imap_setacl', - 'imap_setflag_full' => 'Safe\imap_setflag_full', 'imap_set_quota' => 'Safe\imap_set_quota', 'imap_sort' => 'Safe\imap_sort', 'imap_status' => 'Safe\imap_status', 'imap_subscribe' => 'Safe\imap_subscribe', 'imap_thread' => 'Safe\imap_thread', 'imap_timeout' => 'Safe\imap_timeout', - 'imap_undelete' => 'Safe\imap_undelete', 'imap_unsubscribe' => 'Safe\imap_unsubscribe', 'imap_utf8_to_mutf7' => 'Safe\imap_utf8_to_mutf7', 'inet_ntop' => 'Safe\inet_ntop', 'inflate_add' => 'Safe\inflate_add', 'inflate_get_read_len' => 'Safe\inflate_get_read_len', - 'inflate_get_status' => 'Safe\inflate_get_status', 'inflate_init' => 'Safe\inflate_init', 'ini_get' => 'Safe\ini_get', 'ini_set' => 'Safe\ini_set', + 'inotify_add_watch' => 'Safe\inotify_add_watch', 'inotify_init' => 'Safe\inotify_init', 'inotify_rm_watch' => 'Safe\inotify_rm_watch', 'iptcembed' => 'Safe\iptcembed', @@ -477,7 +462,6 @@ 'ldap_first_attribute' => 'Safe\ldap_first_attribute', 'ldap_first_entry' => 'Safe\ldap_first_entry', 'ldap_free_result' => 'Safe\ldap_free_result', - 'ldap_get_attributes' => 'Safe\ldap_get_attributes', 'ldap_get_dn' => 'Safe\ldap_get_dn', 'ldap_get_entries' => 'Safe\ldap_get_entries', 'ldap_get_option' => 'Safe\ldap_get_option', @@ -509,7 +493,6 @@ 'mb_chr' => 'Safe\mb_chr', 'mb_convert_encoding' => 'Safe\mb_convert_encoding', 'mb_detect_order' => 'Safe\mb_detect_order', - 'mb_encoding_aliases' => 'Safe\mb_encoding_aliases', 'mb_eregi_replace' => 'Safe\mb_eregi_replace', 'mb_ereg_replace' => 'Safe\mb_ereg_replace', 'mb_ereg_replace_callback' => 'Safe\mb_ereg_replace_callback', @@ -571,6 +554,8 @@ 'ob_end_clean' => 'Safe\ob_end_clean', 'ob_end_flush' => 'Safe\ob_end_flush', 'ob_flush' => 'Safe\ob_flush', + 'ob_get_clean' => 'Safe\ob_get_clean', + 'ob_get_flush' => 'Safe\ob_get_flush', 'ob_start' => 'Safe\ob_start', 'oci_bind_array_by_name' => 'Safe\oci_bind_array_by_name', 'oci_bind_by_name' => 'Safe\oci_bind_by_name', @@ -610,7 +595,6 @@ 'oci_statement_type' => 'Safe\oci_statement_type', 'oci_unregister_taf_callback' => 'Safe\oci_unregister_taf_callback', 'odbc_autocommit' => 'Safe\odbc_autocommit', - 'odbc_binmode' => 'Safe\odbc_binmode', 'odbc_columnprivileges' => 'Safe\odbc_columnprivileges', 'odbc_columns' => 'Safe\odbc_columns', 'odbc_commit' => 'Safe\odbc_commit', @@ -627,7 +611,6 @@ 'odbc_field_type' => 'Safe\odbc_field_type', 'odbc_foreignkeys' => 'Safe\odbc_foreignkeys', 'odbc_gettypeinfo' => 'Safe\odbc_gettypeinfo', - 'odbc_longreadlen' => 'Safe\odbc_longreadlen', 'odbc_pconnect' => 'Safe\odbc_pconnect', 'odbc_prepare' => 'Safe\odbc_prepare', 'odbc_primarykeys' => 'Safe\odbc_primarykeys', @@ -644,7 +627,6 @@ 'opcache_compile_file' => 'Safe\opcache_compile_file', 'opcache_get_status' => 'Safe\opcache_get_status', 'opendir' => 'Safe\opendir', - 'openlog' => 'Safe\openlog', 'openssl_cipher_iv_length' => 'Safe\openssl_cipher_iv_length', 'openssl_cipher_key_length' => 'Safe\openssl_cipher_key_length', 'openssl_cms_decrypt' => 'Safe\openssl_cms_decrypt', @@ -696,7 +678,6 @@ 'openssl_x509_read' => 'Safe\openssl_x509_read', 'output_add_rewrite_var' => 'Safe\output_add_rewrite_var', 'output_reset_rewrite_vars' => 'Safe\output_reset_rewrite_vars', - 'pack' => 'Safe\pack', 'parse_ini_file' => 'Safe\parse_ini_file', 'parse_ini_string' => 'Safe\parse_ini_string', 'parse_url' => 'Safe\parse_url', @@ -747,11 +728,10 @@ 'pg_socket' => 'Safe\pg_socket', 'pg_trace' => 'Safe\pg_trace', 'pg_update' => 'Safe\pg_update', - 'phpcredits' => 'Safe\phpcredits', - 'phpinfo' => 'Safe\phpinfo', 'php_sapi_name' => 'Safe\php_sapi_name', 'png2wbmp' => 'Safe\png2wbmp', 'posix_access' => 'Safe\posix_access', + 'posix_eaccess' => 'Safe\posix_eaccess', 'posix_getgrgid' => 'Safe\posix_getgrgid', 'posix_getgrnam' => 'Safe\posix_getgrnam', 'posix_getgroups' => 'Safe\posix_getgroups', @@ -780,7 +760,6 @@ 'pspell_add_to_personal' => 'Safe\pspell_add_to_personal', 'pspell_add_to_session' => 'Safe\pspell_add_to_session', 'pspell_clear_session' => 'Safe\pspell_clear_session', - 'pspell_config_create' => 'Safe\pspell_config_create', 'pspell_config_data_dir' => 'Safe\pspell_config_data_dir', 'pspell_config_dict_dir' => 'Safe\pspell_config_dict_dir', 'pspell_config_ignore' => 'Safe\pspell_config_ignore', @@ -874,6 +853,33 @@ 'rename' => 'Safe\rename', 'rewind' => 'Safe\rewind', 'rmdir' => 'Safe\rmdir', + 'rnp_decrypt' => 'Safe\rnp_decrypt', + 'rnp_dump_packets' => 'Safe\rnp_dump_packets', + 'rnp_dump_packets_to_json' => 'Safe\rnp_dump_packets_to_json', + 'rnp_ffi_create' => 'Safe\rnp_ffi_create', + 'rnp_ffi_set_pass_provider' => 'Safe\rnp_ffi_set_pass_provider', + 'rnp_import_keys' => 'Safe\rnp_import_keys', + 'rnp_import_signatures' => 'Safe\rnp_import_signatures', + 'rnp_key_export' => 'Safe\rnp_key_export', + 'rnp_key_export_autocrypt' => 'Safe\rnp_key_export_autocrypt', + 'rnp_key_export_revocation' => 'Safe\rnp_key_export_revocation', + 'rnp_key_get_info' => 'Safe\rnp_key_get_info', + 'rnp_key_remove' => 'Safe\rnp_key_remove', + 'rnp_key_revoke' => 'Safe\rnp_key_revoke', + 'rnp_list_keys' => 'Safe\rnp_list_keys', + 'rnp_load_keys' => 'Safe\rnp_load_keys', + 'rnp_load_keys_from_path' => 'Safe\rnp_load_keys_from_path', + 'rnp_locate_key' => 'Safe\rnp_locate_key', + 'rnp_op_encrypt' => 'Safe\rnp_op_encrypt', + 'rnp_op_generate_key' => 'Safe\rnp_op_generate_key', + 'rnp_op_sign' => 'Safe\rnp_op_sign', + 'rnp_op_sign_cleartext' => 'Safe\rnp_op_sign_cleartext', + 'rnp_op_sign_detached' => 'Safe\rnp_op_sign_detached', + 'rnp_op_verify' => 'Safe\rnp_op_verify', + 'rnp_op_verify_detached' => 'Safe\rnp_op_verify_detached', + 'rnp_save_keys' => 'Safe\rnp_save_keys', + 'rnp_save_keys_to_path' => 'Safe\rnp_save_keys_to_path', + 'rnp_supported_features' => 'Safe\rnp_supported_features', 'rpmaddtag' => 'Safe\rpmaddtag', 'rrd_create' => 'Safe\rrd_create', 'rrd_first' => 'Safe\rrd_first', @@ -919,7 +925,6 @@ 'shm_put_var' => 'Safe\shm_put_var', 'shm_remove' => 'Safe\shm_remove', 'shm_remove_var' => 'Safe\shm_remove_var', - 'shuffle' => 'Safe\shuffle', 'simplexml_import_dom' => 'Safe\simplexml_import_dom', 'simplexml_load_file' => 'Safe\simplexml_load_file', 'simplexml_load_string' => 'Safe\simplexml_load_string', @@ -927,6 +932,7 @@ 'socket_addrinfo_bind' => 'Safe\socket_addrinfo_bind', 'socket_addrinfo_connect' => 'Safe\socket_addrinfo_connect', 'socket_addrinfo_lookup' => 'Safe\socket_addrinfo_lookup', + 'socket_atmark' => 'Safe\socket_atmark', 'socket_bind' => 'Safe\socket_bind', 'socket_connect' => 'Safe\socket_connect', 'socket_create' => 'Safe\socket_create', @@ -960,7 +966,6 @@ 'sodium_crypto_auth_verify' => 'Safe\sodium_crypto_auth_verify', 'sodium_crypto_box_open' => 'Safe\sodium_crypto_box_open', 'sodium_crypto_box_seal_open' => 'Safe\sodium_crypto_box_seal_open', - 'sodium_crypto_generichash_update' => 'Safe\sodium_crypto_generichash_update', 'sodium_crypto_secretbox_open' => 'Safe\sodium_crypto_secretbox_open', 'sodium_crypto_sign_open' => 'Safe\sodium_crypto_sign_open', 'sodium_crypto_sign_verify_detached' => 'Safe\sodium_crypto_sign_verify_detached', @@ -1009,6 +1014,7 @@ 'ssh2_sftp_symlink' => 'Safe\ssh2_sftp_symlink', 'ssh2_sftp_unlink' => 'Safe\ssh2_sftp_unlink', 'ssh2_shell' => 'Safe\ssh2_shell', + 'stream_context_set_options' => 'Safe\stream_context_set_options', 'stream_context_set_params' => 'Safe\stream_context_set_params', 'stream_copy_to_stream' => 'Safe\stream_copy_to_stream', 'stream_filter_append' => 'Safe\stream_filter_append', @@ -1044,7 +1050,6 @@ 'swoole_event_del' => 'Safe\swoole_event_del', 'swoole_event_write' => 'Safe\swoole_event_write', 'symlink' => 'Safe\symlink', - 'syslog' => 'Safe\syslog', 'system' => 'Safe\system', 'tempnam' => 'Safe\tempnam', 'timezone_name_from_abbr' => 'Safe\timezone_name_from_abbr', @@ -1071,16 +1076,7 @@ 'xdiff_string_patch_binary' => 'Safe\xdiff_string_patch_binary', 'xmlrpc_set_type' => 'Safe\xmlrpc_set_type', 'xml_parser_free' => 'Safe\xml_parser_free', - 'xml_set_character_data_handler' => 'Safe\xml_set_character_data_handler', - 'xml_set_default_handler' => 'Safe\xml_set_default_handler', - 'xml_set_element_handler' => 'Safe\xml_set_element_handler', - 'xml_set_end_namespace_decl_handler' => 'Safe\xml_set_end_namespace_decl_handler', - 'xml_set_external_entity_ref_handler' => 'Safe\xml_set_external_entity_ref_handler', - 'xml_set_notation_decl_handler' => 'Safe\xml_set_notation_decl_handler', - 'xml_set_object' => 'Safe\xml_set_object', - 'xml_set_processing_instruction_handler' => 'Safe\xml_set_processing_instruction_handler', - 'xml_set_start_namespace_decl_handler' => 'Safe\xml_set_start_namespace_decl_handler', - 'xml_set_unparsed_entity_decl_handler' => 'Safe\xml_set_unparsed_entity_decl_handler', + 'xml_parser_set_option' => 'Safe\xml_parser_set_option', 'yaml_parse' => 'Safe\yaml_parse', 'yaml_parse_file' => 'Safe\yaml_parse_file', 'yaml_parse_url' => 'Safe\yaml_parse_url', diff --git a/tests/DateTimeImmutableTest.php b/tests/DateTimeImmutableTest.php index bfd207d5..21782ee4 100644 --- a/tests/DateTimeImmutableTest.php +++ b/tests/DateTimeImmutableTest.php @@ -29,7 +29,7 @@ public function testCreateFromInterface(\DateTimeInterface $dateTime): void self::assertSame($dateTime->format(\DATE_ATOM), $safeImmutableDate->format(\DATE_ATOM)); } - public function createFromInterfaces(): array + public static function createFromInterfaces(): array { return [ [new \DateTime('2022-11-29T14:17:34+00:00')],