and_feathers 1.0.0.pre → 1.0.0.pre.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.
- checksums.yaml +4 -4
- data/and_feathers.gemspec +1 -2
- data/lib/and_feathers/directory.rb +25 -3
- data/lib/and_feathers/file.rb +12 -1
- data/lib/and_feathers/version.rb +1 -1
- data/spec/unit/directory_spec.rb +112 -42
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d9656435e6178a04aab438ddf7e730aa2d577b8
|
4
|
+
data.tar.gz: 49ac9dc20c608f43b2c90cf9a28bb462718c0439
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b30cb6a4608a3608ae83cba864e65d1d050067aa22436c6a6e25cf4bf564e60e0aa066c25174f76673223fc702eb9439e856b20b4d3699792c22866f130d8598
|
7
|
+
data.tar.gz: d62bd5885dfd95b601cdd37a8b5e23ad20e7cc6462a4991869638fd9d410b9b8df2fdb2f5d1966baf957a184e5e704c897ece207013d8e8d398fd0da31148185
|
data/and_feathers.gemspec
CHANGED
@@ -14,8 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
|
-
spec.
|
18
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.test_files = spec.files.grep(%r{^spec/})
|
19
18
|
spec.require_paths = ["lib"]
|
20
19
|
|
21
20
|
spec.add_development_dependency "bundler", "~> 1.3"
|
@@ -9,7 +9,7 @@ module AndFeathers
|
|
9
9
|
include Enumerable
|
10
10
|
|
11
11
|
attr_reader :name, :mode
|
12
|
-
|
12
|
+
attr_accessor :parent
|
13
13
|
|
14
14
|
#
|
15
15
|
# @!attribute [r] name
|
@@ -36,6 +36,28 @@ module AndFeathers
|
|
36
36
|
@directories = {}
|
37
37
|
end
|
38
38
|
|
39
|
+
#
|
40
|
+
# Reset +parent+ and clone +files+ and +directories+ when calling +dup+ or
|
41
|
+
# +clone+ on a +Directory+
|
42
|
+
#
|
43
|
+
# @param source [Directory]
|
44
|
+
#
|
45
|
+
def initialize_copy(source)
|
46
|
+
super
|
47
|
+
|
48
|
+
@files = {}
|
49
|
+
@directories = {}
|
50
|
+
@parent = nil
|
51
|
+
|
52
|
+
source.directories.map(&:dup).each do |new_directory|
|
53
|
+
add_directory(new_directory)
|
54
|
+
end
|
55
|
+
|
56
|
+
source.files.map(&:dup).each do |new_file|
|
57
|
+
add_file(new_file)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
39
61
|
#
|
40
62
|
# This +Directory+'s path
|
41
63
|
#
|
@@ -80,7 +102,7 @@ module AndFeathers
|
|
80
102
|
raise ArgumentError, "#{other} is not a Directory"
|
81
103
|
end
|
82
104
|
|
83
|
-
|
105
|
+
dup.tap do |directory|
|
84
106
|
other.files.each do |file|
|
85
107
|
directory.add_file(file.dup)
|
86
108
|
end
|
@@ -91,7 +113,7 @@ module AndFeathers
|
|
91
113
|
if existing_directory.nil?
|
92
114
|
directory.add_directory(new_directory.dup)
|
93
115
|
else
|
94
|
-
directory.add_directory(new_directory
|
116
|
+
directory.add_directory(new_directory | existing_directory)
|
95
117
|
end
|
96
118
|
end
|
97
119
|
end
|
data/lib/and_feathers/file.rb
CHANGED
@@ -4,7 +4,7 @@ module AndFeathers
|
|
4
4
|
#
|
5
5
|
class File
|
6
6
|
attr_reader :name, :mode, :content
|
7
|
-
|
7
|
+
attr_accessor :parent
|
8
8
|
|
9
9
|
#
|
10
10
|
# @!attribute [r] name
|
@@ -34,6 +34,17 @@ module AndFeathers
|
|
34
34
|
@parent = nil
|
35
35
|
end
|
36
36
|
|
37
|
+
#
|
38
|
+
# Reset +parent+ when calling +dup+ or +clone+ on a +File+
|
39
|
+
#
|
40
|
+
# @param source [File]
|
41
|
+
#
|
42
|
+
def initialize_copy(source)
|
43
|
+
super
|
44
|
+
|
45
|
+
@parent = nil
|
46
|
+
end
|
47
|
+
|
37
48
|
#
|
38
49
|
# This +File+'s path
|
39
50
|
#
|
data/lib/and_feathers/version.rb
CHANGED
data/spec/unit/directory_spec.rb
CHANGED
@@ -3,66 +3,136 @@ require 'and_feathers/directory'
|
|
3
3
|
|
4
4
|
module AndFeathers
|
5
5
|
describe Directory do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
a.dir('c')
|
6
|
+
describe 'dupping/cloning' do
|
7
|
+
it 'does not preserve the parent relationship' do
|
8
|
+
one = Directory.new.tap { |d| d.file('a/b/c') }
|
9
|
+
|
10
|
+
b = one.find { |e| e.name == 'b' }
|
11
|
+
|
12
|
+
expect(b.dup.parent).to be_nil
|
14
13
|
end
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
describe '#|' do
|
17
|
+
it 'unions the contents of two directories' do
|
18
|
+
one = Directory.new
|
19
|
+
one.dir('a') do |a|
|
20
|
+
a.file('b/c')
|
21
|
+
a.dir('c')
|
19
22
|
end
|
23
|
+
|
24
|
+
two = Directory.new
|
25
|
+
two.file('a/b/d')
|
26
|
+
|
27
|
+
three = one | two
|
28
|
+
|
29
|
+
expect(three.to_a.map(&:path)).
|
30
|
+
to eql(['./a', './a/b', './a/b/c', './a/b/d', './a/c'])
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'does not mutate the left-hand side files' do
|
34
|
+
one = Directory.new.tap { |o| o.file('a/b') }
|
35
|
+
two = Directory.new.tap { |t| t.file('a/c') ; t.file('d/e') }
|
36
|
+
|
37
|
+
one_a = one.to_a.find { |e| e.name == 'a' }
|
38
|
+
|
39
|
+
expect do
|
40
|
+
one | two
|
41
|
+
end.to_not change(one_a, :files)
|
20
42
|
end
|
21
43
|
|
22
|
-
|
44
|
+
it 'does not mutate the right-hand side files' do
|
45
|
+
one = Directory.new.tap { |o| o.file('a/b') }
|
46
|
+
two = Directory.new.tap { |t| t.file('a/c') ; t.file('d/e') }
|
47
|
+
|
48
|
+
two_a = one.to_a.find { |e| e.name == 'a' }
|
49
|
+
|
50
|
+
expect do
|
51
|
+
one | two
|
52
|
+
end.to_not change(two_a, :files)
|
53
|
+
end
|
23
54
|
|
24
|
-
|
25
|
-
|
55
|
+
it 'does not mutate the left-hand side directories' do
|
56
|
+
one = Directory.new.tap { |o| o.file('a/b') }
|
57
|
+
two = Directory.new.tap { |t| t.file('a/c') ; t.file('d/e') }
|
58
|
+
|
59
|
+
expect do
|
60
|
+
one | two
|
61
|
+
end.to_not change(one, :directories)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'does not mutate the right-hand side directories' do
|
65
|
+
one = Directory.new.tap { |o| o.file('a/b') }
|
66
|
+
two = Directory.new.tap { |t| t.file('a/c') ; t.file('d/e') }
|
67
|
+
|
68
|
+
expect do
|
69
|
+
one | two
|
70
|
+
end.to_not change(two, :directories)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'does not mutate the left-hand side parents' do
|
74
|
+
one = Directory.new.tap { |o| o.file('a/b') ; o.file('f/g') }
|
75
|
+
two = Directory.new.tap { |t| t.file('a/c') ; t.file('d/e') }
|
76
|
+
|
77
|
+
one_f = one.to_a.find { |e| e.name == 'f' }
|
78
|
+
one_f_parent = one_f.parent
|
79
|
+
|
80
|
+
one | two
|
81
|
+
|
82
|
+
expect(one_f_parent).to eql(one_f.parent)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'does not mutate the right-hand side parents' do
|
86
|
+
one = Directory.new.tap { |o| o.file('a/b') }
|
87
|
+
two = Directory.new.tap { |t| t.file('a/c') ; t.file('d/e') }
|
88
|
+
|
89
|
+
two_d = two.to_a.find { |e| e.name == 'd' }
|
90
|
+
two_d_parent = two_d.parent
|
91
|
+
|
92
|
+
one | two
|
93
|
+
|
94
|
+
expect(two_d.parent).to eql(two_d_parent)
|
95
|
+
end
|
26
96
|
end
|
27
97
|
|
28
98
|
it 'allows for manually nesting directories' do
|
29
|
-
|
30
|
-
|
99
|
+
directory = Directory.new
|
100
|
+
directory.dir('a') do |a|
|
31
101
|
a.dir('b') do |b|
|
32
102
|
b.dir('c')
|
33
103
|
end
|
34
104
|
end
|
35
105
|
|
36
|
-
expect(
|
106
|
+
expect(directory.to_a.map(&:path)).to eql(['./a', './a/b', './a/b/c'])
|
37
107
|
end
|
38
108
|
|
39
109
|
it 'allows for convenient nesting of directories' do
|
40
|
-
|
41
|
-
|
110
|
+
directory = Directory.new
|
111
|
+
directory.dir('a/b/c')
|
42
112
|
|
43
|
-
expect(
|
113
|
+
expect(directory.to_a.map(&:path)).to eql(['./a', './a/b', './a/b/c'])
|
44
114
|
end
|
45
115
|
|
46
116
|
it 'only creates a given path once' do
|
47
|
-
|
48
|
-
|
49
|
-
|
117
|
+
directory = Directory.new
|
118
|
+
directory.dir('a/b/c')
|
119
|
+
directory.dir('a/b/c/d')
|
50
120
|
|
51
|
-
expect(
|
121
|
+
expect(directory.to_a.map(&:path)).
|
52
122
|
to eql(['./a', './a/b', './a/b/c', './a/b/c/d'])
|
53
123
|
end
|
54
124
|
|
55
125
|
it 'takes the most recent duplicate directory as authoritative' do
|
56
|
-
|
57
|
-
|
58
|
-
|
126
|
+
directory = Directory.new
|
127
|
+
directory.dir('a/b/c')
|
128
|
+
directory.dir('a/b/d')
|
59
129
|
|
60
|
-
expect(
|
130
|
+
expect(directory.to_a.map(&:path)).to eql(['./a', './a/b', './a/b/d'])
|
61
131
|
end
|
62
132
|
|
63
133
|
it 'allows for manually nesting files in directories' do
|
64
|
-
|
65
|
-
|
134
|
+
directory = Directory.new
|
135
|
+
directory.dir('a') do |a|
|
66
136
|
a.dir('b') do |b|
|
67
137
|
b.dir('c') do |c|
|
68
138
|
c.file 'README'
|
@@ -70,32 +140,32 @@ module AndFeathers
|
|
70
140
|
end
|
71
141
|
end
|
72
142
|
|
73
|
-
expect(
|
143
|
+
expect(directory.to_a.map(&:path)).
|
74
144
|
to eql(['./a', './a/b', './a/b/c', './a/b/c/README'])
|
75
145
|
end
|
76
146
|
|
77
147
|
it 'allows for convenient nesting of files in directories' do
|
78
|
-
|
79
|
-
|
148
|
+
directory = Directory.new
|
149
|
+
directory.file('a/b/c/README')
|
80
150
|
|
81
|
-
expect(
|
151
|
+
expect(directory.to_a.map(&:path)).
|
82
152
|
to eql(['./a', './a/b', './a/b/c', './a/b/c/README'])
|
83
153
|
end
|
84
154
|
|
85
155
|
it 'only creates a given file once' do
|
86
|
-
|
87
|
-
|
88
|
-
|
156
|
+
directory = Directory.new
|
157
|
+
directory.file('a/README')
|
158
|
+
directory.file('a/README')
|
89
159
|
|
90
|
-
expect(
|
160
|
+
expect(directory.to_a.map(&:path)).to eql(['./a', './a/README'])
|
91
161
|
end
|
92
162
|
|
93
163
|
it 'takes the most recent file as the authoritative file' do
|
94
|
-
|
95
|
-
|
96
|
-
|
164
|
+
directory = Directory.new
|
165
|
+
directory.file('a/README') { '1' }
|
166
|
+
directory.file('a/README') { '2' }
|
97
167
|
|
98
|
-
readme =
|
168
|
+
readme = directory.to_a.find { |e| e.is_a?(File) }
|
99
169
|
|
100
170
|
expect(readme.read).to eql('2')
|
101
171
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: and_feathers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.pre
|
4
|
+
version: 1.0.0.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Cobb
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|