diff --git a/CHANGELOG.md b/CHANGELOG.md index e14ab8b1..c540bee9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Add support for `Projects::updateDeployKey` * Add support for project push rules * Add support for additional parameters in `Projects::fork` +* Correct project forks list parameter handling * Add support for group hook endpoints * Add support for `job_inputs` and `job_variables_attributes` in `Jobs::play` * Add support for `inputs` in `Projects::createPipeline` diff --git a/src/Api/Projects.php b/src/Api/Projects.php index 88b2c5fc..4511fabf 100644 --- a/src/Api/Projects.php +++ b/src/Api/Projects.php @@ -849,28 +849,29 @@ public function languages(int|string $project_id): mixed * @param array $parameters { * * @var bool $archived Limit by archived status - * @var string $visibility Limit by visibility public, internal, or private - * @var string $order_by Return projects ordered by id, name, path, created_at, updated_at, - * last_activity_at, repository_size, storage_size, packages_size or - * wiki_size fields (default is created_at) - * @var string $sort Return projects sorted in asc or desc order (default is desc) - * @var string $search Return list of projects matching the search criteria - * @var bool $simple Return only the ID, URL, name, and path of each project - * @var bool $owned Limit by projects owned by the current user * @var bool $membership Limit by projects that the current user is a member of + * @var int $min_access_level Limit by current user minimal access level + * @var string $order_by Return projects ordered by id, name, path, created_at, updated_at, star_count, or last_activity_at + * @var bool $owned Limit by projects owned by the current user + * @var string $search Return list of projects matching the search criteria + * @var bool $simple Return only limited fields for each project + * @var string $sort Return projects sorted in asc or desc order * @var bool $starred Limit by projects starred by the current user * @var bool $statistics Include project statistics + * @var \DateTimeInterface $updated_after Limit results to projects last updated after the specified time + * @var \DateTimeInterface $updated_before Limit results to projects last updated before the specified time + * @var string $visibility Limit by visibility public, internal, or private + * @var bool $with_custom_attributes Include custom attributes in response * @var bool $with_issues_enabled Limit by enabled issues feature * @var bool $with_merge_requests_enabled Limit by enabled merge requests feature - * @var int $min_access_level Limit by current user minimal access level - * @var \DateTimeInterface $updated_before limit results to projects last updated before the specified time - * @var \DateTimeInterface $updated_after limit results to projects last updated after the specified time - * @var bool $with_custom_attributes Include custom attributes in response * } + * + * @throws UndefinedOptionsException If an option name is undefined + * @throws InvalidOptionsException If an option doesn't fulfill the specified validation rules */ public function forks(int|string $project_id, array $parameters = []): mixed { - $resolver = $this->createOptionsResolver(); + $resolver = new OptionsResolver(); $booleanNormalizer = function (Options $resolver, $value): string { return $value ? 'true' : 'false'; }; @@ -881,31 +882,30 @@ public function forks(int|string $project_id, array $parameters = []): mixed ->setAllowedTypes('archived', 'bool') ->setNormalizer('archived', $booleanNormalizer) ; - $resolver->setDefined('visibility') - ->setAllowedValues('visibility', ['public', 'internal', 'private']) + $resolver->setDefined('membership') + ->setAllowedTypes('membership', 'bool') + ->setNormalizer('membership', $booleanNormalizer) ; - $orderBy = [ - 'id', 'name', 'path', 'created_at', 'updated_at', 'last_activity_at', - 'repository_size', 'storage_size', 'packages_size', 'wiki_size', - ]; + $resolver->setDefined('min_access_level') + ->setAllowedValues('min_access_level', [null, 5, 10, 15, 20, 25, 30, 40, 50]) + ; + $orderBy = ['id', 'name', 'path', 'created_at', 'updated_at', 'star_count', 'last_activity_at']; $resolver->setDefined('order_by') ->setAllowedValues('order_by', $orderBy) ; - $resolver->setDefined('sort') - ->setAllowedValues('sort', ['asc', 'desc']) + $resolver->setDefined('owned') + ->setAllowedTypes('owned', 'bool') + ->setNormalizer('owned', $booleanNormalizer) + ; + $resolver->setDefined('search') + ->setAllowedTypes('search', 'string') ; - $resolver->setDefined('search'); $resolver->setDefined('simple') ->setAllowedTypes('simple', 'bool') ->setNormalizer('simple', $booleanNormalizer) ; - $resolver->setDefined('owned') - ->setAllowedTypes('owned', 'bool') - ->setNormalizer('owned', $booleanNormalizer) - ; - $resolver->setDefined('membership') - ->setAllowedTypes('membership', 'bool') - ->setNormalizer('membership', $booleanNormalizer) + $resolver->setDefined('sort') + ->setAllowedValues('sort', ['asc', 'desc']) ; $resolver->setDefined('starred') ->setAllowedTypes('starred', 'bool') @@ -915,29 +915,29 @@ public function forks(int|string $project_id, array $parameters = []): mixed ->setAllowedTypes('statistics', 'bool') ->setNormalizer('statistics', $booleanNormalizer) ; - $resolver->setDefined('with_issues_enabled') - ->setAllowedTypes('with_issues_enabled', 'bool') - ->setNormalizer('with_issues_enabled', $booleanNormalizer) - ; - $resolver->setDefined('with_merge_requests_enabled') - ->setAllowedTypes('with_merge_requests_enabled', 'bool') - ->setNormalizer('with_merge_requests_enabled', $booleanNormalizer) - ; - $resolver->setDefined('min_access_level') - ->setAllowedValues('min_access_level', [null, 10, 20, 30, 40, 50]) + $resolver->setDefined('updated_after') + ->setAllowedTypes('updated_after', \DateTimeInterface::class) + ->setNormalizer('updated_after', $datetimeNormalizer) ; $resolver->setDefined('updated_before') ->setAllowedTypes('updated_before', \DateTimeInterface::class) ->setNormalizer('updated_before', $datetimeNormalizer) ; - $resolver->setDefined('updated_after') - ->setAllowedTypes('updated_after', \DateTimeInterface::class) - ->setNormalizer('updated_after', $datetimeNormalizer) + $resolver->setDefined('visibility') + ->setAllowedValues('visibility', ['public', 'internal', 'private']) ; $resolver->setDefined('with_custom_attributes') ->setAllowedTypes('with_custom_attributes', 'bool') ->setNormalizer('with_custom_attributes', $booleanNormalizer) ; + $resolver->setDefined('with_issues_enabled') + ->setAllowedTypes('with_issues_enabled', 'bool') + ->setNormalizer('with_issues_enabled', $booleanNormalizer) + ; + $resolver->setDefined('with_merge_requests_enabled') + ->setAllowedTypes('with_merge_requests_enabled', 'bool') + ->setNormalizer('with_merge_requests_enabled', $booleanNormalizer) + ; return $this->get($this->getProjectPath($project_id, 'forks'), $resolver->resolve($parameters)); } diff --git a/tests/Api/ProjectsTest.php b/tests/Api/ProjectsTest.php index 4d6297c3..84c1204a 100644 --- a/tests/Api/ProjectsTest.php +++ b/tests/Api/ProjectsTest.php @@ -2120,7 +2120,7 @@ public function shouldGetForksUsingParameters(): void ->with('projects/1/forks', [ 'archived' => 'false', 'visibility' => 'public', - 'order_by' => 'id', + 'order_by' => 'star_count', 'sort' => 'asc', 'search' => 'term', 'simple' => 'true', @@ -2130,7 +2130,7 @@ public function shouldGetForksUsingParameters(): void 'statistics' => 'false', 'with_issues_enabled' => 'false', 'with_merge_requests_enabled' => 'false', - 'min_access_level' => 30, + 'min_access_level' => 15, 'updated_after' => $updated_after->format('c'), 'updated_before' => $updated_before->format('c'), 'with_custom_attributes' => 'true', @@ -2140,7 +2140,7 @@ public function shouldGetForksUsingParameters(): void $this->assertEquals($expectedArray, $api->forks(1, [ 'archived' => false, 'visibility' => 'public', - 'order_by' => 'id', + 'order_by' => 'star_count', 'sort' => 'asc', 'search' => 'term', 'simple' => true, @@ -2150,7 +2150,7 @@ public function shouldGetForksUsingParameters(): void 'statistics' => false, 'with_issues_enabled' => false, 'with_merge_requests_enabled' => false, - 'min_access_level' => 30, + 'min_access_level' => 15, 'updated_after' => $updated_after, 'updated_before' => $updated_before, 'with_custom_attributes' => true,