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