Skip to content

Commit d040b60

Browse files
cbrackenmhevery
authored andcommitted
chore(template_cache_generator): move options to flags with sensible defaults
Closes dart-archive#916
1 parent b5e835a commit d040b60

File tree

3 files changed

+121
-58
lines changed

3 files changed

+121
-58
lines changed

lib/tools/template_cache_generator.dart

+108-48
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:collection';
77
import 'package:analyzer/src/generated/ast.dart';
88
import 'package:analyzer/src/generated/source.dart';
99
import 'package:analyzer/src/generated/element.dart';
10+
import 'package:args/args.dart';
1011
import 'package:di/generator.dart';
1112

1213
const String PACKAGE_PREFIX = 'package:';
@@ -21,64 +22,123 @@ primeTemplateCache(TemplateCache tc) {
2122
''';
2223

2324
const String FILE_FOOTER = '}';
24-
const SYSTEM_PACKAGE_ROOT = '%SYSTEM_PACKAGE_ROOT%';
25-
26-
main(args) {
27-
if (args.length < 4) {
28-
print('Usage: templace_cache_generator path_to_entry_point sdk_path '
29-
'output package_root1,package_root2,...|$SYSTEM_PACKAGE_ROOT '
30-
'patternUrl1,rewriteTo1;patternUrl2,rewriteTo2 '
31-
'blacklistClass1,blacklistClass2');
32-
exit(1);
33-
}
34-
35-
var entryPoint = args[0];
36-
var sdkPath = args[1];
37-
var output = args[2];
38-
var outputLibrary = args[3];
39-
var packageRoots = args[4] == SYSTEM_PACKAGE_ROOT ?
40-
[Platform.packageRoot] : args[4].split(',');
41-
Map<RegExp, String> urlRewriters = parseUrlRemapping(args[5]);
42-
Set<String> blacklistedClasses = (args.length > 6)
43-
? new Set.from(args[6].split(','))
44-
: new Set();
45-
46-
print('sdkPath: $sdkPath');
47-
print('entryPoint: $entryPoint');
48-
print('output: $output');
49-
print('outputLibrary: $outputLibrary');
50-
print('packageRoots: $packageRoots');
51-
print('url rewritters: ' + args[5]);
52-
print('blacklistedClasses: ' + blacklistedClasses.join(', '));
5325

26+
main(List arguments) {
27+
Options options = parseArgs(arguments);
28+
if (options.verbose) {
29+
print('entryPoint: ${options.entryPoint}');
30+
print('outputLibrary: ${options.outputLibrary}');
31+
print('output: ${options.output}');
32+
print('sdk-path: ${options.sdkPath}');
33+
print('package-root: ${options.packageRoots.join(",")}');
34+
var rewrites = options.urlRewrites.keys
35+
.map((k) => '${k.pattern},${options.urlRewrites[k]}')
36+
.join(';');
37+
print('url-rewrites: $rewrites');
38+
print('skip-classes: ${options.skippedClasses.join(",")}');
39+
}
5440

5541
Map<String, String> templates = {};
5642

57-
var c = new SourceCrawler(sdkPath, packageRoots);
43+
var c = new SourceCrawler(options.sdkPath, options.packageRoots);
5844
var visitor =
59-
new TemplateCollectingVisitor(templates, blacklistedClasses, c);
60-
c.crawl(entryPoint,
45+
new TemplateCollectingVisitor(templates, options.skippedClasses, c);
46+
c.crawl(options.entryPoint,
6147
(CompilationUnitElement compilationUnit, SourceFile source) =>
6248
visitor(compilationUnit, source.canonicalPath));
6349

64-
var sink = new File(output).openWrite();
50+
var sink;
51+
if (options.output == '-') {
52+
sink = stdout;
53+
} else {
54+
var f = new File(options.output)..createSync(recursive: true);
55+
sink = f.openWrite();
56+
}
6557
return printTemplateCache(
66-
templates, urlRewriters, outputLibrary, sink).then((_) {
67-
return sink.flush();
68-
});
58+
templates, options.urlRewrites, options.outputLibrary, sink)
59+
.then((_) => sink.flush());
60+
}
61+
62+
class Options {
63+
String entryPoint;
64+
String outputLibrary;
65+
String sdkPath;
66+
List<String> packageRoots;
67+
String output;
68+
Map<RegExp, String> urlRewrites;
69+
Set<String> skippedClasses;
70+
bool verbose;
6971
}
7072

71-
Map<RegExp, String> parseUrlRemapping(String argument) {
72-
Map<RegExp, String> result = new LinkedHashMap();
73-
if (argument.isEmpty) {
74-
return result;
73+
Options parseArgs(List arguments) {
74+
var parser = new ArgParser()
75+
..addOption('sdk-path', abbr: 's',
76+
defaultsTo: Platform.environment['DART_SDK'],
77+
help: 'Dart SDK Path')
78+
..addOption('package-root', abbr: 'p', defaultsTo: Platform.packageRoot,
79+
help: 'comma-separated list of package roots')
80+
..addOption('out', abbr: 'o', defaultsTo: '-',
81+
help: 'output file or "-" for stdout')
82+
..addOption('url-rewrites', abbr: 'u',
83+
help: 'semicolon-separated list of URL rewrite rules, of the form: '
84+
'patternUrl,rewriteTo')
85+
..addOption('skip-classes', abbr: 'b',
86+
help: 'comma-separated list of classes to skip templating')
87+
..addFlag('verbose', abbr: 'v', help: 'verbose output')
88+
..addFlag('help', abbr: 'h', negatable: false, help: 'show this help');
89+
90+
printUsage() {
91+
print('Usage: dart template_cache_generator.dart '
92+
'--sdk-path=path [OPTION...] entryPoint libraryName');
93+
print(parser.getUsage());
7594
}
7695

77-
argument.split(";").forEach((String pair) {
78-
List<String> remapping = pair.split(",");
79-
result[new RegExp(remapping[0])] = remapping[1];
80-
});
81-
return result;
96+
fail(message) {
97+
print('Error: $message\n');
98+
printUsage();
99+
exit(1);
100+
}
101+
102+
var args;
103+
try {
104+
args = parser.parse(arguments);
105+
} catch (e) {
106+
fail('failed to parse arguments');
107+
}
108+
109+
if (args['help']) {
110+
printUsage();
111+
exit(0);
112+
}
113+
114+
if (args['sdk-path'] == null) {
115+
fail('--sdk-path must be specified');
116+
}
117+
118+
var options = new Options();
119+
options.sdkPath = args['sdk-path'];
120+
options.packageRoots = args['package-root'].split(',');
121+
options.output = args['out'];
122+
if (args['url-rewrites'] != null) {
123+
options.urlRewrites = new LinkedHashMap.fromIterable(
124+
args['url-rewrites'].split(';').map((p) => p.split(',')),
125+
key: (p) => new RegExp(p[0]),
126+
value: (p) => p[1]);
127+
} else {
128+
options.urlRewrites = {};
129+
}
130+
if (args['skip-classes'] != null) {
131+
options.skippedClasses = new Set.from(args['skip-classes'].split(','));
132+
} else {
133+
options.skippedClasses = new Set();
134+
}
135+
options.verbose = args['verbose'];
136+
if (args.rest.length != 2) {
137+
fail('unexpected arguments: ${args.rest.join(' ')}');
138+
}
139+
options.entryPoint = args.rest[0];
140+
options.outputLibrary = args.rest[1];
141+
return options;
82142
}
83143

84144
printTemplateCache(Map<String, String> templateKeyMap,
@@ -112,10 +172,10 @@ printTemplateCache(Map<String, String> templateKeyMap,
112172

113173
class TemplateCollectingVisitor {
114174
Map<String, String> templates;
115-
Set<String> blacklistedClasses;
175+
Set<String> skippedClasses;
116176
SourceCrawler sourceCrawler;
117177

118-
TemplateCollectingVisitor(this.templates, this.blacklistedClasses,
178+
TemplateCollectingVisitor(this.templates, this.skippedClasses,
119179
this.sourceCrawler);
120180

121181
void call(CompilationUnitElement cue, String srcPath) {
@@ -137,7 +197,7 @@ class TemplateCollectingVisitor {
137197
bool cache = true;
138198
clazz.metadata.forEach((Annotation ann) {
139199
if (ann.arguments == null) return; // Ignore non-class annotations.
140-
if (blacklistedClasses.contains(clazz.name.name)) return;
200+
if (skippedClasses.contains(clazz.name.name)) return;
141201

142202
switch (ann.name.name) {
143203
case 'NgComponent':

pubspec.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ homepage: https://angulardart.org
1313
environment:
1414
sdk: '>=1.3.0'
1515
dependencies:
16+
args: '>=0.10.0 < 0.11.0'
1617
analyzer: '>=0.13.0 <0.14.0'
1718
barback: '>=0.11.1 <0.14.0'
1819
browser: '>=0.10.0 <0.11.0'

test/io/template_cache_generator_spec.dart

+12-10
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ void main() {
1414
var tmpDir = Directory.systemTemp.createTempSync();
1515
Future flush;
1616
try {
17-
flush = generator.main(['test/io/test_files/templates/main.dart',
18-
Platform.environment['DART_SDK'],
19-
'${tmpDir.path}/generated.dart', 'generated',
20-
'%SYSTEM_PACKAGE_ROOT%',
21-
'/test/io/test_files,rewritten', 'MyComponent3']);
17+
flush = generator.main([
18+
'--out=${tmpDir.path}/generated.dart',
19+
'--url-rewrites=/test/io/test_files,rewritten',
20+
'--skip-classes=MyComponent3',
21+
'test/io/test_files/templates/main.dart',
22+
'generated']);
2223
} catch(_) {
2324
tmpDir.deleteSync(recursive: true);
2425
rethrow;
@@ -42,11 +43,12 @@ void main() {
4243
var tmpDir = Directory.systemTemp.createTempSync();
4344
Future flush;
4445
try {
45-
flush = generator.main(['test/io/test_files/cssUrls/main.dart',
46-
Platform.environment['DART_SDK'],
47-
'${tmpDir.path}/generated.dart', 'generated',
48-
'%SYSTEM_PACKAGE_ROOT%',
49-
'/test/io/test_files,rewritten', 'MyComponent3']);
46+
flush = generator.main([
47+
'--out=${tmpDir.path}/generated.dart',
48+
'--url-rewrites=/test/io/test_files,rewritten',
49+
'--skip-classes=MyComponent3',
50+
'test/io/test_files/cssUrls/main.dart',
51+
'generated']);
5052
} catch(_) {
5153
tmpDir.deleteSync(recursive: true);
5254
rethrow;

0 commit comments

Comments
 (0)