Skip to content

Commit

Permalink
Refactor string validation rules and terminal width determination
Browse files Browse the repository at this point in the history
String validation rules 'str_starts_with' and 'str_ends_with' were renamed to 'starts_with' and 'ends_with' for brevity and consistency. Also, a new utilitarian method named 'autoDetectTerminalWidth' was introduced to accurately estimate terminal width based on the execution environment. The code now takes into account wider terminal widths in Docker and GitHub actions environments.
  • Loading branch information
Denis Smet committed Mar 14, 2024
1 parent db657c2 commit ec96c1d
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 40 deletions.
3 changes: 0 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,4 @@ RUN cd /app \
&& composer clear-cache
RUN chmod +x /app/csv-blueprint

# Color output by default
ENV TERM_PROGRAM=Hyper

ENTRYPOINT ["/app/csv-blueprint"]
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -330,8 +330,8 @@ columns:
max_word_count: 5 # Integer only. Max count of words in the string Example: "Hello World! 123" - 2 words only (123 is not a word)
at_least_contains: [ a, b ] # At least one of the string must be in the CSV value. Case-sensitive.
all_must_contain: [ a, b, c ] # All the strings must be part of a CSV value. Case-sensitive.
str_starts_with: "prefix " # Case-sensitive. Example: "prefix Hello World"
str_ends_with: " suffix" # Case-sensitive. Example: "Hello World suffix"
starts_with: "prefix " # Case-sensitive. Example: "prefix Hello World"
ends_with: " suffix" # Case-sensitive. Example: "Hello World suffix"

# Decimal and integer numbers
min: 10 # Can be integer or float, negative and positive
Expand Down
4 changes: 2 additions & 2 deletions schema-examples/full.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
"max_word_count" : 5,
"at_least_contains" : ["a", "b"],
"all_must_contain" : ["a", "b", "c"],
"str_starts_with" : "prefix ",
"str_ends_with" : " suffix",
"starts_with" : "prefix ",
"ends_with" : " suffix",
"min" : 10,
"max" : 100.5,
"precision" : 3,
Expand Down
4 changes: 2 additions & 2 deletions schema-examples/full.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@
'max_word_count' => 5,
'at_least_contains' => ['a', 'b'],
'all_must_contain' => ['a', 'b', 'c'],
'str_starts_with' => 'prefix ',
'str_ends_with' => ' suffix',
'starts_with' => 'prefix ',
'ends_with' => ' suffix',
'min' => 10,
'max' => 100.5,
'precision' => 3,
Expand Down
4 changes: 2 additions & 2 deletions schema-examples/full.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ columns:
max_word_count: 5 # Integer only. Max count of words in the string Example: "Hello World! 123" - 2 words only (123 is not a word)
at_least_contains: [ a, b ] # At least one of the string must be in the CSV value. Case-sensitive.
all_must_contain: [ a, b, c ] # All the strings must be part of a CSV value. Case-sensitive.
str_starts_with: "prefix " # Case-sensitive. Example: "prefix Hello World"
str_ends_with: " suffix" # Case-sensitive. Example: "Hello World suffix"
starts_with: "prefix " # Case-sensitive. Example: "prefix Hello World"
ends_with: " suffix" # Case-sensitive. Example: "Hello World suffix"

# Decimal and integer numbers
min: 10 # Can be integer or float, negative and positive
Expand Down
2 changes: 1 addition & 1 deletion src/Rules/StrEndsWith.php → src/Rules/EndsWith.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

namespace JBZoo\CsvBlueprint\Rules;

final class StrEndsWith extends AbstarctRule
final class EndsWith extends AbstarctRule
{
public function validateRule(string $cellValue): ?string
{
Expand Down
2 changes: 1 addition & 1 deletion src/Rules/StrStartsWith.php → src/Rules/StartsWith.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

namespace JBZoo\CsvBlueprint\Rules;

final class StrStartsWith extends AbstarctRule
final class StartsWith extends AbstarctRule
{
public function validateRule(string $cellValue): ?string
{
Expand Down
19 changes: 19 additions & 0 deletions src/Utils.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

namespace JBZoo\CsvBlueprint;

use JBZoo\Utils\Cli;
use JBZoo\Utils\Env;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Finder\SplFileInfo;
Expand Down Expand Up @@ -114,4 +115,22 @@ public static function isGithubActions(): bool
{
return self::isDocker() && Env::bool('GITHUB_ACTIONS');
}

public static function autoDetectTerminalWidth(): int
{
static $maxAutoDetected; // Execution optimization

if ($maxAutoDetected === null) {
if (self::isGithubActions()) {
$maxAutoDetected = 200; // GitHub Actions has a wide terminal
} elseif (self::isDocker()) {
$maxAutoDetected = 120;
} else {
// Fallback value is 80
$maxAutoDetected = Env::int('COLUMNS_TEST', Cli::getNumberOfColumns());
}
}

return $maxAutoDetected;
}
}
16 changes: 1 addition & 15 deletions src/Validators/ErrorSuite.php
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ private static function getTableSize(): array

// Fallback to 80 if the terminal width cannot be determined.
// env.COLUMNS_TEST usually not defined, so we use it only for testing purposes.
$maxAutoDetected = self::autoDetectTerminalWidth();
$maxAutoDetected = Utils::autoDetectTerminalWidth();

$maxWindowWidth = Vars::limit(
$maxAutoDetected,
Expand All @@ -222,18 +222,4 @@ private static function getTableSize(): array

return $floatingSizes;
}

private static function autoDetectTerminalWidth(): int
{
$maxAutoDetected = Env::int('COLUMNS_TEST', Cli::getNumberOfColumns());
if (Utils::isDocker()) {
$maxAutoDetected = 120;
}

if (Utils::isGithubActions()) {
$maxAutoDetected = 200; // GitHub Actions has a wide terminal
}

return $maxAutoDetected;
}
}
24 changes: 12 additions & 12 deletions tests/Blueprint/RulesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@
use JBZoo\CsvBlueprint\Rules\OnlyUppercase;
use JBZoo\CsvBlueprint\Rules\Precision;
use JBZoo\CsvBlueprint\Rules\Regex;
use JBZoo\CsvBlueprint\Rules\StrEndsWith;
use JBZoo\CsvBlueprint\Rules\StrStartsWith;
use JBZoo\CsvBlueprint\Rules\EndsWith;
use JBZoo\CsvBlueprint\Rules\StartsWith;
use JBZoo\CsvBlueprint\Rules\UsaMarketName;
use JBZoo\CsvBlueprint\Rules\WordCount;
use JBZoo\PHPUnit\PHPUnit;
Expand Down Expand Up @@ -767,46 +767,46 @@ public function testAllMustContain(): void

public function testStrStartsWith(): void
{
$rule = new StrStartsWith('prop', 'a');
$rule = new StartsWith('prop', 'a');
isSame(null, $rule->validate('a'));
isSame(null, $rule->validate('abc'));

isSame(
'"str_starts_with" at line 0, column "prop". Value "" must start with "a".',
'"starts_with" at line 0, column "prop". Value "" must start with "a".',
\strip_tags((string)$rule->validate('')),
);

isSame(
'"str_starts_with" at line 0, column "prop". Value " a" must start with "a".',
'"starts_with" at line 0, column "prop". Value " a" must start with "a".',
\strip_tags((string)$rule->validate(' a')),
);

$rule = new StrStartsWith('prop', '');
$rule = new StartsWith('prop', '');
isSame(
'"str_starts_with" at line 0, column "prop". Rule must contain a prefix value in schema file.',
'"starts_with" at line 0, column "prop". Rule must contain a prefix value in schema file.',
\strip_tags((string)$rule->validate('a ')),
);
}

public function testStrEndsWith(): void
{
$rule = new StrEndsWith('prop', 'a');
$rule = new EndsWith('prop', 'a');
isSame(null, $rule->validate('a'));
isSame(null, $rule->validate('cba'));

isSame(
'"str_ends_with" at line 0, column "prop". Value "" must end with "a".',
'"ends_with" at line 0, column "prop". Value "" must end with "a".',
\strip_tags((string)$rule->validate('')),
);

isSame(
'"str_ends_with" at line 0, column "prop". Value "a " must end with "a".',
'"ends_with" at line 0, column "prop". Value "a " must end with "a".',
\strip_tags((string)$rule->validate('a ')),
);

$rule = new StrEndsWith('prop', '');
$rule = new EndsWith('prop', '');
isSame(
'"str_ends_with" at line 0, column "prop". Rule must contain a suffix value in schema file.',
'"ends_with" at line 0, column "prop". Rule must contain a suffix value in schema file.',
\strip_tags((string)$rule->validate('a ')),
);
}
Expand Down

0 comments on commit ec96c1d

Please sign in to comment.