Skip to content

Commit

Permalink
Implement basic methods
Browse files Browse the repository at this point in the history
  • Loading branch information
mjacobus committed Apr 28, 2020
1 parent a04c7ef commit 4be7b3e
Show file tree
Hide file tree
Showing 5 changed files with 158 additions and 1 deletion.
45 changes: 44 additions & 1 deletion lib/koine/file_system/adapters/local.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,36 @@ def write(path, content, options: {})
end
end

def list(dir = '', recursive: false)
Dir[create_list_pattern(dir, recursive)].map do |file|
metadata_for(file)
end
end

def size(path)
File.size(full_path(path))
end

private

# rubocop:disable Metrics/MethodLength
def metadata_for(file)
relative_path = file.sub("#{@root}/", '')
type = File.directory?(file) ? 'dir' : 'file'
filename = File.basename(file)

{
path: relative_path,
type: type,
extension: type == 'dir' ? nil : filename.split('.').last,
filename: filename,
dirname: File.dirname(relative_path),
timestamp: File.mtime(file),
size: size(relative_path)
}
end
# rubocop:enable Metrics/MethodLength

def full_path(path)
File.expand_path(sanitize_path(path), @root)
end
Expand All @@ -51,6 +79,22 @@ def sanitize_path(path)
@path_sanitizer.sanitize(path)
end

def create_list_pattern(dir, recursive)
dir = sanitize_path(dir)
parts = [@root]

unless dir.empty?
parts << dir
end

if recursive
parts << '**'
end

parts << '*'
parts.join('/')
end

# def update(_path, _contents, options: {})
# def delete(_path)
# def read_and_delete(_path)
Expand All @@ -60,7 +104,6 @@ def sanitize_path(path)
# def size(_path)
# def create_dir(_path)
# def delete_dir(_path)
# def list(_path, recursive: false)
end
# rubocop:enable Lint/UnusedMethodArgument
end
Expand Down
Binary file added spec/fixtures/list_sandbox/folder1/sample.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified spec/fixtures/list_sandbox/sample.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified spec/fixtures/sample.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
114 changes: 114 additions & 0 deletions spec/koine/file_system/adapters/local_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,118 @@
expect(copy).to eq(original)
end
end

describe '#list' do
let(:adapter) { described_class.new(root: "#{FIXTURES_PATH}/list_sandbox/") }

it 'lists primary contents without args' do
result = adapter.list

paths = result.map { |r| r[:path] }.sort

expect(paths).to eq(['folder1', 'sample.png', 'sample.txt'].sort)
end

it 'lists folder contents without recursion' do
result = adapter.list('folder1')

paths = result.map { |r| r[:path] }.sort

expect(paths).to eq(['folder1/folder2', 'folder1/sample.png'].sort)
end

it 'lists folder contents with recursion' do
result = adapter.list('folder1', recursive: true)

paths = result.map { |r| r[:path] }.sort

expect(paths).to eq([
'folder1/folder2',
'folder1/sample.png',
'folder1/folder2/sample.txt'
].sort)
end

it 'returns type' do
result = adapter.list

map = result.map { |r| [r[:path], r[:type]] }.sort

expected = [
%w[folder1 dir],
['sample.png', 'file'],
['sample.txt', 'file']
].sort

expect(map).to eq(expected)
end

it 'returns extensions' do
result = adapter.list

map = result.map { |r| [r[:path], r[:extension]] }.sort

expected = [
['folder1', nil],
['sample.png', 'png'],
['sample.txt', 'txt']
].sort

expect(map).to eq(expected)
end

it 'returns filenames' do
result = adapter.list('folder1')

map = result.map { |r| [r[:path], r[:filename]] }.sort

expected = [
['folder1/folder2', 'folder2'],
['folder1/sample.png', 'sample.png']
].sort

expect(map).to eq(expected)
end

it 'returns dirname' do
result = adapter.list('folder1')

map = result.map { |r| [r[:path], r[:dirname]] }.sort

expected = [
['folder1/folder2', 'folder1'],
['folder1/sample.png', 'folder1']
].sort

expect(map).to eq(expected)
end

it 'returns file sizes' do
result = adapter.list

map = result.map { |r| [r[:path], r[:size]] }.sort

expected = [
['folder1', 4096],
['sample.png', 85_874],
['sample.txt', 40]
].sort

expect(map).to eq(expected)
end

it 'returns file timestamps' do
result = adapter.list

map = result.map { |r| [r[:path], r[:timestamp].utc.to_s] }.sort

expected = [
['folder1', '2020-04-28 18:25:28 UTC'],
['sample.png', '2020-04-28 18:37:42 UTC'],
['sample.txt', '2020-04-28 17:51:01 UTC']
].sort

expect(map).to eq(expected)
end
end
end

0 comments on commit 4be7b3e

Please sign in to comment.