Completed
Push — master ( 511c4e...a57a6b )
by recca
02:28
created

Generator::set()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 1
Bugs 1 Features 0
Metric Value
dl 0
loc 6
ccs 3
cts 3
cp 1
rs 9.4285
c 1
b 1
f 0
cc 1
eloc 3
nc 1
nop 2
crap 1
1
<?php
2
3
namespace Recca0120\Generator;
4
5
use Illuminate\Support\Arr;
6
use Illuminate\Support\Str;
7
use Illuminate\Filesystem\Filesystem;
8
use Recca0120\Generator\Fixers\UseSortFixer;
9
10
class Generator
11
{
12
    /**
13
     * $filesystem.
14
     *
15
     * @var \Illuminate\Filesystem\Filesystem
16
     */
17
    protected $filesystem;
18
19
    /**
20
     * $useSortFixer.
21
     *
22
     * @var \Recca0120\Generator\Fixers\UseSortFixer
23
     */
24
    protected $useSortFixer;
25
26
    /**
27
     * $attributes.
28
     *
29
     * @var array
30
     */
31
    protected $attributes = [];
32
33
    /**
34
     * __construct.
35
     *
36
     * @param \Illuminate\Filesystem\Filesystem $filesystem   [description]
37
     * @param \Recca0120\Generator\Fixers\UseSortFixers $useSortFixer [description]
38
     */
39 9
    public function __construct(Filesystem $filesystem = null, UseSortFixer $useSortFixer = null)
40
    {
41 9
        $this->filesystem = $filesystem ?: new Filesystem();
42 9
        $this->useSortFixer = $useSortFixer ?: new UseSortFixer();
43 9
        $this->useSortFixer->setSortType(UseSortFixer::SORT_TYPE_LENGTH);
44 9
    }
45
46
    /**
47
     * parseAttribute.
48
     *
49
     * @param string $value
50
     * @return array
51
     */
52 9
    protected function parseAttribute($value)
53
    {
54 9
        $alias = array_map('trim', explode(' as ', $value));
55 9
        $className = $alias[0];
56
57 9
        $dummyClass = class_basename(isset($alias[1]) === true ? $alias[1] : $className);
58 9
        $dummyNamespace = $this->getNamespace($className);
59
60 9
        $dummyModelVariable = Str::camel(Str::singular(
61 9
            preg_replace('/(Controller|Repository)$/', '', $dummyClass)
62 9
        ));
63
64 9
        $dummyCollectionVariable = Str::plural($dummyModelVariable);
65 9
        $dummyCollectionVariable = $dummyCollectionVariable === $dummyModelVariable ?
66 9
            $dummyModelVariable.'Collection' : $dummyCollectionVariable;
67
68 9
        $dummyRepositoryVariable = $dummyCollectionVariable;
69
70 9
        $dummyView = Str::snake(Str::plural($dummyModelVariable));
71 9
        $dummyRoute = Str::snake(Str::plural($dummyModelVariable));
72
73 9
        return compact(
74 9
            'dummyNamespace',
75 9
            'dummyClass',
76 9
            'dummyRepositoryVariable',
77 9
            'dummyCollectionVariable',
78 9
            'dummyModelVariable',
79 9
            'dummyView',
80
            'dummyRoute'
81 9
        );
82
    }
83
84
    /**
85
     * setFullBaseClass.
86
     *
87
     * @param string $value
88
     * @return static
89
     */
90 7
    public function setFullBaseClass($value)
91
    {
92 7
        $this->set('DummyFullBaseClass', $value);
93 7
        $attributes = $this->parseAttribute($value);
94 7
        extract($attributes);
95
96 7
        $this->set('DummyBaseClass', $dummyClass);
97 7
        if ($this->get('DummyNamespace') === $this->getNamespace($value)) {
98 2
            $this->remove('DummyFullBaseClass');
99 2
        }
100
101 7
        return $this;
102
    }
103
104
    /**
105
     * setFullRepositoryInterface.
106
     *
107
     * @param string $value
108
     * @return static
109
     */
110 3 View Code Duplication
    public function setFullRepositoryInterface($value)
1 ignored issue
show
Duplication introduced by
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...
111
    {
112 3
        $this->set('DummyFullRepositoryInterface', $value);
113 3
        $attributes = $this->parseAttribute($value);
114 3
        extract($attributes);
115
116 3
        return $this->setDefault('DummyNamespace', $dummyNamespace)
117 3
            ->setDefault('DummyClass', $dummyClass)
118 3
            ->setDefault('DummyRepositoryInterface', $dummyClass);
119
    }
120
121
    /**
122
     * setFullRepositoryClass.
123
     *
124
     * @param string $value
125
     * @return static
126
     */
127 3
    public function setFullRepositoryClass($value)
128
    {
129 3
        $this->set('DummyFullRepositoryClass', $value);
130 3
        $attributes = $this->parseAttribute($value);
131 3
        extract($attributes);
132
133 3
        return $this->setDefault('DummyNamespace', $dummyNamespace)
134 3
            ->setDefault('DummyClass', $dummyClass)
135 3
            ->setDefault('DummyFullRepositoryInterface', $dummyNamespace.'\Contracts\\'.$dummyClass)
136 3
            ->set('DummyRepositoryClass', $dummyClass);
137
    }
138
139
    /**
140
     * setFullModelClass.
141
     *
142
     * @param string $value
143
     * @return static
144
     */
145 4
    public function setFullModelClass($value)
146
    {
147 4
        $this->set('DummyFullModelClass', $value);
148 4
        $attributes = $this->parseAttribute($value);
149 4
        extract($attributes);
150
151 4
        return $this->setDefault('DummyNamespace', $dummyNamespace)
152 4
            ->setDefault('DummyClass', $dummyClass)
153 4
            ->setDefault('DummyModelVariable', $dummyModelVariable)
154 4
            ->setDefault('DummyFullPresenterClass', $dummyNamespace.'\Presenters\\'.$dummyClass.'Presenter')
155 4
            ->setDefault('DummyPresenterClass', $dummyClass.'Presenter')
156 4
            ->set('DummyModelClass', $dummyClass);
157
    }
158
159
    /**
160
     * setFullPresenterClass.
161
     *
162
     * @param string $value
163
     * @return static
164
     */
165 1 View Code Duplication
    public function setFullPresenterClass($value)
1 ignored issue
show
Duplication introduced by
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...
166
    {
167 1
        $this->set('DummyFullPresenterClass', $value);
168 1
        $attributes = $this->parseAttribute($value);
169 1
        extract($attributes);
170
171 1
        return $this->setDefault('DummyNamespace', $dummyNamespace)
172 1
            ->setDefault('DummyClass', $dummyClass)
173 1
            ->set('DummyPresenterClass', $dummyClass);
174
    }
175
176
    /**
177
     * setFullRequestClass.
178
     *
179
     * @param string $value
180
     * @return static
181
     */
182 3 View Code Duplication
    public function setFullRequestClass($value)
1 ignored issue
show
Duplication introduced by
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...
183
    {
184 3
        $this->set('DummyFullRequestClass', $value);
185 3
        $attributes = $this->parseAttribute($value);
186 3
        extract($attributes);
187
188 3
        return $this->setDefault('DummyNamespace', $dummyNamespace)
189 3
            ->setDefault('DummyClass', $dummyClass)
190 3
            ->set('DummyRequestClass', $dummyClass);
191
    }
192
193
    /**
194
     * setFullControllerClass.
195
     *
196
     * @param string $value
197
     * @return static
198
     */
199 2
    public function setFullControllerClass($value)
200
    {
201 2
        $this->set('DummyFullControllerClass', $value);
202 2
        $attributes = $this->parseAttribute($value);
203 2
        extract($attributes);
204
205 2
        return $this->setDefault('DummyNamespace', $dummyNamespace)
206 2
            ->setDefault('DummyClass', $dummyClass)
207 2
            ->setDefault('DummyRepositoryVariable', $dummyRepositoryVariable)
208 2
            ->setDefault('DummyCollectionVariable', $dummyCollectionVariable)
209 2
            ->setDefault('DummyModelVariable', $dummyModelVariable)
210 2
            ->setDefault('DummyView', $dummyView)
211 2
            ->setDefault('DummyRoute', $dummyRoute)
212 2
            ->set('DummyControllerClass', $dummyClass);
213
    }
214
215
    /**
216
     * set.
217
     *
218
     * @param string $value
219
     * @return static
220
     */
221 9
    public function set($key, $value)
222
    {
223 9
        $this->attributes[$key] = $value;
224
225 9
        return $this;
226
    }
227
228
    /**
229
     * setDefault.
230
     *
231
     * @param string $value
232
     * @return static
233
     */
234 9
    protected function setDefault($key, $value)
235
    {
236 9
        if (isset($this->attributes[$key]) === false) {
237 9
            $this->attributes[$key] = $value;
238 9
        }
239
240 9
        return $this;
241
    }
242
243
    /**
244
     * get.
245
     *
246
     * @return string
247
     */
248 7
    public function get($key)
249
    {
250 7
        return Arr::get($this->attributes, $key);
251
    }
252
253
    /**
254
     * remove.
255
     *
256
     * @param string $key
257
     * @return bool
258
     */
259 2
    public function remove($key)
260
    {
261 2
        return Arr::forget($this->attributes, $key);
262
    }
263
264
    /**
265
     * render.
266
     *
267
     * @param string $stub
268
     * @param bool $orderedUses
269
     * @return string
270
     */
271 8
    public function render($stub, $orderedUses = true)
272
    {
273 8
        $content = strtr(strtr(strtr($this->filesystem->get($stub), $this->attributes), ["\r\n" => "\n"]), [
274 8
            ' extends DummyBaseClass' => '',
275 8
            'use DummyFullBaseClass;' => '',
276 8
        ]);
277
278 8
        return $orderedUses === true ? $this->orderedUses($content) : $content;
279
    }
280
281
    /**
282
     * renderServiceProvider.
283
     *
284
     * @param string $content
285
     * @return string
286
     */
287 1
    public function renderServiceProvider($content)
288
    {
289 1
        if (strpos($content, '$this->registerRepositories') === false) {
290 1
            $content = preg_replace_callback('/public function register\(.+\n\s+{/', function ($m) {
291 1
                return $m[0]."\n".
292 1
                    str_repeat(' ', 8).
293 1
                    '$this->registerRepositories();';
294 1
            }, $content);
295 1
        }
296
297 1
        if (strpos($content, 'protected function registerRepositories()') === false) {
298 1
            $content = substr($content, 0, strrpos($content, '}')).
299 1
                "\n".str_repeat(' ', 4).
300 1
                'protected function registerRepositories()'.
301 1
                "\n".str_repeat(' ', 4).'{'.
302 1
                "\n".str_repeat(' ', 4).'}'.
303 1
                "\n}\n";
304 1
        }
305
306 1 View Code Duplication
        if (strpos($content, sprintf('use %s;', $this->get('DummyFullRepositoryClass'))) === false) {
1 ignored issue
show
Duplication introduced by
This code seems to be duplicated across 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...
307 1
            $content = preg_replace_callback(
308 1
                '/namespace.+/',
309 1
                [$this, 'replaceServieProviderCallback'],
310
                $content
311 1
            );
312 1
        }
313
314 1 View Code Duplication
        if (strpos($content, sprintf('$this->app->singleton(%sContract::class, %s::class);', $this->get('DummyClass'), $this->get('DummyClass'))) === false) {
1 ignored issue
show
Duplication introduced by
This code seems to be duplicated across 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...
315 1
            $content = preg_replace_callback(
316 1
                '/protected function registerRepositories.+\n\s+{/',
317 1
                [$this, 'replaceServieProviderCallback'],
318
                $content
319 1
            );
320 1
        }
321
322 1
        return $this->orderedUses($content);
323
    }
324
325
    /**
326
     * replaceServieProviderCallback.
327
     *
328
     * @param  array $match
329
     * @return string
330
     */
331 1
    protected function replaceServieProviderCallback($match)
332
    {
333 1
        $fullRepositoryClass = $this->get('DummyFullRepositoryClass');
334 1
        $fullRepositoryInterface = $this->get('DummyFullRepositoryInterface');
335 1
        $dummyClass = $this->get('DummyClass');
336
337 1
        if (Str::startsWith($match[0], 'namespace') === true) {
338 1
            return $match[0]."\n\n".
339 1
                sprintf("use %s as %sContract;\n", $fullRepositoryInterface, $dummyClass).
340 1
                sprintf("use %s;\n", $fullRepositoryClass);
341
        } else {
342 1
            return $match[0]."\n".
343 1
                str_repeat(' ', 8).
344 1
                sprintf('$this->app->singleton(%sContract::class, %s::class);', $dummyClass, $dummyClass);
345
        }
346
    }
347
348
    /**
349
     * getNamespace.
350
     *
351
     * @param string $name
352
     * @return string
353
     */
354 9
    protected function getNamespace($name)
355
    {
356 9
        return rtrim(preg_replace('/'.class_basename($name).'$/', '', $name), '\\');
357
    }
358
359
360
    /**
361
     * orderedUses.
362
     *
363
     * @param string $content
364
     * @return string
365
     */
366 9
    protected function orderedUses($content)
367
    {
368 9
        $fix = $this->useSortFixer->fix($content);
369
370 9
        return $fix === false ? $content : strtr($fix, ["\r\n" => "\n"]);
371
    }
372
}
373