Skip to content

Commit 2e0557e

Browse files
feat: handle package name for fonts (#567)
## What does this change? Fixes #357 🎯 Parse `package_parameter_enabled` for the fonts property and add a `package` accessor to the generated font class. ## Example ```dart class MyFonts { MyFonts._(); static const String package = 'design_system'; /// Font family: Arial Black static const String arialBlack = 'packages/$package/Arial Black'; /// Font family: Calibri static const String calibri = 'packages/$package/Calibri'; } ``` ## Type of change - [x] New feature (non-breaking change which adds functionality) - [x] This change requires a documentation update
1 parent 0f44829 commit 2e0557e

File tree

9 files changed

+150
-12
lines changed

9 files changed

+150
-12
lines changed

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,31 @@ flutter:
470470

471471
These configurations will generate **`fonts.gen.dart`** under the **`lib/gen/`** directory by default.
472472

473+
#### Generate for packages
474+
475+
If you want to generate fonts for a package,
476+
use `package_parameter_enabled` under `flutter_gen > fonts > outputs`.
477+
478+
```yaml
479+
flutter_gen:
480+
fonts:
481+
outputs:
482+
package_parameter_enabled: true # <- Add this line.
483+
```
484+
485+
This would add the package constant to the generated class. For example:
486+
487+
```dart
488+
class Fonts {
489+
Fonts._();
490+
491+
static const String package = 'test';
492+
493+
static const String raleway = 'packages/$package/Raleway';
494+
static const String robotoMono = 'packages/$package/RobotoMono';
495+
}
496+
```
497+
473498
#### Usage Example
474499

475500
```dart

packages/core/lib/flutter_generator.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ class FlutterGenerator {
7070
}
7171

7272
if (flutterGen.fonts.enabled && flutter.fonts.isNotEmpty) {
73-
final generated =
74-
generateFonts(formatter, flutter.fonts, flutterGen.fonts);
73+
final generated = generateFonts(
74+
FontsGenConfig.fromConfig(config),
75+
formatter,
76+
);
7577
final fontsPath =
7678
normalize(join(pubspecFile.parent.path, output, fontsName));
7779
writer(generated, fontsPath);

packages/core/lib/generators/fonts_generator.dart

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,40 @@
33
import 'package:dart_style/dart_style.dart';
44
import 'package:dartx/dartx.dart';
55
import 'package:flutter_gen_core/generators/generator_helper.dart';
6+
import 'package:flutter_gen_core/settings/config.dart';
67
import 'package:flutter_gen_core/settings/pubspec.dart';
78
import 'package:flutter_gen_core/utils/error.dart';
89
import 'package:flutter_gen_core/utils/string.dart';
910

11+
class FontsGenConfig {
12+
FontsGenConfig._(
13+
this._packageName,
14+
this.flutterGen,
15+
this.fonts,
16+
);
17+
18+
factory FontsGenConfig.fromConfig(Config config) {
19+
return FontsGenConfig._(
20+
config.pubspec.packageName,
21+
config.pubspec.flutterGen,
22+
config.pubspec.flutter.fonts,
23+
);
24+
}
25+
26+
final String _packageName;
27+
final FlutterGen flutterGen;
28+
final List<FlutterFonts> fonts;
29+
30+
String get packageParameterLiteral =>
31+
flutterGen.fonts.outputs.packageParameterEnabled ? _packageName : '';
32+
}
33+
1034
String generateFonts(
35+
FontsGenConfig config,
1136
DartFormatter formatter,
12-
List<FlutterFonts> fonts,
13-
FlutterGenFonts fontsConfig,
1437
) {
38+
final fonts = config.fonts;
39+
final fontsConfig = config.flutterGen.fonts;
1540
if (fonts.isEmpty) {
1641
throw InvalidSettingsException(
1742
'The value of "flutter/fonts:" is incorrect.');
@@ -25,9 +50,16 @@ String generateFonts(
2550
buffer.writeln('$className._();');
2651
buffer.writeln();
2752

53+
final isPackage = config.packageParameterLiteral.isNotEmpty;
54+
if (isPackage) {
55+
buffer.writeln("static const String package = '${config._packageName}';");
56+
buffer.writeln();
57+
}
58+
2859
fonts.map((element) => element.family).distinct().sorted().forEach((family) {
60+
final keyName = isPackage ? 'packages/\$package/$family' : family;
2961
buffer.writeln("""/// Font family: $family
30-
static const String ${family.camelCase()} = '$family';""");
62+
static const String ${family.camelCase()} = '$keyName';""");
3163
});
3264

3365
buffer.writeln('}');

packages/core/lib/settings/pubspec.dart

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class FlutterGenFonts {
149149
final bool enabled;
150150

151151
@JsonKey(name: 'outputs', required: true)
152-
final FlutterGenElementOutputs outputs;
152+
final FlutterGenElementFontsOutputs outputs;
153153

154154
factory FlutterGenFonts.fromJson(Map json) => _$FlutterGenFontsFromJson(json);
155155
}
@@ -229,3 +229,17 @@ class FlutterGenElementAssetsOutputs extends FlutterGenElementOutputs {
229229
factory FlutterGenElementAssetsOutputs.fromJson(Map json) =>
230230
_$FlutterGenElementAssetsOutputsFromJson(json);
231231
}
232+
233+
@JsonSerializable()
234+
class FlutterGenElementFontsOutputs extends FlutterGenElementOutputs {
235+
FlutterGenElementFontsOutputs({
236+
required super.className,
237+
required this.packageParameterEnabled,
238+
});
239+
240+
@JsonKey(name: 'package_parameter_enabled', defaultValue: false)
241+
final bool packageParameterEnabled;
242+
243+
factory FlutterGenElementFontsOutputs.fromJson(Map json) =>
244+
_$FlutterGenElementFontsOutputsFromJson(json);
245+
}

packages/core/lib/settings/pubspec.g.dart

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

packages/core/test/fonts_gen_test.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ void main() {
2626
pageWidth: config.pubspec.flutterGen.lineLength, lineEnding: '\n');
2727

2828
expect(() {
29-
return generateFonts(formatter, config.pubspec.flutter.fonts,
30-
config.pubspec.flutterGen.fonts);
29+
return generateFonts(FontsGenConfig.fromConfig(config), formatter);
3130
}, throwsA(isA<InvalidSettingsException>()));
3231
});
3332

@@ -40,5 +39,15 @@ void main() {
4039

4140
await expectedFontsGen(pubspec, generated, fact);
4241
});
42+
43+
test('Package parameter enabled', () async {
44+
const pubspec = 'test_resources/pubspec_fonts_package_parameter.yaml';
45+
const fact =
46+
'test_resources/actual_data/fonts_package_parameter.gen.dart';
47+
const generated =
48+
'test_resources/lib/gen/fonts_package_parameter.gen.dart';
49+
50+
await expectedFontsGen(pubspec, generated, fact);
51+
});
4352
});
4453
}

packages/core/test/gen_test_helper.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,8 @@ Future<List<String>> runFontsGen(
121121
);
122122

123123
final actual = generateFonts(
124+
FontsGenConfig.fromConfig(config),
124125
formatter,
125-
config.pubspec.flutter.fonts,
126-
config.pubspec.flutterGen.fonts,
127126
);
128127
final expected = formatter.format(
129128
File(fact).readAsStringSync().replaceAll('\r\n', '\n'),

packages/core/test_resources/actual_data/fonts_package_parameter.gen.dart

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: test
2+
3+
flutter_gen:
4+
output: lib/gen/ # Optional (default: lib/gen/)
5+
line_length: 80 # Optional (default: 80)
6+
7+
fonts:
8+
outputs:
9+
package_parameter_enabled: true
10+
11+
flutter:
12+
fonts:
13+
- family: Raleway
14+
fonts:
15+
- asset: assets/fonts/Raleway-Regular.ttf
16+
- asset: assets/fonts/Raleway-Italic.ttf
17+
style: italic

0 commit comments

Comments
 (0)