Skip to content

Commit 9369e91

Browse files
authored
Finish implementation of ReplayFileSystem (#33)
Fixes flutter#11
1 parent da342e3 commit 9369e91

13 files changed

+378
-321
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#### 1.0.2
1+
#### 2.0.0
22

33
* Improved `toString` implementations in file system entity classes
44
* Added `ForwardingFileSystem` and associated forwarding classes to the

lib/src/backends/record_replay/codecs.dart

Lines changed: 179 additions & 174 deletions
Large diffs are not rendered by default.

lib/src/backends/record_replay/replay_directory.dart

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:async';
56
import 'dart:convert';
67

78
import 'package:file/file.dart';
@@ -16,24 +17,29 @@ class ReplayDirectory extends ReplayFileSystemEntity implements Directory {
1617
/// Creates a new `ReplayDirectory`.
1718
ReplayDirectory(ReplayFileSystemImpl fileSystem, String identifier)
1819
: super(fileSystem, identifier) {
19-
Converter<dynamic, dynamic> convertThis = directoryReviver(fileSystem);
20-
Converter<dynamic, dynamic> convertFutureThis =
21-
convertThis.fuse(kFutureReviver);
20+
Converter<String, Directory> reviveDirectory =
21+
new ReviveDirectory(fileSystem);
22+
Converter<String, Future<Directory>> reviveFutureDirectory =
23+
reviveDirectory.fuse(const ToFuture<Directory>());
24+
Converter<String, FileSystemEntity> reviveEntity =
25+
new ReviveFileSystemEntity(fileSystem);
26+
Converter<List<String>, List<FileSystemEntity>> reviveEntities =
27+
new ConvertElements<String, FileSystemEntity>(reviveEntity);
2228

2329
methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
24-
#rename: convertFutureThis,
25-
#renameSync: convertThis,
26-
#delete: convertFutureThis,
27-
#create: convertFutureThis,
28-
#createSync: kPassthrough,
29-
#createTemp: convertFutureThis,
30-
#createTempSync: convertThis,
31-
#list: listReviver(entityReviver(fileSystem)).fuse(kStreamReviver),
32-
#listSync: listReviver(entityReviver(fileSystem)),
30+
#rename: reviveFutureDirectory,
31+
#renameSync: reviveDirectory,
32+
#delete: reviveFutureDirectory,
33+
#create: reviveFutureDirectory,
34+
#createSync: const Passthrough<Null>(),
35+
#createTemp: reviveFutureDirectory,
36+
#createTempSync: reviveDirectory,
37+
#list: reviveEntities.fuse(const ToStream<FileSystemEntity>()),
38+
#listSync: reviveEntities,
3339
});
3440

3541
properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
36-
#absolute: convertThis,
42+
#absolute: reviveDirectory,
3743
});
3844
}
3945
}

lib/src/backends/record_replay/replay_file.dart

Lines changed: 42 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:async';
56
import 'dart:convert';
67

78
import 'package:file/file.dart';
@@ -16,40 +17,52 @@ class ReplayFile extends ReplayFileSystemEntity implements File {
1617
/// Creates a new `ReplayFile`.
1718
ReplayFile(ReplayFileSystemImpl fileSystem, String identifier)
1819
: super(fileSystem, identifier) {
19-
Converter<dynamic, dynamic> convertThis = fileReviver(fileSystem);
20-
Converter<dynamic, dynamic> convertFutureThis =
21-
convertThis.fuse(kFutureReviver);
20+
Converter<String, File> reviveFile = new ReviveFile(fileSystem);
21+
Converter<String, Future<File>> reviveFileAsFuture =
22+
reviveFile.fuse(const ToFuture<File>());
23+
Converter<String, List<int>> blobToBytes = new BlobToBytes(fileSystem);
24+
Converter<String, String> blobToString = blobToBytes.fuse(UTF8.decoder);
25+
Converter<String, RandomAccessFile> reviveRandomAccessFile =
26+
new ReviveRandomAccessFile(fileSystem);
27+
// TODO(tvolkert) remove `as`: https://github.com/dart-lang/sdk/issues/28748
28+
Converter<String, List<String>> lineSplitter =
29+
const LineSplitter() as Converter<String, List<String>>;
30+
Converter<String, List<String>> blobToLines =
31+
blobToString.fuse(lineSplitter);
32+
Converter<String, Stream<List<int>>> blobToByteStream = blobToBytes
33+
.fuse(const Listify<List<int>>())
34+
.fuse(const ToStream<List<int>>());
2235

2336
methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
24-
#rename: convertFutureThis,
25-
#renameSync: convertThis,
26-
#delete: convertFutureThis,
27-
#create: convertFutureThis,
28-
#createSync: kPassthrough,
29-
#copy: convertFutureThis,
30-
#copySync: convertThis,
31-
#length: kFutureReviver,
32-
#lengthSync: kPassthrough,
33-
#lastModified: kDateTimeReviver.fuse(kFutureReviver),
34-
#lastModifiedSync: kDateTimeReviver,
35-
#open: randomAccessFileReviver(fileSystem).fuse(kFutureReviver),
36-
#openSync: randomAccessFileReviver(fileSystem),
37-
#openRead: kStreamReviver,
38-
#openWrite: ioSinkReviver(fileSystem),
39-
#readAsBytes: blobReviver(fileSystem).fuse(kFutureReviver),
40-
#readAsBytesSync: blobReviver(fileSystem),
41-
#readAsString: kFutureReviver,
42-
#readAsStringSync: kPassthrough,
43-
#readAsLines: kFutureReviver,
44-
#readAsLinesSync: kPassthrough,
45-
#writeAsBytes: convertFutureThis,
46-
#writeAsBytesSync: kPassthrough,
47-
#writeAsString: convertFutureThis,
48-
#writeAsStringSync: kPassthrough,
37+
#rename: reviveFileAsFuture,
38+
#renameSync: reviveFile,
39+
#delete: reviveFileAsFuture,
40+
#create: reviveFileAsFuture,
41+
#createSync: const Passthrough<Null>(),
42+
#copy: reviveFileAsFuture,
43+
#copySync: reviveFile,
44+
#length: const ToFuture<int>(),
45+
#lengthSync: const Passthrough<int>(),
46+
#lastModified: DateTimeCodec.deserialize.fuse(const ToFuture<DateTime>()),
47+
#lastModifiedSync: DateTimeCodec.deserialize,
48+
#open: reviveRandomAccessFile.fuse(const ToFuture<RandomAccessFile>()),
49+
#openSync: reviveRandomAccessFile,
50+
#openRead: blobToByteStream,
51+
#openWrite: new ReviveIOSink(fileSystem),
52+
#readAsBytes: blobToBytes.fuse(const ToFuture<List<int>>()),
53+
#readAsBytesSync: blobToBytes,
54+
#readAsString: blobToString.fuse(const ToFuture<String>()),
55+
#readAsStringSync: blobToString,
56+
#readAsLines: blobToLines.fuse(const ToFuture<List<String>>()),
57+
#readAsLinesSync: blobToLines,
58+
#writeAsBytes: reviveFileAsFuture,
59+
#writeAsBytesSync: const Passthrough<Null>(),
60+
#writeAsString: reviveFileAsFuture,
61+
#writeAsStringSync: const Passthrough<Null>(),
4962
});
5063

5164
properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
52-
#absolute: convertThis,
65+
#absolute: reviveFile,
5366
});
5467
}
5568
}

lib/src/backends/record_replay/replay_file_stat.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,17 @@ class ReplayFileStat implements FileStat {
1616
ReplayFileStat(Map<String, dynamic> data) : _data = data;
1717

1818
@override
19-
DateTime get changed => kDateTimeReviver.convert(_data['changed']);
19+
DateTime get changed => DateTimeCodec.deserialize.convert(_data['changed']);
2020

2121
@override
22-
DateTime get modified => kDateTimeReviver.convert(_data['modified']);
22+
DateTime get modified => DateTimeCodec.deserialize.convert(_data['modified']);
2323

2424
@override
25-
DateTime get accessed => kDateTimeReviver.convert(_data['accessed']);
25+
DateTime get accessed => DateTimeCodec.deserialize.convert(_data['accessed']);
2626

2727
@override
28-
FileSystemEntityType get type => kEntityTypeReviver.convert(_data['type']);
28+
FileSystemEntityType get type =>
29+
EntityTypeCodec.deserialize.convert(_data['type']);
2930

3031
@override
3132
int get mode => _data['mode'];

lib/src/backends/record_replay/replay_file_system.dart

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -70,24 +70,28 @@ class ReplayFileSystemImpl extends FileSystem
7070
implements ReplayFileSystem, ReplayAware {
7171
/// Creates a new `ReplayFileSystemImpl`.
7272
ReplayFileSystemImpl(this.recording, this.manifest) {
73+
Converter<String, Directory> reviveDirectory = new ReviveDirectory(this);
74+
ToFuture<FileSystemEntityType> toFutureType =
75+
const ToFuture<FileSystemEntityType>();
76+
7377
methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
74-
#directory: directoryReviver(this),
75-
#file: fileReviver(this),
76-
#link: linkReviver(this),
77-
#stat: kFileStatReviver.fuse(kFutureReviver),
78-
#statSync: kFileStatReviver,
79-
#identical: kPassthrough.fuse(kFutureReviver),
80-
#identicalSync: kPassthrough,
81-
#type: kEntityTypeReviver.fuse(kFutureReviver),
82-
#typeSync: kEntityTypeReviver,
78+
#directory: reviveDirectory,
79+
#file: new ReviveFile(this),
80+
#link: new ReviveLink(this),
81+
#stat: FileStatCodec.deserialize.fuse(const ToFuture<FileStat>()),
82+
#statSync: FileStatCodec.deserialize,
83+
#identical: const Passthrough<bool>().fuse(const ToFuture<bool>()),
84+
#identicalSync: const Passthrough<bool>(),
85+
#type: EntityTypeCodec.deserialize.fuse(toFutureType),
86+
#typeSync: EntityTypeCodec.deserialize,
8387
});
8488

8589
properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
86-
#path: kPathContextReviver,
87-
#systemTempDirectory: directoryReviver(this),
88-
#currentDirectory: directoryReviver(this),
89-
const Symbol('currentDirectory='): kPassthrough,
90-
#isWatchSupported: kPassthrough,
90+
#path: PathContextCodec.deserialize,
91+
#systemTempDirectory: reviveDirectory,
92+
#currentDirectory: reviveDirectory,
93+
const Symbol('currentDirectory='): const Passthrough<Null>(),
94+
#isWatchSupported: const Passthrough<bool>(),
9195
});
9296
}
9397

lib/src/backends/record_replay/replay_file_system_entity.dart

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:async';
56
import 'dart:convert';
67

78
import 'package:file/file.dart';
@@ -17,24 +18,30 @@ abstract class ReplayFileSystemEntity extends Object
1718
implements FileSystemEntity {
1819
/// Creates a new `ReplayFileSystemEntity`.
1920
ReplayFileSystemEntity(this.fileSystem, this.identifier) {
21+
Converter<List<Map<String, Object>>, List<FileSystemEvent>> toEvents =
22+
const ConvertElements<Map<String, Object>, FileSystemEvent>(
23+
FileSystemEventCodec.deserialize);
24+
Converter<List<Map<String, Object>>, Stream<FileSystemEvent>>
25+
toEventStream = toEvents.fuse(const ToStream<FileSystemEvent>());
26+
2027
methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
21-
#exists: kPassthrough.fuse(kFutureReviver),
22-
#existsSync: kPassthrough,
23-
#resolveSymbolicLinks: kPassthrough.fuse(kFutureReviver),
24-
#resolveSymbolicLinksSync: kPassthrough,
25-
#stat: kFileStatReviver.fuse(kFutureReviver),
26-
#statSync: kFileStatReviver,
27-
#deleteSync: kPassthrough,
28-
#watch: listReviver(kFileSystemEventReviver).fuse(kStreamReviver),
28+
#exists: const ToFuture<bool>(),
29+
#existsSync: const Passthrough<bool>(),
30+
#resolveSymbolicLinks: const ToFuture<String>(),
31+
#resolveSymbolicLinksSync: const Passthrough<String>(),
32+
#stat: FileStatCodec.deserialize.fuse(const ToFuture<FileStat>()),
33+
#statSync: FileStatCodec.deserialize,
34+
#deleteSync: const Passthrough<Null>(),
35+
#watch: toEventStream,
2936
});
3037

3138
properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
32-
#path: kPassthrough,
33-
#uri: kUriReviver,
34-
#isAbsolute: kPassthrough,
35-
#parent: directoryReviver(fileSystem),
36-
#basename: kPassthrough,
37-
#dirname: kPassthrough,
39+
#path: const Passthrough<String>(),
40+
#uri: UriCodec.deserialize,
41+
#isAbsolute: const Passthrough<bool>(),
42+
#parent: new ReviveDirectory(fileSystem),
43+
#basename: const Passthrough<String>(),
44+
#dirname: const Passthrough<String>(),
3845
});
3946
}
4047

lib/src/backends/record_replay/replay_io_sink.dart

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,24 @@ import 'replay_proxy_mixin.dart';
1515
class ReplayIOSink extends Object with ReplayProxyMixin implements IOSink {
1616
final ReplayFileSystemImpl _fileSystem;
1717

18-
/// Creates a new `ReplayIOSink`.
18+
/// Creates a new [ReplayIOSink].
1919
ReplayIOSink(this._fileSystem, this.identifier) {
2020
methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
21-
#add: kPassthrough,
22-
#write: kPassthrough,
23-
#writeAll: kPassthrough,
24-
#writeln: kPassthrough,
25-
#writeCharCode: kPassthrough,
26-
#addError: kPassthrough,
27-
#addStream: kFutureReviver,
28-
#flush: kFutureReviver,
29-
#close: kFutureReviver,
21+
#add: const Passthrough<Null>(),
22+
#write: const Passthrough<Null>(),
23+
#writeAll: const Passthrough<Null>(),
24+
#writeln: const Passthrough<Null>(),
25+
#writeCharCode: const Passthrough<Null>(),
26+
#addError: const Passthrough<Null>(),
27+
#addStream: const ToFuture<dynamic>(),
28+
#flush: const ToFuture<dynamic>(),
29+
#close: const ToFuture<dynamic>(),
3030
});
3131

3232
properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
33-
#encoding: kEncodingReviver,
34-
const Symbol('encoding='): kPassthrough,
35-
#done: kPassthrough.fuse(kFutureReviver),
33+
#encoding: EncodingCodec.deserialize,
34+
const Symbol('encoding='): const Passthrough<Null>(),
35+
#done: const Passthrough<dynamic>().fuse(const ToFuture<dynamic>()),
3636
});
3737
}
3838

lib/src/backends/record_replay/replay_link.dart

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'dart:async';
56
import 'dart:convert';
67

78
import 'package:file/file.dart';
@@ -16,20 +17,24 @@ class ReplayLink extends ReplayFileSystemEntity implements Link {
1617
/// Creates a new `ReplayLink`.
1718
ReplayLink(ReplayFileSystemImpl fileSystem, String identifier)
1819
: super(fileSystem, identifier) {
20+
Converter<String, Link> reviveLink = new ReviveLink(fileSystem);
21+
Converter<String, Future<Link>> reviveLinkAsFuture =
22+
reviveLink.fuse(const ToFuture<Link>());
23+
1924
methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
20-
#rename: linkReviver(fileSystem).fuse(kFutureReviver),
21-
#renameSync: linkReviver(fileSystem),
22-
#delete: linkReviver(fileSystem).fuse(kFutureReviver),
23-
#create: linkReviver(fileSystem).fuse(kFutureReviver),
24-
#createSync: kPassthrough,
25-
#update: linkReviver(fileSystem).fuse(kFutureReviver),
26-
#updateSync: kPassthrough,
27-
#target: kPassthrough.fuse(kFutureReviver),
28-
#targetSync: kPassthrough,
25+
#rename: reviveLinkAsFuture,
26+
#renameSync: reviveLink,
27+
#delete: reviveLinkAsFuture,
28+
#create: reviveLinkAsFuture,
29+
#createSync: const Passthrough<Null>(),
30+
#update: reviveLinkAsFuture,
31+
#updateSync: const Passthrough<Null>(),
32+
#target: const Passthrough<String>().fuse(const ToFuture<String>()),
33+
#targetSync: const Passthrough<String>(),
2934
});
3035

3136
properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
32-
#absolute: linkReviver(fileSystem),
37+
#absolute: reviveLink,
3338
});
3439
}
3540
}

0 commit comments

Comments
 (0)