boombera 0.1.2 → 0.2.0
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/Gemfile +2 -2
- data/Gemfile.lock +13 -18
- data/VERSION +1 -1
- data/boombera.gemspec +7 -7
- data/lib/boombera.rb +10 -3
- data/lib/boombera/content_item.rb +31 -4
- data/lib/boombera/information.rb +14 -1
- data/spec/integration/boombera_spec.rb +65 -0
- data/spec/lib/boombera/content_item_spec.rb +95 -2
- data/spec/lib/boombera_spec.rb +53 -15
- metadata +5 -5
data/Gemfile
CHANGED
@@ -3,9 +3,9 @@ source "http://rubygems.org"
|
|
3
3
|
gem 'couchrest', '~> 1.0.2'
|
4
4
|
|
5
5
|
group :development do
|
6
|
-
gem "rspec", "~> 2.
|
6
|
+
gem "rspec", "~> 2.6.0"
|
7
7
|
gem "bundler", "~> 1.0.0"
|
8
|
-
gem "jeweler",
|
8
|
+
gem "jeweler", "~> 1.6.1"
|
9
9
|
gem "rcov", ">= 0"
|
10
10
|
gem "reek", "~> 1.2.8"
|
11
11
|
gem "rdoc", "~> 3.6.1"
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,3 @@
|
|
1
|
-
GIT
|
2
|
-
remote: git://github.com/jwilger/jeweler.git
|
3
|
-
revision: d7461cba474852ab16d31618e6465b56b00db49e
|
4
|
-
specs:
|
5
|
-
jeweler (1.6.0)
|
6
|
-
bundler (~> 1.0.0)
|
7
|
-
git (>= 1.2.5)
|
8
|
-
rake
|
9
|
-
|
10
1
|
GEM
|
11
2
|
remote: http://rubygems.org/
|
12
3
|
specs:
|
@@ -22,6 +13,10 @@ GEM
|
|
22
13
|
rest-client (~> 1.6.1)
|
23
14
|
diff-lcs (1.1.2)
|
24
15
|
git (1.2.5)
|
16
|
+
jeweler (1.6.1)
|
17
|
+
bundler (~> 1.0.0)
|
18
|
+
git (>= 1.2.5)
|
19
|
+
rake
|
25
20
|
json (1.5.1)
|
26
21
|
mime-types (1.16)
|
27
22
|
rake (0.9.0)
|
@@ -33,14 +28,14 @@ GEM
|
|
33
28
|
sexp_processor (~> 3.0)
|
34
29
|
rest-client (1.6.1)
|
35
30
|
mime-types (>= 1.16)
|
36
|
-
rspec (2.
|
37
|
-
rspec-core (~> 2.
|
38
|
-
rspec-expectations (~> 2.
|
39
|
-
rspec-mocks (~> 2.
|
40
|
-
rspec-core (2.3
|
41
|
-
rspec-expectations (2.
|
31
|
+
rspec (2.6.0)
|
32
|
+
rspec-core (~> 2.6.0)
|
33
|
+
rspec-expectations (~> 2.6.0)
|
34
|
+
rspec-mocks (~> 2.6.0)
|
35
|
+
rspec-core (2.6.3)
|
36
|
+
rspec-expectations (2.6.0)
|
42
37
|
diff-lcs (~> 1.1.2)
|
43
|
-
rspec-mocks (2.
|
38
|
+
rspec-mocks (2.6.0)
|
44
39
|
ruby2ruby (1.2.5)
|
45
40
|
ruby_parser (~> 2.0)
|
46
41
|
sexp_processor (~> 3.0)
|
@@ -58,8 +53,8 @@ DEPENDENCIES
|
|
58
53
|
autotest-growl (~> 0.2.9)
|
59
54
|
bundler (~> 1.0.0)
|
60
55
|
couchrest (~> 1.0.2)
|
61
|
-
jeweler
|
56
|
+
jeweler (~> 1.6.1)
|
62
57
|
rcov
|
63
58
|
rdoc (~> 3.6.1)
|
64
59
|
reek (~> 1.2.8)
|
65
|
-
rspec (~> 2.
|
60
|
+
rspec (~> 2.6.0)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/boombera.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{boombera}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John Wilger"]
|
@@ -47,9 +47,9 @@ Gem::Specification.new do |s|
|
|
47
47
|
|
48
48
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
49
49
|
s.add_runtime_dependency(%q<couchrest>, ["~> 1.0.2"])
|
50
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.
|
50
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
|
51
51
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
52
|
-
s.add_development_dependency(%q<jeweler>, ["
|
52
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.1"])
|
53
53
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
54
54
|
s.add_development_dependency(%q<reek>, ["~> 1.2.8"])
|
55
55
|
s.add_development_dependency(%q<rdoc>, ["~> 3.6.1"])
|
@@ -58,9 +58,9 @@ Gem::Specification.new do |s|
|
|
58
58
|
s.add_development_dependency(%q<autotest-fsevent>, ["~> 0.2.5"])
|
59
59
|
else
|
60
60
|
s.add_dependency(%q<couchrest>, ["~> 1.0.2"])
|
61
|
-
s.add_dependency(%q<rspec>, ["~> 2.
|
61
|
+
s.add_dependency(%q<rspec>, ["~> 2.6.0"])
|
62
62
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
63
|
-
s.add_dependency(%q<jeweler>, ["
|
63
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.1"])
|
64
64
|
s.add_dependency(%q<rcov>, [">= 0"])
|
65
65
|
s.add_dependency(%q<reek>, ["~> 1.2.8"])
|
66
66
|
s.add_dependency(%q<rdoc>, ["~> 3.6.1"])
|
@@ -70,9 +70,9 @@ Gem::Specification.new do |s|
|
|
70
70
|
end
|
71
71
|
else
|
72
72
|
s.add_dependency(%q<couchrest>, ["~> 1.0.2"])
|
73
|
-
s.add_dependency(%q<rspec>, ["~> 2.
|
73
|
+
s.add_dependency(%q<rspec>, ["~> 2.6.0"])
|
74
74
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
75
|
-
s.add_dependency(%q<jeweler>, ["
|
75
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.1"])
|
76
76
|
s.add_dependency(%q<rcov>, [">= 0"])
|
77
77
|
s.add_dependency(%q<reek>, ["~> 1.2.8"])
|
78
78
|
s.add_dependency(%q<rdoc>, ["~> 3.6.1"])
|
data/lib/boombera.rb
CHANGED
@@ -11,6 +11,7 @@ require 'boombera/information'
|
|
11
11
|
|
12
12
|
class Boombera
|
13
13
|
VersionMismatch = Class.new(StandardError)
|
14
|
+
InvalidMapping = Class.new(RuntimeError)
|
14
15
|
|
15
16
|
extend Boombera::Information
|
16
17
|
|
@@ -22,13 +23,19 @@ class Boombera
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def put(path, body)
|
25
|
-
content_item = get(path) and content_item.body = body
|
26
|
+
content_item = get(path, :resolve_map => false) and content_item.body = body
|
26
27
|
content_item ||= ContentItem.new(path, body, db)
|
27
28
|
content_item.save
|
28
29
|
end
|
29
30
|
|
30
|
-
def get(path)
|
31
|
-
ContentItem.get(path, db)
|
31
|
+
def get(path, options = {})
|
32
|
+
ContentItem.get(path, db, options)
|
33
|
+
end
|
34
|
+
|
35
|
+
def map(path, source_path)
|
36
|
+
content_map = get(path, :resolve_map => false) || ContentItem.new(path, nil, db)
|
37
|
+
content_map.map_to source_path
|
38
|
+
content_map.save
|
32
39
|
end
|
33
40
|
|
34
41
|
private
|
@@ -1,15 +1,20 @@
|
|
1
1
|
class Boombera::ContentItem < CouchRest::Document
|
2
2
|
class << self
|
3
|
-
def get(path, database)
|
3
|
+
def get(path, database, options = {})
|
4
4
|
rows = database.view('boombera/content_map', :key => path)['rows']
|
5
5
|
return nil if rows.empty?
|
6
|
-
|
7
|
-
|
6
|
+
match = rows.first
|
7
|
+
maps_to = match['value']
|
8
|
+
if maps_to == path || options[:resolve_map] == false
|
9
|
+
new(database.get(match['id']))
|
10
|
+
else
|
11
|
+
get(maps_to, database)
|
12
|
+
end
|
8
13
|
end
|
9
14
|
end
|
10
15
|
|
11
16
|
attr_accessor :body
|
12
|
-
attr_reader :path
|
17
|
+
attr_reader :path, :maps_to
|
13
18
|
|
14
19
|
def initialize(doc_or_path, body = nil, database = nil)
|
15
20
|
case doc_or_path
|
@@ -24,6 +29,22 @@ class Boombera::ContentItem < CouchRest::Document
|
|
24
29
|
end
|
25
30
|
end
|
26
31
|
|
32
|
+
def map_to(source_path)
|
33
|
+
rows = @database.view('boombera/content_map', :key => source_path)['rows']
|
34
|
+
if rows.empty?
|
35
|
+
raise Boombera::InvalidMapping,
|
36
|
+
"Tried to map #{path} to #{source_path}, but #{source_path} doesn't exist."
|
37
|
+
else
|
38
|
+
self.body = nil
|
39
|
+
self[:maps_to] = source_path
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def referenced_by
|
44
|
+
rows = @database.view('boombera/map_references', :key => path)['rows']
|
45
|
+
rows.map{ |r| r['value'] }.sort
|
46
|
+
end
|
47
|
+
|
27
48
|
# :nodoc:
|
28
49
|
def path
|
29
50
|
self[:path]
|
@@ -37,5 +58,11 @@ class Boombera::ContentItem < CouchRest::Document
|
|
37
58
|
# :nodoc:
|
38
59
|
def body=(new_body)
|
39
60
|
self[:body] = new_body
|
61
|
+
self[:maps_to] = path unless new_body.nil?
|
62
|
+
end
|
63
|
+
|
64
|
+
# :nodoc:
|
65
|
+
def maps_to
|
66
|
+
self[:maps_to]
|
40
67
|
end
|
41
68
|
end
|
data/lib/boombera/information.rb
CHANGED
@@ -26,7 +26,20 @@ module Boombera::Information
|
|
26
26
|
'map' => <<-EOF
|
27
27
|
function(doc) {
|
28
28
|
if (doc['path']) {
|
29
|
-
|
29
|
+
if (doc['maps_to']) {
|
30
|
+
emit(doc.path, doc.maps_to);
|
31
|
+
} else {
|
32
|
+
emit(doc.path, doc.path);
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
EOF
|
37
|
+
},
|
38
|
+
'map_references' => {
|
39
|
+
'map' => <<-EOF
|
40
|
+
function(doc) {
|
41
|
+
if(doc['maps_to'] && doc.maps_to != doc.path) {
|
42
|
+
emit(doc.maps_to, doc.path);
|
30
43
|
}
|
31
44
|
}
|
32
45
|
EOF
|
@@ -81,6 +81,52 @@ describe 'The Boombera library:' do
|
|
81
81
|
document['path'].should == '/foo'
|
82
82
|
document['body'].should == 'the new content'
|
83
83
|
end
|
84
|
+
|
85
|
+
it 'turns a pointer into a content item' do
|
86
|
+
boombera.put('/foo', 'foo bar baz')
|
87
|
+
boombera.map('/bar', '/foo')
|
88
|
+
boombera.put('/bar', 'the new content')
|
89
|
+
results = db.view('boombera/content_map', :key => '/bar')['rows']
|
90
|
+
results.length.should == 1
|
91
|
+
document = db.get(results.first['id'])
|
92
|
+
document['path'].should == '/bar'
|
93
|
+
document['body'].should == 'the new content'
|
94
|
+
document['points_to'].should be_nil
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'mapping content aliases' do
|
99
|
+
it 'creates a pointer from a path to another path' do
|
100
|
+
boombera.put('/foo', 'foo bar baz')
|
101
|
+
boombera.map('/bar', '/foo')
|
102
|
+
results = db.view('boombera/content_map', :key => '/bar')['rows']
|
103
|
+
results.length.should == 1
|
104
|
+
map_item = results.first
|
105
|
+
map_item['value'].should == '/foo'
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'updates a pointer from a path to another path' do
|
109
|
+
boombera.put('/foo', 'foo bar baz')
|
110
|
+
boombera.put('/spam', 'ham spam can')
|
111
|
+
boombera.map('/bar', '/foo')
|
112
|
+
boombera.map('/bar', '/spam')
|
113
|
+
results = db.view('boombera/content_map', :key => '/bar')['rows']
|
114
|
+
results.length.should == 1
|
115
|
+
map_item = results.first
|
116
|
+
map_item['value'].should == '/spam'
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'turns a content item into a pointer' do
|
120
|
+
boombera.put('/foo', 'foo bar baz')
|
121
|
+
boombera.put('/bar', 'some old bar content')
|
122
|
+
boombera.map('/bar', '/foo')
|
123
|
+
results = db.view('boombera/content_map', :key => '/bar')['rows']
|
124
|
+
results.length.should == 1
|
125
|
+
map_item = results.first
|
126
|
+
map_item['value'].should == '/foo'
|
127
|
+
doc = db.get(map_item['id'])
|
128
|
+
doc['body'].should be_nil
|
129
|
+
end
|
84
130
|
end
|
85
131
|
|
86
132
|
describe 'getting content from the database' do
|
@@ -94,6 +140,14 @@ describe 'The Boombera library:' do
|
|
94
140
|
result.path.should == '/index'
|
95
141
|
result.body.should == 'Hello, World!'
|
96
142
|
end
|
143
|
+
|
144
|
+
it 'gives you the resulting ContentItem when a pointer is requested' do
|
145
|
+
boombera.put('/foo', 'some content')
|
146
|
+
boombera.map('/bar', '/foo')
|
147
|
+
result = boombera.get('/bar')
|
148
|
+
result.path.should == '/foo'
|
149
|
+
result.body.should == 'some content'
|
150
|
+
end
|
97
151
|
end
|
98
152
|
|
99
153
|
describe 'working with ContentItem' do
|
@@ -104,5 +158,16 @@ describe 'The Boombera library:' do
|
|
104
158
|
content.save
|
105
159
|
boombera.get('/foo').body.should == 'new content'
|
106
160
|
end
|
161
|
+
|
162
|
+
it 'knows which pointers reference it' do
|
163
|
+
boombera.put('/foo', 'some content')
|
164
|
+
boombera.map('/zurg', '/foo')
|
165
|
+
boombera.map('/bar', '/foo')
|
166
|
+
boombera.map('/bar/baz', '/foo')
|
167
|
+
boombera.put('/spam', 'spam content')
|
168
|
+
boombera.map('/spam2', '/spam')
|
169
|
+
content = boombera.get('/foo')
|
170
|
+
content.referenced_by.should == ['/bar', '/bar/baz', '/zurg']
|
171
|
+
end
|
107
172
|
end
|
108
173
|
end
|
@@ -4,7 +4,7 @@ describe Boombera::ContentItem do
|
|
4
4
|
describe '.get' do
|
5
5
|
context 'with an existing content item' do
|
6
6
|
it 'returns a ContentItem instance for the found document' do
|
7
|
-
view_result = {'rows' => [{'id' => '123'}]}
|
7
|
+
view_result = {'rows' => [{'id' => '123', 'value' => '/foo'}]}
|
8
8
|
db = mock(CouchRest::Database)
|
9
9
|
db.should_receive(:view) \
|
10
10
|
.with('boombera/content_map', :key => '/foo') \
|
@@ -17,6 +17,51 @@ describe Boombera::ContentItem do
|
|
17
17
|
result.body.should == 'bar'
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
21
|
+
context 'with a non-existant content item' do
|
22
|
+
it 'returns nil' do
|
23
|
+
view_result = {'rows' => []}
|
24
|
+
db = mock(CouchRest::Database)
|
25
|
+
db.should_receive(:view) \
|
26
|
+
.with('boombera/content_map', :key => '/foo') \
|
27
|
+
.and_return(view_result)
|
28
|
+
Boombera::ContentItem.get('/foo', db).should == nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'with a path that maps to another content item' do
|
33
|
+
it 'returns the mapped content item' do
|
34
|
+
map_view_result = {'rows' => [{'id' => '123', 'value' => '/bar'}]}
|
35
|
+
content_view_result = {'rows' => [{'id' => '456', 'value' => '/bar'}]}
|
36
|
+
db = mock(CouchRest::Database)
|
37
|
+
db.should_receive(:view) \
|
38
|
+
.with('boombera/content_map', :key => '/foo') \
|
39
|
+
.and_return(map_view_result)
|
40
|
+
db.should_receive(:view) \
|
41
|
+
.with('boombera/content_map', :key => '/bar') \
|
42
|
+
.and_return(content_view_result)
|
43
|
+
db.should_receive(:get) \
|
44
|
+
.with('456') \
|
45
|
+
.and_return(CouchRest::Document.new('path' => '/bar', 'body' => 'bar'))
|
46
|
+
result = Boombera::ContentItem.get('/foo', db)
|
47
|
+
result.path.should == '/bar'
|
48
|
+
result.body.should == 'bar'
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns the pointer content item when passed the :resolve_map option as false' do
|
52
|
+
map_view_result = {'rows' => [{'id' => '123', 'value' => '/bar'}]}
|
53
|
+
db = mock(CouchRest::Database)
|
54
|
+
db.should_receive(:view) \
|
55
|
+
.with('boombera/content_map', :key => '/foo') \
|
56
|
+
.and_return(map_view_result)
|
57
|
+
db.should_receive(:get) \
|
58
|
+
.with('123') \
|
59
|
+
.and_return(CouchRest::Document.new('path' => '/foo', 'maps_to' => '/bar'))
|
60
|
+
result = Boombera::ContentItem.get('/foo', db, :resolve_map => false)
|
61
|
+
result.path.should == '/foo'
|
62
|
+
result.maps_to.should == '/bar'
|
63
|
+
end
|
64
|
+
end
|
20
65
|
end
|
21
66
|
|
22
67
|
describe '.new' do
|
@@ -52,10 +97,58 @@ describe Boombera::ContentItem do
|
|
52
97
|
end
|
53
98
|
|
54
99
|
describe '#body=' do
|
100
|
+
let(:db) { stub(CouchRest::Database) }
|
101
|
+
let(:content) { Boombera::ContentItem.new('/foo', 'not bar', db) }
|
102
|
+
|
55
103
|
it 'overwrites the current contents of the document body' do
|
56
|
-
content = Boombera::ContentItem.new('/foo', 'not bar')
|
57
104
|
content.body = 'bar'
|
58
105
|
content.body.should == 'bar'
|
59
106
|
end
|
107
|
+
|
108
|
+
it 'sets the maps_to attribute equal to the path attribute if argument is not nil' do
|
109
|
+
db.stub!(:view => {'rows' => [{'value' => '/foo'}]})
|
110
|
+
content.map_to '/bar'
|
111
|
+
content.body = 'something'
|
112
|
+
content.maps_to.should == '/foo'
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'does not change the maps_to attribute if the argument is nil' do
|
116
|
+
db.stub!(:view => {'rows' => [{'value' => '/foo'}]})
|
117
|
+
content.map_to '/bar'
|
118
|
+
content.body = nil
|
119
|
+
content.maps_to.should == '/bar'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe '#map_to' do
|
124
|
+
context 'the source content item does not exist' do
|
125
|
+
it 'raises an InvalidMapping exception' do
|
126
|
+
db = stub(CouchRest::Database)
|
127
|
+
db.stub!(:view => {'rows' => []})
|
128
|
+
content = Boombera::ContentItem.new('/bar', nil, db)
|
129
|
+
lambda { content.map_to('/foo') }.should \
|
130
|
+
raise_error(Boombera::InvalidMapping, "Tried to map /bar to /foo, but /foo doesn't exist.")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'the source content item is a normal content item' do
|
135
|
+
let(:db) { stub(CouchRest::Database) }
|
136
|
+
let(:content) { Boombera::ContentItem.new('/bar', 'foo bar', db) }
|
137
|
+
|
138
|
+
before(:each) do
|
139
|
+
db.should_receive(:view) \
|
140
|
+
.with('boombera/content_map', :key => '/foo') \
|
141
|
+
.and_return({'rows' => [{'value' => '/foo'}]})
|
142
|
+
content.map_to '/foo'
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'sets the maps_to attribute to the path of the source content' do
|
146
|
+
content.maps_to.should == '/foo'
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'sets the body attribute to nil' do
|
150
|
+
content.body.should be_nil
|
151
|
+
end
|
152
|
+
end
|
60
153
|
end
|
61
154
|
end
|
data/spec/lib/boombera_spec.rb
CHANGED
@@ -7,6 +7,9 @@ describe Boombera do
|
|
7
7
|
db
|
8
8
|
end
|
9
9
|
|
10
|
+
let(:content_item) { stub(Boombera::ContentItem) }
|
11
|
+
let(:boombera) { Boombera.new('boombera_test') }
|
12
|
+
|
10
13
|
before(:each) do
|
11
14
|
Boombera.stub!(:version => '1.2.3')
|
12
15
|
Boombera.stub!(:database_version => '1.2.3')
|
@@ -35,30 +38,25 @@ describe Boombera do
|
|
35
38
|
end
|
36
39
|
|
37
40
|
describe '#put' do
|
38
|
-
let(:content_item) { mock(Boombera::ContentItem) }
|
39
|
-
let(:content_item_save_expectations) do
|
40
|
-
lambda {
|
41
|
-
content_item.should_receive(:save).and_return(true)
|
42
|
-
boombera = Boombera.new('boombera_test')
|
43
|
-
boombera.put('/foo', 'bar').should == true
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
41
|
context "to an existing path" do
|
48
42
|
it 'updates and saves the existing content item' do
|
49
|
-
Boombera::ContentItem.should_receive(:get)
|
43
|
+
Boombera::ContentItem.should_receive(:get) \
|
44
|
+
.with('/foo', db, :resolve_map => false) \
|
45
|
+
.and_return(content_item)
|
50
46
|
content_item.should_receive(:body=).with('bar')
|
51
|
-
|
47
|
+
content_item.should_receive(:save).and_return(true)
|
48
|
+
boombera.put('/foo', 'bar').should == true
|
52
49
|
end
|
53
50
|
end
|
54
51
|
|
55
52
|
context "to a new path" do
|
56
|
-
it 'creates and saves the
|
53
|
+
it 'creates and saves the content item' do
|
57
54
|
Boombera::ContentItem.stub!(:get => nil)
|
58
55
|
Boombera::ContentItem.should_receive(:new) \
|
59
56
|
.with('/foo', 'bar', db) \
|
60
57
|
.and_return(content_item)
|
61
|
-
|
58
|
+
content_item.should_receive(:save).and_return(true)
|
59
|
+
boombera.put('/foo', 'bar').should == true
|
62
60
|
end
|
63
61
|
end
|
64
62
|
end
|
@@ -66,12 +64,52 @@ describe Boombera do
|
|
66
64
|
describe '#get' do
|
67
65
|
it 'gets the content item at the specified path from the current database' do
|
68
66
|
db.as_null_object
|
69
|
-
Boombera::ContentItem.should_receive(:get).with('/foo', db)
|
70
|
-
boombera = Boombera.new('boombera_test')
|
67
|
+
Boombera::ContentItem.should_receive(:get).with('/foo', db, {})
|
71
68
|
boombera.get('/foo')
|
72
69
|
end
|
73
70
|
end
|
74
71
|
|
72
|
+
describe '#map' do
|
73
|
+
context 'to a new path' do
|
74
|
+
before(:each) do
|
75
|
+
Boombera::ContentItem.stub!(:get)
|
76
|
+
Boombera::ContentItem.should_receive(:new).with('/bar', nil, db).and_return(content_item)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'creates and saves ContentItem as pointer' do
|
80
|
+
content_item.should_receive(:map_to).with('/foo')
|
81
|
+
content_item.should_receive(:save).and_return(true)
|
82
|
+
boombera.map('/bar', '/foo').should == true
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'raises an InvalidMapping exception if the source document does not exist' do
|
86
|
+
content_item.stub!(:map_to).and_raise(Boombera::InvalidMapping)
|
87
|
+
lambda { boombera.map('/bar', '/foo') }.should \
|
88
|
+
raise_error(Boombera::InvalidMapping)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'to an existing path' do
|
93
|
+
before(:each) do
|
94
|
+
Boombera::ContentItem.should_receive(:get) \
|
95
|
+
.with('/bar', db, :resolve_map => false) \
|
96
|
+
.and_return(content_item)
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'updates ContentItem as pointer' do
|
100
|
+
content_item.should_receive(:map_to).with('/foo')
|
101
|
+
content_item.should_receive(:save).and_return(true)
|
102
|
+
boombera.map('/bar', '/foo').should == true
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'raises an InvalidMapping exception if the source document does not exist' do
|
106
|
+
content_item.stub!(:map_to).and_raise(Boombera::InvalidMapping)
|
107
|
+
lambda { boombera.map('/bar', '/foo') }.should \
|
108
|
+
raise_error(Boombera::InvalidMapping)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
75
113
|
describe '.install_design_doc!' do
|
76
114
|
context 'when the design doc does not yet exist' do
|
77
115
|
it 'creates the design doc on the specified database' do
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: boombera
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.2.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- John Wilger
|
@@ -31,7 +31,7 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: 2.
|
34
|
+
version: 2.6.0
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: *id002
|
@@ -51,9 +51,9 @@ dependencies:
|
|
51
51
|
requirement: &id004 !ruby/object:Gem::Requirement
|
52
52
|
none: false
|
53
53
|
requirements:
|
54
|
-
- -
|
54
|
+
- - ~>
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
56
|
+
version: 1.6.1
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: *id004
|
@@ -165,7 +165,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
165
|
requirements:
|
166
166
|
- - ">="
|
167
167
|
- !ruby/object:Gem::Version
|
168
|
-
hash:
|
168
|
+
hash: -941585902333991149
|
169
169
|
segments:
|
170
170
|
- 0
|
171
171
|
version: "0"
|