Skip to content

Commit

Permalink
add Rules translator & back it up with tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Naoray committed Apr 19, 2020
1 parent 5ea50b0 commit 995df57
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 28 deletions.
44 changes: 16 additions & 28 deletions src/Tasks/AddRegularFields.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

namespace Naoray\BlueprintNovaAddon\Tasks;

use Blueprint\Models\Column;
use Blueprint\Models\Model;
use Blueprint\Translators\Rules;
use Closure;
use Blueprint\Models\Model;
use Blueprint\Models\Column;
use Illuminate\Support\Collection;
use Naoray\BlueprintNovaAddon\Translators\Rules;

class AddRegularFields
{
Expand All @@ -31,14 +31,14 @@ public function handle($data, Closure $next): array
$fieldType = $this->fieldType($column->dataType());
$imports[] = $fieldType;

$field = $fieldType."::make('".$this->fieldLabel($column->name())."')";
$field = $fieldType . "::make('" . $this->fieldLabel($column->name()) . "')";
$field .= $this->addRules($column);

if ($column->dataType() === 'json') {
$field .= PHP_EOL.self::INDENT_PLUS.'->json()';
$field .= PHP_EOL . self::INDENT_PLUS . '->json()';
}

$fields .= self::INDENT.$field.','.PHP_EOL.PHP_EOL;
$fields .= self::INDENT . $field . ',' . PHP_EOL . PHP_EOL;
}

$data['fields'] = $fields;
Expand All @@ -52,7 +52,7 @@ private function regularColumns(array $columns): Collection
return collect($columns)
->filter(function (Column $column) {
return $column->dataType() !== 'id'
&& ! collect(['id', 'deleted_at', 'created_at', 'updated_at'])->contains($column->name());
&& !collect(['id', 'deleted_at', 'created_at', 'updated_at'])->contains($column->name());
});
}

Expand All @@ -63,31 +63,19 @@ private function fieldLabel($name): string

private function addRules(Column $column): string
{
$fieldRules = '';

if (! in_array($column->dataType(), ['id'])) {
$rules = Rules::fromColumn($this->model->tableName(), $column);

if ($column->dataType() === 'json') {
array_push($rules, 'json');
}

if (in_array('nullable', $column->modifiers())) {
$rules = array_filter($rules, function ($rule) {
return $rule !== 'required';
});
}
if (in_array($column->dataType(), ['id'])) {
return '';
}

$rules = array_map(function ($rule) {
return " '".$rule."'";
}, $rules);
$rules = array_map(function ($rule) {
return " '" . $rule . "'";
}, Rules::fromColumn($this->model->tableName(), $column));

if (! empty($rules)) {
$fieldRules .= PHP_EOL.self::INDENT_PLUS.'->rules('.trim(implode(',', $rules)).')';
}
if (empty($rules)) {
return '';
}

return $fieldRules;
return PHP_EOL . self::INDENT_PLUS . '->rules(' . trim(implode(',', $rules)) . ')';
}

private function fieldType(string $dataType)
Expand Down
26 changes: 26 additions & 0 deletions src/Translators/Rules.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace Naoray\BlueprintNovaAddon\Translators;

use Blueprint\Models\Column;
use Blueprint\Translators\Rules as BlueprintRules;

class Rules
{
public static function fromColumn(string $tableName, Column $column): array
{
$rules = BlueprintRules::fromColumn($tableName, $column);

if ($column->dataType() === 'json') {
array_push($rules, 'json');
}

if (in_array('nullable', $column->modifiers())) {
$rules = array_filter($rules, function ($rule) {
return $rule !== 'required';
});
}

return $rules;
}
}
33 changes: 33 additions & 0 deletions tests/RulesTranslatorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace Naoray\BlueprintNovaAddon\Tests;

use Blueprint\Models\Column;
use Naoray\BlueprintNovaAddon\Translators\Rules;

class RulesTranslatorTest extends TestCase
{
/** @test */
public function forColumn_returns_required_by_default()
{
$column = new Column('test', 'unknown');

$this->assertEquals(['required'], Rules::fromColumn('context', $column));
}

/** @test */
public function forColumn_returns_rejects_required_rule_for_the_nullable_modifier()
{
$column = new Column('test', 'unknown', ['nullable']);

$this->assertEquals([], Rules::fromColumn('context', $column));
}

/** @test */
public function forColumn_returns_json_for_the_json_type()
{
$column = new Column('test', 'json');

$this->assertContains('json', Rules::fromColumn('context', $column));
}
}

0 comments on commit 995df57

Please sign in to comment.