hyperfeed 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +23 -21
- data/Rakefile +16 -0
- data/hyperfeed.gemspec +6 -5
- data/lib/hyperfeed/resource_builder.rb +48 -47
- data/lib/hyperfeed/version.rb +1 -1
- data/lib/hyperfeed.rb +17 -25
- data/spec/fixtures/lst_mob.xml +8418 -0
- data/spec/hyperfeed/hyperfeed_spec.rb +82 -0
- data/spec/spec_helper.rb +17 -0
- metadata +41 -15
- data/lib/hyperfeed/discover.rb +0 -20
- data/lib/hyperfeed/middleware/adapter_middleware.rb +0 -22
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
An adapter to plug feeds content on hypermedia engines
|
4
4
|
|
5
|
+
THIS A PROOF OF CONCEPT, SO COWBOY MODE IS ON!
|
6
|
+
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
Add this line to your application's Gemfile:
|
@@ -21,23 +23,23 @@ Or install it yourself as:
|
|
21
23
|
|
22
24
|
``` ruby
|
23
25
|
#For content lists:
|
24
|
-
|
26
|
+
|
25
27
|
response = Hyperfeed::Client.at("http://contigo.abril.com.br/noticias.rss").get
|
26
28
|
puts response.hyperfeed.inspect
|
27
|
-
|
28
|
-
{:itens_por_pagina=>10,
|
29
|
-
:pagina_atual=>1,
|
30
|
-
:paginas_totais=>1,
|
31
|
-
:total_resultado=>10,
|
32
|
-
:resultado=>[{:id=>"http://contigo.abril.com.br/noticias.rss?resource_id=0",
|
33
|
-
:data=>"2013-04-04 12:38:00 -0300",
|
34
|
-
:titulo=>"Sabrina Sato, Rodrigo Faro e Thiago Martins se encontram em evento, em São Paulo",
|
35
|
-
:marca=>"Contigo",
|
36
|
-
:descricao=>"<p>\n\tUm time de estrelas se reuniu na ma...",
|
37
|
-
:tipo_recurso=>"feed", :link=>{:href=>"http://contigo.abril.com.br/noticias.rss?resource_id=0",
|
38
|
-
:rel=>"feed",
|
29
|
+
|
30
|
+
{:itens_por_pagina=>10,
|
31
|
+
:pagina_atual=>1,
|
32
|
+
:paginas_totais=>1,
|
33
|
+
:total_resultado=>10,
|
34
|
+
:resultado=>[{:id=>"http://contigo.abril.com.br/noticias.rss?resource_id=0",
|
35
|
+
:data=>"2013-04-04 12:38:00 -0300",
|
36
|
+
:titulo=>"Sabrina Sato, Rodrigo Faro e Thiago Martins se encontram em evento, em São Paulo",
|
37
|
+
:marca=>"Contigo",
|
38
|
+
:descricao=>"<p>\n\tUm time de estrelas se reuniu na ma...",
|
39
|
+
:tipo_recurso=>"feed", :link=>{:href=>"http://contigo.abril.com.br/noticias.rss?resource_id=0",
|
40
|
+
:rel=>"feed",
|
39
41
|
:type=>"application/json"}}]}
|
40
|
-
|
42
|
+
|
41
43
|
|
42
44
|
|
43
45
|
#For a content
|
@@ -45,13 +47,13 @@ Or install it yourself as:
|
|
45
47
|
response = Hyperfeed::Client.at("http://contigo.abril.com.br/noticias.rss?resource_id=7").get
|
46
48
|
puts response.hyperfeed.inspect
|
47
49
|
|
48
|
-
{:id=>"http://contigo.abril.com.br/noticias.rss?resource_id=7&resource_id=7",
|
49
|
-
:title=>"Ticiane Pinheiro vira boneca e mostra foto no Twitter",
|
50
|
-
:midia=>{:url=>"http://contigo.abril.com.br/resources/files/image/2013/4/132091110-ticiane-pinheiro-m.jpg?1365085327",
|
51
|
-
:type=>"image/jpeg"},
|
52
|
-
:data=>"2013-04-04 11:20:00 -0300",
|
53
|
-
:descricao=>"<p>\n\t<a href=\"/famosos/ticiane-pinheiro/apresentadora/\">Ticiane Pinheiro</a> ganhou um presente na man...",
|
54
|
-
:rel=>"materia",
|
50
|
+
{:id=>"http://contigo.abril.com.br/noticias.rss?resource_id=7&resource_id=7",
|
51
|
+
:title=>"Ticiane Pinheiro vira boneca e mostra foto no Twitter",
|
52
|
+
:midia=>{:url=>"http://contigo.abril.com.br/resources/files/image/2013/4/132091110-ticiane-pinheiro-m.jpg?1365085327",
|
53
|
+
:type=>"image/jpeg"},
|
54
|
+
:data=>"2013-04-04 11:20:00 -0300",
|
55
|
+
:descricao=>"<p>\n\t<a href=\"/famosos/ticiane-pinheiro/apresentadora/\">Ticiane Pinheiro</a> ganhou um presente na man...",
|
56
|
+
:rel=>"materia",
|
55
57
|
:type=>"text/html"}}
|
56
58
|
```
|
57
59
|
|
data/Rakefile
CHANGED
@@ -1 +1,17 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require 'rubygems'
|
1
3
|
require "bundler/gem_tasks"
|
4
|
+
require 'rake'
|
5
|
+
require 'rspec/core'
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
|
8
|
+
begin
|
9
|
+
require "bundler/gem_tasks"
|
10
|
+
require 'bundler/setup'
|
11
|
+
rescue LoadError => e
|
12
|
+
puts e
|
13
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
14
|
+
end
|
15
|
+
|
16
|
+
task :default => :spec
|
17
|
+
RSpec::Core::RakeTask.new(:spec)
|
data/hyperfeed.gemspec
CHANGED
@@ -10,16 +10,17 @@ Gem::Specification.new do |gem|
|
|
10
10
|
gem.email = ["guilherme.kato@abril.com.br"]
|
11
11
|
gem.description = %q{An adapter to plug feeds content on hypermedia engines}
|
12
12
|
gem.summary = %q{An adapter to plug feeds content on hypermedia engines}
|
13
|
-
gem.homepage = ""
|
13
|
+
gem.homepage = "https://github.com/gkato/hyperfeed"
|
14
14
|
|
15
15
|
gem.files = `git ls-files`.split($/)
|
16
16
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
|
-
gem.add_dependency "http_monkey"
|
21
|
-
gem.add_dependency "nokogiri"
|
22
|
-
gem.
|
20
|
+
gem.add_dependency "http_monkey", "~> 0.0"
|
21
|
+
gem.add_dependency "nokogiri", "~> 1.5"
|
22
|
+
gem.add_dependency 'methodize'
|
23
23
|
|
24
|
+
gem.add_development_dependency 'rspec'
|
25
|
+
gem.add_development_dependency 'fakeweb'
|
24
26
|
end
|
25
|
-
|
@@ -1,67 +1,68 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
|
1
3
|
module Hyperfeed
|
2
4
|
module ResourceBuilder
|
3
5
|
|
4
|
-
def get_resource(
|
5
|
-
item =
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
6
|
+
def get_resource(feed, id)
|
7
|
+
item = feed.content.xpath("//item").find { |i| generate_id(i) == id }
|
8
|
+
|
9
|
+
resource = {:id => id}
|
10
|
+
item.children.reject{ |x| x.name == "text" }.each do |node|
|
11
|
+
if node.name == "enclosure"
|
12
|
+
resource[:enclosure] ||= []
|
13
|
+
resource[:enclosure] << get_media(node)
|
14
|
+
else
|
15
|
+
resource[node.name.downcase.to_sym] = node.inner_text.strip
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
resource.extend(Methodize)
|
18
20
|
end
|
19
21
|
|
20
22
|
def get_media(item)
|
21
|
-
media =
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
media = {
|
24
|
+
:url => item.attr("url").strip,
|
25
|
+
:type => item.attr("type").strip,
|
26
|
+
}
|
27
|
+
item.children.reject{ |x| x.name == "text" }.each do |node|
|
28
|
+
media[node.name.to_sym] = node.inner_text.strip
|
27
29
|
end
|
30
|
+
media
|
28
31
|
end
|
29
32
|
|
30
|
-
def retrieve_resources_list(
|
31
|
-
total =
|
32
|
-
per_page = options[:per_page] || 10
|
33
|
-
page = options[:page] || 1
|
34
|
-
results = build_results(rss, url)
|
33
|
+
def retrieve_resources_list(feed, options={})
|
34
|
+
total = feed.content.xpath("//item").size
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
36
|
+
per_page = (options[:per_page] || 10).to_i
|
37
|
+
page = (options[:page] || 1).to_i
|
38
|
+
|
39
|
+
results = build_results(feed).each_slice(per_page).to_a
|
40
|
+
|
41
|
+
total_pages = results.size
|
42
|
+
results = results[page-1]
|
43
|
+
|
44
|
+
resource = {:per_page => per_page,
|
45
|
+
:current_page => page,
|
46
|
+
:total_pages => total_pages,
|
47
|
+
:total_results => total,
|
48
|
+
:result => results
|
49
|
+
}.extend(Methodize)
|
42
50
|
end
|
43
51
|
|
44
|
-
def generate_id(
|
45
|
-
|
46
|
-
|
52
|
+
def generate_id(item)
|
53
|
+
link = (item.xpath("link") || item.xpath("guid")).inner_text
|
54
|
+
Digest::MD5.hexdigest(link)
|
47
55
|
end
|
48
56
|
|
49
|
-
def build_results(
|
57
|
+
def build_results(feed)
|
50
58
|
results = []
|
51
|
-
|
52
|
-
id = generate_id(
|
59
|
+
feed.content.xpath("//item").each do |item|
|
60
|
+
id = generate_id(item)
|
53
61
|
results << {
|
54
62
|
:id => id,
|
55
|
-
:
|
56
|
-
:
|
57
|
-
:
|
58
|
-
:descricao => item.xpath("description").inner_text.strip,
|
59
|
-
:tipo_recurso => "feed",
|
60
|
-
:link => {
|
61
|
-
:href => id,
|
62
|
-
:rel => "feed",
|
63
|
-
:type => "application/json"
|
64
|
-
}
|
63
|
+
:pubdate => (item.xpath("pubDate").inner_text rescue ""),
|
64
|
+
:title => (item.xpath("title").inner_text.strip rescue ""),
|
65
|
+
:source => (item.xpath("source").inner_text rescue "")
|
65
66
|
}
|
66
67
|
end
|
67
68
|
results
|
data/lib/hyperfeed/version.rb
CHANGED
data/lib/hyperfeed.rb
CHANGED
@@ -1,38 +1,30 @@
|
|
1
1
|
require "hyperfeed/version"
|
2
2
|
require "http_monkey"
|
3
3
|
require "nokogiri"
|
4
|
-
require "json"
|
5
|
-
|
6
|
-
require "ruby-debug"
|
7
4
|
|
8
5
|
require "hyperfeed/resource_builder"
|
9
|
-
require "
|
10
|
-
require
|
11
|
-
|
12
|
-
class HttpMonkey::Client::Response
|
13
|
-
attr_accessor :hyperfeed
|
6
|
+
require "ostruct"
|
7
|
+
require 'methodize'
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
@@injections[attribute] = value
|
18
|
-
end
|
9
|
+
class Hyperfeed::Client
|
10
|
+
include Hyperfeed::ResourceBuilder
|
19
11
|
|
20
|
-
def initialize(
|
21
|
-
|
22
|
-
self.headers = HttpObjects::HeadersHash.new(headers)
|
23
|
-
after_initialize
|
24
|
-
end
|
12
|
+
def initialize(url, options)
|
13
|
+
@options = options
|
25
14
|
|
26
|
-
|
15
|
+
response = HttpMonkey.at(url).get
|
16
|
+
raise "Error: #{response.code} - #{response.body}" unless response.code == 200
|
27
17
|
|
28
|
-
|
29
|
-
|
30
|
-
send("#{attribute}=", value)
|
31
|
-
end
|
18
|
+
content = Nokogiri::XML(response.body)
|
19
|
+
@feed = OpenStruct.new(:url => url, :content => content)
|
32
20
|
end
|
33
21
|
|
34
|
-
|
22
|
+
def self.at(url, options = {})
|
23
|
+
new(url, options)
|
24
|
+
end
|
35
25
|
|
36
|
-
|
37
|
-
|
26
|
+
def get(id = nil)
|
27
|
+
return retrieve_resources_list(@feed, @options) unless id
|
28
|
+
get_resource(@feed, id)
|
29
|
+
end
|
38
30
|
end
|