Skip to content

Commit

Permalink
Listing contents
Browse files Browse the repository at this point in the history
  • Loading branch information
frankdejonge committed Dec 22, 2019
1 parent 324d517 commit 9f6ce4c
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 10 deletions.
6 changes: 3 additions & 3 deletions src/FilesystemAdapter.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ public function mimeType(string $path): string;
public function lastModified(string $path): int;
public function fileSize(string $path): int;

public function listContents(string $path): Generator;
public function listContents(string $path, bool $recursive): Generator;

public function move(string $source, string $destination): void;
public function move(string $source, string $destination, Config $config): void;

public function copy(string $source, string $destination): void;
public function copy(string $source, string $destination, Config $config): void;
}
1 change: 1 addition & 0 deletions src/FilesystemOperationFailed.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ interface FilesystemOperationFailed extends FilesystemError
public const OPERATION_CREATE_DIRECTORY = 'CREATE_DIRECTORY';
public const OPERATION_DELETE = 'DELETE';
public const OPERATION_DELETE_DIRECTORY = 'DELETE_DIRECTORY';
public const OPERATION_MOVE = 'MOVE';

public function operationType(): string;
}
67 changes: 60 additions & 7 deletions src/Local/LocalFilesystem.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@

namespace League\Flysystem\Local;

use DirectoryIterator;
use FilesystemIterator;
use Generator;
use League\Flysystem\Config;
use League\Flysystem\DirectoryAttributes;
use League\Flysystem\FileAttributes;
use League\Flysystem\FilesystemAdapter;
use League\Flysystem\PathPrefixer;
use League\Flysystem\UnableToCreateDirectory;
use League\Flysystem\UnableToDeleteDirectory;
use League\Flysystem\UnableToDeleteFile;
use League\Flysystem\UnableToMoveFile;
use League\Flysystem\UnableToSetVisibility;
use League\Flysystem\UnableToUpdateFile;
use League\Flysystem\UnableToWriteFile;
Expand All @@ -29,10 +33,13 @@
use function file_exists;
use function is_dir;
use function is_file;
use function rename;
use function rmdir;
use function stream_copy_to_stream;
use function unlink;

use function var_dump;

use const DIRECTORY_SEPARATOR;
use const LOCK_EX;

Expand Down Expand Up @@ -167,7 +174,7 @@ public function deleteDirectory(string $prefix): void
return;
}

$contents = $this->getRecursiveDirectoryIterator($location, RecursiveIteratorIterator::CHILD_FIRST);
$contents = $this->listDirectoryRecursively($location, RecursiveIteratorIterator::CHILD_FIRST);

/** @var SplFileInfo $file */
foreach ($contents as $file) {
Expand All @@ -182,11 +189,11 @@ public function deleteDirectory(string $prefix): void
}
}

private function getRecursiveDirectoryIterator(
private function listDirectoryRecursively(
string $path,
int $mode = RecursiveIteratorIterator::SELF_FIRST
): RecursiveIteratorIterator {
return new RecursiveIteratorIterator(
): Generator {
yield from new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), $mode
);
}
Expand All @@ -213,15 +220,48 @@ protected function deleteFileInfoObject(SplFileInfo $file): void
}
}

public function listContents(string $location): Generator
public function listContents(string $path, bool $recursive): Generator
{
$location = $this->prefixer->prefixPath($path);

if ( ! is_dir($location)) {
return;
}

/** @var SplFileInfo[] $iterator */
$iterator = $recursive ? $this->listDirectoryRecursively($location) : $this->listDirectory($location);

foreach ($iterator as $fileInfo) {
if ($fileInfo->isLink() && $this->linkHandling & self::DISALLOW_LINKS) {
continue;
}

$path = $this->prefixer->stripPrefix($fileInfo->getPathname());

yield $fileInfo->isDir() ? new DirectoryAttributes($path) : new FileAttributes(
$path,
$fileInfo->getSize(),
null,
$fileInfo->getMTime()
);
}
}

public function move(string $source, string $destination): void
public function move(string $source, string $destination, Config $config): void
{
$sourcePath = $this->prefixer->prefixPath($source);
$destinationPath = $this->prefixer->prefixPath($destination);
$this->ensureDirectoryExists(
dirname($destinationPath),
$this->resolveDirectoryVisibility($config->get('directory_visibility'))
);

if ( ! rename($sourcePath, $destinationPath)) {
throw UnableToMoveFile::fromLocationTo($sourcePath, $destinationPath);
}
}

public function copy(string $source, string $destination): void
public function copy(string $source, string $destination, Config $config): void
{
}

Expand Down Expand Up @@ -297,4 +337,17 @@ public function lastModified(string $path): int
public function fileSize(string $path): int
{
}

private function listDirectory(string $location): Generator
{
$iterator = new DirectoryIterator($location);

foreach ($iterator as $item) {
if ($item->isDot()) {
continue;
}

yield $item;
}
}
}
14 changes: 14 additions & 0 deletions src/Local/LocalFilesystemTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use function fwrite;
use function getenv;
use function is_dir;
use function iterator_to_array;
use function rewind;

class LocalFilesystemTest extends TestCase
Expand Down Expand Up @@ -281,6 +282,19 @@ public function checking_if_a_file_exists_that_does_not_exsist()
$this->assertFalse($adapter->fileExists('/file.txt'));
}

/**
* @test
*/
public function listing_contents()
{
$adapter = new LocalFilesystem(static::ROOT);
$adapter->write('directory/filename.txt', 'content', new Config());
$adapter->write('filename.txt', 'content' , new Config());
$contents = iterator_to_array($adapter->listContents('/', false));

$this->assertCount(2, $contents);
}

private function streamWithContents(string $contents)
{
$stream = fopen('php://temp', 'w+b');
Expand Down
44 changes: 44 additions & 0 deletions src/UnableToMoveFile.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

declare(strict_types=1);

namespace League\Flysystem;

use RuntimeException;

class UnableToMoveFile extends RuntimeException implements FilesystemOperationFailed
{
/**
* @var string
*/
private $source;

/**
* @var string
*/
private $destination;

public function source(): string
{
return $this->source;
}

public function destination(): string
{
return $this->destination;
}

public static function fromLocationTo(string $sourcePath, string $destinationPath)
{
$e = new static("Unable to move file from $sourcePath to $destinationPath");
$e->source = $sourcePath;
$e->destination = $destinationPath;

return $e;
}

public function operationType(): string
{
return FilesystemOperationFailed::OPERATION_MOVE;
}
}

0 comments on commit 9f6ce4c

Please sign in to comment.