Skip to content

Commit 6e9f120

Browse files
authored
Merge pull request #132 from mringler/strict_types_on_models
Strict types on models and CI for TableMaps
2 parents 35cc7f4 + be87294 commit 6e9f120

File tree

101 files changed

+2174
-1440
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+2174
-1440
lines changed

.github/workflows/ci.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,17 +154,19 @@ jobs:
154154
strategy:
155155
fail-fast: false
156156
matrix:
157-
type: ['query', 'model']
157+
type: ['query', 'model', 'tableMap']
158158
check: ['PHPCS', 'Stan']
159159
include:
160160
- check: PHPCS
161161
command: 'cs-check -- --exclude=SlevomatCodingStandard.TypeHints.DeclareStrictTypes'
162162
- check: Stan
163163
command: 'stan -- -a autoload.php.dist'
164164
- type: query
165-
file-pattern: '*Query.php'
165+
file-pattern: 'Base/*Query.php'
166166
- type: model
167-
file-pattern: '*[^Query].php'
167+
file-pattern: 'Base/*[^Query].php'
168+
- type: tableMap
169+
file-pattern: 'Map/*TableMap.php'
168170
name: '${{ matrix.check }} on ${{ matrix.type }} code'
169171
steps:
170172
- uses: actions/checkout@v3
@@ -177,4 +179,4 @@ jobs:
177179
- name: Run checks on generated code
178180
run: |
179181
bin/perpl test:prepare --vendor=sqlite --dsn='sqlite:/tmp/perpl.sq3' --exclude-database \
180-
&& composer ${{ matrix.command }} tests/Fixtures/bookstore/build/classes/Propel/Tests/Bookstore/Base/${{ matrix.file-pattern }}
182+
&& composer ${{ matrix.command }} tests/Fixtures/bookstore/build/classes/Propel/Tests/Bookstore/${{ matrix.file-pattern }}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ tests/Fixtures/namespaced/propel.yaml
2727

2828
tests/Fixtures/schemas/propel.yaml
2929

30+
tests/Fixtures/instance-pool/build/
31+
tests/Fixtures/instance-pool/propel.yaml
32+
3033
tests/Fixtures/reverse/mysql/build/
3134
tests/Fixtures/reverse/mysql/propel.yaml
3235

autoload.php.dist

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ if (file_exists($file = __DIR__.'/vendor/autoload.php')) {
99
__DIR__ . '/tests',
1010
__DIR__ . '/tests/Fixtures/bookstore/build/classes',
1111
__DIR__ . '/tests/Fixtures/schemas/build/classes',
12-
__DIR__ . '/tests/Fixtures/quoting/build/classes'
12+
__DIR__ . '/tests/Fixtures/quoting/build/classes',
13+
__DIR__ . '/tests/Fixtures/instance-pool/build/classes',
1314
));
1415
$loader->add('Propel\Tests\Fixtures', __DIR__ . '/tests/Fixtures/classes');
1516
$loader->register();

phpstan-baseline.neon

Lines changed: 0 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

psalm-baseline.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<files psalm-version="6.13.1@1e3b7f0a8ab32b23197b91107adc0a7ed8a05b51">
2+
<files psalm-version="6.16.1@f1f5de594dc76faf8784e02d3dc4716c91c6f6ac">
33
<file src="src/Propel/Common/Config/ConfigurationManager.php">
44
<UnsupportedPropertyReferenceUsage>
55
<code><![CDATA[$configSection = &$this->config[$section]]]></code>
@@ -90,6 +90,14 @@
9090
<code><![CDATA[$table->getColumn($columnName)]]></code>
9191
</NullableReturnStatement>
9292
</file>
93+
<file src="src/Propel/Generator/Builder/Om/InstancePoolCodeProducer/InstancePoolCodeProducer.php">
94+
<ParadoxicalCondition>
95+
<code><![CDATA[$col->isLobType(),
96+
$col->isPhpObjectType() => "is_callable([$varName, '__toString']) ? (string)$varName : $varName"]]></code>
97+
<code><![CDATA[$col->isNumericType(),
98+
$col->isPhpPrimitiveNumericType() => "(string)$varName"]]></code>
99+
</ParadoxicalCondition>
100+
</file>
93101
<file src="src/Propel/Generator/Builder/Util/SchemaReader.php">
94102
<UnsupportedPropertyReferenceUsage>
95103
<code><![CDATA[$items = &$this->currParameterListCollector['value']]]></code>

src/Propel/Common/Config/PropelConfiguration.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,21 @@ protected function addPathsSection(ArrayNodeDefinition $node): void
7373
->arrayNode('paths')
7474
->addDefaultsIfNotSet()
7575
->children()
76+
// optional variable
7677
->scalarNode('projectDir')->defaultValue('.')->end()
78+
// location of schema.xml
7779
->scalarNode('schemaDir')->defaultValue('.')->end()
80+
// default value for commands with --output-dir parameter
7881
->scalarNode('outputDir')->defaultValue('.')->end()
82+
// generated classes base (root of namespace)
7983
->scalarNode('phpDir')->defaultValue('./generated-classes')->end()
84+
// generated config files (config:convert, loader script from model:build)
8085
->scalarNode('phpConfDir')->defaultValue('./generated-conf')->end()
86+
// table loader file (defaults to phpConfDir)
8187
->scalarNode('loaderScriptDir')->end()
88+
// DB initialization scripts (sql:insert & user generated)
8289
->scalarNode('sqlDir')->defaultValue('./generated-sql')->end()
90+
// target for migration files
8391
->scalarNode('migrationDir')->defaultValue('./generated-migrations')->end()
8492
->scalarNode('composerDir')->defaultNull()->end()
8593
->end()
@@ -354,6 +362,7 @@ protected function addGeneratorSection(ArrayNodeDefinition $node): void
354362
->booleanNode('packageObjectModel')->defaultTrue()->end()
355363
->booleanNode('namespaceAutoPackage')->defaultTrue()->end()
356364
->booleanNode('recursive')->defaultFalse()->end()
365+
->booleanNode('declareStrictTypesInBuilders')->defaultFalse()->end() // optional, as it might break user-written behaviors
357366
->booleanNode('defaultToNativeEnumeratedColumnTypes')->defaultFalse()->end()
358367
->arrayNode('connections')
359368
->prototype('scalar')->end()

src/Propel/Generator/Behavior/I18n/I18nBehaviorObjectBuilderModifier.php

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66

77
use Propel\Generator\Builder\Om\ObjectBuilder;
88
use Propel\Generator\Model\Column;
9-
use Propel\Generator\Model\PropelTypes;
10-
use function in_array;
119
use function preg_match;
1210
use function preg_replace;
1311
use function ucfirst;
@@ -286,19 +284,4 @@ public function objectFilter(string &$script, ObjectBuilder $builder): void
286284
$replacement = "\$0$addition";
287285
$script = preg_replace($pattern, $replacement, $script);
288286
}
289-
290-
/**
291-
* @param string $columnType
292-
*
293-
* @return bool
294-
*/
295-
protected function isDateType(string $columnType): bool
296-
{
297-
return in_array($columnType, [
298-
PropelTypes::DATE,
299-
PropelTypes::DATETIME,
300-
PropelTypes::TIME,
301-
PropelTypes::TIMESTAMP,
302-
], true);
303-
}
304287
}

src/Propel/Generator/Behavior/NestedSet/NestedSetBehaviorQueryBuilderModifier.php

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1050,17 +1050,13 @@ static public function fixLevels(" . ($useScope ? '$scope, ' : '') . "?Connectio
10501050
$script .= "
10511051
// class must be set each time from the record row
10521052
\$cls = $tableMapClassName::getOMClass(\$row, 0);
1053-
\$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1);
1054-
" . $this->builder->buildObjectInstanceCreationCode('$obj', '$cls') . "
1055-
\$obj->hydrate(\$row);
1056-
$tableMapClassName::addInstanceToPool(\$obj, \$key);";
1057-
} else {
1058-
$script .= "
1059-
" . $this->builder->buildObjectInstanceCreationCode('$obj', '$cls') . "
1060-
\$obj->hydrate(\$row);
1061-
$tableMapClassName::addInstanceToPool(\$obj, \$key);";
1053+
\$cls = substr('.'.\$cls, strrpos('.'.\$cls, '.') + 1);";
10621054
}
10631055
$script .= "
1056+
\$obj = new \$cls();
1057+
\$obj->hydrate(\$row);
1058+
$tableMapClassName::addInstanceToPool(\$obj, \$key);
1059+
10641060
}
10651061
10661062
// compute level

src/Propel/Generator/Behavior/OutputGroup/OgObjectModifier.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ protected function getTemporalColumnIndexesByFormatter(ObjectBuilder $builder):
5252
if (!$col->isTemporalType()) {
5353
continue;
5454
}
55-
$formatter = $builder->getTemporalFormatter($col);
55+
$formatter = $builder->getPlatformOrFail()->getTemporalFormatter($col);
5656
$temporalColumnIndexesByFormatter[$formatter][] = $num;
5757
}
5858

src/Propel/Generator/Behavior/Sluggable/SluggableBehavior.php

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,12 @@ protected function createSlug(): string
221221
protected function addCreateRawSlug(string &$script): void
222222
{
223223
$pattern = $this->getParameter('slug_pattern');
224+
if (!$pattern) {
225+
$returnStatement = '$this->cleanupSlugPart($this->__toString())';
226+
} else {
227+
$getter = str_replace(['{', '}'], ['\' . $this->cleanupSlugPart((string)$this->get', '()) . \''], $pattern);
228+
$returnStatement = "'$getter'";
229+
}
224230
$script .= "
225231
/**
226232
* Create the slug from the appropriate columns
@@ -229,13 +235,7 @@ protected function addCreateRawSlug(string &$script): void
229235
*/
230236
protected function createRawSlug(): string
231237
{
232-
";
233-
if ($pattern) {
234-
$script .= "return '" . str_replace(['{', '}'], ['\' . $this->cleanupSlugPart((string)$this->get', '()) . \''], $pattern) . "';";
235-
} else {
236-
$script .= 'return $this->cleanupSlugPart($this->__toString());';
237-
}
238-
$script .= "
238+
return $returnStatement;
239239
}
240240
";
241241
}
@@ -247,6 +247,8 @@ protected function createRawSlug(): string
247247
*/
248248
public function addCleanupSlugPart(string &$script): void
249249
{
250+
$this->builder->declareGlobalFunction('setlocale', 'str_replace', 'preg_replace', 'trim', 'strtolower');
251+
$this->builder->declareGlobalConstant('LC_CTYPE');
250252
$script .= "
251253
/**
252254
* Cleanup a string to make a slug of it
@@ -259,7 +261,7 @@ public function addCleanupSlugPart(string &$script): void
259261
protected static function cleanupSlugPart(string \$slug, string \$replacement = '" . $this->getParameter('replacement') . "'): string
260262
{
261263
// set locale explicitly
262-
\$localeOrigin = setlocale(LC_CTYPE, 0);
264+
\$localeOrigin = setlocale(LC_CTYPE, '0');
263265
setlocale(LC_CTYPE, 'C.UTF-8');
264266
265267
// transliterate
@@ -268,28 +270,19 @@ protected static function cleanupSlugPart(string \$slug, string \$replacement =
268270
}
269271
270272
// lowercase
271-
if (function_exists('mb_strtolower')) {
272-
\$slug = mb_strtolower(\$slug);
273-
} else {
274-
\$slug = strtolower(\$slug);
275-
}
273+
\$slug = function_exists('mb_strtolower') ? mb_strtolower(\$slug) : strtolower(\$slug);
276274
277275
// remove accents resulting from OSX's iconv
278276
\$slug = str_replace(array('\'', '`', '^'), '', \$slug);
279277
280278
// replace non letter or digits with separator
281279
\$slug = preg_replace('" . $this->getParameter('replace_pattern') . "', \$replacement, \$slug);
282280
283-
// trim
284281
\$slug = trim(\$slug, \$replacement);
285282
286283
setlocale(LC_CTYPE, \$localeOrigin);
287284
288-
if (empty(\$slug)) {
289-
return 'n-a';
290-
}
291-
292-
return \$slug;
285+
return empty(\$slug) ? 'n-a' : \$slug;
293286
}
294287
";
295288
}

0 commit comments

Comments
 (0)