Config::findFilesToIncludeInConfiguration()   B
last analyzed

Complexity

Conditions 7
Paths 11

Size

Total Lines 96
Code Lines 50

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 41
CRAP Score 7.0344

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 7
eloc 50
c 1
b 0
f 0
nc 11
nop 1
dl 0
loc 96
ccs 41
cts 45
cp 0.9111
crap 7.0344
rs 8.1575

How to fix   Long Method   

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
declare(strict_types=1);
4
5
namespace PhpTaskman\Core\Config;
6
7
use PhpTaskman\Core\Taskman;
8
9
final class Config
10
{
11
    /**
12
     * Find the files to include in the configuration.
13
     *
14
     * @param string $cwd
15
     *   The current working directory.
16
     *
17
     * @return string[]
18
     *   The list of all the YAML files to include.
19
     */
20 1
    public static function findFilesToIncludeInConfiguration($cwd)
21
    {
22
        // Check if composer.json exists.
23 1
        $composerPath = realpath($cwd . '/composer.json');
24
25 1
        if (false === $composerPath) {
26
            return [];
27
        }
28
29
        // Get the vendor-bin property from the composer.json.
30 1
        $composerConfig = Taskman::createJsonConfiguration([$composerPath]);
31 1
        $vendorDir = $composerConfig->get('vendor-dir', $cwd . '/vendor');
32
33
        // Keep a reference of the default filename that we need to load from
34
        // each packages.
35
        $configFilesToLoad = [
36 1
            'defaultConfig' => 'config/default.yml',
37
            'defaultCommand' => 'default.yml',
38
        ];
39
40
        // Keep a reference of the default filename that we need to load from
41
        // each packages.
42
        $commandsFilesToLoad = [
43 1
            'default' => 'taskman.yml.dist',
44
            'defaultOverride' => 'taskman.yml',
45
        ];
46
47
        // Check if composer.lock exists.
48 1
        $composerLockPath = realpath($cwd . '/composer.lock');
49
50 1
        if (false === $composerLockPath) {
51
            return [];
52
        }
53
54 1
        $composerLockConfig = Taskman::createJsonConfiguration(
55 1
            [$composerLockPath]
56
        );
57
58
        // Get the dependencies packages directories.
59 1
        $packageDirectories = array_filter(
60 1
            array_map(
61
                static function ($package) use ($vendorDir) {
62 1
                    return realpath($vendorDir . '/' . $package['name']);
63 1
                },
64 1
                array_merge(
65 1
                    $composerLockConfig->get('packages', []),
66 1
                    $composerLockConfig->get('packages-dev', [])
67
                )
68
            )
69
        );
70
71 1
        $packageDirectories[] = $cwd;
72
73 1
        $configs = [];
74 1
        $commands = [];
75
76
        // Loop over each composer.json, deduct the package directory and probe for files to include.
77 1
        foreach ($packageDirectories as $packageDirectory) {
78 1
            foreach ($configFilesToLoad as $taskmanFile) {
79 1
                $candidateFile = $packageDirectory . '/' . $taskmanFile;
80 1
                $configs[] = $candidateFile;
81
            }
82
83 1
            $composerConfig = Taskman::createJsonConfiguration(
84 1
                [$packageDirectory . '/composer.json']
85
            );
86
87 1
            foreach ($composerConfig->get('extra.taskman.files', []) as $commandFile) {
88
                $commandFile = $packageDirectory . '/' . $commandFile;
89
                $configs[] = $commandFile;
90
            }
91
92 1
            foreach ($commandsFilesToLoad as $taskmanFile) {
93 1
                $candidateFile = $packageDirectory . '/' . $taskmanFile;
94 1
                $commands[] = $candidateFile;
95
            }
96
        }
97
98
        $localConfigFiles = [
99 1
            __DIR__ . '/../../config/default.yml',
100
            __DIR__ . '/../../default.yml',
101 1
            static::getLocalConfigurationFilepath(),
102
        ];
103
104 1
        $configs = array_filter(
105 1
            array_filter(
106 1
                array_merge(
107 1
                    $configs,
108 1
                    $localConfigFiles,
109 1
                    $commands
110
                ),
111 1
                'file_exists'
112
            )
113
        );
114
115 1
        return array_values($configs);
116
    }
117
118
    /**
119
     * Get the local configuration filepath.
120
     *
121
     * @param string $configuration_file
122
     *   The default filepath.
123
     *
124
     * @return null|string
125
     *   The local configuration file path, or null if it doesn't exist.
126
     */
127 1
    public static function getLocalConfigurationFilepath($configuration_file = 'phptaskman/taskman.yml')
128
    {
129 1
        if ($config = getenv('PHPTASKMAN_CONFIG')) {
130
            return $config;
131
        }
132
133 1
        if ($config = getenv('XDG_CONFIG_HOME')) {
134
            return $config . '/' . $configuration_file;
135
        }
136
137 1
        if ($home = getenv('HOME')) {
0 ignored issues
show
Unused Code introduced by
The assignment to $home is dead and can be removed.
Loading history...
138 1
            return getenv('HOME') . '/.config/' . $configuration_file;
139
        }
140
    }
141
142
    /**
143
     * Resolve YAML configurations files containing imports.
144
     *
145
     * Handles circular dependencies by ignoring them.
146
     *
147
     * @param string[] ...$filepaths
148
     *   A list of YML filepath to parse.
149
     *
150
     * @return string[]
151
     *   The list of all the YAML files to include.
152
     */
153
    public static function resolveImports(...$filepaths)
154
    {
155
        return (new YamlRecursivePathsFinder($filepaths))
156
            ->getAllPaths();
157
    }
158
}
159