consadole_aggregator 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +10 -10
- data/VERSION +1 -1
- data/consadole_aggregator.gemspec +4 -11
- data/lib/consadole_aggregator/aggregatable.rb +61 -0
- data/lib/consadole_aggregator/live.rb +22 -13
- data/lib/consadole_aggregator/news.rb +6 -73
- data/lib/consadole_aggregator.rb +1 -0
- data/spec/consadole_aggregator/live_spec.rb +21 -15
- data/spec/consadole_aggregator/news_spec.rb +12 -9
- data/spec/ext/consadolenews.txt +446 -251
- data/spec/ext/consadolephotos.txt +554 -5
- metadata +76 -85
- data/spec/ext/consadolesponsornews.txt +0 -229
data/Gemfile.lock
CHANGED
@@ -3,23 +3,23 @@ GEM
|
|
3
3
|
specs:
|
4
4
|
diff-lcs (1.1.2)
|
5
5
|
git (1.2.5)
|
6
|
-
jeweler (1.
|
7
|
-
bundler (~> 1.0
|
6
|
+
jeweler (1.6.2)
|
7
|
+
bundler (~> 1.0)
|
8
8
|
git (>= 1.2.5)
|
9
9
|
rake
|
10
10
|
json (1.5.1)
|
11
11
|
nokogiri (1.4.4)
|
12
12
|
oauth (0.4.4)
|
13
|
-
rake (0.
|
13
|
+
rake (0.9.1)
|
14
14
|
rcov (0.9.9)
|
15
|
-
rspec (2.
|
16
|
-
rspec-core (~> 2.
|
17
|
-
rspec-expectations (~> 2.
|
18
|
-
rspec-mocks (~> 2.
|
19
|
-
rspec-core (2.
|
20
|
-
rspec-expectations (2.
|
15
|
+
rspec (2.6.0)
|
16
|
+
rspec-core (~> 2.6.0)
|
17
|
+
rspec-expectations (~> 2.6.0)
|
18
|
+
rspec-mocks (~> 2.6.0)
|
19
|
+
rspec-core (2.6.3)
|
20
|
+
rspec-expectations (2.6.0)
|
21
21
|
diff-lcs (~> 1.1.2)
|
22
|
-
rspec-mocks (2.
|
22
|
+
rspec-mocks (2.6.0)
|
23
23
|
rubytter (1.4.2)
|
24
24
|
json (>= 1.1.3)
|
25
25
|
oauth (>= 0.3.6)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{consadole_aggregator}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["niku"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-06-09}
|
13
13
|
s.default_executable = %q{consadole_aggregator}
|
14
14
|
s.description = %q{ It aggregates infomation of 'Consadole Sapporo' }
|
15
15
|
s.email = %q{niku@niku.name}
|
@@ -32,6 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
"consadole_aggregator.gemspec",
|
33
33
|
"db/.gitignore",
|
34
34
|
"lib/consadole_aggregator.rb",
|
35
|
+
"lib/consadole_aggregator/aggregatable.rb",
|
35
36
|
"lib/consadole_aggregator/helper.rb",
|
36
37
|
"lib/consadole_aggregator/live.rb",
|
37
38
|
"lib/consadole_aggregator/live/timeline.rb",
|
@@ -46,7 +47,6 @@ Gem::Specification.new do |s|
|
|
46
47
|
"spec/ext/consaclub.txt",
|
47
48
|
"spec/ext/consadolenews.txt",
|
48
49
|
"spec/ext/consadolephotos.txt",
|
49
|
-
"spec/ext/consadolesponsornews.txt",
|
50
50
|
"spec/ext/forzaconsadole.txt",
|
51
51
|
"spec/ext/hochiyomiuri.txt",
|
52
52
|
"spec/ext/jsgoalnews.txt",
|
@@ -179,15 +179,8 @@ Gem::Specification.new do |s|
|
|
179
179
|
s.homepage = %q{http://github.com/niku/consadole_aggregator}
|
180
180
|
s.licenses = ["MIT"]
|
181
181
|
s.require_paths = ["lib"]
|
182
|
-
s.rubygems_version = %q{1.
|
182
|
+
s.rubygems_version = %q{1.6.2}
|
183
183
|
s.summary = %q{It aggregates infomation of 'Consadole Sapporo'}
|
184
|
-
s.test_files = [
|
185
|
-
"spec/consadole_aggregator/helper_spec.rb",
|
186
|
-
"spec/consadole_aggregator/live/timeline_spec.rb",
|
187
|
-
"spec/consadole_aggregator/live_spec.rb",
|
188
|
-
"spec/consadole_aggregator/news_spec.rb",
|
189
|
-
"spec/spec_helper.rb"
|
190
|
-
]
|
191
184
|
|
192
185
|
if s.respond_to? :specification_version then
|
193
186
|
s.specification_version = 3
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module ConsadoleAggregator
|
5
|
+
module Aggregatable
|
6
|
+
def initialize logger=nil
|
7
|
+
@logger = logger || Logger.new(nil)
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_new_articles
|
11
|
+
get_resource = self.class.get_resource
|
12
|
+
parse_list = self.class.parse_list
|
13
|
+
parse_article = self.class.parse_article
|
14
|
+
raise NotImplementedError unless get_resource && parse_list && parse_article
|
15
|
+
list_url = get_resource.call
|
16
|
+
article_urls = parse_list.call(list_url)
|
17
|
+
article_urls.each_with_object([]) do |article_url, memo|
|
18
|
+
article = parse_article.call(article_url)
|
19
|
+
memo.push(article) if article && !get_strage.include?(article)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
@logger.info('begin of update')
|
25
|
+
get_new_articles.each do |article|
|
26
|
+
begin
|
27
|
+
yield article if block_given?
|
28
|
+
@strage << article
|
29
|
+
rescue
|
30
|
+
@logger.error $!
|
31
|
+
end
|
32
|
+
end
|
33
|
+
save_strage
|
34
|
+
@logger.info('end of update')
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_strage
|
38
|
+
@strage ||= YAML.load_file(build_strage_path) || [] # fix when YAML.load_file is nil
|
39
|
+
rescue
|
40
|
+
@strage = []
|
41
|
+
end
|
42
|
+
|
43
|
+
def save_strage
|
44
|
+
YAML.dump(@strage, File.new(build_strage_path, 'w'))
|
45
|
+
end
|
46
|
+
|
47
|
+
def build_strage_path
|
48
|
+
class_name = /([^:]+)$/.match(self.class.to_s)[1]
|
49
|
+
File.expand_path(File.dirname(__FILE__) + "/../../db/#{class_name}.yaml")
|
50
|
+
end
|
51
|
+
|
52
|
+
# define class method's
|
53
|
+
def self.included(mod)
|
54
|
+
mod.extend ClassMethods
|
55
|
+
end
|
56
|
+
|
57
|
+
module ClassMethods
|
58
|
+
attr_accessor :get_resource, :parse_list, :parse_article
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -8,25 +8,13 @@ require_relative 'live/timeline.rb'
|
|
8
8
|
|
9
9
|
module ConsadoleAggregator
|
10
10
|
module Live
|
11
|
-
BASE_URI = URI.parse('http://www.consadole-sapporo.jp/view/s674.html')
|
12
11
|
|
13
12
|
def self.reserve reservation_time=nil, opt ={}
|
14
13
|
Live.new(reservation_time, opt)
|
15
14
|
end
|
16
15
|
|
17
|
-
def self.get_resource
|
18
|
-
Net::HTTP.get(BASE_URI).toutf8
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.parse
|
22
|
-
doc = Nokogiri::HTML.parse(get_resource)
|
23
|
-
doc.search('hr + p').last.inner_html.split(/<br>|\n/).reverse.each_with_object([]) do |line, memo|
|
24
|
-
timeline = Timeline.parse line
|
25
|
-
memo << timeline if timeline
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
16
|
class Live
|
17
|
+
include Aggregatable
|
30
18
|
attr_reader :reservation_time, :posted, :times, :wait_sec
|
31
19
|
|
32
20
|
def initialize reservation_time=nil, opt ={}
|
@@ -70,6 +58,27 @@ module ConsadoleAggregator
|
|
70
58
|
end
|
71
59
|
end
|
72
60
|
|
61
|
+
def self.get_resource
|
62
|
+
->{ Net::HTTP.get(URI.parse('http://www.consadole-sapporo.jp/view/s674.html')).toutf8 }
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.parse_list
|
66
|
+
->(list){
|
67
|
+
live_block = Nokogiri::HTML::parse(list)
|
68
|
+
.search("hr + p")
|
69
|
+
.last
|
70
|
+
.inner_html
|
71
|
+
lines = live_block
|
72
|
+
.split(/<br>|\n/)
|
73
|
+
.delete_if{ |line| line.empty? || line =~ /<前|後半>/ }
|
74
|
+
lines.map{ |line| line.sub(/ +$/, "") }.reverse
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.parse_article
|
79
|
+
->(article){ Timeline.parse article }
|
80
|
+
end
|
81
|
+
|
73
82
|
private
|
74
83
|
def be_daemonize
|
75
84
|
Process.daemon
|
@@ -4,67 +4,9 @@ require 'rss'
|
|
4
4
|
require 'uri'
|
5
5
|
require 'kconv'
|
6
6
|
require 'net/http'
|
7
|
-
require 'yaml'
|
8
7
|
require 'nokogiri'
|
9
8
|
|
10
9
|
module ConsadoleAggregator
|
11
|
-
module Aggregatable
|
12
|
-
def initialize logger=nil
|
13
|
-
@logger = logger || Logger.new(nil)
|
14
|
-
end
|
15
|
-
|
16
|
-
def get_new_articles
|
17
|
-
get_resource = self.class.get_resource
|
18
|
-
parse_list = self.class.parse_list
|
19
|
-
parse_article = self.class.parse_article
|
20
|
-
raise NotImplementedError unless get_resource && parse_list && parse_article
|
21
|
-
list_url = get_resource.call
|
22
|
-
article_urls = parse_list.call(list_url)
|
23
|
-
article_urls.each_with_object([]) do |article_url, memo|
|
24
|
-
article = parse_article.call(article_url)
|
25
|
-
memo.push(article) if article && !get_strage.include?(article)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def update
|
30
|
-
@logger.info('begin of update')
|
31
|
-
get_new_articles.each do |article|
|
32
|
-
begin
|
33
|
-
yield article if block_given?
|
34
|
-
@strage << article
|
35
|
-
rescue
|
36
|
-
@logger.error $!
|
37
|
-
end
|
38
|
-
end
|
39
|
-
save_strage
|
40
|
-
@logger.info('end of update')
|
41
|
-
end
|
42
|
-
|
43
|
-
def get_strage
|
44
|
-
@strage ||= YAML.load_file(build_strage_path) || [] # fix when YAML.load_file is nil
|
45
|
-
rescue
|
46
|
-
@strage = []
|
47
|
-
end
|
48
|
-
|
49
|
-
def save_strage
|
50
|
-
YAML.dump(@strage, File.new(build_strage_path, 'w'))
|
51
|
-
end
|
52
|
-
|
53
|
-
def build_strage_path
|
54
|
-
class_name = /([^:]+)$/.match(self.class.to_s)[1]
|
55
|
-
File.expand_path(File.dirname(__FILE__) + "/../../db/#{class_name}.yaml")
|
56
|
-
end
|
57
|
-
|
58
|
-
# define class method's
|
59
|
-
def self.included(mod)
|
60
|
-
mod.extend ClassMethods
|
61
|
-
end
|
62
|
-
|
63
|
-
module ClassMethods
|
64
|
-
attr_accessor :get_resource, :parse_list, :parse_article
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
10
|
module News
|
69
11
|
def self.get_resource(url_path)
|
70
12
|
Net::HTTP.get(URI.parse(url_path)).toutf8
|
@@ -120,24 +62,15 @@ module ConsadoleAggregator
|
|
120
62
|
],
|
121
63
|
Consadolenews:
|
122
64
|
[
|
123
|
-
->{ get_resource('http://www.consadole-sapporo.jp/news/
|
124
|
-
->(list){
|
125
|
-
->(article){
|
126
|
-
],
|
127
|
-
Consadolesponsornews:
|
128
|
-
[
|
129
|
-
->{ get_resource('http://www.consadole-sapporo.jp/snews/diary.cgi') },
|
130
|
-
->(list){ Nokogiri::HTML(list).search('table.frametable > tr a').reverse },
|
131
|
-
->(article){ { url:article['href'], title:article.text } }
|
65
|
+
->{ get_resource('http://www.consadole-sapporo.jp/news/atom.xml') },
|
66
|
+
->(list){ RSS::Parser.parse(list, false).items.map{ |e| { url:e.link, title:e.title } }.reverse },
|
67
|
+
->(article){ article }
|
132
68
|
],
|
133
69
|
Consadolephotos:
|
134
70
|
[
|
135
|
-
->{ get_resource('http://www.consadole-sapporo.jp/
|
136
|
-
->(list){ list.
|
137
|
-
->(article){
|
138
|
-
photo = article.match(/^&?text(?<number>\d\d)=(?<title>.+)/)
|
139
|
-
{ url:"http://www.consadole-sapporo.jp/img/#{photo[:number]}.jpg", title:photo[:title] }
|
140
|
-
}
|
71
|
+
->{ get_resource('http://www.consadole-sapporo.jp/') },
|
72
|
+
->(list){ Nokogiri::HTML(list).search('div.anythingSlider img').reverse },
|
73
|
+
->(article){ { url:article['src'], title:article['alt'] } }
|
141
74
|
],
|
142
75
|
Jsgoalnews:
|
143
76
|
[
|
data/lib/consadole_aggregator.rb
CHANGED
@@ -7,37 +7,43 @@ describe ConsadoleAggregator do
|
|
7
7
|
describe Live do
|
8
8
|
describe '.get_resource' do
|
9
9
|
it 'should exec Net::HTTP.get with Live::BASE_URI' do
|
10
|
-
Net::HTTP.should_receive(:get)
|
11
|
-
|
10
|
+
Net::HTTP.should_receive(:get)
|
11
|
+
.with(URI.parse('http://www.consadole-sapporo.jp/view/s674.html'))
|
12
|
+
.and_return(File.read(File.dirname(__FILE__) + '/../ext/live/s674.html'))
|
13
|
+
Live::Live.get_resource.call
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
|
-
describe '.
|
17
|
+
describe '.parse_list' do
|
16
18
|
context 'when start of game' do
|
17
|
-
|
18
|
-
|
19
|
+
let(:resource){ File.read(File.dirname(__FILE__) + '/../ext/live/s674.html').toutf8 }
|
20
|
+
let(:parsed_list){ Live::Live.parse_list.call(resource) }
|
21
|
+
subject{ parsed_list }
|
19
22
|
it{ should have(3).items }
|
20
23
|
end
|
21
24
|
context 'when end of game' do
|
22
|
-
|
25
|
+
let(:resource){ File.read(File.dirname(__FILE__) + '/../ext/live/s674.html.120').toutf8 }
|
26
|
+
let(:parsed_list){ Live::Live.parse_list.call(resource) }
|
23
27
|
describe 'first TimeLine' do
|
24
|
-
subject{
|
25
|
-
|
26
|
-
its(:post){ should == '札幌ボールでキックオフ' }
|
28
|
+
subject{ parsed_list.first }
|
29
|
+
it{ should == '試合開始 札幌ボールでキックオフ' }
|
27
30
|
end
|
28
31
|
describe 'second TimeLine' do
|
29
|
-
subject{
|
30
|
-
|
31
|
-
its(:post){ should == '右サイドからボールをつながれ攻撃を仕掛けられるが札幌DFが落ち着いてクリア' }
|
32
|
+
subject{ parsed_list[1] }
|
33
|
+
it{ should == '1分 右サイドからボールをつながれ攻撃を仕掛けられるが札幌DFが落ち着いてクリア' }
|
32
34
|
end
|
33
35
|
describe 'last TimeLine' do
|
34
|
-
subject{
|
35
|
-
|
36
|
-
its(:post){ should == 'ロスタイムも余裕のプレーで相手の攻撃を許さず、3試合連続完封で3連勝を飾る' }
|
36
|
+
subject{ parsed_list.last }
|
37
|
+
it{ should == '試合終了 ロスタイムも余裕のプレーで相手の攻撃を許さず、3試合連続完封で3連勝を飾る' }
|
37
38
|
end
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
42
|
+
describe '.parse_article' do
|
43
|
+
let(:article){ '1分 右サイドからボールをつながれ攻撃を仕掛けられるが札幌DFが落ち着いてクリア' }
|
44
|
+
it{ Live::Live.parse_article.call(article) }
|
45
|
+
end
|
46
|
+
|
41
47
|
describe '.reserve' do
|
42
48
|
context 'given Time' do
|
43
49
|
it 'give constructor with Time ' do
|
@@ -103,8 +103,6 @@ describe ConsadoleAggregator do
|
|
103
103
|
->{ File.read('./spec/ext/consaclub.txt').toutf8 }
|
104
104
|
ConsadoleAggregator::News::Consadolenews.get_resource =
|
105
105
|
->{ File.read('./spec/ext/consadolenews.txt').toutf8 }
|
106
|
-
ConsadoleAggregator::News::Consadolesponsornews.get_resource =
|
107
|
-
->{ File.read('./spec/ext/consadolesponsornews.txt').toutf8 }
|
108
106
|
ConsadoleAggregator::News::Consadolephotos.get_resource =
|
109
107
|
->{ File.read('./spec/ext/consadolephotos.txt').toutf8 }
|
110
108
|
ConsadoleAggregator::News::Jsgoalnews.get_resource =
|
@@ -137,14 +135,19 @@ describe ConsadoleAggregator do
|
|
137
135
|
it 'Consaclub should not raise Exception' do
|
138
136
|
expect{ ConsadoleAggregator::News::Consaclub.new.get_new_articles }.to_not raise_error
|
139
137
|
end
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
138
|
+
describe ConsadoleAggregator::News::Consadolenews do
|
139
|
+
subject{ ConsadoleAggregator::News::Consadolenews.new }
|
140
|
+
it 'Consadolenews should not raise Exception' do
|
141
|
+
expect{ subject.get_new_articles }.to_not raise_error
|
142
|
+
end
|
143
|
+
it{ subject.get_new_articles.should have_at_least(1).items }
|
145
144
|
end
|
146
|
-
|
147
|
-
|
145
|
+
describe ConsadoleAggregator::News::Consadolephotos do
|
146
|
+
subject{ ConsadoleAggregator::News::Consadolephotos.new }
|
147
|
+
it 'Consadolephotos should not raise Exception' do
|
148
|
+
expect{ subject.get_new_articles }.to_not raise_error
|
149
|
+
end
|
150
|
+
it{ subject.get_new_articles.should have_at_least(1).items }
|
148
151
|
end
|
149
152
|
it 'Jsgoalnews should not raise Exception' do
|
150
153
|
expect{ ConsadoleAggregator::News::Jsgoalnews.new.get_new_articles }.to_not raise_error
|