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

Side by Side Diff: pkg/scheduled_test/lib/src/descriptor/directory.dart

Issue 12330062: Add a filesystem descriptor library to scheduled_test. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Code review changes Created 7 years, 10 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library descriptor.file;
6
7 import 'dart:async';
8 import 'dart:io' as io;
9
10 import 'package:pathos/path.dart' as path;
11
12 import '../../descriptor.dart' as descriptor;
13 import '../../scheduled_test.dart';
14 import '../utils.dart';
15 import 'utils.dart';
16
17 /// A descriptor describing a directory containing multiple files.
18 class Directory extends descriptor.Entry {
19 /// The entries contained within this directory.
20 final Iterable<descriptor.Entry> contents;
21
22 Directory(Pattern name, this.contents)
23 : super(name);
24
25 Future create([String parent]) => schedule(() {
26 if (parent == null) parent = descriptor.defaultRoot;
27 var fullPath = path.join(parent, stringName);
28 return new io.Directory(fullPath).create(recursive: true).then((_) {
29 return Future.wait(
30 contents.map((entry) => entry.create(fullPath)).toList());
31 });
32 }, 'creating directory:\n${describe()}');
33
34 Future validate([String parent]) => schedule(() {
35 if (parent == null) parent = descriptor.defaultRoot;
36 var fullPath = entryMatchingPattern('Directory', parent, name);
37 return Future.wait(
38 contents.map((entry) => entry.validate(fullPath)).toList());
39 }, 'validating directory:\n${describe()}');
40
41 Stream<List<int>> load(String pathToLoad) {
42 return futureStream(new Future.immediate(null).then((_) {
43 if (path.isAbsolute(pathToLoad)) {
44 throw "Can't load absolute path '$pathToLoad'.";
45 }
46
47 var split = path.split(path.normalize(pathToLoad));
48 if (split.isEmpty || split.first == '.' || split.first == '..') {
49 throw "Can't load '$pathToLoad' from within $nameDescription.";
50 }
51
52 var matchingEntries = contents.where((entry) =>
53 entry.stringName == split.first).toList();
54
55 if (matchingEntries.length == 0) {
56 throw "Couldn't find an entry named '${split.first}' within "
57 "$nameDescription.";
58 } else if (matchingEntries.length > 1) {
59 throw "Found multiple entries named '${split.first}' within "
60 "$nameDescription.";
61 } else {
62 var remainingPath = split.getRange(1, split.length - 1);
63 if (remainingPath.isEmpty) {
64 return matchingEntries.first.read();
65 } else {
66 return matchingEntries.first.load(path.joinAll(remainingPath));
67 }
68 }
69 }));
70 }
71
72 Stream<List<int>> read() => errorStream("Can't read the contents of "
73 "$nameDescription: is a directory.");
74
75 String describe() {
76 var description = name;
77 if (name is! String) description = 'directory matching $nameDescription';
78 if (contents.isEmpty) return description;
79
80 var buffer = new StringBuffer();
81 buffer.writeln(description);
82 for (var entry in contents.take(contents.length - 1)) {
83 var entryString = prefixLines(entry.describe(), prefix: '| ')
84 .replaceFirst('| ', '|-- ');
85 buffer.writeln(entryString);
86 }
87
88 var lastEntryString = prefixLines(contents.last.describe(), prefix: ' ')
89 .replaceFirst(' ', "'-- ");
90 buffer.add(lastEntryString);
91 return buffer.toString();
92 }
93 }
OLDNEW
« no previous file with comments | « pkg/scheduled_test/lib/descriptor.dart ('k') | pkg/scheduled_test/lib/src/descriptor/entry.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698