Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
64 / 64
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
DevToolsServiceProvider
100.00% covered (success)
100.00%
64 / 64
100.00% covered (success)
100.00%
2 / 2
2
100.00% covered (success)
100.00%
1 / 1
 getFactories
100.00% covered (success)
100.00%
63 / 63
100.00% covered (success)
100.00%
1 / 1
1
 getExtensions
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5/**
6 * Fast Forward Development Tools for PHP projects.
7 *
8 * This file is part of fast-forward/dev-tools project.
9 *
10 * @author   Felipe SayĆ£o Lobato Abreu <github@mentordosnerds.com>
11 * @license  https://opensource.org/licenses/MIT MIT License
12 *
13 * @see      https://github.com/php-fast-forward/
14 * @see      https://github.com/php-fast-forward/dev-tools
15 * @see      https://github.com/php-fast-forward/dev-tools/issues
16 * @see      https://php-fast-forward.github.io/dev-tools/
17 * @see      https://datatracker.ietf.org/doc/html/rfc2119
18 */
19
20namespace FastForward\DevTools\Container\ServiceProvider;
21
22use Composer\Plugin\Capability\CommandProvider;
23use FastForward\DevTools\Composer\Capability\DevToolsCommandProvider;
24use FastForward\DevTools\Composer\Json\ComposerJson;
25use FastForward\DevTools\Composer\Json\ComposerJsonInterface;
26use FastForward\DevTools\Console\CommandLoader\DevToolsCommandLoader;
27use FastForward\DevTools\Console\Formatter\LogLevelOutputFormatter;
28use FastForward\DevTools\Console\Logger\OutputFormatLogger;
29use FastForward\DevTools\Console\Logger\Processor\CommandInputProcessor;
30use FastForward\DevTools\Console\Logger\Processor\CommandOutputProcessor;
31use FastForward\DevTools\Console\Logger\Processor\CompositeContextProcessor;
32use FastForward\DevTools\Console\Logger\Processor\ContextProcessorInterface;
33use FastForward\DevTools\Console\Output\GithubActionOutput;
34use FastForward\DevTools\Console\Output\OutputCapabilityDetector;
35use FastForward\DevTools\Console\Output\OutputCapabilityDetectorInterface;
36use FastForward\DevTools\Environment\Environment;
37use FastForward\DevTools\Environment\EnvironmentInterface;
38use FastForward\DevTools\Environment\RuntimeEnvironment;
39use FastForward\DevTools\Environment\RuntimeEnvironmentInterface;
40use FastForward\DevTools\Filesystem\Filesystem;
41use FastForward\DevTools\Filesystem\FilesystemInterface;
42use FastForward\DevTools\Filesystem\FinderFactory;
43use FastForward\DevTools\Filesystem\FinderFactoryInterface;
44use FastForward\DevTools\Git\GitClient;
45use FastForward\DevTools\Git\GitClientInterface;
46use FastForward\DevTools\GitAttributes\CandidateProvider;
47use FastForward\DevTools\GitAttributes\CandidateProviderInterface;
48use FastForward\DevTools\GitAttributes\ExistenceChecker;
49use FastForward\DevTools\GitAttributes\ExistenceCheckerInterface;
50use FastForward\DevTools\GitAttributes\ExportIgnoreFilter;
51use FastForward\DevTools\GitAttributes\ExportIgnoreFilterInterface;
52use FastForward\DevTools\GitAttributes\Merger as GitAttributesMerger;
53use FastForward\DevTools\GitAttributes\MergerInterface as GitAttributesMergerInterface;
54use FastForward\DevTools\GitAttributes\Reader as GitAttributesReader;
55use FastForward\DevTools\GitAttributes\ReaderInterface as GitAttributesReaderInterface;
56use FastForward\DevTools\GitAttributes\Writer as GitAttributesWriter;
57use FastForward\DevTools\GitAttributes\WriterInterface as GitAttributesWriterInterface;
58use FastForward\DevTools\GitIgnore\Merger;
59use FastForward\DevTools\GitIgnore\MergerInterface;
60use FastForward\DevTools\GitIgnore\Reader;
61use FastForward\DevTools\GitIgnore\ReaderInterface;
62use FastForward\DevTools\GitIgnore\Writer;
63use FastForward\DevTools\GitIgnore\WriterInterface;
64use FastForward\DevTools\License\Generator;
65use FastForward\DevTools\License\GeneratorInterface;
66use FastForward\DevTools\License\Resolver;
67use FastForward\DevTools\License\ResolverInterface;
68use FastForward\DevTools\Path\DevToolsPathResolver;
69use FastForward\DevTools\Path\WorkingProjectPathResolver;
70use FastForward\DevTools\Php\Extension;
71use FastForward\DevTools\Php\ExtensionInterface;
72use FastForward\DevTools\PhpUnit\Coverage\CoverageSummaryLoader;
73use FastForward\DevTools\PhpUnit\Coverage\CoverageSummaryLoaderInterface;
74use FastForward\DevTools\Process\ColorPreservingProcessEnvironmentConfigurator;
75use FastForward\DevTools\Process\CompositeProcessEnvironmentConfigurator;
76use FastForward\DevTools\Process\ProcessBuilder;
77use FastForward\DevTools\Process\ProcessBuilderInterface;
78use FastForward\DevTools\Process\ProcessEnvironmentConfiguratorInterface;
79use FastForward\DevTools\Process\ProcessQueue;
80use FastForward\DevTools\Process\ProcessQueueInterface;
81use FastForward\DevTools\Process\XdebugDisablingProcessEnvironmentConfigurator;
82use FastForward\DevTools\Project\ProjectCapabilitiesResolver;
83use FastForward\DevTools\Project\ProjectCapabilitiesResolverInterface;
84use FastForward\DevTools\Psr\Clock\SystemClock;
85use FastForward\DevTools\Resource\DifferInterface;
86use FastForward\DevTools\Resource\UnifiedDiffer;
87use FastForward\DevTools\SelfUpdate\ComposerSelfUpdateRunner;
88use FastForward\DevTools\SelfUpdate\ComposerSelfUpdateScopeResolver;
89use FastForward\DevTools\SelfUpdate\ComposerVersionChecker;
90use FastForward\DevTools\SelfUpdate\SelfUpdateRunnerInterface;
91use FastForward\DevTools\SelfUpdate\SelfUpdateScopeResolverInterface;
92use FastForward\DevTools\SelfUpdate\VersionCheckerInterface;
93use FastForward\DevTools\SelfUpdate\VersionCheckNotifier;
94use FastForward\DevTools\SelfUpdate\VersionCheckNotifierInterface;
95use FastForward\DevTools\SelfUpdate\WorkingDirectorySwitcher;
96use FastForward\DevTools\SelfUpdate\WorkingDirectorySwitcherInterface;
97use Interop\Container\ServiceProviderInterface;
98use Psr\Clock\ClockInterface;
99use Psr\Log\LoggerInterface;
100use SebastianBergmann\Diff\Output\DiffOutputBuilderInterface;
101use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder;
102use Symfony\Component\Config\FileLocator;
103use Symfony\Component\Config\FileLocatorInterface;
104use Symfony\Component\Console\CommandLoader\CommandLoaderInterface;
105use Symfony\Component\Console\Input\ArgvInput;
106use Symfony\Component\Console\Input\InputInterface;
107use Symfony\Component\Console\Output\ConsoleOutput;
108use Symfony\Component\Console\Output\ConsoleOutputInterface;
109use Symfony\Component\Console\Output\OutputInterface;
110use Twig\Loader\FilesystemLoader;
111use Twig\Loader\LoaderInterface;
112
113use function DI\create;
114use function DI\factory;
115use function DI\get;
116
117/**
118 * Registers the services exposed by the DevTools container.
119 */
120class DevToolsServiceProvider implements ServiceProviderInterface
121{
122    /**
123     * @return array
124     */
125    public function getFactories(): array
126    {
127        return [
128            // Process
129            EnvironmentInterface::class => get(Environment::class),
130            RuntimeEnvironmentInterface::class => get(RuntimeEnvironment::class),
131            ExtensionInterface::class => get(Extension::class),
132            OutputCapabilityDetectorInterface::class => get(OutputCapabilityDetector::class),
133            ProcessBuilderInterface::class => get(ProcessBuilder::class),
134            ProcessEnvironmentConfiguratorInterface::class => create(CompositeProcessEnvironmentConfigurator::class)
135                ->constructor([
136                    get(ColorPreservingProcessEnvironmentConfigurator::class),
137                    get(XdebugDisablingProcessEnvironmentConfigurator::class),
138                ]),
139            ProcessQueueInterface::class => get(ProcessQueue::class),
140
141            // Self-update
142            SelfUpdateRunnerInterface::class => get(ComposerSelfUpdateRunner::class),
143            SelfUpdateScopeResolverInterface::class => get(ComposerSelfUpdateScopeResolver::class),
144            VersionCheckerInterface::class => get(ComposerVersionChecker::class),
145            VersionCheckNotifierInterface::class => get(VersionCheckNotifier::class),
146            WorkingDirectorySwitcherInterface::class => get(WorkingDirectorySwitcher::class),
147
148            // Filesystem
149            FinderFactoryInterface::class => get(FinderFactory::class),
150            FilesystemInterface::class => get(Filesystem::class),
151
152            // Composer
153            ComposerJsonInterface::class => get(ComposerJson::class),
154
155            // Project
156            ProjectCapabilitiesResolverInterface::class => get(ProjectCapabilitiesResolver::class),
157
158            // Git
159            GitClientInterface::class => get(GitClient::class),
160
161            // Symfony Components
162            FileLocatorInterface::class => factory(
163                static fn(): FileLocator => new FileLocator([
164                    WorkingProjectPathResolver::getProjectPath(),
165                    DevToolsPathResolver::getPackagePath(),
166                ])
167            ),
168
169            // PSR
170            LoggerInterface::class => get(OutputFormatLogger::class),
171            ClockInterface::class => get(SystemClock::class),
172
173            // Console
174            InputInterface::class => get(ArgvInput::class),
175            OutputInterface::class => get(ConsoleOutputInterface::class),
176            CommandLoaderInterface::class => get(DevToolsCommandLoader::class),
177            CommandProvider::class => get(DevToolsCommandProvider::class),
178            ConsoleOutputInterface::class => create(ConsoleOutput::class)
179                ->method('setVerbosity', ConsoleOutputInterface::VERBOSITY_VERBOSE)
180                ->method('setFormatter', get(LogLevelOutputFormatter::class)),
181            GithubActionOutput::class => create(GithubActionOutput::class)->constructor(
182                get(ConsoleOutputInterface::class),
183                get(RuntimeEnvironmentInterface::class)
184            ),
185            ContextProcessorInterface::class => create(CompositeContextProcessor::class)->constructor([
186                get(CommandInputProcessor::class),
187                get(CommandOutputProcessor::class),
188            ]),
189
190            // Coverage
191            CoverageSummaryLoaderInterface::class => get(CoverageSummaryLoader::class),
192
193            // Resource
194            DiffOutputBuilderInterface::class => get(UnifiedDiffOutputBuilder::class),
195            DifferInterface::class => get(UnifiedDiffer::class),
196
197            // GitIgnore
198            MergerInterface::class => get(Merger::class),
199            ReaderInterface::class => get(Reader::class),
200            WriterInterface::class => get(Writer::class),
201
202            // GitAttributes
203            CandidateProviderInterface::class => get(CandidateProvider::class),
204            ExistenceCheckerInterface::class => get(ExistenceChecker::class),
205            ExportIgnoreFilterInterface::class => get(ExportIgnoreFilter::class),
206            GitAttributesMergerInterface::class => get(GitAttributesMerger::class),
207            GitAttributesReaderInterface::class => get(GitAttributesReader::class),
208            GitAttributesWriterInterface::class => get(GitAttributesWriter::class),
209
210            // License
211            GeneratorInterface::class => get(Generator::class),
212            ResolverInterface::class => get(Resolver::class),
213
214            // Twig
215            LoaderInterface::class => create(FilesystemLoader::class)->constructor(
216                DevToolsPathResolver::getResourcesPath()
217            ),
218        ];
219    }
220
221    /**
222     * @return array
223     */
224    public function getExtensions(): array
225    {
226        return [];
227    }
228}