GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( bca756...aea469 )
by Miles
03:04
created

ResourceProvider::parseEntity()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 4

Importance

Changes 3
Bugs 0 Features 2
Metric Value
c 3
b 0
f 2
dl 0
loc 16
ccs 10
cts 10
cp 1
rs 9.2
cc 4
eloc 9
nc 3
nop 1
crap 4
1
<?php
2
3
/**
4
 * This file is part of the m1\vars library
5
 *
6
 * (c) m1 <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 *
11
 * @package     m1/vars
12
 * @version     0.3.0
13
 * @author      Miles Croxford <[email protected]>
14
 * @copyright   Copyright (c) Miles Croxford <[email protected]>
15
 * @license     http://github.com/m1/vars/blob/master/LICENSE
16
 * @link        http://github.com/m1/vars/blob/master/README.MD Documentation
17
 */
18
19
namespace M1\Vars\Resource;
20
21
use M1\Vars\Loader\DirectoryLoader;
22
use M1\Vars\Traits\ResourceFlagsTrait;
23
use M1\Vars\Vars;
24
25
/**
26
 * Vars Resource Provider to separate the different formats of config (array/file/dir) into one resource
27
 *
28
 * @since 0.1.0
29
 */
30
class ResourceProvider extends AbstractResource
31
{
32
    use ResourceFlagsTrait;
33
34
    /**
35
     * The configuration entity -- could be a file, array or dir
36
     *
37
     * @var array|string
38
     */
39
    private $entity;
40
41
    /**
42
     * If the import was not relative then the content will be stored in this array
43
     *
44
     * @var array
45
     */
46
    private $parent_content = array();
47
48
    /**
49
     * Are dirs wanting to be recursively searched
50
     *
51
     * @var bool
52
     */
53
    private $recursive;
54
55
    /**
56
     * Is the import relative
57
     *
58
     * @var bool
59
     */
60
    private $relative;
61
62
    /**
63
     * Suppress file not found exceptions
64
     *
65
     * @var bool
66
     */
67
    private $suppress_file_exceptions = false;
68
69
    /**
70
     * The parent Vars class
71
     *
72
     * @var \M1\Vars\Vars
73
     */
74
    public $vars;
75
76
    /**
77
     * The ResourceProvider constructor creates the content from the entity
78
     *
79
     * @param \M1\Vars\Vars $vars      The calling Vars class
80
     * @param string|array  $entity    The configuration entity
81
     * @param bool          $relative  Is the entity relative to the calling entity or class
82
     * @param bool          $recursive If entity a dir, do you want to recursively check directories
83
     *
84
     * @throws \InvalidArgumentException If the entity passed is not a string or array
85
     */
86 75
    public function __construct(Vars $vars, $entity, $relative = true, $recursive = false)
87
    {
88 75
        if (!is_string($entity) && !is_array($entity)) {
89 1
            throw new \InvalidArgumentException('You can only pass strings or arrays as Resources');
90
        }
91
92 74
        $this->vars = $vars;
93 74
        $this->entity = $entity;
94 74
        $this->relative = $relative;
95 74
        $this->recursive = $recursive;
96 74
        $type = gettype($entity);
97
98 74
        $resources = $this->processEntity($entity, $type);
99
100 71
        if ($resources && !empty($resources)) {
101 69
            $this->createResources($resources, $type);
102 60
        }
103 62
    }
104
105
    /**
106
     * Creates the FileResource|ResourceProvider from the resource
107
     *
108
     * @param array  $resources The array of resources
109
     * @param string $type      The type of the resource
110
     */
111 69
    private function createResources(array $resources, $type)
112
    {
113 69
        foreach ($resources as $resource) {
114 69
            if ($type === "string") {
115 69
                $this->vars->pathsLoadedCheck($resource);
116
117 69
                if ($this->vars->cache->checkCache()) {
118 1
                    return;
119
                }
120
121 69
                if ($this->vars->resourceImported($resource)) {
122 1
                    continue;
123
                }
124
125 69
                $pos = $this->vars->addResource($resource);
126 69
                $resource = new FileResource($this, $resource);
127 60
                $this->vars->updateResource($resource, $pos);
128 60
            } else {
129 1
                $resource = new ResourceProvider($this->vars, $resource);
130
            }
131
132 60
            $this->addContent($resource->getContent());
133 60
        }
134 60
    }
135
136
    /**
137
     * Creates the content from the entity
138
     *
139
     * @param string|array $entity The configuration entity
140
     * @param string       $type   The type of entity
141
     *
142
     * @throws \InvalidArgumentException If the entity is not array|file, is readable or exists
143
     *
144
     * @returns array The array of resources
145
     */
146 74
    private function processEntity($entity, $type)
147
    {
148 74
        $resources = $entity;
149
150 74
        if ($type === 'string') {
151 74
            $entity = $this->parseEntity($entity);
0 ignored issues
show
Bug introduced by
It seems like $entity can also be of type array; however, M1\Vars\Resource\ResourceProvider::parseEntity() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
152
153 74
            if (is_file($entity)) {
154 69
                $resources = array($entity);
155 74
            } elseif (is_dir($entity)) {
156 7
                $resources = $this->getSupportedFilesInDir($entity);
157 14
            } elseif ($this->suppress_file_exceptions) {
158 2
                $resources = false;
159 2
            } else {
160 5
                throw new \InvalidArgumentException(sprintf("'%s' does not exist or is not readable", $entity));
161
            }
162 71
        }
163
164 71
        return $resources;
165
    }
166
167
    /**
168
     * Creates the content from the entity
169
     *
170
     * @param string $entity The configuration entity
171
     *
172
     * @returns string The parsed entity
173
     */
174 74
    private function parseEntity($entity)
175
    {
176 74
        $files = $this->explodeResourceIfElse($entity);
177
178 74
        foreach ($files as $f) {
179 74
            $this->suppress_file_exceptions = $this->checkSuppression($f);
180 74
            $this->recursive = $this->checkRecursive($f);
181 74
            $f = $this->trimFlags($f);
182
183 74
            if (file_exists($f) || !isset($files[1])) {
184 74
                return $f;
185
            }
186 4
        }
187
188 2
        return $f;
0 ignored issues
show
Bug introduced by
The variable $f does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
189
    }
190
191
    /**
192
     * Adds content to the parent contents
193
     *
194
     * @param array $content The content from the resource
195
     */
196 60
    private function addContent($content)
197
    {
198 60
        if ($this->relative) {
199 60
            $this->content = $this->mergeContents($this->content, $content);
200 60
        } else {
201 7
            $this->parent_content = $this->mergeContents($this->parent_content, $content);
202
        }
203 60
    }
204
205
    /**
206
     * Returns the supported files using the extensions from the loaders in the entity which is a directory
207
     *
208
     * @see \M1\Vars\Loader\LoaderProvider::getExtensions() \M1\Vars\Loader\LoaderProvider::getExtensions()
209
     * @see \M1\Vars\Loader\LoaderProvider::makeLoaders() \M1\Vars\Loader\LoaderProvider::makeLoaders()
210
     *
211
     * @param string $entity The resource entity
212
     *
213
     * @return array|bool Returns the supported files or false if no files were found
214
     */
215 7
    private function getSupportedFilesInDir($entity)
216
    {
217 7
        $dir_loader = new DirectoryLoader($entity, $this->recursive);
218 7
        $dir_loader->setSupports($this->vars->loader->getExtensions());
219 7
        $dir_loader->load();
220
221 7
        return $dir_loader->getContent();
222
    }
223
224
    /**
225
     * Merges various configuration contents into one array
226
     *
227
     * @param mixed $contents,... Optional number of arrays to merge
0 ignored issues
show
Bug introduced by
There is no parameter named $contents,.... Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
228
     *
229
     * @return array The merged contents
230
     */
231 62
    private function mergeContents()
232
    {
233 62
        $contents = func_get_args();
234 62
        return call_user_func_array('array_replace_recursive', $contents);
235
    }
236
237
    /**
238
     * Adds content to the parent content array
239
     *
240
     * @param array $content The content to add
241
     */
242 7
    public function addParentContent(array $content)
243
    {
244 7
        $this->parent_content = array_merge_recursive($this->parent_content, $content);
245 7
    }
246
247
    /**
248
     * Merges the content and the parent content together
249
     *
250
     * @return \M1\Vars\Resource\ResourceProvider
251
     */
252 62
    public function mergeParentContent()
253
    {
254 62
        $this->content = $this->mergeContents($this->content, $this->parent_content);
255
256 62
        return $this;
257
    }
258
259
    /**
260
     * Returns the parent content
261
     *
262
     * @return mixed The parent content
263
     */
264 47
    public function getParentContent()
265
    {
266 47
        return $this->parent_content;
267
    }
268
}
269