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 - 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 @@ library file.src.backends.local; 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 @@ part of file.src.backends.local; 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 @@ class RecordingDirectory extends RecordingFileSystemEntity #createTempSync: _createTempSync, #list: _list, #listSync: _listSync, + #childDirectory: _childDirectory, + #childFile: _childFile, + #childLink: _childLink, }); } @@ -63,4 +66,11 @@ class RecordingDirectory extends RecordingFileSystemEntity } 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 @@ class ReplayDirectory extends ReplayFileSystemEntity implements Directory { #createTempSync: reviveDirectory, #list: reviveEntities.fuse(const ToStream()), #listSync: reviveEntities, + #childDirectory: reviveDirectory, + #childFile: new ReviveFile(fileSystem), + #childLink: new ReviveLink(fileSystem), }); properties.addAll(>{ 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 badFileDescriptor(String path) { 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 @@ abstract class Directory implements FileSystemEntity, io.Directory { @override List 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 @@ abstract class FileSystem { 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 - Yegor Jbanov 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 @@ void runCommonTests( } }); }); + + 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', () {