Skip to content

Commit 6329f22

Browse files
committed
Refactor distribution configuration
Signed-off-by: Tim Goudriaan <tim@codedmonkey.com>
1 parent a645d5b commit 6329f22

14 files changed

Lines changed: 156 additions & 76 deletions

docs/configuration-reference.md

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ dirigent:
2929
dynamic_update_delay: 'PT4H'
3030
periodic_updates: true
3131
periodic_update_interval: 'P1W'
32-
dist_mirroring:
32+
distributions:
3333
enabled: false
34-
preferred: true
34+
build: true
35+
mirror: false
36+
async_api_requests: false
3537
dev_packages: false
38+
preferred_mirror: true
3639
```
3740
3841
## dirigent (root)
@@ -107,18 +110,28 @@ The time between periodic updates being scheduled, defaults to once a week.
107110

108111
The time must be defined in the [ISO 8601 durations][iso-8601-durations] format.
109112

110-
## dist_mirroring
113+
## distributions
111114

112115
### enabled
113116

114117
Type: `boolean` | Default: `false`
115118

116-
Whether to enable or disable distribution mirroring
119+
Enable hosting of package distributions.
117120

118-
### preferred
121+
### build
122+
123+
Type: `boolean` | Default: `true`
124+
125+
Enable building distribution from the source.
126+
127+
### mirror
128+
129+
### async_api_requests
119130

120131
### dev_packages
121132

133+
### preferred_mirror
134+
122135
[iso-8601-durations]: https://en.wikipedia.org/wiki/ISO_8601#Durations
123136
[symfony]: https://symfony.com
124137
[symfony-docs-config]: https://symfony.com/doc/current/configuration.html

docs/dist-mirroring.md

Lines changed: 0 additions & 15 deletions
This file was deleted.

docs/distributions.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
sidebar_position: 31
3+
---
4+
5+
# Distributions
6+
7+
:::note
8+
9+
This page is a stub.
10+
11+
:::
12+
13+
Dirigent mirrors distributions from their original source if it's provided by the package, or builds the distribution
14+
from the source code.

docs/readme.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ sidebar_position: 1
88
- [Introduction](introduction.md)
99
- [Installation](installation/readme.md)
1010
- [Getting Started](getting-started.md)
11+
12+
---
13+
1114
- [Automatic Package Updates](automatic-package-updates.md)
12-
- [Dist Mirroring](dist-mirroring.md)
15+
- [Distributions](distributions.md)
1316

1417
---
1518

phpstan.dist.neon

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,10 @@ parameters:
1010
excludePaths:
1111
- tests/bootstrap.php
1212
ignoreErrors:
13+
- '#^Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition\:\:children\(\)\.$#'
1314
- '#CodedMonkey\\Dirigent\\Doctrine\\Entity\\AbstractVersionLink given\.#'
1415
- '#^PHPDoc tag @var with type CodedMonkey\\Dirigent\\Doctrine\\Entity\\AbstractVersionLink is not subtype of native type#'
1516
- '#^Property CodedMonkey\\Dirigent\\Doctrine\\Entity\\[a-zA-Z]+\:\:\$id \(int\|null\) is never assigned int so it can be removed from the property type\.$#'
16-
-
17-
message: '#^Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition\:\:children\(\)\.$#'
18-
identifier: method.notFound
19-
count: 1
20-
path: src/DependencyInjection/DirigentConfiguration.php
2117
-
2218
message: '#^Class CodedMonkey\\Dirigent\\Doctrine\\Entity\\TrackedEntity has an uninitialized readonly property \$createdAt\. Assign it in the constructor\.$#'
2319
identifier: property.uninitializedReadonly

src/Controller/ApiController.php

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public function root(RouterInterface $router): JsonResponse
5050
'notify-batch' => $router->generate('api_track_installations'),
5151
];
5252

53-
if ($this->getParameter('dirigent.dist_mirroring.enabled')) {
53+
if ($this->getParameter('dirigent.distributions.mirror')) {
5454
$distributionUrlPattern = u($router->getRouteCollection()->get('api_package_distribution')->getPath())
5555
->replace('{packageName}', '%package%')
5656
->replace('{packageVersion}', '%version%')
@@ -60,7 +60,7 @@ public function root(RouterInterface $router): JsonResponse
6060

6161
$data['mirrors'] = [[
6262
'dist-url' => $distributionUrlPattern,
63-
'preferred' => $this->getParameter('dirigent.dist_mirroring.preferred'),
63+
'preferred' => $this->getParameter('dirigent.distributions.preferred_mirror'),
6464
]];
6565
}
6666

@@ -103,7 +103,7 @@ public function packageMetadata(string $packageName): Response
103103
#[IsGrantedAccess]
104104
public function packageDistribution(string $packageName, string $packageVersion, string $reference, string $type): Response
105105
{
106-
if (!$this->getParameter('dirigent.dist_mirroring.enabled')) {
106+
if (!$this->getParameter('dirigent.distributions.enabled')) {
107107
throw $this->createNotFoundException();
108108
}
109109

@@ -112,17 +112,13 @@ public function packageDistribution(string $packageName, string $packageVersion,
112112
throw $this->createNotFoundException();
113113
}
114114

115-
if (null === $version = $this->versionRepository->findOneBy(['package' => $package, 'normalizedVersion' => $packageVersion])) {
116-
throw $this->createNotFoundException();
117-
}
115+
$this->messenger->dispatch(new UpdatePackage($package->getId()));
118116

119-
if ($version->isDevelopment() && !$this->getParameter('dirigent.dist_mirroring.dev_packages')) {
117+
if (null === $version = $this->versionRepository->findOneBy(['package' => $package, 'normalizedVersion' => $packageVersion])) {
120118
throw $this->createNotFoundException();
121119
}
122120

123-
$this->messenger->dispatch(new UpdatePackage($package->getId()));
124-
125-
if (!$this->distributionResolver->resolve($version, $reference, $type)) {
121+
if (!$this->distributionResolver->resolve($version, $reference, $type, async: $this->getParameter('dirigent.distributions.async_api_requests'))) {
126122
throw $this->createNotFoundException();
127123
}
128124
}

src/DependencyInjection/DirigentConfiguration.php

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace CodedMonkey\Dirigent\DependencyInjection;
44

5+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
6+
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
57
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
68
use Symfony\Component\Config\Definition\ConfigurationInterface;
79
use function Symfony\Component\String\u;
@@ -75,21 +77,25 @@ public function getConfigTreeBuilder(): TreeBuilder
7577
->booleanNode('periodic_updates')->defaultTrue()->end()
7678
->scalarNode('periodic_update_interval')->defaultValue('P1W')->end()
7779
->end()
78-
->end()
79-
->arrayNode('dist_builder')
80-
->canBeEnabled()
81-
->children()
82-
->booleanNode('dev_packages')->defaultFalse()->end()
83-
->end()
84-
->end()
85-
->arrayNode('dist_mirroring')
86-
->canBeEnabled()
87-
->children()
88-
->booleanNode('preferred')->defaultTrue()->end()
89-
->booleanNode('dev_packages')->defaultFalse()->end()
90-
->end()
9180
->end();
9281

82+
$this->addDistributionsSection($rootNode);
83+
9384
return $treeBuilder;
9485
}
86+
87+
private function addDistributionsSection(ArrayNodeDefinition|NodeDefinition $rootNode): void
88+
{
89+
$rootNode->children()
90+
->arrayNode('distributions')
91+
->canBeEnabled('Host the distributions of packages')
92+
->children()
93+
->booleanNode('build')->defaultTrue()->info('Build distributions from the source code (if not already provided)')->end()
94+
->booleanNode('mirror')->defaultFalse()->info('Mirror distributions from the original source (if provided)')->end()
95+
->booleanNode('async_api_requests')->defaultFalse()->info('Fetch distributions asynchronously instead of during execution (from the API)')->end()
96+
->booleanNode('dev_versions')->defaultFalse()->info('Include distributions of development versions')->end()
97+
->booleanNode('preferred_mirror')->defaultFalse()->info('Force Composer to download distributions from this registry first')->end()
98+
->end()
99+
->end();
100+
}
95101
}

src/DependencyInjection/DirigentExtension.php

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container
1919
$container->setParameter('dirigent.title', $mergedConfig['title']);
2020
$container->setParameter('dirigent.slug', $slug);
2121

22+
$this->registerDistributionsConfiguration($mergedConfig['distributions'], $container);
2223
$this->registerEncryptionConfiguration($mergedConfig['encryption'], $container);
2324

2425
$container->setParameter('dirigent.security.public_access', $mergedConfig['security']['public']);
@@ -34,20 +35,26 @@ protected function loadInternal(array $mergedConfig, ContainerBuilder $container
3435
$container->setParameter('dirigent.packages.dynamic_update_delay', $mergedConfig['packages']['dynamic_update_delay']);
3536
$container->setParameter('dirigent.packages.periodic_updates', $mergedConfig['packages']['periodic_updates']);
3637
$container->setParameter('dirigent.packages.periodic_update_interval', $mergedConfig['packages']['periodic_update_interval']);
37-
38-
$container->setParameter('dirigent.dist_builder.enabled', $mergedConfig['dist_builder']['enabled']);
39-
$container->setParameter('dirigent.dist_builder.dev_packages', $mergedConfig['dist_builder']['dev_packages']);
40-
41-
$container->setParameter('dirigent.dist_mirroring.enabled', $mergedConfig['dist_mirroring']['enabled']);
42-
$container->setParameter('dirigent.dist_mirroring.preferred', $mergedConfig['dist_mirroring']['preferred']);
43-
$container->setParameter('dirigent.dist_mirroring.dev_packages', $mergedConfig['dist_mirroring']['dev_packages']);
4438
}
4539

4640
public function getConfiguration(array $config, ContainerBuilder $container): ConfigurationInterface
4741
{
4842
return new DirigentConfiguration();
4943
}
5044

45+
private function registerDistributionsConfiguration(array $config, ContainerBuilder $container): void
46+
{
47+
$distributionsEnabled = $config['enabled'];
48+
49+
$container->setParameter('dirigent.distributions.enabled', $distributionsEnabled);
50+
$container->setParameter('dirigent.distributions.build', $distributionsEnabled && $config['build']);
51+
$container->setParameter('dirigent.distributions.mirror', $distributionsEnabled && $config['mirror']);
52+
53+
$container->setParameter('dirigent.distributions.async_api_requests', $config['async_api_requests']);
54+
$container->setParameter('dirigent.distributions.dev_versions', $config['dev_versions']);
55+
$container->setParameter('dirigent.distributions.preferred_mirror', $config['preferred_mirror']);
56+
}
57+
5158
/**
5259
* @param array{private_key: ?string, private_key_path: ?string, public_key: ?string, public_key_path: ?string, rotated_keys: array<string>, rotated_key_paths: array<string>} $config
5360
*/
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Message;
4+
5+
use Symfony\Component\Messenger\Attribute\AsMessage;
6+
7+
#[AsMessage]
8+
readonly class ResolveDistribution
9+
{
10+
public function __construct(
11+
public int $versionId,
12+
public string $reference,
13+
public string $type,
14+
) {
15+
}
16+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Message;
4+
5+
use CodedMonkey\Dirigent\Doctrine\Repository\VersionRepository;
6+
use CodedMonkey\Dirigent\Package\PackageDistributionResolver;
7+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
8+
9+
#[AsMessageHandler]
10+
readonly class ResolveDistributionHandler
11+
{
12+
public function __construct(
13+
private VersionRepository $versionRepository,
14+
private PackageDistributionResolver $distributionResolver,
15+
) {
16+
}
17+
18+
public function __invoke(ResolveDistribution $message): void
19+
{
20+
$version = $this->versionRepository->find($message->versionId);
21+
22+
$this->distributionResolver->resolve($version, $message->reference, $message->type, async: false);
23+
}
24+
}

0 commit comments

Comments
 (0)