exempla-atomic 0.0.3 → 0.0.4

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/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 3
2
+ :patch: 4
3
3
  :major: 0
4
4
  :minor: 0
data/lib/atomic.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/atomic/service'
2
+ require File.dirname(__FILE__) + '/atomic/feed'
2
3
  require File.dirname(__FILE__) + '/atomic/entry'
3
4
 
4
5
  Atomic::NAMESPACES = { "xmlns:atom" => "http://www.w3.org/2005/Atom",
data/lib/atomic/entry.rb CHANGED
@@ -8,44 +8,36 @@ module Atomic
8
8
 
9
9
  class << self
10
10
 
11
- def parse(xml)
12
-
13
- doc = Nokogiri.XML(xml)
14
-
15
- # puts("================================================================")
16
- # puts("XML Document")
17
- # puts("================================================================")
18
- # puts(doc)
19
- # puts("================================================================")
20
-
21
- entry_xml = doc.xpath('//atom:entry', NAMESPACES).first
22
-
23
- attributes = {}
24
- attributes[:id] = entry_xml.xpath('atom:id', NAMESPACES).first.text
25
- attributes[:title] = entry_xml.xpath('atom:title', NAMESPACES).first.text
26
- attributes[:created_at] = entry_xml.xpath('atom:published', NAMESPACES).first.text
27
- attributes[:updated_at] = entry_xml.xpath('atom:updated', NAMESPACES).first.text
28
-
29
- content_xml = entry_xml.xpath('atom:content', NAMESPACES).first
30
-
31
- if (content_xml['type'] == 'application/xml')
32
- attributes[:content] = {}
33
-
34
- announcement_xml = content_xml.xpath('cirrus:announcement', NAMESPACES).first
35
- unless announcement_xml.nil?
36
- attributes[:content][:message] = announcement_xml.xpath('cirrus:message', NAMESPACES).first.text
37
- attributes[:content][:starts_at] = announcement_xml.xpath('cirrus:starts-at', NAMESPACES).first.text
38
- attributes[:content][:ends_at] = announcement_xml.xpath('cirrus:ends-at', NAMESPACES).first.text
11
+ def parse(data)
12
+ entry = new
13
+ doc = data.kind_of?(Nokogiri::XML::Element) ? data : Nokogiri.XML(data)
14
+
15
+ entry_node = doc.xpath('//atom:entry', NAMESPACES).first
16
+
17
+ entry.id = entry_node.xpath('atom:id', NAMESPACES).first.text
18
+ entry.title = entry_node.xpath('atom:title', NAMESPACES).first.text
19
+ entry.created_at = entry_node.xpath('atom:published', NAMESPACES).first.text
20
+ entry.updated_at = entry_node.xpath('atom:updated', NAMESPACES).first.text
21
+
22
+ content_node = entry_node.xpath('atom:content', NAMESPACES).first
23
+
24
+ if (content_node['type'] == 'application/xml')
25
+ entry.content = {}
26
+ announcement_node = content_node.xpath('cirrus:announcement', NAMESPACES).first
27
+ unless announcement_node.nil?
28
+ entry.content[:message] = announcement_node.xpath('cirrus:message', NAMESPACES).first.text
29
+ entry.content[:starts_at] = announcement_node.xpath('cirrus:starts-at', NAMESPACES).first.text
30
+ entry.content[:ends_at] = announcement_node.xpath('cirrus:ends-at', NAMESPACES).first.text
39
31
  end
40
32
  else
41
- attributes[:content] = content_xml.inner_html
33
+ entry.content = content_node.inner_html
42
34
  end
43
- attributes[:categories] = []
44
- entry_xml.xpath('atom:category', NAMESPACES).each do |category_node|
45
- attributes[:categories] << {:term => category_node['term'], :scheme => category_node['scheme']}
35
+ entry.categories = []
36
+ entry_node.xpath('atom:category', NAMESPACES).each do |category_node|
37
+ entry.categories << {:term => category_node['term'], :scheme => category_node['scheme']}
46
38
  end
47
39
 
48
- new(attributes)
40
+ entry
49
41
  end
50
42
 
51
43
  end
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ require 'nokogiri'
3
+ require 'time'
4
+
5
+ module Atomic
6
+
7
+ class Feed
8
+
9
+ class << self
10
+
11
+ def parse(data)
12
+ feed = new
13
+ doc = data.kind_of?(Nokogiri::XML::Element) ? data : Nokogiri.XML(data)
14
+ feed_node = doc.xpath('//atom:feed', NAMESPACES).first
15
+ feed.title = feed_node.xpath('atom:title', NAMESPACES).first.text
16
+ feed.id = feed_node.xpath('atom:id', NAMESPACES).first.text
17
+ feed_node.xpath('atom:entry', NAMESPACES).each do |entry_node|
18
+ feed.entries << Entry.parse(entry_node)
19
+ end
20
+ feed
21
+ end
22
+
23
+ end
24
+
25
+ attr_accessor :title, :id, :entries
26
+
27
+ def initialize(params = {})
28
+ @title = params[:title]
29
+ @id = params[:id]
30
+ @entries = params[:entries] || []
31
+ end
32
+
33
+ def to_hash
34
+ {
35
+ :title => @title,
36
+ :id => @id,
37
+ :entries => @entries.collect { |entry| entry.to_hash }
38
+ }
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Atomic::Feed do
4
+ before(:each) do
5
+ end
6
+
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)
10
+ end
11
+ end
12
+
@@ -0,0 +1,45 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom">
3
+ <title type="text">dive into mark</title>
4
+ <subtitle type="html">
5
+ A &lt;em&gt;lot&lt;/em&gt; of effort
6
+ went into making this effortless
7
+ </subtitle>
8
+ <updated>2005-07-31T12:29:29Z</updated>
9
+ <id>tag:example.org,2003:3</id>
10
+ <link rel="alternate" type="text/html"
11
+ hreflang="en" href="http://example.org/"/>
12
+ <link rel="self" type="application/atom+xml"
13
+ href="http://example.org/feed.atom"/>
14
+ <rights>Copyright (c) 2003, Mark Pilgrim</rights>
15
+ <generator uri="http://www.example.com/" version="1.0">
16
+ Example Toolkit
17
+ </generator>
18
+ <entry>
19
+ <title>Atom draft-07 snapshot</title>
20
+ <link rel="alternate" type="text/html"
21
+ href="http://example.org/2005/04/02/atom"/>
22
+ <link rel="enclosure" type="audio/mpeg" length="1337"
23
+ href="http://example.org/audio/ph34r_my_podcast.mp3"/>
24
+ <id>tag:example.org,2003:3.2397</id>
25
+ <updated>2005-07-31T12:29:29Z</updated>
26
+ <published>2003-12-13T08:29:29-04:00</published>
27
+ <author>
28
+ <name>Mark Pilgrim</name>
29
+ <uri>http://example.org/</uri>
30
+ <email>f8dy@example.com</email>
31
+ </author>
32
+ <contributor>
33
+ <name>Sam Ruby</name>
34
+ </contributor>
35
+ <contributor>
36
+ <name>Joe Gregorio</name>
37
+ </contributor>
38
+ <content type="xhtml" xml:lang="en"
39
+ xml:base="http://diveintomark.org/">
40
+ <div xmlns="http://www.w3.org/1999/xhtml">
41
+ <p><i>[Update: The Atom draft is finished.]</i></p>
42
+ </div>
43
+ </content>
44
+ </entry>
45
+ </feed>
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.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darrin Wortlehock
@@ -33,9 +33,11 @@ files:
33
33
  - spec/fixtures
34
34
  - spec/fixtures/valid_atom_entry.xml
35
35
  - spec/fixtures/valid_atom_service.xml
36
+ - spec/fixtures/valid_atom_feed.xml
36
37
  - spec/spec_helper.rb
37
38
  - spec/atomic
38
39
  - spec/atomic/entry_spec.rb
40
+ - spec/atomic/feed_spec.rb
39
41
  - spec/atomic/service_spec.rb
40
42
  has_rdoc: true
41
43
  homepage: http://github.com/exempla/atomic