hentry_consumer 0.5.1 → 0.5.2
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/lib/hentry_consumer/element.rb +57 -10
- data/lib/hentry_consumer/h_card.rb +24 -10
- data/lib/hentry_consumer/h_entry.rb +27 -33
- data/lib/hentry_consumer/h_feed.rb +10 -4
- data/lib/hentry_consumer/version.rb +1 -1
- data/lib/hentry_consumer.rb +10 -0
- data/spec/lib/hentry_consumer/format_rules_spec.rb +1 -2
- data/spec/lib/hentry_consumer/h_card_spec.rb +0 -2
- data/spec/lib/hentry_consumer/h_entry_spec.rb +24 -51
- data/spec/lib/hentry_consumer/h_feed_spec.rb +2 -2
- metadata +4 -4
@@ -1,39 +1,74 @@
|
|
1
1
|
module HentryConsumer
|
2
2
|
class Element
|
3
|
-
attr_accessor :element
|
3
|
+
attr_accessor :element, :items
|
4
4
|
|
5
|
+
# If a single element is give, return that
|
6
|
+
# If many elements are given, return as array
|
5
7
|
def initialize(element)
|
6
8
|
@element = element
|
7
|
-
parse_elements(@element)
|
9
|
+
@items = parse_elements(@element)
|
8
10
|
end
|
9
11
|
|
10
12
|
def parse_elements(elements)
|
13
|
+
# if there are many elements, parse each of them
|
11
14
|
if elements.is_a?(Nokogiri::XML::NodeSet)
|
12
|
-
|
15
|
+
# return an array of microformats contained in elements
|
16
|
+
elements.map do |element|
|
13
17
|
parse_elements(element)
|
14
|
-
|
15
|
-
|
18
|
+
# just give me a simple array
|
19
|
+
end.flatten.compact
|
20
|
+
elsif elements.is_a?(Nokogiri::XML::Element)
|
16
21
|
parse_element(elements)
|
22
|
+
else
|
23
|
+
nil # nothing to see here, move along
|
17
24
|
end
|
18
25
|
end
|
19
26
|
|
20
27
|
def parse_element(element)
|
21
28
|
classes = element["class"]
|
22
|
-
# element
|
29
|
+
# if element has class with microformat prefix it must be a microformat
|
23
30
|
if classes =~ /(p|n|e|i|u|dt)-/
|
24
|
-
classes
|
31
|
+
classes = cleanse_classes(classes)
|
32
|
+
# parse the element for each microformat class
|
33
|
+
classes.split.map do |c|
|
25
34
|
parse_microformat(element, c)
|
26
35
|
end
|
27
|
-
# element may contain a microformat element
|
28
|
-
|
36
|
+
# if element has children it may contain a microformat element
|
37
|
+
elsif element.children
|
29
38
|
parse_elements(element.children)
|
39
|
+
else
|
40
|
+
nil # nothing to see here, move along
|
30
41
|
end
|
31
42
|
end
|
32
43
|
|
44
|
+
# :(
|
45
|
+
def cleanse_classes(classes)
|
46
|
+
if classes =~ /(h-card)/
|
47
|
+
if classes =~ /(p-author)/ || classes =~ /(e-g5-client)/
|
48
|
+
classes.gsub!(/h-card/, "")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
classes.strip
|
52
|
+
end
|
53
|
+
|
33
54
|
def parse_microformat(element, c)
|
34
|
-
|
55
|
+
method = :"parse_#{c.underscore}"
|
56
|
+
if self.respond_to?(method)
|
57
|
+
self.send(method, element)
|
58
|
+
else
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_h_card(element)
|
64
|
+
HCard.new(element.children)
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_h_entry(element)
|
68
|
+
HEntry.new(element.children)
|
35
69
|
end
|
36
70
|
|
71
|
+
|
37
72
|
def symbolize_class(c)
|
38
73
|
c.to_s.downcase.gsub(/\w{1,2}-/, "").to_sym
|
39
74
|
end
|
@@ -57,6 +92,18 @@ module HentryConsumer
|
|
57
92
|
end
|
58
93
|
end
|
59
94
|
|
95
|
+
def to_hash
|
96
|
+
{ :type => ["element"],
|
97
|
+
:properties => {
|
98
|
+
:items => self.items,
|
99
|
+
}
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
def to_json(*a)
|
104
|
+
to_hash.to_json(a)
|
105
|
+
end
|
106
|
+
|
60
107
|
def to_html
|
61
108
|
@element.to_html
|
62
109
|
end
|
@@ -3,18 +3,32 @@ module HentryConsumer
|
|
3
3
|
attr_accessor :name, :email, :url
|
4
4
|
alias_method :emails, :email
|
5
5
|
alias_method :urls, :url
|
6
|
+
|
7
|
+
def parse_p_name(element)
|
8
|
+
assign_value :name, element.text
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse_u_email(element)
|
12
|
+
assign_value :email, element["href"]
|
13
|
+
end
|
14
|
+
|
15
|
+
def parse_u_url(element)
|
16
|
+
assign_value :url, element["href"]
|
17
|
+
end
|
6
18
|
|
19
|
+
def to_hash
|
20
|
+
{
|
21
|
+
:type => ["h-card"],
|
22
|
+
:properties => {
|
23
|
+
:name => self.name,
|
24
|
+
:email => self.email,
|
25
|
+
:url => self.url
|
26
|
+
}
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
7
30
|
def to_json(*a)
|
8
|
-
|
9
|
-
[{
|
10
|
-
:type => ["h-card"],
|
11
|
-
:properties => {
|
12
|
-
:name => self.name,
|
13
|
-
:email => self.email,
|
14
|
-
:url => self.url
|
15
|
-
}
|
16
|
-
}]
|
17
|
-
}.to_json(a)
|
31
|
+
to_hash.to_json(a)
|
18
32
|
end
|
19
33
|
end
|
20
34
|
end
|
@@ -3,58 +3,52 @@ module HentryConsumer
|
|
3
3
|
attr_accessor :name, :categories, :author, :content, :bookmark, :published_at, :summary
|
4
4
|
alias_method :authors, :author
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
when "e-content" then parse_content(element)
|
12
|
-
when "dt-published" then parse_published(element)
|
13
|
-
when "u-uid" then parse_uid(element)
|
14
|
-
else parse_general(element, c)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def parse_author(element)
|
6
|
+
def parse_p_name(element)
|
7
|
+
assign_value :name, element.text
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse_p_author(element)
|
19
11
|
assign_value :author, HCard.new(element.children)
|
20
12
|
end
|
21
13
|
|
22
|
-
def
|
14
|
+
def parse_p_category(element)
|
23
15
|
self.categories ||= {}
|
24
16
|
self.categories[element.text.gsub("\n", " ").strip] = element["href"]
|
25
17
|
end
|
26
18
|
|
27
|
-
def
|
19
|
+
def parse_e_content(element)
|
28
20
|
assign_value :content, element.inner_html
|
29
21
|
end
|
30
22
|
|
31
|
-
def
|
23
|
+
def parse_dt_published(element)
|
32
24
|
assign_value :published_at, element["datetime"]
|
33
25
|
end
|
34
26
|
|
35
|
-
def
|
27
|
+
def parse_u_uid(element)
|
36
28
|
assign_value :bookmark, element["href"]
|
37
29
|
end
|
38
30
|
|
39
|
-
def
|
40
|
-
assign_value
|
31
|
+
def parse_p_summary(element)
|
32
|
+
assign_value :summary, element.text
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_hash
|
36
|
+
{
|
37
|
+
:type => ["h-entry"],
|
38
|
+
:properties => {
|
39
|
+
:name => self.name,
|
40
|
+
:categories => self.categories,
|
41
|
+
:author => self.author,
|
42
|
+
:content => self.content,
|
43
|
+
:bookmark => self.bookmark,
|
44
|
+
:published_at => self.published_at,
|
45
|
+
:summary => self.summary
|
46
|
+
}
|
47
|
+
}
|
41
48
|
end
|
42
49
|
|
43
50
|
def to_json(*a)
|
44
|
-
|
45
|
-
[{
|
46
|
-
:type => ["h-entry"],
|
47
|
-
:properties => {
|
48
|
-
:name => self.name,
|
49
|
-
:categories => self.categories,
|
50
|
-
:author => self.author,
|
51
|
-
:content => self.content,
|
52
|
-
:bookmark => self.bookmark,
|
53
|
-
:published_at => self.published_at,
|
54
|
-
:summary => self.summary
|
55
|
-
}
|
56
|
-
}]
|
57
|
-
}.to_json(a)
|
51
|
+
to_hash.to_json(a)
|
58
52
|
end
|
59
53
|
end
|
60
54
|
end
|
@@ -20,13 +20,19 @@ module HentryConsumer
|
|
20
20
|
end
|
21
21
|
alias_method :to_s, :to_html
|
22
22
|
|
23
|
-
def
|
24
|
-
|
23
|
+
def to_hash
|
24
|
+
{:items =>
|
25
25
|
[{
|
26
26
|
:type => ["h-feed"],
|
27
|
-
:properties => {
|
27
|
+
:properties => {
|
28
|
+
:entries => self.entries
|
29
|
+
}
|
28
30
|
}]
|
29
|
-
}
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_json(*a)
|
35
|
+
to_hash.to_json(a)
|
30
36
|
end
|
31
37
|
|
32
38
|
end
|
data/lib/hentry_consumer.rb
CHANGED
@@ -12,7 +12,6 @@ describe HentryConsumer::HCard do
|
|
12
12
|
subject { entry.authors.first }
|
13
13
|
|
14
14
|
its(:name) { should eq ["Jessica Suttles"]}
|
15
|
-
|
16
15
|
its(:emails) { should have(1).things }
|
17
16
|
its(:urls) { should have(2).things }
|
18
17
|
end
|
@@ -23,7 +22,6 @@ describe HentryConsumer::HCard do
|
|
23
22
|
subject { entry.authors.first }
|
24
23
|
|
25
24
|
its(:name) { should eq ["Jessica"]}
|
26
|
-
|
27
25
|
its(:emails) { should have(1).things }
|
28
26
|
its(:urls) { should have(1).things }
|
29
27
|
end
|
@@ -8,37 +8,26 @@ describe HentryConsumer::HEntry do
|
|
8
8
|
it "should have an array of entries" do
|
9
9
|
entry.should be_an_instance_of HentryConsumer::HEntry
|
10
10
|
end
|
11
|
-
|
12
11
|
it "has a name" do
|
13
12
|
entry.name.should eq ["Senior Cat Living"]
|
14
13
|
end
|
15
|
-
|
16
14
|
it "has a summary" do
|
17
15
|
entry.summary.should eq ["Signed up with 3 locations"]
|
18
16
|
end
|
19
|
-
|
20
17
|
it "has a time" do
|
21
18
|
entry.published_at.should eq ["2012-08-26 20:09-0700"]
|
22
19
|
end
|
23
|
-
|
24
20
|
it "has a bookmark" do
|
25
21
|
entry.bookmark.should eq "http://g5.com/feed/entries/2012-08-26-20-09-0700"
|
26
22
|
end
|
27
|
-
|
28
|
-
it "should have 2 authors" do
|
23
|
+
it "should have 2 authors as HCards" do
|
29
24
|
entry.authors.should have(2).things HentryConsumer::HCard
|
30
25
|
end
|
31
|
-
|
32
|
-
it "has an author as an hcard" do
|
33
|
-
entry.authors.first.should be_an_instance_of HentryConsumer::HCard
|
34
|
-
end
|
35
|
-
|
36
26
|
describe "categories" do
|
37
|
-
it "
|
27
|
+
it "is a hash" do
|
38
28
|
entry.categories.should be_an_instance_of Hash
|
39
29
|
end
|
40
|
-
|
41
|
-
it "has a key of the content" do
|
30
|
+
it "has a key of the category and value of it's UID" do
|
42
31
|
entry.categories["New Customer"].should eq "http://g5.com/tag/new-customer"
|
43
32
|
end
|
44
33
|
end
|
@@ -49,29 +38,26 @@ describe HentryConsumer::HEntry do
|
|
49
38
|
it "should be a blob of html" do
|
50
39
|
content.first.should match /Locations/
|
51
40
|
end
|
52
|
-
|
53
41
|
it "should be a blob of html" do
|
54
42
|
content.first.should match /\<dt\>/
|
55
43
|
end
|
56
|
-
|
57
44
|
it "should be a blob of html" do
|
58
45
|
content.first.should_not match /time/
|
59
46
|
end
|
60
|
-
|
61
47
|
end
|
62
48
|
|
63
49
|
describe "json" do
|
64
50
|
let(:json) { JSON.parse(entry.to_json) }
|
65
51
|
|
66
|
-
it { json
|
67
|
-
it { json["
|
68
|
-
it { json["
|
69
|
-
it { json["
|
70
|
-
it { json["
|
71
|
-
it { json["
|
72
|
-
it { json["
|
73
|
-
it { json["
|
74
|
-
it { json["
|
52
|
+
it { json.should be_an_instance_of Hash }
|
53
|
+
it { json["type"].should include 'h-entry'}
|
54
|
+
it { json["properties"]["name"].should eq ['Senior Cat Living']}
|
55
|
+
it { json["properties"]["content"].first.should match /Locations/ }
|
56
|
+
it { json["properties"]["author"].should be_an_instance_of Array }
|
57
|
+
it { json["properties"]["author"].first["type"].should include "h-card" }
|
58
|
+
it { json["properties"]["bookmark"].should eq "http://g5.com/feed/entries/2012-08-26-20-09-0700" }
|
59
|
+
it { json["properties"]["published_at"].should eq ["2012-08-26 20:09-0700"] }
|
60
|
+
it { json["properties"]["summary"].should be_an_instance_of Array }
|
75
61
|
end
|
76
62
|
end
|
77
63
|
|
@@ -82,37 +68,27 @@ describe HentryConsumer::HEntry do
|
|
82
68
|
it "should have an array of entries" do
|
83
69
|
entry.should be_an_instance_of HentryConsumer::HEntry
|
84
70
|
end
|
85
|
-
|
86
71
|
it "has a name" do
|
87
72
|
entry.name.should eq ["Wabi Sabi Town"]
|
88
73
|
end
|
89
|
-
|
90
74
|
it "has a summary" do
|
91
75
|
entry.summary.should eq ["Signed up with 2 locations"]
|
92
76
|
end
|
93
|
-
|
94
77
|
it "has a time" do
|
95
78
|
entry.published_at.should eq ["2012-10-10T19:11:17Z"]
|
96
79
|
end
|
97
|
-
|
98
80
|
it "has a bookmark" do
|
99
81
|
entry.bookmark.should eq "http://localhost:3000/customers/3"
|
100
82
|
end
|
101
|
-
|
102
|
-
it "should have 1 author" do
|
83
|
+
it "should have 1 author as an HCard" do
|
103
84
|
entry.authors.should have(1).things HentryConsumer::HCard
|
104
85
|
end
|
105
86
|
|
106
|
-
it "has an author as an hcard" do
|
107
|
-
entry.authors.first.should be_an_instance_of HentryConsumer::HCard
|
108
|
-
end
|
109
|
-
|
110
87
|
describe "categories" do
|
111
|
-
it "
|
88
|
+
it "is a Hash" do
|
112
89
|
entry.categories.should be_an_instance_of Hash
|
113
90
|
end
|
114
|
-
|
115
|
-
it "has a key of the content" do
|
91
|
+
it "has a key of the category and value of it's UID" do
|
116
92
|
entry.categories["Some Category"].should eq "#"
|
117
93
|
end
|
118
94
|
end
|
@@ -123,29 +99,26 @@ describe HentryConsumer::HEntry do
|
|
123
99
|
it "should be a blob of html" do
|
124
100
|
content.first.should match /Locations/
|
125
101
|
end
|
126
|
-
|
127
102
|
it "should be a blob of html" do
|
128
103
|
content.first.should match /\<dt\>/
|
129
104
|
end
|
130
|
-
|
131
105
|
it "should be a blob of html" do
|
132
106
|
content.first.should_not match /time/
|
133
107
|
end
|
134
|
-
|
135
108
|
end
|
136
109
|
|
137
110
|
describe "json" do
|
138
111
|
let(:json) { JSON.parse(entry.to_json) }
|
139
112
|
|
140
|
-
it { json
|
141
|
-
it { json["
|
142
|
-
it { json["
|
143
|
-
it { json["
|
144
|
-
it { json["
|
145
|
-
it { json["
|
146
|
-
it { json["
|
147
|
-
it { json["
|
148
|
-
it { json["
|
113
|
+
it { json.should be_an_instance_of Hash }
|
114
|
+
it { json["type"].should include 'h-entry'}
|
115
|
+
it { json["properties"]["name"].should eq ['Wabi Sabi Town']}
|
116
|
+
it { json["properties"]["content"].first.should match /Locations/ }
|
117
|
+
it { json["properties"]["author"].should be_an_instance_of Array }
|
118
|
+
it { json["properties"]["author"].first["type"].should include "h-card" }
|
119
|
+
it { json["properties"]["bookmark"].should eq "http://localhost:3000/customers/3" }
|
120
|
+
it { json["properties"]["published_at"].should eq ["2012-10-10T19:11:17Z"] }
|
121
|
+
it { json["properties"]["summary"].should be_an_instance_of Array }
|
149
122
|
end
|
150
123
|
end
|
151
124
|
end
|
@@ -7,8 +7,8 @@ describe HentryConsumer::HFeed do
|
|
7
7
|
let(:json) { JSON.parse(feed.to_json) }
|
8
8
|
it { json["items"].first["type"].should include 'h-feed'}
|
9
9
|
it { json["items"].first["properties"]["entries"].should be_an_instance_of Array }
|
10
|
-
it { json["items"].first["properties"]["entries"].
|
11
|
-
it { json["items"].first["properties"]["entries"].first["
|
10
|
+
it { json["items"].first["properties"]["entries"].should be_an_instance_of Array }
|
11
|
+
it { json["items"].first["properties"]["entries"].first["type"].should include "h-entry" }
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "#to_s" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hentry_consumer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-11-
|
13
|
+
date: 2012-11-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nokogiri
|
@@ -152,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
152
|
version: '0'
|
153
153
|
segments:
|
154
154
|
- 0
|
155
|
-
hash: -
|
155
|
+
hash: -4504941096207612030
|
156
156
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
157
|
none: false
|
158
158
|
requirements:
|
@@ -161,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
161
161
|
version: '0'
|
162
162
|
segments:
|
163
163
|
- 0
|
164
|
-
hash: -
|
164
|
+
hash: -4504941096207612030
|
165
165
|
requirements: []
|
166
166
|
rubyforge_project:
|
167
167
|
rubygems_version: 1.8.24
|