Added convenience methods in `Directory`... (#46)
... for creating child entities.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4162b26..c9cc3c0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+#### 2.3.0
+
+* Added the following convenience methods in `Directory`:
+ * `Directory.childDirectory(String basename)`
+ * `Directory.childFile(String basename)`
+ * `Directory.childLink(String basename)`
+
#### 2.2.0
* Added `ErrorCodes` class, which holds errno values.
diff --git a/lib/src/backends/chroot/chroot_directory.dart b/lib/src/backends/chroot/chroot_directory.dart
index 102a1c1..3cfaa61 100644
--- a/lib/src/backends/chroot/chroot_directory.dart
+++ b/lib/src/backends/chroot/chroot_directory.dart
@@ -5,7 +5,7 @@
part of file.src.backends.chroot;
class _ChrootDirectory extends _ChrootFileSystemEntity<Directory, io.Directory>
- with ForwardingDirectory {
+ with ForwardingDirectory, common.DirectoryAddOnsMixin {
_ChrootDirectory(ChrootFileSystem fs, String path) : super(fs, path);
factory _ChrootDirectory.wrapped(
diff --git a/lib/src/backends/local.dart b/lib/src/backends/local.dart
index a76c41c..b5ef405 100644
--- a/lib/src/backends/local.dart
+++ b/lib/src/backends/local.dart
@@ -6,6 +6,7 @@
import 'dart:async';
+import 'package:file/src/common.dart' as common;
import 'package:file/src/forwarding.dart';
import 'package:file/src/io.dart' as io;
import 'package:file/file.dart';
diff --git a/lib/src/backends/local/local_directory.dart b/lib/src/backends/local/local_directory.dart
index 1b7ecbd..2f3f238 100644
--- a/lib/src/backends/local/local_directory.dart
+++ b/lib/src/backends/local/local_directory.dart
@@ -6,7 +6,7 @@
class _LocalDirectory
extends _LocalFileSystemEntity<_LocalDirectory, io.Directory>
- with ForwardingDirectory {
+ with ForwardingDirectory, common.DirectoryAddOnsMixin {
_LocalDirectory(FileSystem fs, io.Directory delegate) : super(fs, delegate);
@override
diff --git a/lib/src/backends/memory/memory_directory.dart b/lib/src/backends/memory/memory_directory.dart
index 3a3cbb1..da41c96 100644
--- a/lib/src/backends/memory/memory_directory.dart
+++ b/lib/src/backends/memory/memory_directory.dart
@@ -4,7 +4,9 @@
part of file.src.backends.memory;
-class _MemoryDirectory extends _MemoryFileSystemEntity implements Directory {
+class _MemoryDirectory extends _MemoryFileSystemEntity
+ with common.DirectoryAddOnsMixin
+ implements Directory {
static int _tempCounter = 0;
_MemoryDirectory(MemoryFileSystem fileSystem, String path)
diff --git a/lib/src/backends/record_replay/recording_directory.dart b/lib/src/backends/record_replay/recording_directory.dart
index 52334b1..d38abe9 100644
--- a/lib/src/backends/record_replay/recording_directory.dart
+++ b/lib/src/backends/record_replay/recording_directory.dart
@@ -24,6 +24,9 @@
#createTempSync: _createTempSync,
#list: _list,
#listSync: _listSync,
+ #childDirectory: _childDirectory,
+ #childFile: _childFile,
+ #childLink: _childLink,
});
}
@@ -63,4 +66,11 @@
}
throw new FileSystemException('Unsupported type: $entity', entity.path);
}
+
+ Directory _childDirectory(String basename) =>
+ wrapDirectory(delegate.childDirectory(basename));
+
+ File _childFile(String basename) => wrapFile(delegate.childFile(basename));
+
+ Link _childLink(String basename) => wrapLink(delegate.childLink(basename));
}
diff --git a/lib/src/backends/record_replay/replay_directory.dart b/lib/src/backends/record_replay/replay_directory.dart
index 2d264e5..b6130be 100644
--- a/lib/src/backends/record_replay/replay_directory.dart
+++ b/lib/src/backends/record_replay/replay_directory.dart
@@ -36,6 +36,9 @@
#createTempSync: reviveDirectory,
#list: reviveEntities.fuse(const ToStream<FileSystemEntity>()),
#listSync: reviveEntities,
+ #childDirectory: reviveDirectory,
+ #childFile: new ReviveFile(fileSystem),
+ #childLink: new ReviveLink(fileSystem),
});
properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
diff --git a/lib/src/common.dart b/lib/src/common.dart
index 87148c5..39b647f 100644
--- a/lib/src/common.dart
+++ b/lib/src/common.dart
@@ -63,3 +63,22 @@
FileSystemException _fsException(String path, String msg, int errorCode) {
return new FileSystemException(msg, path, new OSError(msg, errorCode));
}
+
+/// Mixin containing implementations of [Directory] methods that are common
+/// to all implementations.
+abstract class DirectoryAddOnsMixin implements Directory {
+ @override
+ Directory childDirectory(String basename) {
+ return fileSystem.directory(fileSystem.path.join(path, basename));
+ }
+
+ @override
+ File childFile(String basename) {
+ return fileSystem.file(fileSystem.path.join(path, basename));
+ }
+
+ @override
+ Link childLink(String basename) {
+ return fileSystem.link(fileSystem.path.join(path, basename));
+ }
+}
diff --git a/lib/src/interface/directory.dart b/lib/src/interface/directory.dart
index f19c67f..f96e515 100644
--- a/lib/src/interface/directory.dart
+++ b/lib/src/interface/directory.dart
@@ -4,7 +4,9 @@
import 'dart:async';
+import 'file.dart';
import 'file_system_entity.dart';
+import 'link.dart';
import '../io.dart' as io;
/// A reference to a directory on the file system.
@@ -35,4 +37,16 @@
@override
List<FileSystemEntity> listSync(
{bool recursive: false, bool followLinks: true});
+
+ /// Returns a reference to a [Directory] that exists as a child of this
+ /// directory and has the specified [basename].
+ Directory childDirectory(String basename);
+
+ /// Returns a reference to a [File] that exists as a child of this directory
+ /// and has the specified [basename].
+ File childFile(String basename);
+
+ /// Returns a reference to a [Link] that exists as a child of this directory
+ /// and has the specified [basename].
+ Link childLink(String basename);
}
diff --git a/lib/src/interface/file_system.dart b/lib/src/interface/file_system.dart
index 084ba82..18f5a51 100644
--- a/lib/src/interface/file_system.dart
+++ b/lib/src/interface/file_system.dart
@@ -4,7 +4,7 @@
import 'dart:async';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
import 'directory.dart';
import 'file.dart';
@@ -38,7 +38,7 @@
Link link(dynamic path);
/// An object for manipulating paths in this file system.
- path.Context get path;
+ p.Context get path;
/// Gets the system temp directory.
///
diff --git a/pubspec.yaml b/pubspec.yaml
index 3001c16..047b297 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: file
-version: 2.2.0
+version: 2.3.0
authors:
- Matan Lurey <matanl@google.com>
- Yegor Jbanov <yjbanov@google.com>
diff --git a/test/common_tests.dart b/test/common_tests.dart
index e89b02d..468a263 100644
--- a/test/common_tests.dart
+++ b/test/common_tests.dart
@@ -1101,6 +1101,16 @@
}
});
});
+
+ test('childEntities', () {
+ Directory dir = fs.directory(ns('/foo'))..createSync();
+ dir.childDirectory('bar').createSync();
+ dir.childFile('baz').createSync();
+ dir.childLink('qux').createSync('bar');
+ expect(fs.directory(ns('/foo/bar')), exists);
+ expect(fs.file(ns('/foo/baz')), exists);
+ expect(fs.link(ns('/foo/qux')), exists);
+ });
});
group('File', () {