mirror of
https://github.com/flutter/samples.git
synced 2025-11-09 14:28:51 +00:00
Add command to travis CI to analyze if update-code-segments has been run for Flutter Gallery (#219)
* Add command to travis CI to analyze if update-code-segments has been run
This commit is contained in:
11
gallery/codeviewer_cli/.gitignore
vendored
11
gallery/codeviewer_cli/.gitignore
vendored
@@ -1,11 +0,0 @@
|
|||||||
# Files and directories created by pub
|
|
||||||
.dart_tool/
|
|
||||||
.packages
|
|
||||||
# Remove the following pattern if you wish to check in your lock file
|
|
||||||
pubspec.lock
|
|
||||||
|
|
||||||
# Conventional directory for build outputs
|
|
||||||
build/
|
|
||||||
|
|
||||||
# Directory created by dartdoc
|
|
||||||
doc/api/
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
## 1.0.0
|
|
||||||
|
|
||||||
- Initial version
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
# Defines a default set of lint rules enforced for
|
|
||||||
# projects at Google. For details and rationale,
|
|
||||||
# see https://github.com/dart-lang/pedantic#enabled-lints.
|
|
||||||
include: package:pedantic/analysis_options.yaml
|
|
||||||
|
|
||||||
# For lint rules and documentation, see http://dart-lang.github.io/linter/lints.
|
|
||||||
# Uncomment to specify additional rules.
|
|
||||||
# linter:
|
|
||||||
# rules:
|
|
||||||
# - camel_case_types
|
|
||||||
|
|
||||||
analyzer:
|
|
||||||
# exclude:
|
|
||||||
# - path/to/excluded/files/**
|
|
||||||
|
|
||||||
linter:
|
|
||||||
rules:
|
|
||||||
- avoid_types_on_closure_parameters
|
|
||||||
- avoid_void_async
|
|
||||||
- await_only_futures
|
|
||||||
- camel_case_types
|
|
||||||
- cancel_subscriptions
|
|
||||||
- close_sinks
|
|
||||||
- constant_identifier_names
|
|
||||||
- control_flow_in_finally
|
|
||||||
- empty_statements
|
|
||||||
- hash_and_equals
|
|
||||||
- implementation_imports
|
|
||||||
- non_constant_identifier_names
|
|
||||||
- package_api_docs
|
|
||||||
- package_names
|
|
||||||
- package_prefixed_library_names
|
|
||||||
- test_types_in_equals
|
|
||||||
- throw_in_finally
|
|
||||||
- unnecessary_brace_in_string_interps
|
|
||||||
- unnecessary_getters_setters
|
|
||||||
- unnecessary_new
|
|
||||||
- unnecessary_statements
|
|
||||||
- directives_ordering
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
// Copyright 2019 The Flutter team. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
import 'package:codeviewer_cli/segment_generator.dart';
|
|
||||||
|
|
||||||
main(List<String> arguments) {
|
|
||||||
writeSegments(
|
|
||||||
sourceDirectoryPath: '../gallery/lib/demos',
|
|
||||||
targetFilePath: '../gallery/lib/codeviewer/code_segments.dart',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
name: codeviewer_cli
|
|
||||||
description: A command-line application to highlight dart source code.
|
|
||||||
|
|
||||||
environment:
|
|
||||||
sdk: '>=2.4.0 <3.0.0'
|
|
||||||
|
|
||||||
dependencies:
|
|
||||||
string_scanner: 1.0.5
|
|
||||||
|
|
||||||
dev_dependencies:
|
|
||||||
pedantic: 1.8.0
|
|
||||||
test: ^1.5.0
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -365,7 +365,7 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
string_scanner:
|
string_scanner:
|
||||||
dependency: transitive
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
name: string_scanner
|
name: string_scanner
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ dev_dependencies:
|
|||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
grinder: ^0.8.0
|
grinder: ^0.8.0
|
||||||
|
string_scanner: 1.0.5
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
assets:
|
assets:
|
||||||
|
|||||||
31
gallery/gallery/tool/codeviewer_cli/main.dart
Normal file
31
gallery/gallery/tool/codeviewer_cli/main.dart
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
// Copyright 2019 The Flutter team. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:args/args.dart';
|
||||||
|
import 'package:path/path.dart' as path;
|
||||||
|
|
||||||
|
import 'segment_generator.dart';
|
||||||
|
|
||||||
|
void main(List<String> arguments) {
|
||||||
|
final parser = ArgParser()
|
||||||
|
..addOption(
|
||||||
|
'target',
|
||||||
|
help: 'The file path for the output target file.',
|
||||||
|
defaultsTo: path.join(
|
||||||
|
Directory.current.path, 'lib', 'codeviewer', 'code_segments.dart'),
|
||||||
|
)
|
||||||
|
..addFlag(
|
||||||
|
'dry-run',
|
||||||
|
help: 'Write the output to stdout.',
|
||||||
|
);
|
||||||
|
final argResults = parser.parse(arguments);
|
||||||
|
|
||||||
|
writeSegments(
|
||||||
|
sourceDirectoryPath: path.join(Directory.current.path, 'lib', 'demos'),
|
||||||
|
targetFilePath: argResults['target'] as String,
|
||||||
|
isDryRun: argResults['dry-run'] as bool,
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -213,13 +213,11 @@ class TaggedString {
|
|||||||
final double order;
|
final double order;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _formatSegments(Map<String, String> segments, String targetFilePath) {
|
void _formatSegments(Map<String, String> segments, IOSink output) {
|
||||||
File targetFile = File(targetFilePath);
|
|
||||||
IOSink output = targetFile.openWrite();
|
|
||||||
|
|
||||||
output.write(_globalPrologue);
|
output.write(_globalPrologue);
|
||||||
|
|
||||||
for (final name in segments.keys) {
|
final sortedNames = segments.keys.toList()..sort();
|
||||||
|
for (final name in sortedNames) {
|
||||||
String code = segments[name];
|
String code = segments[name];
|
||||||
|
|
||||||
output.writeln(' static TextSpan $name (BuildContext context) {');
|
output.writeln(' static TextSpan $name (BuildContext context) {');
|
||||||
@@ -248,16 +246,19 @@ void _formatSegments(Map<String, String> segments, String targetFilePath) {
|
|||||||
/// [sourceDirectoryPath] and reads every file in it,
|
/// [sourceDirectoryPath] and reads every file in it,
|
||||||
/// collects code segments marked by "// BEGIN <segment_name>" and "// END",
|
/// collects code segments marked by "// BEGIN <segment_name>" and "// END",
|
||||||
/// highlights them, and writes to the file specified by
|
/// highlights them, and writes to the file specified by
|
||||||
/// [targetFilePath].
|
/// [targetFilePath]. If [isDryRun] is true, the output will
|
||||||
|
/// be written to stdout.
|
||||||
///
|
///
|
||||||
/// The output file is a dart source file with a class "CodeSegments" and
|
/// The output file is a dart source file with a class "CodeSegments" and
|
||||||
/// static methods of type TextSpan(BuildContext context).
|
/// static methods of type TextSpan(BuildContext context).
|
||||||
/// Each method generates a widget that displays a segment of code.
|
/// Each method generates a widget that displays a segment of code.
|
||||||
///
|
///
|
||||||
/// The target file is overwritten.
|
/// The target file is overwritten.
|
||||||
void writeSegments({String sourceDirectoryPath, String targetFilePath}) {
|
void writeSegments(
|
||||||
|
{String sourceDirectoryPath, String targetFilePath, bool isDryRun}) {
|
||||||
Map<String, String> segments = _createSegments(sourceDirectoryPath);
|
Map<String, String> segments = _createSegments(sourceDirectoryPath);
|
||||||
_formatSegments(segments, targetFilePath);
|
IOSink output = isDryRun ? stdout : File(targetFilePath).openWrite();
|
||||||
|
_formatSegments(segments, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
class PreformatterException implements Exception {
|
class PreformatterException implements Exception {
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:grinder/grinder.dart';
|
import 'package:grinder/grinder.dart';
|
||||||
@@ -54,12 +56,41 @@ Future<void> l10n() async {
|
|||||||
@Task('Update code segments')
|
@Task('Update code segments')
|
||||||
Future<void> updateCodeSegments() async {
|
Future<void> updateCodeSegments() async {
|
||||||
final codeviewerPath =
|
final codeviewerPath =
|
||||||
path.join(Directory.current.parent.path, 'codeviewer_cli');
|
path.join(Directory.current.path, 'tool', 'codeviewer_cli', 'main.dart');
|
||||||
await pubGet(directory: codeviewerPath);
|
|
||||||
|
|
||||||
Dart.run(path.join(codeviewerPath, 'bin', 'main.dart'));
|
Dart.run(codeviewerPath);
|
||||||
final targetFilePath = path.join('lib', 'codeviewer', 'code_segments.dart');
|
final codeSegmentsPath = path.join('lib', 'codeviewer', 'code_segments.dart');
|
||||||
await format(path: targetFilePath);
|
await format(path: codeSegmentsPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Task('Verify code segments')
|
||||||
|
Future<void> verifyCodeSegments() async {
|
||||||
|
final codeviewerPath =
|
||||||
|
path.join(Directory.current.path, 'tool', 'codeviewer_cli', 'main.dart');
|
||||||
|
|
||||||
|
// We use stdin and stdout to write and format the code segments, to avoid
|
||||||
|
// creating any files.
|
||||||
|
final codeSegmentsUnformatted =
|
||||||
|
Dart.run(codeviewerPath, arguments: ['--dry-run'], quiet: true);
|
||||||
|
final codeSegmentsFormatted = await _startProcess(
|
||||||
|
path.normalize(path.join(dartVM.path, '../dartfmt')),
|
||||||
|
input: codeSegmentsUnformatted,
|
||||||
|
);
|
||||||
|
|
||||||
|
// Read the original code segments file.
|
||||||
|
final codeSegmentsPath = path.join(
|
||||||
|
Directory.current.path, 'lib', 'codeviewer', 'code_segments.dart');
|
||||||
|
final expectedCodeSegmentsOutput =
|
||||||
|
await File(codeSegmentsPath).readAsString();
|
||||||
|
|
||||||
|
if (codeSegmentsFormatted.trim() != expectedCodeSegmentsOutput.trim()) {
|
||||||
|
stderr.writeln(
|
||||||
|
'The contents of $codeSegmentsPath are different from that produced by '
|
||||||
|
'codeviewer_cli. Did you forget to run update-code-segments after '
|
||||||
|
'updating a demo?',
|
||||||
|
);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _runProcess(String executable, List<String> arguments) async {
|
Future<void> _runProcess(String executable, List<String> arguments) async {
|
||||||
@@ -68,6 +99,32 @@ Future<void> _runProcess(String executable, List<String> arguments) async {
|
|||||||
stderr.write(result.stderr);
|
stderr.write(result.stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function to make sure we capture all of the stdout.
|
||||||
|
// Reference: https://github.com/dart-lang/sdk/issues/31666
|
||||||
|
Future<String> _startProcess(String executable,
|
||||||
|
{List<String> arguments = const [], String input}) async {
|
||||||
|
final output = <int>[];
|
||||||
|
final completer = Completer<int>();
|
||||||
|
final process = await Process.start(executable, arguments);
|
||||||
|
process.stdin.writeln(input);
|
||||||
|
process.stdout.listen(
|
||||||
|
(event) {
|
||||||
|
output.addAll(event);
|
||||||
|
},
|
||||||
|
onDone: () async => completer.complete(await process.exitCode),
|
||||||
|
);
|
||||||
|
await process.stdin.close();
|
||||||
|
|
||||||
|
final exitCode = await completer.future;
|
||||||
|
if (exitCode != 0) {
|
||||||
|
stderr.write(
|
||||||
|
'Running "$executable ${arguments.join(' ')}" failed with $exitCode.\n',
|
||||||
|
);
|
||||||
|
exit(exitCode);
|
||||||
|
}
|
||||||
|
return Future<String>.value(utf8.decoder.convert(output));
|
||||||
|
}
|
||||||
|
|
||||||
/// Return the flutter root path from the environment variables.
|
/// Return the flutter root path from the environment variables.
|
||||||
String _flutterRootPath() {
|
String _flutterRootPath() {
|
||||||
final flutterBinPath =
|
final flutterBinPath =
|
||||||
|
|||||||
@@ -57,6 +57,11 @@ do
|
|||||||
popd
|
popd
|
||||||
done
|
done
|
||||||
|
|
||||||
|
echo "Run code segments check for 'gallery/gallery'."
|
||||||
|
pushd gallery/gallery
|
||||||
|
"${localSdkPath}/bin/flutter" pub run grinder verify-code-segments
|
||||||
|
popd
|
||||||
|
|
||||||
echo "Building the aar files for 'flutter_module'."
|
echo "Building the aar files for 'flutter_module'."
|
||||||
pushd add_to_app/flutter_module
|
pushd add_to_app/flutter_module
|
||||||
"${localSdkPath}/bin/flutter" build aar
|
"${localSdkPath}/bin/flutter" build aar
|
||||||
|
|||||||
Reference in New Issue
Block a user