Unverified Commit 91a20564 authored by Nicolas Widart's avatar Nicolas Widart

Merge branch '2.0'

* 2.0:
  Preparing 2.4.0 release
  Publish the new workshop configuration key
  CS: PSR1/2
  Adding changelog item
  Trigger an event before a user is created, allowing customising its data via listeners
  Adding workshop changelog
  Testing the feature of overwriting stub views.
  Testing the feature of overwriting stub views. Using realpath instead of base_path, leaving more options open
  Create a stub route files to overwrite default routes stub
  Add custom stubs folder (#344)
parents 987981c9 23e2e981
......@@ -5,8 +5,8 @@ namespace Modules\Core\Console;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
use Modules\User\Permissions\PermissionsRemover;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
class DeleteModuleCommand extends Command
{
......@@ -50,6 +50,7 @@ class DeleteModuleCommand extends Command
}
if ($this->confirm("Are you sure you wish to delete the [$module] module{$extra}?") === false) {
$this->info('Nothing was deleted');
return;
}
......@@ -57,11 +58,13 @@ class DeleteModuleCommand extends Command
if ($this->finder->exists($modulePath) === false) {
$this->error('This module does not exist');
return;
}
if (is_core_module($module) === true) {
$this->error('You cannot remove a core module.');
return;
}
......
......@@ -4,8 +4,8 @@ namespace Modules\Core\Console;
use Illuminate\Console\Command;
use Modules\Core\Downloader\Downloader;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Process\Process;
class DownloadModuleCommand extends Command
......@@ -39,6 +39,7 @@ class DownloadModuleCommand extends Command
$downloader->download($this->argument('name'));
} catch (\Exception $e) {
$this->output->writeln("<error>{$e->getMessage()}</error>");
return;
}
......@@ -46,7 +47,7 @@ class DownloadModuleCommand extends Command
$composer = $this->findComposer();
$commands = [
$composer.' dump-autoload',
$composer . ' dump-autoload',
];
if ($this->option('migrations') === true || $this->option('demo') === true) {
$commands[] = "php artisan module:migrate $name";
......@@ -100,6 +101,7 @@ class DownloadModuleCommand extends Command
if (str_contains($package, '/') === false) {
throw new \Exception('You need to use vendor/name structure');
}
return studly_case(substr(strrchr($package, '/'), 1));
}
......@@ -110,9 +112,10 @@ class DownloadModuleCommand extends Command
*/
protected function findComposer()
{
if (file_exists(getcwd().'/composer.phar')) {
return '"'.PHP_BINARY.'" composer.phar';
if (file_exists(getcwd() . '/composer.phar')) {
return '"' . PHP_BINARY . '" composer.phar';
}
return 'composer';
}
}
......@@ -5,7 +5,7 @@ namespace Modules\Core\Console\Installers\Scripts;
use Illuminate\Console\Command;
use Modules\Core\Console\Installers\SetupScript;
class ThemeAssets implements SetupScript
class ThemeAssets implements SetupScript
{
/**
* Fire the install script
......
......@@ -53,6 +53,7 @@ class Downloader
if ($this->finder->isDirectory($directory) === true) {
$this->output->writeln("<error>The folder [Modules/{$this->extractPackageNameFrom($package)}] already exists.</error>");
return;
}
......@@ -99,7 +100,7 @@ class Downloader
$progress->setFormat('[%bar%] %elapsed:6s%');
$response = (new Client)->get($latestVersionUrl, [
'progress' => function($downloadTotal, $downloadedBytes, $uploadTotal, $uploadedBytes) use ($progress) {
'progress' => function ($downloadTotal, $downloadedBytes, $uploadTotal, $uploadedBytes) use ($progress) {
$progress->advance();
},
]);
......@@ -159,6 +160,7 @@ class Downloader
if (str_contains($package, '/') === false) {
throw new \Exception('You need to use vendor/name structure');
}
return studly_case(substr(strrchr($package, '/'), 1));
}
......
......@@ -31,7 +31,7 @@ class MediaMultipleDirective
view()->composer($view, PartialAssetComposer::class);
$zone = $this->zone;
$name = $this->name ?: ucwords(str_replace('_', ' ', $this->zone));
if ($this->entity !== null) {
......
......@@ -31,7 +31,7 @@ class MediaSingleDirective
view()->composer($view, PartialAssetComposer::class);
$zone = $this->zone;
$name = $this->name ?: ucwords(str_replace('_', ' ', $this->zone));
if ($this->entity !== null) {
......
url: https://github.com/AsgardCms/Platform
versions:
"2.4.0@unreleased":
"2.4.0":
added:
- new blade directive for thumbnails <code>@thumbnail('path', 'thumbnailName')</code>
changed:
......
......@@ -25,7 +25,7 @@ class UpdateIconColumnOnMenuitemsTable extends Migration
public function down()
{
Schema::table('menu__menuitems', function (Blueprint $table) {
$table->string('icon')->default('')->nullable(false)->change();
$table->string('icon')->default('')->nullable(false)->change();
});
}
}
......@@ -2,11 +2,9 @@
namespace Modules\Page\Sidebar;
use Maatwebsite\Sidebar\Badge;
use Maatwebsite\Sidebar\Group;
use Maatwebsite\Sidebar\Item;
use Maatwebsite\Sidebar\Menu;
use Modules\Page\Repositories\PageRepository;
use Modules\User\Contracts\Authentication;
class SidebarExtender implements \Maatwebsite\Sidebar\SidebarExtender
......
......@@ -137,8 +137,8 @@ trait TaggableTrait
$tag = $this->createTagsModel()->where('namespace', $this->getEntityClassName())
->with('translations')
->whereHas('translations', function (Builder $q) use ($name) {
$q->where('slug', $this->generateTagSlug($name));
})->first();
$q->where('slug', $this->generateTagSlug($name));
})->first();
if ($tag === null) {
$tag = new Tag([
......
......@@ -2,7 +2,6 @@
namespace Modules\Translation\Http\Controllers\Api;
use Cartalyst\Sentinel\Laravel\Facades\Sentinel;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
......
<?php
namespace Modules\User\Events;
final class UserIsCreating
{
/**
* @var array
*/
private $attributes;
public $original;
public function __construct(array $attributes)
{
$this->attributes = $attributes;
$this->original = $attributes;
}
/**
* @return array
*/
public function getAttributes()
{
return $this->attributes;
}
/**
* @param array $attributes
*/
public function setAttributes(array $attributes)
{
$this->attributes = array_merge($this->attributes, $attributes);
}
}
......@@ -7,6 +7,7 @@ use Cartalyst\Sentinel\Laravel\Facades\Sentinel;
use Illuminate\Support\Facades\Hash;
use Modules\User\Entities\Sentinel\User;
use Modules\User\Events\UserHasRegistered;
use Modules\User\Events\UserIsCreating;
use Modules\User\Events\UserIsUpdating;
use Modules\User\Events\UserWasCreated;
use Modules\User\Events\UserWasUpdated;
......@@ -48,7 +49,9 @@ class SentinelUserRepository implements UserRepository
public function create(array $data, $activated = false)
{
$this->hashPassword($data);
$user = $this->user->create((array) $data);
event($event = new UserIsCreating($data));
$user = $this->user->create($event->getAttributes());
if ($activated) {
$this->activateUser($user);
......
......@@ -28,7 +28,7 @@ class PermissionsRemoverTest extends BaseUserTestCase
$this->user->create([
'email' => 'n.widart@gmail.com',
'password' => 'demo1234',
'permissions' => ['dashboard.index' => true, 'user.users.index' => true, 'user.users.create' => true,]
'permissions' => ['dashboard.index' => true, 'user.users.index' => true, 'user.users.create' => true,],
]);
$this->app->config->set('asgard.user.permissions', [
'user.users' => [
......
......@@ -5,6 +5,7 @@ namespace Modules\User\Tests;
use Illuminate\Support\Facades\Event;
use Modules\User\Entities\Sentinel\User;
use Modules\User\Events\UserHasRegistered;
use Modules\User\Events\UserIsCreating;
use Modules\User\Events\UserIsUpdating;
use Modules\User\Events\UserWasCreated;
use Modules\User\Events\UserWasUpdated;
......@@ -44,6 +45,69 @@ class SentinelUserRepositoryTest extends BaseUserTestCase
$this->assertCount(1, $this->user->all());
}
/** @test */
public function it_fires_event_when_user_is_creating()
{
Event::fake();
$user = $this->user->create([
'email' => 'n.widart@gmail.com',
'password' => 'demo1234',
]);
Event::assertDispatched(UserIsCreating::class, function ($e) use ($user) {
return $e->getAttributes()['email'] === $user->email;
});
}
/** @test */
public function it_can_change_data_when_it_is_creating_event()
{
Event::listen(UserIsCreating::class, function (UserIsCreating $event) {
$event->setAttributes(['email' => 'john@doe.com']);
});
$user = $this->user->create([
'email' => 'n.widart@gmail.com',
'password' => 'demo1234',
]);
$this->assertEquals('john@doe.com', $user->email);
}
/** @test */
public function it_can_change_the_data_multiple_times()
{
Event::listen(UserIsCreating::class, function (UserIsCreating $event) {
$event->setAttributes(['email' => 'john@doe.com']);
});
Event::listen(UserIsCreating::class, function (UserIsCreating $event) {
$event->setAttributes(['email' => 'jane@doe.com']);
});
$user = $this->user->create([
'email' => 'n.widart@gmail.com',
'password' => 'demo1234',
]);
$this->assertEquals('jane@doe.com', $user->email);
}
/** @test */
public function it_makes_sure_the_event_contains_original_attributes()
{
Event::fake();
$this->user->create([
'email' => 'n.widart@gmail.com',
'password' => 'demo1234',
]);
Event::assertDispatched(UserIsCreating::class, function ($e) {
return $e->original['email'] === 'n.widart@gmail.com';
});
}
/** @test */
public function it_fires_event_when_user_created()
{
......@@ -92,7 +156,6 @@ class SentinelUserRepositoryTest extends BaseUserTestCase
'password' => 'demo1234',
], ['User']);
$hasher = app('sentinel.hasher');
$this->assertTrue($hasher->check('demo1234', $userOne->password));
......
url: https://github.com/AsgardCms/Platform
versions:
"2.4.0@unreleased":
"2.4.0":
added:
- Trigger an event (<code>UserIsCreating</code>) before a user is created, allowing customising its data via listeners
changed:
- Testing password hashing
- Moved the <code>CanFindUserWithBearerToken</code> to the <code>Trait</code> namespace
......
<?php
return [
/*
|--------------------------------------------------------------------------
| Custom Stubs Folder
|--------------------------------------------------------------------------
| You can specify place from which you would like to use stubs.
| e.g. "Modules/<module-name>/Resources/views/stubs"
| Only the customized stubs need to be in this folder.
| All other stubs will be loaded from Workshop Module folder.
| No custom stubs folder: null
*/
'custom-stubs-folder' => null,
/*
|--------------------------------------------------------------------------
| Custom Sidebar Class
......
......@@ -83,6 +83,15 @@ abstract class Generator
*/
protected function getStubPath($filename)
{
$folder = $this->config->get('asgard.workshop.config.custom-stubs-folder');
if ($folder !== null) {
$file = realpath($folder . '/' . $filename);
if ($file !== false) {
return $file;
}
}
return __DIR__ . "/../stubs/$filename";
}
......
......@@ -488,6 +488,21 @@ class ModuleScaffoldTest extends BaseTestCase
$this->cleanUp();
}
/** @test */
public function it_can_overwrite_stub_files_with_custom_ones()
{
config()->set('asgard.workshop.config.custom-stubs-folder', __DIR__ . '/stubs');
$this->scaffoldModuleWithEloquent();
$path = $this->testModulePath . '/Http/backendRoutes.php';
$file = $this->finder->get($path);
$this->assertTrue($this->finder->isFile($path));
$this->assertContains('overwritten by custom config', $file);
$this->cleanUp();
}
/**
* Get the contents of composer.json file
* @return string
......
<?php
use Illuminate\Routing\Router;
/** @var Router $router */
// overwritten by custom config
$router->group(['prefix' =>'/$LOWERCASE_MODULE$'], function (Router $router) {
// append
});
url: https://github.com/AsgardCms/Platform
versions:
"2.4.0":
added:
- Add the ability to set custom stubs folder used by generated modules
"2.0.0":
added:
- Laravel 5.4 compatibility
......
url: https://github.com/AsgardCms/Platform
versions:
"2.4.0@unreleased":
"2.4.0":
changed:
- Moved to using laravel.mix
- Dependencies are now handled by NPM instead of Bower
......
url: https://github.com/AsgardCms/Platform
versions:
"2.4.0@unreleased":
"2.4.0":
added:
- Moved to using laravel.mix
"2.0.0":
......
......@@ -8,7 +8,7 @@
"laravel",
"laravel5"
],
"version": "2.3.0",
"version": "2.4.0",
"license": "MIT",
"type": "project",
"require": {
......
<?php
return [
/*
|--------------------------------------------------------------------------
| Custom Stubs Folder
|--------------------------------------------------------------------------
| You can specify place from which you would like to use stubs.
| e.g. "Modules/<module-name>/Resources/views/stubs"
| Only the customized stubs need to be in this folder.
| All other stubs will be loaded from Workshop Module folder.
| No custom stubs folder: null
*/
'custom-stubs-folder' => null,
/*
|--------------------------------------------------------------------------
| Custom Sidebar Class
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment