Skip to content

Commit c2ebe74

Browse files
committed
Column starting with a digit (#184): fix
1 parent 8173516 commit c2ebe74

File tree

7 files changed

+51
-14
lines changed

7 files changed

+51
-14
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@
3838
"ext-PDO": "*",
3939
"ext-json": "*",
4040
"ext-hash": "*",
41-
"ext-filter": "*"
41+
"ext-filter": "*",
42+
"ext-intl": "*"
4243
},
4344
"require-dev" : {
4445
"phpunit/phpunit": "^7.4.4 || ^8.0.0",

src/Utils/AbstractBeanPropertyDescriptor.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ public function getVariableName(): string
7575
return $this->namingStrategy->getVariableName($this);
7676
}
7777

78+
public function getSafeVariableName(): string
79+
{
80+
return '$' . StringUtils::getValidVariableName(ltrim($this->getVariableName(), '$'));
81+
}
82+
7883
public function getSetterName(): string
7984
{
8085
return $this->namingStrategy->getSetterName($this);
@@ -102,7 +107,7 @@ public function getConstructorAssignCode(): string
102107
{
103108
$str = '$this->%s(%s);';
104109

105-
return sprintf($str, $this->getSetterName(), $this->getVariableName());
110+
return sprintf($str, $this->getSetterName(), $this->getSafeVariableName());
106111
}
107112

108113
/**

src/Utils/BeanDescriptor.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ private function generateBeanConstructor() : MethodGenerator
363363
$parentConstructorArguments = [];
364364

365365
foreach ($constructorProperties as $property) {
366-
$parameter = new ParameterGenerator(ltrim($property->getVariableName(), '$'));
366+
$parameter = new ParameterGenerator(ltrim($property->getSafeVariableName(), '$'));
367367
if ($property->isTypeHintable()) {
368368
$parameter->setType($property->getPhpType());
369369
}
@@ -374,7 +374,7 @@ private function generateBeanConstructor() : MethodGenerator
374374
if ($property->getTable()->getName() === $this->table->getName()) {
375375
$assigns[] = $property->getConstructorAssignCode()."\n";
376376
} else {
377-
$parentConstructorArguments[] = $property->getVariableName();
377+
$parentConstructorArguments[] = $property->getSafeVariableName();
378378
}
379379
}
380380

@@ -1252,7 +1252,7 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
12521252
$first = true;
12531253
/** @var AbstractBeanPropertyDescriptor $element */
12541254
foreach ($elements as $element) {
1255-
$parameter = new ParameterGenerator(ltrim($element->getVariableName(), '$'));
1255+
$parameter = new ParameterGenerator(ltrim($element->getSafeVariableName(), '$'));
12561256
if (!$first && !($element->isCompulsory() && $index->isUnique())) {
12571257
$parameterType = '?';
12581258
//$functionParameter = '?';
@@ -1291,7 +1291,7 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
12911291
foreach ($elements as $element) {
12921292
$params[] = $element->getParamAnnotation();
12931293
if ($element instanceof ScalarBeanPropertyDescriptor) {
1294-
$filterArrayCode .= ' '.var_export($element->getColumnName(), true).' => '.$element->getVariableName().",\n";
1294+
$filterArrayCode .= ' '.var_export($element->getColumnName(), true).' => '.$element->getSafeVariableName().",\n";
12951295
} elseif ($element instanceof ObjectBeanPropertyDescriptor) {
12961296
$foreignKey = $element->getForeignKey();
12971297
$columns = SafeFunctions::arrayCombine($foreignKey->getLocalColumns(), $foreignKey->getForeignColumns());
@@ -1302,14 +1302,14 @@ private function generateFindByDaoCodeForIndex(Index $index, string $beanNamespa
13021302
$targetedElement = new ScalarBeanPropertyDescriptor($foreignTable, $foreignTable->getColumn($foreignColumn), $this->namingStrategy, $this->annotationParser);
13031303
if ($first || $element->isCompulsory() && $index->isUnique()) {
13041304
// First parameter for index is not nullable
1305-
$filterArrayCode .= ' '.var_export($localColumn, true).' => '.$element->getVariableName().'->'.$targetedElement->getGetterName()."(),\n";
1305+
$filterArrayCode .= ' '.var_export($localColumn, true).' => '.$element->getSafeVariableName().'->'.$targetedElement->getGetterName()."(),\n";
13061306
} else {
13071307
// Other parameters for index is not nullable
1308-
$filterArrayCode .= ' '.var_export($localColumn, true).' => ('.$element->getVariableName().' !== null) ? '.$element->getVariableName().'->'.$targetedElement->getGetterName()."() : null,\n";
1308+
$filterArrayCode .= ' '.var_export($localColumn, true).' => ('.$element->getSafeVariableName().' !== null) ? '.$element->getSafeVariableName().'->'.$targetedElement->getGetterName()."() : null,\n";
13091309
}
13101310
}
13111311
}
1312-
$commentArguments[] = substr($element->getVariableName(), 1);
1312+
$commentArguments[] = substr($element->getSafeVariableName(), 1);
13131313
if ($first) {
13141314
$first = false;
13151315
}

src/Utils/ScalarBeanPropertyDescriptor.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ public function getGetterSetterCode(): array
205205

206206
$columnGetterName = $this->getGetterName();
207207
$columnSetterName = $this->getSetterName();
208+
$variableName = ltrim($this->getSafeVariableName(), '$');
208209

209210
// A column type can be forced if it is not nullable and not auto-incrementable (for auto-increment columns, we can get "null" as long as the bean is not saved).
210211
$isNullable = !$this->column->getNotnull() || $this->isAutoincrement();
@@ -220,7 +221,7 @@ public function getGetterSetterCode(): array
220221
throw \TheCodingMachine\TDBM\TDBMInvalidArgumentException::badType('resource', $%s, __METHOD__);
221222
}
222223
EOF;
223-
$resourceTypeCheck = sprintf($resourceTypeCheck, $checkNullable, $this->column->getName(), $this->column->getName());
224+
$resourceTypeCheck = sprintf($resourceTypeCheck, $checkNullable, $variableName, $variableName);
224225
}
225226

226227
$types = [ $normalizedType ];
@@ -251,10 +252,10 @@ public function getGetterSetterCode(): array
251252

252253
$setter = new MethodGenerator($columnSetterName);
253254
$setterDocBlock = new DocBlockGenerator(sprintf('The setter for the "%s" column.', $this->column->getName()));
254-
$setterDocBlock->setTag(new ParamTag($this->column->getName(), $types))->setWordWrap(false);
255+
$setterDocBlock->setTag(new ParamTag($variableName, $types))->setWordWrap(false);
255256
$setter->setDocBlock($setterDocBlock);
256257

257-
$parameter = new ParameterGenerator($this->column->getName(), $paramType);
258+
$parameter = new ParameterGenerator($variableName, $paramType);
258259
$setter->setParameter($parameter);
259260
$setter->setReturnType('void');
260261

@@ -263,7 +264,7 @@ public function getGetterSetterCode(): array
263264
$this->set(%s, $%s, %s);',
264265
$resourceTypeCheck,
265266
var_export($this->column->getName(), true),
266-
$this->column->getName(),
267+
$variableName,
267268
var_export($this->table->getName(), true)
268269
));
269270

src/Utils/StringUtils.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace TheCodingMachine\TDBM\Utils;
4+
5+
class StringUtils
6+
{
7+
public static function getValidVariableName(string $variableName): string
8+
{
9+
return preg_replace_callback('/^(\d+)/', static function (array $match) {
10+
$f = new \NumberFormatter('en', \NumberFormatter::SPELLOUT);
11+
$number = $f->format((int) $match[0]);
12+
return preg_replace('/[^a-z]+/i', '_', $number);
13+
}, $variableName);
14+
}
15+
}

tests/TDBMDaoGeneratorTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2161,7 +2161,7 @@ public function testLazyStopRecursionOnCompositeForeignKey(): void
21612161
$this->assertEquals(1, $json['compositeFkTarget']['id2']);
21622162
}
21632163

2164-
public function testMethodNameConflictsBetweenRegularAndAutoPivotProperties()
2164+
public function testMethodNameConflictsBetweenRegularAndAutoPivotProperties(): void
21652165
{
21662166
$artist = new ArtistBean('Super');
21672167
$artist->getChildren(); // regular property

tests/Utils/StringUtilsTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Test\Utils;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use TheCodingMachine\TDBM\Utils\StringUtils;
7+
8+
class StringUtilsTest extends TestCase
9+
{
10+
public function testGetValidVariableName(): void
11+
{
12+
$this->assertEquals('threed_view', StringUtils::getValidVariableName('3d_view'));
13+
$this->assertEquals('one_thousand_four_hundred_thirty_two_var_1432_test', StringUtils::getValidVariableName('1432_var_1432_test'));
14+
}
15+
}

0 commit comments

Comments
 (0)