exempla-atomic 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 11
2
+ :patch: 12
3
3
  :major: 0
4
4
  :minor: 0
@@ -0,0 +1,312 @@
1
+ begin
2
+ require 'builder'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'builder'
6
+ end
7
+
8
+ begin
9
+ require 'activesupport'
10
+ rescue LoadError
11
+ require 'rubygems'
12
+ require 'activesupport'
13
+ end
14
+
15
+ require 'time'
16
+
17
+ module Atomic
18
+ module Atom
19
+ class Person
20
+
21
+ include Parser
22
+
23
+ attr_accessor :type, :name, :uri, :email
24
+
25
+ def initialize(params = {})
26
+ params.symbolize_keys!
27
+ params.assert_valid_keys(:type, :name, :uri, :email)
28
+ self.type = params[:type]
29
+ self.name = params[:name]
30
+ self.uri = params[:uri]
31
+ self.email = params[:email]
32
+ end
33
+
34
+ def handle_open_element(node, reader)
35
+ progressed = false
36
+ case [node.depth, node.uri, node.name]
37
+ when [0, NS_ATOM, 'author']
38
+ when [0, NS_ATOM, 'contributor']
39
+ when [1, NS_ATOM, 'name']
40
+ when [1, NS_ATOM, 'uri']
41
+ when [1, NS_ATOM, 'email']
42
+ else
43
+ puts("Person ==> Unexpected Open Element - [#{node.depth}] #{node.name} #{node.uri} #{node.attributes.inspect}")
44
+ end
45
+ return progressed
46
+ end
47
+
48
+ def handle_close_element(node)
49
+ case [node.depth, node.uri, node.name]
50
+ when [0, NS_ATOM, 'author']
51
+ self.type = 'author'
52
+ when [0, NS_ATOM, 'contributor']
53
+ self.type = 'contributor'
54
+ when [1, NS_ATOM, 'name']
55
+ self.name = node.text
56
+ when [1, NS_ATOM, 'uri']
57
+ self.uri = node.text
58
+ when [1, NS_ATOM, 'email']
59
+ self.email = node.text
60
+ else
61
+ puts("Person ==> Unexpected Close Element - [#{node.depth}] #{node.name} #{node.uri} #{node.attributes.inspect} #{node.text}")
62
+ end
63
+ end
64
+
65
+ def to_hash
66
+ {
67
+ :type => self.type,
68
+ :name => self.name,
69
+ :uri => self.uri,
70
+ :email => self.email
71
+ }
72
+ end
73
+
74
+ def to_xml(as_document=true, target=nil)
75
+ nsdec = as_document ? {:"xmlns:atom" => NS_ATOM} : {}
76
+ xml = Builder::XmlMarkup.new(:target => target)
77
+ xml.instruct! if as_document
78
+ xml.atom(type.to_sym, nsdec) do
79
+ xml.atom(:name, self.name)
80
+ xml.atom(:uri, self.uri)
81
+ xml.atom(:email, self.email)
82
+ end
83
+ xml.target!
84
+ end
85
+
86
+ end
87
+
88
+
89
+ class Entry
90
+
91
+ include Parser
92
+
93
+ attr_accessor :id, :title, :categories, :created_at, :updated_at, :content, :links, :author, :contributors
94
+
95
+ def initialize(params = {})
96
+ params.symbolize_keys!
97
+ params.assert_valid_keys(:id, :title, :categories, :created_at, :updated_at, :content, :links, :author, :contributors)
98
+ self.title = params[:title]
99
+ self.id = params[:id]
100
+ self.categories = params[:categories] || []
101
+ self.created_at = params[:created_at].nil? ? Time.now : Time.parse(params[:created_at])
102
+ self.updated_at = params[:updated_at].nil? ? self.created_at : Time.parse(params[:updated_at])
103
+ self.content = params[:content] || {}
104
+ self.links = params[:links] || []
105
+ self.author = params[:author]
106
+ self.contributors = params[:contributors] || []
107
+ end
108
+
109
+ def handle_open_element(node, reader)
110
+ progressed = false
111
+ case [node.depth, node.uri, node.name]
112
+ when [0, NS_ATOM, 'entry']
113
+ when [1, NS_ATOM, 'title']
114
+ when [1, NS_ATOM, 'id']
115
+ when [1, NS_ATOM, 'published']
116
+ when [1, NS_ATOM, 'updated']
117
+ when [1, NS_ATOM, 'category']
118
+ when [1, NS_ATOM, 'author']
119
+ self.author = Person.new.deserialize(reader)
120
+ progressed = true
121
+ when [1, NS_ATOM, 'contributor']
122
+ self.contributors << Person.new.deserialize(reader)
123
+ progressed = true
124
+ when [1, NS_ATOM, 'content']
125
+ if node.attributes['type'] == 'application/xml'
126
+ @processing_xml_content = true
127
+ end
128
+ when [1, NS_ATOM, 'link']
129
+ else
130
+ if @processing_xml_content
131
+ extension_class = Extensions::MAP[[node.uri, node.name]]
132
+ unless extension_class.nil?
133
+ extension_class.new(self).deserialize(reader)
134
+ progressed = true
135
+ end
136
+ else
137
+ puts("Entry ==> Unexpected Open Element - [#{node.depth}] #{node.name} #{node.uri} #{node.attributes.inspect}")
138
+ end
139
+ end
140
+ return progressed
141
+ end
142
+
143
+ def handle_close_element(node)
144
+ case [node.depth, node.uri, node.name]
145
+ when [0, NS_ATOM, 'entry']
146
+ when [1, NS_ATOM, 'title']
147
+ self.title = node.text
148
+ when [1, NS_ATOM, 'id']
149
+ self.id = node.text
150
+ when [1, NS_ATOM, 'published']
151
+ self.created_at = Time.parse(node.text)
152
+ when [1, NS_ATOM, 'updated']
153
+ self.updated_at = Time.parse(node.text)
154
+ when [1, NS_ATOM, 'category']
155
+ self.categories << {:scheme => node.attributes['scheme'], :term => node.attributes['term']}
156
+ when [1, NS_ATOM, 'author']
157
+ when [1, NS_ATOM, 'content']
158
+ @processing_xml_content = false
159
+ when [1, NS_ATOM, 'link']
160
+ self.links << {:href => node.attributes['href'], :rel => node.attributes['rel'], :type => node.attributes['type']}
161
+ else
162
+ puts("Entry ==> Unexpected Close Element - [#{node.depth}] #{node.name} #{node.uri} #{node.attributes.inspect} #{node.text}") unless @processing_xml_content
163
+ end
164
+ end
165
+
166
+ def to_hash
167
+ {
168
+ :id => self.id,
169
+ :title => self.title,
170
+ :categories => self.categories,
171
+ :created_at => self.created_at,
172
+ :updated_at => self.updated_at,
173
+ :content => self.content,
174
+ :links => self.links,
175
+ :author => self.author,
176
+ :contributors => self.contributors.collect { |contributor| contributor.to_hash }
177
+ }
178
+ end
179
+
180
+ def to_xml(as_document=true, target=nil)
181
+ nsdec = as_document ? {:"xmlns:atom" => NS_ATOM} : {}
182
+ xml = Builder::XmlMarkup.new(:target => target)
183
+ xml.instruct! if as_document
184
+ xml.atom(:entry, nsdec) do
185
+ xml.atom(:id, self.id)
186
+ xml.atom(:title, self.title)
187
+ xml.atom(:categories) do
188
+ self.categories.each do |category|
189
+ xml.atom(:category, category)
190
+ end
191
+ end
192
+ xml.atom(:published, self.created_at.iso8601)
193
+ xml.atom(:updated, self.updated_at.iso8601)
194
+ xml.atom(:content, self.content) if self.content
195
+ self.links.each do |link|
196
+ xml.atom(:link, link)
197
+ end
198
+ self.author.to_xml(false, xml) if self.author
199
+ self.contributors.each do |contributor|
200
+ contributor.to_xml(false, xml)
201
+ end
202
+ end
203
+ xml.target!
204
+ end
205
+
206
+ end
207
+
208
+ class Feed
209
+
210
+ include Parser
211
+
212
+ attr_accessor :id, :title, :subtitle, :updated_at, :links, :rights, :generator, :entries
213
+
214
+ def initialize(params = {})
215
+ params.symbolize_keys!
216
+ params.assert_valid_keys(:id, :title, :subtitle, :updated_at, :links, :rights, :generator, :entries)
217
+ self.id = params[:id]
218
+ self.title = params[:title]
219
+ self.subtitle = params[:subtitle]
220
+ self.updated_at = params[:updated_at]
221
+ self.links = params[:links] || []
222
+ self.rights = params[:rights]
223
+ self.generator = params[:generator]
224
+ self.entries = params[:entries] || []
225
+ end
226
+
227
+ def updated_at
228
+ updated_times = self.entries.collect{ |entry| entry.updated_at }
229
+ updated_times << @updated_at if @updated_at
230
+ updated_times.max || Time.now
231
+ end
232
+
233
+ def handle_open_element(node, reader)
234
+ progressed = false
235
+ case [node.depth, node.uri, node.name]
236
+ when [0, NS_ATOM, 'feed']
237
+ when [1, NS_ATOM, 'title']
238
+ when [1, NS_ATOM, 'subtitle']
239
+ when [1, NS_ATOM, 'updated']
240
+ when [1, NS_ATOM, 'id']
241
+ when [1, NS_ATOM, 'link']
242
+ when [1, NS_ATOM, 'rights']
243
+ when [1, NS_ATOM, 'generator']
244
+ when [1, NS_ATOM, 'entry']
245
+ self.entries << Entry.new.deserialize(reader)
246
+ progressed = true
247
+ else
248
+ puts("Feed ==> Unexpected Open Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect}")
249
+ end
250
+ return progressed
251
+ end
252
+
253
+ def handle_close_element(node)
254
+ case [node.depth, node.uri, node.name]
255
+ when [0, NS_ATOM, 'feed']
256
+ when [1, NS_ATOM, 'title']
257
+ self.title = node.text
258
+ when [1, NS_ATOM, 'subtitle']
259
+ self.subtitle = node.text
260
+ when [1, NS_ATOM, 'updated']
261
+ self.updated_at = Time.parse(node.text)
262
+ when [1, NS_ATOM, 'id']
263
+ self.id = node.text
264
+ when [1, NS_ATOM, 'link']
265
+ self.links << {:href => node.attributes['href'], :rel => node.attributes['rel'], :type => node.attributes['type']}
266
+ when [1, NS_ATOM, 'rights']
267
+ self.rights = node.text
268
+ when [1, NS_ATOM, 'generator']
269
+ self.generator = node.text
270
+ when [1, NS_ATOM, 'entry']
271
+ else
272
+ puts("Feed ==> Unexpected Close Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect} #{node.text}")
273
+ end
274
+ end
275
+
276
+ def to_hash
277
+ {
278
+ :id => self.id,
279
+ :title => self.title,
280
+ :subtitle => self.subtitle,
281
+ :updated_at => self.updated_at,
282
+ :links => self.links,
283
+ :rights => self.rights,
284
+ :generator => self.generator,
285
+ :entries => self.entries.collect { |entry| entry.to_hash }
286
+ }
287
+ end
288
+
289
+ def to_xml(as_document=true, target=nil)
290
+ nsdec = as_document ? {:"xmlns:atom" => NS_ATOM} : {}
291
+ xml = Builder::XmlMarkup.new(:target => target)
292
+ xml.instruct! if as_document
293
+ xml.atom(:feed, nsdec) do
294
+ xml.atom(:id, self.id)
295
+ xml.atom(:title, self.title)
296
+ xml.atom(:updated, self.updated_at.iso8601)
297
+ xml.atom(:subtitle, self.subtitle) if self.subtitle
298
+ self.links.each do |link|
299
+ xml.atom(:link, link)
300
+ end
301
+ xml.atom(:rights, self.rights) if self.rights
302
+ xml.atom(:generator, self.generator) if self.generator
303
+ self.entries.each do |entry|
304
+ entry.to_xml(false, xml)
305
+ end
306
+ end
307
+ xml.target!
308
+ end
309
+
310
+ end
311
+ end
312
+ end
@@ -0,0 +1,206 @@
1
+ begin
2
+ require 'builder'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'builder'
6
+ end
7
+
8
+ begin
9
+ require 'activesupport'
10
+ rescue LoadError
11
+ require 'rubygems'
12
+ require 'activesupport'
13
+ end
14
+
15
+ module Atomic
16
+ module Atompub
17
+ class Collection
18
+
19
+ include Parser
20
+
21
+ attr_accessor :href, :title, :accepts, :categories
22
+
23
+ def initialize(params = {})
24
+ params.symbolize_keys!
25
+ params.assert_valid_keys(:href, :title, :accepts, :categories)
26
+ self.href = params[:href]
27
+ self.title = params[:title]
28
+ self.accepts = params[:accepts] || []
29
+ self.categories = params[:categories] || []
30
+ end
31
+
32
+ def handle_open_element(node, reader)
33
+ progressed = false
34
+ case [node.depth, node.uri, node.name]
35
+ when [0, NS_APP, 'collection']
36
+ when [1, NS_ATOM, 'title']
37
+ when [1, NS_APP, 'accept']
38
+ when [1, NS_APP, 'categories']
39
+ @processing_categories = true
40
+ when [2, NS_APP, 'category']
41
+ else
42
+ puts("Collection ==> Unexpected Open Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect}")
43
+ end
44
+ return progressed
45
+ end
46
+
47
+ def handle_close_element(node)
48
+ case [node.depth, node.uri, node.name]
49
+ when [0, NS_APP, 'collection']
50
+ self.href = node.attributes['href']
51
+ when [1, NS_ATOM, 'title']
52
+ self.title = node.text
53
+ when [1, NS_APP, 'accept']
54
+ self.accepts << node.text
55
+ when [1, NS_APP, 'categories']
56
+ @processing_categories = false
57
+ when [2, NS_APP, 'category']
58
+ self.categories << {:scheme => node.attributes['scheme'], :term => node.attributes['term']} if @processing_categories
59
+ else
60
+ puts("Collection ==> Unexpected Close Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect} #{node.text}")
61
+ end
62
+ end
63
+
64
+ def to_hash
65
+ {
66
+ :href => self.href,
67
+ :title => self.title,
68
+ :accepts => self.accepts,
69
+ :categories => self.categories
70
+ }
71
+ end
72
+
73
+ def to_xml(as_document=true, target=nil)
74
+ nsdec = as_document ? {:"xmlns:atom" => NS_ATOM, :"xmlns:app" => NS_APP} : {}
75
+ xml = Builder::XmlMarkup.new(:target => target)
76
+ xml.instruct! if as_document
77
+ xml.app(:collection, nsdec.merge({:href => self.href})) do
78
+ xml.atom(:title, self.title)
79
+ self.accepts.each do |accept|
80
+ xml.app(:accept, accept)
81
+ end
82
+ xml.app(:categories) do
83
+ self.categories.each do |category|
84
+ xml.app(:category, category)
85
+ end
86
+ end unless categories.empty?
87
+ end
88
+ xml.target!
89
+ end
90
+
91
+ end
92
+
93
+ class Workspace
94
+
95
+ include Parser
96
+ attr_accessor :title, :collections
97
+
98
+ def initialize(params = {})
99
+ params.symbolize_keys!
100
+ params.assert_valid_keys(:title, :collections)
101
+ self.title = params[:title]
102
+ self.collections = params[:collections] || []
103
+ end
104
+
105
+ def handle_open_element(node, reader)
106
+ progressed = false
107
+ case [node.depth, node.uri, node.name]
108
+ when [0, NS_APP, 'workspace']
109
+ when [1, NS_ATOM, 'title']
110
+ when [1, NS_APP, 'collection']
111
+ self.collections << Collection.new.deserialize(reader)
112
+ progressed = true
113
+ else
114
+ puts("Workspace ==> Unexpected Open Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect}")
115
+ end
116
+ return progressed
117
+ end
118
+
119
+ def handle_close_element(node)
120
+ case [node.depth, node.uri, node.name]
121
+ when [0, NS_APP, 'workspace']
122
+ when [1, NS_ATOM, 'title']
123
+ self.title = node.text
124
+ when [1, NS_APP, 'collection']
125
+ else
126
+ puts("Workspace ==> Unexpected Close Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect} #{node.text}")
127
+ end
128
+ end
129
+
130
+ def to_hash
131
+ {
132
+ :title => self.title,
133
+ :collections => self.collections.collect{ |collection| collection.to_hash }
134
+ }
135
+ end
136
+
137
+ def to_xml(as_document=true, target=nil)
138
+ nsdec = as_document ? {:"xmlns:atom" => NS_ATOM, :"xmlns:app" => NS_APP} : {}
139
+ xml = Builder::XmlMarkup.new(:target => target)
140
+ xml.instruct! if as_document
141
+ xml.app(:workspace, nsdec) do
142
+ xml.atom(:title, self.title)
143
+ self.collections.each do |collection|
144
+ collection.to_xml(false, xml)
145
+ end
146
+ end
147
+ xml.target!
148
+ end
149
+
150
+
151
+ end
152
+
153
+ class Service
154
+
155
+ include Parser
156
+ attr_accessor :workspaces
157
+
158
+ def initialize(params = {})
159
+ params.symbolize_keys!
160
+ params.assert_valid_keys(:workspaces)
161
+ self.workspaces = params[:workspaces] || []
162
+ end
163
+
164
+ def handle_open_element(node, reader)
165
+ progressed = false
166
+ case [node.depth, node.uri, node.name]
167
+ when [0, NS_APP, 'service']
168
+ when [1, NS_APP, 'workspace']
169
+ self.workspaces << Workspace.new.deserialize(reader)
170
+ progressed = true
171
+ else
172
+ puts("Service ==> Unexpected Open Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect}")
173
+ end
174
+ return progressed
175
+ end
176
+
177
+ def handle_close_element(node)
178
+ case [node.depth, node.uri, node.name]
179
+ when [0, NS_APP, 'service']
180
+ when [1, NS_APP, 'workspace']
181
+ else
182
+ puts("Service ==> Unexpected Close Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect} #{node.text}")
183
+ end
184
+ end
185
+
186
+ def to_hash
187
+ {
188
+ :workspaces => self.workspaces.collect { |workspace| workspace.to_hash }
189
+ }
190
+ end
191
+
192
+ def to_xml(as_document=true, target=nil)
193
+ nsdec = as_document ? {:"xmlns:atom" => NS_ATOM, :"xmlns:app" => NS_APP} : {}
194
+ xml = Builder::XmlMarkup.new(:target => target)
195
+ xml.instruct! if as_document
196
+ xml.app(:service, nsdec) do
197
+ self.workspaces.each do |workspace|
198
+ workspace.to_xml(false, xml)
199
+ end
200
+ end
201
+ xml.target!
202
+ end
203
+
204
+ end
205
+ end
206
+ end
data/lib/atomic/parser.rb CHANGED
@@ -25,7 +25,6 @@ module Atomic
25
25
  stack = []
26
26
  start_depth = reader.depth
27
27
  loop do
28
- # puts "#{self.class} STACK: #{stack.inspect}"
29
28
  node = Node.new(reader.depth - start_depth, reader.local_name, reader.namespace_uri, reader.attributes)
30
29
  if (stack.empty? || node.depth > stack.last.depth)
31
30
  # child
@@ -33,22 +32,18 @@ module Atomic
33
32
  stack.last.text = reader.value unless stack.empty?
34
33
  reader.read
35
34
  else
36
- # puts "#{self.class} OPEN ELEMENT: #{node.inspect}"
37
35
  redo if handle_open_element(node,reader)
38
36
  stack.push(node)
39
37
  end
40
38
  elsif(node.depth < stack.last.depth)
41
39
  # parent
42
- # puts "#{self.class} CLOSE ELEMENT: #{stack.last}"
43
40
  handle_close_element(stack.last)
44
41
  stack.pop
45
42
  else
46
43
  # sibling
47
- # puts "#{self.class} SIB CLOSE ELEMENT: #{stack.last}"
48
44
  handle_close_element(stack.last)
49
45
  stack.pop
50
46
  unless stack.empty?
51
- # puts "#{self.class} SIB OPEN ELEMENT: #{node.inspect}"
52
47
  redo if handle_open_element(node,reader)
53
48
  stack.push(node)
54
49
  end
@@ -56,6 +51,7 @@ module Atomic
56
51
  break if stack.empty?
57
52
  reader.read
58
53
  end
54
+ return self
59
55
  end
60
56
 
61
57
  def handle_open_element(node, reader)
data/lib/atomic.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/atomic/parser'
2
- require File.dirname(__FILE__) + '/atomic/person'
3
- require File.dirname(__FILE__) + '/atomic/service'
4
- require File.dirname(__FILE__) + '/atomic/feed'
5
- require File.dirname(__FILE__) + '/atomic/entry'
2
+ require File.dirname(__FILE__) + '/atomic/atom'
3
+ require File.dirname(__FILE__) + '/atomic/atompub'
6
4
  require File.dirname(__FILE__) + '/atomic/extensions'
7
5
 
8
6
  Atomic::NS_ATOM = "http://www.w3.org/2005/Atom"
@@ -0,0 +1,54 @@
1
+ module AtomicSpecHelper
2
+
3
+ def valid_entry_attributes
4
+ {
5
+ :id => "entry_id",
6
+ :title => "Atom Entry Title",
7
+ :categories => [
8
+ {:term => 'treforest', :scheme => 'http://cirrusstage.glam.ac.uk/schemes/locations'},
9
+ {:term => 'hesas', :scheme => 'http://cirrusstage.glam.ac.uk/schemes/categories'}
10
+ ],
11
+ :content => {
12
+ :message=>"Test Announcement Message",
13
+ :starts_at=>"2009-02-10T08:00:00Z",
14
+ :ends_at=>"2009-02-10T17:00:00Z"
15
+ }
16
+ }
17
+ end
18
+
19
+ def valid_feed_attributes
20
+ {
21
+ :id => 'feed_id',
22
+ :title => 'Feed Title',
23
+ :entries => [
24
+ Atomic::Atom::Entry.new(valid_entry_attributes)
25
+ ]
26
+ }
27
+ end
28
+
29
+ def valid_collection_attributes
30
+ {
31
+ :href => 'http://example.org/collection',
32
+ :title => 'Collection Title',
33
+ :accepts => ['application/atom+xml;type=entry'],
34
+ :categories => [
35
+ {:scheme => 'http://example.org/scheme', :term => 'category1'},
36
+ {:scheme => 'http://example.org/scheme', :term => 'category2'}
37
+ ]
38
+ }
39
+ end
40
+
41
+ def valid_workspace_attributes
42
+ {
43
+ :title => 'Workspace Title',
44
+ :collections => [Atomic::Atompub::Collection.new(valid_collection_attributes)]
45
+ }
46
+ end
47
+
48
+ def valid_service_attributes
49
+ {
50
+ :workspaces => [Atomic::Atompub::Workspace.new(valid_workspace_attributes)]
51
+ }
52
+ end
53
+
54
+ end
@@ -1,23 +1,10 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/atomic_spec_helper'
2
3
  #require 'time'
3
4
 
4
- describe Atomic::Entry do
5
-
6
- def valid_attributes
7
- {
8
- :id => "123abc",
9
- :title => "Atom Entry Title",
10
- :categories => [
11
- {:term => 'treforest', :scheme => 'http://cirrusstage.glam.ac.uk/schemes/locations'},
12
- {:term => 'hesas', :scheme => 'http://cirrusstage.glam.ac.uk/schemes/categories'}
13
- ],
14
- :content => {
15
- :message=>"Test Announcement Message",
16
- :starts_at=>"2009-02-10T08:00:00Z",
17
- :ends_at=>"2009-02-10T17:00:00Z"
18
- }
19
- }
20
- end
5
+ describe Atomic::Atom::Entry do
6
+
7
+ include AtomicSpecHelper
21
8
 
22
9
  before :each do
23
10
  @xml = File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', 'valid_atom_entry.xml'))
@@ -28,11 +15,11 @@ describe Atomic::Entry do
28
15
  describe "#parse" do
29
16
 
30
17
  before :each do
31
- @entry = Atomic::Entry.parse(@xml)
18
+ @entry = Atomic::Atom::Entry.parse(@xml)
32
19
  end
33
20
 
34
21
  it "should return a new Atomic::Entry" do
35
- @entry.should be_an(Atomic::Entry)
22
+ @entry.should be_an(Atomic::Atom::Entry)
36
23
  end
37
24
 
38
25
  it "should decode a valid Atom Entry xml document" do
@@ -57,14 +44,14 @@ describe Atomic::Entry do
57
44
  describe "#new" do
58
45
 
59
46
  it "should return a new Atomic::Entry" do
60
- entry = Atomic::Entry.new(valid_attributes)
61
- entry.should be_an(Atomic::Entry)
47
+ entry = Atomic::Atom::Entry.new(valid_entry_attributes)
48
+ entry.should be_an(Atomic::Atom::Entry)
62
49
  end
63
50
 
64
51
  it "should set created_at and updated_at to current time if not supplied" do
65
52
  now = Time.now
66
53
  Time.stub!(:now).and_return(now)
67
- entry = Atomic::Entry.new(valid_attributes)
54
+ entry = Atomic::Atom::Entry.new(valid_entry_attributes)
68
55
  entry.created_at.should be_a(Time)
69
56
  entry.created_at.should == now
70
57
  entry.updated_at.should be_a(Time)
@@ -74,7 +61,7 @@ describe Atomic::Entry do
74
61
  it "should set created_at to supplied time" do
75
62
  now = Time.now
76
63
  Time.stub!(:now).and_return(now)
77
- entry = Atomic::Entry.new(valid_attributes.merge(:created_at => '2009-02-10T08:00:00Z'))
64
+ entry = Atomic::Atom::Entry.new(valid_entry_attributes.merge(:created_at => '2009-02-10T08:00:00Z'))
78
65
  entry.created_at.should == Time.parse('2009-02-10T08:00:00Z')
79
66
  entry.created_at.should be_a(Time)
80
67
  end
@@ -82,7 +69,7 @@ describe Atomic::Entry do
82
69
  it "should set updated_at to supplied time" do
83
70
  now = Time.now
84
71
  Time.stub!(:now).and_return(now)
85
- entry = Atomic::Entry.new(valid_attributes.merge(:updated_at => '2009-02-10T08:00:00Z'))
72
+ entry = Atomic::Atom::Entry.new(valid_entry_attributes.merge(:updated_at => '2009-02-10T08:00:00Z'))
86
73
  entry.updated_at.should == Time.parse('2009-02-10T08:00:00Z')
87
74
  entry.updated_at.should be_a(Time)
88
75
  end
@@ -96,7 +83,7 @@ describe Atomic::Entry do
96
83
  before :each do
97
84
  @now = Time.now
98
85
  Time.stub!(:now).and_return(@now)
99
- @entry = Atomic::Entry.new(valid_attributes)
86
+ @entry = Atomic::Atom::Entry.new(valid_entry_attributes)
100
87
  end
101
88
 
102
89
  it "should return a hash" do
@@ -105,22 +92,22 @@ describe Atomic::Entry do
105
92
 
106
93
  it "should include the id" do
107
94
  @entry.to_hash.should have_key(:id)
108
- @entry.to_hash[:id].should == valid_attributes[:id]
95
+ @entry.to_hash[:id].should == valid_entry_attributes[:id]
109
96
  end
110
97
 
111
98
  it "should include the title" do
112
99
  @entry.to_hash.should have_key(:title)
113
- @entry.to_hash[:title].should == valid_attributes[:title]
100
+ @entry.to_hash[:title].should == valid_entry_attributes[:title]
114
101
  end
115
102
 
116
103
  it "should include the categories" do
117
104
  @entry.to_hash.should have_key(:categories)
118
- @entry.to_hash[:categories].should == valid_attributes[:categories]
105
+ @entry.to_hash[:categories].should == valid_entry_attributes[:categories]
119
106
  end
120
107
 
121
108
  it "should include the content" do
122
109
  @entry.to_hash.should have_key(:content)
123
- @entry.to_hash[:content].should == valid_attributes[:content]
110
+ @entry.to_hash[:content].should == valid_entry_attributes[:content]
124
111
  end
125
112
 
126
113
  it "should include the created_at time" do
@@ -134,6 +121,21 @@ describe Atomic::Entry do
134
121
  end
135
122
 
136
123
  end
124
+
125
+ describe "#to_xml" do
126
+
127
+ before :each do
128
+ @now = Time.now
129
+ Time.stub!(:now).and_return(@now)
130
+ @entry = Atomic::Atom::Entry.new(valid_entry_attributes)
131
+ end
132
+
133
+ it "should work" do
134
+ puts @entry.to_xml(true)
135
+ end
136
+
137
+ end
138
+
137
139
 
138
140
  end
139
141
 
@@ -1,12 +1,37 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/atomic_spec_helper'
3
+
4
+ describe Atomic::Atom::Feed do
5
+
6
+ include AtomicSpecHelper
7
+
8
+ describe "#new" do
2
9
 
3
- describe Atomic::Feed do
4
- before(:each) do
5
10
  end
6
11
 
7
- it "should work" do
8
- xml = File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', 'valid_atom_feed.xml'))
9
- @feed = Atomic::Feed.parse(xml)
12
+ describe "#parse" do
13
+ before(:each) do
14
+ @xml = File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', 'valid_atom_feed.xml'))
15
+ @feed = Atomic::Atom::Feed.parse(@xml)
16
+ end
17
+ it "should work" do
18
+
19
+ end
10
20
  end
21
+
22
+ describe "#to_hash" do
23
+
24
+ end
25
+
26
+ describe "#to_xml" do
27
+ before(:each) do
28
+ @feed = Atomic::Atom::Feed.new(valid_feed_attributes)
29
+ end
30
+
31
+ it "should work" do
32
+ puts @feed.to_xml(true)
33
+ end
34
+ end
35
+
11
36
  end
12
37
 
@@ -1,14 +1,35 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
+ require File.dirname(__FILE__) + '/atomic_spec_helper'
2
3
 
3
- describe Atomic::Service do
4
+ describe Atomic::Atompub::Service do
5
+
6
+ include AtomicSpecHelper
7
+
8
+ describe "#new" do
4
9
 
5
- before(:each) do
6
10
  end
7
11
 
8
- it "should work" do
9
- xml = File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', 'valid_atom_service.xml'))
10
- @service = Atomic::Service.parse(xml)
12
+ describe "#parse" do
13
+ it "should work" do
14
+ xml = File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', 'valid_atom_service.xml'))
15
+ @service = Atomic::Atompub::Service.parse(xml)
16
+ end
17
+ end
18
+
19
+ describe "#to_hash" do
20
+
11
21
  end
22
+
23
+ describe "#to_xml" do
24
+ before(:each) do
25
+ @service = Atomic::Atompub::Service.new(valid_service_attributes)
26
+ end
27
+
28
+ it "should work" do
29
+ puts @service.to_xml(true)
30
+ end
31
+ end
32
+
12
33
 
13
34
  end
14
35
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exempla-atomic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darrin Wortlehock
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-02-24 00:00:00 -08:00
12
+ date: 2009-02-25 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -25,7 +25,7 @@ files:
25
25
  - VERSION.yml
26
26
  - lib/atomic.rb
27
27
  - lib/atomic
28
- - lib/atomic/service.rb
28
+ - lib/atomic/atompub.rb
29
29
  - lib/atomic/extensions
30
30
  - lib/atomic/extensions/cirrus.rb
31
31
  - lib/atomic/extensions/cirrus
@@ -33,20 +33,20 @@ files:
33
33
  - lib/atomic/extensions/cirrus/base.rb
34
34
  - lib/atomic/extensions/cirrus/news.rb
35
35
  - lib/atomic/extensions/cirrus/event.rb
36
- - lib/atomic/entry.rb
37
36
  - lib/atomic/parser.rb
38
- - lib/atomic/person.rb
39
37
  - lib/atomic/extensions.rb
40
- - lib/atomic/feed.rb
38
+ - lib/atomic/atom.rb
41
39
  - spec/spec.opts
42
40
  - spec/fixtures
43
41
  - spec/fixtures/valid_atom_entry.xml
44
42
  - spec/fixtures/valid_atom_service.xml
45
43
  - spec/fixtures/valid_atom_feed.xml
44
+ - spec/fixtures/cirrus_feed.xml
46
45
  - spec/spec_helper.rb
47
46
  - spec/atomic
48
47
  - spec/atomic/entry_spec.rb
49
48
  - spec/atomic/feed_spec.rb
49
+ - spec/atomic/atomic_spec_helper.rb
50
50
  - spec/atomic/parser_spec.rb
51
51
  - spec/atomic/service_spec.rb
52
52
  has_rdoc: true
data/lib/atomic/entry.rb DELETED
@@ -1,102 +0,0 @@
1
- require 'time'
2
- require 'activesupport'
3
-
4
- module Atomic
5
-
6
- class Entry
7
-
8
- include Parser
9
-
10
- attr_accessor :id, :title, :categories, :created_at, :updated_at, :content, :links, :author, :contributors
11
-
12
- def initialize(params = {})
13
- params.symbolize_keys!
14
- params.assert_valid_keys(:title, :id, :categories, :created_at, :updated_at, :content)
15
- @title = params[:title]
16
- @id = params[:id]
17
- @categories = params[:categories] || []
18
- @created_at = params[:created_at].nil? ? Time.now : Time.parse(params[:created_at])
19
- @updated_at = params[:updated_at].nil? ? @created_at : Time.parse(params[:updated_at])
20
- @content = params[:content] || {}
21
- @links = params[:links] || []
22
- @author = params[:author]
23
- @contributors = params[:contributors] || []
24
- end
25
-
26
- def handle_open_element(node, reader)
27
- progressed = false
28
- case [node.depth, node.uri, node.name]
29
- when [0, NS_ATOM, 'entry']
30
- when [1, NS_ATOM, 'title']
31
- when [1, NS_ATOM, 'id']
32
- when [1, NS_ATOM, 'published']
33
- when [1, NS_ATOM, 'updated']
34
- when [1, NS_ATOM, 'category']
35
- when [1, NS_ATOM, 'author']
36
- author = Person.new
37
- author.deserialize(reader)
38
- self.author = author
39
- progressed = true
40
- when [1, NS_ATOM, 'contributor']
41
- contributor = Person.new
42
- contributor.deserialize(reader)
43
- self.contributors << contributor
44
- progressed = true
45
- when [1, NS_ATOM, 'content']
46
- if node.attributes['type'] == 'application/xml'
47
- @processing_xml_content = true
48
- end
49
- when [1, NS_ATOM, 'link']
50
- else
51
- if @processing_xml_content
52
- extension_class = Extensions::MAP[[node.uri, node.name]]
53
- unless extension_class.nil?
54
- extension_class.new(self).deserialize(reader)
55
- progressed = true
56
- end
57
- else
58
- puts("Entry ==> Unexpected Open Element - [#{node.depth}] #{node.name} #{node.uri} #{node.attributes.inspect}")
59
- end
60
- end
61
- return progressed
62
- end
63
-
64
- def handle_close_element(node)
65
- case [node.depth, node.uri, node.name]
66
- when [0, NS_ATOM, 'entry']
67
- when [1, NS_ATOM, 'title']
68
- @title = node.text
69
- when [1, NS_ATOM, 'id']
70
- @id = node.text
71
- when [1, NS_ATOM, 'published']
72
- @created_at = Time.parse(node.text)
73
- when [1, NS_ATOM, 'updated']
74
- @updated_at = Time.parse(node.text)
75
- when [1, NS_ATOM, 'category']
76
- @categories << {:scheme => node.attributes['scheme'], :term => node.attributes['term']}
77
- when [1, NS_ATOM, 'author']
78
- when [1, NS_ATOM, 'content']
79
- @processing_xml_content = false
80
- when [1, NS_ATOM, 'link']
81
- @links << {:href => node.attributes['href'], :rel => node.attributes['rel'], :type => node.attributes['type']}
82
- else
83
- puts("Entry ==> Unexpected Close Element - [#{node.depth}] #{node.name} #{node.uri} #{node.attributes.inspect} #{node.text}") unless @processing_xml_content
84
- end
85
- end
86
-
87
- def to_hash
88
- {
89
- :id => @id,
90
- :title => @title,
91
- :categories => @categories,
92
- :created_at => @created_at,
93
- :updated_at => @updated_at,
94
- :content => @content,
95
- :links => @links,
96
- :author => @author
97
- }
98
- end
99
-
100
- end
101
-
102
- end
data/lib/atomic/feed.rb DELETED
@@ -1,91 +0,0 @@
1
- require 'rubygems'
2
- require 'nokogiri'
3
- require 'time'
4
-
5
- module Atomic
6
-
7
- class Feed
8
-
9
- include Parser
10
-
11
- # class << self
12
- #
13
- # def parse(data)
14
- # feed = new
15
- # doc = data.kind_of?(Nokogiri::XML::Element) ? data : Nokogiri.XML(data)
16
- # feed_node = doc.xpath('//atom:feed', NAMESPACES).first
17
- # feed.title = feed_node.xpath('atom:title', NAMESPACES).first.text
18
- # feed.id = feed_node.xpath('atom:id', NAMESPACES).first.text
19
- # feed_node.xpath('atom:entry', NAMESPACES).each do |entry_node|
20
- # feed.entries << Entry.parse(entry_node)
21
- # end
22
- # feed
23
- # end
24
- #
25
- # end
26
-
27
- attr_accessor :id, :title, :subtitle, :updated_at, :links, :rights, :generator, :entries
28
-
29
- def initialize(params = {})
30
- @title = params[:title]
31
- @id = params[:id]
32
- @entries = params[:entries] || []
33
- @links = params[:links] || []
34
- end
35
-
36
- def handle_open_element(node, reader)
37
- progressed = false
38
- case [node.depth, node.uri, node.name]
39
- when [0, 'http://www.w3.org/2005/Atom', 'feed']
40
- when [1, NS_ATOM, 'title']
41
- when [1, NS_ATOM, 'subtitle']
42
- when [1, NS_ATOM, 'updated']
43
- when [1, NS_ATOM, 'id']
44
- when [1, NS_ATOM, 'link']
45
- when [1, NS_ATOM, 'rights']
46
- when [1, NS_ATOM, 'generator']
47
- when [1, NS_ATOM, 'entry']
48
- entry = Entry.new
49
- entry.deserialize(reader)
50
- @entries << entry
51
- progressed = true
52
- else
53
- puts("Feed ==> Unexpected Open Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect}")
54
- end
55
- return progressed
56
- end
57
-
58
- def handle_close_element(node)
59
- case [node.depth, node.uri, node.name]
60
- when [0, 'http://www.w3.org/2005/Atom', 'feed']
61
- when [1, NS_ATOM, 'title']
62
- @title = node.text
63
- when [1, NS_ATOM, 'subtitle']
64
- @subtitle = node.text
65
- when [1, NS_ATOM, 'updated']
66
- @updated_at = Time.parse(node.text)
67
- when [1, NS_ATOM, 'id']
68
- @id = node.text
69
- when [1, NS_ATOM, 'link']
70
- @links << {:href => node.attributes['href'], :rel => node.attributes['rel'], :type => node.attributes['type']}
71
- when [1, NS_ATOM, 'rights']
72
- @rights = node.text
73
- when [1, NS_ATOM, 'generator']
74
- @generator = node.text
75
- when [1, NS_ATOM, 'entry']
76
- else
77
- puts("Feed ==> Unexpected Close Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect} #{node.text}")
78
- end
79
- end
80
-
81
- def to_hash
82
- {
83
- :title => @title,
84
- :id => @id,
85
- :entries => @entries.collect { |entry| entry.to_hash }
86
- }
87
- end
88
-
89
- end
90
-
91
- end
data/lib/atomic/person.rb DELETED
@@ -1,48 +0,0 @@
1
- require 'activesupport'
2
-
3
- module Atomic
4
- class Person
5
-
6
- include Parser
7
-
8
- attr_accessor :name, :uri, :email
9
-
10
- def initialize(params = {})
11
- params.symbolize_keys!
12
- params.assert_valid_keys(:name, :uri, :email)
13
- @name = params[:name]
14
- @uri = params[:uri]
15
- @email = params[:email]
16
- end
17
-
18
- def handle_open_element(node, reader)
19
- progressed = false
20
- case [node.depth, node.uri, node.name]
21
- when [0, NS_ATOM, 'author']
22
- when [0, NS_ATOM, 'contributor']
23
- when [1, NS_ATOM, 'name']
24
- when [1, NS_ATOM, 'uri']
25
- when [1, NS_ATOM, 'email']
26
- else
27
- puts("Person ==> Unexpected Open Element - [#{node.depth}] #{node.name} #{node.uri} #{node.attributes.inspect}")
28
- end
29
- return progressed
30
- end
31
-
32
- def handle_close_element(node)
33
- case [node.depth, node.uri, node.name]
34
- when [0, NS_ATOM, 'author']
35
- when [0, NS_ATOM, 'contributor']
36
- when [1, NS_ATOM, 'name']
37
- @name = node.text
38
- when [1, NS_ATOM, 'uri']
39
- @uri = node.text
40
- when [1, NS_ATOM, 'email']
41
- @email = node.text
42
- else
43
- puts("Person ==> Unexpected Close Element - [#{node.depth}] #{node.name} #{node.uri} #{node.attributes.inspect} #{node.text}")
44
- end
45
- end
46
-
47
- end
48
- end
@@ -1,145 +0,0 @@
1
- require 'rubygems'
2
- require 'nokogiri'
3
- require 'time'
4
-
5
- module Atomic
6
-
7
- class Collection
8
-
9
- include Parser
10
- attr_accessor :href, :title, :content_types, :categories
11
-
12
- def initialize(params = {})
13
- @href = params[:href]
14
- @title = params[:title]
15
- @content_types = params[:content_types] || []
16
- @categories = params[:categories] || []
17
- end
18
-
19
- def handle_open_element(node, reader)
20
- progressed = false
21
- case [node.depth, node.uri, node.name]
22
- when [0, NS_APP, 'collection']
23
- when [1, NS_ATOM, 'title']
24
- when [1, NS_APP, 'accept']
25
- when [1, NS_APP, 'categories']
26
- @processing_categories = true
27
- when [2, NS_APP, 'category']
28
- else
29
- puts("Collection ==> Unexpected Open Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect}")
30
- end
31
- return progressed
32
- end
33
-
34
- def handle_close_element(node)
35
- case [node.depth, node.uri, node.name]
36
- when [0, NS_APP, 'collection']
37
- self.href = node.attributes['href']
38
- when [1, NS_ATOM, 'title']
39
- self.title = node.text
40
- when [1, NS_APP, 'accept']
41
- self.content_types << node.text
42
- when [1, NS_APP, 'categories']
43
- @processing_categories = false
44
- when [2, NS_APP, 'category']
45
- self.categories << {:scheme => node.attributes['scheme'], :term => node.attributes['term']} if @processing_categories
46
- else
47
- puts("Collection ==> Unexpected Close Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect} #{node.text}")
48
- end
49
- end
50
-
51
- def to_hash
52
- {
53
- :href => @href,
54
- :title => @title
55
- }
56
- end
57
-
58
- end
59
-
60
- class Workspace
61
-
62
- include Parser
63
- attr_accessor :title, :collections
64
-
65
- def initialize(params = {})
66
- @title = params[:title]
67
- @collections = params[:collections] || []
68
- end
69
-
70
- def handle_open_element(node, reader)
71
- progressed = false
72
- case [node.depth, node.uri, node.name]
73
- when [0, NS_APP, 'workspace']
74
- when [1, NS_ATOM, 'title']
75
- when [1, NS_APP, 'collection']
76
- collection = Collection.new
77
- collection.deserialize(reader)
78
- self.collections << collection
79
- progressed = true
80
- else
81
- puts("Workspace ==> Unexpected Open Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect}")
82
- end
83
- return progressed
84
- end
85
-
86
- def handle_close_element(node)
87
- case [node.depth, node.uri, node.name]
88
- when [0, NS_APP, 'workspace']
89
- when [1, NS_ATOM, 'title']
90
- self.title = node.text
91
- when [1, NS_APP, 'collection']
92
- else
93
- puts("Workspace ==> Unexpected Close Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect} #{node.text}")
94
- end
95
- end
96
-
97
- def to_hash
98
- {
99
- :title => @title,
100
- :collections => @collections.collect{ |collection| collection.to_hash }
101
- }
102
- end
103
-
104
- end
105
-
106
- class Service
107
-
108
- include Parser
109
- attr_accessor :workspaces
110
-
111
- def initialize(params = {})
112
- @workspaces = params[:workspaces] || []
113
- end
114
-
115
- def handle_open_element(node, reader)
116
- progressed = false
117
- case [node.depth, node.uri, node.name]
118
- when [0, NS_APP, 'service']
119
- when [1, NS_APP, 'workspace']
120
- workspace = Workspace.new
121
- workspace.deserialize(reader)
122
- self.workspaces << workspace
123
- progressed = true
124
- else
125
- puts("Service ==> Unexpected Open Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect}")
126
- end
127
- return progressed
128
- end
129
-
130
- def handle_close_element(node)
131
- case [node.depth, node.uri, node.name]
132
- when [0, NS_APP, 'service']
133
- when [1, NS_APP, 'workspace']
134
- else
135
- puts("Service ==> Unexpected Close Element - [#{node.depth}] #{node.name} {#{node.uri}} #{node.attributes.inspect} #{node.text}")
136
- end
137
- end
138
-
139
- def to_hash
140
- { :workspaces => @workspaces.collect { |workspace| workspace.to_hash } }
141
- end
142
-
143
- end
144
-
145
- end