Skip to content

feat: handle package name for fonts #567

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,31 @@ flutter:

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

#### Generate for packages

If you want to generate fonts for a package,
use `package_parameter_enabled` under `flutter_gen > fonts > outputs`.

```yaml
flutter_gen:
fonts:
outputs:
package_parameter_enabled: true # <- Add this line.
```

This would add the package constant to the generated class. For example:

```dart
class Fonts {
Fonts._();

static const String package = 'test';

static const String raleway = 'packages/$package/Raleway';
static const String robotoMono = 'packages/$package/RobotoMono';
}
```

#### Usage Example

```dart
Expand Down
6 changes: 4 additions & 2 deletions packages/core/lib/flutter_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,10 @@ class FlutterGenerator {
}

if (flutterGen.fonts.enabled && flutter.fonts.isNotEmpty) {
final generated =
generateFonts(formatter, flutter.fonts, flutterGen.fonts);
final generated = generateFonts(
FontsGenConfig.fromConfig(config),
formatter,
);
final fontsPath =
normalize(join(pubspecFile.parent.path, output, fontsName));
writer(generated, fontsPath);
Expand Down
38 changes: 35 additions & 3 deletions packages/core/lib/generators/fonts_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,40 @@
import 'package:dart_style/dart_style.dart';
import 'package:dartx/dartx.dart';
import 'package:flutter_gen_core/generators/generator_helper.dart';
import 'package:flutter_gen_core/settings/config.dart';
import 'package:flutter_gen_core/settings/pubspec.dart';
import 'package:flutter_gen_core/utils/error.dart';
import 'package:flutter_gen_core/utils/string.dart';

class FontsGenConfig {
FontsGenConfig._(
this._packageName,
this.flutterGen,
this.fonts,
);

factory FontsGenConfig.fromConfig(Config config) {
return FontsGenConfig._(
config.pubspec.packageName,
config.pubspec.flutterGen,
config.pubspec.flutter.fonts,
);
}

final String _packageName;
final FlutterGen flutterGen;
final List<FlutterFonts> fonts;

String get packageParameterLiteral =>
flutterGen.fonts.outputs.packageParameterEnabled ? _packageName : '';
}

String generateFonts(
FontsGenConfig config,
DartFormatter formatter,
List<FlutterFonts> fonts,
FlutterGenFonts fontsConfig,
) {
final fonts = config.fonts;
final fontsConfig = config.flutterGen.fonts;
if (fonts.isEmpty) {
throw InvalidSettingsException(
'The value of "flutter/fonts:" is incorrect.');
Expand All @@ -25,9 +50,16 @@ String generateFonts(
buffer.writeln('$className._();');
buffer.writeln();

final isPackage = config.packageParameterLiteral.isNotEmpty;
if (isPackage) {
buffer.writeln("static const String package = '${config._packageName}';");
buffer.writeln();
}

fonts.map((element) => element.family).distinct().sorted().forEach((family) {
final keyName = isPackage ? 'packages/\$package/$family' : family;
buffer.writeln("""/// Font family: $family
static const String ${family.camelCase()} = '$family';""");
static const String ${family.camelCase()} = '$keyName';""");
});

buffer.writeln('}');
Expand Down
16 changes: 15 additions & 1 deletion packages/core/lib/settings/pubspec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ class FlutterGenFonts {
final bool enabled;

@JsonKey(name: 'outputs', required: true)
final FlutterGenElementOutputs outputs;
final FlutterGenElementFontsOutputs outputs;

factory FlutterGenFonts.fromJson(Map json) => _$FlutterGenFontsFromJson(json);
}
Expand Down Expand Up @@ -229,3 +229,17 @@ class FlutterGenElementAssetsOutputs extends FlutterGenElementOutputs {
factory FlutterGenElementAssetsOutputs.fromJson(Map json) =>
_$FlutterGenElementAssetsOutputsFromJson(json);
}

@JsonSerializable()
class FlutterGenElementFontsOutputs extends FlutterGenElementOutputs {
FlutterGenElementFontsOutputs({
required super.className,
required this.packageParameterEnabled,
});

@JsonKey(name: 'package_parameter_enabled', defaultValue: false)
final bool packageParameterEnabled;

factory FlutterGenElementFontsOutputs.fromJson(Map json) =>
_$FlutterGenElementFontsOutputsFromJson(json);
}
27 changes: 25 additions & 2 deletions packages/core/lib/settings/pubspec.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 11 additions & 2 deletions packages/core/test/fonts_gen_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@ void main() {
pageWidth: config.pubspec.flutterGen.lineLength, lineEnding: '\n');

expect(() {
return generateFonts(formatter, config.pubspec.flutter.fonts,
config.pubspec.flutterGen.fonts);
return generateFonts(FontsGenConfig.fromConfig(config), formatter);
}, throwsA(isA<InvalidSettingsException>()));
});

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

await expectedFontsGen(pubspec, generated, fact);
});

test('Package parameter enabled', () async {
const pubspec = 'test_resources/pubspec_fonts_package_parameter.yaml';
const fact =
'test_resources/actual_data/fonts_package_parameter.gen.dart';
const generated =
'test_resources/lib/gen/fonts_package_parameter.gen.dart';

await expectedFontsGen(pubspec, generated, fact);
});
});
}
3 changes: 1 addition & 2 deletions packages/core/test/gen_test_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,8 @@ Future<List<String>> runFontsGen(
);

final actual = generateFonts(
FontsGenConfig.fromConfig(config),
formatter,
config.pubspec.flutter.fonts,
config.pubspec.flutterGen.fonts,
);
final expected = formatter.format(
File(fact).readAsStringSync().replaceAll('\r\n', '\n'),
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: test

flutter_gen:
output: lib/gen/ # Optional (default: lib/gen/)
line_length: 80 # Optional (default: 80)

fonts:
outputs:
package_parameter_enabled: true

flutter:
fonts:
- family: Raleway
fonts:
- asset: assets/fonts/Raleway-Regular.ttf
- asset: assets/fonts/Raleway-Italic.ttf
style: italic
Loading