ratom 0.3.0 → 0.3.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.
@@ -1,3 +1,8 @@
1
+ == 0.3.1 2008-04-02
2
+
3
+ * Bunch of fixes to the Atom::Pub classes to make them work like the Atom classes
4
+ with respect to initializers and to_xml.
5
+
1
6
  == 0.3.0 2008-04-02
2
7
 
3
8
  * Raise Atom::Serialization error when you try and serialize non-utf8 content.
@@ -147,6 +147,13 @@ module Atom # :nodoc:
147
147
  super(xml.read_string)
148
148
  parse(xml, :once => true)
149
149
  end
150
+
151
+ def to_xml(nodeonly = true, name = 'content', namespace = nil)
152
+ node = XML::Node.new(name)
153
+ node['xmlns'] = namespace
154
+ node << self.to_s
155
+ node
156
+ end
150
157
  end
151
158
 
152
159
  # Html content within an Atom document.
@@ -167,7 +174,7 @@ module Atom # :nodoc:
167
174
  end
168
175
  end
169
176
 
170
- def to_xml(nodeonly = true, name = 'content') # :nodoc:
177
+ def to_xml(nodeonly = true, name = 'content', namespace = nil) # :nodoc:
171
178
  require 'iconv'
172
179
  # Convert from utf-8 to utf-8 as a way of making sure the content is UTF-8.
173
180
  #
@@ -180,6 +187,7 @@ module Atom # :nodoc:
180
187
  node = XML::Node.new(name)
181
188
  node << Iconv.iconv('utf-8', 'utf-8', self.to_s)
182
189
  node['type'] = 'html'
190
+ node['xmlns'] = namespace
183
191
  node['xml:lang'] = self.xml_lang
184
192
  node
185
193
  rescue Iconv::IllegalSequence => e
@@ -210,10 +218,11 @@ module Atom # :nodoc:
210
218
  while xml.read == 1 && xml.depth > starting_depth; end
211
219
  end
212
220
 
213
- def to_xml(nodeonly = true, name = 'content')
221
+ def to_xml(nodeonly = true, name = 'content', namespace = nil)
214
222
  node = XML::Node.new(name)
215
223
  node['type'] = 'xhtml'
216
224
  node['xml:lang'] = self.xml_lang
225
+ node['xmlns'] = namespace
217
226
 
218
227
  div = XML::Node.new('div')
219
228
  div['xmlns'] = XHTML
@@ -287,6 +296,7 @@ module Atom # :nodoc:
287
296
 
288
297
  loadable!
289
298
 
299
+ namespace Atom::NAMESPACE
290
300
  element :id, :rights
291
301
  element :generator, :class => Generator
292
302
  element :title, :subtitle, :class => Content
@@ -403,6 +413,7 @@ module Atom # :nodoc:
403
413
  def_delegators :@links, :alternate, :self, :alternates, :enclosures, :edit_link, :via
404
414
 
405
415
  loadable!
416
+ namespace Atom::NAMESPACE
406
417
  element :title, :id, :summary
407
418
  element :updated, :published, :class => Time, :content_only => true
408
419
  element :content, :class => Content
@@ -24,6 +24,7 @@ module Atom
24
24
 
25
25
  class Service
26
26
  include Atom::Xml::Parseable
27
+ namespace Atom::Pub::NAMESPACE
27
28
  elements :workspaces
28
29
  loadable! do |reader, message, severity, base, line|
29
30
  if severity == XML::Reader::SEVERITY_ERROR
@@ -31,51 +32,77 @@ module Atom
31
32
  end
32
33
  end
33
34
 
34
- def initialize(xml)
35
+ def initialize(xml = nil)
35
36
  @workspaces = []
36
- begin
37
- if next_node_is?(xml, 'service', Atom::Pub::NAMESPACE)
38
- xml.read
39
- parse(xml)
40
- else
41
- raise ArgumentError, "XML document was missing atom:feed"
37
+
38
+ if xml
39
+ begin
40
+ if next_node_is?(xml, 'service', Atom::Pub::NAMESPACE)
41
+ xml.read
42
+ parse(xml)
43
+ else
44
+ raise ArgumentError, "XML document was missing atom:service"
45
+ end
46
+ ensure
47
+ xml.close
42
48
  end
43
- ensure
44
- xml.close
45
49
  end
50
+
51
+ yield(self) if block_given?
52
+ end
53
+ end
54
+
55
+ class Category
56
+ include Atom::Xml::Parseable
57
+ def initialize(o)
58
+ o.read
59
+ parse(o, :once => true)
46
60
  end
47
61
  end
48
62
 
49
- class Categories
63
+ class Categories < DelegateClass(Array)
50
64
  include Atom::Xml::Parseable
65
+ elements :categories, :class => Category
51
66
 
52
67
  def initialize(o)
68
+ super([])
53
69
  o.read
54
70
  parse(o)
55
71
  end
56
-
72
+
73
+ def categories; self; end
57
74
  end
58
75
 
59
76
  class Workspace
60
77
  include Atom::Xml::Parseable
61
- element :title, :class => Content
78
+ element :title, :class => Content, :namespace => Atom::NAMESPACE
62
79
  elements :collections
63
80
 
64
- def initialize(o)
81
+ def initialize(o = nil)
65
82
  @collections = []
66
- o.read
67
- parse(o)
83
+
84
+ case o
85
+ when XML::Reader
86
+ o.read
87
+ parse(o)
88
+ when Hash
89
+ o.each do |k, v|
90
+ self.send("#{k}=".to_sym, v)
91
+ end
92
+ end
93
+
94
+ yield(self) if block_given?
68
95
  end
69
96
  end
70
97
 
71
98
  class Collection
72
99
  include Atom::Xml::Parseable
73
100
  attribute :href
101
+ element :title, :class => Content, :namespace => Atom::NAMESPACE
74
102
  element :categories, :class => Categories
75
- element :title, :class => Content
76
103
  elements :accepts, :content_only => true
77
104
 
78
- def initialize(o)
105
+ def initialize(o = nil)
79
106
  @accepts = []
80
107
  case o
81
108
  when XML::Reader
@@ -89,6 +116,8 @@ module Atom
89
116
  self.send("#{k}=", v)
90
117
  end
91
118
  end
119
+
120
+ yield(self) if block_given?
92
121
  end
93
122
 
94
123
  def feed
@@ -2,7 +2,7 @@ module Atom #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 3
5
- TINY = 0
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -68,6 +68,7 @@ module Atom
68
68
  def o.attributes; @attributes ||= []; end
69
69
  def element_specs; self.class.element_specs; end
70
70
  def attributes; self.class.attributes; end
71
+ def o.namespace(ns = @namespace); @namespace = ns; end
71
72
  end
72
73
  o.send(:extend, DeclarationMethods)
73
74
  end
@@ -84,27 +85,32 @@ module Atom
84
85
  end
85
86
  end
86
87
 
87
- def to_xml(nodeonly = false, root_name = self.class.name.demodulize.downcase)
88
-
88
+ def to_xml(nodeonly = false, root_name = self.class.name.demodulize.downcase, namespace = nil)
89
89
  node = XML::Node.new(root_name)
90
- node['xmlns'] = Atom::NAMESPACE unless nodeonly
90
+ node['xmlns'] = self.class.namespace unless nodeonly || !self.class.respond_to?(:namespace)
91
91
 
92
- self.class.element_specs.values.each do |spec|
93
- if spec.single?
94
- if attribute = self.send(spec.attribute)
95
- if attribute.is_a?(Time)
96
- node << XML::Node.new(spec.name, attribute.xmlschema)
97
- elsif attribute.respond_to?(:to_xml)
98
- node << attribute.to_xml(true)
99
- else
100
- n = XML::Node.new(spec.name)
101
- n << attribute
102
- node << n
103
- end
92
+ self.class.element_specs.values.select {|s| s.single? }.each do |spec|
93
+ if attribute = self.send(spec.attribute)
94
+ if attribute.respond_to?(:to_xml)
95
+ node << attribute.to_xml(true, spec.name, spec.options[:namespace])
96
+ else
97
+ n = XML::Node.new(spec.name)
98
+ n['xmlns'] = spec.options[:namespace]
99
+ n << (attribute.is_a?(Time)? attribute.xmlschema : attribute.to_s)
100
+ node << n
104
101
  end
105
- else
106
- self.send(spec.attribute).each do |attribute|
102
+ end
103
+ end
104
+
105
+ self.class.element_specs.values.select {|s| !s.single? }.each do |spec|
106
+ self.send(spec.attribute).each do |attribute|
107
+ if attribute.respond_to?(:to_xml)
107
108
  node << attribute.to_xml(true, spec.name.singularize)
109
+ else
110
+ n = XML::Node.new(spec.name.singularize)
111
+ n['xmlns'] = spec.options[:namespace]
112
+ n << attribute.to_s
113
+ node << n
108
114
  end
109
115
  end
110
116
  end
@@ -12,215 +12,263 @@ require 'atom/version'
12
12
  require 'uri'
13
13
  require 'net/http'
14
14
 
15
+ shared_examples_for 'parser of spec/app/service.xml' do
16
+ it "should have 2 workspaces" do
17
+ @service.should have(2).workspaces
18
+ end
19
+
20
+ it "should have a title" do
21
+ @workspace.title.should == "Main Site"
22
+ end
23
+
24
+ it "should have 2 collections" do
25
+ @workspace.should have(2).collections
26
+ end
27
+
28
+ it "should have the right href" do
29
+ @collection1.href.should == 'http://example.org/blog/main'
30
+ end
31
+
32
+ it "should have categories" do
33
+ @collection1.categories.should_not be_nil
34
+ end
35
+
36
+ it "should have a title" do
37
+ @collection1.title.should == 'My Blog Entries'
38
+ end
39
+
40
+ it "should have a title" do
41
+ @collection2.title.should == 'Pictures'
42
+ end
43
+
44
+ it "should have the right href" do
45
+ @collection2.href.should == 'http://example.org/blog/pic'
46
+ end
47
+
48
+ it "should not have categories" do
49
+ @collection2.categories.should be_nil
50
+ end
51
+
52
+ it "should have 3 accepts" do
53
+ @collection2.should have(3).accepts
54
+ end
55
+
56
+ it "should accept 'image/png'" do
57
+ @collection2.accepts.should include('image/png')
58
+ end
59
+
60
+ it "should accept 'image/jpeg'" do
61
+ @collection2.accepts.should include('image/jpeg')
62
+ end
63
+
64
+ it "should accept 'image/gif'" do
65
+ @collection2.accepts.should include('image/gif')
66
+ end
67
+
68
+ it "should have a title on workspace 2" do
69
+ @workspace2.title.should == 'Sidebar Blog'
70
+ end
71
+
72
+ it "should have 1 collection on workspace 2" do
73
+ @workspace2.should have(1).collections
74
+ end
75
+
76
+ it "should have a title on collection 3" do
77
+ @collection3.title.should == 'Remaindered Links'
78
+ end
79
+
80
+ it "should have 1 accept on collection 3" do
81
+ @collection3.should have(1).accepts
82
+ end
83
+
84
+ it "should accept 'application/atom+xml;type=entry'" do
85
+ @collection3.accepts.should include('application/atom+xml;type=entry')
86
+ end
87
+
88
+ it "should have categories" do
89
+ @collection3.categories.should_not be_nil
90
+ end
91
+ end
92
+
15
93
  describe Atom::Pub do
16
94
  describe Atom::Pub::Service do
17
- before(:all) do
18
- @service = Atom::Pub::Service.load_service(File.open('spec/app/service.xml'))
95
+ it "should load from a URL" do
96
+ uri = URI.parse('http://example.com/service.xml')
97
+ response = Net::HTTPSuccess.new(nil, nil, nil)
98
+ response.stub!(:body).and_return(File.read('spec/app/service.xml'))
99
+ Net::HTTP.should_receive(:get_response).with(uri).and_return(response)
100
+ Atom::Pub::Service.load_service(uri).should be_an_instance_of(Atom::Pub::Service)
19
101
  end
102
+
103
+ it "should raise ArgumentError with a non-http URL" do
104
+ lambda { Atom::Pub::Service.load_service(URI.parse('file:/tmp')) }.should raise_error(ArgumentError)
105
+ end
106
+
107
+ it "should be able to be created without xml" do
108
+ lambda { Atom::Pub::Service.new }.should_not raise_error
109
+ end
110
+
111
+ it "should yield in the initializer" do
112
+ yielded = false
113
+ Atom::Pub::Service.new do
114
+ yielded = true
115
+ end
20
116
 
21
- it "should have 2 workspaces" do
22
- @service.should have(2).workspaces
117
+ yielded.should be_true
23
118
  end
24
-
25
- describe 'workspace 1' do
26
- before(:each) do
119
+
120
+ it "should parse it's output" do
121
+ orig = File.read('spec/app/service.xml')
122
+ svc = Atom::Pub::Service.load_service(orig)
123
+ xml = svc.to_xml
124
+ lambda do
125
+ Atom::Pub::Service.load_service(xml)
126
+ end.should_not raise_error
127
+ end
128
+
129
+ describe "load_service" do
130
+ before(:all) do
131
+ @service = Atom::Pub::Service.load_service(File.open('spec/app/service.xml'))
27
132
  @workspace = @service.workspaces.first
133
+ @workspace2 = @service.workspaces[1]
134
+ @collection1 = @workspace.collections.first
135
+ @collection2 = @workspace.collections[1]
136
+ @collection3 = @workspace2.collections.first
28
137
  end
138
+
139
+ it_should_behave_like 'parser of spec/app/service.xml'
140
+ end
29
141
 
30
- it "should have a title" do
31
- @workspace.title.should == "Main Site"
142
+ describe "#to_xml" do
143
+ before(:each) do
144
+ @svc = Atom::Pub::Service.load_service(File.read('spec/app/service.xml'))
145
+ @xml = @svc.to_xml
146
+ @service = Atom::Pub::Service.load_service(@xml)
147
+ @workspace = @service.workspaces.first
148
+ @workspace2 = @service.workspaces[1]
149
+ @collection1 = @workspace.collections.first
150
+ @collection2 = @workspace.collections[1]
151
+ @collection3 = @workspace2.collections.first
32
152
  end
33
153
 
34
- it "should have 2 collections" do
35
- @workspace.should have(2).collections
154
+ it "should put title in Atom namespace" do
155
+ # TODO fix this to use a prefix?
156
+ @xml.should match(%r{title xmlns="#{Atom::NAMESPACE}"})
36
157
  end
37
-
38
- describe 'first collection' do
39
- before(:each) do
40
- @collection = @workspace.collections.first
41
- end
42
-
43
- it "should have the right href" do
44
- @collection.href.should == 'http://example.org/blog/main'
45
- end
46
-
47
- it "should have categories" do
48
- @collection.categories.should_not be_nil
49
- end
50
158
 
51
- it "should have a title" do
52
- @collection.title.should == 'My Blog Entries'
53
- end
159
+ it_should_behave_like 'parser of spec/app/service.xml'
160
+ end
161
+ end
162
+
163
+ describe Atom::Pub::Collection do
164
+ describe '.new' do
165
+ it "should set the href from the hash" do
166
+ collection = Atom::Pub::Collection.new(:href => 'http://example.org/blog')
167
+ collection.href.should == 'http://example.org/blog'
54
168
  end
55
-
56
- describe 'second collection' do
57
- before(:each) do
58
- @collection = @workspace.collections[1]
59
- end
60
-
61
- it "should have a title" do
62
- @collection.title.should == 'Pictures'
63
- end
64
169
 
65
- it "should have the right href" do
66
- @collection.href.should == 'http://example.org/blog/pic'
67
- end
68
-
69
- it "should not have categories" do
70
- @collection.categories.should be_nil
71
- end
72
-
73
- it "should have 3 accepts" do
74
- @collection.should have(3).accepts
75
- end
76
-
77
- it "should accept 'image/png'" do
78
- @collection.accepts.should include('image/png')
79
- end
80
-
81
- it "should accept 'image/jpeg'" do
82
- @collection.accepts.should include('image/jpeg')
83
- end
84
-
85
- it "should accept 'image/gif'" do
86
- @collection.accepts.should include('image/gif')
170
+ it "should set the href from a block" do
171
+ collection = Atom::Pub::Collection.new do |c|
172
+ c.href = "http://example.org/blog"
87
173
  end
174
+ collection.href.should == 'http://example.org/blog'
88
175
  end
89
176
  end
90
-
91
- describe 'workspace 2' do
177
+
178
+ describe '#publish' do
92
179
  before(:each) do
93
- @workspace = @service.workspaces[1]
94
- end
95
-
96
- it "should have a title" do
97
- @workspace.title.should == 'Sidebar Blog'
180
+ @collection = Atom::Pub::Collection.new(:href => 'http://example.org/blog')
181
+ @request_headers = {'Accept' => 'application/atom+xml',
182
+ 'Content-Type' => 'application/atom+xml;type=entry',
183
+ 'User-Agent' => "rAtom #{Atom::VERSION::STRING}"
184
+ }
98
185
  end
99
-
100
- it "should have 1 collection" do
101
- @workspace.should have(1).collections
186
+
187
+ it "should return the feed" do
188
+ response = Net::HTTPSuccess.new(nil, nil, nil)
189
+ response.stub!(:body).and_return(File.read('spec/fixtures/simple_single_entry.atom'))
190
+ Net::HTTP.should_receive(:get_response).with(URI.parse(@collection.href)).and_return(response)
191
+ @collection.feed.should be_an_instance_of(Atom::Feed)
102
192
  end
103
193
 
104
- describe 'collection' do
105
- before(:each) do
106
- @collection = @workspace.collections.first
107
- end
108
-
109
- it "should have a title" do
110
- @collection.title.should == 'Remaindered Links'
111
- end
112
-
113
- it "should have 1 accept" do
114
- @collection.should have(1).accepts
115
- end
194
+ it "should send a POST request when an entry is published" do
195
+ entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
196
+
197
+ response = mock_response(Net::HTTPCreated, entry.to_xml.to_s)
116
198
 
117
- it "should accept 'application/atom+xml;type=entry'" do
118
- @collection.accepts.should include('application/atom+xml;type=entry')
119
- end
199
+ http = mock('http')
200
+ http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
201
+ Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
120
202
 
121
- it "should have categories" do
122
- @collection.categories.should_not be_nil
123
- end
203
+ created = @collection.publish(entry)
204
+ created.should == entry
124
205
  end
125
- end
126
- end
127
-
128
- describe Atom::Pub::Service do
129
- it "should load from a URL" do
130
- uri = URI.parse('http://example.com/service.xml')
131
- response = Net::HTTPSuccess.new(nil, nil, nil)
132
- response.stub!(:body).and_return(File.read('spec/app/service.xml'))
133
- Net::HTTP.should_receive(:get_response).with(uri).and_return(response)
134
- Atom::Pub::Service.load_service(uri).should be_an_instance_of(Atom::Pub::Service)
135
- end
136
206
 
137
- it "should raise ArgumentError with a non-http URL" do
138
- lambda { Atom::Pub::Service.load_service(URI.parse('file:/tmp')) }.should raise_error(ArgumentError)
139
- end
140
- end
141
-
142
- describe Atom::Pub::Collection do
143
- before(:each) do
144
- @collection = Atom::Pub::Collection.new(:href => 'http://example.org/blog')
145
- @request_headers = {'Accept' => 'application/atom+xml',
146
- 'Content-Type' => 'application/atom+xml;type=entry',
147
- 'User-Agent' => "rAtom #{Atom::VERSION::STRING}"
148
- }
149
- end
150
-
151
- it "should set the href from the hash" do
152
- @collection.href.should == 'http://example.org/blog'
153
- end
207
+ it "should behave well when no content is returned" do
208
+ entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
209
+
210
+ response = mock_response(Net::HTTPCreated, " ")
154
211
 
155
- it "should return the feed" do
156
- response = Net::HTTPSuccess.new(nil, nil, nil)
157
- response.stub!(:body).and_return(File.read('spec/fixtures/simple_single_entry.atom'))
158
- Net::HTTP.should_receive(:get_response).with(URI.parse(@collection.href)).and_return(response)
159
- @collection.feed.should be_an_instance_of(Atom::Feed)
160
- end
212
+ http = mock('http')
213
+ http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
214
+ Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
215
+
216
+ created = @collection.publish(entry)
217
+ created.should == entry
218
+ end
161
219
 
162
- it "should send a POST request when an entry is published" do
163
- entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
164
-
165
- response = mock_response(Net::HTTPCreated, entry.to_xml.to_s)
220
+ it "should raise error when response is not HTTPCreated" do
221
+ entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
222
+ response = mock_response(Net::HTTPPreconditionFailed, "")
166
223
 
167
- http = mock('http')
168
- http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
169
- Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
224
+ http = mock('http')
225
+ http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
226
+ Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
170
227
 
171
- created = @collection.publish(entry)
172
- created.should == entry
173
- end
228
+ lambda { @collection.publish(entry) }.should raise_error(Atom::Pub::ProtocolError)
229
+ end
174
230
 
175
- it "should behave well when no content is returned" do
176
- entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
231
+ it "should copy Location into edit link of entry" do
232
+ entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
177
233
 
178
- response = mock_response(Net::HTTPCreated, " ")
234
+ response = mock_response(Net::HTTPCreated, entry.to_xml.to_s, 'Location' => 'http://example.org/edit/entry1.atom')
179
235
 
180
- http = mock('http')
181
- http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
182
- Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
236
+ http = mock('http')
237
+ http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
238
+ Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
183
239
 
184
- created = @collection.publish(entry)
185
- created.should == entry
186
- end
240
+ created = @collection.publish(entry)
241
+ created.edit_link.should_not be_nil
242
+ created.edit_link.href.should == 'http://example.org/edit/entry1.atom'
243
+ end
187
244
 
188
- it "should raise error when response is not HTTPCreated" do
189
- entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
190
- response = mock_response(Net::HTTPPreconditionFailed, "")
245
+ it "should update the entry when response is different" do
246
+ entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
247
+ response = mock_response(Net::HTTPCreated, File.read('spec/fixtures/created_entry.atom'),
248
+ 'Location' => 'http://example.org/edit/atom')
191
249
 
192
- http = mock('http')
193
- http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
194
- Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
250
+ http = mock('http')
251
+ http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
252
+ Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
195
253
 
196
- lambda { @collection.publish(entry) }.should raise_error(Atom::Pub::ProtocolError)
254
+ created = @collection.publish(entry)
255
+ created.should == Atom::Entry.load_entry(File.open('spec/fixtures/created_entry.atom'))
256
+ end
197
257
  end
198
-
199
- it "should copy Location into edit link of entry" do
200
- entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
201
-
202
- response = mock_response(Net::HTTPCreated, entry.to_xml.to_s, 'Location' => 'http://example.org/edit/entry1.atom')
203
-
204
- http = mock('http')
205
- http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
206
- Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
258
+ end
259
+
260
+ describe Atom::Pub::Workspace do
261
+ it "should do the block initialization thing" do
262
+ workspace = Atom::Pub::Workspace.new do |w|
263
+ w.title = "Title"
264
+ end
207
265
 
208
- created = @collection.publish(entry)
209
- created.edit_link.should_not be_nil
210
- created.edit_link.href.should == 'http://example.org/edit/entry1.atom'
266
+ workspace.title.should == "Title"
211
267
  end
212
268
 
213
- it "should update the entry when response is different" do
214
- entry = Atom::Entry.load_entry(File.open('spec/fixtures/entry.atom'))
215
- response = mock_response(Net::HTTPCreated, File.read('spec/fixtures/created_entry.atom'),
216
- 'Location' => 'http://example.org/edit/atom')
217
-
218
- http = mock('http')
219
- http.should_receive(:post).with('/blog', entry.to_xml.to_s, @request_headers).and_return(response)
220
- Net::HTTP.should_receive(:start).with('example.org', 80).and_yield(http)
221
-
222
- created = @collection.publish(entry)
223
- created.should == Atom::Entry.load_entry(File.open('spec/fixtures/created_entry.atom'))
269
+ it "should do the hash initialization thing" do
270
+ workspace = Atom::Pub::Workspace.new(:title => 'Title')
271
+ workspace.title.should == "Title"
224
272
  end
225
273
  end
226
274
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ratom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peerworks