Completed
Push — master ( 500099...db58dc )
by Freek
03:15
created

CheckLinksCommand::getConcurrency()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 12
rs 9.4285
cc 3
eloc 6
nc 3
nop 0
1
<?php
2
3
namespace Spatie\LinkChecker;
4
5
use Exception;
6
use Illuminate\Console\Command;
7
use Spatie\Crawler\Crawler;
8
use Spatie\Crawler\CrawlObserver;
9
use Spatie\Crawler\CrawlProfile;
10
11
class CheckLinksCommand extends Command
12
{
13
    /**
14
     * The console command name.
15
     *
16
     * @var string
17
     */
18
    protected $signature = 'link-checker:run
19
                        {--url= : the url to be crawler}
20
                        {--profile= : The profiler to be used}
21
                        {--reporter= : The reporter to be used}
22
                        {--concurrency=10 : The amount of concurrent requests}
23
                        ';
24
    /**
25
     * The console command description.
26
     *
27
     * @var string
28
     */
29
    protected $description = 'Check all links';
30
31
    public function handle()
32
    {
33
        Crawler::create(config('laravel-link-checker.client_options', []))
34
            ->setCrawlProfile($this->getProfile())
35
            ->setCrawlObserver($this->getReporter())
36
            ->setConcurrency($this->getConcurrency())
37
            ->startCrawling($this->getUrlToBeCrawled());
38
39
        $this->info('All done!');
40
    }
41
42
    /**
43
     * Returns concurrency. If not found, simply returns a default value like
44
     * 10 (default from spatie/crawler).
45
     *
46
     * @return int
47
     */
48
    protected function getConcurrency(): int
49
    {
50
        if ($this->option('concurrency') !== null) {
51
            return $this->option('concurrency');
52
        }
53
54
        if (config('laravel-link-checker.concurrency') != '') {
55
            return config('laravel-link-checker.concurrency');
56
        }
57
58
        return 10;
59
    }
60
61
    /**
62
     * Determine the url to be crawled.
63
     *
64
     * @return null|string
65
     *
66
     * @throws \Exception
67
     */
68
    protected function getUrlToBeCrawled()
69
    {
70
        if (!is_null($this->option('url'))) {
71
            return $this->option('url');
72
        }
73
74
        if (config('laravel-link-checker.url') != '') {
75
            return config('laravel-link-checker.url');
76
        }
77
78
        if (config('app.url') != '') {
79
            return config('app.url');
80
        }
81
82
        throw new Exception('could not determine which url to be crawled.');
83
    }
84
85
    /**
86
     * Get the profile.
87
     */
88 View Code Duplication
    protected function getProfile(): CrawlProfile
0 ignored issues
show
Duplication introduced by Freek Van der Herten
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
89
    {
90
        if (!is_null($this->option('profile'))) {
91
            return app($this->option('profile'));
0 ignored issues
show
Bug introduced by freek
It seems like $this->option('profile') targeting Illuminate\Console\Command::option() can also be of type array; however, app() does only seem to accept string|null, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
92
        }
93
94
        if (config('laravel-link-checker.default_profile') != '') {
95
            return app(config('laravel-link-checker.default_profile'));
96
        }
97
98
        throw new Exception('Could not determine the profile to be used');
99
    }
100
101
    /**
102
     * Get the reporter.
103
     */
104 View Code Duplication
    protected function getReporter(): CrawlObserver
0 ignored issues
show
Duplication introduced by Freek Van der Herten
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
105
    {
106
        if (!is_null($this->option('reporter'))) {
107
            return app($this->option('reporter'));
0 ignored issues
show
Bug introduced by freek
It seems like $this->option('reporter') targeting Illuminate\Console\Command::option() can also be of type array; however, app() does only seem to accept string|null, maybe add an additional type check?

This check looks at variables that are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
108
        }
109
110
        if (config('laravel-link-checker.default_reporter') != '') {
111
            return app(config('laravel-link-checker.default_reporter'));
112
        }
113
114
        throw new Exception('Could not reporter the profile to be used');
115
    }
116
}
117