Completed
Push — master ( 40f202...d22295 )
by Dmitry
02:28
created

Runner   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 94.23%

Importance

Changes 0
Metric Value
wmc 15
lcom 1
cbo 1
dl 0
loc 86
ccs 49
cts 52
cp 0.9423
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A listJobs() 0 19 3
B getJobClass() 0 25 5
A dispatch() 0 16 3
A castArguments() 0 13 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
14 4
    public function __construct(Application $app)
15
    {
16 4
        $this->app = $app;
17 4
    }
18
19 1
    public function listJobs()
20
    {
21 1
        $classes = array_merge(
22 1
            $this->app->get(Filesystem::class)->listClasses('Jobs'),
23 1
            $this->app->get(Framework::class)->listClasses('Jobs')
24 1
        );
25
26 1
        $jobs = [];
27 1
        foreach($classes as $class) {
28 1
            list($name, $group) = array_map('strtolower', array_reverse(explode("\\", $class)));
29 1
            $nick = "$group.$name";
30
31 1
            if(!array_key_exists($nick, $jobs)) {
32 1
                $jobs[$nick] = $class;
33 1
            }
34 1
        }
35
36 1
        return $jobs;
37
    }
38
39 4
    public function getJobClass($nick)
40
    {
41 4
        if(!strstr($nick, '.')) {
42
            throw new LogicException("Incorrect nick - $nick");
43
        }
44
45 4
        list($group, $name) = array_map('ucfirst', explode('.', $nick));
46
47 4
        $className = "Jobs\\$group\\$name";
48
49 4
        $class = $this->app->get(Filesystem::class)->completeClassName($className);
50
51 4
        if(!class_exists($class)) {
52 3
            $frameworkClass = $this->app->get(Framework::class)->completeClassName($className);
53 3
            if(class_exists($frameworkClass)) {
54 3
                $class = $frameworkClass;
55 3
            }
56 3
        }
57
58 4
        if(!class_exists($class)) {
59
            throw new LogicException("No job $nick");
60
        }
61
62 4
        return $class;
63
    }
64
65 4
    public function dispatch($nick, $arguments = [])
66
    {
67 4
        $class = $this->getJobClass($nick);
68
69 4
        $instance = $this->app->get($class);
70 4
        if(array_key_exists(0, $arguments)) {
71 2
            $arguments = $this->castArguments($class, $arguments);
72 2
        }
73
74 4
        foreach($arguments as $k => $v) {
75 3
            $instance->$k = $v;
76 4
        }
77
78 4
        $container = $this->app->get(Container::class);
79 4
        return $container->call([$instance, 'run']);
80
    }
81
82 4
    private function castArguments($class, $arguments)
83
    {
84 2
        $reflection = new ReflectionClass($class);
85 2
        $properties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);
86 2
        if(count($properties) == 1) {
87
            return [
88 2
                $properties[0]->getName() => count($arguments) == 1
89 2
                    ? $arguments[0]
90 4
                    : implode(' ', $arguments)
91 4
            ];
92
        }
93
        return $arguments;
94
    }
95
}
96