em-fs 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/em-fs/dir/glob.rb +22 -3
- data/lib/em-fs/file/stat.rb +64 -38
- data/lib/em-fs/fs/command.rb +2 -6
- data/lib/em-fs/version.rb +1 -1
- data/spec/dir/glob_spec.rb +93 -83
- data/spec/file/stat_spec.rb +3 -3
- data/spec/fileutils_spec.rb +4 -4
- data/spec/fs/rsync_command_spec.rb +4 -4
- data/spec/spec_helper.rb +2 -0
- metadata +5 -25
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZGQzZDIyMzlkZGEzZGVjZjUwNzEyM2IyMmU2N2Y4YTJkMjZlNGIwOQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YjE3MmY1NTI3YTc0NTE3MGIwM2VmY2M0YTZmZmUxYTY4ZTUwYWU4Yg==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YjdjYjdkZjQ0ZGJjMzUzM2MwMjRkOWEyOGM5OGUzZWM2NzBjOGE5Y2Q4NGFh
|
10
|
+
NjFlYTA4OThkNTFlYTExY2NmMmQ2OWE2MjdjOWJjMDllNzU2NGNmOTVkYTE2
|
11
|
+
ZDRmYjZjOTJkNDJlYzM2Y2RhYTUwNjk3MDlkODM3ODk2NTZmN2M=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MThhMjNjYTc0NTI2OWI3MjQyZGQ3ZmY4ODc0YWQ5NThlYjExZmYyY2Q1OWQy
|
14
|
+
MTRhNTUzMzE0ZTc4ZDg1NDc1ZDVhZWMzZDk4ODJjOTAyNjYwNTdjNmUwZDEz
|
15
|
+
MjI0NWJmNmQ0ZjlkNDRmZThlYzEyZjMzNzJiMjU4Y2Q3NDIwYTI=
|
data/lib/em-fs/dir/glob.rb
CHANGED
@@ -6,9 +6,15 @@ module EventMachine
|
|
6
6
|
|
7
7
|
def initialize pattern
|
8
8
|
@weight = nil
|
9
|
+
@type = nil
|
10
|
+
@finished_callbacks = []
|
9
11
|
parse pattern
|
10
12
|
end
|
11
13
|
|
14
|
+
def finish &block
|
15
|
+
@finished_callbacks << block
|
16
|
+
end
|
17
|
+
|
12
18
|
def parse pattern
|
13
19
|
root = []
|
14
20
|
|
@@ -34,13 +40,24 @@ module EventMachine
|
|
34
40
|
|
35
41
|
def each options = {}, &block
|
36
42
|
options = {
|
37
|
-
depth: :inf
|
43
|
+
depth: :inf,
|
44
|
+
type: :all
|
38
45
|
}.merge options
|
46
|
+
|
39
47
|
EM::SystemCommand.execute find_command(options) do |on|
|
48
|
+
stats = []
|
40
49
|
on.stdout.line do |line|
|
41
|
-
|
50
|
+
stat = File::Stat.parse(line)
|
51
|
+
stats << stat
|
52
|
+
block.call(stat) if block
|
53
|
+
end
|
54
|
+
on.success do
|
55
|
+
@finished_callbacks.each do |callback|
|
56
|
+
callback.call(stats)
|
57
|
+
end
|
42
58
|
end
|
43
59
|
end
|
60
|
+
self
|
44
61
|
end
|
45
62
|
|
46
63
|
def each_entry options = {}, &block
|
@@ -64,7 +81,8 @@ module EventMachine
|
|
64
81
|
private
|
65
82
|
def find_command options = {}
|
66
83
|
options = {
|
67
|
-
depth: (@weight || :inf)
|
84
|
+
depth: (@weight || :inf),
|
85
|
+
type: (@type || :all)
|
68
86
|
}.merge options
|
69
87
|
|
70
88
|
builder = EM::SystemCommand::Builder.new 'find'
|
@@ -72,6 +90,7 @@ module EventMachine
|
|
72
90
|
builder << [ :path, @path ] unless @path == "*" or @path == ''
|
73
91
|
builder << [ :name, @name ] unless @name == "*"
|
74
92
|
builder << [ :maxdepth, options[:depth] ] unless options[:depth] == :inf
|
93
|
+
builder << [ :type, options[:type] ] unless options[:type] == :all
|
75
94
|
builder << [ :printf, FORMAT ]
|
76
95
|
builder.to_s.gsub(/-+(\w)/, "-\\1")
|
77
96
|
end
|
data/lib/em-fs/file/stat.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module EventMachine
|
2
2
|
class File
|
3
3
|
class Stat
|
4
|
-
|
5
4
|
STAT_REGEX = /(\d+) (\d+) '([\w\/ ]+)' (\d+) (\d+) (\d+) '(.+)' (\d+) (\d+) ([\d.]+) ([\d.]+) ([\d.]+)/.freeze
|
6
5
|
|
7
6
|
# access rights octal
|
@@ -36,6 +35,15 @@ module EventMachine
|
|
36
35
|
S_IFREG = 0b00100000 # regular file
|
37
36
|
S_IFSOCK = 0b01000000 # socket
|
38
37
|
S_UNKNOWN = 0b10000000 # unknown
|
38
|
+
TYPE_MAPPING = {
|
39
|
+
'block device' => S_IFBLK,
|
40
|
+
'character device' => S_IFCHR,
|
41
|
+
'directory' => S_IFDIR,
|
42
|
+
'FIFO/pipe' => S_IFIFO,
|
43
|
+
'symlink' => S_IFLNK,
|
44
|
+
'regular file' => S_IFREG,
|
45
|
+
'socket' => S_IFSOCK
|
46
|
+
}
|
39
47
|
|
40
48
|
# Mode Flags
|
41
49
|
S_IRUSR = 0b100000000
|
@@ -57,22 +65,11 @@ module EventMachine
|
|
57
65
|
# @return [EM::File::Stat] The file stat object.
|
58
66
|
def parse str
|
59
67
|
if m = str.match(STAT_REGEX)
|
60
|
-
ftype = case m[3]
|
61
|
-
when 'block device' then S_IFBLK
|
62
|
-
when 'character device' then S_IFCHR
|
63
|
-
when 'directory' then S_IFDIR
|
64
|
-
when 'FIFO/pipe' then S_IFIFO
|
65
|
-
when 'symlink' then S_IFLNK
|
66
|
-
when 'regular file' then S_IFREG
|
67
|
-
when 'socket' then S_IFSOCK
|
68
|
-
else
|
69
|
-
S_UNKNOWN
|
70
|
-
end
|
71
68
|
EM::File::Stat.new path: m[7],
|
72
69
|
atime: Time.at(Integer(m[10].split('.')[0], 10)),
|
73
70
|
ctime: Time.at(Integer(m[12].split('.')[0], 10)),
|
74
71
|
dev: Integer(m[2], 10),
|
75
|
-
ftype:
|
72
|
+
ftype: (TYPE_MAPPING[m[3]] || S_UNKNOWN),
|
76
73
|
gid: Integer(m[4], 10),
|
77
74
|
ino: Integer(m[6], 10),
|
78
75
|
mode: Integer(m[1], 8),
|
@@ -117,17 +114,27 @@ module EventMachine
|
|
117
114
|
end
|
118
115
|
|
119
116
|
def executable?
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
117
|
+
if Process::UID.rid == 0
|
118
|
+
true
|
119
|
+
elsif rowned?
|
120
|
+
@mode & S_IXUSR != 0
|
121
|
+
elsif rgrpowned?
|
122
|
+
@mode & S_IXGRP != 0
|
123
|
+
else
|
124
|
+
@mode & S_IXOTH != 0
|
125
|
+
end
|
124
126
|
end
|
125
127
|
|
126
128
|
def executable_real?
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
129
|
+
if Process::UID.rid == 0
|
130
|
+
true
|
131
|
+
elsif rowned?
|
132
|
+
@mode & S_IXUSR != 0
|
133
|
+
elsif rgrpowned?
|
134
|
+
@mode & S_IXGRP != 0
|
135
|
+
else
|
136
|
+
@mode & S_IXOTH != 0
|
137
|
+
end
|
131
138
|
end
|
132
139
|
|
133
140
|
def file?
|
@@ -159,17 +166,27 @@ module EventMachine
|
|
159
166
|
end
|
160
167
|
|
161
168
|
def readable?
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
169
|
+
if Process::UID.eid == 0
|
170
|
+
return true
|
171
|
+
elsif owned?
|
172
|
+
return @mode & S_IRUSR != 0
|
173
|
+
elsif grpowned?
|
174
|
+
return @mode & S_IRGRP != 0
|
175
|
+
else
|
176
|
+
@mode & S_IROTH != 0
|
177
|
+
end
|
166
178
|
end
|
167
179
|
|
168
180
|
def readable_real?
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
181
|
+
if Process::UID.rid == 0
|
182
|
+
true
|
183
|
+
elsif rowned?
|
184
|
+
@mode & S_IRUSR != 0
|
185
|
+
elsif rgrpowned?
|
186
|
+
@mode & S_IRGRP != 0
|
187
|
+
else
|
188
|
+
@mode & S_IROTH != 0
|
189
|
+
end
|
173
190
|
end
|
174
191
|
|
175
192
|
def socket?
|
@@ -189,23 +206,32 @@ module EventMachine
|
|
189
206
|
end
|
190
207
|
|
191
208
|
def writable?
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
209
|
+
if Process::UID.rid == 0
|
210
|
+
true
|
211
|
+
elsif owned?
|
212
|
+
@mode & S_IWUSR != 0
|
213
|
+
elsif grpowned?
|
214
|
+
@mode & S_IWGRP != 0
|
215
|
+
else
|
216
|
+
@mode & S_IWOTH != 0
|
217
|
+
end
|
196
218
|
end
|
197
219
|
|
198
220
|
def writable_real?
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
221
|
+
if Process::UID.rid == 0
|
222
|
+
true
|
223
|
+
elsif rowned?
|
224
|
+
@mode & S_IWUSR != 0
|
225
|
+
elsif rgrpowned?
|
226
|
+
@mode & S_IWGRP != 0
|
227
|
+
else
|
228
|
+
@mode & S_IWOTH != 0
|
229
|
+
end
|
203
230
|
end
|
204
231
|
|
205
232
|
def zero?
|
206
233
|
@size == 0
|
207
234
|
end
|
208
|
-
|
209
235
|
end
|
210
236
|
end
|
211
237
|
end
|
data/lib/em-fs/fs/command.rb
CHANGED
@@ -3,7 +3,7 @@ module EventMachine
|
|
3
3
|
class FS
|
4
4
|
class Command < EM::SystemCommand
|
5
5
|
|
6
|
-
PROGRESS_REGEXP = /([A-Za-z0-9
|
6
|
+
PROGRESS_REGEXP = /([A-Za-z0-9\.,\-\/]+)\n[ ]+([^ ]+)/.freeze
|
7
7
|
|
8
8
|
##
|
9
9
|
# Invokes `#execute` of super-class and adds a progress matcher.
|
@@ -11,7 +11,7 @@ module EventMachine
|
|
11
11
|
super &block
|
12
12
|
|
13
13
|
stdout.match PROGRESS_REGEXP, match: :last, in: :output do |file, bytes|
|
14
|
-
receive_progress file, bytes.to_i
|
14
|
+
receive_progress file, bytes.gsub(/[^\d]/,'').to_i
|
15
15
|
end
|
16
16
|
|
17
17
|
self
|
@@ -49,10 +49,6 @@ module EventMachine
|
|
49
49
|
def progress_callbacks
|
50
50
|
@progress_callbacks ||= []
|
51
51
|
end
|
52
|
-
|
53
|
-
def progress_regexp
|
54
|
-
@progress_regexp ||= /([A-Za-z0-9\.\-\/]+)\n[ ]+(\d+)/.freeze
|
55
|
-
end
|
56
52
|
end
|
57
53
|
end
|
58
54
|
end
|
data/lib/em-fs/version.rb
CHANGED
data/spec/dir/glob_spec.rb
CHANGED
@@ -2,17 +2,6 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe EM::Dir::Glob do
|
5
|
-
before :all do
|
6
|
-
dirs = [ 'a', 'b/a', 'b/b', 'c/a/a', 'c/a/b' ].map { |p|
|
7
|
-
File.join(SPEC_ROOT, 'data', p)
|
8
|
-
}
|
9
|
-
files = [ 'a/x', 'b/x', 'b/a/x', 'b/a/y', 'b/a/z' ].map { |p|
|
10
|
-
File.join(SPEC_ROOT, 'data', p)
|
11
|
-
}
|
12
|
-
FileUtils.touch files
|
13
|
-
FileUtils.mkdir_p dirs
|
14
|
-
end
|
15
|
-
|
16
5
|
describe '#find_command' do
|
17
6
|
it 'should parse relative pattern' do
|
18
7
|
cmd = EM::Dir['./*.rb'].send :find_command
|
@@ -25,6 +14,32 @@ describe EM::Dir::Glob do
|
|
25
14
|
end
|
26
15
|
end
|
27
16
|
|
17
|
+
describe '#finish' do
|
18
|
+
it 'is called with an array of the matched file stat' do
|
19
|
+
@testEntries = []
|
20
|
+
pattern = File.join(SPEC_ROOT, 'data', '**', '*')
|
21
|
+
EM.run do
|
22
|
+
cmd = EM::Dir[pattern].each(depth: 1)
|
23
|
+
cmd.finish do |entries|
|
24
|
+
@testEntries = entries
|
25
|
+
EM.stop_event_loop
|
26
|
+
end
|
27
|
+
end
|
28
|
+
@testEntries.each do |stat|
|
29
|
+
stat.should be_a EM::File::Stat
|
30
|
+
end
|
31
|
+
@testEntries.map(&:path).should =~ [
|
32
|
+
'data',
|
33
|
+
'data/b',
|
34
|
+
'data/c',
|
35
|
+
'data/test2',
|
36
|
+
'data/test',
|
37
|
+
'data/a',
|
38
|
+
'data/test3'
|
39
|
+
].map {|e| File.join(SPEC_ROOT, e)}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
28
43
|
describe '#each' do
|
29
44
|
context 'with depth = 0' do
|
30
45
|
before :all do
|
@@ -34,23 +49,22 @@ describe EM::Dir::Glob do
|
|
34
49
|
cmd = EM::Dir[pattern].each depth: 1 do |entry|
|
35
50
|
@entries << entry.path
|
36
51
|
end
|
37
|
-
|
38
|
-
cmd.exit do
|
52
|
+
cmd.finish do
|
39
53
|
EM.stop_event_loop
|
40
54
|
end
|
41
55
|
end
|
42
56
|
end
|
43
57
|
|
44
58
|
it 'should execute the block for each entry' do
|
45
|
-
@entries.should
|
46
|
-
"
|
47
|
-
"
|
48
|
-
"
|
49
|
-
"
|
50
|
-
"
|
51
|
-
"
|
52
|
-
"
|
53
|
-
]
|
59
|
+
@entries.should =~ [
|
60
|
+
"data",
|
61
|
+
"data/b",
|
62
|
+
"data/c",
|
63
|
+
"data/test2",
|
64
|
+
"data/test",
|
65
|
+
"data/a",
|
66
|
+
"data/test3"
|
67
|
+
].map {|e| File.join(SPEC_ROOT, e)}
|
54
68
|
end
|
55
69
|
end
|
56
70
|
|
@@ -62,28 +76,27 @@ describe EM::Dir::Glob do
|
|
62
76
|
cmd = EM::Dir[pattern].each depth: 2 do |entry|
|
63
77
|
@entries << entry.path
|
64
78
|
end
|
65
|
-
|
66
|
-
cmd.exit do
|
79
|
+
cmd.finish do
|
67
80
|
EM.stop_event_loop
|
68
81
|
end
|
69
82
|
end
|
70
83
|
end
|
71
84
|
|
72
85
|
it 'should execute the block for each entry and directory´s entry' do
|
73
|
-
@entries.should
|
74
|
-
"
|
75
|
-
"
|
76
|
-
"
|
77
|
-
"
|
78
|
-
"
|
79
|
-
"
|
80
|
-
"
|
81
|
-
"
|
82
|
-
"
|
83
|
-
"
|
84
|
-
"
|
85
|
-
"
|
86
|
-
]
|
86
|
+
@entries.should =~ [
|
87
|
+
"data",
|
88
|
+
"data/b",
|
89
|
+
"data/b/b",
|
90
|
+
"data/b/x",
|
91
|
+
"data/b/a",
|
92
|
+
"data/c",
|
93
|
+
"data/c/a",
|
94
|
+
"data/test2",
|
95
|
+
"data/test",
|
96
|
+
"data/a",
|
97
|
+
"data/a/x",
|
98
|
+
"data/test3"
|
99
|
+
].map {|e| File.join(SPEC_ROOT, e)}
|
87
100
|
end
|
88
101
|
end
|
89
102
|
|
@@ -95,33 +108,32 @@ describe EM::Dir::Glob do
|
|
95
108
|
cmd = EM::Dir[pattern].each depth: :inf do |entry|
|
96
109
|
@entries << entry.path
|
97
110
|
end
|
98
|
-
|
99
|
-
cmd.exit do
|
111
|
+
cmd.finish do
|
100
112
|
EM.stop_event_loop
|
101
113
|
end
|
102
114
|
end
|
103
115
|
end
|
104
116
|
|
105
117
|
it 'should execute the block for each entry in tree' do
|
106
|
-
@entries.should
|
107
|
-
"
|
108
|
-
"
|
109
|
-
"
|
110
|
-
"
|
111
|
-
"
|
112
|
-
"
|
113
|
-
"
|
114
|
-
"
|
115
|
-
"
|
116
|
-
"
|
117
|
-
"
|
118
|
-
"
|
119
|
-
"
|
120
|
-
"
|
121
|
-
"
|
122
|
-
"
|
123
|
-
"
|
124
|
-
]
|
118
|
+
@entries.should =~ [
|
119
|
+
"data",
|
120
|
+
"data/b",
|
121
|
+
"data/b/b",
|
122
|
+
"data/b/x",
|
123
|
+
"data/b/a",
|
124
|
+
"data/b/a/x",
|
125
|
+
"data/b/a/z",
|
126
|
+
"data/b/a/y",
|
127
|
+
"data/c",
|
128
|
+
"data/c/a",
|
129
|
+
"data/c/a/b",
|
130
|
+
"data/c/a/a",
|
131
|
+
"data/test2",
|
132
|
+
"data/test",
|
133
|
+
"data/a",
|
134
|
+
"data/a/x",
|
135
|
+
"data/test3"
|
136
|
+
].map {|e| File.join(SPEC_ROOT, e)}
|
125
137
|
end
|
126
138
|
end
|
127
139
|
end
|
@@ -134,15 +146,14 @@ describe EM::Dir::Glob do
|
|
134
146
|
cmd = EM::Dir[pattern].each_entry do |entry|
|
135
147
|
@entries << entry
|
136
148
|
end
|
137
|
-
|
138
|
-
cmd.exit do
|
149
|
+
cmd.finish do
|
139
150
|
EM.stop_event_loop
|
140
151
|
end
|
141
152
|
end
|
142
153
|
end
|
143
154
|
|
144
155
|
it 'should execute a block with file name for each entry' do
|
145
|
-
@entries.should
|
156
|
+
@entries.should =~ [ "data", "b", "c", "test2", "test", "a", "test3" ]
|
146
157
|
end
|
147
158
|
end
|
148
159
|
|
@@ -154,33 +165,32 @@ describe EM::Dir::Glob do
|
|
154
165
|
cmd = EM::Dir[pattern].each_path do |path|
|
155
166
|
@entries << path
|
156
167
|
end
|
157
|
-
|
158
|
-
cmd.exit do
|
168
|
+
cmd.finish do
|
159
169
|
EM.stop_event_loop
|
160
170
|
end
|
161
171
|
end
|
162
172
|
end
|
163
173
|
|
164
174
|
it 'should execute a block with full path for each entry' do
|
165
|
-
@entries.should
|
166
|
-
"
|
167
|
-
"
|
168
|
-
"
|
169
|
-
"
|
170
|
-
"
|
171
|
-
"
|
172
|
-
"
|
173
|
-
"
|
174
|
-
"
|
175
|
-
"
|
176
|
-
"
|
177
|
-
"
|
178
|
-
"
|
179
|
-
"
|
180
|
-
"
|
181
|
-
"
|
182
|
-
"
|
183
|
-
]
|
175
|
+
@entries.should =~ [
|
176
|
+
"data",
|
177
|
+
"data/b",
|
178
|
+
"data/b/b",
|
179
|
+
"data/b/x",
|
180
|
+
"data/b/a",
|
181
|
+
"data/b/a/x",
|
182
|
+
"data/b/a/z",
|
183
|
+
"data/b/a/y",
|
184
|
+
"data/c",
|
185
|
+
"data/c/a",
|
186
|
+
"data/c/a/b",
|
187
|
+
"data/c/a/a",
|
188
|
+
"data/test2",
|
189
|
+
"data/test",
|
190
|
+
"data/a",
|
191
|
+
"data/a/x",
|
192
|
+
"data/test3"
|
193
|
+
].map {|e| File.join(SPEC_ROOT, e)}
|
184
194
|
end
|
185
195
|
end
|
186
196
|
end
|
data/spec/file/stat_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe EM::File::Stat do
|
|
4
4
|
describe '.parse' do
|
5
5
|
context 'parsed stat' do
|
6
6
|
subject do
|
7
|
-
EM::File::Stat.parse "644 2050 'regular file'
|
7
|
+
EM::File::Stat.parse "644 2050 'regular file' #{Process::GID.eid} 1 2623327 '/home/arthur/test' 218759168 #{Process::UID.eid} 1340357826 1340357846 1340357846"
|
8
8
|
end
|
9
9
|
|
10
10
|
its(:atime) { should == Time.at(1340357826) }
|
@@ -17,7 +17,7 @@ describe EM::File::Stat do
|
|
17
17
|
its(:executable_real?) { should == false }
|
18
18
|
its(:file?) { should == true }
|
19
19
|
its(:ftype) { should == EM::File::Stat::S_IFREG }
|
20
|
-
its(:gid) { should ==
|
20
|
+
its(:gid) { should == Process::GID.eid }
|
21
21
|
its(:grpowned?) { should == true }
|
22
22
|
its(:ino) { should == 2623327 }
|
23
23
|
its(:mode) { should == '644' }
|
@@ -30,7 +30,7 @@ describe EM::File::Stat do
|
|
30
30
|
its(:size) { should == 218759168 }
|
31
31
|
its(:socket?) { should == false }
|
32
32
|
its(:symlink?) { should == false }
|
33
|
-
its(:uid) { should ==
|
33
|
+
its(:uid) { should == Process::UID.eid }
|
34
34
|
its(:world_readable?) { should == 420 }
|
35
35
|
its(:world_writable?) { should == nil }
|
36
36
|
its(:writable?) { should == true }
|
data/spec/fileutils_spec.rb
CHANGED
@@ -401,8 +401,8 @@ describe EM::FileUtils do
|
|
401
401
|
it 'should invoke `chown`' do
|
402
402
|
EM.run do
|
403
403
|
@dir = File.join(SPEC_ROOT, 'data', 'test')
|
404
|
-
cmd = EM::FileUtils.chown '
|
405
|
-
cmd.command.should == 'chown
|
404
|
+
cmd = EM::FileUtils.chown 'nobody', 'users', '/usr/bin/test'
|
405
|
+
cmd.command.should == 'chown nobody:users /usr/bin/test'
|
406
406
|
EM.stop_event_loop
|
407
407
|
end
|
408
408
|
end
|
@@ -412,8 +412,8 @@ describe EM::FileUtils do
|
|
412
412
|
it 'should invoke `chown -r`' do
|
413
413
|
EM.run do
|
414
414
|
@dir = File.join(SPEC_ROOT, 'data', 'test')
|
415
|
-
cmd = EM::FileUtils.chown_R '
|
416
|
-
cmd.command.should == 'chown -R
|
415
|
+
cmd = EM::FileUtils.chown_R 'nobody', 'users', '/usr/bin/test'
|
416
|
+
cmd.command.should == 'chown -R nobody:users /usr/bin/test'
|
417
417
|
EM.stop_event_loop
|
418
418
|
end
|
419
419
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe EM::FS::RsyncCommand do
|
4
4
|
context 'copying one file' do
|
5
|
-
before :
|
5
|
+
before :each do
|
6
6
|
@source = File.join SPEC_ROOT, 'data', 'test'
|
7
7
|
@target = File.join SPEC_ROOT, 'data', 'test.copy'
|
8
8
|
@progress_updates = {}
|
@@ -20,7 +20,7 @@ describe EM::FS::RsyncCommand do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
after :
|
23
|
+
after :each do
|
24
24
|
FileUtils.rm_rf @target
|
25
25
|
end
|
26
26
|
|
@@ -35,7 +35,7 @@ describe EM::FS::RsyncCommand do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
context 'copying multiple files' do
|
38
|
-
before :
|
38
|
+
before :each do
|
39
39
|
@source1 = File.join SPEC_ROOT, 'data', 'test'
|
40
40
|
@source2 = File.join SPEC_ROOT, 'data', 'test2'
|
41
41
|
@source3 = File.join SPEC_ROOT, 'data', 'test3'
|
@@ -55,7 +55,7 @@ describe EM::FS::RsyncCommand do
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
after :
|
58
|
+
after :each do
|
59
59
|
FileUtils.rm_rf @target
|
60
60
|
end
|
61
61
|
|
data/spec/spec_helper.rb
CHANGED
@@ -12,6 +12,8 @@ EventMachine.instance_eval do
|
|
12
12
|
end
|
13
13
|
end unless EM.respond_to?(:assertions)
|
14
14
|
|
15
|
+
system("cd #{SPEC_ROOT}/data; mkdir -p a b/a b/b c/a/{a,b}")
|
16
|
+
system("cd #{SPEC_ROOT}/data; touch {a,b}/x b/a/{x,y,z}")
|
15
17
|
unless File.exists?(File.join(SPEC_ROOT, 'data', 'test')) and
|
16
18
|
File.exists?(File.join(SPEC_ROOT, 'data', 'test2')) and
|
17
19
|
File.exists?(File.join(SPEC_ROOT, 'data', 'test3'))
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-fs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Arthur Leonard Andersen
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-09-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,7 +27,6 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: guard
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ! '>='
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ! '>='
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: guard-rspec
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: eventmachine
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ! '>='
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :runtime
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ! '>='
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -94,7 +83,6 @@ dependencies:
|
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: em-systemcommand
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
87
|
- - ! '>='
|
100
88
|
- !ruby/object:Gem::Version
|
@@ -102,7 +90,6 @@ dependencies:
|
|
102
90
|
type: :runtime
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
94
|
- - ! '>='
|
108
95
|
- !ruby/object:Gem::Version
|
@@ -145,33 +132,26 @@ files:
|
|
145
132
|
- spec/spec_helper.rb
|
146
133
|
homepage: http://github.com/leoc/em-fs
|
147
134
|
licenses: []
|
135
|
+
metadata: {}
|
148
136
|
post_install_message:
|
149
137
|
rdoc_options: []
|
150
138
|
require_paths:
|
151
139
|
- lib
|
152
140
|
required_ruby_version: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
141
|
requirements:
|
155
142
|
- - ! '>='
|
156
143
|
- !ruby/object:Gem::Version
|
157
144
|
version: '0'
|
158
|
-
segments:
|
159
|
-
- 0
|
160
|
-
hash: 4225417122368326630
|
161
145
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
146
|
requirements:
|
164
147
|
- - ! '>='
|
165
148
|
- !ruby/object:Gem::Version
|
166
149
|
version: '0'
|
167
|
-
segments:
|
168
|
-
- 0
|
169
|
-
hash: 4225417122368326630
|
170
150
|
requirements: []
|
171
151
|
rubyforge_project:
|
172
|
-
rubygems_version:
|
152
|
+
rubygems_version: 2.2.2
|
173
153
|
signing_key:
|
174
|
-
specification_version:
|
154
|
+
specification_version: 4
|
175
155
|
summary: Invoke filesystem calls without blocking.
|
176
156
|
test_files:
|
177
157
|
- spec/dir/glob_spec.rb
|