@@ -14,73 +14,73 @@ |
||
14 | 14 | class Cleanup |
15 | 15 | { |
16 | 16 | |
17 | - /** @var Filesystem */ |
|
18 | - protected Filesystem $filesystem; |
|
17 | + /** @var Filesystem */ |
|
18 | + protected Filesystem $filesystem; |
|
19 | 19 | |
20 | - protected bool $isDeleteVendorFiles; |
|
20 | + protected bool $isDeleteVendorFiles; |
|
21 | 21 | |
22 | - protected string $vendorDirectory = 'vendor'. DIRECTORY_SEPARATOR; |
|
22 | + protected string $vendorDirectory = 'vendor'. DIRECTORY_SEPARATOR; |
|
23 | 23 | |
24 | - public function __construct(StraussConfig $config, string $workingDir) |
|
25 | - { |
|
24 | + public function __construct(StraussConfig $config, string $workingDir) |
|
25 | + { |
|
26 | 26 | |
27 | - $this->isDeleteVendorFiles = $config->isDeleteVendorFiles(); |
|
27 | + $this->isDeleteVendorFiles = $config->isDeleteVendorFiles(); |
|
28 | 28 | |
29 | - $this->filesystem = new Filesystem(new Local($workingDir)); |
|
30 | - } |
|
31 | - |
|
32 | - /** |
|
33 | - * Maybe delete the source files that were copied (depending on config), |
|
34 | - * then delete empty directories. |
|
35 | - * |
|
36 | - * @param array $sourceFiles |
|
37 | - */ |
|
38 | - public function cleanup(array $sourceFiles) |
|
39 | - { |
|
40 | - |
|
41 | - // TODO Don't do this if vendor is the target dir (i.e. in-situ updating). |
|
42 | - |
|
43 | - if ($this->isDeleteVendorFiles) { |
|
44 | - foreach ($sourceFiles as $sourceFile) { |
|
45 | - $relativeFilepath = $this->vendorDirectory . $sourceFile; |
|
46 | - |
|
47 | - $this->filesystem->delete($relativeFilepath); |
|
48 | - } |
|
49 | - |
|
50 | - // Get the root folders of the moved files. |
|
51 | - $rootSourceDirectories = []; |
|
52 | - foreach ($sourceFiles as $sourceFile) { |
|
53 | - $arr = explode("/", $sourceFile, 2); |
|
54 | - $dir = $arr[0]; |
|
55 | - $rootSourceDirectories[ $dir ] = $dir; |
|
56 | - } |
|
57 | - $rootSourceDirectories = array_keys($rootSourceDirectories); |
|
58 | - |
|
59 | - |
|
60 | - $finder = new Finder(); |
|
61 | - |
|
62 | - foreach ($rootSourceDirectories as $rootSourceDirectory) { |
|
63 | - if (!is_dir($rootSourceDirectory) || is_link($rootSourceDirectory)) { |
|
64 | - continue; |
|
65 | - } |
|
66 | - |
|
67 | - $finder->directories()->path($rootSourceDirectory); |
|
68 | - |
|
69 | - foreach ($finder as $directory) { |
|
70 | - $metadata = $this->filesystem->getMetadata($directory); |
|
71 | - |
|
72 | - if ($this->dirIsEmpty($directory)) { |
|
73 | - $this->filesystem->deleteDir($directory); |
|
74 | - } |
|
75 | - } |
|
76 | - } |
|
77 | - } |
|
78 | - } |
|
79 | - |
|
80 | - // TODO: Use Symphony or Flysystem functions. |
|
81 | - protected function dirIsEmpty(string $dir): bool |
|
82 | - { |
|
83 | - $di = new RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS); |
|
84 | - return iterator_count($di) === 0; |
|
85 | - } |
|
29 | + $this->filesystem = new Filesystem(new Local($workingDir)); |
|
30 | + } |
|
31 | + |
|
32 | + /** |
|
33 | + * Maybe delete the source files that were copied (depending on config), |
|
34 | + * then delete empty directories. |
|
35 | + * |
|
36 | + * @param array $sourceFiles |
|
37 | + */ |
|
38 | + public function cleanup(array $sourceFiles) |
|
39 | + { |
|
40 | + |
|
41 | + // TODO Don't do this if vendor is the target dir (i.e. in-situ updating). |
|
42 | + |
|
43 | + if ($this->isDeleteVendorFiles) { |
|
44 | + foreach ($sourceFiles as $sourceFile) { |
|
45 | + $relativeFilepath = $this->vendorDirectory . $sourceFile; |
|
46 | + |
|
47 | + $this->filesystem->delete($relativeFilepath); |
|
48 | + } |
|
49 | + |
|
50 | + // Get the root folders of the moved files. |
|
51 | + $rootSourceDirectories = []; |
|
52 | + foreach ($sourceFiles as $sourceFile) { |
|
53 | + $arr = explode("/", $sourceFile, 2); |
|
54 | + $dir = $arr[0]; |
|
55 | + $rootSourceDirectories[ $dir ] = $dir; |
|
56 | + } |
|
57 | + $rootSourceDirectories = array_keys($rootSourceDirectories); |
|
58 | + |
|
59 | + |
|
60 | + $finder = new Finder(); |
|
61 | + |
|
62 | + foreach ($rootSourceDirectories as $rootSourceDirectory) { |
|
63 | + if (!is_dir($rootSourceDirectory) || is_link($rootSourceDirectory)) { |
|
64 | + continue; |
|
65 | + } |
|
66 | + |
|
67 | + $finder->directories()->path($rootSourceDirectory); |
|
68 | + |
|
69 | + foreach ($finder as $directory) { |
|
70 | + $metadata = $this->filesystem->getMetadata($directory); |
|
71 | + |
|
72 | + if ($this->dirIsEmpty($directory)) { |
|
73 | + $this->filesystem->deleteDir($directory); |
|
74 | + } |
|
75 | + } |
|
76 | + } |
|
77 | + } |
|
78 | + } |
|
79 | + |
|
80 | + // TODO: Use Symphony or Flysystem functions. |
|
81 | + protected function dirIsEmpty(string $dir): bool |
|
82 | + { |
|
83 | + $di = new RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS); |
|
84 | + return iterator_count($di) === 0; |
|
85 | + } |
|
86 | 86 | } |
@@ -19,14 +19,14 @@ discard block |
||
19 | 19 | |
20 | 20 | protected bool $isDeleteVendorFiles; |
21 | 21 | |
22 | - protected string $vendorDirectory = 'vendor'. DIRECTORY_SEPARATOR; |
|
22 | + protected string $vendorDirectory = 'vendor' . DIRECTORY_SEPARATOR; |
|
23 | 23 | |
24 | - public function __construct(StraussConfig $config, string $workingDir) |
|
24 | + public function __construct( StraussConfig $config, string $workingDir ) |
|
25 | 25 | { |
26 | 26 | |
27 | 27 | $this->isDeleteVendorFiles = $config->isDeleteVendorFiles(); |
28 | 28 | |
29 | - $this->filesystem = new Filesystem(new Local($workingDir)); |
|
29 | + $this->filesystem = new Filesystem( new Local( $workingDir ) ); |
|
30 | 30 | } |
31 | 31 | |
32 | 32 | /** |
@@ -35,42 +35,42 @@ discard block |
||
35 | 35 | * |
36 | 36 | * @param array $sourceFiles |
37 | 37 | */ |
38 | - public function cleanup(array $sourceFiles) |
|
38 | + public function cleanup( array $sourceFiles ) |
|
39 | 39 | { |
40 | 40 | |
41 | 41 | // TODO Don't do this if vendor is the target dir (i.e. in-situ updating). |
42 | 42 | |
43 | - if ($this->isDeleteVendorFiles) { |
|
44 | - foreach ($sourceFiles as $sourceFile) { |
|
43 | + if ( $this->isDeleteVendorFiles ) { |
|
44 | + foreach ( $sourceFiles as $sourceFile ) { |
|
45 | 45 | $relativeFilepath = $this->vendorDirectory . $sourceFile; |
46 | 46 | |
47 | - $this->filesystem->delete($relativeFilepath); |
|
47 | + $this->filesystem->delete( $relativeFilepath ); |
|
48 | 48 | } |
49 | 49 | |
50 | 50 | // Get the root folders of the moved files. |
51 | - $rootSourceDirectories = []; |
|
52 | - foreach ($sourceFiles as $sourceFile) { |
|
53 | - $arr = explode("/", $sourceFile, 2); |
|
54 | - $dir = $arr[0]; |
|
51 | + $rootSourceDirectories = [ ]; |
|
52 | + foreach ( $sourceFiles as $sourceFile ) { |
|
53 | + $arr = explode( "/", $sourceFile, 2 ); |
|
54 | + $dir = $arr[ 0 ]; |
|
55 | 55 | $rootSourceDirectories[ $dir ] = $dir; |
56 | 56 | } |
57 | - $rootSourceDirectories = array_keys($rootSourceDirectories); |
|
57 | + $rootSourceDirectories = array_keys( $rootSourceDirectories ); |
|
58 | 58 | |
59 | 59 | |
60 | 60 | $finder = new Finder(); |
61 | 61 | |
62 | - foreach ($rootSourceDirectories as $rootSourceDirectory) { |
|
63 | - if (!is_dir($rootSourceDirectory) || is_link($rootSourceDirectory)) { |
|
62 | + foreach ( $rootSourceDirectories as $rootSourceDirectory ) { |
|
63 | + if ( ! is_dir( $rootSourceDirectory ) || is_link( $rootSourceDirectory ) ) { |
|
64 | 64 | continue; |
65 | 65 | } |
66 | 66 | |
67 | - $finder->directories()->path($rootSourceDirectory); |
|
67 | + $finder->directories()->path( $rootSourceDirectory ); |
|
68 | 68 | |
69 | - foreach ($finder as $directory) { |
|
70 | - $metadata = $this->filesystem->getMetadata($directory); |
|
69 | + foreach ( $finder as $directory ) { |
|
70 | + $metadata = $this->filesystem->getMetadata( $directory ); |
|
71 | 71 | |
72 | - if ($this->dirIsEmpty($directory)) { |
|
73 | - $this->filesystem->deleteDir($directory); |
|
72 | + if ( $this->dirIsEmpty( $directory ) ) { |
|
73 | + $this->filesystem->deleteDir( $directory ); |
|
74 | 74 | } |
75 | 75 | } |
76 | 76 | } |
@@ -78,9 +78,9 @@ discard block |
||
78 | 78 | } |
79 | 79 | |
80 | 80 | // TODO: Use Symphony or Flysystem functions. |
81 | - protected function dirIsEmpty(string $dir): bool |
|
81 | + protected function dirIsEmpty( string $dir ): bool |
|
82 | 82 | { |
83 | - $di = new RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS); |
|
84 | - return iterator_count($di) === 0; |
|
83 | + $di = new RecursiveDirectoryIterator( $dir, \FilesystemIterator::SKIP_DOTS ); |
|
84 | + return iterator_count( $di ) === 0; |
|
85 | 85 | } |
86 | 86 | } |
@@ -11,8 +11,7 @@ discard block |
||
11 | 11 | use RecursiveDirectoryIterator; |
12 | 12 | use Symfony\Component\Finder\Finder; |
13 | 13 | |
14 | -class Cleanup |
|
15 | -{ |
|
14 | +class Cleanup { |
|
16 | 15 | |
17 | 16 | /** @var Filesystem */ |
18 | 17 | protected Filesystem $filesystem; |
@@ -21,8 +20,7 @@ discard block |
||
21 | 20 | |
22 | 21 | protected string $vendorDirectory = 'vendor'. DIRECTORY_SEPARATOR; |
23 | 22 | |
24 | - public function __construct(StraussConfig $config, string $workingDir) |
|
25 | - { |
|
23 | + public function __construct(StraussConfig $config, string $workingDir) { |
|
26 | 24 | |
27 | 25 | $this->isDeleteVendorFiles = $config->isDeleteVendorFiles(); |
28 | 26 | |
@@ -35,8 +33,7 @@ discard block |
||
35 | 33 | * |
36 | 34 | * @param array $sourceFiles |
37 | 35 | */ |
38 | - public function cleanup(array $sourceFiles) |
|
39 | - { |
|
36 | + public function cleanup(array $sourceFiles) { |
|
40 | 37 | |
41 | 38 | // TODO Don't do this if vendor is the target dir (i.e. in-situ updating). |
42 | 39 |
@@ -16,180 +16,180 @@ |
||
16 | 16 | class FileEnumerator |
17 | 17 | { |
18 | 18 | |
19 | - /** |
|
20 | - * The only path variable with a leading slash. |
|
21 | - * All directories in project end with a slash. |
|
22 | - * |
|
23 | - * @var string |
|
24 | - */ |
|
25 | - protected string $workingDir; |
|
26 | - |
|
27 | - /** @var ComposerPackage[] */ |
|
28 | - protected array $dependencies; |
|
29 | - |
|
30 | - protected array $excludePackageNames = array(); |
|
31 | - protected array $excludeNamespaces = array(); |
|
32 | - protected array $excludeFilePatterns = array(); |
|
33 | - |
|
34 | - /** @var Filesystem */ |
|
35 | - protected Filesystem $filesystem; |
|
36 | - |
|
37 | - /** |
|
38 | - * Complete list of files specified in packages autoloaders. |
|
39 | - * |
|
40 | - * Relative filepaths as key, with their dependency as the value. |
|
41 | - * |
|
42 | - * Relative from vendor/ |
|
43 | - * |
|
44 | - * @var array<string, ComposerPackage> |
|
45 | - */ |
|
46 | - protected array $filesWithDependencies = []; |
|
47 | - |
|
48 | - /** |
|
49 | - * Record the files autolaoders for later use in building our own autoloader. |
|
50 | - * |
|
51 | - * @var array |
|
52 | - */ |
|
53 | - protected array $filesAutoloaders = []; |
|
54 | - |
|
55 | - /** |
|
56 | - * Copier constructor. |
|
57 | - * @param ComposerPackage[] $dependencies |
|
58 | - * @param string $workingDir |
|
59 | - */ |
|
60 | - public function __construct( |
|
61 | - array $dependencies, |
|
62 | - string $workingDir, |
|
63 | - StraussConfig $config |
|
64 | - ) { |
|
65 | - $this->workingDir = $workingDir; |
|
66 | - |
|
67 | - $this->dependencies = $dependencies; |
|
68 | - |
|
69 | - $this->excludeNamespaces = $config->getExcludeNamespacesFromCopy(); |
|
70 | - $this->excludePackageNames = $config->getExcludePackagesFromCopy(); |
|
71 | - $this->excludeFilePatterns = $config->getExcludeFilePatternsFromCopy(); |
|
72 | - |
|
73 | - $this->filesystem = new Filesystem(new Local($this->workingDir)); |
|
74 | - } |
|
75 | - |
|
76 | - /** |
|
77 | - * Read the autoload keys of the dependencies and generate a list of the files referenced. |
|
78 | - */ |
|
79 | - public function compileFileList() |
|
80 | - { |
|
81 | - |
|
82 | - // TODO: read 'vendor' from composer.json. |
|
83 | - $prefixToRemove = $this->workingDir .'vendor'. DIRECTORY_SEPARATOR; |
|
84 | - |
|
85 | - foreach ($this->dependencies as $dependency) { |
|
86 | - if (in_array($dependency->getName(), $this->excludePackageNames)) { |
|
87 | - continue; |
|
88 | - } |
|
89 | - |
|
90 | - $packagePath = $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR |
|
91 | - . $dependency->getPath() . DIRECTORY_SEPARATOR; |
|
92 | - |
|
93 | - /** |
|
94 | - * Where $dependency->autoload is ~ |
|
95 | - * |
|
96 | - * [ "psr-4" => [ "BrianHenryIE\Strauss" => "src" ] ] |
|
97 | - * Exclude "exclude-from-classmap" |
|
98 | - * @see https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps |
|
99 | - */ |
|
100 | - $autoloaders = array_filter($dependency->getAutoload(), function ($type) { |
|
101 | - return 'exclude-from-classmap' !== $type; |
|
102 | - }, ARRAY_FILTER_USE_KEY); |
|
103 | - |
|
104 | - foreach ($autoloaders as $type => $value) { |
|
105 | - // Might have to switch/case here. |
|
106 | - |
|
107 | - if ('files' === $type) { |
|
108 | - $this->filesAutoloaders[$dependency->getPath()] = $value; |
|
109 | - } |
|
110 | - |
|
111 | - foreach ($value as $namespace => $namespace_relative_path) { |
|
112 | - if (!empty($namespace) && in_array($namespace, $this->excludeNamespaces)) { |
|
113 | - continue; |
|
114 | - } |
|
115 | - |
|
116 | - if (is_file($packagePath . $namespace_relative_path)) { |
|
117 | - // $finder->files()->name($file)->in($source_path); |
|
118 | - |
|
119 | - $relativeFilepath = str_replace($prefixToRemove, '', $packagePath . $namespace_relative_path); |
|
120 | - $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
19 | + /** |
|
20 | + * The only path variable with a leading slash. |
|
21 | + * All directories in project end with a slash. |
|
22 | + * |
|
23 | + * @var string |
|
24 | + */ |
|
25 | + protected string $workingDir; |
|
26 | + |
|
27 | + /** @var ComposerPackage[] */ |
|
28 | + protected array $dependencies; |
|
29 | + |
|
30 | + protected array $excludePackageNames = array(); |
|
31 | + protected array $excludeNamespaces = array(); |
|
32 | + protected array $excludeFilePatterns = array(); |
|
33 | + |
|
34 | + /** @var Filesystem */ |
|
35 | + protected Filesystem $filesystem; |
|
36 | + |
|
37 | + /** |
|
38 | + * Complete list of files specified in packages autoloaders. |
|
39 | + * |
|
40 | + * Relative filepaths as key, with their dependency as the value. |
|
41 | + * |
|
42 | + * Relative from vendor/ |
|
43 | + * |
|
44 | + * @var array<string, ComposerPackage> |
|
45 | + */ |
|
46 | + protected array $filesWithDependencies = []; |
|
47 | + |
|
48 | + /** |
|
49 | + * Record the files autolaoders for later use in building our own autoloader. |
|
50 | + * |
|
51 | + * @var array |
|
52 | + */ |
|
53 | + protected array $filesAutoloaders = []; |
|
54 | + |
|
55 | + /** |
|
56 | + * Copier constructor. |
|
57 | + * @param ComposerPackage[] $dependencies |
|
58 | + * @param string $workingDir |
|
59 | + */ |
|
60 | + public function __construct( |
|
61 | + array $dependencies, |
|
62 | + string $workingDir, |
|
63 | + StraussConfig $config |
|
64 | + ) { |
|
65 | + $this->workingDir = $workingDir; |
|
66 | + |
|
67 | + $this->dependencies = $dependencies; |
|
68 | + |
|
69 | + $this->excludeNamespaces = $config->getExcludeNamespacesFromCopy(); |
|
70 | + $this->excludePackageNames = $config->getExcludePackagesFromCopy(); |
|
71 | + $this->excludeFilePatterns = $config->getExcludeFilePatternsFromCopy(); |
|
72 | + |
|
73 | + $this->filesystem = new Filesystem(new Local($this->workingDir)); |
|
74 | + } |
|
75 | + |
|
76 | + /** |
|
77 | + * Read the autoload keys of the dependencies and generate a list of the files referenced. |
|
78 | + */ |
|
79 | + public function compileFileList() |
|
80 | + { |
|
81 | + |
|
82 | + // TODO: read 'vendor' from composer.json. |
|
83 | + $prefixToRemove = $this->workingDir .'vendor'. DIRECTORY_SEPARATOR; |
|
84 | + |
|
85 | + foreach ($this->dependencies as $dependency) { |
|
86 | + if (in_array($dependency->getName(), $this->excludePackageNames)) { |
|
87 | + continue; |
|
88 | + } |
|
89 | + |
|
90 | + $packagePath = $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR |
|
91 | + . $dependency->getPath() . DIRECTORY_SEPARATOR; |
|
92 | + |
|
93 | + /** |
|
94 | + * Where $dependency->autoload is ~ |
|
95 | + * |
|
96 | + * [ "psr-4" => [ "BrianHenryIE\Strauss" => "src" ] ] |
|
97 | + * Exclude "exclude-from-classmap" |
|
98 | + * @see https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps |
|
99 | + */ |
|
100 | + $autoloaders = array_filter($dependency->getAutoload(), function ($type) { |
|
101 | + return 'exclude-from-classmap' !== $type; |
|
102 | + }, ARRAY_FILTER_USE_KEY); |
|
103 | + |
|
104 | + foreach ($autoloaders as $type => $value) { |
|
105 | + // Might have to switch/case here. |
|
106 | + |
|
107 | + if ('files' === $type) { |
|
108 | + $this->filesAutoloaders[$dependency->getPath()] = $value; |
|
109 | + } |
|
110 | + |
|
111 | + foreach ($value as $namespace => $namespace_relative_path) { |
|
112 | + if (!empty($namespace) && in_array($namespace, $this->excludeNamespaces)) { |
|
113 | + continue; |
|
114 | + } |
|
115 | + |
|
116 | + if (is_file($packagePath . $namespace_relative_path)) { |
|
117 | + // $finder->files()->name($file)->in($source_path); |
|
118 | + |
|
119 | + $relativeFilepath = str_replace($prefixToRemove, '', $packagePath . $namespace_relative_path); |
|
120 | + $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
121 | 121 | |
122 | - $this->filesWithDependencies[$relativeFilepath] = $dependency; |
|
123 | - |
|
124 | - continue; |
|
125 | - } |
|
126 | - |
|
127 | - // else it is a directory. |
|
128 | - |
|
129 | - // trailingslashit(). |
|
130 | - $namespace_relative_path = rtrim($namespace_relative_path, DIRECTORY_SEPARATOR) |
|
131 | - . DIRECTORY_SEPARATOR; |
|
132 | - |
|
133 | - $sourcePath = $packagePath . $namespace_relative_path; |
|
134 | - |
|
135 | - // trailingslashit(). (to remove duplicates). |
|
136 | - $sourcePath = rtrim($sourcePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
137 | - |
|
138 | - $finder = new Finder(); |
|
139 | - $finder->files()->in($sourcePath)->followLinks(); |
|
140 | - |
|
141 | - foreach ($finder as $foundFile) { |
|
142 | - $filePath = $foundFile->getPathname(); |
|
143 | - |
|
144 | - $relativeFilepath = str_replace($prefixToRemove, '', $filePath); |
|
145 | - |
|
146 | - // TODO: Is this needed here?! If anything, it's the prefix that needs to be normalised a few |
|
147 | - // lines above before being used. |
|
148 | - // Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR. |
|
149 | - $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
150 | - |
|
151 | - foreach ($this->excludeFilePatterns as $excludePattern) { |
|
152 | - if (1 === preg_match($excludePattern, $relativeFilepath)) { |
|
153 | - continue 2; |
|
154 | - } |
|
155 | - } |
|
156 | - |
|
157 | - $this->filesWithDependencies[$relativeFilepath] = $dependency; |
|
158 | - } |
|
159 | - } |
|
160 | - } |
|
161 | - } |
|
162 | - } |
|
163 | - |
|
164 | - /** |
|
165 | - * Returns all found files. |
|
166 | - * |
|
167 | - * @return array<string, ComposerPackage> |
|
168 | - */ |
|
169 | - public function getAllFilesAndDependencyList(): array |
|
170 | - { |
|
171 | - return $this->filesWithDependencies; |
|
172 | - } |
|
173 | - |
|
174 | - /** |
|
175 | - * Returns found PHP files. |
|
176 | - * |
|
177 | - * @return array<string, ComposerPackage> |
|
178 | - */ |
|
179 | - public function getPhpFilesAndDependencyList(): array |
|
180 | - { |
|
181 | - return array_filter($this->filesWithDependencies, function ($value, $key) { |
|
182 | - return false !== strpos($key, '.php'); |
|
183 | - }, ARRAY_FILTER_USE_BOTH); |
|
184 | - } |
|
185 | - |
|
186 | - /** |
|
187 | - * Get the recorded files autoloaders. |
|
188 | - * |
|
189 | - * @return array<string, array<string>> |
|
190 | - */ |
|
191 | - public function getFilesAutoloaders(): array |
|
192 | - { |
|
193 | - return $this->filesAutoloaders; |
|
194 | - } |
|
122 | + $this->filesWithDependencies[$relativeFilepath] = $dependency; |
|
123 | + |
|
124 | + continue; |
|
125 | + } |
|
126 | + |
|
127 | + // else it is a directory. |
|
128 | + |
|
129 | + // trailingslashit(). |
|
130 | + $namespace_relative_path = rtrim($namespace_relative_path, DIRECTORY_SEPARATOR) |
|
131 | + . DIRECTORY_SEPARATOR; |
|
132 | + |
|
133 | + $sourcePath = $packagePath . $namespace_relative_path; |
|
134 | + |
|
135 | + // trailingslashit(). (to remove duplicates). |
|
136 | + $sourcePath = rtrim($sourcePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
137 | + |
|
138 | + $finder = new Finder(); |
|
139 | + $finder->files()->in($sourcePath)->followLinks(); |
|
140 | + |
|
141 | + foreach ($finder as $foundFile) { |
|
142 | + $filePath = $foundFile->getPathname(); |
|
143 | + |
|
144 | + $relativeFilepath = str_replace($prefixToRemove, '', $filePath); |
|
145 | + |
|
146 | + // TODO: Is this needed here?! If anything, it's the prefix that needs to be normalised a few |
|
147 | + // lines above before being used. |
|
148 | + // Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR. |
|
149 | + $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
150 | + |
|
151 | + foreach ($this->excludeFilePatterns as $excludePattern) { |
|
152 | + if (1 === preg_match($excludePattern, $relativeFilepath)) { |
|
153 | + continue 2; |
|
154 | + } |
|
155 | + } |
|
156 | + |
|
157 | + $this->filesWithDependencies[$relativeFilepath] = $dependency; |
|
158 | + } |
|
159 | + } |
|
160 | + } |
|
161 | + } |
|
162 | + } |
|
163 | + |
|
164 | + /** |
|
165 | + * Returns all found files. |
|
166 | + * |
|
167 | + * @return array<string, ComposerPackage> |
|
168 | + */ |
|
169 | + public function getAllFilesAndDependencyList(): array |
|
170 | + { |
|
171 | + return $this->filesWithDependencies; |
|
172 | + } |
|
173 | + |
|
174 | + /** |
|
175 | + * Returns found PHP files. |
|
176 | + * |
|
177 | + * @return array<string, ComposerPackage> |
|
178 | + */ |
|
179 | + public function getPhpFilesAndDependencyList(): array |
|
180 | + { |
|
181 | + return array_filter($this->filesWithDependencies, function ($value, $key) { |
|
182 | + return false !== strpos($key, '.php'); |
|
183 | + }, ARRAY_FILTER_USE_BOTH); |
|
184 | + } |
|
185 | + |
|
186 | + /** |
|
187 | + * Get the recorded files autoloaders. |
|
188 | + * |
|
189 | + * @return array<string, array<string>> |
|
190 | + */ |
|
191 | + public function getFilesAutoloaders(): array |
|
192 | + { |
|
193 | + return $this->filesAutoloaders; |
|
194 | + } |
|
195 | 195 | } |
@@ -43,14 +43,14 @@ discard block |
||
43 | 43 | * |
44 | 44 | * @var array<string, ComposerPackage> |
45 | 45 | */ |
46 | - protected array $filesWithDependencies = []; |
|
46 | + protected array $filesWithDependencies = [ ]; |
|
47 | 47 | |
48 | 48 | /** |
49 | 49 | * Record the files autolaoders for later use in building our own autoloader. |
50 | 50 | * |
51 | 51 | * @var array |
52 | 52 | */ |
53 | - protected array $filesAutoloaders = []; |
|
53 | + protected array $filesAutoloaders = [ ]; |
|
54 | 54 | |
55 | 55 | /** |
56 | 56 | * Copier constructor. |
@@ -70,7 +70,7 @@ discard block |
||
70 | 70 | $this->excludePackageNames = $config->getExcludePackagesFromCopy(); |
71 | 71 | $this->excludeFilePatterns = $config->getExcludeFilePatternsFromCopy(); |
72 | 72 | |
73 | - $this->filesystem = new Filesystem(new Local($this->workingDir)); |
|
73 | + $this->filesystem = new Filesystem( new Local( $this->workingDir ) ); |
|
74 | 74 | } |
75 | 75 | |
76 | 76 | /** |
@@ -80,10 +80,10 @@ discard block |
||
80 | 80 | { |
81 | 81 | |
82 | 82 | // TODO: read 'vendor' from composer.json. |
83 | - $prefixToRemove = $this->workingDir .'vendor'. DIRECTORY_SEPARATOR; |
|
83 | + $prefixToRemove = $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR; |
|
84 | 84 | |
85 | - foreach ($this->dependencies as $dependency) { |
|
86 | - if (in_array($dependency->getName(), $this->excludePackageNames)) { |
|
85 | + foreach ( $this->dependencies as $dependency ) { |
|
86 | + if ( in_array( $dependency->getName(), $this->excludePackageNames ) ) { |
|
87 | 87 | continue; |
88 | 88 | } |
89 | 89 | |
@@ -97,29 +97,29 @@ discard block |
||
97 | 97 | * Exclude "exclude-from-classmap" |
98 | 98 | * @see https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps |
99 | 99 | */ |
100 | - $autoloaders = array_filter($dependency->getAutoload(), function ($type) { |
|
100 | + $autoloaders = array_filter( $dependency->getAutoload(), function( $type ) { |
|
101 | 101 | return 'exclude-from-classmap' !== $type; |
102 | - }, ARRAY_FILTER_USE_KEY); |
|
102 | + }, ARRAY_FILTER_USE_KEY ); |
|
103 | 103 | |
104 | - foreach ($autoloaders as $type => $value) { |
|
104 | + foreach ( $autoloaders as $type => $value ) { |
|
105 | 105 | // Might have to switch/case here. |
106 | 106 | |
107 | - if ('files' === $type) { |
|
108 | - $this->filesAutoloaders[$dependency->getPath()] = $value; |
|
107 | + if ( 'files' === $type ) { |
|
108 | + $this->filesAutoloaders[ $dependency->getPath() ] = $value; |
|
109 | 109 | } |
110 | 110 | |
111 | - foreach ($value as $namespace => $namespace_relative_path) { |
|
112 | - if (!empty($namespace) && in_array($namespace, $this->excludeNamespaces)) { |
|
111 | + foreach ( $value as $namespace => $namespace_relative_path ) { |
|
112 | + if ( ! empty( $namespace ) && in_array( $namespace, $this->excludeNamespaces ) ) { |
|
113 | 113 | continue; |
114 | 114 | } |
115 | 115 | |
116 | - if (is_file($packagePath . $namespace_relative_path)) { |
|
116 | + if ( is_file( $packagePath . $namespace_relative_path ) ) { |
|
117 | 117 | // $finder->files()->name($file)->in($source_path); |
118 | 118 | |
119 | - $relativeFilepath = str_replace($prefixToRemove, '', $packagePath . $namespace_relative_path); |
|
120 | - $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
119 | + $relativeFilepath = str_replace( $prefixToRemove, '', $packagePath . $namespace_relative_path ); |
|
120 | + $relativeFilepath = preg_replace( '#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath ); |
|
121 | 121 | |
122 | - $this->filesWithDependencies[$relativeFilepath] = $dependency; |
|
122 | + $this->filesWithDependencies[ $relativeFilepath ] = $dependency; |
|
123 | 123 | |
124 | 124 | continue; |
125 | 125 | } |
@@ -127,34 +127,34 @@ discard block |
||
127 | 127 | // else it is a directory. |
128 | 128 | |
129 | 129 | // trailingslashit(). |
130 | - $namespace_relative_path = rtrim($namespace_relative_path, DIRECTORY_SEPARATOR) |
|
130 | + $namespace_relative_path = rtrim( $namespace_relative_path, DIRECTORY_SEPARATOR ) |
|
131 | 131 | . DIRECTORY_SEPARATOR; |
132 | 132 | |
133 | 133 | $sourcePath = $packagePath . $namespace_relative_path; |
134 | 134 | |
135 | 135 | // trailingslashit(). (to remove duplicates). |
136 | - $sourcePath = rtrim($sourcePath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
136 | + $sourcePath = rtrim( $sourcePath, DIRECTORY_SEPARATOR ) . DIRECTORY_SEPARATOR; |
|
137 | 137 | |
138 | 138 | $finder = new Finder(); |
139 | - $finder->files()->in($sourcePath)->followLinks(); |
|
139 | + $finder->files()->in( $sourcePath )->followLinks(); |
|
140 | 140 | |
141 | - foreach ($finder as $foundFile) { |
|
141 | + foreach ( $finder as $foundFile ) { |
|
142 | 142 | $filePath = $foundFile->getPathname(); |
143 | 143 | |
144 | - $relativeFilepath = str_replace($prefixToRemove, '', $filePath); |
|
144 | + $relativeFilepath = str_replace( $prefixToRemove, '', $filePath ); |
|
145 | 145 | |
146 | 146 | // TODO: Is this needed here?! If anything, it's the prefix that needs to be normalised a few |
147 | 147 | // lines above before being used. |
148 | 148 | // Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR. |
149 | - $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
149 | + $relativeFilepath = preg_replace( '#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath ); |
|
150 | 150 | |
151 | - foreach ($this->excludeFilePatterns as $excludePattern) { |
|
152 | - if (1 === preg_match($excludePattern, $relativeFilepath)) { |
|
151 | + foreach ( $this->excludeFilePatterns as $excludePattern ) { |
|
152 | + if ( 1 === preg_match( $excludePattern, $relativeFilepath ) ) { |
|
153 | 153 | continue 2; |
154 | 154 | } |
155 | 155 | } |
156 | 156 | |
157 | - $this->filesWithDependencies[$relativeFilepath] = $dependency; |
|
157 | + $this->filesWithDependencies[ $relativeFilepath ] = $dependency; |
|
158 | 158 | } |
159 | 159 | } |
160 | 160 | } |
@@ -178,9 +178,9 @@ discard block |
||
178 | 178 | */ |
179 | 179 | public function getPhpFilesAndDependencyList(): array |
180 | 180 | { |
181 | - return array_filter($this->filesWithDependencies, function ($value, $key) { |
|
182 | - return false !== strpos($key, '.php'); |
|
183 | - }, ARRAY_FILTER_USE_BOTH); |
|
181 | + return array_filter( $this->filesWithDependencies, function( $value, $key ) { |
|
182 | + return false !== strpos( $key, '.php' ); |
|
183 | + }, ARRAY_FILTER_USE_BOTH ); |
|
184 | 184 | } |
185 | 185 | |
186 | 186 | /** |
@@ -13,8 +13,7 @@ discard block |
||
13 | 13 | use League\Flysystem\Filesystem; |
14 | 14 | use Symfony\Component\Finder\Finder; |
15 | 15 | |
16 | -class FileEnumerator |
|
17 | -{ |
|
16 | +class FileEnumerator { |
|
18 | 17 | |
19 | 18 | /** |
20 | 19 | * The only path variable with a leading slash. |
@@ -76,8 +75,7 @@ discard block |
||
76 | 75 | /** |
77 | 76 | * Read the autoload keys of the dependencies and generate a list of the files referenced. |
78 | 77 | */ |
79 | - public function compileFileList() |
|
80 | - { |
|
78 | + public function compileFileList() { |
|
81 | 79 | |
82 | 80 | // TODO: read 'vendor' from composer.json. |
83 | 81 | $prefixToRemove = $this->workingDir .'vendor'. DIRECTORY_SEPARATOR; |
@@ -25,170 +25,170 @@ discard block |
||
25 | 25 | class Licenser |
26 | 26 | { |
27 | 27 | |
28 | - protected string $workingDir; |
|
28 | + protected string $workingDir; |
|
29 | 29 | |
30 | - protected array $dependencies; |
|
30 | + protected array $dependencies; |
|
31 | 31 | |
32 | - // The author of the current project who is running Strauss to make the changes to the required libraries. |
|
33 | - protected string $author; |
|
32 | + // The author of the current project who is running Strauss to make the changes to the required libraries. |
|
33 | + protected string $author; |
|
34 | 34 | |
35 | - protected string $targetDirectory; |
|
35 | + protected string $targetDirectory; |
|
36 | 36 | |
37 | - /** |
|
38 | - * An array of files relative to the project vendor folder. |
|
39 | - * |
|
40 | - * @var string[] |
|
41 | - */ |
|
42 | - protected array $discoveredLicenseFiles = array(); |
|
37 | + /** |
|
38 | + * An array of files relative to the project vendor folder. |
|
39 | + * |
|
40 | + * @var string[] |
|
41 | + */ |
|
42 | + protected array $discoveredLicenseFiles = array(); |
|
43 | 43 | |
44 | - /** @var Filesystem */ |
|
45 | - protected $filesystem; |
|
44 | + /** @var Filesystem */ |
|
45 | + protected $filesystem; |
|
46 | 46 | |
47 | 47 | |
48 | - /** |
|
49 | - * Licenser constructor. |
|
50 | - * @param string $workingDir |
|
51 | - * @param array $dependencies Whose folders are searched for existing license.txt files. |
|
52 | - * @param string $author To add to each modified file's header |
|
53 | - */ |
|
54 | - public function __construct(StraussConfig $config, string $workingDir, array $dependencies, string $author) |
|
55 | - { |
|
56 | - $this->workingDir = $workingDir; |
|
57 | - $this->dependencies = $dependencies; |
|
58 | - $this->author = $author; |
|
48 | + /** |
|
49 | + * Licenser constructor. |
|
50 | + * @param string $workingDir |
|
51 | + * @param array $dependencies Whose folders are searched for existing license.txt files. |
|
52 | + * @param string $author To add to each modified file's header |
|
53 | + */ |
|
54 | + public function __construct(StraussConfig $config, string $workingDir, array $dependencies, string $author) |
|
55 | + { |
|
56 | + $this->workingDir = $workingDir; |
|
57 | + $this->dependencies = $dependencies; |
|
58 | + $this->author = $author; |
|
59 | 59 | |
60 | - $this->targetDirectory = $config->getTargetDirectory(); |
|
60 | + $this->targetDirectory = $config->getTargetDirectory(); |
|
61 | 61 | |
62 | - $this->filesystem = new Filesystem(new Local($workingDir)); |
|
63 | - } |
|
62 | + $this->filesystem = new Filesystem(new Local($workingDir)); |
|
63 | + } |
|
64 | 64 | |
65 | - public function copyLicenses(): void |
|
66 | - { |
|
67 | - $this->findLicenseFiles(); |
|
68 | - |
|
69 | - foreach ($this->getDiscoveredLicenseFiles() as $licenseFile) { |
|
70 | - $targetLicenseFile = $this->targetDirectory . $licenseFile; |
|
71 | - |
|
72 | - $targetLicenseFileDir = dirname($targetLicenseFile); |
|
73 | - |
|
74 | - // Don't try copy it if it's already there. |
|
75 | - if ($this->filesystem->has($targetLicenseFile)) { |
|
76 | - continue; |
|
77 | - } |
|
78 | - |
|
79 | - // Don't add licenses to non-existent directories – there were no files copied there! |
|
80 | - if (! $this->filesystem->has($targetLicenseFileDir)) { |
|
81 | - continue; |
|
82 | - } |
|
83 | - |
|
84 | - $this->filesystem->copy( |
|
85 | - 'vendor' . DIRECTORY_SEPARATOR . $licenseFile, |
|
86 | - $targetLicenseFile |
|
87 | - ); |
|
88 | - } |
|
89 | - } |
|
90 | - |
|
91 | - |
|
92 | - /** |
|
93 | - * @see https://www.phpliveregex.com/p/A5y |
|
94 | - */ |
|
95 | - public function findLicenseFiles(?Finder $finder = null) |
|
96 | - { |
|
97 | - |
|
98 | - // Include all license files in the dependency path. |
|
99 | - $finder = $finder ?? new Finder(); |
|
100 | - |
|
101 | - // TODO: read 'vendor' from composer.json. |
|
102 | - $prefixToRemove = 'vendor' . DIRECTORY_SEPARATOR; |
|
103 | - |
|
104 | - /** @var ComposerPackage $dependency */ |
|
105 | - foreach ($this->dependencies as $dependency) { |
|
106 | - $packagePath = 'vendor' . DIRECTORY_SEPARATOR . $dependency->getPath(); |
|
107 | - |
|
108 | - // If packages happen to have their vendor dir, i.e. locally required packages, don't included the licenses |
|
109 | - // from their vendor dir (they should be included otherwise anyway). |
|
110 | - // $dependency->getVendorDir() |
|
111 | - $finder->files()->in($packagePath)->followLinks()->exclude(array( 'vendor' ))->name('/^.*licen.e.*/i'); |
|
112 | - |
|
113 | - /** @var \SplFileInfo $foundFile */ |
|
114 | - foreach ($finder as $foundFile) { |
|
115 | - $filePath = $foundFile->getPathname(); |
|
116 | - |
|
117 | - $relativeFilepath = str_replace($prefixToRemove, '', $filePath); |
|
118 | - |
|
119 | - // Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR. |
|
120 | - $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
121 | - |
|
122 | - $this->discoveredLicenseFiles[$relativeFilepath] = $dependency->getName(); |
|
123 | - } |
|
124 | - } |
|
125 | - } |
|
126 | - |
|
127 | - public function getDiscoveredLicenseFiles(): array |
|
128 | - { |
|
129 | - return array_keys($this->discoveredLicenseFiles); |
|
130 | - } |
|
131 | - |
|
132 | - /** |
|
133 | - * @param array<string, ComposerPackage> $modifiedFiles |
|
134 | - */ |
|
135 | - public function addInformationToUpdatedFiles(array $modifiedFiles) |
|
136 | - { |
|
137 | - |
|
138 | - // e.g. "25-April-2021". |
|
139 | - $date = gmdate("d-F-Y", time()); |
|
140 | - |
|
141 | - foreach ($modifiedFiles as $relativeFilePath => $package) { |
|
142 | - $filepath = $this->targetDirectory . $relativeFilePath; |
|
143 | - |
|
144 | - $packageLicense = $package->getLicense(); |
|
145 | - |
|
146 | - // Throws an exception, but unlikely to happen. |
|
147 | - $contents = $this->filesystem->read($filepath); |
|
148 | - |
|
149 | - $updatedContents = $this->addChangeDeclarationToPhpString($contents, $date, $packageLicense); |
|
150 | - |
|
151 | - if ($updatedContents !== $contents) { |
|
152 | - $this->filesystem->put($filepath, $updatedContents); |
|
153 | - } |
|
154 | - } |
|
155 | - } |
|
156 | - |
|
157 | - /** |
|
158 | - * Given a php file as a string, edit it's header phpdoc, or add a header, to include: |
|
159 | - * |
|
160 | - * "Modified by {author} on {date} using Strauss. |
|
161 | - * @see https://github.com/BrianHenryIE/strauss" |
|
162 | - * |
|
163 | - * Should probably include the original license in each file since it'll often be a mix, with the parent |
|
164 | - * project often being a GPL WordPress plugin. |
|
165 | - * |
|
166 | - * Find the string between the end of php-opener and the first valid code. |
|
167 | - * First valid code will be a line whose first non-whitespace character is not / or * ?... NO! |
|
168 | - * If the first non whitespace string after php-opener is multiline-comment-opener, find the |
|
169 | - * closing multiline-comment-closer |
|
170 | - * / If there's already a comment, work within that comment |
|
171 | - * If there is no mention in the header of the license already, add it. |
|
172 | - * Add a note that changes have been made. |
|
173 | - * |
|
174 | - * @param string $phpString Code. |
|
175 | - */ |
|
176 | - public function addChangeDeclarationToPhpString( |
|
177 | - string $phpString, |
|
178 | - string $modifiedDate, |
|
179 | - string $packageLicense |
|
180 | - ) : string { |
|
181 | - |
|
182 | - $author = $this->author; |
|
183 | - |
|
184 | - $licenseDeclaration = "@license {$packageLicense}"; |
|
185 | - $modifiedDeclaration = "Modified by {$author} on {$modifiedDate} using Strauss."; |
|
186 | - $straussLink = "@see https://github.com/BrianHenryIE/strauss"; |
|
187 | - |
|
188 | - // php-open followed by some whitespace and new line until the first ... |
|
189 | - $noCommentBetweenPhpOpenAndFirstCodePattern = '~<\?php[\s\n]*[\w\\\?]+~'; |
|
190 | - |
|
191 | - $multilineCommentCapturePattern = ' |
|
65 | + public function copyLicenses(): void |
|
66 | + { |
|
67 | + $this->findLicenseFiles(); |
|
68 | + |
|
69 | + foreach ($this->getDiscoveredLicenseFiles() as $licenseFile) { |
|
70 | + $targetLicenseFile = $this->targetDirectory . $licenseFile; |
|
71 | + |
|
72 | + $targetLicenseFileDir = dirname($targetLicenseFile); |
|
73 | + |
|
74 | + // Don't try copy it if it's already there. |
|
75 | + if ($this->filesystem->has($targetLicenseFile)) { |
|
76 | + continue; |
|
77 | + } |
|
78 | + |
|
79 | + // Don't add licenses to non-existent directories – there were no files copied there! |
|
80 | + if (! $this->filesystem->has($targetLicenseFileDir)) { |
|
81 | + continue; |
|
82 | + } |
|
83 | + |
|
84 | + $this->filesystem->copy( |
|
85 | + 'vendor' . DIRECTORY_SEPARATOR . $licenseFile, |
|
86 | + $targetLicenseFile |
|
87 | + ); |
|
88 | + } |
|
89 | + } |
|
90 | + |
|
91 | + |
|
92 | + /** |
|
93 | + * @see https://www.phpliveregex.com/p/A5y |
|
94 | + */ |
|
95 | + public function findLicenseFiles(?Finder $finder = null) |
|
96 | + { |
|
97 | + |
|
98 | + // Include all license files in the dependency path. |
|
99 | + $finder = $finder ?? new Finder(); |
|
100 | + |
|
101 | + // TODO: read 'vendor' from composer.json. |
|
102 | + $prefixToRemove = 'vendor' . DIRECTORY_SEPARATOR; |
|
103 | + |
|
104 | + /** @var ComposerPackage $dependency */ |
|
105 | + foreach ($this->dependencies as $dependency) { |
|
106 | + $packagePath = 'vendor' . DIRECTORY_SEPARATOR . $dependency->getPath(); |
|
107 | + |
|
108 | + // If packages happen to have their vendor dir, i.e. locally required packages, don't included the licenses |
|
109 | + // from their vendor dir (they should be included otherwise anyway). |
|
110 | + // $dependency->getVendorDir() |
|
111 | + $finder->files()->in($packagePath)->followLinks()->exclude(array( 'vendor' ))->name('/^.*licen.e.*/i'); |
|
112 | + |
|
113 | + /** @var \SplFileInfo $foundFile */ |
|
114 | + foreach ($finder as $foundFile) { |
|
115 | + $filePath = $foundFile->getPathname(); |
|
116 | + |
|
117 | + $relativeFilepath = str_replace($prefixToRemove, '', $filePath); |
|
118 | + |
|
119 | + // Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR. |
|
120 | + $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
121 | + |
|
122 | + $this->discoveredLicenseFiles[$relativeFilepath] = $dependency->getName(); |
|
123 | + } |
|
124 | + } |
|
125 | + } |
|
126 | + |
|
127 | + public function getDiscoveredLicenseFiles(): array |
|
128 | + { |
|
129 | + return array_keys($this->discoveredLicenseFiles); |
|
130 | + } |
|
131 | + |
|
132 | + /** |
|
133 | + * @param array<string, ComposerPackage> $modifiedFiles |
|
134 | + */ |
|
135 | + public function addInformationToUpdatedFiles(array $modifiedFiles) |
|
136 | + { |
|
137 | + |
|
138 | + // e.g. "25-April-2021". |
|
139 | + $date = gmdate("d-F-Y", time()); |
|
140 | + |
|
141 | + foreach ($modifiedFiles as $relativeFilePath => $package) { |
|
142 | + $filepath = $this->targetDirectory . $relativeFilePath; |
|
143 | + |
|
144 | + $packageLicense = $package->getLicense(); |
|
145 | + |
|
146 | + // Throws an exception, but unlikely to happen. |
|
147 | + $contents = $this->filesystem->read($filepath); |
|
148 | + |
|
149 | + $updatedContents = $this->addChangeDeclarationToPhpString($contents, $date, $packageLicense); |
|
150 | + |
|
151 | + if ($updatedContents !== $contents) { |
|
152 | + $this->filesystem->put($filepath, $updatedContents); |
|
153 | + } |
|
154 | + } |
|
155 | + } |
|
156 | + |
|
157 | + /** |
|
158 | + * Given a php file as a string, edit it's header phpdoc, or add a header, to include: |
|
159 | + * |
|
160 | + * "Modified by {author} on {date} using Strauss. |
|
161 | + * @see https://github.com/BrianHenryIE/strauss" |
|
162 | + * |
|
163 | + * Should probably include the original license in each file since it'll often be a mix, with the parent |
|
164 | + * project often being a GPL WordPress plugin. |
|
165 | + * |
|
166 | + * Find the string between the end of php-opener and the first valid code. |
|
167 | + * First valid code will be a line whose first non-whitespace character is not / or * ?... NO! |
|
168 | + * If the first non whitespace string after php-opener is multiline-comment-opener, find the |
|
169 | + * closing multiline-comment-closer |
|
170 | + * / If there's already a comment, work within that comment |
|
171 | + * If there is no mention in the header of the license already, add it. |
|
172 | + * Add a note that changes have been made. |
|
173 | + * |
|
174 | + * @param string $phpString Code. |
|
175 | + */ |
|
176 | + public function addChangeDeclarationToPhpString( |
|
177 | + string $phpString, |
|
178 | + string $modifiedDate, |
|
179 | + string $packageLicense |
|
180 | + ) : string { |
|
181 | + |
|
182 | + $author = $this->author; |
|
183 | + |
|
184 | + $licenseDeclaration = "@license {$packageLicense}"; |
|
185 | + $modifiedDeclaration = "Modified by {$author} on {$modifiedDate} using Strauss."; |
|
186 | + $straussLink = "@see https://github.com/BrianHenryIE/strauss"; |
|
187 | + |
|
188 | + // php-open followed by some whitespace and new line until the first ... |
|
189 | + $noCommentBetweenPhpOpenAndFirstCodePattern = '~<\?php[\s\n]*[\w\\\?]+~'; |
|
190 | + |
|
191 | + $multilineCommentCapturePattern = ' |
|
192 | 192 | ~ # Start the pattern |
193 | 193 | ( |
194 | 194 | <\?php[\S\s]* # match the beginning of the files php-open and following whitespace |
@@ -202,51 +202,51 @@ discard block |
||
202 | 202 | ~Ux'; // U: Non-greedy matching, x: ignore whitespace in pattern. |
203 | 203 | |
204 | 204 | |
205 | - $replaceInMultilineCommentFunction = function ($matches) use ( |
|
206 | - $licenseDeclaration, |
|
207 | - $modifiedDeclaration, |
|
208 | - $straussLink |
|
209 | - ) { |
|
205 | + $replaceInMultilineCommentFunction = function ($matches) use ( |
|
206 | + $licenseDeclaration, |
|
207 | + $modifiedDeclaration, |
|
208 | + $straussLink |
|
209 | + ) { |
|
210 | 210 | |
211 | - // Find the line prefix and use it, i.e. could be none, asterisk or space-asterisk. |
|
212 | - $commentLines = explode("\n", $matches[2]); |
|
211 | + // Find the line prefix and use it, i.e. could be none, asterisk or space-asterisk. |
|
212 | + $commentLines = explode("\n", $matches[2]); |
|
213 | 213 | |
214 | - if (isset($commentLines[1])&& 1 === preg_match('/^([\s\\\*]*)/', $commentLines[1], $output_array)) { |
|
215 | - $lineStart = $output_array[1]; |
|
216 | - } else { |
|
217 | - $lineStart = ' * '; |
|
218 | - } |
|
214 | + if (isset($commentLines[1])&& 1 === preg_match('/^([\s\\\*]*)/', $commentLines[1], $output_array)) { |
|
215 | + $lineStart = $output_array[1]; |
|
216 | + } else { |
|
217 | + $lineStart = ' * '; |
|
218 | + } |
|
219 | 219 | |
220 | - $appendString = "*\n"; |
|
220 | + $appendString = "*\n"; |
|
221 | 221 | |
222 | - // If the license is not already specified in the header, add it. |
|
223 | - if (false === strpos($matches[2], 'licen')) { |
|
224 | - $appendString .= "{$lineStart}{$licenseDeclaration}\n"; |
|
225 | - } |
|
222 | + // If the license is not already specified in the header, add it. |
|
223 | + if (false === strpos($matches[2], 'licen')) { |
|
224 | + $appendString .= "{$lineStart}{$licenseDeclaration}\n"; |
|
225 | + } |
|
226 | 226 | |
227 | - $appendString .= "{$lineStart}{$modifiedDeclaration}\n"; |
|
228 | - $appendString .= "{$lineStart}{$straussLink}\n"; |
|
227 | + $appendString .= "{$lineStart}{$modifiedDeclaration}\n"; |
|
228 | + $appendString .= "{$lineStart}{$straussLink}\n"; |
|
229 | 229 | |
230 | - $commentEnd = rtrim(rtrim($lineStart, ' '), '*').'*/'; |
|
230 | + $commentEnd = rtrim(rtrim($lineStart, ' '), '*').'*/'; |
|
231 | 231 | |
232 | - $replaceWith = $matches[1] . $matches[2] . $appendString . $commentEnd; |
|
232 | + $replaceWith = $matches[1] . $matches[2] . $appendString . $commentEnd; |
|
233 | 233 | |
234 | - return $replaceWith; |
|
235 | - }; |
|
234 | + return $replaceWith; |
|
235 | + }; |
|
236 | 236 | |
237 | - // If it's a simple case where there is no existing header, add the existing license. |
|
238 | - if (1 === preg_match($noCommentBetweenPhpOpenAndFirstCodePattern, $phpString)) { |
|
239 | - $modifiedComment = "/**\n * {$licenseDeclaration}\n *\n * {$modifiedDeclaration}\n * {$straussLink}\n */"; |
|
240 | - $updatedPhpString = preg_replace('~<\?php~', "<?php\n". $modifiedComment, $phpString, 1); |
|
241 | - } else { |
|
242 | - $updatedPhpString = preg_replace_callback( |
|
243 | - $multilineCommentCapturePattern, |
|
244 | - $replaceInMultilineCommentFunction, |
|
245 | - $phpString, |
|
246 | - 1 |
|
247 | - ); |
|
248 | - } |
|
237 | + // If it's a simple case where there is no existing header, add the existing license. |
|
238 | + if (1 === preg_match($noCommentBetweenPhpOpenAndFirstCodePattern, $phpString)) { |
|
239 | + $modifiedComment = "/**\n * {$licenseDeclaration}\n *\n * {$modifiedDeclaration}\n * {$straussLink}\n */"; |
|
240 | + $updatedPhpString = preg_replace('~<\?php~', "<?php\n". $modifiedComment, $phpString, 1); |
|
241 | + } else { |
|
242 | + $updatedPhpString = preg_replace_callback( |
|
243 | + $multilineCommentCapturePattern, |
|
244 | + $replaceInMultilineCommentFunction, |
|
245 | + $phpString, |
|
246 | + 1 |
|
247 | + ); |
|
248 | + } |
|
249 | 249 | |
250 | - return $updatedPhpString; |
|
251 | - } |
|
250 | + return $updatedPhpString; |
|
251 | + } |
|
252 | 252 | } |
@@ -51,7 +51,7 @@ discard block |
||
51 | 51 | * @param array $dependencies Whose folders are searched for existing license.txt files. |
52 | 52 | * @param string $author To add to each modified file's header |
53 | 53 | */ |
54 | - public function __construct(StraussConfig $config, string $workingDir, array $dependencies, string $author) |
|
54 | + public function __construct( StraussConfig $config, string $workingDir, array $dependencies, string $author ) |
|
55 | 55 | { |
56 | 56 | $this->workingDir = $workingDir; |
57 | 57 | $this->dependencies = $dependencies; |
@@ -59,25 +59,25 @@ discard block |
||
59 | 59 | |
60 | 60 | $this->targetDirectory = $config->getTargetDirectory(); |
61 | 61 | |
62 | - $this->filesystem = new Filesystem(new Local($workingDir)); |
|
62 | + $this->filesystem = new Filesystem( new Local( $workingDir ) ); |
|
63 | 63 | } |
64 | 64 | |
65 | 65 | public function copyLicenses(): void |
66 | 66 | { |
67 | 67 | $this->findLicenseFiles(); |
68 | 68 | |
69 | - foreach ($this->getDiscoveredLicenseFiles() as $licenseFile) { |
|
69 | + foreach ( $this->getDiscoveredLicenseFiles() as $licenseFile ) { |
|
70 | 70 | $targetLicenseFile = $this->targetDirectory . $licenseFile; |
71 | 71 | |
72 | - $targetLicenseFileDir = dirname($targetLicenseFile); |
|
72 | + $targetLicenseFileDir = dirname( $targetLicenseFile ); |
|
73 | 73 | |
74 | 74 | // Don't try copy it if it's already there. |
75 | - if ($this->filesystem->has($targetLicenseFile)) { |
|
75 | + if ( $this->filesystem->has( $targetLicenseFile ) ) { |
|
76 | 76 | continue; |
77 | 77 | } |
78 | 78 | |
79 | 79 | // Don't add licenses to non-existent directories – there were no files copied there! |
80 | - if (! $this->filesystem->has($targetLicenseFileDir)) { |
|
80 | + if ( ! $this->filesystem->has( $targetLicenseFileDir ) ) { |
|
81 | 81 | continue; |
82 | 82 | } |
83 | 83 | |
@@ -92,7 +92,7 @@ discard block |
||
92 | 92 | /** |
93 | 93 | * @see https://www.phpliveregex.com/p/A5y |
94 | 94 | */ |
95 | - public function findLicenseFiles(?Finder $finder = null) |
|
95 | + public function findLicenseFiles( ?Finder $finder = null ) |
|
96 | 96 | { |
97 | 97 | |
98 | 98 | // Include all license files in the dependency path. |
@@ -102,54 +102,54 @@ discard block |
||
102 | 102 | $prefixToRemove = 'vendor' . DIRECTORY_SEPARATOR; |
103 | 103 | |
104 | 104 | /** @var ComposerPackage $dependency */ |
105 | - foreach ($this->dependencies as $dependency) { |
|
105 | + foreach ( $this->dependencies as $dependency ) { |
|
106 | 106 | $packagePath = 'vendor' . DIRECTORY_SEPARATOR . $dependency->getPath(); |
107 | 107 | |
108 | 108 | // If packages happen to have their vendor dir, i.e. locally required packages, don't included the licenses |
109 | 109 | // from their vendor dir (they should be included otherwise anyway). |
110 | 110 | // $dependency->getVendorDir() |
111 | - $finder->files()->in($packagePath)->followLinks()->exclude(array( 'vendor' ))->name('/^.*licen.e.*/i'); |
|
111 | + $finder->files()->in( $packagePath )->followLinks()->exclude( array( 'vendor' ) )->name( '/^.*licen.e.*/i' ); |
|
112 | 112 | |
113 | 113 | /** @var \SplFileInfo $foundFile */ |
114 | - foreach ($finder as $foundFile) { |
|
114 | + foreach ( $finder as $foundFile ) { |
|
115 | 115 | $filePath = $foundFile->getPathname(); |
116 | 116 | |
117 | - $relativeFilepath = str_replace($prefixToRemove, '', $filePath); |
|
117 | + $relativeFilepath = str_replace( $prefixToRemove, '', $filePath ); |
|
118 | 118 | |
119 | 119 | // Replace multiple \ and/or / with OS native DIRECTORY_SEPARATOR. |
120 | - $relativeFilepath = preg_replace('#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath); |
|
120 | + $relativeFilepath = preg_replace( '#[\\\/]+#', DIRECTORY_SEPARATOR, $relativeFilepath ); |
|
121 | 121 | |
122 | - $this->discoveredLicenseFiles[$relativeFilepath] = $dependency->getName(); |
|
122 | + $this->discoveredLicenseFiles[ $relativeFilepath ] = $dependency->getName(); |
|
123 | 123 | } |
124 | 124 | } |
125 | 125 | } |
126 | 126 | |
127 | 127 | public function getDiscoveredLicenseFiles(): array |
128 | 128 | { |
129 | - return array_keys($this->discoveredLicenseFiles); |
|
129 | + return array_keys( $this->discoveredLicenseFiles ); |
|
130 | 130 | } |
131 | 131 | |
132 | 132 | /** |
133 | 133 | * @param array<string, ComposerPackage> $modifiedFiles |
134 | 134 | */ |
135 | - public function addInformationToUpdatedFiles(array $modifiedFiles) |
|
135 | + public function addInformationToUpdatedFiles( array $modifiedFiles ) |
|
136 | 136 | { |
137 | 137 | |
138 | 138 | // e.g. "25-April-2021". |
139 | - $date = gmdate("d-F-Y", time()); |
|
139 | + $date = gmdate( "d-F-Y", time() ); |
|
140 | 140 | |
141 | - foreach ($modifiedFiles as $relativeFilePath => $package) { |
|
141 | + foreach ( $modifiedFiles as $relativeFilePath => $package ) { |
|
142 | 142 | $filepath = $this->targetDirectory . $relativeFilePath; |
143 | 143 | |
144 | 144 | $packageLicense = $package->getLicense(); |
145 | 145 | |
146 | 146 | // Throws an exception, but unlikely to happen. |
147 | - $contents = $this->filesystem->read($filepath); |
|
147 | + $contents = $this->filesystem->read( $filepath ); |
|
148 | 148 | |
149 | - $updatedContents = $this->addChangeDeclarationToPhpString($contents, $date, $packageLicense); |
|
149 | + $updatedContents = $this->addChangeDeclarationToPhpString( $contents, $date, $packageLicense ); |
|
150 | 150 | |
151 | - if ($updatedContents !== $contents) { |
|
152 | - $this->filesystem->put($filepath, $updatedContents); |
|
151 | + if ( $updatedContents !== $contents ) { |
|
152 | + $this->filesystem->put( $filepath, $updatedContents ); |
|
153 | 153 | } |
154 | 154 | } |
155 | 155 | } |
@@ -202,17 +202,17 @@ discard block |
||
202 | 202 | ~Ux'; // U: Non-greedy matching, x: ignore whitespace in pattern. |
203 | 203 | |
204 | 204 | |
205 | - $replaceInMultilineCommentFunction = function ($matches) use ( |
|
205 | + $replaceInMultilineCommentFunction = function( $matches ) use ( |
|
206 | 206 | $licenseDeclaration, |
207 | 207 | $modifiedDeclaration, |
208 | 208 | $straussLink |
209 | 209 | ) { |
210 | 210 | |
211 | 211 | // Find the line prefix and use it, i.e. could be none, asterisk or space-asterisk. |
212 | - $commentLines = explode("\n", $matches[2]); |
|
212 | + $commentLines = explode( "\n", $matches[ 2 ] ); |
|
213 | 213 | |
214 | - if (isset($commentLines[1])&& 1 === preg_match('/^([\s\\\*]*)/', $commentLines[1], $output_array)) { |
|
215 | - $lineStart = $output_array[1]; |
|
214 | + if ( isset( $commentLines[ 1 ] ) && 1 === preg_match( '/^([\s\\\*]*)/', $commentLines[ 1 ], $output_array ) ) { |
|
215 | + $lineStart = $output_array[ 1 ]; |
|
216 | 216 | } else { |
217 | 217 | $lineStart = ' * '; |
218 | 218 | } |
@@ -220,24 +220,24 @@ discard block |
||
220 | 220 | $appendString = "*\n"; |
221 | 221 | |
222 | 222 | // If the license is not already specified in the header, add it. |
223 | - if (false === strpos($matches[2], 'licen')) { |
|
223 | + if ( false === strpos( $matches[ 2 ], 'licen' ) ) { |
|
224 | 224 | $appendString .= "{$lineStart}{$licenseDeclaration}\n"; |
225 | 225 | } |
226 | 226 | |
227 | 227 | $appendString .= "{$lineStart}{$modifiedDeclaration}\n"; |
228 | 228 | $appendString .= "{$lineStart}{$straussLink}\n"; |
229 | 229 | |
230 | - $commentEnd = rtrim(rtrim($lineStart, ' '), '*').'*/'; |
|
230 | + $commentEnd = rtrim( rtrim( $lineStart, ' ' ), '*' ) . '*/'; |
|
231 | 231 | |
232 | - $replaceWith = $matches[1] . $matches[2] . $appendString . $commentEnd; |
|
232 | + $replaceWith = $matches[ 1 ] . $matches[ 2 ] . $appendString . $commentEnd; |
|
233 | 233 | |
234 | 234 | return $replaceWith; |
235 | 235 | }; |
236 | 236 | |
237 | 237 | // If it's a simple case where there is no existing header, add the existing license. |
238 | - if (1 === preg_match($noCommentBetweenPhpOpenAndFirstCodePattern, $phpString)) { |
|
238 | + if ( 1 === preg_match( $noCommentBetweenPhpOpenAndFirstCodePattern, $phpString ) ) { |
|
239 | 239 | $modifiedComment = "/**\n * {$licenseDeclaration}\n *\n * {$modifiedDeclaration}\n * {$straussLink}\n */"; |
240 | - $updatedPhpString = preg_replace('~<\?php~', "<?php\n". $modifiedComment, $phpString, 1); |
|
240 | + $updatedPhpString = preg_replace( '~<\?php~', "<?php\n" . $modifiedComment, $phpString, 1 ); |
|
241 | 241 | } else { |
242 | 242 | $updatedPhpString = preg_replace_callback( |
243 | 243 | $multilineCommentCapturePattern, |
@@ -22,8 +22,7 @@ discard block |
||
22 | 22 | use League\Flysystem\Filesystem; |
23 | 23 | use Symfony\Component\Finder\Finder; |
24 | 24 | |
25 | -class Licenser |
|
26 | -{ |
|
25 | +class Licenser { |
|
27 | 26 | |
28 | 27 | protected string $workingDir; |
29 | 28 | |
@@ -51,8 +50,7 @@ discard block |
||
51 | 50 | * @param array $dependencies Whose folders are searched for existing license.txt files. |
52 | 51 | * @param string $author To add to each modified file's header |
53 | 52 | */ |
54 | - public function __construct(StraussConfig $config, string $workingDir, array $dependencies, string $author) |
|
55 | - { |
|
53 | + public function __construct(StraussConfig $config, string $workingDir, array $dependencies, string $author) { |
|
56 | 54 | $this->workingDir = $workingDir; |
57 | 55 | $this->dependencies = $dependencies; |
58 | 56 | $this->author = $author; |
@@ -92,8 +90,7 @@ discard block |
||
92 | 90 | /** |
93 | 91 | * @see https://www.phpliveregex.com/p/A5y |
94 | 92 | */ |
95 | - public function findLicenseFiles(?Finder $finder = null) |
|
96 | - { |
|
93 | + public function findLicenseFiles(?Finder $finder = null) { |
|
97 | 94 | |
98 | 95 | // Include all license files in the dependency path. |
99 | 96 | $finder = $finder ?? new Finder(); |
@@ -132,8 +129,7 @@ discard block |
||
132 | 129 | /** |
133 | 130 | * @param array<string, ComposerPackage> $modifiedFiles |
134 | 131 | */ |
135 | - public function addInformationToUpdatedFiles(array $modifiedFiles) |
|
136 | - { |
|
132 | + public function addInformationToUpdatedFiles(array $modifiedFiles) { |
|
137 | 133 | |
138 | 134 | // e.g. "25-April-2021". |
139 | 135 | $date = gmdate("d-F-Y", time()); |
@@ -11,118 +11,118 @@ discard block |
||
11 | 11 | |
12 | 12 | class Prefixer |
13 | 13 | { |
14 | - /** @var StraussConfig */ |
|
15 | - protected $config; |
|
16 | - |
|
17 | - /** @var Filesystem */ |
|
18 | - protected $filesystem; |
|
19 | - |
|
20 | - protected string $targetDirectory; |
|
21 | - protected string $namespacePrefix; |
|
22 | - protected string $classmapPrefix; |
|
23 | - |
|
24 | - protected array $excludePackageNamesFromPrefixing; |
|
25 | - protected array $excludeNamespacesFromPrefixing; |
|
26 | - protected array $excludeFilePatternsFromPrefixing; |
|
27 | - |
|
28 | - /** @var array<string, ComposerPackage> */ |
|
29 | - protected array $changedFiles = array(); |
|
30 | - |
|
31 | - public function __construct(StraussConfig $config, string $workingDir) |
|
32 | - { |
|
33 | - $this->filesystem = new Filesystem(new Local($workingDir)); |
|
34 | - |
|
35 | - $this->targetDirectory = $config->getTargetDirectory(); |
|
36 | - $this->namespacePrefix = $config->getNamespacePrefix(); |
|
37 | - $this->classmapPrefix = $config->getClassmapPrefix(); |
|
38 | - |
|
39 | - $this->excludePackageNamesFromPrefixing = $config->getExcludePackagesFromPrefixing(); |
|
40 | - $this->excludeNamespacesFromPrefixing = $config->getExcludeNamespacesFromPrefixing(); |
|
41 | - $this->excludeFilePatternsFromPrefixing = $config->getExcludeFilePatternsFromPrefixing(); |
|
42 | - } |
|
43 | - |
|
44 | - // Don't replace a classname if there's an import for a class with the same name. |
|
45 | - // but do replace \Classname always |
|
46 | - |
|
47 | - |
|
48 | - /** |
|
49 | - * @param array<string, string> $namespaceChanges |
|
50 | - * @param array<string, string> $classChanges |
|
51 | - * @param array<string, ComposerPackage> $phpFileList |
|
52 | - * @throws FileNotFoundException |
|
53 | - */ |
|
54 | - public function replaceInFiles(array $namespaceChanges, array $classChanges, array $phpFileList) |
|
55 | - { |
|
56 | - |
|
57 | - foreach ($phpFileList as $sourceRelativeFilePathFromVendor => $package) { |
|
58 | - // Skip excluded namespaces. |
|
59 | - if (in_array($package->getName(), $this->excludePackageNamesFromPrefixing)) { |
|
60 | - continue; |
|
61 | - } |
|
62 | - |
|
63 | - // Skip files whose filepath matches an excluded pattern. |
|
64 | - foreach ($this->excludeFilePatternsFromPrefixing as $excludePattern) { |
|
65 | - if (1 === preg_match($excludePattern, $sourceRelativeFilePathFromVendor)) { |
|
66 | - continue 2; |
|
67 | - } |
|
68 | - } |
|
69 | - |
|
70 | - $targetRelativeFilepathFromProject = |
|
71 | - $this->targetDirectory. $sourceRelativeFilePathFromVendor; |
|
72 | - |
|
73 | - // Throws an exception, but unlikely to happen. |
|
74 | - $contents = $this->filesystem->read($targetRelativeFilepathFromProject); |
|
75 | - |
|
76 | - $updatedContents = $this->replaceInString($namespaceChanges, $classChanges, $contents); |
|
77 | - |
|
78 | - if ($updatedContents !== $contents) { |
|
79 | - $this->changedFiles[$sourceRelativeFilePathFromVendor] = $package; |
|
80 | - $this->filesystem->put($targetRelativeFilepathFromProject, $updatedContents); |
|
81 | - } |
|
82 | - } |
|
83 | - } |
|
84 | - |
|
85 | - public function replaceInString(array $namespacesChanges, array $classes, string $contents): string |
|
86 | - { |
|
87 | - |
|
88 | - foreach ($namespacesChanges as $originalNamespace => $replacement) { |
|
89 | - if (in_array($originalNamespace, $this->excludeNamespacesFromPrefixing)) { |
|
90 | - continue; |
|
91 | - } |
|
92 | - |
|
93 | - $contents = $this->replaceNamespace($contents, $originalNamespace, $replacement); |
|
94 | - } |
|
95 | - |
|
96 | - foreach ($classes as $originalClassname) { |
|
97 | - $classmapPrefix = $this->classmapPrefix; |
|
98 | - |
|
99 | - $contents = $this->replaceClassname($contents, $originalClassname, $classmapPrefix); |
|
100 | - } |
|
101 | - |
|
102 | - return $contents; |
|
103 | - } |
|
104 | - |
|
105 | - /** |
|
106 | - * TODO: Test against traits. |
|
107 | - * |
|
108 | - * @param string $contents The text to make replacements in. |
|
109 | - * |
|
110 | - * @return string The updated text. |
|
111 | - */ |
|
112 | - public function replaceNamespace($contents, $originalNamespace, $replacement) |
|
113 | - { |
|
114 | - |
|
115 | - // When namespaces exist inside strings... |
|
116 | - $searchNamespace = |
|
117 | - preg_quote($originalNamespace, '/') |
|
118 | - . '|' |
|
119 | - . preg_quote(str_replace('\\', '\\\\', $originalNamespace), '/') |
|
120 | - . '|' |
|
121 | - . preg_quote('\\' . $originalNamespace, '/') |
|
122 | - . '|' |
|
123 | - . preg_quote('\\\\' . str_replace('\\', '\\\\', $originalNamespace), '/'); |
|
124 | - |
|
125 | - $pattern = " |
|
14 | + /** @var StraussConfig */ |
|
15 | + protected $config; |
|
16 | + |
|
17 | + /** @var Filesystem */ |
|
18 | + protected $filesystem; |
|
19 | + |
|
20 | + protected string $targetDirectory; |
|
21 | + protected string $namespacePrefix; |
|
22 | + protected string $classmapPrefix; |
|
23 | + |
|
24 | + protected array $excludePackageNamesFromPrefixing; |
|
25 | + protected array $excludeNamespacesFromPrefixing; |
|
26 | + protected array $excludeFilePatternsFromPrefixing; |
|
27 | + |
|
28 | + /** @var array<string, ComposerPackage> */ |
|
29 | + protected array $changedFiles = array(); |
|
30 | + |
|
31 | + public function __construct(StraussConfig $config, string $workingDir) |
|
32 | + { |
|
33 | + $this->filesystem = new Filesystem(new Local($workingDir)); |
|
34 | + |
|
35 | + $this->targetDirectory = $config->getTargetDirectory(); |
|
36 | + $this->namespacePrefix = $config->getNamespacePrefix(); |
|
37 | + $this->classmapPrefix = $config->getClassmapPrefix(); |
|
38 | + |
|
39 | + $this->excludePackageNamesFromPrefixing = $config->getExcludePackagesFromPrefixing(); |
|
40 | + $this->excludeNamespacesFromPrefixing = $config->getExcludeNamespacesFromPrefixing(); |
|
41 | + $this->excludeFilePatternsFromPrefixing = $config->getExcludeFilePatternsFromPrefixing(); |
|
42 | + } |
|
43 | + |
|
44 | + // Don't replace a classname if there's an import for a class with the same name. |
|
45 | + // but do replace \Classname always |
|
46 | + |
|
47 | + |
|
48 | + /** |
|
49 | + * @param array<string, string> $namespaceChanges |
|
50 | + * @param array<string, string> $classChanges |
|
51 | + * @param array<string, ComposerPackage> $phpFileList |
|
52 | + * @throws FileNotFoundException |
|
53 | + */ |
|
54 | + public function replaceInFiles(array $namespaceChanges, array $classChanges, array $phpFileList) |
|
55 | + { |
|
56 | + |
|
57 | + foreach ($phpFileList as $sourceRelativeFilePathFromVendor => $package) { |
|
58 | + // Skip excluded namespaces. |
|
59 | + if (in_array($package->getName(), $this->excludePackageNamesFromPrefixing)) { |
|
60 | + continue; |
|
61 | + } |
|
62 | + |
|
63 | + // Skip files whose filepath matches an excluded pattern. |
|
64 | + foreach ($this->excludeFilePatternsFromPrefixing as $excludePattern) { |
|
65 | + if (1 === preg_match($excludePattern, $sourceRelativeFilePathFromVendor)) { |
|
66 | + continue 2; |
|
67 | + } |
|
68 | + } |
|
69 | + |
|
70 | + $targetRelativeFilepathFromProject = |
|
71 | + $this->targetDirectory. $sourceRelativeFilePathFromVendor; |
|
72 | + |
|
73 | + // Throws an exception, but unlikely to happen. |
|
74 | + $contents = $this->filesystem->read($targetRelativeFilepathFromProject); |
|
75 | + |
|
76 | + $updatedContents = $this->replaceInString($namespaceChanges, $classChanges, $contents); |
|
77 | + |
|
78 | + if ($updatedContents !== $contents) { |
|
79 | + $this->changedFiles[$sourceRelativeFilePathFromVendor] = $package; |
|
80 | + $this->filesystem->put($targetRelativeFilepathFromProject, $updatedContents); |
|
81 | + } |
|
82 | + } |
|
83 | + } |
|
84 | + |
|
85 | + public function replaceInString(array $namespacesChanges, array $classes, string $contents): string |
|
86 | + { |
|
87 | + |
|
88 | + foreach ($namespacesChanges as $originalNamespace => $replacement) { |
|
89 | + if (in_array($originalNamespace, $this->excludeNamespacesFromPrefixing)) { |
|
90 | + continue; |
|
91 | + } |
|
92 | + |
|
93 | + $contents = $this->replaceNamespace($contents, $originalNamespace, $replacement); |
|
94 | + } |
|
95 | + |
|
96 | + foreach ($classes as $originalClassname) { |
|
97 | + $classmapPrefix = $this->classmapPrefix; |
|
98 | + |
|
99 | + $contents = $this->replaceClassname($contents, $originalClassname, $classmapPrefix); |
|
100 | + } |
|
101 | + |
|
102 | + return $contents; |
|
103 | + } |
|
104 | + |
|
105 | + /** |
|
106 | + * TODO: Test against traits. |
|
107 | + * |
|
108 | + * @param string $contents The text to make replacements in. |
|
109 | + * |
|
110 | + * @return string The updated text. |
|
111 | + */ |
|
112 | + public function replaceNamespace($contents, $originalNamespace, $replacement) |
|
113 | + { |
|
114 | + |
|
115 | + // When namespaces exist inside strings... |
|
116 | + $searchNamespace = |
|
117 | + preg_quote($originalNamespace, '/') |
|
118 | + . '|' |
|
119 | + . preg_quote(str_replace('\\', '\\\\', $originalNamespace), '/') |
|
120 | + . '|' |
|
121 | + . preg_quote('\\' . $originalNamespace, '/') |
|
122 | + . '|' |
|
123 | + . preg_quote('\\\\' . str_replace('\\', '\\\\', $originalNamespace), '/'); |
|
124 | + |
|
125 | + $pattern = " |
|
126 | 126 | / # Start the pattern |
127 | 127 | ( |
128 | 128 | ^\s* # start of the line |
@@ -156,62 +156,62 @@ discard block |
||
156 | 156 | ) |
157 | 157 | /Ux"; // U: Non-greedy matching, x: ignore whitespace in pattern. |
158 | 158 | |
159 | - $replacingFunction = function ($matches) use ($originalNamespace, $replacement) { |
|
160 | - |
|
161 | - $singleBackslash = '\\\\'; |
|
162 | - $doubleBackslash = '\\\\\\\\'; |
|
163 | - $originalNamespacePattern = str_replace('\\', '\\\\+', $originalNamespace); |
|
164 | - $beginsSingleBackslashPattern = "#{$singleBackslash}{$originalNamespacePattern}#"; |
|
165 | - $beginsDoubleBackslashPattern = "#{$doubleBackslash}{$originalNamespacePattern}#"; |
|
166 | - $containsDoubleBackslashPattern = "#{$doubleBackslash}#"; |
|
167 | - |
|
168 | - // Namespace begins with \\. |
|
169 | - if (preg_match($beginsDoubleBackslashPattern, $matches[2])) { |
|
170 | - $replacement = str_replace("\\", "\\\\", $replacement); |
|
171 | - $replacement = "\\\\" . $replacement; |
|
172 | - } elseif (preg_match($beginsSingleBackslashPattern, $matches[2])) { |
|
173 | - $replacement = "\\" . $replacement; |
|
174 | - } elseif (preg_match($containsDoubleBackslashPattern, $matches[2])) { |
|
175 | - $replacement = str_replace("\\", "\\\\", $replacement); |
|
176 | - } |
|
177 | - |
|
178 | - return $matches[1] . $replacement . $matches[3]; |
|
179 | - }; |
|
180 | - |
|
181 | - $result = preg_replace_callback($pattern, $replacingFunction, $contents); |
|
182 | - |
|
183 | - $matchingError = preg_last_error(); |
|
184 | - if (0 !== $matchingError) { |
|
185 | - $message = "Matching error {$matchingError}"; |
|
186 | - if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) { |
|
187 | - $message = 'Preg Backtrack limit was exhausted!'; |
|
188 | - } |
|
189 | - throw new Exception($message); |
|
190 | - } |
|
191 | - |
|
192 | - return $result; |
|
193 | - } |
|
194 | - |
|
195 | - /** |
|
196 | - * In a namespace: |
|
197 | - * * use \Classname; |
|
198 | - * * new \Classname() |
|
199 | - * |
|
200 | - * In a global namespace: |
|
201 | - * * new Classname() |
|
202 | - * |
|
203 | - * @param string $contents |
|
204 | - * @param string $originalClassname |
|
205 | - * @param string $classnamePrefix |
|
206 | - * @return array|string|string[]|null |
|
207 | - * @throws \Exception |
|
208 | - */ |
|
209 | - public function replaceClassname($contents, $originalClassname, $classnamePrefix) |
|
210 | - { |
|
211 | - $searchClassname = preg_quote($originalClassname, '/'); |
|
212 | - |
|
213 | - // This could be more specific if we could enumerate all preceeding and proceeding words ("new", "("...). |
|
214 | - $pattern = ' |
|
159 | + $replacingFunction = function ($matches) use ($originalNamespace, $replacement) { |
|
160 | + |
|
161 | + $singleBackslash = '\\\\'; |
|
162 | + $doubleBackslash = '\\\\\\\\'; |
|
163 | + $originalNamespacePattern = str_replace('\\', '\\\\+', $originalNamespace); |
|
164 | + $beginsSingleBackslashPattern = "#{$singleBackslash}{$originalNamespacePattern}#"; |
|
165 | + $beginsDoubleBackslashPattern = "#{$doubleBackslash}{$originalNamespacePattern}#"; |
|
166 | + $containsDoubleBackslashPattern = "#{$doubleBackslash}#"; |
|
167 | + |
|
168 | + // Namespace begins with \\. |
|
169 | + if (preg_match($beginsDoubleBackslashPattern, $matches[2])) { |
|
170 | + $replacement = str_replace("\\", "\\\\", $replacement); |
|
171 | + $replacement = "\\\\" . $replacement; |
|
172 | + } elseif (preg_match($beginsSingleBackslashPattern, $matches[2])) { |
|
173 | + $replacement = "\\" . $replacement; |
|
174 | + } elseif (preg_match($containsDoubleBackslashPattern, $matches[2])) { |
|
175 | + $replacement = str_replace("\\", "\\\\", $replacement); |
|
176 | + } |
|
177 | + |
|
178 | + return $matches[1] . $replacement . $matches[3]; |
|
179 | + }; |
|
180 | + |
|
181 | + $result = preg_replace_callback($pattern, $replacingFunction, $contents); |
|
182 | + |
|
183 | + $matchingError = preg_last_error(); |
|
184 | + if (0 !== $matchingError) { |
|
185 | + $message = "Matching error {$matchingError}"; |
|
186 | + if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) { |
|
187 | + $message = 'Preg Backtrack limit was exhausted!'; |
|
188 | + } |
|
189 | + throw new Exception($message); |
|
190 | + } |
|
191 | + |
|
192 | + return $result; |
|
193 | + } |
|
194 | + |
|
195 | + /** |
|
196 | + * In a namespace: |
|
197 | + * * use \Classname; |
|
198 | + * * new \Classname() |
|
199 | + * |
|
200 | + * In a global namespace: |
|
201 | + * * new Classname() |
|
202 | + * |
|
203 | + * @param string $contents |
|
204 | + * @param string $originalClassname |
|
205 | + * @param string $classnamePrefix |
|
206 | + * @return array|string|string[]|null |
|
207 | + * @throws \Exception |
|
208 | + */ |
|
209 | + public function replaceClassname($contents, $originalClassname, $classnamePrefix) |
|
210 | + { |
|
211 | + $searchClassname = preg_quote($originalClassname, '/'); |
|
212 | + |
|
213 | + // This could be more specific if we could enumerate all preceeding and proceeding words ("new", "("...). |
|
214 | + $pattern = ' |
|
215 | 215 | / # Start the pattern |
216 | 216 | namespace\s+([a-zA-Z0-9_\x7f-\xff\\\\]+).*?{.*?(namespace|\z) |
217 | 217 | # Look for a preceeding namespace declaration, up until a |
@@ -222,65 +222,65 @@ discard block |
||
222 | 222 | |
223 | 223 | /x'; // # x: ignore whitespace in regex. |
224 | 224 | |
225 | - $replacingFunction = function ($matches) use ($originalClassname, $classnamePrefix) { |
|
226 | - |
|
227 | - // If we're inside a namespace other than the global namespace: |
|
228 | - if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) { |
|
229 | - $updated = $this->replaceGlobalClassInsideNamedNamespace( |
|
230 | - $matches[0], |
|
231 | - $originalClassname, |
|
232 | - $classnamePrefix |
|
233 | - ); |
|
234 | - |
|
235 | - return $updated; |
|
236 | - } |
|
237 | - |
|
238 | - return $matches[1] . $matches[2] . $matches[3] . $classnamePrefix . $originalClassname . $matches[5]; |
|
239 | - }; |
|
240 | - |
|
241 | - $result = preg_replace_callback($pattern, $replacingFunction, $contents); |
|
242 | - |
|
243 | - $matchingError = preg_last_error(); |
|
244 | - if (0 !== $matchingError) { |
|
245 | - $message = "Matching error {$matchingError}"; |
|
246 | - if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) { |
|
247 | - $message = 'Backtrack limit was exhausted!'; |
|
248 | - } |
|
249 | - throw new Exception($message); |
|
250 | - } |
|
251 | - |
|
252 | - return $result; |
|
253 | - } |
|
254 | - |
|
255 | - /** |
|
256 | - * Pass in a string and look for \Classname instances. |
|
257 | - * |
|
258 | - * @param string $contents |
|
259 | - * @param string $originalClassname |
|
260 | - * @param string $classnamePrefix |
|
261 | - * @return string |
|
262 | - */ |
|
263 | - protected function replaceGlobalClassInsideNamedNamespace($contents, $originalClassname, $classnamePrefix): string |
|
264 | - { |
|
265 | - |
|
266 | - return preg_replace_callback( |
|
267 | - '/([^a-zA-Z0-9_\x7f-\xff] # Not a class character |
|
225 | + $replacingFunction = function ($matches) use ($originalClassname, $classnamePrefix) { |
|
226 | + |
|
227 | + // If we're inside a namespace other than the global namespace: |
|
228 | + if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) { |
|
229 | + $updated = $this->replaceGlobalClassInsideNamedNamespace( |
|
230 | + $matches[0], |
|
231 | + $originalClassname, |
|
232 | + $classnamePrefix |
|
233 | + ); |
|
234 | + |
|
235 | + return $updated; |
|
236 | + } |
|
237 | + |
|
238 | + return $matches[1] . $matches[2] . $matches[3] . $classnamePrefix . $originalClassname . $matches[5]; |
|
239 | + }; |
|
240 | + |
|
241 | + $result = preg_replace_callback($pattern, $replacingFunction, $contents); |
|
242 | + |
|
243 | + $matchingError = preg_last_error(); |
|
244 | + if (0 !== $matchingError) { |
|
245 | + $message = "Matching error {$matchingError}"; |
|
246 | + if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) { |
|
247 | + $message = 'Backtrack limit was exhausted!'; |
|
248 | + } |
|
249 | + throw new Exception($message); |
|
250 | + } |
|
251 | + |
|
252 | + return $result; |
|
253 | + } |
|
254 | + |
|
255 | + /** |
|
256 | + * Pass in a string and look for \Classname instances. |
|
257 | + * |
|
258 | + * @param string $contents |
|
259 | + * @param string $originalClassname |
|
260 | + * @param string $classnamePrefix |
|
261 | + * @return string |
|
262 | + */ |
|
263 | + protected function replaceGlobalClassInsideNamedNamespace($contents, $originalClassname, $classnamePrefix): string |
|
264 | + { |
|
265 | + |
|
266 | + return preg_replace_callback( |
|
267 | + '/([^a-zA-Z0-9_\x7f-\xff] # Not a class character |
|
268 | 268 | \\\) # Followed by a backslash to indicate global namespace |
269 | 269 | ('.$originalClassname.') # Followed by the classname |
270 | 270 | ([^\\\;]+) # Not a backslash or semicolon which might indicate a namespace |
271 | 271 | /x', // # x: ignore whitespace in regex. |
272 | - function ($matches) use ($originalClassname, $classnamePrefix) { |
|
273 | - return $matches[1] . $classnamePrefix . $originalClassname . $matches[3]; |
|
274 | - }, |
|
275 | - $contents |
|
276 | - ); |
|
277 | - } |
|
278 | - |
|
279 | - /** |
|
280 | - * @return array<string, ComposerPackage> |
|
281 | - */ |
|
282 | - public function getModifiedFiles(): array |
|
283 | - { |
|
284 | - return $this->changedFiles; |
|
285 | - } |
|
272 | + function ($matches) use ($originalClassname, $classnamePrefix) { |
|
273 | + return $matches[1] . $classnamePrefix . $originalClassname . $matches[3]; |
|
274 | + }, |
|
275 | + $contents |
|
276 | + ); |
|
277 | + } |
|
278 | + |
|
279 | + /** |
|
280 | + * @return array<string, ComposerPackage> |
|
281 | + */ |
|
282 | + public function getModifiedFiles(): array |
|
283 | + { |
|
284 | + return $this->changedFiles; |
|
285 | + } |
|
286 | 286 | } |
@@ -28,9 +28,9 @@ discard block |
||
28 | 28 | /** @var array<string, ComposerPackage> */ |
29 | 29 | protected array $changedFiles = array(); |
30 | 30 | |
31 | - public function __construct(StraussConfig $config, string $workingDir) |
|
31 | + public function __construct( StraussConfig $config, string $workingDir ) |
|
32 | 32 | { |
33 | - $this->filesystem = new Filesystem(new Local($workingDir)); |
|
33 | + $this->filesystem = new Filesystem( new Local( $workingDir ) ); |
|
34 | 34 | |
35 | 35 | $this->targetDirectory = $config->getTargetDirectory(); |
36 | 36 | $this->namespacePrefix = $config->getNamespacePrefix(); |
@@ -51,52 +51,52 @@ discard block |
||
51 | 51 | * @param array<string, ComposerPackage> $phpFileList |
52 | 52 | * @throws FileNotFoundException |
53 | 53 | */ |
54 | - public function replaceInFiles(array $namespaceChanges, array $classChanges, array $phpFileList) |
|
54 | + public function replaceInFiles( array $namespaceChanges, array $classChanges, array $phpFileList ) |
|
55 | 55 | { |
56 | 56 | |
57 | - foreach ($phpFileList as $sourceRelativeFilePathFromVendor => $package) { |
|
57 | + foreach ( $phpFileList as $sourceRelativeFilePathFromVendor => $package ) { |
|
58 | 58 | // Skip excluded namespaces. |
59 | - if (in_array($package->getName(), $this->excludePackageNamesFromPrefixing)) { |
|
59 | + if ( in_array( $package->getName(), $this->excludePackageNamesFromPrefixing ) ) { |
|
60 | 60 | continue; |
61 | 61 | } |
62 | 62 | |
63 | 63 | // Skip files whose filepath matches an excluded pattern. |
64 | - foreach ($this->excludeFilePatternsFromPrefixing as $excludePattern) { |
|
65 | - if (1 === preg_match($excludePattern, $sourceRelativeFilePathFromVendor)) { |
|
64 | + foreach ( $this->excludeFilePatternsFromPrefixing as $excludePattern ) { |
|
65 | + if ( 1 === preg_match( $excludePattern, $sourceRelativeFilePathFromVendor ) ) { |
|
66 | 66 | continue 2; |
67 | 67 | } |
68 | 68 | } |
69 | 69 | |
70 | 70 | $targetRelativeFilepathFromProject = |
71 | - $this->targetDirectory. $sourceRelativeFilePathFromVendor; |
|
71 | + $this->targetDirectory . $sourceRelativeFilePathFromVendor; |
|
72 | 72 | |
73 | 73 | // Throws an exception, but unlikely to happen. |
74 | - $contents = $this->filesystem->read($targetRelativeFilepathFromProject); |
|
74 | + $contents = $this->filesystem->read( $targetRelativeFilepathFromProject ); |
|
75 | 75 | |
76 | - $updatedContents = $this->replaceInString($namespaceChanges, $classChanges, $contents); |
|
76 | + $updatedContents = $this->replaceInString( $namespaceChanges, $classChanges, $contents ); |
|
77 | 77 | |
78 | - if ($updatedContents !== $contents) { |
|
79 | - $this->changedFiles[$sourceRelativeFilePathFromVendor] = $package; |
|
80 | - $this->filesystem->put($targetRelativeFilepathFromProject, $updatedContents); |
|
78 | + if ( $updatedContents !== $contents ) { |
|
79 | + $this->changedFiles[ $sourceRelativeFilePathFromVendor ] = $package; |
|
80 | + $this->filesystem->put( $targetRelativeFilepathFromProject, $updatedContents ); |
|
81 | 81 | } |
82 | 82 | } |
83 | 83 | } |
84 | 84 | |
85 | - public function replaceInString(array $namespacesChanges, array $classes, string $contents): string |
|
85 | + public function replaceInString( array $namespacesChanges, array $classes, string $contents ): string |
|
86 | 86 | { |
87 | 87 | |
88 | - foreach ($namespacesChanges as $originalNamespace => $replacement) { |
|
89 | - if (in_array($originalNamespace, $this->excludeNamespacesFromPrefixing)) { |
|
88 | + foreach ( $namespacesChanges as $originalNamespace => $replacement ) { |
|
89 | + if ( in_array( $originalNamespace, $this->excludeNamespacesFromPrefixing ) ) { |
|
90 | 90 | continue; |
91 | 91 | } |
92 | 92 | |
93 | - $contents = $this->replaceNamespace($contents, $originalNamespace, $replacement); |
|
93 | + $contents = $this->replaceNamespace( $contents, $originalNamespace, $replacement ); |
|
94 | 94 | } |
95 | 95 | |
96 | - foreach ($classes as $originalClassname) { |
|
96 | + foreach ( $classes as $originalClassname ) { |
|
97 | 97 | $classmapPrefix = $this->classmapPrefix; |
98 | 98 | |
99 | - $contents = $this->replaceClassname($contents, $originalClassname, $classmapPrefix); |
|
99 | + $contents = $this->replaceClassname( $contents, $originalClassname, $classmapPrefix ); |
|
100 | 100 | } |
101 | 101 | |
102 | 102 | return $contents; |
@@ -109,18 +109,18 @@ discard block |
||
109 | 109 | * |
110 | 110 | * @return string The updated text. |
111 | 111 | */ |
112 | - public function replaceNamespace($contents, $originalNamespace, $replacement) |
|
112 | + public function replaceNamespace( $contents, $originalNamespace, $replacement ) |
|
113 | 113 | { |
114 | 114 | |
115 | 115 | // When namespaces exist inside strings... |
116 | 116 | $searchNamespace = |
117 | - preg_quote($originalNamespace, '/') |
|
117 | + preg_quote( $originalNamespace, '/' ) |
|
118 | 118 | . '|' |
119 | - . preg_quote(str_replace('\\', '\\\\', $originalNamespace), '/') |
|
119 | + . preg_quote( str_replace( '\\', '\\\\', $originalNamespace ), '/' ) |
|
120 | 120 | . '|' |
121 | - . preg_quote('\\' . $originalNamespace, '/') |
|
121 | + . preg_quote( '\\' . $originalNamespace, '/' ) |
|
122 | 122 | . '|' |
123 | - . preg_quote('\\\\' . str_replace('\\', '\\\\', $originalNamespace), '/'); |
|
123 | + . preg_quote( '\\\\' . str_replace( '\\', '\\\\', $originalNamespace ), '/' ); |
|
124 | 124 | |
125 | 125 | $pattern = " |
126 | 126 | / # Start the pattern |
@@ -154,39 +154,39 @@ discard block |
||
154 | 154 | |' # or single quote |
155 | 155 | |: # or a colon to access a static |
156 | 156 | ) |
157 | - /Ux"; // U: Non-greedy matching, x: ignore whitespace in pattern. |
|
157 | + /Ux"; // U: Non-greedy matching, x: ignore whitespace in pattern. |
|
158 | 158 | |
159 | - $replacingFunction = function ($matches) use ($originalNamespace, $replacement) { |
|
159 | + $replacingFunction = function( $matches ) use ( $originalNamespace, $replacement ) { |
|
160 | 160 | |
161 | 161 | $singleBackslash = '\\\\'; |
162 | 162 | $doubleBackslash = '\\\\\\\\'; |
163 | - $originalNamespacePattern = str_replace('\\', '\\\\+', $originalNamespace); |
|
163 | + $originalNamespacePattern = str_replace( '\\', '\\\\+', $originalNamespace ); |
|
164 | 164 | $beginsSingleBackslashPattern = "#{$singleBackslash}{$originalNamespacePattern}#"; |
165 | 165 | $beginsDoubleBackslashPattern = "#{$doubleBackslash}{$originalNamespacePattern}#"; |
166 | 166 | $containsDoubleBackslashPattern = "#{$doubleBackslash}#"; |
167 | 167 | |
168 | 168 | // Namespace begins with \\. |
169 | - if (preg_match($beginsDoubleBackslashPattern, $matches[2])) { |
|
170 | - $replacement = str_replace("\\", "\\\\", $replacement); |
|
169 | + if ( preg_match( $beginsDoubleBackslashPattern, $matches[ 2 ] ) ) { |
|
170 | + $replacement = str_replace( "\\", "\\\\", $replacement ); |
|
171 | 171 | $replacement = "\\\\" . $replacement; |
172 | - } elseif (preg_match($beginsSingleBackslashPattern, $matches[2])) { |
|
172 | + } elseif ( preg_match( $beginsSingleBackslashPattern, $matches[ 2 ] ) ) { |
|
173 | 173 | $replacement = "\\" . $replacement; |
174 | - } elseif (preg_match($containsDoubleBackslashPattern, $matches[2])) { |
|
175 | - $replacement = str_replace("\\", "\\\\", $replacement); |
|
174 | + } elseif ( preg_match( $containsDoubleBackslashPattern, $matches[ 2 ] ) ) { |
|
175 | + $replacement = str_replace( "\\", "\\\\", $replacement ); |
|
176 | 176 | } |
177 | 177 | |
178 | - return $matches[1] . $replacement . $matches[3]; |
|
178 | + return $matches[ 1 ] . $replacement . $matches[ 3 ]; |
|
179 | 179 | }; |
180 | 180 | |
181 | - $result = preg_replace_callback($pattern, $replacingFunction, $contents); |
|
181 | + $result = preg_replace_callback( $pattern, $replacingFunction, $contents ); |
|
182 | 182 | |
183 | 183 | $matchingError = preg_last_error(); |
184 | - if (0 !== $matchingError) { |
|
184 | + if ( 0 !== $matchingError ) { |
|
185 | 185 | $message = "Matching error {$matchingError}"; |
186 | - if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) { |
|
186 | + if ( PREG_BACKTRACK_LIMIT_ERROR === $matchingError ) { |
|
187 | 187 | $message = 'Preg Backtrack limit was exhausted!'; |
188 | 188 | } |
189 | - throw new Exception($message); |
|
189 | + throw new Exception( $message ); |
|
190 | 190 | } |
191 | 191 | |
192 | 192 | return $result; |
@@ -206,9 +206,9 @@ discard block |
||
206 | 206 | * @return array|string|string[]|null |
207 | 207 | * @throws \Exception |
208 | 208 | */ |
209 | - public function replaceClassname($contents, $originalClassname, $classnamePrefix) |
|
209 | + public function replaceClassname( $contents, $originalClassname, $classnamePrefix ) |
|
210 | 210 | { |
211 | - $searchClassname = preg_quote($originalClassname, '/'); |
|
211 | + $searchClassname = preg_quote( $originalClassname, '/' ); |
|
212 | 212 | |
213 | 213 | // This could be more specific if we could enumerate all preceeding and proceeding words ("new", "("...). |
214 | 214 | $pattern = ' |
@@ -222,12 +222,12 @@ discard block |
||
222 | 222 | |
223 | 223 | /x'; // # x: ignore whitespace in regex. |
224 | 224 | |
225 | - $replacingFunction = function ($matches) use ($originalClassname, $classnamePrefix) { |
|
225 | + $replacingFunction = function( $matches ) use ( $originalClassname, $classnamePrefix ) { |
|
226 | 226 | |
227 | 227 | // If we're inside a namespace other than the global namespace: |
228 | - if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) { |
|
228 | + if ( 1 === preg_match( '/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[ 0 ] ) ) { |
|
229 | 229 | $updated = $this->replaceGlobalClassInsideNamedNamespace( |
230 | - $matches[0], |
|
230 | + $matches[ 0 ], |
|
231 | 231 | $originalClassname, |
232 | 232 | $classnamePrefix |
233 | 233 | ); |
@@ -235,18 +235,18 @@ discard block |
||
235 | 235 | return $updated; |
236 | 236 | } |
237 | 237 | |
238 | - return $matches[1] . $matches[2] . $matches[3] . $classnamePrefix . $originalClassname . $matches[5]; |
|
238 | + return $matches[ 1 ] . $matches[ 2 ] . $matches[ 3 ] . $classnamePrefix . $originalClassname . $matches[ 5 ]; |
|
239 | 239 | }; |
240 | 240 | |
241 | - $result = preg_replace_callback($pattern, $replacingFunction, $contents); |
|
241 | + $result = preg_replace_callback( $pattern, $replacingFunction, $contents ); |
|
242 | 242 | |
243 | 243 | $matchingError = preg_last_error(); |
244 | - if (0 !== $matchingError) { |
|
244 | + if ( 0 !== $matchingError ) { |
|
245 | 245 | $message = "Matching error {$matchingError}"; |
246 | - if (PREG_BACKTRACK_LIMIT_ERROR === $matchingError) { |
|
246 | + if ( PREG_BACKTRACK_LIMIT_ERROR === $matchingError ) { |
|
247 | 247 | $message = 'Backtrack limit was exhausted!'; |
248 | 248 | } |
249 | - throw new Exception($message); |
|
249 | + throw new Exception( $message ); |
|
250 | 250 | } |
251 | 251 | |
252 | 252 | return $result; |
@@ -260,17 +260,17 @@ discard block |
||
260 | 260 | * @param string $classnamePrefix |
261 | 261 | * @return string |
262 | 262 | */ |
263 | - protected function replaceGlobalClassInsideNamedNamespace($contents, $originalClassname, $classnamePrefix): string |
|
263 | + protected function replaceGlobalClassInsideNamedNamespace( $contents, $originalClassname, $classnamePrefix ): string |
|
264 | 264 | { |
265 | 265 | |
266 | 266 | return preg_replace_callback( |
267 | 267 | '/([^a-zA-Z0-9_\x7f-\xff] # Not a class character |
268 | 268 | \\\) # Followed by a backslash to indicate global namespace |
269 | - ('.$originalClassname.') # Followed by the classname |
|
269 | + ('.$originalClassname . ') # Followed by the classname |
|
270 | 270 | ([^\\\;]+) # Not a backslash or semicolon which might indicate a namespace |
271 | 271 | /x', // # x: ignore whitespace in regex. |
272 | - function ($matches) use ($originalClassname, $classnamePrefix) { |
|
273 | - return $matches[1] . $classnamePrefix . $originalClassname . $matches[3]; |
|
272 | + function( $matches ) use ( $originalClassname, $classnamePrefix ) { |
|
273 | + return $matches[ 1 ] . $classnamePrefix . $originalClassname . $matches[ 3 ]; |
|
274 | 274 | }, |
275 | 275 | $contents |
276 | 276 | ); |
@@ -9,8 +9,7 @@ discard block |
||
9 | 9 | use League\Flysystem\FileNotFoundException; |
10 | 10 | use League\Flysystem\Filesystem; |
11 | 11 | |
12 | -class Prefixer |
|
13 | -{ |
|
12 | +class Prefixer { |
|
14 | 13 | /** @var StraussConfig */ |
15 | 14 | protected $config; |
16 | 15 | |
@@ -28,8 +27,7 @@ discard block |
||
28 | 27 | /** @var array<string, ComposerPackage> */ |
29 | 28 | protected array $changedFiles = array(); |
30 | 29 | |
31 | - public function __construct(StraussConfig $config, string $workingDir) |
|
32 | - { |
|
30 | + public function __construct(StraussConfig $config, string $workingDir) { |
|
33 | 31 | $this->filesystem = new Filesystem(new Local($workingDir)); |
34 | 32 | |
35 | 33 | $this->targetDirectory = $config->getTargetDirectory(); |
@@ -51,8 +49,7 @@ discard block |
||
51 | 49 | * @param array<string, ComposerPackage> $phpFileList |
52 | 50 | * @throws FileNotFoundException |
53 | 51 | */ |
54 | - public function replaceInFiles(array $namespaceChanges, array $classChanges, array $phpFileList) |
|
55 | - { |
|
52 | + public function replaceInFiles(array $namespaceChanges, array $classChanges, array $phpFileList) { |
|
56 | 53 | |
57 | 54 | foreach ($phpFileList as $sourceRelativeFilePathFromVendor => $package) { |
58 | 55 | // Skip excluded namespaces. |
@@ -109,8 +106,7 @@ discard block |
||
109 | 106 | * |
110 | 107 | * @return string The updated text. |
111 | 108 | */ |
112 | - public function replaceNamespace($contents, $originalNamespace, $replacement) |
|
113 | - { |
|
109 | + public function replaceNamespace($contents, $originalNamespace, $replacement) { |
|
114 | 110 | |
115 | 111 | // When namespaces exist inside strings... |
116 | 112 | $searchNamespace = |
@@ -206,8 +202,7 @@ discard block |
||
206 | 202 | * @return array|string|string[]|null |
207 | 203 | * @throws \Exception |
208 | 204 | */ |
209 | - public function replaceClassname($contents, $originalClassname, $classnamePrefix) |
|
210 | - { |
|
205 | + public function replaceClassname($contents, $originalClassname, $classnamePrefix) { |
|
211 | 206 | $searchClassname = preg_quote($originalClassname, '/'); |
212 | 207 | |
213 | 208 | // This could be more specific if we could enumerate all preceeding and proceeding words ("new", "("...). |
@@ -13,128 +13,128 @@ discard block |
||
13 | 13 | class ChangeEnumerator |
14 | 14 | { |
15 | 15 | |
16 | - protected string $namespacePrefix; |
|
17 | - protected string $classmapPrefix; |
|
18 | - /** |
|
19 | - * |
|
20 | - * @var string[] |
|
21 | - */ |
|
22 | - protected array $excludePackagesFromPrefixing = array(); |
|
23 | - protected array $excludeNamespacesFromPrefixing = array(); |
|
24 | - |
|
25 | - protected array $excludeFilePatternsFromPrefixing = array(); |
|
26 | - |
|
27 | - protected array $namespaceReplacementPatterns = array(); |
|
28 | - |
|
29 | - /** @var string[] */ |
|
30 | - protected array $discoveredNamespaces = []; |
|
31 | - |
|
32 | - /** @var string[] */ |
|
33 | - protected array $discoveredClasses = []; |
|
34 | - |
|
35 | - |
|
36 | - /** |
|
37 | - * ChangeEnumerator constructor. |
|
38 | - * @param \BrianHenryIE\Strauss\Composer\Extra\StraussConfig $config |
|
39 | - */ |
|
40 | - public function __construct(StraussConfig $config) |
|
41 | - { |
|
42 | - $this->namespacePrefix = $config->getNamespacePrefix(); |
|
43 | - $this->classmapPrefix = $config->getClassmapPrefix(); |
|
44 | - |
|
45 | - $this->excludePackagesFromPrefixing = $config->getExcludePackagesFromPrefixing(); |
|
46 | - $this->excludeNamespacesFromPrefixing = $config->getExcludeNamespacesFromPrefixing(); |
|
47 | - $this->excludeFilePatternsFromPrefixing = $config->getExcludeFilePatternsFromPrefixing(); |
|
48 | - |
|
49 | - $this->namespaceReplacementPatterns = $config->getNamespaceReplacementPatterns(); |
|
50 | - } |
|
51 | - |
|
52 | - /** |
|
53 | - * TODO: Order by longest string first. (or instead, record classnames with their namespaces) |
|
54 | - * |
|
55 | - * @return string[] |
|
56 | - */ |
|
57 | - public function getDiscoveredNamespaceReplacements(): array |
|
58 | - { |
|
59 | - $discoveredNamespaceReplacements = $this->discoveredNamespaces; |
|
60 | - |
|
61 | - uksort($discoveredNamespaceReplacements, function ($a, $b) { |
|
62 | - return strlen($b) <=> strlen($a); |
|
63 | - }); |
|
64 | - |
|
65 | - return $discoveredNamespaceReplacements; |
|
66 | - } |
|
67 | - |
|
68 | - /** |
|
69 | - * @return string[] |
|
70 | - */ |
|
71 | - public function getDiscoveredClasses(): array |
|
72 | - { |
|
73 | - return array_keys($this->discoveredClasses); |
|
74 | - } |
|
75 | - |
|
76 | - |
|
77 | - /** |
|
78 | - * @param string $dir |
|
79 | - * @param array<string, ComposerPackage> $relativeFilepaths |
|
80 | - */ |
|
81 | - public function findInFiles($dir, $relativeFilepaths) |
|
82 | - { |
|
83 | - |
|
84 | - foreach ($relativeFilepaths as $relativeFilepath => $package) { |
|
85 | - foreach ($this->excludePackagesFromPrefixing as $excludePackagesName) { |
|
86 | - if ($package->getName() === $excludePackagesName) { |
|
87 | - continue 2; |
|
88 | - } |
|
89 | - } |
|
90 | - |
|
91 | - foreach ($this->excludeFilePatternsFromPrefixing as $excludeFilePattern) { |
|
92 | - if (1 === preg_match($excludeFilePattern, $relativeFilepath)) { |
|
93 | - continue 2; |
|
94 | - } |
|
95 | - } |
|
96 | - |
|
97 | - |
|
98 | - $filepath = $dir . $relativeFilepath; |
|
99 | - |
|
100 | - // TODO: use flysystem |
|
101 | - // $contents = $this->filesystem->read($targetFile); |
|
102 | - |
|
103 | - $contents = file_get_contents($filepath); |
|
104 | - |
|
105 | - $this->find($contents); |
|
106 | - } |
|
107 | - } |
|
108 | - |
|
109 | - |
|
110 | - /** |
|
111 | - * TODO: Don't use preg_replace_callback! |
|
112 | - * |
|
113 | - * @param string $contents |
|
114 | - * |
|
115 | - * @return string $contents |
|
116 | - */ |
|
117 | - public function find(string $contents): string |
|
118 | - { |
|
119 | - |
|
120 | - // If the entire file is under one namespace, all we want is the namespace. |
|
121 | - $singleNamespacePattern = '/ |
|
16 | + protected string $namespacePrefix; |
|
17 | + protected string $classmapPrefix; |
|
18 | + /** |
|
19 | + * |
|
20 | + * @var string[] |
|
21 | + */ |
|
22 | + protected array $excludePackagesFromPrefixing = array(); |
|
23 | + protected array $excludeNamespacesFromPrefixing = array(); |
|
24 | + |
|
25 | + protected array $excludeFilePatternsFromPrefixing = array(); |
|
26 | + |
|
27 | + protected array $namespaceReplacementPatterns = array(); |
|
28 | + |
|
29 | + /** @var string[] */ |
|
30 | + protected array $discoveredNamespaces = []; |
|
31 | + |
|
32 | + /** @var string[] */ |
|
33 | + protected array $discoveredClasses = []; |
|
34 | + |
|
35 | + |
|
36 | + /** |
|
37 | + * ChangeEnumerator constructor. |
|
38 | + * @param \BrianHenryIE\Strauss\Composer\Extra\StraussConfig $config |
|
39 | + */ |
|
40 | + public function __construct(StraussConfig $config) |
|
41 | + { |
|
42 | + $this->namespacePrefix = $config->getNamespacePrefix(); |
|
43 | + $this->classmapPrefix = $config->getClassmapPrefix(); |
|
44 | + |
|
45 | + $this->excludePackagesFromPrefixing = $config->getExcludePackagesFromPrefixing(); |
|
46 | + $this->excludeNamespacesFromPrefixing = $config->getExcludeNamespacesFromPrefixing(); |
|
47 | + $this->excludeFilePatternsFromPrefixing = $config->getExcludeFilePatternsFromPrefixing(); |
|
48 | + |
|
49 | + $this->namespaceReplacementPatterns = $config->getNamespaceReplacementPatterns(); |
|
50 | + } |
|
51 | + |
|
52 | + /** |
|
53 | + * TODO: Order by longest string first. (or instead, record classnames with their namespaces) |
|
54 | + * |
|
55 | + * @return string[] |
|
56 | + */ |
|
57 | + public function getDiscoveredNamespaceReplacements(): array |
|
58 | + { |
|
59 | + $discoveredNamespaceReplacements = $this->discoveredNamespaces; |
|
60 | + |
|
61 | + uksort($discoveredNamespaceReplacements, function ($a, $b) { |
|
62 | + return strlen($b) <=> strlen($a); |
|
63 | + }); |
|
64 | + |
|
65 | + return $discoveredNamespaceReplacements; |
|
66 | + } |
|
67 | + |
|
68 | + /** |
|
69 | + * @return string[] |
|
70 | + */ |
|
71 | + public function getDiscoveredClasses(): array |
|
72 | + { |
|
73 | + return array_keys($this->discoveredClasses); |
|
74 | + } |
|
75 | + |
|
76 | + |
|
77 | + /** |
|
78 | + * @param string $dir |
|
79 | + * @param array<string, ComposerPackage> $relativeFilepaths |
|
80 | + */ |
|
81 | + public function findInFiles($dir, $relativeFilepaths) |
|
82 | + { |
|
83 | + |
|
84 | + foreach ($relativeFilepaths as $relativeFilepath => $package) { |
|
85 | + foreach ($this->excludePackagesFromPrefixing as $excludePackagesName) { |
|
86 | + if ($package->getName() === $excludePackagesName) { |
|
87 | + continue 2; |
|
88 | + } |
|
89 | + } |
|
90 | + |
|
91 | + foreach ($this->excludeFilePatternsFromPrefixing as $excludeFilePattern) { |
|
92 | + if (1 === preg_match($excludeFilePattern, $relativeFilepath)) { |
|
93 | + continue 2; |
|
94 | + } |
|
95 | + } |
|
96 | + |
|
97 | + |
|
98 | + $filepath = $dir . $relativeFilepath; |
|
99 | + |
|
100 | + // TODO: use flysystem |
|
101 | + // $contents = $this->filesystem->read($targetFile); |
|
102 | + |
|
103 | + $contents = file_get_contents($filepath); |
|
104 | + |
|
105 | + $this->find($contents); |
|
106 | + } |
|
107 | + } |
|
108 | + |
|
109 | + |
|
110 | + /** |
|
111 | + * TODO: Don't use preg_replace_callback! |
|
112 | + * |
|
113 | + * @param string $contents |
|
114 | + * |
|
115 | + * @return string $contents |
|
116 | + */ |
|
117 | + public function find(string $contents): string |
|
118 | + { |
|
119 | + |
|
120 | + // If the entire file is under one namespace, all we want is the namespace. |
|
121 | + $singleNamespacePattern = '/ |
|
122 | 122 | namespace\s+([0-9A-Za-z_\x7f-\xff\\\\]+)[\s\S]*; # A single namespace in the file.... should return |
123 | 123 | /x'; |
124 | - if (1 === preg_match($singleNamespacePattern, $contents, $matches)) { |
|
125 | - $this->addDiscoveredNamespaceChange($matches[1]); |
|
126 | - return $contents; |
|
127 | - } |
|
124 | + if (1 === preg_match($singleNamespacePattern, $contents, $matches)) { |
|
125 | + $this->addDiscoveredNamespaceChange($matches[1]); |
|
126 | + return $contents; |
|
127 | + } |
|
128 | 128 | |
129 | 129 | |
130 | - // TODO traits |
|
130 | + // TODO traits |
|
131 | 131 | |
132 | - // TODO: Is the ";" in this still correct since it's being taken care of in the regex just above? |
|
133 | - // Looks like with the preceeding regex, it will never match. |
|
132 | + // TODO: Is the ";" in this still correct since it's being taken care of in the regex just above? |
|
133 | + // Looks like with the preceeding regex, it will never match. |
|
134 | 134 | |
135 | 135 | |
136 | - return preg_replace_callback( |
|
137 | - ' |
|
136 | + return preg_replace_callback( |
|
137 | + ' |
|
138 | 138 | ~ # Start the pattern |
139 | 139 | namespace\s+([a-zA-Z0-9_\x7f-\xff\\\\]+)[;{\s\n]{1}[\s\S]*?(?=namespace|$) |
140 | 140 | # Look for a preceeding namespace declaration, |
@@ -152,44 +152,44 @@ discard block |
||
152 | 152 | (?:{|extends|implements|\n|$) # Class declaration can be followed by {, extends, implements |
153 | 153 | # or a new line |
154 | 154 | ~x', // # x: ignore whitespace in regex. |
155 | - function ($matches) { |
|
156 | - |
|
157 | - // If we're inside a namespace other than the global namespace: |
|
158 | - if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) { |
|
159 | - $this->addDiscoveredNamespaceChange($matches[1]); |
|
160 | - return $matches[0]; |
|
161 | - } |
|
162 | - |
|
163 | - if (count($matches) < 3) { |
|
164 | - return $matches[0]; |
|
165 | - } |
|
166 | - |
|
167 | - // TODO: Why is this [2] and not [1] (which seems to be always empty). |
|
168 | - $this->discoveredClasses[$matches[2]] = $matches[2]; |
|
169 | - return $matches[0]; |
|
170 | - }, |
|
171 | - $contents |
|
172 | - ); |
|
173 | - } |
|
174 | - |
|
175 | - protected function addDiscoveredNamespaceChange(string $namespace) |
|
176 | - { |
|
177 | - |
|
178 | - foreach ($this->excludeNamespacesFromPrefixing as $excludeNamespace) { |
|
179 | - if (0 === strpos($namespace, $excludeNamespace)) { |
|
180 | - return; |
|
181 | - } |
|
182 | - } |
|
183 | - |
|
184 | - foreach ($this->namespaceReplacementPatterns as $namespaceReplacementPattern => $replacement) { |
|
185 | - $prefixed = preg_replace($namespaceReplacementPattern, $replacement, $namespace); |
|
186 | - |
|
187 | - if ($prefixed !== $namespace) { |
|
188 | - $this->discoveredNamespaces[$namespace] = $prefixed; |
|
189 | - return; |
|
190 | - } |
|
191 | - } |
|
192 | - |
|
193 | - $this->discoveredNamespaces[$namespace] = $this->namespacePrefix . '\\'. $namespace; |
|
194 | - } |
|
155 | + function ($matches) { |
|
156 | + |
|
157 | + // If we're inside a namespace other than the global namespace: |
|
158 | + if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) { |
|
159 | + $this->addDiscoveredNamespaceChange($matches[1]); |
|
160 | + return $matches[0]; |
|
161 | + } |
|
162 | + |
|
163 | + if (count($matches) < 3) { |
|
164 | + return $matches[0]; |
|
165 | + } |
|
166 | + |
|
167 | + // TODO: Why is this [2] and not [1] (which seems to be always empty). |
|
168 | + $this->discoveredClasses[$matches[2]] = $matches[2]; |
|
169 | + return $matches[0]; |
|
170 | + }, |
|
171 | + $contents |
|
172 | + ); |
|
173 | + } |
|
174 | + |
|
175 | + protected function addDiscoveredNamespaceChange(string $namespace) |
|
176 | + { |
|
177 | + |
|
178 | + foreach ($this->excludeNamespacesFromPrefixing as $excludeNamespace) { |
|
179 | + if (0 === strpos($namespace, $excludeNamespace)) { |
|
180 | + return; |
|
181 | + } |
|
182 | + } |
|
183 | + |
|
184 | + foreach ($this->namespaceReplacementPatterns as $namespaceReplacementPattern => $replacement) { |
|
185 | + $prefixed = preg_replace($namespaceReplacementPattern, $replacement, $namespace); |
|
186 | + |
|
187 | + if ($prefixed !== $namespace) { |
|
188 | + $this->discoveredNamespaces[$namespace] = $prefixed; |
|
189 | + return; |
|
190 | + } |
|
191 | + } |
|
192 | + |
|
193 | + $this->discoveredNamespaces[$namespace] = $this->namespacePrefix . '\\'. $namespace; |
|
194 | + } |
|
195 | 195 | } |
@@ -27,17 +27,17 @@ discard block |
||
27 | 27 | protected array $namespaceReplacementPatterns = array(); |
28 | 28 | |
29 | 29 | /** @var string[] */ |
30 | - protected array $discoveredNamespaces = []; |
|
30 | + protected array $discoveredNamespaces = [ ]; |
|
31 | 31 | |
32 | 32 | /** @var string[] */ |
33 | - protected array $discoveredClasses = []; |
|
33 | + protected array $discoveredClasses = [ ]; |
|
34 | 34 | |
35 | 35 | |
36 | 36 | /** |
37 | 37 | * ChangeEnumerator constructor. |
38 | 38 | * @param \BrianHenryIE\Strauss\Composer\Extra\StraussConfig $config |
39 | 39 | */ |
40 | - public function __construct(StraussConfig $config) |
|
40 | + public function __construct( StraussConfig $config ) |
|
41 | 41 | { |
42 | 42 | $this->namespacePrefix = $config->getNamespacePrefix(); |
43 | 43 | $this->classmapPrefix = $config->getClassmapPrefix(); |
@@ -58,8 +58,8 @@ discard block |
||
58 | 58 | { |
59 | 59 | $discoveredNamespaceReplacements = $this->discoveredNamespaces; |
60 | 60 | |
61 | - uksort($discoveredNamespaceReplacements, function ($a, $b) { |
|
62 | - return strlen($b) <=> strlen($a); |
|
61 | + uksort( $discoveredNamespaceReplacements, function( $a, $b ) { |
|
62 | + return strlen( $b ) <=> strlen( $a ); |
|
63 | 63 | }); |
64 | 64 | |
65 | 65 | return $discoveredNamespaceReplacements; |
@@ -70,7 +70,7 @@ discard block |
||
70 | 70 | */ |
71 | 71 | public function getDiscoveredClasses(): array |
72 | 72 | { |
73 | - return array_keys($this->discoveredClasses); |
|
73 | + return array_keys( $this->discoveredClasses ); |
|
74 | 74 | } |
75 | 75 | |
76 | 76 | |
@@ -78,18 +78,18 @@ discard block |
||
78 | 78 | * @param string $dir |
79 | 79 | * @param array<string, ComposerPackage> $relativeFilepaths |
80 | 80 | */ |
81 | - public function findInFiles($dir, $relativeFilepaths) |
|
81 | + public function findInFiles( $dir, $relativeFilepaths ) |
|
82 | 82 | { |
83 | 83 | |
84 | - foreach ($relativeFilepaths as $relativeFilepath => $package) { |
|
85 | - foreach ($this->excludePackagesFromPrefixing as $excludePackagesName) { |
|
86 | - if ($package->getName() === $excludePackagesName) { |
|
84 | + foreach ( $relativeFilepaths as $relativeFilepath => $package ) { |
|
85 | + foreach ( $this->excludePackagesFromPrefixing as $excludePackagesName ) { |
|
86 | + if ( $package->getName() === $excludePackagesName ) { |
|
87 | 87 | continue 2; |
88 | 88 | } |
89 | 89 | } |
90 | 90 | |
91 | - foreach ($this->excludeFilePatternsFromPrefixing as $excludeFilePattern) { |
|
92 | - if (1 === preg_match($excludeFilePattern, $relativeFilepath)) { |
|
91 | + foreach ( $this->excludeFilePatternsFromPrefixing as $excludeFilePattern ) { |
|
92 | + if ( 1 === preg_match( $excludeFilePattern, $relativeFilepath ) ) { |
|
93 | 93 | continue 2; |
94 | 94 | } |
95 | 95 | } |
@@ -100,9 +100,9 @@ discard block |
||
100 | 100 | // TODO: use flysystem |
101 | 101 | // $contents = $this->filesystem->read($targetFile); |
102 | 102 | |
103 | - $contents = file_get_contents($filepath); |
|
103 | + $contents = file_get_contents( $filepath ); |
|
104 | 104 | |
105 | - $this->find($contents); |
|
105 | + $this->find( $contents ); |
|
106 | 106 | } |
107 | 107 | } |
108 | 108 | |
@@ -114,15 +114,15 @@ discard block |
||
114 | 114 | * |
115 | 115 | * @return string $contents |
116 | 116 | */ |
117 | - public function find(string $contents): string |
|
117 | + public function find( string $contents ): string |
|
118 | 118 | { |
119 | 119 | |
120 | 120 | // If the entire file is under one namespace, all we want is the namespace. |
121 | 121 | $singleNamespacePattern = '/ |
122 | 122 | namespace\s+([0-9A-Za-z_\x7f-\xff\\\\]+)[\s\S]*; # A single namespace in the file.... should return |
123 | 123 | /x'; |
124 | - if (1 === preg_match($singleNamespacePattern, $contents, $matches)) { |
|
125 | - $this->addDiscoveredNamespaceChange($matches[1]); |
|
124 | + if ( 1 === preg_match( $singleNamespacePattern, $contents, $matches ) ) { |
|
125 | + $this->addDiscoveredNamespaceChange( $matches[ 1 ] ); |
|
126 | 126 | return $contents; |
127 | 127 | } |
128 | 128 | |
@@ -152,44 +152,44 @@ discard block |
||
152 | 152 | (?:{|extends|implements|\n|$) # Class declaration can be followed by {, extends, implements |
153 | 153 | # or a new line |
154 | 154 | ~x', // # x: ignore whitespace in regex. |
155 | - function ($matches) { |
|
155 | + function( $matches ) { |
|
156 | 156 | |
157 | 157 | // If we're inside a namespace other than the global namespace: |
158 | - if (1 === preg_match('/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[0])) { |
|
159 | - $this->addDiscoveredNamespaceChange($matches[1]); |
|
160 | - return $matches[0]; |
|
158 | + if ( 1 === preg_match( '/^namespace\s+[a-zA-Z0-9_\x7f-\xff\\\\]+[;{\s\n]{1}.*/', $matches[ 0 ] ) ) { |
|
159 | + $this->addDiscoveredNamespaceChange( $matches[ 1 ] ); |
|
160 | + return $matches[ 0 ]; |
|
161 | 161 | } |
162 | 162 | |
163 | - if (count($matches) < 3) { |
|
164 | - return $matches[0]; |
|
163 | + if ( count( $matches ) < 3 ) { |
|
164 | + return $matches[ 0 ]; |
|
165 | 165 | } |
166 | 166 | |
167 | 167 | // TODO: Why is this [2] and not [1] (which seems to be always empty). |
168 | - $this->discoveredClasses[$matches[2]] = $matches[2]; |
|
169 | - return $matches[0]; |
|
168 | + $this->discoveredClasses[ $matches[ 2 ] ] = $matches[ 2 ]; |
|
169 | + return $matches[ 0 ]; |
|
170 | 170 | }, |
171 | 171 | $contents |
172 | 172 | ); |
173 | 173 | } |
174 | 174 | |
175 | - protected function addDiscoveredNamespaceChange(string $namespace) |
|
175 | + protected function addDiscoveredNamespaceChange( string $namespace ) |
|
176 | 176 | { |
177 | 177 | |
178 | - foreach ($this->excludeNamespacesFromPrefixing as $excludeNamespace) { |
|
179 | - if (0 === strpos($namespace, $excludeNamespace)) { |
|
178 | + foreach ( $this->excludeNamespacesFromPrefixing as $excludeNamespace ) { |
|
179 | + if ( 0 === strpos( $namespace, $excludeNamespace ) ) { |
|
180 | 180 | return; |
181 | 181 | } |
182 | 182 | } |
183 | 183 | |
184 | - foreach ($this->namespaceReplacementPatterns as $namespaceReplacementPattern => $replacement) { |
|
185 | - $prefixed = preg_replace($namespaceReplacementPattern, $replacement, $namespace); |
|
184 | + foreach ( $this->namespaceReplacementPatterns as $namespaceReplacementPattern => $replacement ) { |
|
185 | + $prefixed = preg_replace( $namespaceReplacementPattern, $replacement, $namespace ); |
|
186 | 186 | |
187 | - if ($prefixed !== $namespace) { |
|
188 | - $this->discoveredNamespaces[$namespace] = $prefixed; |
|
187 | + if ( $prefixed !== $namespace ) { |
|
188 | + $this->discoveredNamespaces[ $namespace ] = $prefixed; |
|
189 | 189 | return; |
190 | 190 | } |
191 | 191 | } |
192 | 192 | |
193 | - $this->discoveredNamespaces[$namespace] = $this->namespacePrefix . '\\'. $namespace; |
|
193 | + $this->discoveredNamespaces[ $namespace ] = $this->namespacePrefix . '\\' . $namespace; |
|
194 | 194 | } |
195 | 195 | } |
@@ -10,8 +10,7 @@ discard block |
||
10 | 10 | use BrianHenryIE\Strauss\Composer\ComposerPackage; |
11 | 11 | use BrianHenryIE\Strauss\Composer\Extra\StraussConfig; |
12 | 12 | |
13 | -class ChangeEnumerator |
|
14 | -{ |
|
13 | +class ChangeEnumerator { |
|
15 | 14 | |
16 | 15 | protected string $namespacePrefix; |
17 | 16 | protected string $classmapPrefix; |
@@ -37,8 +36,7 @@ discard block |
||
37 | 36 | * ChangeEnumerator constructor. |
38 | 37 | * @param \BrianHenryIE\Strauss\Composer\Extra\StraussConfig $config |
39 | 38 | */ |
40 | - public function __construct(StraussConfig $config) |
|
41 | - { |
|
39 | + public function __construct(StraussConfig $config) { |
|
42 | 40 | $this->namespacePrefix = $config->getNamespacePrefix(); |
43 | 41 | $this->classmapPrefix = $config->getClassmapPrefix(); |
44 | 42 | |
@@ -78,8 +76,7 @@ discard block |
||
78 | 76 | * @param string $dir |
79 | 77 | * @param array<string, ComposerPackage> $relativeFilepaths |
80 | 78 | */ |
81 | - public function findInFiles($dir, $relativeFilepaths) |
|
82 | - { |
|
79 | + public function findInFiles($dir, $relativeFilepaths) { |
|
83 | 80 | |
84 | 81 | foreach ($relativeFilepaths as $relativeFilepath => $package) { |
85 | 82 | foreach ($this->excludePackagesFromPrefixing as $excludePackagesName) { |
@@ -172,8 +169,7 @@ discard block |
||
172 | 169 | ); |
173 | 170 | } |
174 | 171 | |
175 | - protected function addDiscoveredNamespaceChange(string $namespace) |
|
176 | - { |
|
172 | + protected function addDiscoveredNamespaceChange(string $namespace) { |
|
177 | 173 | |
178 | 174 | foreach ($this->excludeNamespacesFromPrefixing as $excludeNamespace) { |
179 | 175 | if (0 === strpos($namespace, $excludeNamespace)) { |
@@ -19,259 +19,259 @@ |
||
19 | 19 | |
20 | 20 | class Compose extends Command |
21 | 21 | { |
22 | - /** @var string */ |
|
23 | - protected string $workingDir; |
|
22 | + /** @var string */ |
|
23 | + protected string $workingDir; |
|
24 | 24 | |
25 | - /** @var StraussConfig */ |
|
26 | - protected StraussConfig $config; |
|
25 | + /** @var StraussConfig */ |
|
26 | + protected StraussConfig $config; |
|
27 | 27 | |
28 | - protected ProjectComposerPackage $projectComposerPackage; |
|
28 | + protected ProjectComposerPackage $projectComposerPackage; |
|
29 | 29 | |
30 | - /** @var Copier */ |
|
31 | - protected Copier $copier; |
|
30 | + /** @var Copier */ |
|
31 | + protected Copier $copier; |
|
32 | 32 | |
33 | - /** @var Prefixer */ |
|
34 | - protected Prefixer $replacer; |
|
35 | - /** |
|
36 | - * @var ChangeEnumerator |
|
37 | - */ |
|
38 | - protected ChangeEnumerator $changeEnumerator; |
|
33 | + /** @var Prefixer */ |
|
34 | + protected Prefixer $replacer; |
|
35 | + /** |
|
36 | + * @var ChangeEnumerator |
|
37 | + */ |
|
38 | + protected ChangeEnumerator $changeEnumerator; |
|
39 | 39 | |
40 | 40 | |
41 | - /** |
|
42 | - * @return void |
|
43 | - */ |
|
44 | - protected function configure() |
|
45 | - { |
|
46 | - $this->setName('compose'); |
|
47 | - $this->setDescription("Copy composer's `require` and prefix their namespace and classnames."); |
|
48 | - $this->setHelp(''); |
|
49 | - } |
|
41 | + /** |
|
42 | + * @return void |
|
43 | + */ |
|
44 | + protected function configure() |
|
45 | + { |
|
46 | + $this->setName('compose'); |
|
47 | + $this->setDescription("Copy composer's `require` and prefix their namespace and classnames."); |
|
48 | + $this->setHelp(''); |
|
49 | + } |
|
50 | 50 | |
51 | - /** |
|
52 | - * @see Command::execute() |
|
53 | - * |
|
54 | - * @param InputInterface $input |
|
55 | - * @param OutputInterface $output |
|
56 | - * @return int |
|
57 | - */ |
|
58 | - protected function execute(InputInterface $input, OutputInterface $output): int |
|
59 | - { |
|
60 | - $workingDir = getcwd() . DIRECTORY_SEPARATOR; |
|
61 | - $this->workingDir = $workingDir; |
|
51 | + /** |
|
52 | + * @see Command::execute() |
|
53 | + * |
|
54 | + * @param InputInterface $input |
|
55 | + * @param OutputInterface $output |
|
56 | + * @return int |
|
57 | + */ |
|
58 | + protected function execute(InputInterface $input, OutputInterface $output): int |
|
59 | + { |
|
60 | + $workingDir = getcwd() . DIRECTORY_SEPARATOR; |
|
61 | + $this->workingDir = $workingDir; |
|
62 | 62 | |
63 | - try { |
|
64 | - $this->loadProjectComposerPackage(); |
|
63 | + try { |
|
64 | + $this->loadProjectComposerPackage(); |
|
65 | 65 | |
66 | - $this->buildDependencyList(); |
|
66 | + $this->buildDependencyList(); |
|
67 | 67 | |
68 | - $this->enumerateFiles(); |
|
68 | + $this->enumerateFiles(); |
|
69 | 69 | |
70 | - $this->copyFiles(); |
|
70 | + $this->copyFiles(); |
|
71 | 71 | |
72 | - $this->determineChanges(); |
|
72 | + $this->determineChanges(); |
|
73 | 73 | |
74 | - $this->performReplacements(); |
|
74 | + $this->performReplacements(); |
|
75 | 75 | |
76 | - $this->addLicenses(); |
|
77 | - |
|
78 | - $this->generateAutoloader(); |
|
76 | + $this->addLicenses(); |
|
77 | + |
|
78 | + $this->generateAutoloader(); |
|
79 | 79 | |
80 | - $this->cleanUp(); |
|
81 | - } catch (Exception $e) { |
|
82 | - $output->write($e->getMessage()); |
|
83 | - return 1; |
|
84 | - } |
|
80 | + $this->cleanUp(); |
|
81 | + } catch (Exception $e) { |
|
82 | + $output->write($e->getMessage()); |
|
83 | + return 1; |
|
84 | + } |
|
85 | 85 | |
86 | - // What should this be?! |
|
87 | - return 0; |
|
88 | - } |
|
86 | + // What should this be?! |
|
87 | + return 0; |
|
88 | + } |
|
89 | 89 | |
90 | 90 | |
91 | - /** |
|
92 | - * 1. Load the composer.json. |
|
93 | - * |
|
94 | - * @throws Exception |
|
95 | - */ |
|
96 | - protected function loadProjectComposerPackage() |
|
97 | - { |
|
91 | + /** |
|
92 | + * 1. Load the composer.json. |
|
93 | + * |
|
94 | + * @throws Exception |
|
95 | + */ |
|
96 | + protected function loadProjectComposerPackage() |
|
97 | + { |
|
98 | 98 | |
99 | - $this->projectComposerPackage = new ProjectComposerPackage($this->workingDir . 'composer.json'); |
|
99 | + $this->projectComposerPackage = new ProjectComposerPackage($this->workingDir . 'composer.json'); |
|
100 | 100 | |
101 | - $config = $this->projectComposerPackage->getStraussConfig(); |
|
101 | + $config = $this->projectComposerPackage->getStraussConfig(); |
|
102 | 102 | |
103 | - $this->config = $config; |
|
104 | - } |
|
103 | + $this->config = $config; |
|
104 | + } |
|
105 | 105 | |
106 | 106 | |
107 | - /** @var ComposerPackage[] */ |
|
108 | - protected array $flatDependencyTree = []; |
|
107 | + /** @var ComposerPackage[] */ |
|
108 | + protected array $flatDependencyTree = []; |
|
109 | 109 | |
110 | - /** |
|
111 | - * 2. Built flat list of packages and dependencies. |
|
112 | - * |
|
113 | - * 2.1 Initiate getting dependencies for the project composer.json. |
|
114 | - * |
|
115 | - * @see Compose::flatDependencyTree |
|
116 | - */ |
|
117 | - protected function buildDependencyList() |
|
118 | - { |
|
110 | + /** |
|
111 | + * 2. Built flat list of packages and dependencies. |
|
112 | + * |
|
113 | + * 2.1 Initiate getting dependencies for the project composer.json. |
|
114 | + * |
|
115 | + * @see Compose::flatDependencyTree |
|
116 | + */ |
|
117 | + protected function buildDependencyList() |
|
118 | + { |
|
119 | 119 | |
120 | - $requiredPackageNames = $this->config->getPackages(); |
|
120 | + $requiredPackageNames = $this->config->getPackages(); |
|
121 | 121 | |
122 | - // Unset PHP, ext-*. |
|
123 | - $removePhpExt = function ($element) { |
|
124 | - return !( 0 === strpos($element, 'ext') || 'php' === $element ); |
|
125 | - }; |
|
122 | + // Unset PHP, ext-*. |
|
123 | + $removePhpExt = function ($element) { |
|
124 | + return !( 0 === strpos($element, 'ext') || 'php' === $element ); |
|
125 | + }; |
|
126 | 126 | |
127 | - $requiredPackageNames = array_filter($requiredPackageNames, $removePhpExt); |
|
127 | + $requiredPackageNames = array_filter($requiredPackageNames, $removePhpExt); |
|
128 | 128 | |
129 | - foreach ($requiredPackageNames as $requiredPackageName) { |
|
130 | - $packageDir = $this->workingDir . 'vendor' .DIRECTORY_SEPARATOR |
|
131 | - . $requiredPackageName . DIRECTORY_SEPARATOR; |
|
129 | + foreach ($requiredPackageNames as $requiredPackageName) { |
|
130 | + $packageDir = $this->workingDir . 'vendor' .DIRECTORY_SEPARATOR |
|
131 | + . $requiredPackageName . DIRECTORY_SEPARATOR; |
|
132 | 132 | |
133 | - $overrideAutoload = isset($this->config->getOverrideAutoload()[$requiredPackageName]) |
|
134 | - ? $this->config->getOverrideAutoload()[$requiredPackageName] |
|
135 | - : null; |
|
133 | + $overrideAutoload = isset($this->config->getOverrideAutoload()[$requiredPackageName]) |
|
134 | + ? $this->config->getOverrideAutoload()[$requiredPackageName] |
|
135 | + : null; |
|
136 | 136 | |
137 | - $requiredComposerPackage = new ComposerPackage($packageDir, $overrideAutoload); |
|
138 | - $this->flatDependencyTree[$requiredComposerPackage->getName()] = $requiredComposerPackage; |
|
139 | - $this->getAllDependencies($requiredComposerPackage); |
|
140 | - } |
|
141 | - } |
|
142 | - |
|
143 | - /** |
|
144 | - * 2.2 Recursive function to get dependencies. |
|
145 | - * |
|
146 | - * @param ComposerPackage $requiredDependency |
|
147 | - */ |
|
148 | - protected function getAllDependencies(ComposerPackage $requiredDependency): void |
|
149 | - { |
|
150 | - $excludedPackagesNames = $this->config->getExcludePackagesFromPrefixing(); |
|
137 | + $requiredComposerPackage = new ComposerPackage($packageDir, $overrideAutoload); |
|
138 | + $this->flatDependencyTree[$requiredComposerPackage->getName()] = $requiredComposerPackage; |
|
139 | + $this->getAllDependencies($requiredComposerPackage); |
|
140 | + } |
|
141 | + } |
|
142 | + |
|
143 | + /** |
|
144 | + * 2.2 Recursive function to get dependencies. |
|
145 | + * |
|
146 | + * @param ComposerPackage $requiredDependency |
|
147 | + */ |
|
148 | + protected function getAllDependencies(ComposerPackage $requiredDependency): void |
|
149 | + { |
|
150 | + $excludedPackagesNames = $this->config->getExcludePackagesFromPrefixing(); |
|
151 | 151 | |
152 | - // Unset PHP, ext-*. |
|
153 | - $removePhpExt = function ($element) { |
|
154 | - return !( 0 === strpos($element, 'ext') || 'php' === $element ); |
|
155 | - }; |
|
152 | + // Unset PHP, ext-*. |
|
153 | + $removePhpExt = function ($element) { |
|
154 | + return !( 0 === strpos($element, 'ext') || 'php' === $element ); |
|
155 | + }; |
|
156 | 156 | |
157 | - $required = array_filter($requiredDependency->getRequiresNames(), $removePhpExt); |
|
157 | + $required = array_filter($requiredDependency->getRequiresNames(), $removePhpExt); |
|
158 | 158 | |
159 | - foreach ($required as $dependencyName) { |
|
160 | - if (in_array($dependencyName, $excludedPackagesNames)) { |
|
161 | - continue; |
|
162 | - } |
|
159 | + foreach ($required as $dependencyName) { |
|
160 | + if (in_array($dependencyName, $excludedPackagesNames)) { |
|
161 | + continue; |
|
162 | + } |
|
163 | 163 | |
164 | - $overrideAutoload = isset($this->config->getOverrideAutoload()[$dependencyName]) |
|
165 | - ? $this->config->getOverrideAutoload()[$dependencyName] |
|
166 | - : null; |
|
164 | + $overrideAutoload = isset($this->config->getOverrideAutoload()[$dependencyName]) |
|
165 | + ? $this->config->getOverrideAutoload()[$dependencyName] |
|
166 | + : null; |
|
167 | 167 | |
168 | - $dependencyComposerPackage = new ComposerPackage( |
|
169 | - $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR |
|
170 | - . $dependencyName . DIRECTORY_SEPARATOR . 'composer.json', |
|
171 | - $overrideAutoload |
|
172 | - ); |
|
168 | + $dependencyComposerPackage = new ComposerPackage( |
|
169 | + $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR |
|
170 | + . $dependencyName . DIRECTORY_SEPARATOR . 'composer.json', |
|
171 | + $overrideAutoload |
|
172 | + ); |
|
173 | 173 | |
174 | - $this->flatDependencyTree[$dependencyName] = $dependencyComposerPackage; |
|
175 | - $this->getAllDependencies($dependencyComposerPackage); |
|
176 | - } |
|
177 | - } |
|
178 | - |
|
179 | - protected FileEnumerator $fileEnumerator; |
|
180 | - |
|
181 | - protected function enumerateFiles() |
|
182 | - { |
|
183 | - |
|
184 | - $this->fileEnumerator = new FileEnumerator( |
|
185 | - $this->flatDependencyTree, |
|
186 | - $this->workingDir, |
|
187 | - $this->config |
|
188 | - ); |
|
174 | + $this->flatDependencyTree[$dependencyName] = $dependencyComposerPackage; |
|
175 | + $this->getAllDependencies($dependencyComposerPackage); |
|
176 | + } |
|
177 | + } |
|
178 | + |
|
179 | + protected FileEnumerator $fileEnumerator; |
|
180 | + |
|
181 | + protected function enumerateFiles() |
|
182 | + { |
|
183 | + |
|
184 | + $this->fileEnumerator = new FileEnumerator( |
|
185 | + $this->flatDependencyTree, |
|
186 | + $this->workingDir, |
|
187 | + $this->config |
|
188 | + ); |
|
189 | 189 | |
190 | - $this->fileEnumerator->compileFileList(); |
|
191 | - } |
|
192 | - |
|
193 | - // 3. Copy autoloaded files for each |
|
194 | - protected function copyFiles() |
|
195 | - { |
|
190 | + $this->fileEnumerator->compileFileList(); |
|
191 | + } |
|
192 | + |
|
193 | + // 3. Copy autoloaded files for each |
|
194 | + protected function copyFiles() |
|
195 | + { |
|
196 | 196 | |
197 | - $this->copier = new Copier( |
|
198 | - $this->fileEnumerator->getAllFilesAndDependencyList(), |
|
199 | - $this->workingDir, |
|
200 | - $this->config->getTargetDirectory() |
|
201 | - ); |
|
202 | - |
|
203 | - $this->copier->prepareTarget(); |
|
204 | - |
|
205 | - $this->copier->copy(); |
|
206 | - } |
|
207 | - |
|
208 | - // 4. Determine namespace and classname changes |
|
209 | - protected function determineChanges() |
|
210 | - { |
|
211 | - |
|
212 | - $this->changeEnumerator = new ChangeEnumerator($this->config); |
|
213 | - |
|
214 | - $relativeTargetDir = $this->config->getTargetDirectory(); |
|
215 | - $phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList(); |
|
216 | - $this->changeEnumerator->findInFiles($relativeTargetDir, $phpFiles); |
|
217 | - } |
|
218 | - |
|
219 | - // 5. Update namespaces and class names. |
|
220 | - // Replace references to updated namespaces and classnames throughout the dependencies. |
|
221 | - protected function performReplacements() |
|
222 | - { |
|
223 | - $this->replacer = new Prefixer($this->config, $this->workingDir); |
|
224 | - |
|
225 | - $namespaces = $this->changeEnumerator->getDiscoveredNamespaceReplacements(); |
|
226 | - $classes = $this->changeEnumerator->getDiscoveredClasses(); |
|
197 | + $this->copier = new Copier( |
|
198 | + $this->fileEnumerator->getAllFilesAndDependencyList(), |
|
199 | + $this->workingDir, |
|
200 | + $this->config->getTargetDirectory() |
|
201 | + ); |
|
202 | + |
|
203 | + $this->copier->prepareTarget(); |
|
204 | + |
|
205 | + $this->copier->copy(); |
|
206 | + } |
|
207 | + |
|
208 | + // 4. Determine namespace and classname changes |
|
209 | + protected function determineChanges() |
|
210 | + { |
|
211 | + |
|
212 | + $this->changeEnumerator = new ChangeEnumerator($this->config); |
|
213 | + |
|
214 | + $relativeTargetDir = $this->config->getTargetDirectory(); |
|
215 | + $phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList(); |
|
216 | + $this->changeEnumerator->findInFiles($relativeTargetDir, $phpFiles); |
|
217 | + } |
|
218 | + |
|
219 | + // 5. Update namespaces and class names. |
|
220 | + // Replace references to updated namespaces and classnames throughout the dependencies. |
|
221 | + protected function performReplacements() |
|
222 | + { |
|
223 | + $this->replacer = new Prefixer($this->config, $this->workingDir); |
|
224 | + |
|
225 | + $namespaces = $this->changeEnumerator->getDiscoveredNamespaceReplacements(); |
|
226 | + $classes = $this->changeEnumerator->getDiscoveredClasses(); |
|
227 | 227 | |
228 | - $phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList(); |
|
228 | + $phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList(); |
|
229 | 229 | |
230 | - $this->replacer->replaceInFiles($namespaces, $classes, $phpFiles); |
|
231 | - } |
|
230 | + $this->replacer->replaceInFiles($namespaces, $classes, $phpFiles); |
|
231 | + } |
|
232 | 232 | |
233 | - protected function addLicenses(): void |
|
234 | - { |
|
233 | + protected function addLicenses(): void |
|
234 | + { |
|
235 | 235 | |
236 | - $author = $this->projectComposerPackage->getAuthor(); |
|
236 | + $author = $this->projectComposerPackage->getAuthor(); |
|
237 | 237 | |
238 | - $dependencies = $this->flatDependencyTree; |
|
238 | + $dependencies = $this->flatDependencyTree; |
|
239 | 239 | |
240 | - $licenser = new Licenser($this->config, $this->workingDir, $dependencies, $author); |
|
240 | + $licenser = new Licenser($this->config, $this->workingDir, $dependencies, $author); |
|
241 | 241 | |
242 | - $licenser->copyLicenses(); |
|
242 | + $licenser->copyLicenses(); |
|
243 | 243 | |
244 | - $modifiedFiles = $this->replacer->getModifiedFiles(); |
|
245 | - $licenser->addInformationToUpdatedFiles($modifiedFiles); |
|
246 | - } |
|
244 | + $modifiedFiles = $this->replacer->getModifiedFiles(); |
|
245 | + $licenser->addInformationToUpdatedFiles($modifiedFiles); |
|
246 | + } |
|
247 | 247 | |
248 | - /** |
|
249 | - * 6. Generate autoloader. |
|
250 | - */ |
|
251 | - protected function generateAutoloader() |
|
252 | - { |
|
248 | + /** |
|
249 | + * 6. Generate autoloader. |
|
250 | + */ |
|
251 | + protected function generateAutoloader() |
|
252 | + { |
|
253 | 253 | |
254 | - $files = $this->fileEnumerator->getFilesAutoloaders(); |
|
254 | + $files = $this->fileEnumerator->getFilesAutoloaders(); |
|
255 | 255 | |
256 | - $classmap = new Autoload($this->config, $this->workingDir, $files); |
|
256 | + $classmap = new Autoload($this->config, $this->workingDir, $files); |
|
257 | 257 | |
258 | - $classmap->generate(); |
|
259 | - } |
|
258 | + $classmap->generate(); |
|
259 | + } |
|
260 | 260 | |
261 | 261 | |
262 | - /** |
|
263 | - * 7. |
|
264 | - * Delete source files if desired. |
|
265 | - * Delete empty directories in destination. |
|
266 | - */ |
|
267 | - protected function cleanUp() |
|
268 | - { |
|
262 | + /** |
|
263 | + * 7. |
|
264 | + * Delete source files if desired. |
|
265 | + * Delete empty directories in destination. |
|
266 | + */ |
|
267 | + protected function cleanUp() |
|
268 | + { |
|
269 | 269 | |
270 | - $cleanup = new Cleanup($this->config, $this->workingDir); |
|
270 | + $cleanup = new Cleanup($this->config, $this->workingDir); |
|
271 | 271 | |
272 | - $sourceFiles = array_keys($this->fileEnumerator->getAllFilesAndDependencyList()); |
|
272 | + $sourceFiles = array_keys($this->fileEnumerator->getAllFilesAndDependencyList()); |
|
273 | 273 | |
274 | - // This will check the config to check should it delete or not. |
|
275 | - $cleanup->cleanup($sourceFiles); |
|
276 | - } |
|
274 | + // This will check the config to check should it delete or not. |
|
275 | + $cleanup->cleanup($sourceFiles); |
|
276 | + } |
|
277 | 277 | } |
@@ -43,9 +43,9 @@ discard block |
||
43 | 43 | */ |
44 | 44 | protected function configure() |
45 | 45 | { |
46 | - $this->setName('compose'); |
|
47 | - $this->setDescription("Copy composer's `require` and prefix their namespace and classnames."); |
|
48 | - $this->setHelp(''); |
|
46 | + $this->setName( 'compose' ); |
|
47 | + $this->setDescription( "Copy composer's `require` and prefix their namespace and classnames." ); |
|
48 | + $this->setHelp( '' ); |
|
49 | 49 | } |
50 | 50 | |
51 | 51 | /** |
@@ -55,7 +55,7 @@ discard block |
||
55 | 55 | * @param OutputInterface $output |
56 | 56 | * @return int |
57 | 57 | */ |
58 | - protected function execute(InputInterface $input, OutputInterface $output): int |
|
58 | + protected function execute( InputInterface $input, OutputInterface $output ): int |
|
59 | 59 | { |
60 | 60 | $workingDir = getcwd() . DIRECTORY_SEPARATOR; |
61 | 61 | $this->workingDir = $workingDir; |
@@ -78,8 +78,8 @@ discard block |
||
78 | 78 | $this->generateAutoloader(); |
79 | 79 | |
80 | 80 | $this->cleanUp(); |
81 | - } catch (Exception $e) { |
|
82 | - $output->write($e->getMessage()); |
|
81 | + } catch ( Exception $e ) { |
|
82 | + $output->write( $e->getMessage() ); |
|
83 | 83 | return 1; |
84 | 84 | } |
85 | 85 | |
@@ -96,7 +96,7 @@ discard block |
||
96 | 96 | protected function loadProjectComposerPackage() |
97 | 97 | { |
98 | 98 | |
99 | - $this->projectComposerPackage = new ProjectComposerPackage($this->workingDir . 'composer.json'); |
|
99 | + $this->projectComposerPackage = new ProjectComposerPackage( $this->workingDir . 'composer.json' ); |
|
100 | 100 | |
101 | 101 | $config = $this->projectComposerPackage->getStraussConfig(); |
102 | 102 | |
@@ -105,7 +105,7 @@ discard block |
||
105 | 105 | |
106 | 106 | |
107 | 107 | /** @var ComposerPackage[] */ |
108 | - protected array $flatDependencyTree = []; |
|
108 | + protected array $flatDependencyTree = [ ]; |
|
109 | 109 | |
110 | 110 | /** |
111 | 111 | * 2. Built flat list of packages and dependencies. |
@@ -120,23 +120,23 @@ discard block |
||
120 | 120 | $requiredPackageNames = $this->config->getPackages(); |
121 | 121 | |
122 | 122 | // Unset PHP, ext-*. |
123 | - $removePhpExt = function ($element) { |
|
124 | - return !( 0 === strpos($element, 'ext') || 'php' === $element ); |
|
123 | + $removePhpExt = function( $element ) { |
|
124 | + return ! ( 0 === strpos( $element, 'ext' ) || 'php' === $element ); |
|
125 | 125 | }; |
126 | 126 | |
127 | - $requiredPackageNames = array_filter($requiredPackageNames, $removePhpExt); |
|
127 | + $requiredPackageNames = array_filter( $requiredPackageNames, $removePhpExt ); |
|
128 | 128 | |
129 | - foreach ($requiredPackageNames as $requiredPackageName) { |
|
130 | - $packageDir = $this->workingDir . 'vendor' .DIRECTORY_SEPARATOR |
|
129 | + foreach ( $requiredPackageNames as $requiredPackageName ) { |
|
130 | + $packageDir = $this->workingDir . 'vendor' . DIRECTORY_SEPARATOR |
|
131 | 131 | . $requiredPackageName . DIRECTORY_SEPARATOR; |
132 | 132 | |
133 | - $overrideAutoload = isset($this->config->getOverrideAutoload()[$requiredPackageName]) |
|
134 | - ? $this->config->getOverrideAutoload()[$requiredPackageName] |
|
133 | + $overrideAutoload = isset( $this->config->getOverrideAutoload()[ $requiredPackageName ] ) |
|
134 | + ? $this->config->getOverrideAutoload()[ $requiredPackageName ] |
|
135 | 135 | : null; |
136 | 136 | |
137 | - $requiredComposerPackage = new ComposerPackage($packageDir, $overrideAutoload); |
|
138 | - $this->flatDependencyTree[$requiredComposerPackage->getName()] = $requiredComposerPackage; |
|
139 | - $this->getAllDependencies($requiredComposerPackage); |
|
137 | + $requiredComposerPackage = new ComposerPackage( $packageDir, $overrideAutoload ); |
|
138 | + $this->flatDependencyTree[ $requiredComposerPackage->getName() ] = $requiredComposerPackage; |
|
139 | + $this->getAllDependencies( $requiredComposerPackage ); |
|
140 | 140 | } |
141 | 141 | } |
142 | 142 | |
@@ -145,24 +145,24 @@ discard block |
||
145 | 145 | * |
146 | 146 | * @param ComposerPackage $requiredDependency |
147 | 147 | */ |
148 | - protected function getAllDependencies(ComposerPackage $requiredDependency): void |
|
148 | + protected function getAllDependencies( ComposerPackage $requiredDependency ): void |
|
149 | 149 | { |
150 | 150 | $excludedPackagesNames = $this->config->getExcludePackagesFromPrefixing(); |
151 | 151 | |
152 | 152 | // Unset PHP, ext-*. |
153 | - $removePhpExt = function ($element) { |
|
154 | - return !( 0 === strpos($element, 'ext') || 'php' === $element ); |
|
153 | + $removePhpExt = function( $element ) { |
|
154 | + return ! ( 0 === strpos( $element, 'ext' ) || 'php' === $element ); |
|
155 | 155 | }; |
156 | 156 | |
157 | - $required = array_filter($requiredDependency->getRequiresNames(), $removePhpExt); |
|
157 | + $required = array_filter( $requiredDependency->getRequiresNames(), $removePhpExt ); |
|
158 | 158 | |
159 | - foreach ($required as $dependencyName) { |
|
160 | - if (in_array($dependencyName, $excludedPackagesNames)) { |
|
159 | + foreach ( $required as $dependencyName ) { |
|
160 | + if ( in_array( $dependencyName, $excludedPackagesNames ) ) { |
|
161 | 161 | continue; |
162 | 162 | } |
163 | 163 | |
164 | - $overrideAutoload = isset($this->config->getOverrideAutoload()[$dependencyName]) |
|
165 | - ? $this->config->getOverrideAutoload()[$dependencyName] |
|
164 | + $overrideAutoload = isset( $this->config->getOverrideAutoload()[ $dependencyName ] ) |
|
165 | + ? $this->config->getOverrideAutoload()[ $dependencyName ] |
|
166 | 166 | : null; |
167 | 167 | |
168 | 168 | $dependencyComposerPackage = new ComposerPackage( |
@@ -171,8 +171,8 @@ discard block |
||
171 | 171 | $overrideAutoload |
172 | 172 | ); |
173 | 173 | |
174 | - $this->flatDependencyTree[$dependencyName] = $dependencyComposerPackage; |
|
175 | - $this->getAllDependencies($dependencyComposerPackage); |
|
174 | + $this->flatDependencyTree[ $dependencyName ] = $dependencyComposerPackage; |
|
175 | + $this->getAllDependencies( $dependencyComposerPackage ); |
|
176 | 176 | } |
177 | 177 | } |
178 | 178 | |
@@ -209,25 +209,25 @@ discard block |
||
209 | 209 | protected function determineChanges() |
210 | 210 | { |
211 | 211 | |
212 | - $this->changeEnumerator = new ChangeEnumerator($this->config); |
|
212 | + $this->changeEnumerator = new ChangeEnumerator( $this->config ); |
|
213 | 213 | |
214 | 214 | $relativeTargetDir = $this->config->getTargetDirectory(); |
215 | 215 | $phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList(); |
216 | - $this->changeEnumerator->findInFiles($relativeTargetDir, $phpFiles); |
|
216 | + $this->changeEnumerator->findInFiles( $relativeTargetDir, $phpFiles ); |
|
217 | 217 | } |
218 | 218 | |
219 | 219 | // 5. Update namespaces and class names. |
220 | 220 | // Replace references to updated namespaces and classnames throughout the dependencies. |
221 | 221 | protected function performReplacements() |
222 | 222 | { |
223 | - $this->replacer = new Prefixer($this->config, $this->workingDir); |
|
223 | + $this->replacer = new Prefixer( $this->config, $this->workingDir ); |
|
224 | 224 | |
225 | 225 | $namespaces = $this->changeEnumerator->getDiscoveredNamespaceReplacements(); |
226 | 226 | $classes = $this->changeEnumerator->getDiscoveredClasses(); |
227 | 227 | |
228 | 228 | $phpFiles = $this->fileEnumerator->getPhpFilesAndDependencyList(); |
229 | 229 | |
230 | - $this->replacer->replaceInFiles($namespaces, $classes, $phpFiles); |
|
230 | + $this->replacer->replaceInFiles( $namespaces, $classes, $phpFiles ); |
|
231 | 231 | } |
232 | 232 | |
233 | 233 | protected function addLicenses(): void |
@@ -237,12 +237,12 @@ discard block |
||
237 | 237 | |
238 | 238 | $dependencies = $this->flatDependencyTree; |
239 | 239 | |
240 | - $licenser = new Licenser($this->config, $this->workingDir, $dependencies, $author); |
|
240 | + $licenser = new Licenser( $this->config, $this->workingDir, $dependencies, $author ); |
|
241 | 241 | |
242 | 242 | $licenser->copyLicenses(); |
243 | 243 | |
244 | 244 | $modifiedFiles = $this->replacer->getModifiedFiles(); |
245 | - $licenser->addInformationToUpdatedFiles($modifiedFiles); |
|
245 | + $licenser->addInformationToUpdatedFiles( $modifiedFiles ); |
|
246 | 246 | } |
247 | 247 | |
248 | 248 | /** |
@@ -253,7 +253,7 @@ discard block |
||
253 | 253 | |
254 | 254 | $files = $this->fileEnumerator->getFilesAutoloaders(); |
255 | 255 | |
256 | - $classmap = new Autoload($this->config, $this->workingDir, $files); |
|
256 | + $classmap = new Autoload( $this->config, $this->workingDir, $files ); |
|
257 | 257 | |
258 | 258 | $classmap->generate(); |
259 | 259 | } |
@@ -267,11 +267,11 @@ discard block |
||
267 | 267 | protected function cleanUp() |
268 | 268 | { |
269 | 269 | |
270 | - $cleanup = new Cleanup($this->config, $this->workingDir); |
|
270 | + $cleanup = new Cleanup( $this->config, $this->workingDir ); |
|
271 | 271 | |
272 | - $sourceFiles = array_keys($this->fileEnumerator->getAllFilesAndDependencyList()); |
|
272 | + $sourceFiles = array_keys( $this->fileEnumerator->getAllFilesAndDependencyList() ); |
|
273 | 273 | |
274 | 274 | // This will check the config to check should it delete or not. |
275 | - $cleanup->cleanup($sourceFiles); |
|
275 | + $cleanup->cleanup( $sourceFiles ); |
|
276 | 276 | } |
277 | 277 | } |
@@ -17,8 +17,7 @@ discard block |
||
17 | 17 | use Symfony\Component\Console\Input\InputInterface; |
18 | 18 | use Symfony\Component\Console\Output\OutputInterface; |
19 | 19 | |
20 | -class Compose extends Command |
|
21 | -{ |
|
20 | +class Compose extends Command { |
|
22 | 21 | /** @var string */ |
23 | 22 | protected string $workingDir; |
24 | 23 | |
@@ -41,8 +40,7 @@ discard block |
||
41 | 40 | /** |
42 | 41 | * @return void |
43 | 42 | */ |
44 | - protected function configure() |
|
45 | - { |
|
43 | + protected function configure() { |
|
46 | 44 | $this->setName('compose'); |
47 | 45 | $this->setDescription("Copy composer's `require` and prefix their namespace and classnames."); |
48 | 46 | $this->setHelp(''); |
@@ -93,8 +91,7 @@ discard block |
||
93 | 91 | * |
94 | 92 | * @throws Exception |
95 | 93 | */ |
96 | - protected function loadProjectComposerPackage() |
|
97 | - { |
|
94 | + protected function loadProjectComposerPackage() { |
|
98 | 95 | |
99 | 96 | $this->projectComposerPackage = new ProjectComposerPackage($this->workingDir . 'composer.json'); |
100 | 97 | |
@@ -114,8 +111,7 @@ discard block |
||
114 | 111 | * |
115 | 112 | * @see Compose::flatDependencyTree |
116 | 113 | */ |
117 | - protected function buildDependencyList() |
|
118 | - { |
|
114 | + protected function buildDependencyList() { |
|
119 | 115 | |
120 | 116 | $requiredPackageNames = $this->config->getPackages(); |
121 | 117 | |
@@ -178,8 +174,7 @@ discard block |
||
178 | 174 | |
179 | 175 | protected FileEnumerator $fileEnumerator; |
180 | 176 | |
181 | - protected function enumerateFiles() |
|
182 | - { |
|
177 | + protected function enumerateFiles() { |
|
183 | 178 | |
184 | 179 | $this->fileEnumerator = new FileEnumerator( |
185 | 180 | $this->flatDependencyTree, |
@@ -191,8 +186,7 @@ discard block |
||
191 | 186 | } |
192 | 187 | |
193 | 188 | // 3. Copy autoloaded files for each |
194 | - protected function copyFiles() |
|
195 | - { |
|
189 | + protected function copyFiles() { |
|
196 | 190 | |
197 | 191 | $this->copier = new Copier( |
198 | 192 | $this->fileEnumerator->getAllFilesAndDependencyList(), |
@@ -206,8 +200,7 @@ discard block |
||
206 | 200 | } |
207 | 201 | |
208 | 202 | // 4. Determine namespace and classname changes |
209 | - protected function determineChanges() |
|
210 | - { |
|
203 | + protected function determineChanges() { |
|
211 | 204 | |
212 | 205 | $this->changeEnumerator = new ChangeEnumerator($this->config); |
213 | 206 | |
@@ -218,8 +211,7 @@ discard block |
||
218 | 211 | |
219 | 212 | // 5. Update namespaces and class names. |
220 | 213 | // Replace references to updated namespaces and classnames throughout the dependencies. |
221 | - protected function performReplacements() |
|
222 | - { |
|
214 | + protected function performReplacements() { |
|
223 | 215 | $this->replacer = new Prefixer($this->config, $this->workingDir); |
224 | 216 | |
225 | 217 | $namespaces = $this->changeEnumerator->getDiscoveredNamespaceReplacements(); |
@@ -248,8 +240,7 @@ discard block |
||
248 | 240 | /** |
249 | 241 | * 6. Generate autoloader. |
250 | 242 | */ |
251 | - protected function generateAutoloader() |
|
252 | - { |
|
243 | + protected function generateAutoloader() { |
|
253 | 244 | |
254 | 245 | $files = $this->fileEnumerator->getFilesAutoloaders(); |
255 | 246 | |
@@ -264,8 +255,7 @@ discard block |
||
264 | 255 | * Delete source files if desired. |
265 | 256 | * Delete empty directories in destination. |
266 | 257 | */ |
267 | - protected function cleanUp() |
|
268 | - { |
|
258 | + protected function cleanUp() { |
|
269 | 259 | |
270 | 260 | $cleanup = new Cleanup($this->config, $this->workingDir); |
271 | 261 |
@@ -7,16 +7,16 @@ |
||
7 | 7 | |
8 | 8 | class Application extends BaseApplication |
9 | 9 | { |
10 | - /** |
|
11 | - * @param string $version |
|
12 | - */ |
|
13 | - public function __construct(string $version) |
|
14 | - { |
|
15 | - parent::__construct('strauss', $version); |
|
10 | + /** |
|
11 | + * @param string $version |
|
12 | + */ |
|
13 | + public function __construct(string $version) |
|
14 | + { |
|
15 | + parent::__construct('strauss', $version); |
|
16 | 16 | |
17 | - $composeCommand = new Compose(); |
|
18 | - $this->add($composeCommand); |
|
17 | + $composeCommand = new Compose(); |
|
18 | + $this->add($composeCommand); |
|
19 | 19 | |
20 | - $this->setDefaultCommand('compose'); |
|
21 | - } |
|
20 | + $this->setDefaultCommand('compose'); |
|
21 | + } |
|
22 | 22 | } |
@@ -10,13 +10,13 @@ |
||
10 | 10 | /** |
11 | 11 | * @param string $version |
12 | 12 | */ |
13 | - public function __construct(string $version) |
|
13 | + public function __construct( string $version ) |
|
14 | 14 | { |
15 | - parent::__construct('strauss', $version); |
|
15 | + parent::__construct( 'strauss', $version ); |
|
16 | 16 | |
17 | 17 | $composeCommand = new Compose(); |
18 | - $this->add($composeCommand); |
|
18 | + $this->add( $composeCommand ); |
|
19 | 19 | |
20 | - $this->setDefaultCommand('compose'); |
|
20 | + $this->setDefaultCommand( 'compose' ); |
|
21 | 21 | } |
22 | 22 | } |
@@ -5,13 +5,11 @@ |
||
5 | 5 | use BrianHenryIE\Strauss\Console\Commands\Compose; |
6 | 6 | use Symfony\Component\Console\Application as BaseApplication; |
7 | 7 | |
8 | -class Application extends BaseApplication |
|
9 | -{ |
|
8 | +class Application extends BaseApplication { |
|
10 | 9 | /** |
11 | 10 | * @param string $version |
12 | 11 | */ |
13 | - public function __construct(string $version) |
|
14 | - { |
|
12 | + public function __construct(string $version) { |
|
15 | 13 | parent::__construct('strauss', $version); |
16 | 14 | |
17 | 15 | $composeCommand = new Compose(); |
@@ -27,164 +27,164 @@ |
||
27 | 27 | */ |
28 | 28 | |
29 | 29 | if (!defined('RANDOM_COMPAT_READ_BUFFER')) { |
30 | - define('RANDOM_COMPAT_READ_BUFFER', 8); |
|
30 | + define('RANDOM_COMPAT_READ_BUFFER', 8); |
|
31 | 31 | } |
32 | 32 | |
33 | 33 | if (!is_callable('random_bytes')) { |
34 | - /** |
|
35 | - * Unless open_basedir is enabled, use /dev/urandom for |
|
36 | - * random numbers in accordance with best practices |
|
37 | - * |
|
38 | - * Why we use /dev/urandom and not /dev/random |
|
39 | - * @ref https://www.2uo.de/myths-about-urandom |
|
40 | - * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers |
|
41 | - * |
|
42 | - * @param int $bytes |
|
43 | - * |
|
44 | - * @throws Exception |
|
45 | - * |
|
46 | - * @return string |
|
47 | - */ |
|
48 | - function random_bytes($bytes) |
|
49 | - { |
|
50 | - /** @var resource $fp */ |
|
51 | - static $fp = null; |
|
34 | + /** |
|
35 | + * Unless open_basedir is enabled, use /dev/urandom for |
|
36 | + * random numbers in accordance with best practices |
|
37 | + * |
|
38 | + * Why we use /dev/urandom and not /dev/random |
|
39 | + * @ref https://www.2uo.de/myths-about-urandom |
|
40 | + * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers |
|
41 | + * |
|
42 | + * @param int $bytes |
|
43 | + * |
|
44 | + * @throws Exception |
|
45 | + * |
|
46 | + * @return string |
|
47 | + */ |
|
48 | + function random_bytes($bytes) |
|
49 | + { |
|
50 | + /** @var resource $fp */ |
|
51 | + static $fp = null; |
|
52 | 52 | |
53 | - /** |
|
54 | - * This block should only be run once |
|
55 | - */ |
|
56 | - if (empty($fp)) { |
|
57 | - /** |
|
58 | - * We don't want to ever read C:\dev\random, only /dev/urandom on |
|
59 | - * Unix-like operating systems. While we guard against this |
|
60 | - * condition in random.php, it doesn't hurt to be defensive in depth |
|
61 | - * here. |
|
62 | - * |
|
63 | - * To that end, we only try to open /dev/urandom if we're on a Unix- |
|
64 | - * like operating system (which means the directory separator is set |
|
65 | - * to "/" not "\". |
|
66 | - */ |
|
67 | - if (DIRECTORY_SEPARATOR === '/') { |
|
68 | - if (!is_readable('/dev/urandom')) { |
|
69 | - throw new Exception( |
|
70 | - 'Environment misconfiguration: ' . |
|
71 | - '/dev/urandom cannot be read.' |
|
72 | - ); |
|
73 | - } |
|
74 | - /** |
|
75 | - * We use /dev/urandom if it is a char device. |
|
76 | - * We never fall back to /dev/random |
|
77 | - */ |
|
78 | - /** @var resource|bool $fp */ |
|
79 | - $fp = fopen('/dev/urandom', 'rb'); |
|
80 | - if (is_resource($fp)) { |
|
81 | - /** @var array<string, int> $st */ |
|
82 | - $st = fstat($fp); |
|
83 | - if (($st['mode'] & 0170000) !== 020000) { |
|
84 | - fclose($fp); |
|
85 | - $fp = false; |
|
86 | - } |
|
87 | - } |
|
88 | - } |
|
53 | + /** |
|
54 | + * This block should only be run once |
|
55 | + */ |
|
56 | + if (empty($fp)) { |
|
57 | + /** |
|
58 | + * We don't want to ever read C:\dev\random, only /dev/urandom on |
|
59 | + * Unix-like operating systems. While we guard against this |
|
60 | + * condition in random.php, it doesn't hurt to be defensive in depth |
|
61 | + * here. |
|
62 | + * |
|
63 | + * To that end, we only try to open /dev/urandom if we're on a Unix- |
|
64 | + * like operating system (which means the directory separator is set |
|
65 | + * to "/" not "\". |
|
66 | + */ |
|
67 | + if (DIRECTORY_SEPARATOR === '/') { |
|
68 | + if (!is_readable('/dev/urandom')) { |
|
69 | + throw new Exception( |
|
70 | + 'Environment misconfiguration: ' . |
|
71 | + '/dev/urandom cannot be read.' |
|
72 | + ); |
|
73 | + } |
|
74 | + /** |
|
75 | + * We use /dev/urandom if it is a char device. |
|
76 | + * We never fall back to /dev/random |
|
77 | + */ |
|
78 | + /** @var resource|bool $fp */ |
|
79 | + $fp = fopen('/dev/urandom', 'rb'); |
|
80 | + if (is_resource($fp)) { |
|
81 | + /** @var array<string, int> $st */ |
|
82 | + $st = fstat($fp); |
|
83 | + if (($st['mode'] & 0170000) !== 020000) { |
|
84 | + fclose($fp); |
|
85 | + $fp = false; |
|
86 | + } |
|
87 | + } |
|
88 | + } |
|
89 | 89 | |
90 | - if (is_resource($fp)) { |
|
91 | - /** |
|
92 | - * stream_set_read_buffer() does not exist in HHVM |
|
93 | - * |
|
94 | - * If we don't set the stream's read buffer to 0, PHP will |
|
95 | - * internally buffer 8192 bytes, which can waste entropy |
|
96 | - * |
|
97 | - * stream_set_read_buffer returns 0 on success |
|
98 | - */ |
|
99 | - if (is_callable('stream_set_read_buffer')) { |
|
100 | - stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER); |
|
101 | - } |
|
102 | - if (is_callable('stream_set_chunk_size')) { |
|
103 | - stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER); |
|
104 | - } |
|
105 | - } |
|
106 | - } |
|
90 | + if (is_resource($fp)) { |
|
91 | + /** |
|
92 | + * stream_set_read_buffer() does not exist in HHVM |
|
93 | + * |
|
94 | + * If we don't set the stream's read buffer to 0, PHP will |
|
95 | + * internally buffer 8192 bytes, which can waste entropy |
|
96 | + * |
|
97 | + * stream_set_read_buffer returns 0 on success |
|
98 | + */ |
|
99 | + if (is_callable('stream_set_read_buffer')) { |
|
100 | + stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER); |
|
101 | + } |
|
102 | + if (is_callable('stream_set_chunk_size')) { |
|
103 | + stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER); |
|
104 | + } |
|
105 | + } |
|
106 | + } |
|
107 | 107 | |
108 | - try { |
|
109 | - /** @var int $bytes */ |
|
110 | - $bytes = RandomCompat_intval($bytes); |
|
111 | - } catch (TypeError $ex) { |
|
112 | - throw new TypeError( |
|
113 | - 'random_bytes(): $bytes must be an integer' |
|
114 | - ); |
|
115 | - } |
|
108 | + try { |
|
109 | + /** @var int $bytes */ |
|
110 | + $bytes = RandomCompat_intval($bytes); |
|
111 | + } catch (TypeError $ex) { |
|
112 | + throw new TypeError( |
|
113 | + 'random_bytes(): $bytes must be an integer' |
|
114 | + ); |
|
115 | + } |
|
116 | 116 | |
117 | - if ($bytes < 1) { |
|
118 | - throw new Error( |
|
119 | - 'Length must be greater than 0' |
|
120 | - ); |
|
121 | - } |
|
117 | + if ($bytes < 1) { |
|
118 | + throw new Error( |
|
119 | + 'Length must be greater than 0' |
|
120 | + ); |
|
121 | + } |
|
122 | 122 | |
123 | - /** |
|
124 | - * This if() block only runs if we managed to open a file handle |
|
125 | - * |
|
126 | - * It does not belong in an else {} block, because the above |
|
127 | - * if (empty($fp)) line is logic that should only be run once per |
|
128 | - * page load. |
|
129 | - */ |
|
130 | - if (is_resource($fp)) { |
|
131 | - /** |
|
132 | - * @var int |
|
133 | - */ |
|
134 | - $remaining = $bytes; |
|
123 | + /** |
|
124 | + * This if() block only runs if we managed to open a file handle |
|
125 | + * |
|
126 | + * It does not belong in an else {} block, because the above |
|
127 | + * if (empty($fp)) line is logic that should only be run once per |
|
128 | + * page load. |
|
129 | + */ |
|
130 | + if (is_resource($fp)) { |
|
131 | + /** |
|
132 | + * @var int |
|
133 | + */ |
|
134 | + $remaining = $bytes; |
|
135 | 135 | |
136 | - /** |
|
137 | - * @var string|bool |
|
138 | - */ |
|
139 | - $buf = ''; |
|
136 | + /** |
|
137 | + * @var string|bool |
|
138 | + */ |
|
139 | + $buf = ''; |
|
140 | 140 | |
141 | - /** |
|
142 | - * We use fread() in a loop to protect against partial reads |
|
143 | - */ |
|
144 | - do { |
|
145 | - /** |
|
146 | - * @var string|bool |
|
147 | - */ |
|
148 | - $read = fread($fp, $remaining); |
|
149 | - if (!is_string($read)) { |
|
150 | - /** |
|
151 | - * We cannot safely read from the file. Exit the |
|
152 | - * do-while loop and trigger the exception condition |
|
153 | - * |
|
154 | - * @var string|bool |
|
155 | - */ |
|
156 | - $buf = false; |
|
157 | - break; |
|
158 | - } |
|
159 | - /** |
|
160 | - * Decrease the number of bytes returned from remaining |
|
161 | - */ |
|
162 | - $remaining -= RandomCompat_strlen($read); |
|
163 | - /** |
|
164 | - * @var string $buf |
|
165 | - */ |
|
166 | - $buf .= $read; |
|
167 | - } while ($remaining > 0); |
|
141 | + /** |
|
142 | + * We use fread() in a loop to protect against partial reads |
|
143 | + */ |
|
144 | + do { |
|
145 | + /** |
|
146 | + * @var string|bool |
|
147 | + */ |
|
148 | + $read = fread($fp, $remaining); |
|
149 | + if (!is_string($read)) { |
|
150 | + /** |
|
151 | + * We cannot safely read from the file. Exit the |
|
152 | + * do-while loop and trigger the exception condition |
|
153 | + * |
|
154 | + * @var string|bool |
|
155 | + */ |
|
156 | + $buf = false; |
|
157 | + break; |
|
158 | + } |
|
159 | + /** |
|
160 | + * Decrease the number of bytes returned from remaining |
|
161 | + */ |
|
162 | + $remaining -= RandomCompat_strlen($read); |
|
163 | + /** |
|
164 | + * @var string $buf |
|
165 | + */ |
|
166 | + $buf .= $read; |
|
167 | + } while ($remaining > 0); |
|
168 | 168 | |
169 | - /** |
|
170 | - * Is our result valid? |
|
171 | - * @var string|bool $buf |
|
172 | - */ |
|
173 | - if (is_string($buf)) { |
|
174 | - if (RandomCompat_strlen($buf) === $bytes) { |
|
175 | - /** |
|
176 | - * Return our random entropy buffer here: |
|
177 | - */ |
|
178 | - return $buf; |
|
179 | - } |
|
180 | - } |
|
181 | - } |
|
169 | + /** |
|
170 | + * Is our result valid? |
|
171 | + * @var string|bool $buf |
|
172 | + */ |
|
173 | + if (is_string($buf)) { |
|
174 | + if (RandomCompat_strlen($buf) === $bytes) { |
|
175 | + /** |
|
176 | + * Return our random entropy buffer here: |
|
177 | + */ |
|
178 | + return $buf; |
|
179 | + } |
|
180 | + } |
|
181 | + } |
|
182 | 182 | |
183 | - /** |
|
184 | - * If we reach here, PHP has failed us. |
|
185 | - */ |
|
186 | - throw new Exception( |
|
187 | - 'Error reading from source device' |
|
188 | - ); |
|
189 | - } |
|
183 | + /** |
|
184 | + * If we reach here, PHP has failed us. |
|
185 | + */ |
|
186 | + throw new Exception( |
|
187 | + 'Error reading from source device' |
|
188 | + ); |
|
189 | + } |
|
190 | 190 | } |
@@ -26,11 +26,11 @@ discard block |
||
26 | 26 | * SOFTWARE. |
27 | 27 | */ |
28 | 28 | |
29 | -if (!defined('RANDOM_COMPAT_READ_BUFFER')) { |
|
30 | - define('RANDOM_COMPAT_READ_BUFFER', 8); |
|
29 | +if ( ! defined( 'RANDOM_COMPAT_READ_BUFFER' ) ) { |
|
30 | + define( 'RANDOM_COMPAT_READ_BUFFER', 8 ); |
|
31 | 31 | } |
32 | 32 | |
33 | -if (!is_callable('random_bytes')) { |
|
33 | +if ( ! is_callable( 'random_bytes' ) ) { |
|
34 | 34 | /** |
35 | 35 | * Unless open_basedir is enabled, use /dev/urandom for |
36 | 36 | * random numbers in accordance with best practices |
@@ -45,7 +45,7 @@ discard block |
||
45 | 45 | * |
46 | 46 | * @return string |
47 | 47 | */ |
48 | - function random_bytes($bytes) |
|
48 | + function random_bytes( $bytes ) |
|
49 | 49 | { |
50 | 50 | /** @var resource $fp */ |
51 | 51 | static $fp = null; |
@@ -53,7 +53,7 @@ discard block |
||
53 | 53 | /** |
54 | 54 | * This block should only be run once |
55 | 55 | */ |
56 | - if (empty($fp)) { |
|
56 | + if ( empty( $fp ) ) { |
|
57 | 57 | /** |
58 | 58 | * We don't want to ever read C:\dev\random, only /dev/urandom on |
59 | 59 | * Unix-like operating systems. While we guard against this |
@@ -64,8 +64,8 @@ discard block |
||
64 | 64 | * like operating system (which means the directory separator is set |
65 | 65 | * to "/" not "\". |
66 | 66 | */ |
67 | - if (DIRECTORY_SEPARATOR === '/') { |
|
68 | - if (!is_readable('/dev/urandom')) { |
|
67 | + if ( DIRECTORY_SEPARATOR === '/' ) { |
|
68 | + if ( ! is_readable( '/dev/urandom' ) ) { |
|
69 | 69 | throw new Exception( |
70 | 70 | 'Environment misconfiguration: ' . |
71 | 71 | '/dev/urandom cannot be read.' |
@@ -76,18 +76,18 @@ discard block |
||
76 | 76 | * We never fall back to /dev/random |
77 | 77 | */ |
78 | 78 | /** @var resource|bool $fp */ |
79 | - $fp = fopen('/dev/urandom', 'rb'); |
|
80 | - if (is_resource($fp)) { |
|
79 | + $fp = fopen( '/dev/urandom', 'rb' ); |
|
80 | + if ( is_resource( $fp ) ) { |
|
81 | 81 | /** @var array<string, int> $st */ |
82 | - $st = fstat($fp); |
|
83 | - if (($st['mode'] & 0170000) !== 020000) { |
|
84 | - fclose($fp); |
|
82 | + $st = fstat( $fp ); |
|
83 | + if ( ( $st[ 'mode' ] & 0170000 ) !== 020000 ) { |
|
84 | + fclose( $fp ); |
|
85 | 85 | $fp = false; |
86 | 86 | } |
87 | 87 | } |
88 | 88 | } |
89 | 89 | |
90 | - if (is_resource($fp)) { |
|
90 | + if ( is_resource( $fp ) ) { |
|
91 | 91 | /** |
92 | 92 | * stream_set_read_buffer() does not exist in HHVM |
93 | 93 | * |
@@ -96,25 +96,25 @@ discard block |
||
96 | 96 | * |
97 | 97 | * stream_set_read_buffer returns 0 on success |
98 | 98 | */ |
99 | - if (is_callable('stream_set_read_buffer')) { |
|
100 | - stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER); |
|
99 | + if ( is_callable( 'stream_set_read_buffer' ) ) { |
|
100 | + stream_set_read_buffer( $fp, RANDOM_COMPAT_READ_BUFFER ); |
|
101 | 101 | } |
102 | - if (is_callable('stream_set_chunk_size')) { |
|
103 | - stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER); |
|
102 | + if ( is_callable( 'stream_set_chunk_size' ) ) { |
|
103 | + stream_set_chunk_size( $fp, RANDOM_COMPAT_READ_BUFFER ); |
|
104 | 104 | } |
105 | 105 | } |
106 | 106 | } |
107 | 107 | |
108 | 108 | try { |
109 | 109 | /** @var int $bytes */ |
110 | - $bytes = RandomCompat_intval($bytes); |
|
111 | - } catch (TypeError $ex) { |
|
110 | + $bytes = RandomCompat_intval( $bytes ); |
|
111 | + } catch ( TypeError $ex ) { |
|
112 | 112 | throw new TypeError( |
113 | 113 | 'random_bytes(): $bytes must be an integer' |
114 | 114 | ); |
115 | 115 | } |
116 | 116 | |
117 | - if ($bytes < 1) { |
|
117 | + if ( $bytes < 1 ) { |
|
118 | 118 | throw new Error( |
119 | 119 | 'Length must be greater than 0' |
120 | 120 | ); |
@@ -127,7 +127,7 @@ discard block |
||
127 | 127 | * if (empty($fp)) line is logic that should only be run once per |
128 | 128 | * page load. |
129 | 129 | */ |
130 | - if (is_resource($fp)) { |
|
130 | + if ( is_resource( $fp ) ) { |
|
131 | 131 | /** |
132 | 132 | * @var int |
133 | 133 | */ |
@@ -145,8 +145,8 @@ discard block |
||
145 | 145 | /** |
146 | 146 | * @var string|bool |
147 | 147 | */ |
148 | - $read = fread($fp, $remaining); |
|
149 | - if (!is_string($read)) { |
|
148 | + $read = fread( $fp, $remaining ); |
|
149 | + if ( ! is_string( $read ) ) { |
|
150 | 150 | /** |
151 | 151 | * We cannot safely read from the file. Exit the |
152 | 152 | * do-while loop and trigger the exception condition |
@@ -159,19 +159,19 @@ discard block |
||
159 | 159 | /** |
160 | 160 | * Decrease the number of bytes returned from remaining |
161 | 161 | */ |
162 | - $remaining -= RandomCompat_strlen($read); |
|
162 | + $remaining -= RandomCompat_strlen( $read ); |
|
163 | 163 | /** |
164 | 164 | * @var string $buf |
165 | 165 | */ |
166 | 166 | $buf .= $read; |
167 | - } while ($remaining > 0); |
|
167 | + } while ( $remaining > 0 ); |
|
168 | 168 | |
169 | 169 | /** |
170 | 170 | * Is our result valid? |
171 | 171 | * @var string|bool $buf |
172 | 172 | */ |
173 | - if (is_string($buf)) { |
|
174 | - if (RandomCompat_strlen($buf) === $bytes) { |
|
173 | + if ( is_string( $buf ) ) { |
|
174 | + if ( RandomCompat_strlen( $buf ) === $bytes ) { |
|
175 | 175 | /** |
176 | 176 | * Return our random entropy buffer here: |
177 | 177 | */ |
@@ -45,8 +45,7 @@ |
||
45 | 45 | * |
46 | 46 | * @return string |
47 | 47 | */ |
48 | - function random_bytes($bytes) |
|
49 | - { |
|
48 | + function random_bytes($bytes) { |
|
50 | 49 | /** @var resource $fp */ |
51 | 50 | static $fp = null; |
52 | 51 |
@@ -1,204 +1,204 @@ |
||
1 | 1 | <?php |
2 | 2 | |
3 | 3 | if (!is_callable('random_int')) { |
4 | - /** |
|
5 | - * Random_* Compatibility Library |
|
6 | - * for using the new PHP 7 random_* API in PHP 5 projects |
|
7 | - * |
|
8 | - * The MIT License (MIT) |
|
9 | - * |
|
10 | - * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises |
|
11 | - * |
|
12 | - * Permission is hereby granted, free of charge, to any person obtaining a copy |
|
13 | - * of this software and associated documentation files (the "Software"), to deal |
|
14 | - * in the Software without restriction, including without limitation the rights |
|
15 | - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
16 | - * copies of the Software, and to permit persons to whom the Software is |
|
17 | - * furnished to do so, subject to the following conditions: |
|
18 | - * |
|
19 | - * The above copyright notice and this permission notice shall be included in |
|
20 | - * all copies or substantial portions of the Software. |
|
21 | - * |
|
22 | - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
23 | - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
24 | - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
25 | - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
26 | - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
27 | - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
28 | - * SOFTWARE. |
|
29 | - */ |
|
30 | - |
|
31 | - /** |
|
32 | - * Fetch a random integer between $min and $max inclusive |
|
33 | - * |
|
34 | - * @param int $min |
|
35 | - * @param int $max |
|
36 | - * |
|
37 | - * @throws Exception |
|
38 | - * |
|
39 | - * @return int |
|
40 | - */ |
|
41 | - function random_int($min, $max) |
|
42 | - { |
|
43 | - /** |
|
44 | - * Type and input logic checks |
|
45 | - * |
|
46 | - * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX) |
|
47 | - * (non-inclusive), it will sanely cast it to an int. If you it's equal to |
|
48 | - * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats |
|
49 | - * lose precision, so the <= and => operators might accidentally let a float |
|
50 | - * through. |
|
51 | - */ |
|
52 | - |
|
53 | - try { |
|
54 | - /** @var int $min */ |
|
55 | - $min = RandomCompat_intval($min); |
|
56 | - } catch (TypeError $ex) { |
|
57 | - throw new TypeError( |
|
58 | - 'random_int(): $min must be an integer' |
|
59 | - ); |
|
60 | - } |
|
61 | - |
|
62 | - try { |
|
63 | - /** @var int $max */ |
|
64 | - $max = RandomCompat_intval($max); |
|
65 | - } catch (TypeError $ex) { |
|
66 | - throw new TypeError( |
|
67 | - 'random_int(): $max must be an integer' |
|
68 | - ); |
|
69 | - } |
|
70 | - |
|
71 | - /** |
|
72 | - * Now that we've verified our weak typing system has given us an integer, |
|
73 | - * let's validate the logic then we can move forward with generating random |
|
74 | - * integers along a given range. |
|
75 | - */ |
|
76 | - if ($min > $max) { |
|
77 | - throw new Error( |
|
78 | - 'Minimum value must be less than or equal to the maximum value' |
|
79 | - ); |
|
80 | - } |
|
81 | - |
|
82 | - if ($max === $min) { |
|
83 | - return (int) $min; |
|
84 | - } |
|
85 | - |
|
86 | - /** |
|
87 | - * Initialize variables to 0 |
|
88 | - * |
|
89 | - * We want to store: |
|
90 | - * $bytes => the number of random bytes we need |
|
91 | - * $mask => an integer bitmask (for use with the &) operator |
|
92 | - * so we can minimize the number of discards |
|
93 | - */ |
|
94 | - $attempts = $bits = $bytes = $mask = $valueShift = 0; |
|
95 | - /** @var int $attempts */ |
|
96 | - /** @var int $bits */ |
|
97 | - /** @var int $bytes */ |
|
98 | - /** @var int $mask */ |
|
99 | - /** @var int $valueShift */ |
|
100 | - |
|
101 | - /** |
|
102 | - * At this point, $range is a positive number greater than 0. It might |
|
103 | - * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to |
|
104 | - * a float and we will lose some precision. |
|
105 | - * |
|
106 | - * @var int|float $range |
|
107 | - */ |
|
108 | - $range = $max - $min; |
|
109 | - |
|
110 | - /** |
|
111 | - * Test for integer overflow: |
|
112 | - */ |
|
113 | - if (!is_int($range)) { |
|
114 | - |
|
115 | - /** |
|
116 | - * Still safely calculate wider ranges. |
|
117 | - * Provided by @CodesInChaos, @oittaa |
|
118 | - * |
|
119 | - * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 |
|
120 | - * |
|
121 | - * We use ~0 as a mask in this case because it generates all 1s |
|
122 | - * |
|
123 | - * @ref https://eval.in/400356 (32-bit) |
|
124 | - * @ref http://3v4l.org/XX9r5 (64-bit) |
|
125 | - */ |
|
126 | - $bytes = PHP_INT_SIZE; |
|
127 | - /** @var int $mask */ |
|
128 | - $mask = ~0; |
|
129 | - |
|
130 | - } else { |
|
131 | - |
|
132 | - /** |
|
133 | - * $bits is effectively ceil(log($range, 2)) without dealing with |
|
134 | - * type juggling |
|
135 | - */ |
|
136 | - while ($range > 0) { |
|
137 | - if ($bits % 8 === 0) { |
|
138 | - ++$bytes; |
|
139 | - } |
|
140 | - ++$bits; |
|
141 | - $range >>= 1; |
|
142 | - /** @var int $mask */ |
|
143 | - $mask = $mask << 1 | 1; |
|
144 | - } |
|
145 | - $valueShift = $min; |
|
146 | - } |
|
147 | - |
|
148 | - /** @var int $val */ |
|
149 | - $val = 0; |
|
150 | - /** |
|
151 | - * Now that we have our parameters set up, let's begin generating |
|
152 | - * random integers until one falls between $min and $max |
|
153 | - */ |
|
154 | - /** @psalm-suppress RedundantCondition */ |
|
155 | - do { |
|
156 | - /** |
|
157 | - * The rejection probability is at most 0.5, so this corresponds |
|
158 | - * to a failure probability of 2^-128 for a working RNG |
|
159 | - */ |
|
160 | - if ($attempts > 128) { |
|
161 | - throw new Exception( |
|
162 | - 'random_int: RNG is broken - too many rejections' |
|
163 | - ); |
|
164 | - } |
|
165 | - |
|
166 | - /** |
|
167 | - * Let's grab the necessary number of random bytes |
|
168 | - */ |
|
169 | - $randomByteString = random_bytes($bytes); |
|
170 | - |
|
171 | - /** |
|
172 | - * Let's turn $randomByteString into an integer |
|
173 | - * |
|
174 | - * This uses bitwise operators (<< and |) to build an integer |
|
175 | - * out of the values extracted from ord() |
|
176 | - * |
|
177 | - * Example: [9F] | [6D] | [32] | [0C] => |
|
178 | - * 159 + 27904 + 3276800 + 201326592 => |
|
179 | - * 204631455 |
|
180 | - */ |
|
181 | - $val &= 0; |
|
182 | - for ($i = 0; $i < $bytes; ++$i) { |
|
183 | - $val |= ord($randomByteString[$i]) << ($i * 8); |
|
184 | - } |
|
185 | - /** @var int $val */ |
|
186 | - |
|
187 | - /** |
|
188 | - * Apply mask |
|
189 | - */ |
|
190 | - $val &= $mask; |
|
191 | - $val += $valueShift; |
|
192 | - |
|
193 | - ++$attempts; |
|
194 | - /** |
|
195 | - * If $val overflows to a floating point number, |
|
196 | - * ... or is larger than $max, |
|
197 | - * ... or smaller than $min, |
|
198 | - * then try again. |
|
199 | - */ |
|
200 | - } while (!is_int($val) || $val > $max || $val < $min); |
|
201 | - |
|
202 | - return (int) $val; |
|
203 | - } |
|
4 | + /** |
|
5 | + * Random_* Compatibility Library |
|
6 | + * for using the new PHP 7 random_* API in PHP 5 projects |
|
7 | + * |
|
8 | + * The MIT License (MIT) |
|
9 | + * |
|
10 | + * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises |
|
11 | + * |
|
12 | + * Permission is hereby granted, free of charge, to any person obtaining a copy |
|
13 | + * of this software and associated documentation files (the "Software"), to deal |
|
14 | + * in the Software without restriction, including without limitation the rights |
|
15 | + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
16 | + * copies of the Software, and to permit persons to whom the Software is |
|
17 | + * furnished to do so, subject to the following conditions: |
|
18 | + * |
|
19 | + * The above copyright notice and this permission notice shall be included in |
|
20 | + * all copies or substantial portions of the Software. |
|
21 | + * |
|
22 | + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
23 | + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
24 | + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
25 | + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
26 | + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
27 | + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
28 | + * SOFTWARE. |
|
29 | + */ |
|
30 | + |
|
31 | + /** |
|
32 | + * Fetch a random integer between $min and $max inclusive |
|
33 | + * |
|
34 | + * @param int $min |
|
35 | + * @param int $max |
|
36 | + * |
|
37 | + * @throws Exception |
|
38 | + * |
|
39 | + * @return int |
|
40 | + */ |
|
41 | + function random_int($min, $max) |
|
42 | + { |
|
43 | + /** |
|
44 | + * Type and input logic checks |
|
45 | + * |
|
46 | + * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX) |
|
47 | + * (non-inclusive), it will sanely cast it to an int. If you it's equal to |
|
48 | + * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats |
|
49 | + * lose precision, so the <= and => operators might accidentally let a float |
|
50 | + * through. |
|
51 | + */ |
|
52 | + |
|
53 | + try { |
|
54 | + /** @var int $min */ |
|
55 | + $min = RandomCompat_intval($min); |
|
56 | + } catch (TypeError $ex) { |
|
57 | + throw new TypeError( |
|
58 | + 'random_int(): $min must be an integer' |
|
59 | + ); |
|
60 | + } |
|
61 | + |
|
62 | + try { |
|
63 | + /** @var int $max */ |
|
64 | + $max = RandomCompat_intval($max); |
|
65 | + } catch (TypeError $ex) { |
|
66 | + throw new TypeError( |
|
67 | + 'random_int(): $max must be an integer' |
|
68 | + ); |
|
69 | + } |
|
70 | + |
|
71 | + /** |
|
72 | + * Now that we've verified our weak typing system has given us an integer, |
|
73 | + * let's validate the logic then we can move forward with generating random |
|
74 | + * integers along a given range. |
|
75 | + */ |
|
76 | + if ($min > $max) { |
|
77 | + throw new Error( |
|
78 | + 'Minimum value must be less than or equal to the maximum value' |
|
79 | + ); |
|
80 | + } |
|
81 | + |
|
82 | + if ($max === $min) { |
|
83 | + return (int) $min; |
|
84 | + } |
|
85 | + |
|
86 | + /** |
|
87 | + * Initialize variables to 0 |
|
88 | + * |
|
89 | + * We want to store: |
|
90 | + * $bytes => the number of random bytes we need |
|
91 | + * $mask => an integer bitmask (for use with the &) operator |
|
92 | + * so we can minimize the number of discards |
|
93 | + */ |
|
94 | + $attempts = $bits = $bytes = $mask = $valueShift = 0; |
|
95 | + /** @var int $attempts */ |
|
96 | + /** @var int $bits */ |
|
97 | + /** @var int $bytes */ |
|
98 | + /** @var int $mask */ |
|
99 | + /** @var int $valueShift */ |
|
100 | + |
|
101 | + /** |
|
102 | + * At this point, $range is a positive number greater than 0. It might |
|
103 | + * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to |
|
104 | + * a float and we will lose some precision. |
|
105 | + * |
|
106 | + * @var int|float $range |
|
107 | + */ |
|
108 | + $range = $max - $min; |
|
109 | + |
|
110 | + /** |
|
111 | + * Test for integer overflow: |
|
112 | + */ |
|
113 | + if (!is_int($range)) { |
|
114 | + |
|
115 | + /** |
|
116 | + * Still safely calculate wider ranges. |
|
117 | + * Provided by @CodesInChaos, @oittaa |
|
118 | + * |
|
119 | + * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 |
|
120 | + * |
|
121 | + * We use ~0 as a mask in this case because it generates all 1s |
|
122 | + * |
|
123 | + * @ref https://eval.in/400356 (32-bit) |
|
124 | + * @ref http://3v4l.org/XX9r5 (64-bit) |
|
125 | + */ |
|
126 | + $bytes = PHP_INT_SIZE; |
|
127 | + /** @var int $mask */ |
|
128 | + $mask = ~0; |
|
129 | + |
|
130 | + } else { |
|
131 | + |
|
132 | + /** |
|
133 | + * $bits is effectively ceil(log($range, 2)) without dealing with |
|
134 | + * type juggling |
|
135 | + */ |
|
136 | + while ($range > 0) { |
|
137 | + if ($bits % 8 === 0) { |
|
138 | + ++$bytes; |
|
139 | + } |
|
140 | + ++$bits; |
|
141 | + $range >>= 1; |
|
142 | + /** @var int $mask */ |
|
143 | + $mask = $mask << 1 | 1; |
|
144 | + } |
|
145 | + $valueShift = $min; |
|
146 | + } |
|
147 | + |
|
148 | + /** @var int $val */ |
|
149 | + $val = 0; |
|
150 | + /** |
|
151 | + * Now that we have our parameters set up, let's begin generating |
|
152 | + * random integers until one falls between $min and $max |
|
153 | + */ |
|
154 | + /** @psalm-suppress RedundantCondition */ |
|
155 | + do { |
|
156 | + /** |
|
157 | + * The rejection probability is at most 0.5, so this corresponds |
|
158 | + * to a failure probability of 2^-128 for a working RNG |
|
159 | + */ |
|
160 | + if ($attempts > 128) { |
|
161 | + throw new Exception( |
|
162 | + 'random_int: RNG is broken - too many rejections' |
|
163 | + ); |
|
164 | + } |
|
165 | + |
|
166 | + /** |
|
167 | + * Let's grab the necessary number of random bytes |
|
168 | + */ |
|
169 | + $randomByteString = random_bytes($bytes); |
|
170 | + |
|
171 | + /** |
|
172 | + * Let's turn $randomByteString into an integer |
|
173 | + * |
|
174 | + * This uses bitwise operators (<< and |) to build an integer |
|
175 | + * out of the values extracted from ord() |
|
176 | + * |
|
177 | + * Example: [9F] | [6D] | [32] | [0C] => |
|
178 | + * 159 + 27904 + 3276800 + 201326592 => |
|
179 | + * 204631455 |
|
180 | + */ |
|
181 | + $val &= 0; |
|
182 | + for ($i = 0; $i < $bytes; ++$i) { |
|
183 | + $val |= ord($randomByteString[$i]) << ($i * 8); |
|
184 | + } |
|
185 | + /** @var int $val */ |
|
186 | + |
|
187 | + /** |
|
188 | + * Apply mask |
|
189 | + */ |
|
190 | + $val &= $mask; |
|
191 | + $val += $valueShift; |
|
192 | + |
|
193 | + ++$attempts; |
|
194 | + /** |
|
195 | + * If $val overflows to a floating point number, |
|
196 | + * ... or is larger than $max, |
|
197 | + * ... or smaller than $min, |
|
198 | + * then try again. |
|
199 | + */ |
|
200 | + } while (!is_int($val) || $val > $max || $val < $min); |
|
201 | + |
|
202 | + return (int) $val; |
|
203 | + } |
|
204 | 204 | } |
@@ -1,6 +1,6 @@ discard block |
||
1 | 1 | <?php |
2 | 2 | |
3 | -if (!is_callable('random_int')) { |
|
3 | +if ( ! is_callable( 'random_int' ) ) { |
|
4 | 4 | /** |
5 | 5 | * Random_* Compatibility Library |
6 | 6 | * for using the new PHP 7 random_* API in PHP 5 projects |
@@ -38,7 +38,7 @@ discard block |
||
38 | 38 | * |
39 | 39 | * @return int |
40 | 40 | */ |
41 | - function random_int($min, $max) |
|
41 | + function random_int( $min, $max ) |
|
42 | 42 | { |
43 | 43 | /** |
44 | 44 | * Type and input logic checks |
@@ -52,8 +52,8 @@ discard block |
||
52 | 52 | |
53 | 53 | try { |
54 | 54 | /** @var int $min */ |
55 | - $min = RandomCompat_intval($min); |
|
56 | - } catch (TypeError $ex) { |
|
55 | + $min = RandomCompat_intval( $min ); |
|
56 | + } catch ( TypeError $ex ) { |
|
57 | 57 | throw new TypeError( |
58 | 58 | 'random_int(): $min must be an integer' |
59 | 59 | ); |
@@ -61,8 +61,8 @@ discard block |
||
61 | 61 | |
62 | 62 | try { |
63 | 63 | /** @var int $max */ |
64 | - $max = RandomCompat_intval($max); |
|
65 | - } catch (TypeError $ex) { |
|
64 | + $max = RandomCompat_intval( $max ); |
|
65 | + } catch ( TypeError $ex ) { |
|
66 | 66 | throw new TypeError( |
67 | 67 | 'random_int(): $max must be an integer' |
68 | 68 | ); |
@@ -73,14 +73,14 @@ discard block |
||
73 | 73 | * let's validate the logic then we can move forward with generating random |
74 | 74 | * integers along a given range. |
75 | 75 | */ |
76 | - if ($min > $max) { |
|
76 | + if ( $min > $max ) { |
|
77 | 77 | throw new Error( |
78 | 78 | 'Minimum value must be less than or equal to the maximum value' |
79 | 79 | ); |
80 | 80 | } |
81 | 81 | |
82 | - if ($max === $min) { |
|
83 | - return (int) $min; |
|
82 | + if ( $max === $min ) { |
|
83 | + return (int)$min; |
|
84 | 84 | } |
85 | 85 | |
86 | 86 | /** |
@@ -110,7 +110,7 @@ discard block |
||
110 | 110 | /** |
111 | 111 | * Test for integer overflow: |
112 | 112 | */ |
113 | - if (!is_int($range)) { |
|
113 | + if ( ! is_int( $range ) ) { |
|
114 | 114 | |
115 | 115 | /** |
116 | 116 | * Still safely calculate wider ranges. |
@@ -133,8 +133,8 @@ discard block |
||
133 | 133 | * $bits is effectively ceil(log($range, 2)) without dealing with |
134 | 134 | * type juggling |
135 | 135 | */ |
136 | - while ($range > 0) { |
|
137 | - if ($bits % 8 === 0) { |
|
136 | + while ( $range > 0 ) { |
|
137 | + if ( $bits % 8 === 0 ) { |
|
138 | 138 | ++$bytes; |
139 | 139 | } |
140 | 140 | ++$bits; |
@@ -157,7 +157,7 @@ discard block |
||
157 | 157 | * The rejection probability is at most 0.5, so this corresponds |
158 | 158 | * to a failure probability of 2^-128 for a working RNG |
159 | 159 | */ |
160 | - if ($attempts > 128) { |
|
160 | + if ( $attempts > 128 ) { |
|
161 | 161 | throw new Exception( |
162 | 162 | 'random_int: RNG is broken - too many rejections' |
163 | 163 | ); |
@@ -166,7 +166,7 @@ discard block |
||
166 | 166 | /** |
167 | 167 | * Let's grab the necessary number of random bytes |
168 | 168 | */ |
169 | - $randomByteString = random_bytes($bytes); |
|
169 | + $randomByteString = random_bytes( $bytes ); |
|
170 | 170 | |
171 | 171 | /** |
172 | 172 | * Let's turn $randomByteString into an integer |
@@ -179,8 +179,8 @@ discard block |
||
179 | 179 | * 204631455 |
180 | 180 | */ |
181 | 181 | $val &= 0; |
182 | - for ($i = 0; $i < $bytes; ++$i) { |
|
183 | - $val |= ord($randomByteString[$i]) << ($i * 8); |
|
182 | + for ( $i = 0; $i < $bytes; ++$i ) { |
|
183 | + $val |= ord( $randomByteString[ $i ] ) << ( $i * 8 ); |
|
184 | 184 | } |
185 | 185 | /** @var int $val */ |
186 | 186 | |
@@ -197,8 +197,8 @@ discard block |
||
197 | 197 | * ... or smaller than $min, |
198 | 198 | * then try again. |
199 | 199 | */ |
200 | - } while (!is_int($val) || $val > $max || $val < $min); |
|
200 | + } while ( ! is_int( $val ) || $val > $max || $val < $min ); |
|
201 | 201 | |
202 | - return (int) $val; |
|
202 | + return (int)$val; |
|
203 | 203 | } |
204 | 204 | } |
@@ -38,8 +38,7 @@ |
||
38 | 38 | * |
39 | 39 | * @return int |
40 | 40 | */ |
41 | - function random_int($min, $max) |
|
42 | - { |
|
41 | + function random_int($min, $max) { |
|
43 | 42 | /** |
44 | 43 | * Type and input logic checks |
45 | 44 | * |