Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(311)

Unified Diff: sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart

Issue 344673002: Load instances of the same transformer from the same isolate. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
new file mode 100644
index 0000000000000000000000000000000000000000..afbad62478b86ba5ae5d9141f87d38b481e4d452
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
@@ -0,0 +1,128 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.barback.transformer_config;
+
+import '../utils.dart';
+import 'transformer_id.dart';
+
+/// The configuration for a transformer.
+///
+/// This corresponds to the transformers listed in a pubspec, which have both an
+/// [id] indicating the location of the transformer and configuration specific
+/// to that use of the transformer.
+class TransformerConfig {
+ /// The [id] of the transformer [this] is configuring.
+ final TransformerId id;
+
+ /// The configuration to pass to the transformer.
+ ///
+ /// Any pub-specific configuration (i.e. keys starting with "$") will have
+ /// been stripped out of this and handled separately. This will be an empty
+ /// map if no configuration was provided.
+ final Map configuration;
+
+ /// The primary input inclusions.
+ ///
+ /// Each inclusion is an asset path. If this set is non-empty, then *only*
+ /// matching assets are allowed as a primary input by this transformer. If
+ /// `null`, all assets are included.
+ ///
+ /// This is processed before [excludes]. If a transformer has both includes
+ /// and excludes, then the set of included assets is determined and assets
+ /// are excluded from that resulting set.
+ final Set<String> includes;
+
+ /// The primary input exclusions.
+ ///
+ /// Any asset whose pach is in this is not allowed as a primary input by
+ /// this transformer.
+ ///
+ /// This is processed after [includes]. If a transformer has both includes
+ /// and excludes, then the set of included assets is determined and assets
+ /// are excluded from that resulting set.
+ final Set<String> excludes;
+
+ /// Returns whether this config excludes certain asset ids from being
+ /// processed.
+ bool get hasExclusions => includes != null || excludes != null;
+
+ /// Parses [identifier] as a [TransformerId].
+ factory TransformerConfig.parse(String identifier, Map configuration) =>
+ new TransformerConfig(new TransformerId.parse(identifier), configuration);
+
+ factory TransformerConfig(TransformerId id, Map configuration) {
+ parseField(key) {
+ if (!configuration.containsKey(key)) return null;
+ var field = configuration.remove(key);
+
+ if (field is String) return new Set<String>.from([field]);
+
+ if (field is List) {
+ var nonstrings = field
+ .where((element) => element is! String)
+ .map((element) => '"$element"');
+
+ if (nonstrings.isNotEmpty) {
+ throw new FormatException(
+ '"$key" list field may only contain strings, but contained '
+ '${toSentence(nonstrings)}.');
+ }
+
+ return new Set<String>.from(field);
+ } else {
+ throw new FormatException(
+ '"$key" field must be a string or list, but was "$field".');
+ }
+ }
+
+ var includes = null;
+ var excludes = null;
+
+ if (configuration == null) {
+ configuration = {};
+ } else {
+ // Don't write to the immutable YAML map.
+ configuration = new Map.from(configuration);
+
+ // Pull out the exclusions/inclusions.
+ includes = parseField("\$include");
+ excludes = parseField("\$exclude");
+
+ // All other keys starting with "$" are unexpected.
+ var reservedKeys = configuration.keys
+ .where((key) => key is String && key.startsWith(r'$'))
+ .map((key) => '"$key"');
+
+ if (reservedKeys.isNotEmpty) {
+ throw new FormatException(
+ 'Unknown reserved ${pluralize('field', reservedKeys.length)} '
+ '${toSentence(reservedKeys)}.');
+ }
+ }
+
+ return new TransformerConfig._(id, configuration, includes, excludes);
+ }
+
+ TransformerConfig._(
+ this.id, this.configuration, this.includes, this.excludes);
+
+ String toString() => id.toString();
+
+ /// Returns whether the include/exclude rules allow the transformer to run on
+ /// [pathWithinPackage].
+ ///
+ /// [pathWithinPackage] must be a URL-style path relative to the containing
+ /// package's root directory.
+ bool canTransform(String pathWithinPackage) {
+ // TODO(rnystrom): Support globs in addition to paths. See #17093.
+ if (excludes != null) {
+ // If there are any excludes, it must not match any of them.
+ if (excludes.contains(pathWithinPackage)) return false;
+ }
+
+ // If there are any includes, it must match one of them.
+ return includes == null || includes.contains(pathWithinPackage);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698