Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
33.33% covered (danger)
33.33%
2 / 6
CRAP
9.30% covered (danger)
9.30%
4 / 43
Config
0.00% covered (danger)
0.00%
0 / 1
33.33% covered (danger)
33.33%
2 / 6
259.73
9.30% covered (danger)
9.30%
4 / 43
 getDataFromRequest
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getDataFromCommand
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 setData
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getData
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 getProviderClassname
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 17
 getArgvInputCmd
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 19
1<?php
2
3namespace Qmp\Laravel\Ocr\Ocr;
4
5use Illuminate\Support\Arr;
6use Illuminate\Support\Str;
7use Qmp\Laravel\Ocr\Ocr\Providers\Abbyy\AbbyyProvider;
8use Qmp\Laravel\Ocr\Ocr\Providers\Google\GoogleProvider;
9
10use Symfony\Component\Console\Input\ArgvInput;
11use Symfony\Component\Console\Input\InputDefinition;
12use Symfony\Component\Console\Input\InputOption;
13use Symfony\Component\Console\Input\InputArgument;
14
15class Config
16{
17    /**
18     * options from request or artisan command
19     *
20     * @var stdClass
21     */
22    protected $data;
23
24    public function getDataFromRequest()
25    {
26        $this->setData(request()->all());
27    }
28
29    public function getDataFromCommand()
30    {
31        $this->setData($this->getArgvInputCmd()->getOptions());
32    }
33
34    public function setData(array $data = [])
35    {
36        $this->data = (object) $data;
37    }
38
39    public function getData()
40    {
41        return json_decode(json_encode($this->data), true);
42    }
43
44    public function getProviderClassname()
45    {
46        $provider = isset($this->data->provider) ? strtolower($this->data->provider) : null;
47
48        // Select from data_type
49        if (!$provider) {
50            $providers = [];
51
52            if (isset($this->data->data_type)) {
53                $providers = Arr::where(config('ocr.providers'), function ($value, $key) {
54                    return in_array(strtolower($this->data->data_type), $value);
55                });
56            }
57
58            if (count($providers) !== 1) {
59                $provider = config('ocr.default');
60            } else {
61                $provider = array_keys($providers)[0];
62            }
63        }
64
65        $provider = !in_array($provider, array_keys(config('ocr.providers'))) ? config('ocr.default') : $provider;
66
67        switch ($provider) {
68            case 'google':
69                return GoogleProvider::class;
70            case 'abbyy':
71                return AbbyyProvider::class;
72        }
73    }
74
75    private function getArgvInputCmd(): ArgvInput
76    {
77        $input = new ArgvInput();
78        $cmd = (string) $input;
79
80        $inputDef = new InputDefinition();
81        preg_match_all("/--([^= ]+)[= ]{0,1}([^ ]*)/", $cmd, $matches, PREG_SET_ORDER);
82        foreach ($matches as $match) {
83            $option = new InputOption($match[1], null, !empty($match[2]) ? 4 : 1);
84            $inputDef->addOption($option);
85        }
86
87        preg_match('/\'(?<command>.+)\'/i', $cmd, $matches);
88        if (isset($matches['command'])) {
89            $argv = new InputArgument((string) $matches['command'], 1);
90            $inputDef->addArgument($argv);
91        }
92
93        $argvs = array_filter(explode(' ', $cmd), function ($item) {
94            return !Str::startsWith($item, '-') &&  !Str::startsWith($item, "'");
95        });
96        foreach ($argvs as $argv) {
97            $argv = new InputArgument((string) $argv, 1);
98            $inputDef->addArgument($argv);
99        }
100
101        $input->bind($inputDef);
102
103        return $input;
104    }
105}