boombera 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -12,4 +12,5 @@ group :development do
12
12
  gem 'autotest', '~> 4.4.6'
13
13
  gem 'autotest-growl', '~> 0.2.9'
14
14
  gem 'autotest-fsevent', '~> 0.2.5'
15
+ gem 'ruby-debug19', '~> 0.11.6'
15
16
  end
@@ -2,11 +2,13 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  ZenTest (4.5.0)
5
+ archive-tar-minitar (0.5.2)
5
6
  autotest (4.4.6)
6
7
  ZenTest (>= 4.4.1)
7
8
  autotest-fsevent (0.2.5)
8
9
  sys-uname
9
10
  autotest-growl (0.2.9)
11
+ columnize (0.3.2)
10
12
  couchrest (1.0.2)
11
13
  json (~> 1.5.1)
12
14
  mime-types (~> 1.15)
@@ -18,6 +20,8 @@ GEM
18
20
  git (>= 1.2.5)
19
21
  rake
20
22
  json (1.5.1)
23
+ linecache19 (0.5.12)
24
+ ruby_core_source (>= 0.1.4)
21
25
  mime-types (1.16)
22
26
  rake (0.9.0)
23
27
  rcov (0.9.9)
@@ -36,9 +40,19 @@ GEM
36
40
  rspec-expectations (2.6.0)
37
41
  diff-lcs (~> 1.1.2)
38
42
  rspec-mocks (2.6.0)
43
+ ruby-debug-base19 (0.11.25)
44
+ columnize (>= 0.3.1)
45
+ linecache19 (>= 0.5.11)
46
+ ruby_core_source (>= 0.1.4)
47
+ ruby-debug19 (0.11.6)
48
+ columnize (>= 0.3.1)
49
+ linecache19 (>= 0.5.11)
50
+ ruby-debug-base19 (>= 0.11.19)
39
51
  ruby2ruby (1.2.5)
40
52
  ruby_parser (~> 2.0)
41
53
  sexp_processor (~> 3.0)
54
+ ruby_core_source (0.1.5)
55
+ archive-tar-minitar (>= 0.5.2)
42
56
  ruby_parser (2.0.6)
43
57
  sexp_processor (~> 3.0)
44
58
  sexp_processor (3.0.5)
@@ -58,3 +72,4 @@ DEPENDENCIES
58
72
  rdoc (~> 3.6.1)
59
73
  reek (~> 1.2.8)
60
74
  rspec (~> 2.6.0)
75
+ ruby-debug19 (~> 0.11.6)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.3
1
+ 0.3.0
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{boombera}
8
- s.version = "0.2.3"
8
+ s.version = "0.3.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"]
@@ -32,7 +32,6 @@ Gem::Specification.new do |s|
32
32
  "lib/boombera/content_item.rb",
33
33
  "lib/boombera/information.rb",
34
34
  "spec/integration/boombera_spec.rb",
35
- "spec/lib/boombera/content_item_map_resolver_spec.rb",
36
35
  "spec/lib/boombera/content_item_spec.rb",
37
36
  "spec/lib/boombera_spec.rb",
38
37
  "spec/spec_helper.rb"
@@ -57,6 +56,7 @@ Gem::Specification.new do |s|
57
56
  s.add_development_dependency(%q<autotest>, ["~> 4.4.6"])
58
57
  s.add_development_dependency(%q<autotest-growl>, ["~> 0.2.9"])
59
58
  s.add_development_dependency(%q<autotest-fsevent>, ["~> 0.2.5"])
59
+ s.add_development_dependency(%q<ruby-debug19>, ["~> 0.11.6"])
60
60
  else
61
61
  s.add_dependency(%q<couchrest>, ["~> 1.0.2"])
62
62
  s.add_dependency(%q<rspec>, ["~> 2.6.0"])
@@ -68,6 +68,7 @@ Gem::Specification.new do |s|
68
68
  s.add_dependency(%q<autotest>, ["~> 4.4.6"])
69
69
  s.add_dependency(%q<autotest-growl>, ["~> 0.2.9"])
70
70
  s.add_dependency(%q<autotest-fsevent>, ["~> 0.2.5"])
71
+ s.add_dependency(%q<ruby-debug19>, ["~> 0.11.6"])
71
72
  end
72
73
  else
73
74
  s.add_dependency(%q<couchrest>, ["~> 1.0.2"])
@@ -80,6 +81,7 @@ Gem::Specification.new do |s|
80
81
  s.add_dependency(%q<autotest>, ["~> 4.4.6"])
81
82
  s.add_dependency(%q<autotest-growl>, ["~> 0.2.9"])
82
83
  s.add_dependency(%q<autotest-fsevent>, ["~> 0.2.5"])
84
+ s.add_dependency(%q<ruby-debug19>, ["~> 0.11.6"])
83
85
  end
84
86
  end
85
87
 
@@ -110,7 +110,8 @@ class Boombera
110
110
  # +body+:: can be # any object that can convert to JSON.
111
111
  # +path+:: should be a String with /-separated tokens (i.e. "/foo/bar/baz").
112
112
  def put(path, body)
113
- content_item = get_pointer(path) and content_item.body = body
113
+ content_item = ContentItem.get_pointer(path, database) \
114
+ and content_item.body = body
114
115
  content_item ||= ContentItem.new(path, body, database)
115
116
  content_item.save
116
117
  end
@@ -119,7 +120,7 @@ class Boombera
119
120
  # is found. If +path+ is mapped to another ContentItem, the resolved
120
121
  # ContentItem will be returned.
121
122
  def get(path)
122
- ContentItem::MapResolver.new(path, database).resolve
123
+ ContentItem.get(path, database)
123
124
  end
124
125
 
125
126
  # Creates a content mapping so that two paths can reference the same content
@@ -131,17 +132,13 @@ class Boombera
131
132
  #
132
133
  # raises:: InvalidMapping
133
134
  def map(path, source_path)
134
- content_map = get_pointer(path) || ContentItem.new(path, nil, database)
135
+ content_map = ContentItem.get_pointer(path, database) \
136
+ || ContentItem.new(path, nil, database)
135
137
  content_map.map_to source_path
136
138
  content_map.save
137
139
  end
138
140
 
139
141
  private
140
-
141
- def get_pointer(path)
142
- ContentItem::MapResolver.new(path, database, :resolve_map => false).resolve
143
- end
144
-
145
142
  def check_database_version!
146
143
  database_version = Boombera.database_version(database)
147
144
  unless Boombera.version == database_version
@@ -2,41 +2,26 @@
2
2
  # content-mapping semantics and method-based access to the attributes that
3
3
  # Boombera knows about.
4
4
  class Boombera::ContentItem < CouchRest::Document
5
- class MapResolver #:nodoc: all
6
- def initialize(path, database, options = {})
7
- @path = path
8
- @database = database
9
- @final_attempt = options[:resolve_map] == false
10
- end
11
-
12
- def resolve
13
- id, maps_to = content_map
14
- return if id.nil?
15
- if @final_attempt || maps_to == @path
16
- Boombera::ContentItem.new(@database.get(id))
17
- else
18
- @path = maps_to
19
- resolve
20
- end
21
- end
22
-
23
- private
24
-
25
- def content_map
26
- rows = @database.view('boombera/content_map', :key => @path)['rows']
27
- return if rows.empty?
28
- match = rows.first
29
- [match['id'], match['value']]
30
- end
31
- end
32
-
33
5
  # The actual content that is being stored
34
6
  attr_accessor :body
35
7
 
36
- # The path used to access the ContentItem
8
+ # The path used to access the ContentItem, it is stored as the '_id' attribute
9
+ # in CouchDB
37
10
  attr_reader :path
38
11
 
39
- attr_reader :maps_to #:nodoc:
12
+ def self.get(path, db)
13
+ doc = get_pointer(path, db)
14
+ until doc.nil? || doc.resolved?
15
+ doc = get_pointer(doc.maps_to, db)
16
+ end
17
+ doc
18
+ end
19
+
20
+ def self.get_pointer(path, db)
21
+ Boombera::ContentItem.new(db.get(path))
22
+ rescue RestClient::ResourceNotFound
23
+ nil
24
+ end
40
25
 
41
26
  def initialize(doc_or_path, body = nil, database = nil) #:nodoc:
42
27
  case doc_or_path
@@ -45,20 +30,20 @@ class Boombera::ContentItem < CouchRest::Document
45
30
  super(doc_or_path)
46
31
  when String
47
32
  @database = database
48
- super(:path => doc_or_path, :body => body)
33
+ super('_id' => doc_or_path, 'body' => body)
49
34
  else
50
35
  raise ArgumentError, "doc_or_path must either be an instance of CouchRest::Document or a String"
51
36
  end
52
37
  end
53
38
 
54
39
  def map_to(source_path) #:nodoc:
55
- rows = @database.view('boombera/content_map', :key => source_path)['rows']
40
+ rows = @database.view('boombera/content_paths', :key => source_path)['rows']
56
41
  if rows.empty?
57
42
  raise Boombera::InvalidMapping,
58
43
  "Tried to map #{path} to #{source_path}, but #{source_path} doesn't exist."
59
44
  else
60
45
  self.body = nil
61
- self[:maps_to] = source_path
46
+ self['maps_to'] = source_path
62
47
  end
63
48
  end
64
49
 
@@ -68,20 +53,30 @@ class Boombera::ContentItem < CouchRest::Document
68
53
  rows.map{ |row| row['value'] }.sort
69
54
  end
70
55
 
56
+ def save(*args)
57
+ self['maps_to'] = maps_to
58
+ self['type'] = 'content_item'
59
+ super
60
+ end
61
+
62
+ def resolved?
63
+ path == maps_to
64
+ end
65
+
66
+ def maps_to #:nodoc:
67
+ return path unless body.nil?
68
+ self['maps_to'] || path
69
+ end
70
+
71
71
  def path #:nodoc:
72
- self[:path]
72
+ self['_id']
73
73
  end
74
74
 
75
75
  def body #:nodoc:
76
- self[:body]
76
+ self['body']
77
77
  end
78
78
 
79
79
  def body=(new_body) #:nodoc:
80
- self[:body] = new_body
81
- self[:maps_to] = path unless new_body.nil?
82
- end
83
-
84
- def maps_to #:nodoc:
85
- self[:maps_to]
80
+ self['body'] = new_body
86
81
  end
87
82
  end
@@ -14,14 +14,14 @@ module Boombera::Information #:nodoc: all
14
14
  'language' => 'javascript',
15
15
  'gem_version' => version,
16
16
  'views' => {
17
- 'content_map' => {
17
+ 'content_paths' => {
18
18
  'map' => <<-EOF
19
19
  function(doc) {
20
- if (doc['path']) {
20
+ if (doc['type'] && doc.type == 'content_item') {
21
21
  if (doc['maps_to']) {
22
- emit(doc.path, doc.maps_to);
22
+ emit(doc._id, doc.maps_to);
23
23
  } else {
24
- emit(doc.path, doc.path);
24
+ emit(doc._id, doc._id);
25
25
  }
26
26
  }
27
27
  }
@@ -30,8 +30,8 @@ module Boombera::Information #:nodoc: all
30
30
  'map_references' => {
31
31
  'map' => <<-EOF
32
32
  function(doc) {
33
- if(doc['maps_to'] && doc.maps_to != doc.path) {
34
- emit(doc.maps_to, doc.path);
33
+ if(doc['maps_to'] && doc.maps_to != doc._id) {
34
+ emit(doc.maps_to, doc._id);
35
35
  }
36
36
  }
37
37
  EOF
@@ -65,20 +65,16 @@ describe 'The Boombera library:' do
65
65
  describe 'putting content in the database' do
66
66
  it 'saves content to a new path' do
67
67
  boombera.put('/foo', 'foo bar baz')
68
- results = db.view('boombera/content_map', :key => '/foo')['rows']
69
- results.length.should == 1
70
- document = db.get(results.first['id'])
71
- document['path'].should == '/foo'
68
+ document = db.get('/foo')
69
+ document['_id'].should == '/foo'
72
70
  document['body'].should == 'foo bar baz'
73
71
  end
74
72
 
75
73
  it 'saves content to an existing path' do
76
74
  boombera.put('/foo', 'foo bar baz')
77
75
  boombera.put('/foo', 'the new content')
78
- results = db.view('boombera/content_map', :key => '/foo')['rows']
79
- results.length.should == 1
80
- document = db.get(results.first['id'])
81
- document['path'].should == '/foo'
76
+ document = db.get('/foo')
77
+ document['_id'].should == '/foo'
82
78
  document['body'].should == 'the new content'
83
79
  end
84
80
 
@@ -86,12 +82,10 @@ describe 'The Boombera library:' do
86
82
  boombera.put('/foo', 'foo bar baz')
87
83
  boombera.map('/bar', '/foo')
88
84
  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'
85
+ document = db.get('/bar')
86
+ document['_id'].should == '/bar'
93
87
  document['body'].should == 'the new content'
94
- document['points_to'].should be_nil
88
+ document['maps_to'].should == '/bar'
95
89
  end
96
90
  end
97
91
 
@@ -99,10 +93,9 @@ describe 'The Boombera library:' do
99
93
  it 'creates a pointer from a path to another path' do
100
94
  boombera.put('/foo', 'foo bar baz')
101
95
  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'
96
+ result = boombera.get('/bar')
97
+ result.path.should == '/foo'
98
+ result.body.should == 'foo bar baz'
106
99
  end
107
100
 
108
101
  it 'updates a pointer from a path to another path' do
@@ -110,22 +103,18 @@ describe 'The Boombera library:' do
110
103
  boombera.put('/spam', 'ham spam can')
111
104
  boombera.map('/bar', '/foo')
112
105
  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'
106
+ result = boombera.get('/bar')
107
+ result.path.should == '/spam'
108
+ result.body.should == 'ham spam can'
117
109
  end
118
110
 
119
111
  it 'turns a content item into a pointer' do
120
112
  boombera.put('/foo', 'foo bar baz')
121
113
  boombera.put('/bar', 'some old bar content')
122
114
  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
115
+ result = boombera.get('/bar')
116
+ result.path.should == '/foo'
117
+ result.body.should == 'foo bar baz'
129
118
  end
130
119
  end
131
120
 
@@ -135,7 +124,7 @@ describe 'The Boombera library:' do
135
124
  end
136
125
 
137
126
  it 'gives you a ContentItem if the content is there' do
138
- db.save_doc({'path' => '/index', 'body' => 'Hello, World!'})
127
+ boombera.put('/index', 'Hello, World!')
139
128
  result = boombera.get('/index')
140
129
  result.path.should == '/index'
141
130
  result.body.should == 'Hello, World!'
@@ -1,6 +1,12 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
2
 
3
3
  describe Boombera::ContentItem do
4
+ let(:db) do
5
+ db = stub(CouchRest::Database)
6
+ CouchRest.stub!(:database! => db)
7
+ db
8
+ end
9
+
4
10
  describe '.new' do
5
11
  context 'when passed a path, body and database' do
6
12
  it 'sets the database from the database argument' do
@@ -20,10 +26,16 @@ describe Boombera::ContentItem do
20
26
  end
21
27
 
22
28
  describe '#path' do
23
- it 'returns the path from the associated document' do
29
+ it 'returns the path from the arguments' do
24
30
  content = Boombera::ContentItem.new('/index.html')
25
31
  content.path.should == '/index.html'
26
32
  end
33
+
34
+ it 'returns the _id when initialized with a Document' do
35
+ doc = CouchRest::Document.new('_id' => '/foobar')
36
+ content = Boombera::ContentItem.new(doc)
37
+ content.path.should == '/foobar'
38
+ end
27
39
  end
28
40
 
29
41
  describe '#body' do
@@ -34,27 +46,12 @@ describe Boombera::ContentItem do
34
46
  end
35
47
 
36
48
  describe '#body=' do
37
- let(:db) { stub(CouchRest::Database) }
38
49
  let(:content) { Boombera::ContentItem.new('/foo', 'not bar', db) }
39
50
 
40
51
  it 'overwrites the current contents of the document body' do
41
52
  content.body = 'bar'
42
53
  content.body.should == 'bar'
43
54
  end
44
-
45
- it 'sets the maps_to attribute equal to the path attribute if argument is not nil' do
46
- db.stub!(:view => {'rows' => [{'value' => '/foo'}]})
47
- content.map_to '/bar'
48
- content.body = 'something'
49
- content.maps_to.should == '/foo'
50
- end
51
-
52
- it 'does not change the maps_to attribute if the argument is nil' do
53
- db.stub!(:view => {'rows' => [{'value' => '/foo'}]})
54
- content.map_to '/bar'
55
- content.body = nil
56
- content.maps_to.should == '/bar'
57
- end
58
55
  end
59
56
 
60
57
  describe '#map_to' do
@@ -74,8 +71,8 @@ describe Boombera::ContentItem do
74
71
 
75
72
  before(:each) do
76
73
  db.should_receive(:view) \
77
- .with('boombera/content_map', :key => '/foo') \
78
- .and_return({'rows' => [{'value' => '/foo'}]})
74
+ .with('boombera/content_paths', :key => '/foo') \
75
+ .and_return({'rows' => [{'id' => '/foo'}]})
79
76
  content.map_to '/foo'
80
77
  end
81
78
 
@@ -88,4 +85,68 @@ describe Boombera::ContentItem do
88
85
  end
89
86
  end
90
87
  end
88
+
89
+ describe '#save' do
90
+ it 'ensures that the type attribute is set to "content_item"' do
91
+ content = Boombera::ContentItem.new('/foo', 'bar', db)
92
+ db.should_receive(:save_doc) \
93
+ .with({'_id' => '/foo', 'body' => 'bar', 'type' => 'content_item',
94
+ 'maps_to' => '/foo'}, false) \
95
+ .and_return({'ok' => true})
96
+ content.save
97
+ end
98
+
99
+ context 'when the body is not nil' do
100
+ it 'sets the maps_to attribute equal to the path' do
101
+ content = Boombera::ContentItem.new('/foo', 'bar', db)
102
+ db.should_receive(:save_doc) \
103
+ .with({'_id' => '/foo', 'body' => 'bar', 'type' => 'content_item',
104
+ 'maps_to' => '/foo'}, false) \
105
+ .and_return({'ok' => true})
106
+ content.save
107
+ end
108
+
109
+ context 'but the maps_to attribute points to another document' do
110
+ it 'sets the maps_to attribute equal to the path' do
111
+ db.stub!(:view => {'rows' => [{'id' => '/bar'}]})
112
+ content = Boombera::ContentItem.new('/foo', nil, db)
113
+ content.map_to('/bar')
114
+ content.body = 'bar'
115
+ db.should_receive(:save_doc) \
116
+ .with({'_id' => '/foo', 'body' => 'bar', 'type' => 'content_item',
117
+ 'maps_to' => '/foo'}, false) \
118
+ .and_return({'ok' => true})
119
+ content.save
120
+ end
121
+ end
122
+ end
123
+
124
+ context 'when the body is nil' do
125
+ it 'does not change the maps_to attribute if it is already set' do
126
+ # stub result from boombera/content_paths view
127
+ db.stub(:view => {'rows' => [{'id' => '/bar'}]})
128
+ content = Boombera::ContentItem.new('/foo', nil, db)
129
+ content.map_to('/bar')
130
+ db.should_receive(:save_doc) \
131
+ .with({'_id' => '/foo', 'body' => nil, 'type' => 'content_item',
132
+ 'maps_to' => '/bar'}, false) \
133
+ .and_return({'ok' => true})
134
+ content.save
135
+ end
136
+ end
137
+ end
138
+
139
+ describe '#resolved' do
140
+ it 'returns true if maps_to == path' do
141
+ content = Boombera::ContentItem.new('/foo', 'bar', db)
142
+ content.should be_resolved
143
+ end
144
+
145
+ it 'returns false if maps_to != path' do
146
+ db.stub!(:view => {'rows' => [{'id' => '/bar'}]})
147
+ content = Boombera::ContentItem.new('/foo', nil, db)
148
+ content.map_to '/bar'
149
+ content.should_not be_resolved
150
+ end
151
+ end
91
152
  end
@@ -40,10 +40,9 @@ describe Boombera do
40
40
  describe '#put' do
41
41
  context "to an existing path" do
42
42
  it 'updates and saves the existing content item' do
43
- resolver = stub(Boombera::ContentItem::MapResolver, :resolve => content_item)
44
- Boombera::ContentItem::MapResolver.should_receive(:new) \
45
- .with('/foo', db, :resolve_map => false) \
46
- .and_return(resolver)
43
+ Boombera::ContentItem.should_receive(:get_pointer) \
44
+ .with('/foo', db) \
45
+ .and_return(content_item)
47
46
  content_item.should_receive(:body=).with('bar')
48
47
  content_item.should_receive(:save).and_return(true)
49
48
  boombera.put('/foo', 'bar').should == true
@@ -52,7 +51,7 @@ describe Boombera do
52
51
 
53
52
  context "to a new path" do
54
53
  it 'creates and saves the content item' do
55
- Boombera::ContentItem::MapResolver.stub!(:new => stub('resolver', :resolve => nil))
54
+ Boombera::ContentItem.stub!(:get_pointer => nil)
56
55
  Boombera::ContentItem.should_receive(:new) \
57
56
  .with('/foo', 'bar', db) \
58
57
  .and_return(content_item)
@@ -64,20 +63,20 @@ describe Boombera do
64
63
 
65
64
  describe '#get' do
66
65
  it 'gets the content item at the specified path from the current database' do
67
- resolver = stub(Boombera::ContentItem::MapResolver, :resolve => :a_content_item)
68
- Boombera::ContentItem::MapResolver.should_receive(:new) \
66
+ Boombera::ContentItem.should_receive(:get) \
69
67
  .with('/foo', db) \
70
- .and_return(resolver)
71
- boombera.get('/foo').should == :a_content_item
68
+ .and_return(content_item)
69
+ boombera.get('/foo').should == content_item
72
70
  end
73
71
  end
74
72
 
75
73
  describe '#map' do
76
74
  context 'to a new path' do
77
75
  before(:each) do
78
- resolver = stub(Boombera::ContentItem::MapResolver, :resolve => nil)
79
- Boombera::ContentItem::MapResolver.stub!(:new => resolver)
80
- Boombera::ContentItem.should_receive(:new).with('/bar', nil, db).and_return(content_item)
76
+ Boombera::ContentItem.stub!(:get_pointer => nil)
77
+ Boombera::ContentItem.should_receive(:new) \
78
+ .with('/bar', nil, db) \
79
+ .and_return(content_item)
81
80
  end
82
81
 
83
82
  it 'creates and saves ContentItem as pointer' do
@@ -95,10 +94,9 @@ describe Boombera do
95
94
 
96
95
  context 'to an existing path' do
97
96
  before(:each) do
98
- resolver = stub(Boombera::ContentItem::MapResolver, :resolve => content_item)
99
- Boombera::ContentItem::MapResolver.should_receive(:new) \
100
- .with('/bar', db, :resolve_map => false) \
101
- .and_return(resolver)
97
+ Boombera::ContentItem.should_receive(:get_pointer) \
98
+ .with('/bar', db) \
99
+ .and_return(content_item)
102
100
  end
103
101
 
104
102
  it 'updates ContentItem as pointer' do
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: boombera
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.3
5
+ version: 0.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - John Wilger
@@ -123,6 +123,17 @@ dependencies:
123
123
  type: :development
124
124
  prerelease: false
125
125
  version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
127
+ name: ruby-debug19
128
+ requirement: &id011 !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 0.11.6
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: *id011
126
137
  description: CouchDB-backed content repository for multi-tenant, multi-stage applications
127
138
  email: johnwilger@gmail.com
128
139
  executables: []
@@ -148,7 +159,6 @@ files:
148
159
  - lib/boombera/content_item.rb
149
160
  - lib/boombera/information.rb
150
161
  - spec/integration/boombera_spec.rb
151
- - spec/lib/boombera/content_item_map_resolver_spec.rb
152
162
  - spec/lib/boombera/content_item_spec.rb
153
163
  - spec/lib/boombera_spec.rb
154
164
  - spec/spec_helper.rb
@@ -166,7 +176,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
176
  requirements:
167
177
  - - ">="
168
178
  - !ruby/object:Gem::Version
169
- hash: 2561778337164614726
179
+ hash: -4409328939730188519
170
180
  segments:
171
181
  - 0
172
182
  version: "0"
@@ -1,66 +0,0 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'spec_helper'))
2
-
3
- describe Boombera::ContentItem::MapResolver do
4
- describe '#resolve' do
5
- context 'with an existing content item' do
6
- it 'returns a ContentItem instance for the found document' do
7
- view_result = {'rows' => [{'id' => '123', 'value' => '/foo'}]}
8
- db = mock(CouchRest::Database)
9
- db.should_receive(:view) \
10
- .with('boombera/content_map', :key => '/foo') \
11
- .and_return(view_result)
12
- db.should_receive(:get) \
13
- .with('123') \
14
- .and_return(CouchRest::Document.new('path' => '/foo', 'body' => 'bar'))
15
- result = Boombera::ContentItem::MapResolver.new('/foo', db).resolve
16
- result.path.should == '/foo'
17
- result.body.should == 'bar'
18
- end
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::MapResolver.new('/foo', db).resolve.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::MapResolver.new('/foo', db).resolve
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::MapResolver.new('/foo', db, :resolve_map => false).resolve
61
- result.path.should == '/foo'
62
- result.maps_to.should == '/bar'
63
- end
64
- end
65
- end
66
- end