hentry_consumer 0.1.2 → 0.1.3
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/README.md +1 -1
- data/hentry_consumer.gemspec +1 -0
- data/lib/hentry_consumer/element.rb +17 -3
- data/lib/hentry_consumer/format_rules.rb +14 -0
- data/lib/hentry_consumer/h_card.rb +17 -0
- data/lib/hentry_consumer/h_entry.rb +23 -10
- data/lib/hentry_consumer/h_feed.rb +9 -0
- data/lib/hentry_consumer/version.rb +1 -1
- data/lib/hentry_consumer.rb +1 -0
- data/spec/lib/hentry_consumer/format_rules_spec.rb +21 -0
- data/spec/lib/hentry_consumer/h_card_spec.rb +10 -5
- data/spec/lib/hentry_consumer/h_entry_spec.rb +19 -2
- data/spec/lib/hentry_consumer/h_feed_spec.rb +10 -0
- data/spec/support/example.html +14 -0
- metadata +65 -33
data/README.md
CHANGED
data/hentry_consumer.gemspec
CHANGED
@@ -3,11 +3,11 @@ module HentryConsumer
|
|
3
3
|
def initialize(microformat)
|
4
4
|
parse_elements(microformat)
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
def parse_elements(microformat)
|
8
8
|
FormatClass.each do |letter|
|
9
9
|
microformat.css(">*[class*=#{letter}-]").each do |a|
|
10
|
-
|
10
|
+
assign_value(symbolize_class(a["class"]), a.text.gsub('\n', " ").strip)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -16,8 +16,22 @@ module HentryConsumer
|
|
16
16
|
klass.to_s.downcase.split.first.gsub(/\w{1,2}-/, "").to_sym
|
17
17
|
end
|
18
18
|
|
19
|
+
def [](key)
|
20
|
+
self.send(key)
|
21
|
+
end
|
22
|
+
|
19
23
|
def []=(key, value)
|
20
|
-
self.send(key.to_s + "=", value)
|
24
|
+
self.send(key.to_s + "=", value)
|
25
|
+
end
|
26
|
+
|
27
|
+
def assign_value(symbolized_class, value)
|
28
|
+
return unless self.respond_to?(symbolized_class)
|
29
|
+
if FormatRules.can_have_many?(symbolized_class)
|
30
|
+
self[symbolized_class] ||= []
|
31
|
+
self[symbolized_class] << value
|
32
|
+
else
|
33
|
+
self[symbolized_class] = value
|
34
|
+
end
|
21
35
|
end
|
22
36
|
end
|
23
37
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module HentryConsumer
|
2
|
+
class FormatRules
|
3
|
+
REQUIRED = []
|
4
|
+
CAN_HAVE_MANY = [:url, :email, :author, :summary, :hcard]
|
5
|
+
class << self
|
6
|
+
def required?(format)
|
7
|
+
REQUIRED.include? format
|
8
|
+
end
|
9
|
+
def can_have_many?(format)
|
10
|
+
CAN_HAVE_MANY.include? format
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,5 +1,22 @@
|
|
1
1
|
module HentryConsumer
|
2
2
|
class HCard < Element
|
3
3
|
attr_accessor :name, :email, :url
|
4
|
+
alias_method :emails, :email
|
5
|
+
alias_method :urls, :url
|
6
|
+
|
7
|
+
|
8
|
+
def to_json(*a)
|
9
|
+
{:items =>
|
10
|
+
[{
|
11
|
+
:type => ["h-card"],
|
12
|
+
:properties => {
|
13
|
+
:name => self.name,
|
14
|
+
:email => self.email,
|
15
|
+
:url => self.url
|
16
|
+
}
|
17
|
+
}]
|
18
|
+
}.to_json(*a)
|
19
|
+
end
|
20
|
+
|
4
21
|
end
|
5
22
|
end
|
@@ -2,13 +2,8 @@ module HentryConsumer
|
|
2
2
|
class HEntry < Element
|
3
3
|
|
4
4
|
attr_accessor :name, :categories, :author, :content, :bookmark, :published_at, :summary
|
5
|
-
|
6
|
-
|
7
|
-
def initialize(microformat)
|
8
|
-
@categories = {}
|
9
|
-
super
|
10
|
-
end
|
11
|
-
|
5
|
+
alias_method :authors, :author
|
6
|
+
|
12
7
|
def parse_elements(microformat)
|
13
8
|
FormatClass.each do |letter|
|
14
9
|
microformat.css(">*[class*=#{letter}-]").each do |attrs|
|
@@ -18,14 +13,32 @@ module HentryConsumer
|
|
18
13
|
end
|
19
14
|
end
|
20
15
|
end
|
16
|
+
|
17
|
+
def to_json(*a)
|
18
|
+
{:items =>
|
19
|
+
[{
|
20
|
+
:type => ["h-entry"],
|
21
|
+
:properties => {
|
22
|
+
:name => self.name,
|
23
|
+
:categories => self.categories,
|
24
|
+
:author => self.author,
|
25
|
+
:content => self.content,
|
26
|
+
:bookmark => self.bookmark,
|
27
|
+
:published_at => self.published_at,
|
28
|
+
:summary => self.summary
|
29
|
+
}
|
30
|
+
}]
|
31
|
+
}.to_json(*a)
|
32
|
+
end
|
21
33
|
|
22
34
|
private
|
23
35
|
|
24
36
|
def parse_element(microformat, klass)
|
25
37
|
case klass
|
26
|
-
when '
|
27
|
-
self.
|
38
|
+
when 'p-author'
|
39
|
+
self.assign_value(symbolize_class(klass), HCard.new(microformat))
|
28
40
|
when 'p-category'
|
41
|
+
self.categories ||= {}
|
29
42
|
self.categories[microformat.text.gsub('\n', " ").strip] = microformat["href"]
|
30
43
|
when 'e-content'
|
31
44
|
self.content = parse_content(microformat)
|
@@ -34,7 +47,7 @@ module HentryConsumer
|
|
34
47
|
when "u-uid"
|
35
48
|
self.bookmark = microformat["href"]
|
36
49
|
else
|
37
|
-
self
|
50
|
+
self.assign_value(symbolize_class(klass), microformat.text.gsub('\n', " ").strip)
|
38
51
|
end
|
39
52
|
end
|
40
53
|
|
data/lib/hentry_consumer.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'hentry_consumer'
|
2
|
+
|
3
|
+
describe HentryConsumer::FormatRules do
|
4
|
+
before do
|
5
|
+
stub_const("HentryConsumer::FormatRules::REQUIRED", [:url])
|
6
|
+
stub_const("HentryConsumer::FormatRules::CAN_HAVE_MANY", [:url])
|
7
|
+
end
|
8
|
+
|
9
|
+
it "stubs correctly" do
|
10
|
+
HentryConsumer::FormatRules::REQUIRED.should include :url
|
11
|
+
end
|
12
|
+
|
13
|
+
it "is required" do
|
14
|
+
HentryConsumer::FormatRules.required?(:url).should be_true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "can have many" do
|
18
|
+
HentryConsumer::FormatRules.can_have_many?(:url).should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -1,12 +1,17 @@
|
|
1
1
|
require 'hentry_consumer'
|
2
2
|
|
3
3
|
describe HentryConsumer::HEntry do
|
4
|
+
before do
|
5
|
+
stub_const("HentryConsumer::FormatRules::REQUIRED", [:url, :email])
|
6
|
+
stub_const("HentryConsumer::FormatRules::CAN_HAVE_MANY", [:url, :email, :author])
|
7
|
+
end
|
8
|
+
|
4
9
|
let(:result) { HentryConsumer.parse(File.open("spec/support/example.html")) }
|
5
10
|
let(:entry) { result.entries.first }
|
6
|
-
subject { entry.
|
7
|
-
|
11
|
+
subject { entry.authors.first }
|
12
|
+
|
8
13
|
its(:name) { should eq "Jessica Suttles"}
|
9
|
-
|
10
|
-
its(:
|
11
|
-
|
14
|
+
|
15
|
+
its(:emails) { should have(1).things }
|
16
|
+
its(:urls) { should have(2).things }
|
12
17
|
end
|
@@ -13,7 +13,7 @@ describe HentryConsumer::HEntry do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "has a summary" do
|
16
|
-
entry.summary.should eq "Signed up with 3 locations"
|
16
|
+
entry.summary.first.should eq "Signed up with 3 locations"
|
17
17
|
end
|
18
18
|
|
19
19
|
it "has a time" do
|
@@ -24,8 +24,11 @@ describe HentryConsumer::HEntry do
|
|
24
24
|
entry.bookmark.should eq "http://g5.com/feed/entries/2012-08-26-20-09-0700"
|
25
25
|
end
|
26
26
|
|
27
|
+
it "should have 2 authors" do
|
28
|
+
entry.authors.should have(2).things HentryConsumer::HCard
|
29
|
+
end
|
27
30
|
it "has an author as an hcard" do
|
28
|
-
entry.
|
31
|
+
entry.authors.first.should be_an_instance_of HentryConsumer::HCard
|
29
32
|
end
|
30
33
|
|
31
34
|
describe "categories" do
|
@@ -54,5 +57,19 @@ describe HentryConsumer::HEntry do
|
|
54
57
|
end
|
55
58
|
|
56
59
|
end
|
60
|
+
|
61
|
+
describe "json" do
|
62
|
+
let(:json) { JSON.parse(entry.to_json) }
|
63
|
+
|
64
|
+
it { json["items"].should be_an_instance_of Array }
|
65
|
+
it { json["items"].first["type"].should include 'h-entry'}
|
66
|
+
it { json["items"].first["properties"]["name"].should eq 'Senior Cat Living'}
|
67
|
+
it { json["items"].first["properties"]["content"].should match /Locations/ }
|
68
|
+
it { json["items"].first["properties"]["author"].should be_an_instance_of Array }
|
69
|
+
it { json["items"].first["properties"]["author"].first["items"].first["type"].should include "h-card" }
|
70
|
+
it { json["items"].first["properties"]["bookmark"].should eq "http://g5.com/feed/entries/2012-08-26-20-09-0700" }
|
71
|
+
it { json["items"].first["properties"]["published_at"].should eq "2012-08-26 20:09-0700" }
|
72
|
+
it { json["items"].first["properties"]["summary"].should be_an_instance_of Array }
|
73
|
+
end
|
57
74
|
|
58
75
|
end
|
@@ -2,4 +2,14 @@ require 'hentry_consumer'
|
|
2
2
|
|
3
3
|
describe HentryConsumer::HFeed do
|
4
4
|
|
5
|
+
describe "to json" do
|
6
|
+
let(:feed) { HentryConsumer.parse(File.open("spec/support/example.html")) }
|
7
|
+
let(:json) { JSON.parse(feed.to_json) }
|
8
|
+
|
9
|
+
it { json["items"].first["type"].should include 'h-feed'}
|
10
|
+
it { json["items"].first["properties"]["entries"].should be_an_instance_of Array }
|
11
|
+
it { json["items"].first["properties"]["entries"].first["items"].should be_an_instance_of Array }
|
12
|
+
it { json["items"].first["properties"]["entries"].first["items"].first["type"].should include "h-entry" }
|
13
|
+
|
14
|
+
end
|
5
15
|
end
|
data/spec/support/example.html
CHANGED
@@ -20,7 +20,21 @@
|
|
20
20
|
<a class="u-url u-uid" href="http//g5.com/authors/jessica-suttles">
|
21
21
|
http//g5.com/authors/jessica-suttles
|
22
22
|
</a>
|
23
|
+
<a class="u-url u-uid" href="http//g5.com/authors/jessica-suttlez">
|
24
|
+
http//g5.com/authors/jessica-suttlez
|
25
|
+
</a>
|
26
|
+
|
27
|
+
</div>
|
28
|
+
<div class="p-author h-card">
|
29
|
+
<p class="p-name">Bookis Smuin</p>
|
30
|
+
<a class="u-email" href="mailto:bookis.smuin@getg5.com">
|
31
|
+
bookis.smuin@getg5.com
|
32
|
+
</a>
|
33
|
+
<a class="u-url u-uid" href="http//g5.com/authors/bookis-smuin">
|
34
|
+
http//g5.com/authors/bookis-smuin
|
35
|
+
</a>
|
23
36
|
</div>
|
37
|
+
|
24
38
|
<dl class="e-content">
|
25
39
|
<dt>Customer</dt>
|
26
40
|
<dd class="h-card">
|
metadata
CHANGED
@@ -1,39 +1,60 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: hentry_consumer
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 3
|
10
|
+
version: 0.1.3
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Bookis Smuin
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2012-10-15 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: nokogiri
|
16
|
-
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
24
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
22
32
|
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: json
|
23
36
|
prerelease: false
|
24
|
-
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
25
38
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
30
48
|
description: A hATOM feed parser
|
31
|
-
email:
|
49
|
+
email:
|
32
50
|
- vegan.bookis@gmail.com
|
33
51
|
executables: []
|
52
|
+
|
34
53
|
extensions: []
|
54
|
+
|
35
55
|
extra_rdoc_files: []
|
36
|
-
|
56
|
+
|
57
|
+
files:
|
37
58
|
- .gitignore
|
38
59
|
- Gemfile
|
39
60
|
- Guardfile
|
@@ -43,10 +64,12 @@ files:
|
|
43
64
|
- hentry_consumer.gemspec
|
44
65
|
- lib/hentry_consumer.rb
|
45
66
|
- lib/hentry_consumer/element.rb
|
67
|
+
- lib/hentry_consumer/format_rules.rb
|
46
68
|
- lib/hentry_consumer/h_card.rb
|
47
69
|
- lib/hentry_consumer/h_entry.rb
|
48
70
|
- lib/hentry_consumer/h_feed.rb
|
49
71
|
- lib/hentry_consumer/version.rb
|
72
|
+
- spec/lib/hentry_consumer/format_rules_spec.rb
|
50
73
|
- spec/lib/hentry_consumer/h_card_spec.rb
|
51
74
|
- spec/lib/hentry_consumer/h_entry_spec.rb
|
52
75
|
- spec/lib/hentry_consumer/h_feed_spec.rb
|
@@ -55,30 +78,39 @@ files:
|
|
55
78
|
- spec/support/example.html
|
56
79
|
homepage: https://github.com/G5/hentry_consumer
|
57
80
|
licenses: []
|
81
|
+
|
58
82
|
post_install_message:
|
59
83
|
rdoc_options: []
|
60
|
-
|
84
|
+
|
85
|
+
require_paths:
|
61
86
|
- lib
|
62
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
88
|
none: false
|
64
|
-
requirements:
|
65
|
-
- -
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
|
68
|
-
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
hash: 3
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
97
|
none: false
|
70
|
-
requirements:
|
71
|
-
- -
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
74
105
|
requirements: []
|
106
|
+
|
75
107
|
rubyforge_project:
|
76
108
|
rubygems_version: 1.8.24
|
77
109
|
signing_key:
|
78
110
|
specification_version: 3
|
79
|
-
summary: Takes in HTML containing an h-feed classed element and returns serialized
|
80
|
-
|
81
|
-
|
111
|
+
summary: Takes in HTML containing an h-feed classed element and returns serialized data based on the Microformat 2 hEntry specs
|
112
|
+
test_files:
|
113
|
+
- spec/lib/hentry_consumer/format_rules_spec.rb
|
82
114
|
- spec/lib/hentry_consumer/h_card_spec.rb
|
83
115
|
- spec/lib/hentry_consumer/h_entry_spec.rb
|
84
116
|
- spec/lib/hentry_consumer/h_feed_spec.rb
|