Completed
Push — master ( 6e390f...5a6d30 )
by Dmitry
07:10 queued 04:24
created

Runner   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 93.18%

Importance

Changes 0
Metric Value
wmc 16
c 0
b 0
f 0
lcom 1
cbo 1
dl 0
loc 86
ccs 41
cts 44
cp 0.9318
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A castArguments() 0 13 3
A __construct() 0 4 1
B getMapping() 0 25 5
A hasJob() 0 4 1
A getJobClass() 0 14 3
A dispatch() 0 15 3
1
<?php
2
3
namespace Basis;
4
5
use LogicException;
6
use League\Container\Container;
7
use ReflectionClass;
8
use ReflectionProperty;
9
10
class Runner
11
{
12
    private $app;
13
    private $mapping;
14
15 8
    public function __construct(Application $app)
16
    {
17 8
        $this->app = $app;
18 8
    }
19
20 8
    public function getMapping()
21
    {
22 8
        if (!$this->mapping) {
23 8
            $jobs = [];
24 8
            foreach ($this->app->get(Framework::class)->listClasses('Job') as $class) {
25 8
                $jobs[substr($class, strlen('Basis\\Job\\'))] = $class;
26
            }
27 8
            $serviceName = ucfirst($this->app->get(Config::class)['service']);
28 8
            foreach ($this->app->get(Filesystem::class)->listClasses('Job') as $class) {
29 8
                $jobs[$serviceName.'\\'.substr($class, strlen('Job\\'))] = $class;
30 8
                $jobs[substr($class, strlen('Job\\'))] = $class;
31
            }
32
33
34 8
            foreach ($jobs as $part => $class) {
35 8
                $nick = str_replace('\\', '.', $part);
36 8
                $jobs[$nick] = $class;
37 8
                $jobs[strtolower($nick)] = $class;
38
            }
39
40 8
            $this->mapping = $jobs;
41
        }
42
43 8
        return $this->mapping;
44
    }
45
46 8
    public function hasJob($nick)
47
    {
48 8
        return array_key_exists($nick, $this->getMapping());
49
    }
50
51 8
    public function getJobClass($nick)
52
    {
53 8
        $mapping = $this->getMapping();
54 8
        if (!array_key_exists($nick, $mapping)) {
55
            throw new LogicException("No job $nick");
56
        }
57
58 8
        $class = $mapping[$nick];
59
60 8
        if (!class_exists($class)) {
61
            throw new LogicException("No class for job $nick");
62
        }
63 8
        return $class;
64
    }
65
66 8
    public function dispatch($nick, $arguments = [])
67
    {
68 8
        $class = $this->getJobClass($nick);
69
70 8
        $instance = $this->app->get($class);
71 8
        if (array_key_exists(0, $arguments)) {
72 1
            $arguments = $this->castArguments($class, $arguments);
73
        }
74
75 8
        foreach ($arguments as $k => $v) {
76 4
            $instance->$k = $v;
77
        }
78
79 8
        return $this->app->call([$instance, 'run']);
80
    }
81
82 1
    private function castArguments($class, $arguments)
83
    {
84 1
        $reflection = new ReflectionClass($class);
85 1
        $properties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);
86 1
        if (count($properties) == 1) {
87
            return [
88 1
                $properties[0]->getName() => count($arguments) == 1
89 1
                    ? $arguments[0]
90 1
                    : implode(' ', $arguments)
91
            ];
92
        }
93
        return $arguments;
94
    }
95
}
96