consadole_aggregator 0.1.5 → 0.1.6
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/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
|