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