Browse Source

feat(dynamite): allow per spec configuration

Signed-off-by: Nikolas Rimikis <leptopoda@users.noreply.github.com>
pull/1174/head
Nikolas Rimikis 1 year ago
parent
commit
a758d6ada5
No known key found for this signature in database
GPG Key ID: 85ED1DE9786A4FF2
  1. 5
      packages/dynamite/dynamite/README.md
  2. 60
      packages/dynamite/dynamite/lib/src/models/dynamite_config/config.dart
  3. 65
      packages/dynamite/dynamite/lib/src/models/dynamite_config/config.g.dart
  4. 17
      packages/dynamite/dynamite/lib/src/openapi_builder.dart

5
packages/dynamite/dynamite/README.md

@ -26,5 +26,10 @@ targets:
- 'factory .*\.fromJson\(Map<String, dynamic> json\) => _jsonSerializers\.deserializeWith\(serializer, json\)!;' - 'factory .*\.fromJson\(Map<String, dynamic> json\) => _jsonSerializers\.deserializeWith\(serializer, json\)!;'
- 'Map<String, dynamic> toJson\(\) => _jsonSerializers\.serializeWith\(serializer, this\)! as Map<String, dynamic>;' - 'Map<String, dynamic> toJson\(\) => _jsonSerializers\.serializeWith\(serializer, this\)! as Map<String, dynamic>;'
- 'static BuiltSet<.*> get values => _\$.*Values;' - 'static BuiltSet<.*> get values => _\$.*Values;'
overrides:
# Tighten linting rules for specific specs
lib/my_spec.openapi.json:
analyzer_ignores:
- camel_case_types
``` ```

60
packages/dynamite/dynamite/lib/src/models/dynamite_config/config.dart

@ -33,6 +33,66 @@ abstract class DynamiteConfig implements Built<DynamiteConfig, DynamiteConfigBui
/// The specified line with the formatter should use. /// The specified line with the formatter should use.
int? get pageWidth; int? get pageWidth;
/// A collection of dynamite configs for a specific file.
///
/// This parameter is only supported for the top level config.
// overrides is reserved in the build.yaml
BuiltMap<String, DynamiteConfig>? get overrides;
/// Whether to apply code optimizations.
///
/// The built code will adhere more to the dart code style but is equally as valid.
bool get applyOptimizations;
@BuiltValueHook(initializeBuilder: true)
static void _defaults(final DynamiteConfigBuilder b) {
b.applyOptimizations = true;
}
/// 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([ @SerializersFor([

65
packages/dynamite/dynamite/lib/src/models/dynamite_config/config.g.dart

@ -9,7 +9,9 @@ part of 'config.dart';
Serializers _$_serializers = (Serializers().toBuilder() Serializers _$_serializers = (Serializers().toBuilder()
..add(DynamiteConfig.serializer) ..add(DynamiteConfig.serializer)
..addBuilderFactory(const FullType(BuiltSet, [FullType(String)]), () => SetBuilder<String>()) ..addBuilderFactory(const FullType(BuiltSet, [FullType(String)]), () => SetBuilder<String>())
..addBuilderFactory(const FullType(BuiltSet, [FullType(String)]), () => SetBuilder<String>())) ..addBuilderFactory(const FullType(BuiltSet, [FullType(String)]), () => SetBuilder<String>())
..addBuilderFactory(const FullType(BuiltMap, [FullType(String), FullType(DynamiteConfig)]),
() => MapBuilder<String, DynamiteConfig>()))
.build(); .build();
Serializer<DynamiteConfig> _$dynamiteConfigSerializer = _$DynamiteConfigSerializer(); Serializer<DynamiteConfig> _$dynamiteConfigSerializer = _$DynamiteConfigSerializer();
@ -22,7 +24,10 @@ class _$DynamiteConfigSerializer implements StructuredSerializer<DynamiteConfig>
@override @override
Iterable<Object?> serialize(Serializers serializers, DynamiteConfig object, Iterable<Object?> serialize(Serializers serializers, DynamiteConfig object,
{FullType specifiedType = FullType.unspecified}) { {FullType specifiedType = FullType.unspecified}) {
final result = <Object?>[]; final result = <Object?>[
'applyOptimizations',
serializers.serialize(object.applyOptimizations, specifiedType: const FullType(bool)),
];
Object? value; Object? value;
value = object.analyzerIgnores; value = object.analyzerIgnores;
if (value != null) { if (value != null) {
@ -42,6 +47,13 @@ class _$DynamiteConfigSerializer implements StructuredSerializer<DynamiteConfig>
..add('pageWidth') ..add('pageWidth')
..add(serializers.serialize(value, specifiedType: const FullType(int))); ..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; return result;
} }
@ -67,6 +79,13 @@ class _$DynamiteConfigSerializer implements StructuredSerializer<DynamiteConfig>
case 'pageWidth': case 'pageWidth':
result.pageWidth = serializers.deserialize(value, specifiedType: const FullType(int)) as int?; result.pageWidth = serializers.deserialize(value, specifiedType: const FullType(int)) as int?;
break; break;
case 'overrides':
result.overrides.replace(serializers.deserialize(value,
specifiedType: const FullType(BuiltMap, [FullType(String), FullType(DynamiteConfig)]))!);
break;
case 'applyOptimizations':
result.applyOptimizations = serializers.deserialize(value, specifiedType: const FullType(bool))! as bool;
break;
} }
} }
@ -81,11 +100,19 @@ class _$DynamiteConfig extends DynamiteConfig {
final BuiltSet<String>? coverageIgnores; final BuiltSet<String>? coverageIgnores;
@override @override
final int? pageWidth; final int? pageWidth;
@override
final BuiltMap<String, DynamiteConfig>? overrides;
@override
final bool applyOptimizations;
factory _$DynamiteConfig([void Function(DynamiteConfigBuilder)? updates]) => factory _$DynamiteConfig([void Function(DynamiteConfigBuilder)? updates]) =>
(DynamiteConfigBuilder()..update(updates))._build(); (DynamiteConfigBuilder()..update(updates))._build();
_$DynamiteConfig._({this.analyzerIgnores, this.coverageIgnores, this.pageWidth}) : super._(); _$DynamiteConfig._(
{this.analyzerIgnores, this.coverageIgnores, this.pageWidth, this.overrides, required this.applyOptimizations})
: super._() {
BuiltValueNullFieldError.checkNotNull(applyOptimizations, r'DynamiteConfig', 'applyOptimizations');
}
@override @override
DynamiteConfig rebuild(void Function(DynamiteConfigBuilder) updates) => (toBuilder()..update(updates)).build(); DynamiteConfig rebuild(void Function(DynamiteConfigBuilder) updates) => (toBuilder()..update(updates)).build();
@ -99,7 +126,9 @@ class _$DynamiteConfig extends DynamiteConfig {
return other is DynamiteConfig && return other is DynamiteConfig &&
analyzerIgnores == other.analyzerIgnores && analyzerIgnores == other.analyzerIgnores &&
coverageIgnores == other.coverageIgnores && coverageIgnores == other.coverageIgnores &&
pageWidth == other.pageWidth; pageWidth == other.pageWidth &&
overrides == other.overrides &&
applyOptimizations == other.applyOptimizations;
} }
@override @override
@ -108,6 +137,8 @@ class _$DynamiteConfig extends DynamiteConfig {
_$hash = $jc(_$hash, analyzerIgnores.hashCode); _$hash = $jc(_$hash, analyzerIgnores.hashCode);
_$hash = $jc(_$hash, coverageIgnores.hashCode); _$hash = $jc(_$hash, coverageIgnores.hashCode);
_$hash = $jc(_$hash, pageWidth.hashCode); _$hash = $jc(_$hash, pageWidth.hashCode);
_$hash = $jc(_$hash, overrides.hashCode);
_$hash = $jc(_$hash, applyOptimizations.hashCode);
_$hash = $jf(_$hash); _$hash = $jf(_$hash);
return _$hash; return _$hash;
} }
@ -117,7 +148,9 @@ class _$DynamiteConfig extends DynamiteConfig {
return (newBuiltValueToStringHelper(r'DynamiteConfig') return (newBuiltValueToStringHelper(r'DynamiteConfig')
..add('analyzerIgnores', analyzerIgnores) ..add('analyzerIgnores', analyzerIgnores)
..add('coverageIgnores', coverageIgnores) ..add('coverageIgnores', coverageIgnores)
..add('pageWidth', pageWidth)) ..add('pageWidth', pageWidth)
..add('overrides', overrides)
..add('applyOptimizations', applyOptimizations))
.toString(); .toString();
} }
} }
@ -137,7 +170,17 @@ class DynamiteConfigBuilder implements Builder<DynamiteConfig, DynamiteConfigBui
int? get pageWidth => _$this._pageWidth; int? get pageWidth => _$this._pageWidth;
set pageWidth(int? pageWidth) => _$this._pageWidth = pageWidth; set pageWidth(int? pageWidth) => _$this._pageWidth = pageWidth;
DynamiteConfigBuilder(); MapBuilder<String, DynamiteConfig>? _overrides;
MapBuilder<String, DynamiteConfig> get overrides => _$this._overrides ??= MapBuilder<String, DynamiteConfig>();
set overrides(MapBuilder<String, DynamiteConfig>? overrides) => _$this._overrides = overrides;
bool? _applyOptimizations;
bool? get applyOptimizations => _$this._applyOptimizations;
set applyOptimizations(bool? applyOptimizations) => _$this._applyOptimizations = applyOptimizations;
DynamiteConfigBuilder() {
DynamiteConfig._defaults(this);
}
DynamiteConfigBuilder get _$this { DynamiteConfigBuilder get _$this {
final $v = _$v; final $v = _$v;
@ -145,6 +188,8 @@ class DynamiteConfigBuilder implements Builder<DynamiteConfig, DynamiteConfigBui
_analyzerIgnores = $v.analyzerIgnores?.toBuilder(); _analyzerIgnores = $v.analyzerIgnores?.toBuilder();
_coverageIgnores = $v.coverageIgnores?.toBuilder(); _coverageIgnores = $v.coverageIgnores?.toBuilder();
_pageWidth = $v.pageWidth; _pageWidth = $v.pageWidth;
_overrides = $v.overrides?.toBuilder();
_applyOptimizations = $v.applyOptimizations;
_$v = null; _$v = null;
} }
return this; return this;
@ -171,7 +216,10 @@ class DynamiteConfigBuilder implements Builder<DynamiteConfig, DynamiteConfigBui
_$DynamiteConfig._( _$DynamiteConfig._(
analyzerIgnores: _analyzerIgnores?.build(), analyzerIgnores: _analyzerIgnores?.build(),
coverageIgnores: _coverageIgnores?.build(), coverageIgnores: _coverageIgnores?.build(),
pageWidth: pageWidth); pageWidth: pageWidth,
overrides: _overrides?.build(),
applyOptimizations:
BuiltValueNullFieldError.checkNotNull(applyOptimizations, r'DynamiteConfig', 'applyOptimizations'));
} catch (_) { } catch (_) {
late String _$failedField; late String _$failedField;
try { try {
@ -179,6 +227,9 @@ class DynamiteConfigBuilder implements Builder<DynamiteConfig, DynamiteConfigBui
_analyzerIgnores?.build(); _analyzerIgnores?.build();
_$failedField = 'coverageIgnores'; _$failedField = 'coverageIgnores';
_coverageIgnores?.build(); _coverageIgnores?.build();
_$failedField = 'overrides';
_overrides?.build();
} catch (e) { } catch (e) {
throw BuiltValueNestedFieldError(r'DynamiteConfig', _$failedField, e.toString()); throw BuiltValueNestedFieldError(r'DynamiteConfig', _$failedField, e.toString());
} }

17
packages/dynamite/dynamite/lib/src/openapi_builder.dart

@ -36,15 +36,15 @@ class OpenAPIBuilder implements Builder {
@override @override
Future<void> build(final BuildStep buildStep) async { Future<void> build(final BuildStep buildStep) async {
try { final inputId = buildStep.inputId;
final inputId = buildStep.inputId; final outputId = inputId.changeExtension('.dart');
final outputId = inputId.changeExtension('.dart');
final emitter = DartEmitter( final emitter = DartEmitter(
orderDirectives: true, orderDirectives: true,
useNullSafetySyntax: true, useNullSafetySyntax: true,
); );
try {
final spec = switch (inputId.extension) { final spec = switch (inputId.extension) {
'.json' => openapi.serializers.deserializeWith( '.json' => openapi.serializers.deserializeWith(
openapi.OpenAPI.serializer, openapi.OpenAPI.serializer,
@ -62,7 +62,8 @@ class OpenAPIBuilder implements Builder {
throw Exception('Only OpenAPI between $minSupportedVersion and $maxSupportedVersion are supported.'); 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, // 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. // but they need to be added to the beginning of the output.

Loading…
Cancel
Save