fs 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/README.mdown +58 -0
- data/Rakefile +6 -0
- data/fs.gemspec +22 -0
- data/lib/fs.rb +80 -0
- data/lib/fs/version.rb +3 -0
- data/spec/fs_spec.rb +196 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/support/fakefs_support.rb +32 -0
- metadata +89 -0
data/Gemfile
ADDED
data/README.mdown
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# FS (FileSystem)
|
2
|
+
|
3
|
+
Work with your filesystem!
|
4
|
+
|
5
|
+
## Problem
|
6
|
+
|
7
|
+
This Gem shouldn't reinvent the wheel or be a replacement.
|
8
|
+
But in Ruby working with the filesystem really hurts!
|
9
|
+
|
10
|
+
In your toolbox are at least `File`, `Dir`, `FileUtils`, `Find`, and maybe some more.
|
11
|
+
Good tools, but to complicated for most cases.
|
12
|
+
It's not about piping, or copying the shell as it is.
|
13
|
+
But think about a simple `ls` in the shell, than how you would do this in Ruby.
|
14
|
+
Got the idea?
|
15
|
+
|
16
|
+
## Solution
|
17
|
+
|
18
|
+
`FS` gathers the cluttered methods for working with files and dirs. Internally
|
19
|
+
using the good old standard library, but providing simple methods in a single place.
|
20
|
+
|
21
|
+
## Examples
|
22
|
+
|
23
|
+
FS.changedir('~/Projects/fs')
|
24
|
+
==> "/Users/bjuenger/Projects/fs"
|
25
|
+
FS.list('.')
|
26
|
+
==> [".git", ".gitignore", ".rvmrc", "fs.gemspec", "Gemfile", "Gemfile.lock", "lib", "Rakefile", "README.mdown", "spec"]
|
27
|
+
FS.makedirs('tmp/demo')
|
28
|
+
FS.touch('tmp/demo/newfile.txt')
|
29
|
+
FS.list('tmp/demo')
|
30
|
+
==> ["newfile.txt"]
|
31
|
+
FS.remove('tmp/demo/newfile.txt')
|
32
|
+
FS.list('tmp/demo')
|
33
|
+
==> []
|
34
|
+
|
35
|
+
## Aliases
|
36
|
+
|
37
|
+
Although verbose method names are good, there are some aliases for unix shell
|
38
|
+
commands (unsorted).
|
39
|
+
|
40
|
+
- ls => list
|
41
|
+
- mkdir => makedir
|
42
|
+
- mkdir_p => makedirs
|
43
|
+
- cd => changedir
|
44
|
+
- mv => move
|
45
|
+
- cp => copy
|
46
|
+
- rm => remove
|
47
|
+
- ln => link
|
48
|
+
- cat => read (no concatenate)
|
49
|
+
|
50
|
+
## Todo
|
51
|
+
|
52
|
+
- Aliases
|
53
|
+
- list(dir, '*.rb')
|
54
|
+
|
55
|
+
## BTW
|
56
|
+
|
57
|
+
If you need a replacement for the shell in pure ruby, than have a look at
|
58
|
+
[Rush](http://rush.heroku.com/).
|
data/Rakefile
ADDED
data/fs.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "fs/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "fs"
|
7
|
+
s.version = FS::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Bernd Jünger"]
|
10
|
+
s.email = ["blindgaenger@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/blindgaenger/fs"
|
12
|
+
s.summary = %q{Work with your filesystem!}
|
13
|
+
s.description = %q{FS gathers the cluttered methods for working with files and dirs. Internally using the good old standard library, but providing simple methods in a single place.}
|
14
|
+
|
15
|
+
s.add_development_dependency 'rspec', '2.5.0'
|
16
|
+
s.add_development_dependency 'fakefs', '0.3.1'
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
end
|
data/lib/fs.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module FS
|
4
|
+
extend self
|
5
|
+
|
6
|
+
# FileUtils.touch
|
7
|
+
def touch(files)
|
8
|
+
FileUtils.touch(files)
|
9
|
+
end
|
10
|
+
|
11
|
+
# FileUtils#mkdir
|
12
|
+
def makedir(dirs)
|
13
|
+
FileUtils.mkdir(dirs)
|
14
|
+
end
|
15
|
+
|
16
|
+
# FileUtils#mkdir_p
|
17
|
+
def makedirs(dirs)
|
18
|
+
FileUtils.mkdir_p(dirs)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Dir#entries
|
22
|
+
def list(dir, pattern='*')
|
23
|
+
glob(dir, pattern)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Find#find
|
27
|
+
def find(dir, pattern='*')
|
28
|
+
glob(dir, '**', pattern)
|
29
|
+
end
|
30
|
+
|
31
|
+
# FileUtils#mv
|
32
|
+
def move(*froms, to)
|
33
|
+
froms.each do |from|
|
34
|
+
FileUtils.mv(from, to)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# FileUtils#rm
|
39
|
+
def remove(*pathes)
|
40
|
+
FileUtils.rm(pathes, :verbose => true)
|
41
|
+
end
|
42
|
+
|
43
|
+
# File#open(file, 'w')
|
44
|
+
def write(file, content=nil, &block)
|
45
|
+
if block_given?
|
46
|
+
File.open(file, 'w', &block)
|
47
|
+
else
|
48
|
+
File.open(file, 'w') {|f| f.write(content) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# File#open(file, 'r')
|
53
|
+
def read(file, &block)
|
54
|
+
if block_given?
|
55
|
+
File.open(file, 'r', &block)
|
56
|
+
else
|
57
|
+
content = nil
|
58
|
+
File.open(file, 'r') {|f| content = f.read }
|
59
|
+
content
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def root
|
65
|
+
'/'
|
66
|
+
end
|
67
|
+
|
68
|
+
def home(user=nil)
|
69
|
+
Dir.home(user)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def glob(dir, *patterns)
|
75
|
+
Dir.glob(File.join(dir, patterns)).map do |path|
|
76
|
+
path.gsub(/^\.?#{dir}\/?/, '')
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
data/lib/fs/version.rb
ADDED
data/spec/fs_spec.rb
ADDED
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FS do
|
4
|
+
|
5
|
+
describe 'touch' do
|
6
|
+
it 'touches a single file' do
|
7
|
+
file = '/foobar.txt'
|
8
|
+
FS.touch(file)
|
9
|
+
File.exist?(file).should be_true
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'touches a list of files' do
|
13
|
+
files = ['/foo.txt', '/bar.txt']
|
14
|
+
FS.touch(files)
|
15
|
+
files.each do |file|
|
16
|
+
File.exist?(file).should be_true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'makedir' do
|
22
|
+
it 'creates a dir' do
|
23
|
+
FS.makedir('/foo')
|
24
|
+
File.directory?('/foo').should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'fails if a parent dir is missing' do
|
28
|
+
lambda {FS.makedir('/foo/bar')}.should raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'makedirs' do
|
33
|
+
it 'creates all missing parent dirs' do
|
34
|
+
FS.makedirs '/foo/bar/baz'
|
35
|
+
File.directory?('/foo').should be_true
|
36
|
+
File.directory?('/foo/bar').should be_true
|
37
|
+
File.directory?('/foo/bar/baz').should be_true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'list' do
|
42
|
+
it 'returns an empty list if there are no files' do
|
43
|
+
FS.list('/').should be_empty
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'lists all files and dirs (without . and ..)' do
|
47
|
+
FS.touch('/foo')
|
48
|
+
FS.makedir('/bar')
|
49
|
+
FS.list('/').should eql(['foo', 'bar'])
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'globs files and dirs' do
|
53
|
+
FS.touch('/file.txt')
|
54
|
+
FS.touch('/file.rb')
|
55
|
+
FS.makedir('/dir.txt')
|
56
|
+
FS.makedir('/dir.rb')
|
57
|
+
FS.list('/', '*.txt').should eql(['file.txt', 'dir.txt'])
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'lists files and dirs in a subdir' do
|
61
|
+
FS.makedir('/foo')
|
62
|
+
FS.makedir('/foo/dir')
|
63
|
+
FS.touch('/foo/file')
|
64
|
+
FS.list('/foo').should eql(['dir', 'file'])
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'globs files and dirs in a subdir' do
|
68
|
+
FS.makedir('/foo')
|
69
|
+
FS.touch('/foo/file.txt')
|
70
|
+
FS.touch('/foo/file.rb')
|
71
|
+
FS.makedir('/foo/dir.txt')
|
72
|
+
FS.makedir('/foo/dir.rb')
|
73
|
+
FS.list('/foo', '*.txt').should eql(['dir.txt', 'file.txt'])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'find' do
|
78
|
+
it 'returns an empty list if there are no files' do
|
79
|
+
FS.list('/').should be_empty
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'finds files in all subdirs' do
|
83
|
+
FS.makedirs('/one/two/three')
|
84
|
+
FS.touch('/one/file.one')
|
85
|
+
FS.touch('/one/two/three/file.three')
|
86
|
+
FS.find('/').should eql([
|
87
|
+
'one',
|
88
|
+
'one/file.one',
|
89
|
+
'one/two',
|
90
|
+
'one/two/three',
|
91
|
+
'one/two/three/file.three'
|
92
|
+
])
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'globs files in all subdirs' do
|
96
|
+
FS.makedirs('/one/two/three')
|
97
|
+
FS.touch('/one/file.one')
|
98
|
+
FS.touch('/one/two/three/file.three')
|
99
|
+
FS.find('/', 'file.*').should eql([
|
100
|
+
'one/file.one',
|
101
|
+
'one/two/three/file.three'
|
102
|
+
])
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe 'move' do
|
107
|
+
it 'rename a file' do
|
108
|
+
FS.touch('/foo.txt')
|
109
|
+
FS.move('/foo.txt', '/bar.txt')
|
110
|
+
FS.list('/').should eql(['bar.txt'])
|
111
|
+
end
|
112
|
+
|
113
|
+
# FIXME: fakefs
|
114
|
+
# it 'moves a file' do
|
115
|
+
# FS.touch('/foo.txt')
|
116
|
+
# FS.makedirs('/tmp')
|
117
|
+
# FS.move('/foo.txt', '/tmp')
|
118
|
+
# FS.list('/').should eql(['tmp'])
|
119
|
+
# FS.list('/tmp').should eql(['foo.txt'])
|
120
|
+
# end
|
121
|
+
|
122
|
+
# FIXME: fakefs
|
123
|
+
# it 'moves files and dirs' do
|
124
|
+
# FS.touch('/file')
|
125
|
+
# FS.makedir('/dir')
|
126
|
+
# FS.makedir('/tmp')
|
127
|
+
# FS.move('/file', '/dir', '/tmp')
|
128
|
+
# FS.list('/').should eql(['tmp'])
|
129
|
+
# FS.list('/tmp').should eql(['file', 'dir'])
|
130
|
+
# end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'remove' do
|
134
|
+
it 'removes files and dirs' do
|
135
|
+
FS.touch('/file')
|
136
|
+
FS.makedir('/dir')
|
137
|
+
FS.remove('/file', '/dir')
|
138
|
+
FS.list('/').should be_empty
|
139
|
+
end
|
140
|
+
|
141
|
+
# FIXME: fakefs
|
142
|
+
# it 'fails if the dir is not empty' do
|
143
|
+
# FS.makedir('/foo')
|
144
|
+
# FS.touch('/foo/bar')
|
145
|
+
# lambda {FS.remove('/foo')}.should raise_error
|
146
|
+
# end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe 'write' do
|
150
|
+
it 'writes content from a string' do
|
151
|
+
FS.write('/foo.txt', 'bar')
|
152
|
+
File.open('/foo.txt').read.should eql('bar')
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'writes content from a block' do
|
156
|
+
FS.write('/foo.txt') {|f| f.write 'bar' }
|
157
|
+
File.open('/foo.txt').read.should eql('bar')
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe 'read' do
|
162
|
+
it 'reads the content to a string' do
|
163
|
+
File.open('/foo.txt', 'w') {|f| f.write 'bar' }
|
164
|
+
FS.read('/foo.txt').should eql('bar')
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'reads the content to a block' do
|
168
|
+
File.open('/foo.txt', 'w') {|f| f.write 'bar' }
|
169
|
+
FS.read('/foo.txt') {|f| f.read.should eql('bar')}
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
describe 'root' do
|
174
|
+
it 'always returns /' do
|
175
|
+
FS.root.should eql('/')
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe 'home' do
|
180
|
+
it 'returns the home of the current user' do
|
181
|
+
FS.home.should eql('/Users/me')
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'returns the home of another user' do
|
185
|
+
FS.home('you').should eql('/Users/you')
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
# describe 'removedir'
|
190
|
+
# describe 'removedirs'
|
191
|
+
# describe 'currentdir'
|
192
|
+
# describe 'changedir'
|
193
|
+
# describe 'copy'
|
194
|
+
# describe 'link'
|
195
|
+
|
196
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'fakefs/spec_helpers'
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.include FakeFS::SpecHelpers
|
5
|
+
end
|
6
|
+
|
7
|
+
# FileUtils.mkdir is not handled
|
8
|
+
# https://github.com/defunkt/fakefs/issues/closed#issue/37
|
9
|
+
#
|
10
|
+
# Patch:
|
11
|
+
# https://github.com/flavio/fakefs/blob/ea22773bc293ea3bce97317086b8171669780eab/lib/fakefs/fileutils.rb
|
12
|
+
module FakeFS
|
13
|
+
module FileUtils
|
14
|
+
extend self
|
15
|
+
def mkdir(path)
|
16
|
+
parent = path.split('/')
|
17
|
+
parent.pop
|
18
|
+
raise Errno::ENOENT, "No such file or directory - #{path}" unless parent.join == "" || FileSystem.find(parent.join('/'))
|
19
|
+
raise Errno::EEXIST, "File exists - #{path}" if FileSystem.find(path)
|
20
|
+
FileSystem.add(path, FakeDir.new)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
module FakeFS
|
27
|
+
class Dir
|
28
|
+
def self.home(user=nil)
|
29
|
+
"/Users/#{user || 'me'}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- "Bernd J\xC3\xBCnger"
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-03-28 00:00:00 +02:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rspec
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - "="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 2.5.0
|
25
|
+
type: :development
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: fakefs
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - "="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 0.3.1
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
38
|
+
description: FS gathers the cluttered methods for working with files and dirs. Internally using the good old standard library, but providing simple methods in a single place.
|
39
|
+
email:
|
40
|
+
- blindgaenger@gmail.com
|
41
|
+
executables: []
|
42
|
+
|
43
|
+
extensions: []
|
44
|
+
|
45
|
+
extra_rdoc_files: []
|
46
|
+
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- README.mdown
|
51
|
+
- Rakefile
|
52
|
+
- fs.gemspec
|
53
|
+
- lib/fs.rb
|
54
|
+
- lib/fs/version.rb
|
55
|
+
- spec/fs_spec.rb
|
56
|
+
- spec/spec_helper.rb
|
57
|
+
- spec/support/fakefs_support.rb
|
58
|
+
has_rdoc: true
|
59
|
+
homepage: http://github.com/blindgaenger/fs
|
60
|
+
licenses: []
|
61
|
+
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: "0"
|
79
|
+
requirements: []
|
80
|
+
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 1.6.2
|
83
|
+
signing_key:
|
84
|
+
specification_version: 3
|
85
|
+
summary: Work with your filesystem!
|
86
|
+
test_files:
|
87
|
+
- spec/fs_spec.rb
|
88
|
+
- spec/spec_helper.rb
|
89
|
+
- spec/support/fakefs_support.rb
|