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

VariableBagFactory::setExtraVar()   B

Complexity

Conditions 4
Paths 8

Size

Total Lines 85
Code Lines 51

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
dl 0
loc 85
ccs 0
cts 66
cp 0
rs 8.452
c 0
b 0
f 0
cc 4
eloc 51
nc 8
nop 2
crap 20

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
            $extraList['readme.extra.badges'] = <<<EOS
118
119
[![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%
120
121
EOS;
122
            // Git ignore - only project need a composer.lock
123
            $extraList['gitignore.extra'] = <<<EOS
124
125
composer.lock
126
EOS;
127
            // Composer
128
            $extraList['composer.config.extra.description'] = <<<EOS
129
130
  "description": "XXX",
131
EOS;
132
            $extraList['composer.config.extra.keyword'] = <<<EOS
133
134
  "keywords": ["XXX"],
135
EOS;
136
            $extraList['composer.config.extra.version'] = <<<EOS
137
138
  "version": "0.1.0",
139
EOS;
140
            $extraList['composer.config.extra.provide'] = <<<EOS
141
142
  "provide": {
143
    "yoanm/XXX": "~0.1"
144
  },
145
EOS;
146
            $extraList['composer.config.extra.suggest'] = <<<EOS
147
148
  "suggest": {
149
    "YYY/ZZZ": "Description"
150
  },
151
EOS;
152
        } else {
153
            // Readme - install steps
154
            $extraList['readme.extra.install_steps'] = <<<EOS
155
git clone [email protected]:%git.repository.url_id%.git
156
cd %git.repository.url_id_without_vendor%
157
composer build
158
EOS;
159
        }
160
161
        if (Mode::SYMFONY_LIBRARY === $mode) {
162
            // Travis
163
            $extraList['travis.config.extra.env'] = <<<EOS
164
165
env:
166
  - SYMFONY_VERSION=2.7.*
167
  - SYMFONY_VERSION=2.8.*
168
  - SYMFONY_VERSION=3.*
169
170
EOS;
171
            $extraList['travis.config.extra.install'] = <<<EOS
172
  - composer require "symfony/symfony:\${SYMFONY_VERSION}"
173
174
EOS;
175
            // Readme - extra travis badges
176
            $extraList['readme.extra.badges.travis'] = <<<EOS
177
 [![Symfony Versions](https://img.shields.io/badge/Symfony-2.7%%20%%2F%%202.8%%20%%2F%%203.0-312933.svg)](https://symfony.com/)
178
EOS;
179
        }
180
181
        foreach ($extraList as $extraKey => $extraValue) {
182
            $bag->set($extraKey, $extraValue);
183
        }
184
    }
185
}
186