Passed
Pull Request — master (#28)
by Kevin
16:32
created

ZenstruckScheduleExtension::loadInternal()   F

Complexity

Conditions 12
Paths 512

Size

Total Lines 98
Code Lines 55

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 49
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 55
c 1
b 0
f 0
dl 0
loc 98
ccs 49
cts 49
cp 1
rs 3.4777
cc 12
nc 512
nop 2
crap 12

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Zenstruck\ScheduleBundle\DependencyInjection;
4
5
use Symfony\Component\Config\FileLocator;
6
use Symfony\Component\DependencyInjection\ContainerBuilder;
7
use Symfony\Component\DependencyInjection\Definition;
8
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
9
use Symfony\Component\DependencyInjection\Reference;
10
use Symfony\Component\HttpClient\HttpClient;
11
use Symfony\Component\HttpKernel\DependencyInjection\ConfigurableExtension;
12
use Symfony\Component\Lock\LockFactory;
13
use Symfony\Component\Process\Process;
14
use Zenstruck\ScheduleBundle\EventListener\ScheduleTimezoneSubscriber;
15
use Zenstruck\ScheduleBundle\EventListener\TaskConfigurationSubscriber;
16
use Zenstruck\ScheduleBundle\Schedule\Extension\EmailExtension;
17
use Zenstruck\ScheduleBundle\Schedule\Extension\EnvironmentExtension;
18
use Zenstruck\ScheduleBundle\Schedule\Extension\ExtensionHandler;
19
use Zenstruck\ScheduleBundle\Schedule\Extension\Handler\EmailHandler;
20
use Zenstruck\ScheduleBundle\Schedule\Extension\Handler\PingHandler;
21
use Zenstruck\ScheduleBundle\Schedule\Extension\Handler\SingleServerHandler;
22
use Zenstruck\ScheduleBundle\Schedule\Extension\Handler\WithoutOverlappingHandler;
23
use Zenstruck\ScheduleBundle\Schedule\Extension\PingExtension;
24
use Zenstruck\ScheduleBundle\Schedule\Extension\SingleServerExtension;
25
use Zenstruck\ScheduleBundle\Schedule\ScheduleBuilder;
26
use Zenstruck\ScheduleBundle\Schedule\SelfSchedulingCommand;
27
use Zenstruck\ScheduleBundle\Schedule\Task\Runner\MessageTaskRunner;
28
use Zenstruck\ScheduleBundle\Schedule\Task\Runner\PingTaskRunner;
29
use Zenstruck\ScheduleBundle\Schedule\Task\TaskRunner;
30
31
/**
32
 * @author Kevin Bond <[email protected]>
33
 */
34
final class ZenstruckScheduleExtension extends ConfigurableExtension
35 24
{
36
    protected function loadInternal(array $mergedConfig, ContainerBuilder $container): void
37 24
    {
38 24
        $container->registerForAutoconfiguration(ScheduleBuilder::class)
39
            ->addTag('schedule.builder')
40
        ;
41 24
42 24
        $container->registerForAutoconfiguration(TaskRunner::class)
43
            ->addTag('schedule.task_runner')
44
        ;
45 24
46 24
        $container->registerForAutoconfiguration(SelfSchedulingCommand::class)
47
            ->addTag('schedule.self_scheduling_command')
48
        ;
49 24
50 24
        $container->registerForAutoconfiguration(ExtensionHandler::class)
51
            ->addTag('schedule.extension_handler')
52
        ;
53 24
54 24
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
55
        $loader->load('services.xml');
56 24
57 24
        if (\class_exists(Process::class)) {
58
            $loader->load('process.xml');
59
        }
60
61 24
        $container
62 24
            ->getDefinition(TaskConfigurationSubscriber::class)
63
            ->setArgument(0, $mergedConfig['tasks'])
64
        ;
65 24
66 24
        if ($mergedConfig['without_overlapping_lock_factory'] || \class_exists(LockFactory::class)) {
67
            $loader->load('without_overlapping.xml');
68
        }
69 24
70
        if ($mergedConfig['without_overlapping_lock_factory']) {
71 1
            $container
72 1
                ->getDefinition(WithoutOverlappingHandler::class)
73
                ->setArgument(0, new Reference($mergedConfig['without_overlapping_lock_factory']))
74
            ;
75
        }
76 24
77 1
        if ($mergedConfig['single_server_lock_factory']) {
78
            $loader->load('single_server.xml');
79
80 1
            $container
81 1
                ->getDefinition(SingleServerHandler::class)
82
                ->setArgument(0, new Reference($mergedConfig['single_server_lock_factory']))
83
            ;
84
        }
85 24
86 24
        if ($mergedConfig['http_client'] || \class_exists(HttpClient::class)) {
87
            $loader->load('http.xml');
88
        }
89 24
90
        if ($mergedConfig['http_client']) {
91 1
            $container
92 1
                ->getDefinition(PingHandler::class)
93
                ->setArgument(0, new Reference($mergedConfig['http_client']))
94
            ;
95
96 1
            $container
97 1
                ->getDefinition(PingTaskRunner::class)
98
                ->setArgument(0, new Reference($mergedConfig['http_client']))
99
            ;
100
        }
101 24
102 1
        if ($mergedConfig['timezone']) {
103
            $loader->load('timezone.xml');
104 1
            $container
105 1
                ->getDefinition(ScheduleTimezoneSubscriber::class)
106
                ->setArgument(0, $mergedConfig['timezone'])
107
            ;
108
        }
109 24
110 2
        if ($mergedConfig['messenger']['enabled']) {
111
            $loader->load('messenger.xml');
112
113 2
            $container
114 2
                ->getDefinition(MessageTaskRunner::class)
115 2
                ->setArgument(0, new Reference($mergedConfig['messenger']['message_bus']))
116 2
            ;
117 2
        }
118 2
119
        if ($mergedConfig['mailer']['enabled']) {
120
            $loader->load('mailer.xml');
121
122
            $container
123 24
                ->getDefinition(EmailHandler::class)
124 24
                ->setArguments([
125
                    new Reference($mergedConfig['mailer']['service']),
126 24
                    $mergedConfig['mailer']['default_from'],
127
                    $mergedConfig['mailer']['default_to'],
128
                    $mergedConfig['mailer']['subject_prefix'],
129 24
                ])
130 24
            ;
131
        }
132 24
133 2
        $this->registerScheduleExtensions($mergedConfig, $container);
134 2
    }
135 2
136
    private function registerScheduleExtensions(array $config, ContainerBuilder $container): void
137
    {
138
        /** @var Definition[] $definitions */
139 24
        $definitions = [];
140 1
        $idPrefix = 'zenstruck_schedule.extension.';
141 1
142 1
        if (!empty($config['schedule_extensions']['environments'])) {
143
            $definitions[$idPrefix.'environments'] = new Definition(
144
                EnvironmentExtension::class,
145
                [$config['schedule_extensions']['environments']]
146 24
            );
147 1
        }
148 1
149 1
        if ($config['schedule_extensions']['on_single_server']['enabled']) {
150 1
            $definitions[$idPrefix.'on_single_server'] = new Definition(
151 1
                SingleServerExtension::class,
152
                [$config['schedule_extensions']['on_single_server']['ttl']]
153
            );
154 1
        }
155
156
        if ($config['schedule_extensions']['email_on_failure']['enabled']) {
157
            $definition = new Definition(EmailExtension::class);
158 24
            $definition->setFactory([EmailExtension::class, 'scheduleFailure']);
159
            $definition->setArguments([
160
                $config['schedule_extensions']['email_on_failure']['to'],
161
                $config['schedule_extensions']['email_on_failure']['subject'],
162
            ]);
163
164 24
            $definitions[$idPrefix.'email_on_failure'] = $definition;
165 24
        }
166 4
167 4
        $pingMap = [
168 4
            'ping_before' => 'scheduleBefore',
169 4
            'ping_after' => 'scheduleAfter',
170 4
            'ping_on_success' => 'scheduleSuccess',
171 4
            'ping_on_failure' => 'scheduleFailure',
172
        ];
173
174 4
        foreach ($pingMap as $key => $method) {
175
            if ($config['schedule_extensions'][$key]['enabled']) {
176
                $definition = new Definition(PingExtension::class);
177
                $definition->setFactory([PingExtension::class, $method]);
178 24
                $definition->setArguments([
179 8
                    $config['schedule_extensions'][$key]['url'],
180
                    $config['schedule_extensions'][$key]['method'],
181
                    $config['schedule_extensions'][$key]['options'],
182 24
                ]);
183 24
184
                $definitions[$idPrefix.$key] = $definition;
185
            }
186
        }
187
188
        foreach ($definitions as $definition) {
189
            $definition->addTag('schedule.extension');
190
        }
191
192
        $container->addDefinitions($definitions);
193
    }
194
}
195