From 2f393a743c34b10cce5a186cf1df3ce40bbdb0fd Mon Sep 17 00:00:00 2001 From: Nikolas Rimikis Date: Sat, 4 Nov 2023 14:13:31 +0100 Subject: [PATCH] feat(dynamite): allow per spec configuration Signed-off-by: Nikolas Rimikis --- packages/dynamite/dynamite/README.md | 5 ++ .../src/models/dynamite_config/config.dart | 50 +++++++++++++++++++ .../src/models/dynamite_config/config.g.dart | 37 ++++++++++++-- .../dynamite/lib/src/openapi_builder.dart | 17 ++++--- 4 files changed, 96 insertions(+), 13 deletions(-) diff --git a/packages/dynamite/dynamite/README.md b/packages/dynamite/dynamite/README.md index 020c3afb7df..66bf01236c6 100644 --- a/packages/dynamite/dynamite/README.md +++ b/packages/dynamite/dynamite/README.md @@ -53,6 +53,11 @@ targets: - 'factory .*\.fromJson\(Map json\) => jsonSerializers\.deserializeWith\(serializer, json\)!;' - 'Map toJson\(\) => jsonSerializers\.serializeWith\(serializer, this\)! as Map;' - 'static BuiltSet<.*> get values => _\$.*Values;' + overrides: + # Tighten linting rules for specific specs + lib/my_spec.openapi.json: + analyzer_ignores: + - camel_case_types ``` diff --git a/packages/dynamite/dynamite/lib/src/models/dynamite_config/config.dart b/packages/dynamite/dynamite/lib/src/models/dynamite_config/config.dart index 6c6439087e4..0062a23f760 100644 --- a/packages/dynamite/dynamite/lib/src/models/dynamite_config/config.dart +++ b/packages/dynamite/dynamite/lib/src/models/dynamite_config/config.dart @@ -33,6 +33,56 @@ abstract class DynamiteConfig implements Built? get overrides; + + /// Gets the config for the given [uri]. + /// + /// Returns this if no override is set. + DynamiteConfig configFor(final String uri) { + if (overrides == null) { + return this; + } + + DynamiteConfig? override; + for (final entry in overrides!.entries) { + if (RegExp(entry.key).hasMatch(uri)) { + override = entry.value; + break; + } + } + + if (override == null) { + return this; + } + + return merge(override); + } + + /// Merges `this` config with the given [override]. + /// + /// Throws a [ArgumentError] if the override has overrides itself. + DynamiteConfig merge(final DynamiteConfig other) { + if (other.overrides != null) { + throw ArgumentError('Configs can only be merged with a config that does not have further overrides'); + } + + return rebuild((final b) { + final analyzerIgnores = other.analyzerIgnores; + if (analyzerIgnores != null) { + b.analyzerIgnores.replace(analyzerIgnores); + } + + final coverageIgnores = other.coverageIgnores; + if (coverageIgnores != null) { + b.coverageIgnores.replace(coverageIgnores); + } + }); + } } @SerializersFor([ diff --git a/packages/dynamite/dynamite/lib/src/models/dynamite_config/config.g.dart b/packages/dynamite/dynamite/lib/src/models/dynamite_config/config.g.dart index 0903b8d2fc2..21a1c259ea0 100644 --- a/packages/dynamite/dynamite/lib/src/models/dynamite_config/config.g.dart +++ b/packages/dynamite/dynamite/lib/src/models/dynamite_config/config.g.dart @@ -9,7 +9,9 @@ part of 'config.dart'; Serializers _$_serializers = (Serializers().toBuilder() ..add(DynamiteConfig.serializer) ..addBuilderFactory(const FullType(BuiltSet, [FullType(String)]), () => SetBuilder()) - ..addBuilderFactory(const FullType(BuiltSet, [FullType(String)]), () => SetBuilder())) + ..addBuilderFactory(const FullType(BuiltSet, [FullType(String)]), () => SetBuilder()) + ..addBuilderFactory(const FullType(BuiltMap, [FullType(String), FullType(DynamiteConfig)]), + () => MapBuilder())) .build(); Serializer _$dynamiteConfigSerializer = _$DynamiteConfigSerializer(); @@ -42,6 +44,13 @@ class _$DynamiteConfigSerializer implements StructuredSerializer ..add('pageWidth') ..add(serializers.serialize(value, specifiedType: const FullType(int))); } + value = object.overrides; + if (value != null) { + result + ..add('overrides') + ..add(serializers.serialize(value, + specifiedType: const FullType(BuiltMap, [FullType(String), FullType(DynamiteConfig)]))); + } return result; } @@ -67,6 +76,10 @@ class _$DynamiteConfigSerializer implements StructuredSerializer case 'pageWidth': result.pageWidth = serializers.deserialize(value, specifiedType: const FullType(int)) as int?; break; + case 'overrides': + result.overrides.replace(serializers.deserialize(value, + specifiedType: const FullType(BuiltMap, [FullType(String), FullType(DynamiteConfig)]))!); + break; } } @@ -81,11 +94,13 @@ class _$DynamiteConfig extends DynamiteConfig { final BuiltSet? coverageIgnores; @override final int? pageWidth; + @override + final BuiltMap? overrides; factory _$DynamiteConfig([void Function(DynamiteConfigBuilder)? updates]) => (DynamiteConfigBuilder()..update(updates))._build(); - _$DynamiteConfig._({this.analyzerIgnores, this.coverageIgnores, this.pageWidth}) : super._(); + _$DynamiteConfig._({this.analyzerIgnores, this.coverageIgnores, this.pageWidth, this.overrides}) : super._(); @override DynamiteConfig rebuild(void Function(DynamiteConfigBuilder) updates) => (toBuilder()..update(updates)).build(); @@ -99,7 +114,8 @@ class _$DynamiteConfig extends DynamiteConfig { return other is DynamiteConfig && analyzerIgnores == other.analyzerIgnores && coverageIgnores == other.coverageIgnores && - pageWidth == other.pageWidth; + pageWidth == other.pageWidth && + overrides == other.overrides; } @override @@ -108,6 +124,7 @@ class _$DynamiteConfig extends DynamiteConfig { _$hash = $jc(_$hash, analyzerIgnores.hashCode); _$hash = $jc(_$hash, coverageIgnores.hashCode); _$hash = $jc(_$hash, pageWidth.hashCode); + _$hash = $jc(_$hash, overrides.hashCode); _$hash = $jf(_$hash); return _$hash; } @@ -117,7 +134,8 @@ class _$DynamiteConfig extends DynamiteConfig { return (newBuiltValueToStringHelper(r'DynamiteConfig') ..add('analyzerIgnores', analyzerIgnores) ..add('coverageIgnores', coverageIgnores) - ..add('pageWidth', pageWidth)) + ..add('pageWidth', pageWidth) + ..add('overrides', overrides)) .toString(); } } @@ -137,6 +155,10 @@ class DynamiteConfigBuilder implements Builder _$this._pageWidth; set pageWidth(int? pageWidth) => _$this._pageWidth = pageWidth; + MapBuilder? _overrides; + MapBuilder get overrides => _$this._overrides ??= MapBuilder(); + set overrides(MapBuilder? overrides) => _$this._overrides = overrides; + DynamiteConfigBuilder(); DynamiteConfigBuilder get _$this { @@ -145,6 +167,7 @@ class DynamiteConfigBuilder implements Builder openapi.serializers.deserializeWith( openapi.OpenAPI.serializer, @@ -76,7 +76,8 @@ class OpenAPIBuilder implements Builder { throw Exception('Only OpenAPI between $minSupportedVersion and $maxSupportedVersion are supported.'); } - final state = State(buildConfig); + final config = buildConfig.configFor(inputId.path); + final state = State(config); // Imports need to be generated after everything else so we know if we need the local part directive, // but they need to be added to the beginning of the output.