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
Pull Request — master (#127)
by joseph
25:04 queued 08:38
created

TestCodeGenerator.php$0 ➔ copyTo()   A

Complexity

Conditions 3

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 24
rs 9.536
c 0
b 0
f 0
cc 3
1
<?php declare(strict_types=1);
2
3
namespace EdmondsCommerce\DoctrineStaticMeta\Tests\Assets;
4
5
use Composer\Autoload\ClassLoader;
6
use EdmondsCommerce\DoctrineStaticMeta\Builder\Builder;
7
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\AbstractGenerator;
8
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\FindAndReplaceHelper;
9
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\RelationsGenerator;
10
use EdmondsCommerce\DoctrineStaticMeta\MappingHelper;
11
use Symfony\Component\Filesystem\Filesystem;
12
13
class TestCodeGenerator
14
{
15
    public const TEST_PROJECT_ROOT_NAMESPACE = 'Test\\Code\\Generator';
16
    public const TEST_ENTITY_NAMESPACE_BASE  = self::TEST_PROJECT_ROOT_NAMESPACE
17
                                               . '\\' . AbstractGenerator::ENTITIES_FOLDER_NAME;
18
19
    public const TEST_ENTITY_PERSON                      = self::TEST_ENTITY_NAMESPACE_BASE . '\\Person';
20
    public const TEST_ENTITY_ADDRESS                     = self::TEST_ENTITY_NAMESPACE_BASE . '\\Attributes\\Address';
21
    public const TEST_ENTITY_EMAIL                       = self::TEST_ENTITY_NAMESPACE_BASE . '\\Attributes\\Email';
22
    public const TEST_ENTITY_COMPANY                     = self::TEST_ENTITY_NAMESPACE_BASE . '\\Company';
23
    public const TEST_ENTITY_DIRECTOR                    = self::TEST_ENTITY_NAMESPACE_BASE . '\\Company\\Director';
24
    public const TEST_ENTITY_ORDER                       = self::TEST_ENTITY_NAMESPACE_BASE . '\\Order';
25
    public const TEST_ENTITY_ORDER_ADDRESS               = self::TEST_ENTITY_NAMESPACE_BASE . '\\Order\\Address';
26
    public const TEST_ENTITY_NAME_SPACING_SOME_CLIENT    = self::TEST_ENTITY_NAMESPACE_BASE . '\\Some\\Client';
27
    public const TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT = self::TEST_ENTITY_NAMESPACE_BASE
28
                                                           . '\\Another\\Deeply\\Nested\\Client';
29
    public const TEST_ENTITIES                           = [
30
        self::TEST_ENTITY_PERSON,
31
        self::TEST_ENTITY_ADDRESS,
32
        self::TEST_ENTITY_EMAIL,
33
        self::TEST_ENTITY_COMPANY,
34
        self::TEST_ENTITY_DIRECTOR,
35
        self::TEST_ENTITY_ORDER,
36
        self::TEST_ENTITY_ORDER_ADDRESS,
37
        self::TEST_ENTITY_NAME_SPACING_SOME_CLIENT,
38
        self::TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT,
39
    ];
40
    public const TEST_FIELD_NAMESPACE_BASE               = self::TEST_PROJECT_ROOT_NAMESPACE . '\\Entity\\Fields';
41
    public const TEST_FIELD_TRAIT_NAMESPACE              = self::TEST_FIELD_NAMESPACE_BASE . '\\Traits\\';
42
43
    public const TEST_RELATIONS      = [
44
        [self::TEST_ENTITY_PERSON, RelationsGenerator::HAS_UNIDIRECTIONAL_MANY_TO_ONE, self::TEST_ENTITY_ADDRESS],
45
        [self::TEST_ENTITY_PERSON, RelationsGenerator::HAS_ONE_TO_MANY, self::TEST_ENTITY_EMAIL],
46
        [self::TEST_ENTITY_COMPANY, RelationsGenerator::HAS_MANY_TO_MANY, self::TEST_ENTITY_DIRECTOR],
47
        [self::TEST_ENTITY_COMPANY, RelationsGenerator::HAS_ONE_TO_MANY, self::TEST_ENTITY_ADDRESS],
48
        [self::TEST_ENTITY_COMPANY, RelationsGenerator::HAS_UNIDIRECTIONAL_ONE_TO_MANY, self::TEST_ENTITY_EMAIL],
49
        [self::TEST_ENTITY_DIRECTOR, RelationsGenerator::HAS_ONE_TO_ONE, self::TEST_ENTITY_PERSON],
50
        [self::TEST_ENTITY_ORDER, RelationsGenerator::HAS_MANY_TO_ONE, self::TEST_ENTITY_PERSON],
51
        [self::TEST_ENTITY_ORDER, RelationsGenerator::HAS_ONE_TO_MANY, self::TEST_ENTITY_ORDER_ADDRESS],
52
        [self::TEST_ENTITY_ORDER_ADDRESS, RelationsGenerator::HAS_UNIDIRECTIONAL_ONE_TO_ONE, self::TEST_ENTITY_ADDRESS],
53
        [
54
            self::TEST_ENTITY_COMPANY,
55
            RelationsGenerator::HAS_ONE_TO_ONE,
56
            self::TEST_ENTITY_NAME_SPACING_SOME_CLIENT,
57
        ],
58
        [
59
            self::TEST_ENTITY_COMPANY,
60
            RelationsGenerator::HAS_ONE_TO_ONE,
61
            self::TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT,
62
        ],
63
    ];
64
    public const TEST_FIELD_FQN_BASE = self::TEST_FIELD_NAMESPACE_BASE . '\\Traits';
65
    public const BUILD_DIR           = AbstractTest::VAR_PATH . '/testCode';
66
67
    /**
68
     * @var Builder
69
     */
70
    protected $builder;
71
    /**
72
     * @var Filesystem
73
     */
74
    protected $filesystem;
75
    /**
76
     * @var FindAndReplaceHelper
77
     */
78
    protected $findAndReplaceHelper;
79
80
    public function __construct(Builder $builder, Filesystem $filesystem, FindAndReplaceHelper $findAndReplaceHelper)
81
    {
82
        $this->filesystem = $filesystem;
83
        $this->initBuildDir();
84
        $this->builder = $builder->setProjectRootNamespace(self::TEST_PROJECT_ROOT_NAMESPACE)
85
                                 ->setPathToProjectRoot(self::BUILD_DIR);
86
        $this->buildOnce();
87
        $this->findAndReplaceHelper = $findAndReplaceHelper;
88
    }
89
90
    private function initBuildDir(): void
91
    {
92
93
        if (!is_dir(self::BUILD_DIR)) {
94
            $this->filesystem->mkdir(self::BUILD_DIR);
95
        }
96
    }
97
98
    public function buildOnce(): void
99
    {
100
        if ($this->isBuilt()) {
101
            return;
102
        }
103
        $this->extendAutoloader();
104
        $entityGenerator    = $this->builder->getEntityGenerator();
105
        $fieldGenerator     = $this->builder->getFieldGenerator();
106
        $fieldSetter        = $this->builder->getFieldSetter();
107
        $relationsGenerator = $this->builder->getRelationsGenerator();
108
        $fields             = [];
109
        foreach (MappingHelper::COMMON_TYPES as $type) {
110
            $fields[] = $fieldGenerator->generateField(
111
                self::TEST_FIELD_FQN_BASE . '\\' . ucwords($type),
112
                $type
113
            );
114
        }
115
        foreach (self::TEST_ENTITIES as $entityFqn) {
116
            $entityGenerator->generateEntity($entityFqn);
117
            foreach ($fields as $fieldFqn) {
118
                $fieldSetter->setEntityHasField($entityFqn, $fieldFqn);
119
            }
120
        }
121
        foreach (self::TEST_RELATIONS as $relation) {
122
            $relationsGenerator->setEntityHasRelationToEntity(...$relation);
123
        }
124
        $this->resetAutoloader();
125
    }
126
127
    private function isBuilt(): bool
128
    {
129
        return is_dir(self::BUILD_DIR . '/src');
130
    }
131
132
    private function extendAutoloader(): void
133
    {
134
        $testLoader = new class(self::TEST_PROJECT_ROOT_NAMESPACE) extends ClassLoader
135
        {
136
            /**
137
             * @var string
138
             */
139
            protected $namespace;
140
141
            public function __construct(string $namespace)
142
            {
143
                $this->namespace = $namespace;
144
            }
145
146
            public function loadClass($class)
147
            {
148
                if (false === strpos($class, $this->namespace)) {
149
                    return false;
150
                }
151
                $found = parent::loadClass($class);
152
                if (false === $found || null === $found) {
0 ignored issues
show
introduced by
The condition null === $found is always false.
Loading history...
153
                    //good point to set a breakpoint
154
                    return $found;
155
                }
156
157
                return $found;
158
            }
159
        };
160
        $testLoader->addPsr4(self::TEST_PROJECT_ROOT_NAMESPACE . '\\', self::BUILD_DIR . '/src', true);
161
        $testLoader->addPsr4(self::TEST_PROJECT_ROOT_NAMESPACE . '\\', self::BUILD_DIR . '/tests', true);
162
        $testLoader->register();
163
    }
164
165
    private function resetAutoloader(): void
166
    {
167
        $registered = \spl_autoload_functions();
168
        $loader     = array_pop($registered);
169
        \spl_autoload_unregister($loader);
170
    }
171
172
    public function copyTo(
173
        string $destinationPath,
174
        string $replaceNamespace = AbstractTest::TEST_PROJECT_ROOT_NAMESPACE
175
    ): void {
176
        $this->filesystem->mirror(self::BUILD_DIR, $destinationPath);
177
        $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($destinationPath));
178
179
        foreach ($iterator as $info) {
180
            /**
181
             * @var \SplFileInfo $info
182
             */
183
            if (false === $info->isFile()) {
184
                continue;
185
            }
186
            $contents = file_get_contents($info->getPathname());
187
188
            $updated = \preg_replace(
189
                '%(use|namespace)\s+?'
190
                . $this->findAndReplaceHelper->escapeSlashesForRegex(self::TEST_PROJECT_ROOT_NAMESPACE)
191
                . '\\\\%',
192
                '$1 ' . $replaceNamespace . '\\',
193
                $contents
194
            );
195
            file_put_contents($info->getPathname(), $updated);
196
        }
197
    }
198
}
199