Skip to content

Commit 0cc7bf4

Browse files
authored
[json_syntax_generator] Add support for public validator methods (#2456)
1 parent a4dd723 commit 0cc7bf4

File tree

5 files changed

+55
-46
lines changed

5 files changed

+55
-46
lines changed

pkgs/hooks/tool/generate_syntax.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ void main(List<String> args) {
6464
'HookOutput',
6565
'LinkOutput',
6666
],
67-
visbleUnionTagValues: ['Asset'],
67+
publicUnionTagValues: ['Asset'],
6868
).analyze();
6969
final textDumpFile = File.fromUri(
7070
packageUri.resolve('../$packageName/lib/src/$packageName/syntax.g.txt'),

pkgs/json_syntax_generator/lib/src/model/property_info.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ class PropertyInfo {
1010
final String name;
1111

1212
/// The Dart validate method name.
13-
String get validateName => '_validate${_ucFirst(name)}';
13+
String get validateName => validatorPrivate
14+
? '_validate${_ucFirst(name)}'
15+
: 'validate${_ucFirst(name)}';
1416

1517
/// The key in the json object for this property.
1618
final String jsonKey;
@@ -35,12 +37,21 @@ class PropertyInfo {
3537
/// meal. See [SchemaAnalyzer.publicSetters].
3638
final bool setterPrivate;
3739

40+
/// Whether the validate method is private.
41+
///
42+
/// By default, the validate methods for individual fields are hidden, only
43+
/// the validate method for all fields is public. However, in some use cases
44+
/// it can be useful to have access to the validators for individual fields.
45+
/// See [SchemaAnalyzer.publicValidators].
46+
final bool validatorPrivate;
47+
3848
PropertyInfo({
3949
required this.name,
4050
required this.jsonKey,
4151
required this.type,
4252
this.isOverride = false,
4353
this.setterPrivate = true,
54+
this.validatorPrivate = true,
4455
});
4556

4657
@override

pkgs/json_syntax_generator/lib/src/parser/schema_analyzer.dart

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import '../model/schema_info.dart';
2929
/// names and types.
3030
/// * Renaming with [nameOverrides].
3131
/// * Whether setters are public or not with [publicSetters].
32-
/// * Output sorting alphabetically or with [classSorting].
3332
class SchemaAnalyzer {
3433
final JsonSchema schema;
3534

@@ -41,18 +40,13 @@ class SchemaAnalyzer {
4140
/// * renames as preferred.
4241
final Map<String, String> nameOverrides;
4342

44-
/// Optional custom ordering for the output classes.
45-
///
46-
/// If `null`, then classes are sorted alphabetically.
47-
final List<String>? classSorting;
48-
4943
/// Generate public setters for these class names.
5044
final List<String> publicSetters;
5145

5246
/// For subtypes of these classes, the union tag values are exposed.
5347
///
5448
/// For example, if `Asset.type` is `NativeCodeAsset.typeValue`, then the
55-
/// asset is a native code asset. Listing `Asset` in [visbleUnionTagValues]
49+
/// asset is a native code asset. Listing `Asset` in [publicUnionTagValues]
5650
/// will add `static const typeValue = 'code_assets/code';`:
5751
///
5852
/// ```dart
@@ -64,14 +58,19 @@ class SchemaAnalyzer {
6458
/// String? get type => _reader.get<String?>('type');
6559
/// }
6660
/// ```
67-
final List<String> visbleUnionTagValues;
61+
final List<String> publicUnionTagValues;
62+
63+
/// Generate public validate methods for these classes.
64+
///
65+
/// This enables validating individual fields.
66+
final List<String> publicValidators;
6867

6968
SchemaAnalyzer(
7069
this.schema, {
7170
this.nameOverrides = const {},
72-
this.classSorting,
7371
this.publicSetters = const [],
74-
this.visbleUnionTagValues = const [],
72+
this.publicUnionTagValues = const [],
73+
this.publicValidators = const [],
7574
});
7675

7776
/// Accumulator for all classes during the analysis.
@@ -93,11 +92,7 @@ class SchemaAnalyzer {
9392
_analyzeClass(definitionSchemas, name: definitionKey);
9493
}
9594
}
96-
if (classSorting != null) {
97-
_classes.sortOnKey(keysSorted: classSorting);
98-
} else {
99-
_classes.sortOnKey();
100-
}
95+
_classes.sortOnKey();
10196
return SchemaInfo(classes: _classes.values.toList());
10297
}
10398

@@ -145,6 +140,7 @@ class SchemaAnalyzer {
145140
}
146141
final propertyKeys = schemas.propertyKeys;
147142
final settersPrivate = !publicSetters.contains(typeName);
143+
final validatorsPrivate = !publicValidators.contains(typeName);
148144

149145
for (final propertyKey in propertyKeys) {
150146
if (propertyKey == r'$schema') continue;
@@ -168,6 +164,7 @@ class SchemaAnalyzer {
168164
type: dartType,
169165
isOverride: isOverride,
170166
setterPrivate: settersPrivate,
167+
validatorPrivate: validatorsPrivate,
171168
),
172169
);
173170
}
@@ -183,7 +180,7 @@ class SchemaAnalyzer {
183180
taggedUnionProperty: schemas.generateSubClasses
184181
? schemas.generateSubClassesKey!
185182
: null,
186-
visibleTaggedUnion: visbleUnionTagValues.contains(typeName),
183+
visibleTaggedUnion: publicUnionTagValues.contains(typeName),
187184
extraValidation: extraValidation,
188185
);
189186
_classes[typeName] = classInfo;

pkgs/pub_formats/lib/src/pubspec_syntax.g.dart

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
353353
json.sortOnKey();
354354
}
355355

356-
List<String> _validateDependencies() {
356+
List<String> validateDependencies() {
357357
final mapErrors = _reader.validateOptionalMap(
358358
'dependencies',
359359
keyPattern: _dependenciesKeyPattern,
@@ -403,7 +403,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
403403
json.sortOnKey();
404404
}
405405

406-
List<String> _validateDependencyOverrides() {
406+
List<String> validateDependencyOverrides() {
407407
final mapErrors = _reader.validateOptionalMap(
408408
'dependency_overrides',
409409
keyPattern: _dependencyOverridesKeyPattern,
@@ -429,7 +429,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
429429
json.sortOnKey();
430430
}
431431

432-
List<String> _validateDescription() =>
432+
List<String> validateDescription() =>
433433
_reader.validate<String?>('description');
434434

435435
static final _devDependenciesKeyPattern = RegExp(r'^[a-zA-Z_]\w*$');
@@ -463,7 +463,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
463463
json.sortOnKey();
464464
}
465465

466-
List<String> _validateDevDependencies() {
466+
List<String> validateDevDependencies() {
467467
final mapErrors = _reader.validateOptionalMap(
468468
'dev_dependencies',
469469
keyPattern: _devDependenciesKeyPattern,
@@ -489,7 +489,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
489489
json.sortOnKey();
490490
}
491491

492-
List<String> _validateDocumentation() =>
492+
List<String> validateDocumentation() =>
493493
_reader.validate<String?>('documentation');
494494

495495
EnvironmentSyntax get environment {
@@ -505,7 +505,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
505505
json.sortOnKey();
506506
}
507507

508-
List<String> _validateEnvironment() {
508+
List<String> validateEnvironment() {
509509
final mapErrors = _reader.validate<Map<String, Object?>>('environment');
510510
if (mapErrors.isNotEmpty) {
511511
return mapErrors;
@@ -546,7 +546,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
546546
json.sortOnKey();
547547
}
548548

549-
List<String> _validateExecutables() {
549+
List<String> validateExecutables() {
550550
final mapErrors = _reader.validateOptionalMap<String?>(
551551
'executables',
552552
keyPattern: _executablesKeyPattern,
@@ -572,7 +572,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
572572
json.sortOnKey();
573573
}
574574

575-
List<String> _validateHomepage() => _reader.validate<String?>('homepage');
575+
List<String> validateHomepage() => _reader.validate<String?>('homepage');
576576

577577
HooksSyntax? get hooks {
578578
final jsonValue = _reader.optionalMap('hooks');
@@ -585,7 +585,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
585585
json.sortOnKey();
586586
}
587587

588-
List<String> _validateHooks() {
588+
List<String> validateHooks() {
589589
final mapErrors = _reader.validate<Map<String, Object?>?>('hooks');
590590
if (mapErrors.isNotEmpty) {
591591
return mapErrors;
@@ -600,7 +600,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
600600
json.sortOnKey();
601601
}
602602

603-
List<String> _validateIssueTracker() =>
603+
List<String> validateIssueTracker() =>
604604
_reader.validate<String?>('issue_tracker');
605605

606606
static final _namePattern = RegExp(r'^[a-zA-Z_]\w*$');
@@ -619,7 +619,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
619619
json.sortOnKey();
620620
}
621621

622-
List<String> _validateName() => _reader.validateString('name', _namePattern);
622+
List<String> validateName() => _reader.validateString('name', _namePattern);
623623

624624
String? get publishTo => _reader.get<String?>('publish_to');
625625

@@ -628,7 +628,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
628628
json.sortOnKey();
629629
}
630630

631-
List<String> _validatePublishTo() => _reader.validate<String?>('publish_to');
631+
List<String> validatePublishTo() => _reader.validate<String?>('publish_to');
632632

633633
String? get repository => _reader.get<String?>('repository');
634634

@@ -637,7 +637,7 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
637637
json.sortOnKey();
638638
}
639639

640-
List<String> _validateRepository() => _reader.validate<String?>('repository');
640+
List<String> validateRepository() => _reader.validate<String?>('repository');
641641

642642
static final _versionPattern = RegExp(
643643
r'^[0-9]+\.[0-9]+\.[0-9]+(?:-[a-zA-Z0-9.]+)?(?:\+[a-zA-Z0-9.]+)?$',
@@ -657,26 +657,26 @@ class PubspecYamlFileSyntax extends JsonObjectSyntax {
657657
json.sortOnKey();
658658
}
659659

660-
List<String> _validateVersion() =>
660+
List<String> validateVersion() =>
661661
_reader.validateOptionalString('version', _versionPattern);
662662

663663
@override
664664
List<String> validate() => [
665665
...super.validate(),
666-
..._validateDependencies(),
667-
..._validateDependencyOverrides(),
668-
..._validateDescription(),
669-
..._validateDevDependencies(),
670-
..._validateDocumentation(),
671-
..._validateEnvironment(),
672-
..._validateExecutables(),
673-
..._validateHomepage(),
674-
..._validateHooks(),
675-
..._validateIssueTracker(),
676-
..._validateName(),
677-
..._validatePublishTo(),
678-
..._validateRepository(),
679-
..._validateVersion(),
666+
...validateDependencies(),
667+
...validateDependencyOverrides(),
668+
...validateDescription(),
669+
...validateDevDependencies(),
670+
...validateDocumentation(),
671+
...validateEnvironment(),
672+
...validateExecutables(),
673+
...validateHomepage(),
674+
...validateHooks(),
675+
...validateIssueTracker(),
676+
...validateName(),
677+
...validatePublishTo(),
678+
...validateRepository(),
679+
...validateVersion(),
680680
];
681681

682682
@override

pkgs/pub_formats/tool/generate.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ void main(List<String> args) {
4444
schema,
4545
nameOverrides: {'path': 'path\$'},
4646
publicSetters: ['PubspecYamlFile'],
47+
publicValidators: ['PubspecYamlFile'],
4748
).analyze();
4849
final textDumpFile = File.fromUri(
4950
packageRoot.resolve('lib/src/${name}_syntax.g.txt'),

0 commit comments

Comments
 (0)