From 95fa12dc84e05d714a33a6e8fbe192b35ed04dab Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:36:56 +1200 Subject: [PATCH 01/19] Refactored the base app and added autoloading for the mangers --- src/Skeletor/App/App.php | 66 +++++++++++-------- .../App/Config/SkeletorConfigurator.php | 8 +++ src/Skeletor/App/Config/skeletor.yml | 5 ++ 3 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/Skeletor/App/App.php b/src/Skeletor/App/App.php index 75002bf..69e815e 100644 --- a/src/Skeletor/App/App.php +++ b/src/Skeletor/App/App.php @@ -1,4 +1,5 @@ container - ->add('ComposerManager', ComposerManager::class) - ->withArgument('Cli') - ->withArgument('skeletorFilesystem') - ->withArgument($this->options); - - $this->container - ->add('PackageManager', PackageManager::class) - ->withArgument('Cli') - ->withArgument('skeletorFilesystem') - ->withArgument($this->options); + foreach($this->configurator->getManagers() as $key => $manager) + { + $managerClass = $this->getClassByReference('Skeletor\\Manager\\', $manager); - $this->container - ->add('FrameworkManager', FrameworkManager::class) - ->withArgument('Cli') - ->withArgument('skeletorFilesystem') - ->withArgument($this->options); + $this->container + ->add($manager, $managerClass) + ->withArgument('Cli') + ->withArgument('skeletorFilesystem') + ->withArgument('projectFilesystem') + ->withArgument($this->options); + } } public function registerFrameworks() { foreach($this->configurator->getFrameworks() as $key => $framework) { - $frameworkClass = sprintf('Skeletor\Frameworks\%s', $framework); - - if(!class_exists($frameworkClass)) { - throw new FailedToLoadService("Couldn't find class ". $frameworkClass); - } + $frameworkClass = $this->getClassByReference('Skeletor\\Frameworks\\', $framework); $this->container ->add($framework, $frameworkClass) @@ -129,11 +117,7 @@ public function registerPackages() $packages = array_merge($this->configurator->getPackages(), $this->configurator->getDefaultPackages()); foreach($packages as $key => $package) { - $packageClass = sprintf('Skeletor\Packages\%s', $package); - - if(!class_exists($packageClass)) { - throw new FailedToLoadService("Couldn't find class ". $packageClass); - } + $packageClass = $this->getClassByReference('Skeletor\\Packages\\', $package); $this->container ->add($package, $packageClass) @@ -144,6 +128,22 @@ public function registerPackages() } } + /** + * @param string $namespace + * @param string $name + * @return string + */ + public function getClassByReference(string $namespace, string $name) + { + $packageClass = $namespace.$name; + + if(!class_exists($packageClass)) { + throw new FailedToLoadService("Couldn't find class ". $packageClass); + } + + return $packageClass; + } + /** * @return array */ @@ -190,6 +190,14 @@ public function getPackageManager() return $this->container->get('PackageManager'); } + /** + * @return object + */ + public function getProviderManager() + { + return $this->container->get('ProviderManager'); + } + /** * @return object */ diff --git a/src/Skeletor/App/Config/SkeletorConfigurator.php b/src/Skeletor/App/Config/SkeletorConfigurator.php index d7a2a67..a4d3f8d 100644 --- a/src/Skeletor/App/Config/SkeletorConfigurator.php +++ b/src/Skeletor/App/Config/SkeletorConfigurator.php @@ -17,6 +17,14 @@ public function __construct() $this->options = Yaml::parse(file_get_contents($this->optionFile)); } + /** + * @return array + */ + public function getManagers() + { + return $this->options['managers']; + } + /** * @return array */ diff --git a/src/Skeletor/App/Config/skeletor.yml b/src/Skeletor/App/Config/skeletor.yml index 0ec18f4..98cd958 100644 --- a/src/Skeletor/App/Config/skeletor.yml +++ b/src/Skeletor/App/Config/skeletor.yml @@ -9,3 +9,8 @@ packages: - KielabokkieJsonapiBehatExtensionPackage defaultPackages: - PixelfusionGitHooksPackage +managers: + - ComposerManager + - FrameworkManager + - PackageManager + - ProviderManager \ No newline at end of file From 0594f2860c7a8a82266f5429eac8c16de502f72e Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:37:35 +1200 Subject: [PATCH 02/19] Throw exception when a path isnt found --- src/Skeletor/Frameworks/Framework.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Skeletor/Frameworks/Framework.php b/src/Skeletor/Frameworks/Framework.php index 487b5fe..567a88e 100644 --- a/src/Skeletor/Frameworks/Framework.php +++ b/src/Skeletor/Frameworks/Framework.php @@ -3,6 +3,7 @@ use League\Flysystem\Filesystem; use League\Flysystem\MountManager; +use Skeletor\Exceptions\FailedFilesystem; use Skeletor\Manager\ComposerManager; abstract class Framework implements FrameworkInterface @@ -86,11 +87,11 @@ public function setVersion(string $version) */ public function getPath(string $path) { - if(array_key_exists($path, $this->paths)){ - return $this->paths[$path]; + if(array_key_exists($path, $this->paths) === false){ + throw new FailedFilesystem("Couldn't find {$path}"); } - return ''; + return $this->paths[$path]; } /** From 8f90edce65787b022b1af1c1ebb14d45a23a67b1 Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:38:05 +1200 Subject: [PATCH 03/19] Added the projectfilesystem to the main Manager --- src/Skeletor/Manager/Manager.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Skeletor/Manager/Manager.php b/src/Skeletor/Manager/Manager.php index accc441..bcf15d0 100644 --- a/src/Skeletor/Manager/Manager.php +++ b/src/Skeletor/Manager/Manager.php @@ -7,18 +7,22 @@ abstract class Manager { protected $skeletorFilesystem; + protected $projectFilesystem; protected $options; protected $cli; /** * Manager constructor. * @param CLImate $cli + * @param Filesystem $projectFilesystem + * @param Filesystem $skeletorFilesystem * @param array $options */ - public function __construct(CLImate $cli, Filesystem $skeletorFilesystem, array $options) + public function __construct(CLImate $cli, Filesystem $skeletorFilesystem, Filesystem $projectFilesystem, array $options) { $this->cli = $cli; $this->options = $options; + $this->projectFilesystem = $projectFilesystem; $this->skeletorFilesystem = $skeletorFilesystem; } } \ No newline at end of file From 7c4e1cc890d343321faa3f4b1d3a7573771ffa77 Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:38:32 +1200 Subject: [PATCH 04/19] Added the app config path --- src/Skeletor/Frameworks/Laravel54Framework.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Skeletor/Frameworks/Laravel54Framework.php b/src/Skeletor/Frameworks/Laravel54Framework.php index 96c2a53..fc8d12b 100644 --- a/src/Skeletor/Frameworks/Laravel54Framework.php +++ b/src/Skeletor/Frameworks/Laravel54Framework.php @@ -10,6 +10,7 @@ public function setup() $this->setVersion("5.4"); $this->setPaths([ 'tests' => 'tests', + 'appConfig' => 'config/app.php' ]); } From f72e0081fdd6b9348e5eacbdec1f806ce1889b9a Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:39:27 +1200 Subject: [PATCH 05/19] Added getter and setters for Facade and Providers --- src/Skeletor/Packages/Package.php | 35 ++++++++++++++++++++++ src/Skeletor/Packages/PackageInterface.php | 4 +++ 2 files changed, 39 insertions(+) diff --git a/src/Skeletor/Packages/Package.php b/src/Skeletor/Packages/Package.php index ac1b5e9..d3af964 100644 --- a/src/Skeletor/Packages/Package.php +++ b/src/Skeletor/Packages/Package.php @@ -12,8 +12,10 @@ abstract class Package implements PackageInterface protected $packageOptions = ""; protected $mountManager; protected $installSlug; + protected $provider; protected $version = ""; protected $options; + protected $facade; protected $name; /** @@ -65,6 +67,7 @@ public function setName(string $name) } /** + * @param bool $allowEmpty * @return string */ public function getVersion(bool $allowEmpty = true) @@ -100,6 +103,38 @@ public function setPackageOptions(string $packageOptions) $this->packageOptions = $packageOptions; } + /** + * @return mixed + */ + public function getProvider() + { + return $this->provider; + } + + /** + * @param string $provider + */ + public function setProvider(string $provider) + { + $this->provider = $provider; + } + + /** + * @return mixed + */ + public function getFacade() + { + return $this->facade; + } + + /** + * @param string $facade + */ + public function setFacade(string $facade) + { + $this->facade = $facade; + } + public function install() { $command = $this->composerManager->preparePackageCommand($this->getInstallSlug(), $this->getVersion(), $this->getPackageOptions()); diff --git a/src/Skeletor/Packages/PackageInterface.php b/src/Skeletor/Packages/PackageInterface.php index 61fc873..27a5f1b 100644 --- a/src/Skeletor/Packages/PackageInterface.php +++ b/src/Skeletor/Packages/PackageInterface.php @@ -12,5 +12,9 @@ public function getVersion(bool $allowEmpty = true); public function setVersion(string $version); public function getPackageOptions(); public function setPackageOptions(string $packageOptions); + public function getProvider(); + public function setProvider(string $provider); + public function getFacade(); + public function setFacade(string $facade); public function install(); } From 51d95736acb1032a646fe0539a483caccbc054e0 Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:42:18 +1200 Subject: [PATCH 06/19] Added the provider manager, what will take care of the providers and facade config --- src/Skeletor/Manager/ProviderManager.php | 80 ++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/Skeletor/Manager/ProviderManager.php diff --git a/src/Skeletor/Manager/ProviderManager.php b/src/Skeletor/Manager/ProviderManager.php new file mode 100644 index 0000000..1c2f304 --- /dev/null +++ b/src/Skeletor/Manager/ProviderManager.php @@ -0,0 +1,80 @@ +getName() !== 'Laravel') { + $this->cli->red("Configure {$package->getInstallSlug()} manual for {$activeFramework->getName()}, we currently only support Laravel"); + return; + } + $configFile = $activeFramework->getPath('appConfig'); + $newContent = $this->getNewConfig($configFile, $package); + $this->projectFilesystem->update($configFile, $newContent); + } + + /** + * @param string $configFile + * @param Package $package + * @return array|bool + */ + public function getNewConfig(string $configFile, Package $package) + { + $state = null; + $appConfig = file($configFile); + + foreach($appConfig as $key => $line) { + $cleanLine = trim(preg_replace('/[\t\s]+/', '', $line)); + + switch ($cleanLine) { + case "'providers'=>[": + $state = self::PROVIDER_METHOD; + break; + case "'aliases'=>[": + $state = self::FACADE_METHOD; + break; + } + + if ($cleanLine === "]," && $state !== null) { + $previousLine = --$key; + $appConfig[$previousLine] .= $this->$state($package); + $state = null; + } + } + + return $appConfig; + } + + /** + * @param Package $package + * @return string + */ + public function getFacadeClass(Package $package) + { + [$alias, $facade] = explode('@', $package->getFacade()); + + return sprintf("\t\t'%s' => %s::class, ", $alias, $facade) . PHP_EOL; + } + + /** + * @param Package $package + * @return string + */ + public function getProviderClass(Package $package) + { + + return sprintf("\t\t%s::class,", $package->getProvider()) . PHP_EOL; + } +} \ No newline at end of file From 7d7928c7c98492906ec8ef043f14b005f83557a3 Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:43:08 +1200 Subject: [PATCH 07/19] Added configure providermanager to create project command and cleaned the main app --- src/Skeletor/Console/CreateProjectCommand.php | 1 + src/Skeletor/Console/SkeletorCommand.php | 21 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/Skeletor/Console/CreateProjectCommand.php b/src/Skeletor/Console/CreateProjectCommand.php index 93ac32f..f99b5a9 100644 --- a/src/Skeletor/Console/CreateProjectCommand.php +++ b/src/Skeletor/Console/CreateProjectCommand.php @@ -122,6 +122,7 @@ private function buildProject(Framework $activeFramework, array $activePackages) if ($package instanceof ConfigurablePackageInterface) { $this->packageManager->configure($package, $activeFramework); + $this->providerManager->configure($package, $activeFramework); } } } diff --git a/src/Skeletor/Console/SkeletorCommand.php b/src/Skeletor/Console/SkeletorCommand.php index ff0007d..edd126b 100644 --- a/src/Skeletor/Console/SkeletorCommand.php +++ b/src/Skeletor/Console/SkeletorCommand.php @@ -9,23 +9,26 @@ abstract class SkeletorCommand extends Command protected $packagistApi; protected $configurator; protected $packageManager; + protected $providerManager; protected $frameworkManager; protected $skeletorFilesystem; protected function setupCommand($dryRun = false) { + $app = $this->getApplication(); $this->getApplication()->registerServices($dryRun); - $this->cli = $this->getApplication()->getCli(); - $this->packagistApi = $this->getApplication()->getPackagistApi(); - $this->configurator = $this->getApplication()->getConfigurator(); - $this->skeletorFilesystem = $this->getApplication()->getSkeletorFilesystem(); + $this->cli = $app->getCli(); + $this->packagistApi = $app->getPackagistApi(); + $this->configurator = $app->getConfigurator(); + $this->skeletorFilesystem = $app->getSkeletorFilesystem(); - $this->frameworkManager = $this->getApplication()->getFrameworkManager(); - $this->packageManager = $this->getApplication()->getPackageManager(); + $this->frameworkManager = $app->getFrameworkManager(); + $this->packageManager = $app->getPackageManager(); + $this->providerManager = $app->getProviderManager(); - $this->frameworkManager->setFrameworks($this->getApplication()->getFrameworks()); - $this->packageManager->setPackages($this->getApplication()->getPackages()); - $this->packageManager->setDefaultPackages($this->getApplication()->getDefaultPackages()); + $this->frameworkManager->setFrameworks($app->getFrameworks()); + $this->packageManager->setPackages($app->getPackages()); + $this->packageManager->setDefaultPackages($app->getDefaultPackages()); } } \ No newline at end of file From 9aa68087194b07e15d27d5dca587c6245136a35b Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:51:06 +1200 Subject: [PATCH 08/19] Updated the AppTest so it will use the new di of the managers --- tests/unit/Skeletor/App/AppTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/Skeletor/App/AppTest.php b/tests/unit/Skeletor/App/AppTest.php index bd16b57..0dcbdbc 100644 --- a/tests/unit/Skeletor/App/AppTest.php +++ b/tests/unit/Skeletor/App/AppTest.php @@ -26,7 +26,8 @@ protected function _before() 'getVersion' => '0.0.1', 'getFrameworks' => ['Laravel54Framework'], 'getPackages' => ['BehatBehatPackage'], - 'getDefaultPackages' => ['PixelfusionGitHooksPackage'] + 'getDefaultPackages' => ['PixelfusionGitHooksPackage'], + 'getManagers' => ['ComposerManager', 'FrameworkManager', 'PackageManager'] ] ); $this->app = new App($config, $container, $config->getName(), $config->getVersion()); From 45a793f742a2372f115e0bfbbcf1fd94e795d074 Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 09:53:59 +1200 Subject: [PATCH 09/19] Added the projectfilesystem dependency to the tests --- tests/unit/Skeletor/App/Manager/ComposerManagerTest.php | 7 ++++++- tests/unit/Skeletor/App/Manager/FrameworkManagerTest.php | 7 ++++++- tests/unit/Skeletor/App/Manager/PackageManagerTest.php | 7 ++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/tests/unit/Skeletor/App/Manager/ComposerManagerTest.php b/tests/unit/Skeletor/App/Manager/ComposerManagerTest.php index 82fffa6..41afafd 100644 --- a/tests/unit/Skeletor/App/Manager/ComposerManagerTest.php +++ b/tests/unit/Skeletor/App/Manager/ComposerManagerTest.php @@ -27,9 +27,14 @@ protected function _before() [ ] ); + $projectFilesystem = Stub::make( + Filesystem::class, + [ + ] + ); $options = []; - $this->composerManager = new ComposerManager($cli, $skeletorFilesystem, $options); + $this->composerManager = new ComposerManager($cli, $skeletorFilesystem, $projectFilesystem, $options); } protected function _after() diff --git a/tests/unit/Skeletor/App/Manager/FrameworkManagerTest.php b/tests/unit/Skeletor/App/Manager/FrameworkManagerTest.php index c94248e..968f0a0 100644 --- a/tests/unit/Skeletor/App/Manager/FrameworkManagerTest.php +++ b/tests/unit/Skeletor/App/Manager/FrameworkManagerTest.php @@ -29,6 +29,11 @@ protected function _before() [ ] ); + $projectFilesystem = Stub::make( + Filesystem::class, + [ + ] + ); $framework = Stub::make( Laravel54Framework::class, [ @@ -38,7 +43,7 @@ protected function _before() ); $options = []; - $this->frameworkManager = new FrameworkManager($cli, $skeletorFilesystem, $options); + $this->frameworkManager = new FrameworkManager($cli, $skeletorFilesystem, $projectFilesystem, $options); //Load one framework $this->frameworkManager->setFrameworks([$framework]); diff --git a/tests/unit/Skeletor/App/Manager/PackageManagerTest.php b/tests/unit/Skeletor/App/Manager/PackageManagerTest.php index 065fa7b..85a6045 100644 --- a/tests/unit/Skeletor/App/Manager/PackageManagerTest.php +++ b/tests/unit/Skeletor/App/Manager/PackageManagerTest.php @@ -30,6 +30,11 @@ protected function _before() 'read' => '{"Behat Behat":["v3.3.0","v3.2.3","v3.2.2","v3.2.1","v3.2.0rc2","v3.2.0rc1","v3.2.0","v3.1.0rc2","v3.1.0rc1","v3.1.0"]}', ] ); + $projectFilesystem = Stub::make( + Filesystem::class, + [ + ] + ); $defaultPackage = Stub::make( PixelfusionGitHooksPackage::class, [ @@ -39,7 +44,7 @@ protected function _before() ); $options = []; - $this->packageManager = new PackageManager($cli, $skeletorFilesystem, $options); + $this->packageManager = new PackageManager($cli, $skeletorFilesystem, $projectFilesystem, $options); //Load one framework $this->packageManager->setDefaultPackages([$defaultPackage]); From f5279e999fd2f7b3ba5497e45482e995ba24f54f Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 11:31:01 +1200 Subject: [PATCH 10/19] Added a provider manager test and fixe the provider manager const --- src/Skeletor/Manager/ProviderManager.php | 4 +- .../App/Manager/ProviderManagerTest.php | 84 +++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 tests/unit/Skeletor/App/Manager/ProviderManagerTest.php diff --git a/src/Skeletor/Manager/ProviderManager.php b/src/Skeletor/Manager/ProviderManager.php index 1c2f304..660de29 100644 --- a/src/Skeletor/Manager/ProviderManager.php +++ b/src/Skeletor/Manager/ProviderManager.php @@ -7,7 +7,7 @@ class ProviderManager extends Manager { - const PROVIDER_METHOD = 'getWriteableProvider'; + const PROVIDER_METHOD = 'getProviderClass'; const FACADE_METHOD = 'getFacadeClass'; /** @@ -65,7 +65,7 @@ public function getFacadeClass(Package $package) { [$alias, $facade] = explode('@', $package->getFacade()); - return sprintf("\t\t'%s' => %s::class, ", $alias, $facade) . PHP_EOL; + return sprintf("\t\t'%s' => %s::class,", $alias, $facade) . PHP_EOL; } /** diff --git a/tests/unit/Skeletor/App/Manager/ProviderManagerTest.php b/tests/unit/Skeletor/App/Manager/ProviderManagerTest.php new file mode 100644 index 0000000..9d7d722 --- /dev/null +++ b/tests/unit/Skeletor/App/Manager/ProviderManagerTest.php @@ -0,0 +1,84 @@ + '' + ] + ); + $skeletorFilesystem = Stub::make( + Filesystem::class, + [ + ] + ); + $projectFilesystem = Stub::make( + Filesystem::class, + [ + ] + ); + + $this->framework = Stub::make( + Laravel54Framework::class, + [ + 'getName' => 'Laravel', + 'getVersion' => '5.4', + 'getPath' => 'app/config.php' + ] + ); + + $this->package = Stub::make( + PixelfusionGitHooksPackage::class, + [ + 'getInstallSlug' => 'pixelfusion/git-hooks', + 'getName' => 'PixelFusion Git Hooks', + 'getFacade' => 'Pixelfusion@Pixelfusion\Support\Facades\Config', + 'getProvider' => 'Pixelfusion\PathExample\SampleServiceProvider' + ] + ); + + $options = []; + $this->providerManager = new ProviderManager($cli, $skeletorFilesystem, $projectFilesystem, $options); + } + + protected function _after() + { + } + + // tests + public function testGetFacadeClass() + { + $assert = "\t\t'Pixelfusion' => Pixelfusion\Support\Facades\Config::class," . PHP_EOL; + $facadeClass = $this->providerManager->getFacadeClass($this->package); + + $this->assertStringMatchesFormat($assert, $facadeClass); + } + + public function testGetProviderClass() + { + $assert = "\t\tPixelfusion\PathExample\SampleServiceProvider::class," . PHP_EOL; + $facadeClass = $this->providerManager->getProviderClass($this->package); + + $this->assertStringMatchesFormat($assert, $facadeClass); + } +} \ No newline at end of file From 38f3b024dc3bfe61d6abf744dd94ee07e04a23b7 Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 11:55:27 +1200 Subject: [PATCH 11/19] Installed the laravel debug bar --- src/Skeletor/App/Config/skeletor.yml | 5 +++-- .../BarryvdhLaravelDebugbarPackage.php | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 src/Skeletor/Packages/BarryvdhLaravelDebugbarPackage.php diff --git a/src/Skeletor/App/Config/skeletor.yml b/src/Skeletor/App/Config/skeletor.yml index 98cd958..911fa13 100644 --- a/src/Skeletor/App/Config/skeletor.yml +++ b/src/Skeletor/App/Config/skeletor.yml @@ -1,5 +1,5 @@ config: - name: Skeletor CLI + name: 'Skeletor CLI' version: 1.0.0 frameworks: - Laravel54Framework @@ -7,10 +7,11 @@ frameworks: packages: - BehatBehatPackage - KielabokkieJsonapiBehatExtensionPackage + - BarryvdhLaravelDebugbarPackage defaultPackages: - PixelfusionGitHooksPackage managers: - ComposerManager - FrameworkManager - PackageManager - - ProviderManager \ No newline at end of file + - ProviderManager diff --git a/src/Skeletor/Packages/BarryvdhLaravelDebugbarPackage.php b/src/Skeletor/Packages/BarryvdhLaravelDebugbarPackage.php new file mode 100644 index 0000000..45e77ac --- /dev/null +++ b/src/Skeletor/Packages/BarryvdhLaravelDebugbarPackage.php @@ -0,0 +1,18 @@ +setInstallSlug("barryvdh/laravel-debugbar"); + $this->setName("Barryvdh Laravel Debugbar"); + } + + public function configure(Framework $activeFramework) + { + + } +} \ No newline at end of file From 61af81804f92fabe0abc98d2ed3199e2c02b82da Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 13:26:12 +1200 Subject: [PATCH 12/19] Updated the readme --- docs/README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index d1a21a9..ed58d23 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,13 +7,19 @@ Adding new: framework, package or default package, is really easy. All of those Add the name of the new Framework to the `skeletor.yml` For example we add `Test54Framework`, now make a blueprint for the framework `src/Skeletor/Frameworks/Test54Framework.php`. This blueprint will define, more detail about the framework and give you the freedom to configure it. -Take a look at the `Framework.php` here are all available methods, also take a look at the [Flysystem docs](https://flysystem.thephpleague.com/api/). +Take a look at the `FrameworkInterface.php` here are all available methods, also take a look at the [Flysystem docs](https://flysystem.thephpleague.com/api/). ### Packages +##### With Skeletor +You can also add a package with `skeletor package:add package/name`, it will search on Packagist and give you some options. +##### Doing it maunaly Add the name of the new package to the `skeletor.yml` For example we add `TestPackage`, now make a blueprint for the package `src/Skeletor/Packages/TestPackage.php`. This blueprint will define, more detail about the package and give you the freedom to configure it. -Take a look at the `Package.php` here are all available methods, also take a look at the [Flysystem docs](https://flysystem.thephpleague.com/api/). +Take a look at the `PackageInterface.php` here are all available methods, also take a look at the [Flysystem docs](https://flysystem.thephpleague.com/api/). + +Once you installed the basic package, you can configure it further. +Take a look at `BarryvdhLaravelDebugbarPackage.php` for an good example. ### Default packages Same process as the packages, only add this package name under defaultPackages in the `skeletor.yml`. From 5719dbbd293256b8834f54fb777a612f6c00cfeb Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 13:27:04 +1200 Subject: [PATCH 13/19] Install the latest version of Laravel 5.4 --- src/Skeletor/Frameworks/Laravel54Framework.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Skeletor/Frameworks/Laravel54Framework.php b/src/Skeletor/Frameworks/Laravel54Framework.php index fc8d12b..7164852 100644 --- a/src/Skeletor/Frameworks/Laravel54Framework.php +++ b/src/Skeletor/Frameworks/Laravel54Framework.php @@ -7,7 +7,7 @@ public function setup() { $this->setInstallSlug('laravel/laravel'); $this->setName("Laravel"); - $this->setVersion("5.4"); + $this->setVersion("5.4.*"); $this->setPaths([ 'tests' => 'tests', 'appConfig' => 'config/app.php' From 431e90e135d47180af4d0a61312b70c3b1822dc3 Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 24 May 2017 13:27:28 +1200 Subject: [PATCH 14/19] Configured the provider manager a bit more --- src/Skeletor/Console/CreateProjectCommand.php | 1 + src/Skeletor/Manager/ProviderManager.php | 11 ++++++++++- .../Packages/BarryvdhLaravelDebugbarPackage.php | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Skeletor/Console/CreateProjectCommand.php b/src/Skeletor/Console/CreateProjectCommand.php index f99b5a9..4854557 100644 --- a/src/Skeletor/Console/CreateProjectCommand.php +++ b/src/Skeletor/Console/CreateProjectCommand.php @@ -4,6 +4,7 @@ use Skeletor\Exceptions\FailedFilesystem; use Skeletor\Frameworks\Framework; use Skeletor\Packages\ConfigurablePackageInterface; +use Skeletor\Packages\ProviderInterface; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; diff --git a/src/Skeletor/Manager/ProviderManager.php b/src/Skeletor/Manager/ProviderManager.php index 660de29..359a22a 100644 --- a/src/Skeletor/Manager/ProviderManager.php +++ b/src/Skeletor/Manager/ProviderManager.php @@ -63,6 +63,11 @@ public function getNewConfig(string $configFile, Package $package) */ public function getFacadeClass(Package $package) { + $facade = $package->getFacade(); + if (isset($facade) === false) { + return; + } + [$alias, $facade] = explode('@', $package->getFacade()); return sprintf("\t\t'%s' => %s::class,", $alias, $facade) . PHP_EOL; @@ -74,7 +79,11 @@ public function getFacadeClass(Package $package) */ public function getProviderClass(Package $package) { + $provider = $package->getProvider(); + if (isset($provider) === false) { + return; + } - return sprintf("\t\t%s::class,", $package->getProvider()) . PHP_EOL; + return sprintf("\t\t%s::class,", $provider) . PHP_EOL; } } \ No newline at end of file diff --git a/src/Skeletor/Packages/BarryvdhLaravelDebugbarPackage.php b/src/Skeletor/Packages/BarryvdhLaravelDebugbarPackage.php index 45e77ac..9fc32fa 100644 --- a/src/Skeletor/Packages/BarryvdhLaravelDebugbarPackage.php +++ b/src/Skeletor/Packages/BarryvdhLaravelDebugbarPackage.php @@ -9,6 +9,8 @@ public function setup() { $this->setInstallSlug("barryvdh/laravel-debugbar"); $this->setName("Barryvdh Laravel Debugbar"); + $this->setProvider('Barryvdh\Debugbar\ServiceProvider'); + $this->setFacade('Debugbar@Barryvdh\Debugbar\Facade'); } public function configure(Framework $activeFramework) From 3e4399960c3968fba1eb013f31e98358cb91080e Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Mon, 29 May 2017 13:35:35 +1200 Subject: [PATCH 15/19] Updated the provider manager, so its compatible with php 7 --- src/Skeletor/Manager/ProviderManager.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Skeletor/Manager/ProviderManager.php b/src/Skeletor/Manager/ProviderManager.php index 359a22a..a35487e 100644 --- a/src/Skeletor/Manager/ProviderManager.php +++ b/src/Skeletor/Manager/ProviderManager.php @@ -68,9 +68,9 @@ public function getFacadeClass(Package $package) return; } - [$alias, $facade] = explode('@', $package->getFacade()); + $provider = explode('@', $package->getFacade()); - return sprintf("\t\t'%s' => %s::class,", $alias, $facade) . PHP_EOL; + return sprintf("\t\t'%s' => %s::class,", $provider[0], $provider[1]) . PHP_EOL; } /** From 48f6f7654a8afeb33e04455dbf83e7ecfa263d0c Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 31 May 2017 09:41:19 +1200 Subject: [PATCH 16/19] Implemented the configurable method, to check if a framework can be configured --- src/Skeletor/Frameworks/FrameworkInterface.php | 1 + src/Skeletor/Frameworks/Laravel54Framework.php | 5 +++++ src/Skeletor/Frameworks/LaravelLumen54Framework.php | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/src/Skeletor/Frameworks/FrameworkInterface.php b/src/Skeletor/Frameworks/FrameworkInterface.php index d3473df..bd43acb 100644 --- a/src/Skeletor/Frameworks/FrameworkInterface.php +++ b/src/Skeletor/Frameworks/FrameworkInterface.php @@ -14,4 +14,5 @@ public function getPath(string $path); public function setPaths(array $paths); public function install(); public function configure(); + public function configurable(); } \ No newline at end of file diff --git a/src/Skeletor/Frameworks/Laravel54Framework.php b/src/Skeletor/Frameworks/Laravel54Framework.php index 7164852..230cb2c 100644 --- a/src/Skeletor/Frameworks/Laravel54Framework.php +++ b/src/Skeletor/Frameworks/Laravel54Framework.php @@ -24,4 +24,9 @@ public function configure() // 'project://app/namespace/pixelfusion/bootstrap/FeatureContext.php' // ); } + + public function configurable() + { + return true; + } } diff --git a/src/Skeletor/Frameworks/LaravelLumen54Framework.php b/src/Skeletor/Frameworks/LaravelLumen54Framework.php index 287c1c6..521f0b4 100644 --- a/src/Skeletor/Frameworks/LaravelLumen54Framework.php +++ b/src/Skeletor/Frameworks/LaravelLumen54Framework.php @@ -15,4 +15,9 @@ public function configure() $this->projectFilesystem->put('PixelFusion.txt', '©PIXELFUSION'); $this->projectFilesystem->createDir('setup/git-hooks'); } + + public function configurable() + { + return false; + } } \ No newline at end of file From b6c56bda5bc1df32123442d2e86d7f39bc0b5a56 Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 31 May 2017 09:41:37 +1200 Subject: [PATCH 17/19] Updated some code for the pr --- src/Skeletor/Manager/ProviderManager.php | 25 +++++++++++------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/Skeletor/Manager/ProviderManager.php b/src/Skeletor/Manager/ProviderManager.php index a35487e..2a3e0ee 100644 --- a/src/Skeletor/Manager/ProviderManager.php +++ b/src/Skeletor/Manager/ProviderManager.php @@ -16,26 +16,24 @@ class ProviderManager extends Manager */ public function configure(Package $package, Framework $activeFramework) { - if ($activeFramework->getName() !== 'Laravel') { - $this->cli->red("Configure {$package->getInstallSlug()} manual for {$activeFramework->getName()}, we currently only support Laravel"); + if ($activeFramework->configurable() === false) { + $this->cli->red("Configure {$package->getInstallSlug()} manual for {$activeFramework->getName()}"); return; } $configFile = $activeFramework->getPath('appConfig'); - $newContent = $this->getNewConfig($configFile, $package); + $newContent = $this->getNewConfig(file($configFile), $package); $this->projectFilesystem->update($configFile, $newContent); } /** - * @param string $configFile + * @param array $configFile * @param Package $package * @return array|bool */ - public function getNewConfig(string $configFile, Package $package) + public function getNewConfig(array $configFile, Package $package) { - $state = null; - $appConfig = file($configFile); - - foreach($appConfig as $key => $line) { + foreach($configFile as $key => $line) { + $state = null; $cleanLine = trim(preg_replace('/[\t\s]+/', '', $line)); switch ($cleanLine) { @@ -49,17 +47,16 @@ public function getNewConfig(string $configFile, Package $package) if ($cleanLine === "]," && $state !== null) { $previousLine = --$key; - $appConfig[$previousLine] .= $this->$state($package); - $state = null; + $configFile[$previousLine] .= $this->$state($package); } } - return $appConfig; + return $configFile; } /** * @param Package $package - * @return string + * @return string|void */ public function getFacadeClass(Package $package) { @@ -75,7 +72,7 @@ public function getFacadeClass(Package $package) /** * @param Package $package - * @return string + * @return string|void */ public function getProviderClass(Package $package) { From dfc63b724b9cf8f1f9f1f82ebaf79d26dd4ea7ab Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 31 May 2017 09:46:11 +1200 Subject: [PATCH 18/19] Updated a unnecessary method call --- src/Skeletor/Manager/ProviderManager.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Skeletor/Manager/ProviderManager.php b/src/Skeletor/Manager/ProviderManager.php index 2a3e0ee..d8905f7 100644 --- a/src/Skeletor/Manager/ProviderManager.php +++ b/src/Skeletor/Manager/ProviderManager.php @@ -65,7 +65,7 @@ public function getFacadeClass(Package $package) return; } - $provider = explode('@', $package->getFacade()); + $provider = explode('@', $facade); return sprintf("\t\t'%s' => %s::class,", $provider[0], $provider[1]) . PHP_EOL; } From ff12a0570f4699c859853ecba176d4362ea8b7cf Mon Sep 17 00:00:00 2001 From: Thijs Bouwes Date: Wed, 31 May 2017 15:09:51 +1200 Subject: [PATCH 19/19] Updated the framework getPath check --- src/Skeletor/Frameworks/Framework.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Skeletor/Frameworks/Framework.php b/src/Skeletor/Frameworks/Framework.php index 567a88e..f6e4b46 100644 --- a/src/Skeletor/Frameworks/Framework.php +++ b/src/Skeletor/Frameworks/Framework.php @@ -87,7 +87,7 @@ public function setVersion(string $version) */ public function getPath(string $path) { - if(array_key_exists($path, $this->paths) === false){ + if (!array_key_exists($path, $this->paths)) { throw new FailedFilesystem("Couldn't find {$path}"); }