Skip to content

⚡️ Use fine-grained logger instead of stdout.writeln #694

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
merged 14 commits into from
Jul 16, 2025
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
6 changes: 3 additions & 3 deletions examples/example/example.iml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/android/.gradle" />
<excludeFolder url="file://$MODULE_DIR$/android/.idea" />
<excludeFolder url="file://$MODULE_DIR$/ios/Flutter" />
<excludeFolder url="file://$MODULE_DIR$/ios/Flutter/ephemeral" />
<excludeFolder url="file://$MODULE_DIR$/ios/Pods" />
<excludeFolder url="file://$MODULE_DIR$/ios/.symlinks" />
<excludeFolder url="file://$MODULE_DIR$/macos/Flutter" />
<excludeFolder url="file://$MODULE_DIR$/macos/Flutter/ephemeral" />
<excludeFolder url="file://$MODULE_DIR$/macos/Pods" />
<excludeFolder url="file://$MODULE_DIR$/macos/.symlinks" />
</content>
Expand All @@ -23,4 +23,4 @@
<orderEntry type="library" name="Flutter Plugins" level="project" />
<orderEntry type="library" name="Dart Packages" level="project" />
</component>
</module>
</module>
34 changes: 34 additions & 0 deletions examples/example/ios/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
2 changes: 1 addition & 1 deletion examples/example/ios/Flutter/AppFrameworkInfo.plist
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>11.0</string>
<string>12.0</string>
</dict>
</plist>
34 changes: 34 additions & 0 deletions examples/example/macos/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
31 changes: 16 additions & 15 deletions packages/command/bin/flutter_gen_command.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,20 @@ import 'dart:io';

import 'package:args/args.dart';
import 'package:flutter_gen_core/flutter_generator.dart';
import 'package:flutter_gen_core/utils/cast.dart';
import 'package:flutter_gen_core/utils/error.dart';
import 'package:flutter_gen_core/version.gen.dart';
import 'package:flutter_gen_core/utils/cast.dart' show safeCast;
import 'package:flutter_gen_core/utils/log.dart' show log;
import 'package:flutter_gen_core/version.gen.dart' show packageVersion;
import 'package:logging/logging.dart' show Level;

void main(List<String> args) async {
log.onRecord.listen((record) {
if (record.level >= Level.WARNING) {
stderr.writeln('[FlutterGen] [${record.level.name}] ${record.message}');
} else {
stdout.writeln('[FlutterGen] ${record.message}');
}
});

final parser = ArgParser();
parser.addOption(
'config',
Expand Down Expand Up @@ -39,18 +48,14 @@ void main(List<String> args) async {
try {
results = parser.parse(args);
if (results.wasParsed('help')) {
stdout.writeln(parser.usage);
log.info('Usage of the `fluttergen` command:\n${parser.usage}');
return;
} else if (results.wasParsed('version')) {
stdout.writeln('[FlutterGen] v$packageVersion');
log.info('v$packageVersion');
return;
}
} on FormatException catch (e) {
stderr.writeAll(
<String>[e.message, 'usage: flutter_gen [options...]', ''],
'\n',
);
return;
throw '$e\n\n${parser.usage}';
}

final pubspecPath = safeCast<String>(results['config']);
Expand All @@ -65,9 +70,5 @@ void main(List<String> args) async {
}
final buildFile = buildPath == null ? null : File(buildPath).absolute;

try {
await FlutterGenerator(pubspecFile, buildFile: buildFile).build();
} on InvalidSettingsException catch (e) {
stderr.write(e.message);
}
await FlutterGenerator(pubspecFile, buildFile: buildFile).build();
}
1 change: 1 addition & 0 deletions packages/command/dart_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
concurrency: 1
1 change: 1 addition & 0 deletions packages/command/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ executables:
dependencies:
flutter_gen_core: 5.10.0
args: ^2.0.0
logging: ^1.3.0

dev_dependencies:
lints: any # Ignoring the version to allow editing across SDK versions.
Expand Down
28 changes: 19 additions & 9 deletions packages/command/test/flutter_gen_command_test.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'dart:io' show Platform;

import 'package:flutter_gen_core/generators/generator_helper.dart' as helper;
import 'package:flutter_gen_core/version.gen.dart';
import 'package:test/test.dart';
import 'package:test_process/test_process.dart';
Expand Down Expand Up @@ -37,6 +36,10 @@ void main() {
'dart',
['bin/flutter_gen_command.dart', '--help'],
);
expect(
await process.stdout.next,
equals('[FlutterGen] Usage of the `fluttergen` command:'),
);
expect(
await process.stdout.next,
equals('-c, --config Set the path of pubspec.yaml.'),
Expand All @@ -62,13 +65,13 @@ void main() {
);
expect(
await process.stderr.next,
equals('Could not find an option named "--wrong".'),
equals('Unhandled exception:'),
);
expect(
await process.stderr.next,
equals('usage: flutter_gen [options...]'),
equals('FormatException: Could not find an option named "--wrong".'),
);
await process.shouldExit(0);
await process.shouldExit(255);
});

test('Execute deprecated config with fluttergen', () async {
Expand All @@ -80,10 +83,17 @@ void main() {
'test/deprecated_configs.yaml',
],
);
final errors = (await process.stderr.rest.toList()).join('\n');
expect(errors, contains(helper.sDeprecationHeader));
expect(errors, contains('style'));
expect(errors, contains('package_parameter_enabled'));
await process.shouldExit(0);
expect(
await process.stderr.next,
equals('Unhandled exception:'),
);
expect(
await process.stderr.next,
startsWith('InvalidSettingsException: '),
);
final rest = (await process.stderr.rest.toList()).join('\n');
expect(rest, contains('style'));
expect(rest, contains('package_parameter_enabled'));
await process.shouldExit(255);
});
}
1 change: 1 addition & 0 deletions packages/core/dart_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
concurrency: 1
11 changes: 6 additions & 5 deletions packages/core/lib/flutter_generator.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import 'dart:io' show stdout, Directory, File;
import 'dart:io' show Directory, File;

import 'package:flutter_gen_core/generators/assets_generator.dart';
import 'package:flutter_gen_core/generators/colors_generator.dart';
import 'package:flutter_gen_core/generators/fonts_generator.dart';
import 'package:flutter_gen_core/settings/config.dart';
import 'package:flutter_gen_core/utils/file.dart';
import 'package:flutter_gen_core/utils/formatter.dart';
import 'package:flutter_gen_core/utils/log.dart';
import 'package:path/path.dart' show join, normalize;

class FlutterGenerator {
Expand Down Expand Up @@ -60,7 +61,7 @@ class FlutterGenerator {
);
final assetsPath = normalize(join(absoluteOutput.path, assetsName));
writer(generated, assetsPath);
stdout.writeln('[FlutterGen] Generated: $assetsPath');
log.info('Generated: $assetsPath');
}

if (flutterGen.colors.enabled && flutterGen.colors.inputs.isNotEmpty) {
Expand All @@ -71,7 +72,7 @@ class FlutterGenerator {
);
final colorsPath = normalize(join(absoluteOutput.path, colorsName));
writer(generated, colorsPath);
stdout.writeln('[FlutterGen] Generated: $colorsPath');
log.info('Generated: $colorsPath');
}

if (flutterGen.fonts.enabled && flutter.fonts.isNotEmpty) {
Expand All @@ -81,9 +82,9 @@ class FlutterGenerator {
);
final fontsPath = normalize(join(absoluteOutput.path, fontsName));
writer(generated, fontsPath);
stdout.writeln('[FlutterGen] Generated: $fontsPath');
log.info('Generated: $fontsPath');
}

stdout.writeln('[FlutterGen] Finished generating.');
log.info('Finished generating.');
}
}
1 change: 0 additions & 1 deletion packages/core/lib/generators/assets_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ Future<String> generateAssets(
config.flutterGen.assets.packageParameterEnabled != null;
if (deprecatedStyle || deprecatedPackageParam) {
final deprecationBuffer = StringBuffer();
deprecationBuffer.writeln(sDeprecationHeader);
if (deprecatedStyle) {
deprecationBuffer.writeln(
sBuildDeprecation(
Expand Down
28 changes: 0 additions & 28 deletions packages/core/lib/generators/generator_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,34 +23,6 @@ String import(Import package) {
'${package.alias != null ? ' as ${package.alias}' : ''};';
}

const sDeprecationHeader = '''

░░░░

██
██░░██
░░ ░░ ██░░░░░░██ ░░░░
██░░░░░░░░░░██
██░░░░░░░░░░██
██░░░░░░░░░░░░░░██
██░░░░░░██████░░░░░░██
██░░░░░░██████░░░░░░██
██░░░░░░░░██████░░░░░░░░██
██░░░░░░░░██████░░░░░░░░██
██░░░░░░░░░░██████░░░░░░░░░░██
██░░░░░░░░░░░░██████░░░░░░░░░░░░██
██░░░░░░░░░░░░██████░░░░░░░░░░░░██
██░░░░░░░░░░░░░░██████░░░░░░░░░░░░░░██
██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██
██░░░░░░░░░░░░░░░░██████░░░░░░░░░░░░░░░░██
██░░░░░░░░░░░░░░░░██████░░░░░░░░░░░░░░░░██
██░░░░░░░░░░░░░░░░░░██████░░░░░░░░░░░░░░░░░░██
░░ ██░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██
██████████████████████████████████████████


░░''';

String sBuildDeprecation(
String deprecated,
String oldLocation,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:io';

import 'package:flutter_gen_core/generators/integrations/integration.dart';
import 'package:flutter_gen_core/utils/log.dart';
import 'package:image_size_getter/file_input.dart';
import 'package:image_size_getter/image_size_getter.dart';

Expand Down Expand Up @@ -162,9 +163,8 @@ ${isPackage ? "\n static const String package = '$packageName';" : ''}
);
final size = result.size;
return ImageMetadata(size.width.toDouble(), size.height.toDouble());
} catch (e) {
stderr
.writeln('[WARNING] Failed to parse \'${asset.path}\' metadata: $e');
} catch (e, s) {
log.warning('Failed to parse \'${asset.path}\' metadata.', e, s);
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,11 +168,11 @@ ${isPackage ? "\n static const String package = '$packageName';" : ''}
}
} on FormatException catch (_) {
// Catches bad/corrupted json and reports it to user.
// stderr.writeln(e.message);
// log.warning('Lottie JSON file is not valid.', e, s);
// no-op
} on TypeError catch (_) {
// Catches bad/corrupted json and reports it to user.
// stderr.writeln(e);
// log.warning('Lottie JSON file has invalid type.', e, s);
// no-op
}
return false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:io';

import 'package:flutter_gen_core/generators/integrations/integration.dart';
import 'package:flutter_gen_core/utils/log.dart';
import 'package:vector_graphics_compiler/vector_graphics_compiler.dart';

class SvgIntegration extends Integration {
Expand Down Expand Up @@ -138,10 +139,8 @@ ${isPackage ? "\n static const String package = '$packageName';" : ''}
final svg = File(asset.fullPath).readAsStringSync();
final vec = parseWithoutOptimizers(svg);
return ImageMetadata(vec.width, vec.height);
} catch (e) {
stderr.writeln(
'[WARNING] Failed to parse SVG \'${asset.path}\' metadata: $e',
);
} catch (e, s) {
log.warning('Failed to parse SVG \'${asset.path}\' metadata.', e, s);
return null;
}
}
Expand Down
Loading
Loading