Failed Conditions
Pull Request — master (#1)
by Yo
02:02
created

VariableBagFactory::setGlobalVar()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 61
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
dl 0
loc 61
ccs 0
cts 47
cp 0
rs 8.6806
c 0
b 0
f 0
cc 5
eloc 37
nc 5
nop 2
crap 30

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
namespace Yoanm\DefaultPhpRepository\Factory;
3
4
use Symfony\Component\DependencyInjection\ContainerBuilder;
5
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
6
use Yoanm\DefaultPhpRepository\Command\Mode;
7
8
/**
9
 * Class VariableBagFactory
10
 */
11
class VariableBagFactory
12
{
13
    /**
14
     * @return ParameterBag
15
     *
16
     * @throws \Exception
17
     */
18
    public function load($mode)
19
    {
20
        $bag = new ParameterBag();
21
22
        $this->setGlobalVar($bag, $mode);
23
        $this->setExtraVar($bag, $mode);
24
25
        $bag->resolve();
26
27
        return $bag;
28
    }
29
30
    /**
31
     * @param ParameterBag $bag
32
     * @throws \Exception
33
     */
34
    protected function setGlobalVar(ParameterBag $bag, $mode)
35
    {
36
        // - Git variables
37
        $gitUsername = trim(shell_exec('git config --global user.name'));
38
        if ('' === $gitUsername) {
39
            throw new \Exception("Git username cannot be empty ! Use git config user.name 'NAME' to define it");
40
        }
41
        // Ensure CamelCase style for git username
42
        $gitUsername = ContainerBuilder::camelize($gitUsername);
43
44
        $remoteListOutput = shell_exec('git remote -v show -n origin');
45
46
        if (0 === preg_match('#github\.com:(.*)(?:\.git)$#m', $remoteListOutput, $matches)) {
47
            preg_match('#github\.com\/([^\/]+\/[^\/]+)#m', $remoteListOutput, $matches);
48
        }
49
        $githubRepositoryUrlId = trim($matches[1]);
50
        if ('' === $githubRepositoryUrlId) {
51
            throw new \Exception("Unabled to define github repository url id !");
52
        }
53
54
        $bag->set('git.repository.url_id', $githubRepositoryUrlId);
55
        $tmp = explode('/', $githubRepositoryUrlId);
56
        $bag->set('git.repository.url_id_without_vendor', array_pop($tmp));
57
        $bag->set('git.repository.url', sprintf('github.com/%s', $githubRepositoryUrlId));
58
59
        // - Composer variables
60
        $composerPackageName = str_replace('_', '-', ContainerBuilder::underscore($githubRepositoryUrlId));
61
62
        $bag->set('composer.package.name', $composerPackageName);
63
        $bag->set('composer.config.type', Mode::PROJECT === $mode ? 'project' : 'library');
64
65
        // - Autoloading variables
66
        $autoloadNamespace = implode(
67
            '\\',
68
            array_map(
69
                function ($part) {
70
                    return ContainerBuilder::camelize($part);
71
                },
72
                explode('/', $githubRepositoryUrlId)
73
            )
74
        );
75
        $autoloadPsr0Namespace = str_replace('\\', '\\\\', $autoloadNamespace);
76
77
        $bag->set('git.username', $gitUsername);
78
        $bag->set('autoload.namespace', $autoloadNamespace);
79
        $bag->set('autoload.namespace.psr_0', $autoloadPsr0Namespace);
80
        $bag->set('autoload.namespace.psr_4', sprintf('%s\\\\', $autoloadPsr0Namespace));
81
82
        $id = preg_replace('#[^/]+/(.*)#', '\1', $composerPackageName);
83
84
        $bag->set('id', $id);
85
        $bag->set('name', ucwords(
86
            str_replace(
87
                '-',
88
                ' ',
89
                $id
90
            )
91
        ));
92
93
        $bag->set('current.year', date('Y'));
94
    }
95
96
    /**
97
     * @param ParameterBag $bag
98
     * @param string       $mode
99
     */
100
    protected function setExtraVar(ParameterBag $bag, $mode)
101
    {
102
        $extraList = [
103
            'gitignore.extra' => '',
104
            'composer.config.extra.description' => '',
105
            'composer.config.extra.keyword' => '',
106
            'composer.config.extra.version' => '',
107
            'composer.config.extra.provide' => '',
108
            'composer.config.extra.suggest' => '',
109
            'travis.config.extra.env' => '',
110
            'travis.config.extra.install' => '',
111
            'readme.extra.badges' => '',
112
            'readme.extra.badges.travis' => '',
113
            'readme.extra.install_steps' => 'composer require %composer.package.name%',
114
        ];
115
116
        if (Mode::PROJECT !== $mode) {
117
// @codingStandardsIgnoreStart
118
            $extraList['readme.extra.badges'] = <<<EOS
119
120
[![Travis Build Status](https://img.shields.io/travis/%git.repository.url_id%/master.svg?label=travis)](https://travis-ci.org/%git.repository.url_id%) [![PHP Versions](https://img.shields.io/badge/php-5.5%%20%%2F%%205.6%%20%%2F%%207.0-8892BF.svg)](https://php.net/)%readme.extra.badges.travis%
121
122
EOS;
123
// @codingStandardsIgnoreEnd
124
            // Git ignore - only project need a composer.lock
125
            $extraList['gitignore.extra'] = <<<EOS
126
127
composer.lock
128
EOS;
129
            // Composer
130
            $extraList['composer.config.extra.description'] = <<<EOS
131
132
  "description": "XXX",
133
EOS;
134
            $extraList['composer.config.extra.keyword'] = <<<EOS
135
136
  "keywords": ["XXX"],
137
EOS;
138
            $extraList['composer.config.extra.version'] = <<<EOS
139
140
  "version": "0.1.0",
141
EOS;
142
            $extraList['composer.config.extra.provide'] = <<<EOS
143
144
  "provide": {
145
    "yoanm/XXX": "~0.1"
146
  },
147
EOS;
148
            $extraList['composer.config.extra.suggest'] = <<<EOS
149
150
  "suggest": {
151
    "YYY/ZZZ": "Description"
152
  },
153
EOS;
154
        } else {
155
            // Readme - install steps
156
            $extraList['readme.extra.install_steps'] = <<<EOS
157
git clone [email protected]:%git.repository.url_id%.git
158
cd %git.repository.url_id_without_vendor%
159
composer build
160
EOS;
161
        }
162
163
        if (Mode::SYMFONY_LIBRARY === $mode) {
164
            // Travis
165
            $extraList['travis.config.extra.env'] = <<<EOS
166
167
env:
168
  - SYMFONY_VERSION=2.7.*
169
  - SYMFONY_VERSION=2.8.*
170
  - SYMFONY_VERSION=3.*
171
172
EOS;
173
            $extraList['travis.config.extra.install'] = <<<EOS
174
  - composer require "symfony/symfony:\${SYMFONY_VERSION}"
175
176
EOS;
177
            // Readme - extra travis badges
178
// @codingStandardsIgnoreStart
179
            $extraList['readme.extra.badges.travis'] = <<<EOS
180
 [![Symfony Versions](https://img.shields.io/badge/Symfony-2.7%%20%%2F%%202.8%%20%%2F%%203.0-312933.svg)](https://symfony.com/)
181
EOS;
182
// @codingStandardsIgnoreEnd
183
        }
184
185
        foreach ($extraList as $extraKey => $extraValue) {
186
            $bag->set($extraKey, $extraValue);
187
        }
188
    }
189
}
190