31 Commits
0.0.1 ... 1.1.0

Author SHA1 Message Date
Ismo Vuorinen
6eb2e1499c Merge branch 'release/1.1.0'
# Conflicts:
#	CHANGELOG.md
2017-08-27 19:22:57 +03:00
Ismo Vuorinen
cf7d4d37de Release CHANGELOG and few fixes to README 2017-08-27 19:20:53 +03:00
Ismo Vuorinen
8aa4639b04 New Gozer tests, exposed methods for public usage (mainly for testing) 2017-08-27 19:04:42 +03:00
Ismo Vuorinen
3e9d7e8b06 PHP Code Sniffer fixes 2017-02-27 13:32:13 +02:00
Ismo Vuorinen
f14a1d8769 Gozer: Refactoring and tests 2017-02-14 13:47:33 +02:00
Ismo Vuorinen
5fe7412588 Dropping 5.6 from travis for now. Will investigate later. 2017-02-10 11:53:36 +02:00
Ismo Vuorinen
bbd501c2d6 Travis.yml cache settings to speed up our testing 2017-02-10 10:25:46 +02:00
Ismo Vuorinen
0509cbb2fb Typo in autoload-dev class mapping, removed Orchestra\Testbench 2017-02-10 10:12:28 +02:00
Ismo Vuorinen
f146683ae4 Mirroring Orhestra\Testbench travis config 2017-02-10 10:03:17 +02:00
Ismo Vuorinen
5ca3d391ad Another attempt to make travis find our classes 2017-02-10 10:01:29 +02:00
Ismo Vuorinen
8e49c144fd Autoloader addition, Orchestra\Testbench could not be found 2017-02-10 09:55:39 +02:00
Ismo Vuorinen
bb18cdd30f Setup error cleaning 2017-02-10 09:51:42 +02:00
Ismo Vuorinen
ab0a5a8d9d Testing Orchestra/TestBench workflow 2017-02-10 09:48:40 +02:00
Ismo Vuorinen
3d236cb55e Just get to the green already 2017-02-08 14:51:47 +02:00
Ismo Vuorinen
1dc771dfaa Moving from Laravel TestCase to \PHPUnit_Framework_TestCase 2017-02-08 14:49:53 +02:00
Ismo Vuorinen
239f5d718c phpunit.xml 2017-02-08 14:46:37 +02:00
Ismo Vuorinen
03405ded71 Add base tests to get something out 2017-02-08 14:43:20 +02:00
Ismo Vuorinen
0e0c094071 Documentation, fixes and better messages 2017-02-08 14:27:00 +02:00
Ismo Vuorinen
313dfec8d8 New command: superhelio:gozer, the Destroyer 2017-02-08 14:04:52 +02:00
Ismo Vuorinen
8c9e0ff85a Set better description to superhelio:reload 2017-02-08 14:04:13 +02:00
Ismo Vuorinen
4cd5eb29f4 TravisCI config 2017-02-08 10:29:36 +02:00
Ismo Vuorinen
a470911429 Merge branch 'release/1.0.0' into develop 2017-02-08 10:25:02 +02:00
Ismo Vuorinen
2cf81a2d98 Merge branch 'release/1.0.0'
# Conflicts:
#	CHANGELOG.md
2017-02-08 10:24:25 +02:00
Ismo Vuorinen
ee3fefbe63 Changelog 2017-02-08 10:22:02 +02:00
Ismo Vuorinen
be99c75812 Fixed Scrutinizer reported issue 2017-02-08 10:20:33 +02:00
Ismo Vuorinen
671bb0300b Updated changelog 2017-02-07 17:47:29 +02:00
Ismo Vuorinen
20fd92412e New changelog, testing github_changelog_generator out 2017-02-07 17:45:41 +02:00
Ismo Vuorinen
fffc0ff9ca Renamed LICENSE 2017-02-07 17:45:00 +02:00
Ismo Vuorinen
25840e0c5c Merge branch 'release/0.0.1' into develop 2017-02-07 17:24:32 +02:00
Ismo Vuorinen
5132d97534 Merge branch 'release/0.0.1'
# Conflicts:
#	CHANGELOG.md
2017-02-07 17:24:21 +02:00
Ismo Vuorinen
1ae74443c9 Initial commit, superhelio:reload 2017-02-07 17:23:28 +02:00
14 changed files with 478 additions and 13 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
composer.lock
vendor

30
.travis.yml Normal file
View File

@@ -0,0 +1,30 @@
language: php
sudo: false
php:
- 7.0
- 7.1
env:
global:
- setup=basic
- coverage=no
cache:
directories:
- $HOME/.composer/cache/files
before_script:
- composer config discard-changes true
- if [[ $setup = 'basic' ]]; then travis_retry composer install --prefer-dist --no-interaction; fi
- if [[ $setup = 'stable' ]]; then travis_retry composer update --prefer-dist --no-interaction --prefer-stable; fi
- if [[ $setup = 'lowest' ]]; then travis_retry composer update --prefer-dist --no-interaction --prefer-lowest --prefer-stable; fi
- if [[ $setup = 'coveralls' ]]; then travis_retry composer require "satooshi/php-coveralls=~0.7" --prefer-dist --no-interaction --dev; fi
script:
- if [[ $coverage = 'yes' ]]; then ./vendor/bin/phpunit -c phpunit.xml --coverage-clover build/logs/clover.xml; fi
- if [[ $coverage = 'no' ]]; then ./vendor/bin/phpunit -c phpunit.xml; fi
after_script:
- if [[ $setup = 'coveralls' ]]; then php vendor/bin/coveralls -v; fi

View File

@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## 0.0.1 - 2017-02-07
### Added
- `superhelio:reload`
## [1.1.0](https://github.com/superhelio/commands/tree/2.0.0) (2017-08-27)
- New command: `superhelio:gozer` with tests
## [1.0.0](https://github.com/superhelio/commands/tree/1.0.0) (2017-02-08)
- Fixed Scrutinizer reported issue
- Renamed LICENSE
- Tested `github_changelog_generator`, but did not like it
## [0.0.1](https://github.com/superhelio/commands/tree/0.0.1) (2017-02-07)
- `superhelio:reload`

View File

View File

@@ -33,6 +33,9 @@ public function register()
## Usage
- *superhelio:gozer*
- Force delete database tables that has your table prefix
- `php artisan superhelio:gozer`
- *superhelio:reload*
- Reset database, migrate and seed
- `php artisan superhelio:reload`
@@ -47,10 +50,6 @@ Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recen
$ composer test
```
## Contributing
Please see [CONTRIBUTING](CONTRIBUTING.md) for details.
## Security
If you discover any security related issues, please contact [SuperHelio](link-author).
@@ -77,4 +76,4 @@ The MIT License (MIT). Please see [License File](LICENSE.md) for more informatio
[link-code-quality]: https://scrutinizer-ci.com/g/superhelio/commands
[link-downloads]: https://packagist.org/packages/superhelio/commands
[link-author]: https://github.com/superhelio
[link-contributors]: ../../contributors
[link-contributors]: https://github.com/superhelio/commands/graphs/contributors

View File

@@ -21,7 +21,9 @@
"illuminate/support": "~5.2"
},
"require-dev": {
"phpunit/phpunit" : "4.*"
"phpunit/phpunit" : "4.*",
"orchestra/testbench": "~3.0",
"doctrine/dbal": "~2.3"
},
"autoload": {
"psr-4": {
@@ -30,7 +32,7 @@
},
"autoload-dev": {
"psr-4": {
"Superhelio\\Commands\\Test\\": "tests"
"Superhelio\\Commands\\Tests\\": "tests"
}
},
"scripts": {

27
phpunit.xml Normal file
View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Superhelio\Commands Test Suite">
<directory suffix="Test.php">./tests/</directory>
</testsuite>
</testsuites>
<php>
<env name="APP_ENV" value="testing"/>
</php>
<filter>
<whitelist addUncoveredFilesFromWhitelist="false">
<directory suffix=".php">src/</directory>
</whitelist>
</filter>
</phpunit>

201
src/Commands/Gozer.php Normal file
View File

@@ -0,0 +1,201 @@
<?php
namespace Superhelio\Commands\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class Gozer extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'superhelio:gozer';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Force delete database tables that has your table prefix';
/**
* @var string Database table prefix
*/
private $dbPrefix = '';
/**
* Create a new command instance.
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return bool
*/
public function handle()
{
if (!class_exists('\\Doctrine\\DBAL\\Schema\\Schema')) {
$this->error('You are missing doctrine/dbal, you should add it to your project:');
$this->info('composer require doctrine/dbal');
return false;
}
$this->info('
________
/ _____/ ____________ ___________
/ \ ___ / _ \___ // __ \_ __ \
\ \_\ ( <_> ) /\ ___/| | \/
\______ /\____/_____ \\___ >__|
\/ \/ \/
');
$this->setDatabasePrefix($this->getDatabasePrefix());
$confirmationQuestion = 'Delete all of your database tables?';
if (!empty($this->dbPrefix)) {
$confirmationQuestion = sprintf(
'Delete your tables that begin with %s*',
$this->dbPrefix
);
}
if ($this->confirm($confirmationQuestion)) {
$connection = $this->getConnection();
$tables = $this->getTables($connection);
/**
* Reject tables that do not have specified table prefix.
* We would not want to destroy other tables that might
* be in the same database, in "homestead" for example.
*
* @var \Illuminate\Support\Collection $tables
*/
$tables = $this->getFilteredTables($tables);
/**
* Check that we got at least one table, bail out if not
*/
if ($tables->count() < 1) {
$this->info('There are no tables, only Zuul.');
return true;
}
/**
* Bid your farewells to these tables.
* Last look and confirmation.
*/
$this->info(sprintf(
"Tables found:\n - %s",
implode(",\n - ", $tables->toArray())
));
$this->line('');
/**
* Last confirmation before dropping tables
*/
if ($this->confirm('Really delete those tables?')) {
/** Fancy pants progress bar to see your tables get destroyed */
$bar = $this->output->createProgressBar($tables->count());
Schema::disableForeignKeyConstraints();
$tables->each(function ($table) use ($bar, $connection) {
/** Drop the table */
$connection->dropTable($table);
/** Advance our progress bar */
$bar->advance();
});
Schema::enableForeignKeyConstraints();
/** Progress bar is now finished */
$bar->finish();
}
$this->line('');
$this->line('');
}
$this->info('Done.');
return true;
}
/**
* @return bool|\Doctrine\DBAL\Schema\AbstractSchemaManager
*/
public function getConnection()
{
try {
/** @var \Doctrine\DBAL\Schema\AbstractSchemaManager $connection */
$connection = app('db')->connection()->getDoctrineSchemaManager();
} catch (\Exception $e) {
$this->error($e->getMessage());
return false;
}
return $connection;
}
/**
* @param \Doctrine\DBAL\Schema\AbstractSchemaManager $connection
*
* @return array|bool
*/
public function getTables(\Doctrine\DBAL\Schema\AbstractSchemaManager $connection)
{
try {
/** @var array $tables */
$tables = $connection->listTableNames();
} catch (\Exception $e) {
$this->error($e->getMessage());
return false;
}
return $tables;
}
public function getDatabasePrefix()
{
return trim(DB::getTablePrefix());
}
/**
* This is mainly for testing purposes
*
* @param string $prefix
*/
public function setDatabasePrefix($prefix = '')
{
$this->dbPrefix = $prefix;
}
/**
* @param array $tables
*
* @return \Illuminate\Support\Collection
*/
public function getFilteredTables($tables = [])
{
$prefix = $this->dbPrefix;
return collect($tables)->reject(function ($table) use ($prefix) {
return !starts_with($table, $prefix);
});
}
}

View File

@@ -18,12 +18,10 @@ class Reload extends Command
*
* @var string
*/
protected $description = 'Delete database tables, migrate and run seeds';
protected $description = 'Rollback migrations, migrate and run seeds';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{

View File

@@ -30,6 +30,7 @@ class ServiceProvider extends BaseServiceProvider
public function register()
{
$this->registerReloader();
$this->registerGozer();
}
private function registerReloader()
@@ -39,4 +40,12 @@ class ServiceProvider extends BaseServiceProvider
});
$this->commands('command.superhelio.reload');
}
private function registerGozer()
{
$this->app->singleton('command.superhelio.gozer', function ($app) {
return $app['Superhelio\Commands\Commands\Gozer'];
});
$this->commands('command.superhelio.gozer');
}
}

131
tests/GozerTest.php Normal file
View File

@@ -0,0 +1,131 @@
<?php
namespace Superhelio\Commands;
use ReflectionClass;
use Superhelio\Commands\Commands\Gozer;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
class GozerTest extends \Orchestra\Testbench\TestCase
{
/**
* Setup the test environment.
*/
public function setUp()
{
parent::setUp();
$this->artisan('migrate', ['--database' => 'testbench']);
}
/**
* Define environment setup.
*
* @param \Illuminate\Foundation\Application $app
*
* @return void
*/
protected function getEnvironmentSetUp($app)
{
// Setup default database to use sqlite :memory:
$app['config']->set('database.default', 'testbench');
$app['config']->set('database.connections.testbench', [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => 'gozerTest__',
]);
}
/**
* Get package providers.
* At a minimum this is the package being tested, but also
* would include packages upon which our package depends.
* In a normal app environment these would be added to
* the 'providers' array in the config/app.php file.
*
* @param \Illuminate\Foundation\Application $app
*
* @return array
*/
protected function getPackageProviders($app)
{
return [
'\Superhelio\Commands\Tests\Stubs\ServiceProvider',
'\Superhelio\Commands\ServiceProvider'
];
}
public function test_database_is_there_and_functions()
{
DB::table('users')->insert([
'name' => 'User name',
'email' => 'hello@gozer.dev',
'password' => bcrypt('123')
]);
$users = DB::table('users')->where('id', '=', 1)->first();
$this->assertEquals('hello@gozer.dev', $users->email);
$this->assertEquals('User name', $users->name);
$this->assertTrue(Hash::check('123', $users->password));
}
public function test_dbal_is_installed()
{
$this->assertTrue(class_exists('\\Doctrine\\DBAL\\Schema\\Schema'));
}
public function test_gozer_is_installed()
{
$this->assertTrue(class_exists('\\Superhelio\\Commands\\Commands\\Gozer'));
}
public function test_gozer_has_required_methods_and_properties()
{
$gozer = new ReflectionClass('\\Superhelio\\Commands\\Commands\\Gozer');
$this->assertTrue($gozer->hasMethod('handle'));
$this->assertTrue($gozer->hasProperty('signature'));
$this->assertTrue($gozer->hasProperty('description'));
$this->assertTrue($gozer->hasProperty('dbPrefix'));
}
public function test_gozer_finds_database_prefix()
{
$gozer = new Gozer();
$this->assertEquals('gozerTest__', $gozer->getDatabasePrefix());
}
public function test_gozer_finds_users_table()
{
$gozer = new Gozer();
$connection = $gozer->getConnection();
$tables = $gozer->getTables($connection);
$this->assertTrue(in_array('gozerTest__users', $tables, false));
$gozer->setDatabasePrefix('gozerTest__');
$filteredTables = $gozer->getFilteredTables($tables);
$this->assertTrue(is_a($filteredTables, \Illuminate\Support\Collection::class));
$this->assertTrue(in_array('gozerTest__users', $filteredTables->toArray(), false));
}
public function test_gozer_table_filtering_works()
{
$gozer = new Gozer();
$tables = array(
'gozerTest__users',
'gozerTest__migrations',
'this_should_be_filtered',
'filter_me_too'
);
$gozer->setDatabasePrefix('gozerTest__');
$filtered = $gozer->getFilteredTables($tables);
$array = $filtered->toArray();
$this->assertFalse(in_array('this_should_be_filtered', $array, false));
$this->assertFalse(in_array('filter_me_too', $array, false));
$this->assertTrue(in_array('gozerTest__users', $array, false));
$this->assertTrue(in_array('gozerTest__migrations', $array, false));
}
}

14
tests/ReloadTest.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
namespace Superhelio\Commands;
use Superhelio\Commands\Commands\Reload;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ReloadTest extends \PHPUnit_Framework_TestCase
{
public function testReloadTest()
{
$this->assertTrue(true);
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace Superhelio\Commands\Tests\Stubs;
class ServiceProvider extends \Illuminate\Support\ServiceProvider
{
public function boot()
{
$this->loadMigrationsFrom(realpath(__DIR__ . '/../migrations'));
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}