diff --git a/.travis.yml b/.travis.yml index 82a7ddd..d9aefd3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,30 @@ language: php - php: - - 7.1 + - '7.2' + - '7.3' + - '7.4' + - 'nightly' + +services: + - memcached -before_install: - - composer require php-coveralls/php-coveralls +matrix: + allow_failures: + - php: 'nightly' before_script: - - composer self-update - - composer install --prefer-source --dev + - pecl install pcov + - phpenv config-rm xdebug.ini || echo "xdebug not available" + - bash <(curl -s https://raw.githubusercontent.com/php-cache/cache/master/build/php/7.2/Memcached.sh) + - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter + - chmod +x ./cc-test-reporter + - if [ $(phpenv version-name) = "7.4" ]; then ./cc-test-reporter before-build; fi + - composer install -script: vendor/bin/phpunit --coverage-clover ./tests/logs/clover.xml +script: + - ./vendor/bin/phpunit --coverage-xml=build/coverage-xml --log-junit=build/junit.xml + - ./vendor/bin/infection --coverage=build --min-msi=20 -j$(nproc) -after_script: - - php vendor/bin/php-coveralls -v \ No newline at end of file +after_success: + - if [ $(phpenv version-name) = "7.4" ]; then ./cc-test-reporter after-build --coverage-input-type clover --exit-code $TRAVIS_TEST_RESULT; fi + - bash <(curl -s https://codecov.io/bash) diff --git a/README.md b/README.md index 9194de7..53eb746 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # laravel-clickhouse -[![Build Status](https://travis-ci.org/esazykin/laravel-clickhouse.svg?branch=master)](https://travis-ci.org/esazykin/laravel-clickhouse) +[![Build Status](https://travis-ci.org/bavix/laravel-clickhouse.svg?branch=master)](https://travis-ci.org/bavix/laravel-clickhouse) [![StyleCI](https://styleci.io/repos/112756298/shield?branch=master)](https://styleci.io/repos/112756298) -[![Coverage Status](https://coveralls.io/repos/github/esazykin/laravel-clickhouse/badge.svg)](https://coveralls.io/github/esazykin/laravel-clickhouse) +[![Coverage Status](https://coveralls.io/repos/github/bavix/laravel-clickhouse/badge.svg)](https://coveralls.io/github/bavix/laravel-clickhouse) Eloquent model for ClickHouse @@ -11,12 +11,12 @@ Eloquent model for ClickHouse ## Installation ```sh -$ composer require esazykin/laravel-clickhouse +$ composer require bavix/laravel-clickhouse ``` Then add the code above into your config/app.php file providers section ```php -Esazykin\LaravelClickHouse\ClickHouseServiceProvider::class, +Bavix\LaravelClickHouse\ClickHouseServiceProvider::class, ``` And add new connection into your config/database.php file. Something like this: ```php @@ -72,7 +72,7 @@ Then create model ```php =7.1", - "laravel/framework": "5.5.*", - "esazykin/clickhouse-builder": "^1.1" + "php": ">=7.2", + "laravel/framework": "^6.0|^7.0", + "the-tinderbox/clickhouse-builder": "^3.0" }, "require-dev": { - "phpunit/phpunit": "^6.5", - "mockery/mockery": "^1.0", - "fzaninotto/faker": "^1.7" + "infection/infection": "0.15.*|0.16.*", + "phpunit/phpunit": "^8.0|^9.0", + "mockery/mockery": "^1.3", + "fzaninotto/faker": "^1.9" }, "autoload": { "psr-4": { - "Esazykin\\LaravelClickHouse\\": "src/" + "Bavix\\LaravelClickHouse\\": "src/" } }, "autoload-dev": { "psr-4": { - "Esazykin\\LaravelClickHouse\\Tests\\": "tests/" + "Bavix\\LaravelClickHouse\\Tests\\": "tests/" } }, "scripts": { diff --git a/infection.json.dist b/infection.json.dist new file mode 100644 index 0000000..14a49e9 --- /dev/null +++ b/infection.json.dist @@ -0,0 +1,17 @@ +{ + "timeout": 10, + "source": { + "directories": [ + "src" + ] + }, + "logs": { + "text": "build/infection.log", + "badge": { + "branch": "master" + } + }, + "mutators": { + "@default": true + } +} diff --git a/phpunit.xml b/phpunit.xml index 2dee96b..1431f13 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -19,6 +19,6 @@ - + diff --git a/src/ClickHouseServiceProvider.php b/src/ClickHouseServiceProvider.php index 16c3080..1daa17c 100644 --- a/src/ClickHouseServiceProvider.php +++ b/src/ClickHouseServiceProvider.php @@ -2,12 +2,12 @@ declare(strict_types=1); -namespace Esazykin\LaravelClickHouse; +namespace Bavix\LaravelClickHouse; use Illuminate\Support\ServiceProvider; use Illuminate\Database\DatabaseManager; -use Esazykin\LaravelClickHouse\Database\Connection; -use Esazykin\LaravelClickHouse\Database\Eloquent\Model; +use Bavix\LaravelClickHouse\Database\Connection; +use Bavix\LaravelClickHouse\Database\Eloquent\Model; class ClickHouseServiceProvider extends ServiceProvider { diff --git a/src/Database/Connection.php b/src/Database/Connection.php index 5752d19..f6cfd08 100644 --- a/src/Database/Connection.php +++ b/src/Database/Connection.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace Esazykin\LaravelClickHouse\Database; +namespace Bavix\LaravelClickHouse\Database; use Tinderbox\ClickhouseBuilder\Query\Grammar; -use Esazykin\LaravelClickHouse\Database\Query\Builder; +use Bavix\LaravelClickHouse\Database\Query\Builder; class Connection extends \Tinderbox\ClickhouseBuilder\Integrations\Laravel\Connection { diff --git a/src/Database/Eloquent/Builder.php b/src/Database/Eloquent/Builder.php index 064975c..6ba4d05 100755 --- a/src/Database/Eloquent/Builder.php +++ b/src/Database/Eloquent/Builder.php @@ -1,6 +1,6 @@ 'localhost']); + $connection = new Connection([ + 'host' => 'localhost', + 'port' => '8123', + 'database' => 'default', + ]); $this->assertInstanceOf(Builder::class, $connection->query()); } diff --git a/tests/Unit/Database/Eloquent/BuilderTest.php b/tests/Unit/Database/Eloquent/BuilderTest.php index 462178b..9f76465 100644 --- a/tests/Unit/Database/Eloquent/BuilderTest.php +++ b/tests/Unit/Database/Eloquent/BuilderTest.php @@ -2,23 +2,23 @@ declare(strict_types=1); -namespace Esazykin\LaravelClickHouse\Tests\Unit\Database\Eloquent; +namespace Bavix\LaravelClickHouse\Tests\Unit\Database\Eloquent; use Mockery\Mock; use PHPUnit\Framework\TestCase; use Illuminate\Database\DatabaseManager; use Tinderbox\ClickhouseBuilder\Query\Tuple; -use Esazykin\LaravelClickHouse\Tests\Helpers; +use Bavix\LaravelClickHouse\Tests\Helpers; use Tinderbox\ClickhouseBuilder\Query\Grammar; use Tinderbox\ClickhouseBuilder\Query\Identifier; -use Esazykin\LaravelClickHouse\Database\Connection; +use Bavix\LaravelClickHouse\Database\Connection; use Tinderbox\ClickhouseBuilder\Query\Enums\Operator; use Illuminate\Database\Eloquent\ModelNotFoundException; -use Esazykin\LaravelClickHouse\Database\Eloquent\Builder; -use Esazykin\LaravelClickHouse\Database\Eloquent\Collection; -use Esazykin\LaravelClickHouse\Tests\EloquentModelCastingTest; +use Bavix\LaravelClickHouse\Database\Eloquent\Builder; +use Bavix\LaravelClickHouse\Database\Eloquent\Collection; +use Bavix\LaravelClickHouse\Tests\EloquentModelCastingTest; use Tinderbox\ClickhouseBuilder\Query\TwoElementsLogicExpression; -use Esazykin\LaravelClickHouse\Database\Query\Builder as QueryBuilder; +use Bavix\LaravelClickHouse\Database\Query\Builder as QueryBuilder; /** * @property Mock|Connection connection @@ -29,7 +29,7 @@ class BuilderTest extends TestCase { use Helpers; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -41,7 +41,7 @@ protected function setUp() ->setModel($this->model); } - public function testWhereKey() + public function testWhereKey(): void { $id = $this->faker()->numberBetween(1); @@ -63,7 +63,7 @@ public function testWhereKey() $this->assertSame('=', $operator->getValue()); } - public function testWhereKeyNot() + public function testWhereKeyNot(): void { $ids = range(1, 5); @@ -87,7 +87,7 @@ public function testWhereKeyNot() $this->assertSame('NOT IN', $operator->getValue()); } - public function testWhereSimple() + public function testWhereSimple(): void { $date = $this->faker()->date(); $this->builder->where('date_column', '>', $date); @@ -108,7 +108,7 @@ public function testWhereSimple() $this->assertSame('>', $operator->getValue()); } - public function testWhereClosure() + public function testWhereClosure(): void { /** @var Mock|DatabaseManager $resolver */ $resolver = $this->mock(DatabaseManager::class); @@ -128,7 +128,7 @@ public function testWhereClosure() $this->assertSame('SELECT * FROM `test_table` WHERE (`id` < 10 OR `id` = 15) AND `status` = 100', $sql); } - public function testOrWhere() + public function testOrWhere(): void { $id = $this->faker()->numberBetween(1); $date = $this->faker()->date(); @@ -142,7 +142,7 @@ public function testOrWhere() ); } - public function testFind() + public function testFind(): void { $id = $this->faker()->numberBetween(1); $stringAttribute = $this->faker()->word; @@ -164,7 +164,7 @@ public function testFind() $this->assertSame($stringAttribute, $model->stringAttribute); } - public function testFindMany() + public function testFindMany(): void { $ids = collect()->times(5); @@ -188,7 +188,7 @@ public function testFindMany() $this->assertCount($ids->count(), $models); } - public function testFindOrFail() + public function testFindOrFail(): void { $this->expectException(ModelNotFoundException::class); @@ -203,7 +203,7 @@ public function testFindOrFail() $this->builder->findOrFail($this->faker()->numberBetween()); } - public function testGet() + public function testGet(): void { $connectionResultRow = [ 'id' => $this->faker()->randomDigit, diff --git a/tests/Unit/Database/Eloquent/CollectionTest.php b/tests/Unit/Database/Eloquent/CollectionTest.php index 5af08b7..8318bc4 100644 --- a/tests/Unit/Database/Eloquent/CollectionTest.php +++ b/tests/Unit/Database/Eloquent/CollectionTest.php @@ -2,16 +2,16 @@ declare(strict_types=1); -namespace Esazykin\LaravelClickHouse\Tests\Unit\Database\Eloquent; +namespace Bavix\LaravelClickHouse\Tests\Unit\Database\Eloquent; use Mockery\Mock; use Carbon\Carbon; use PHPUnit\Framework\TestCase; use Illuminate\Database\DatabaseManager; -use Esazykin\LaravelClickHouse\Tests\Helpers; -use Esazykin\LaravelClickHouse\Database\Connection; -use Esazykin\LaravelClickHouse\Database\Eloquent\Collection; -use Esazykin\LaravelClickHouse\Tests\EloquentModelCastingTest; +use Bavix\LaravelClickHouse\Tests\Helpers; +use Bavix\LaravelClickHouse\Database\Connection; +use Bavix\LaravelClickHouse\Database\Eloquent\Collection; +use Bavix\LaravelClickHouse\Tests\EloquentModelCastingTest; /** * @property Mock|Connection connection @@ -20,7 +20,7 @@ class CollectionTest extends TestCase { use Helpers; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -38,7 +38,7 @@ protected function setUp() EloquentModelCastingTest::setConnectionResolver($resolver); } - public function testMapModelToModel() + public function testMapModelToModel(): void { $connectionResult = collect() ->times(5, function (int $id) { @@ -68,7 +68,7 @@ public function testMapModelToModel() }); } - public function testMapModelToArray() + public function testMapModelToArray(): void { $connectionResult = collect() ->times(5, function (int $id) { @@ -103,7 +103,7 @@ public function testMapModelToArray() * @dataProvider findDataProvider * @param $key */ - public function testFind($key) + public function testFind($key): void { $connectionResult = collect() ->times(5, function (int $id) { @@ -131,7 +131,7 @@ public function testFind($key) * @param null $operator * @param null $value */ - public function testContains(bool $expected, $key, $operator = null, $value = null) + public function testContains(bool $expected, $key, $operator = null, $value = null): void { $connectionResult = collect() ->times(5, function (int $id) { @@ -151,7 +151,7 @@ public function testContains(bool $expected, $key, $operator = null, $value = nu $this->assertSame($expected, $contains); } - public function testGet() + public function testGet(): void { $connectionResult = collect() ->times(5, function (int $id) { diff --git a/tests/Unit/Database/Eloquent/ModelTest.php b/tests/Unit/Database/Eloquent/ModelTest.php index bade4e8..3585025 100644 --- a/tests/Unit/Database/Eloquent/ModelTest.php +++ b/tests/Unit/Database/Eloquent/ModelTest.php @@ -2,21 +2,21 @@ declare(strict_types=1); -namespace Esazykin\LaravelClickHouse\Tests\Unit\Database\Eloquent; +namespace Bavix\LaravelClickHouse\Tests\Unit\Database\Eloquent; use Illuminate\Support\Carbon; use PHPUnit\Framework\TestCase; -use Esazykin\LaravelClickHouse\Tests\Helpers; -use Esazykin\LaravelClickHouse\Tests\EloquentModelTest; +use Bavix\LaravelClickHouse\Tests\Helpers; +use Bavix\LaravelClickHouse\Tests\EloquentModelTest; use Illuminate\Database\Eloquent\MassAssignmentException; -use Esazykin\LaravelClickHouse\Tests\EloquentModelWithTest; -use Esazykin\LaravelClickHouse\Tests\EloquentModelCastingTest; +use Bavix\LaravelClickHouse\Tests\EloquentModelWithTest; +use Bavix\LaravelClickHouse\Tests\EloquentModelCastingTest; class ModelTest extends TestCase { use Helpers; - public function testAttributeManipulation() + public function testAttributeManipulation(): void { $model = new EloquentModelTest(); $model->status = 'successful'; @@ -31,14 +31,14 @@ public function testAttributeManipulation() $this->assertEquals(json_encode(range(1, 5)), $attributes['list_items']); } - public function testDirtyAttributes() + public function testDirtyAttributes(): void { $this->expectException(MassAssignmentException::class); new EloquentModelTest(['foo' => '1', 'bar' => 2, 'baz' => 3]); } - public function testDirtyOnCastOrDateAttributes() + public function testDirtyOnCastOrDateAttributes(): void { $model = new EloquentModelCastingTest(); $model->setDateFormat('Y-m-d H:i:s'); @@ -61,7 +61,7 @@ public function testDirtyOnCastOrDateAttributes() $this->assertTrue($model->isDirty('datetimeAttribute')); } - public function testCalculatedAttributes() + public function testCalculatedAttributes(): void { $model = new EloquentModelTest(); $model->password = 'secret'; @@ -74,13 +74,13 @@ public function testCalculatedAttributes() $this->assertEquals($hash, $model->password_hash); } - public function testWithMethodCallsQueryBuilderCorrectly() + public function testWithMethodCallsQueryBuilderCorrectly(): void { $result = EloquentModelWithTest::with('foo', 'bar'); $this->assertEquals('foo', $result); } - public function testTimestampsAreReturnedAsObjectsFromPlainDatesAndTimestamps() + public function testTimestampsAreReturnedAsObjectsFromPlainDatesAndTimestamps(): void { $datetime = '2012-12-04'; $model = new EloquentModelCastingTest(); diff --git a/tests/Unit/Database/Query/BuilderTest.php b/tests/Unit/Database/Query/BuilderTest.php index cdc3ae7..4585f3b 100644 --- a/tests/Unit/Database/Query/BuilderTest.php +++ b/tests/Unit/Database/Query/BuilderTest.php @@ -2,14 +2,14 @@ declare(strict_types=1); -namespace Esazykin\LaravelClickHouse\Tests\Unit\Database\Query; +namespace Bavix\LaravelClickHouse\Tests\Unit\Database\Query; use PHPUnit\Framework\TestCase; -use Esazykin\LaravelClickHouse\Tests\Helpers; +use Bavix\LaravelClickHouse\Tests\Helpers; use Tinderbox\ClickhouseBuilder\Query\Grammar; -use Esazykin\LaravelClickHouse\Database\Connection; +use Bavix\LaravelClickHouse\Database\Connection; use Tinderbox\ClickhouseBuilder\Query\Enums\Format; -use Esazykin\LaravelClickHouse\Database\Query\Builder; +use Bavix\LaravelClickHouse\Database\Query\Builder; /** * @property \Mockery\MockInterface|Connection connection @@ -19,7 +19,7 @@ class BuilderTest extends TestCase { use Helpers; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -96,9 +96,11 @@ public function testInsert(): void $this->faker()->numerify('column_#') => $this->faker()->randomLetter, ]; $inserted = [$insertedRow]; + ksort($insertedRow); + $values = collect($insertedRow)->values()->toArray(); $generatedSql = sprintf( - 'INSERT INTO `%s` (%s) FORMAT %s (?, ?, ?)', + 'INSERT INTO `%s` (%s) FORMAT %s (\'%s\', %d, %d)', $this->builder->getFrom()->getTable(), collect($insertedRow) ->keys() @@ -107,16 +109,13 @@ public function testInsert(): void return sprintf('`%s`', $columnName); }) ->implode(', '), - Format::VALUES + Format::VALUES, + ...$values ); - ksort($insertedRow); $this->connection ->shouldReceive('insert') - ->withArgs([ - $generatedSql, - collect($insertedRow)->values()->toArray(), - ]) + ->withArgs([$generatedSql, $values]) ->andReturn(true); $this->assertTrue($this->builder->insert($inserted));