butter_sand 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.coveralls.yml +0 -0
- data/.travis.yml +9 -0
- data/Gemfile +2 -0
- data/README.md +6 -0
- data/lib/butter_sand/api/events.rb +20 -7
- data/lib/butter_sand/client.rb +1 -1
- data/lib/butter_sand/parser.rb +37 -22
- data/lib/butter_sand/version.rb +1 -1
- data/spec/butter_sand/api/events_spec.rb +58 -0
- data/spec/butter_sand/client_spec.rb +22 -10
- data/spec/butter_sand/parser_spec.rb +3 -5
- data/spec/spec_helper.rb +4 -1
- metadata +4 -2
data/.coveralls.yml
ADDED
File without changes
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# ButterSand
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/butter_sand.png)](https://rubygems.org/gems/butter_sand)
|
4
|
+
[![Build Status](https://travis-ci.org/shunsugai/butter_sand.png?branch=master)](https://travis-ci.org/shunsugai/butter_sand)
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/shunsugai/butter_sand/badge.png?branch=master)](https://coveralls.io/r/shunsugai/butter_sand?branch=master)
|
6
|
+
[![Code Climate](https://codeclimate.com/github/shunsugai/butter_sand.png)](https://codeclimate.com/github/shunsugai/butter_sand)
|
7
|
+
[![Dependency Status](https://gemnasium.com/shunsugai/butter_sand.png)](https://gemnasium.com/shunsugai/butter_sand)
|
8
|
+
|
3
9
|
六花亭さんの催事情報ページの内容を取得するためのRubyラッパーです
|
4
10
|
|
5
11
|
## インストール方法
|
@@ -7,26 +7,39 @@ module ButterSand
|
|
7
7
|
module Events
|
8
8
|
PATH_SAIJI = '/contents/shop/saiji/'
|
9
9
|
|
10
|
-
#
|
10
|
+
# Returns list of all event information listed on the page. When there is no event information to be held, returns empty array.
|
11
|
+
#
|
12
|
+
# @return [Array<ButterSand::Event>] event information listed on the page
|
11
13
|
def all
|
12
14
|
ButterSand::Parser.to_array(get(PATH_SAIJI)).map {|event| ButterSand::Event.new(event)}
|
13
15
|
end
|
14
16
|
|
17
|
+
# Returns list of event information being held. When there is no corresponding data, returns empty array.
|
18
|
+
#
|
19
|
+
# @return [Array<ButterSand::Event>] event information being held
|
15
20
|
def on_sale
|
16
|
-
all.select {|event| (event.starts..event.ends) === Date.today}
|
21
|
+
all.select {|event| (event.starts..event.ends) === (@date_for_test || Date.today)}
|
17
22
|
end
|
18
23
|
|
19
|
-
#
|
24
|
+
# Returns list of event information that starts today. When there is no corresponding data, returns empty array.
|
25
|
+
#
|
26
|
+
# @return [Array<ButterSand::Event>] event information that starts today
|
20
27
|
def starts_today
|
21
|
-
all.select {|event| event.starts == Date.today}
|
28
|
+
all.select {|event| event.starts == (@date_for_test || Date.today)}
|
22
29
|
end
|
23
30
|
|
24
|
-
#
|
31
|
+
# Returns list of event information that ends today. When there is no corresponding data, returns empty array.
|
32
|
+
#
|
33
|
+
# @return [Array<ButterSand::Event>] event information that ends today
|
25
34
|
def ends_today
|
26
|
-
all.select {|event| event.ends == Date.today}
|
35
|
+
all.select {|event| event.ends == (@date_for_test || Date.today)}
|
27
36
|
end
|
28
37
|
|
29
|
-
#
|
38
|
+
# Returns list of event information selected with given prefecture name. When there is no corresponding data, returns empty array.
|
39
|
+
#
|
40
|
+
# @raise [ArgumentError] Error raised when supplied prefecture name is not valid
|
41
|
+
# @param name [String] prefecture name
|
42
|
+
# @return [Array<ButterSand::Event>] event information selected with given prefecture name
|
30
43
|
def find_by_prefecture(name)
|
31
44
|
raise ArgumentError , 'Illegal argument' unless name.kind_of? String
|
32
45
|
all.select {|event| event.prefecture == name}
|
data/lib/butter_sand/client.rb
CHANGED
@@ -23,7 +23,7 @@ module ButterSand
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def connection
|
26
|
-
@connection ||= Faraday.new ROOT_URL, ssl
|
26
|
+
@connection ||= Faraday.new ROOT_URL, :ssl => {:verify => false} do |conn|
|
27
27
|
conn.use Faraday::Response::RaiseButterSandError
|
28
28
|
conn.use Faraday::Adapter::NetHttp
|
29
29
|
end
|
data/lib/butter_sand/parser.rb
CHANGED
@@ -6,34 +6,49 @@ require 'nokogiri'
|
|
6
6
|
module ButterSand
|
7
7
|
class Parser
|
8
8
|
class << self
|
9
|
+
|
10
|
+
KEY_DATE_INFO = 0
|
11
|
+
KEY_PREFECTURE = 1
|
12
|
+
KEY_SHOP_NAME = 2
|
13
|
+
KEY_PHONE_NUM = 3
|
14
|
+
|
15
|
+
KEY_DATE_STARTS = 0
|
16
|
+
KEY_DATE_ENDS = 1
|
17
|
+
|
9
18
|
# @return [Array<Hash>]
|
10
19
|
def to_array(body)
|
11
|
-
|
12
|
-
|
13
|
-
str_elems = elem.split(/\n\s+/)
|
14
|
-
|
15
|
-
next if str_elems.length < 4
|
16
|
-
next unless str_elems[3].strip.phone_number?
|
17
|
-
begin
|
18
|
-
dates = str_elems[0].date_to_ary
|
19
|
-
rescue ArgumentError => e
|
20
|
-
print e.message, "\n"
|
21
|
-
next
|
22
|
-
end
|
23
|
-
|
24
|
-
shops << {
|
25
|
-
shop: str_elems[2],
|
26
|
-
prefecture: str_elems[1],
|
27
|
-
phone: str_elems[3].strip,
|
28
|
-
starts: dates[0],
|
29
|
-
ends: dates[1]
|
30
|
-
}
|
31
|
-
end
|
32
|
-
shops
|
20
|
+
valid_infos = raw_events(Nokogiri::HTML(body)).select { |elem| is_valid_data? elem }
|
21
|
+
valid_infos.map { |elem| shop_data_hash(elem.split(/\n\s+/)) }
|
33
22
|
end
|
34
23
|
|
35
24
|
private
|
36
25
|
|
26
|
+
# @retrn [Hash]
|
27
|
+
def shop_data_hash(list)
|
28
|
+
dates = list[KEY_DATE_INFO].date_to_ary
|
29
|
+
{
|
30
|
+
:shop => list[KEY_SHOP_NAME],
|
31
|
+
:prefecture => list[KEY_PREFECTURE],
|
32
|
+
:phone => list[KEY_PHONE_NUM].strip,
|
33
|
+
:starts => dates[KEY_DATE_STARTS],
|
34
|
+
:ends => dates[KEY_DATE_ENDS]
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [Boolean]
|
39
|
+
def is_valid_data?(raw_data)
|
40
|
+
str_elems = raw_data.split(/\n\s+/)
|
41
|
+
return false if str_elems.length < 4
|
42
|
+
return false unless str_elems[KEY_PHONE_NUM].strip.phone_number?
|
43
|
+
begin
|
44
|
+
dates = str_elems[KEY_DATE_INFO].date_to_ary
|
45
|
+
rescue ArgumentError => e
|
46
|
+
print e.message, "\n"
|
47
|
+
return false
|
48
|
+
end
|
49
|
+
true
|
50
|
+
end
|
51
|
+
|
37
52
|
# @return [Array<String>]
|
38
53
|
def raw_events(body)
|
39
54
|
each_state = state_names.map {|state| body.css(state).map(&:text).remove_at(0)}
|
data/lib/butter_sand/version.rb
CHANGED
@@ -13,6 +13,64 @@ describe ButterSand::API::Events do
|
|
13
13
|
it { should have(5).items }
|
14
14
|
end
|
15
15
|
|
16
|
+
describe 'on_sale' do
|
17
|
+
before do
|
18
|
+
@butter_sand = ButterSand::Client.new
|
19
|
+
@butter_sand.instance_eval { @date_for_test = Date.parse('2013-03-14') }
|
20
|
+
end
|
21
|
+
|
22
|
+
subject { @butter_sand.on_sale }
|
23
|
+
it { should have(1).item }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'starts_today' do
|
27
|
+
before do
|
28
|
+
@butter_sand = ButterSand::Client.new
|
29
|
+
end
|
30
|
+
|
31
|
+
subject { @butter_sand.starts_today }
|
32
|
+
|
33
|
+
context 'with no corresponding event' do
|
34
|
+
before do
|
35
|
+
@butter_sand.instance_eval { @date_for_test = Date.parse('2012-12-31') }
|
36
|
+
end
|
37
|
+
|
38
|
+
it { should have(0).item }
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with some corresponding events' do
|
42
|
+
before do
|
43
|
+
@butter_sand.instance_eval { @date_for_test = Date.parse('2013-01-15') }
|
44
|
+
end
|
45
|
+
|
46
|
+
it { should have(1).item }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'ends_today' do
|
51
|
+
before do
|
52
|
+
@butter_sand = ButterSand::Client.new
|
53
|
+
end
|
54
|
+
|
55
|
+
subject { @butter_sand.ends_today }
|
56
|
+
|
57
|
+
context 'with no corresponding event' do
|
58
|
+
before do
|
59
|
+
@butter_sand.instance_eval { @date_for_test = Date.parse('2013-01-01') }
|
60
|
+
end
|
61
|
+
|
62
|
+
it { should have(0).item }
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with some corresponding events' do
|
66
|
+
before do
|
67
|
+
@butter_sand.instance_eval { @date_for_test = Date.parse('2013-02-28') }
|
68
|
+
end
|
69
|
+
|
70
|
+
it { should have(1).item }
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
16
74
|
describe 'find_by_prefecture' do
|
17
75
|
it 'should have an item' do
|
18
76
|
ButterSand.send(:find_by_prefecture, '東京').should have(1).item
|
@@ -6,12 +6,24 @@ describe ButterSand::Client do
|
|
6
6
|
|
7
7
|
describe 'get' do
|
8
8
|
context '400' do
|
9
|
-
|
10
|
-
|
9
|
+
context 'with no error message' do
|
10
|
+
before do
|
11
|
+
stub_request(:get, url).to_return(:status => 400, :body => {'error' => ''})
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should raise ButterSand::BadRequest' do
|
15
|
+
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::BadRequest, 'GET https://www.rokkatei-eshop.com/contents/shop/saiji/: 400'
|
16
|
+
end
|
11
17
|
end
|
12
18
|
|
13
|
-
|
14
|
-
|
19
|
+
context 'with error message' do
|
20
|
+
before do
|
21
|
+
stub_request(:get, url).to_return(:status => 400, :body => {'error' => 'BadRequest'})
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should raise ButterSand::BadRequest' do
|
25
|
+
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::BadRequest, 'BadRequest'
|
26
|
+
end
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
@@ -21,7 +33,7 @@ describe ButterSand::Client do
|
|
21
33
|
end
|
22
34
|
|
23
35
|
it 'should raise ButterSand::Unauthorized' do
|
24
|
-
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::Unauthorized
|
36
|
+
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::Unauthorized, 'Unauthorized'
|
25
37
|
end
|
26
38
|
end
|
27
39
|
|
@@ -31,7 +43,7 @@ describe ButterSand::Client do
|
|
31
43
|
end
|
32
44
|
|
33
45
|
it 'should raise ButterSand::Unauthorized' do
|
34
|
-
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::Forbidden
|
46
|
+
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::Forbidden, 'Forbidden'
|
35
47
|
end
|
36
48
|
end
|
37
49
|
|
@@ -41,7 +53,7 @@ describe ButterSand::Client do
|
|
41
53
|
end
|
42
54
|
|
43
55
|
it 'should raise ButterSand::NotFound' do
|
44
|
-
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::NotFound
|
56
|
+
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::NotFound, 'Not Found'
|
45
57
|
end
|
46
58
|
end
|
47
59
|
|
@@ -51,7 +63,7 @@ describe ButterSand::Client do
|
|
51
63
|
end
|
52
64
|
|
53
65
|
it 'should raise ButterSand::NotAcceptable' do
|
54
|
-
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::NotAcceptable
|
66
|
+
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::NotAcceptable, 'Not Acceptable'
|
55
67
|
end
|
56
68
|
end
|
57
69
|
|
@@ -61,7 +73,7 @@ describe ButterSand::Client do
|
|
61
73
|
end
|
62
74
|
|
63
75
|
it 'should raise ButterSand::InternalServerError' do
|
64
|
-
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::InternalServerError
|
76
|
+
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::InternalServerError, 'Internal Server Error'
|
65
77
|
end
|
66
78
|
end
|
67
79
|
|
@@ -71,7 +83,7 @@ describe ButterSand::Client do
|
|
71
83
|
end
|
72
84
|
|
73
85
|
it 'should raise ButterSand::ServiceUnavailable' do
|
74
|
-
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::ServiceUnavailable
|
86
|
+
lambda{ ButterSand.get(path_saiji) }.should raise_error ButterSand::ServiceUnavailable, 'Internal Server Error'
|
75
87
|
end
|
76
88
|
end
|
77
89
|
end
|
@@ -7,8 +7,7 @@ describe ButterSand::Parser do
|
|
7
7
|
|
8
8
|
context 'with some events' do
|
9
9
|
before do
|
10
|
-
stub_request(:get, 'https://www.rokkatei-eshop.com/contents/shop/saiji/')
|
11
|
-
.to_return(:status => 200, :body => fixture('marusei.html'))
|
10
|
+
stub_request(:get, 'https://www.rokkatei-eshop.com/contents/shop/saiji/').to_return(:status => 200, :body => fixture('marusei.html'))
|
12
11
|
@response = ButterSand.get(path_saiji)
|
13
12
|
@response_array = ButterSand::Parser.to_array(@response)
|
14
13
|
end
|
@@ -23,7 +22,7 @@ describe ButterSand::Parser do
|
|
23
22
|
end
|
24
23
|
|
25
24
|
it 'includes Hash' do
|
26
|
-
@response_array.
|
25
|
+
@response_array.first.should be_kind_of Hash
|
27
26
|
end
|
28
27
|
|
29
28
|
it "first item's shop name should be 'うすい百貨店'" do
|
@@ -50,8 +49,7 @@ describe ButterSand::Parser do
|
|
50
49
|
|
51
50
|
context 'with no event' do
|
52
51
|
before do
|
53
|
-
stub_request(:get, 'https://www.rokkatei-eshop.com/contents/shop/saiji/')
|
54
|
-
.to_return(:status => 200, :body => fixture('marusei_no_event.html'))
|
52
|
+
stub_request(:get, 'https://www.rokkatei-eshop.com/contents/shop/saiji/').to_return(:status => 200, :body => fixture('marusei_no_event.html'))
|
55
53
|
@response = ButterSand.get(path_saiji)
|
56
54
|
@response_array = ButterSand::Parser.to_array(@response)
|
57
55
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,6 +8,9 @@ require 'bundler/setup'
|
|
8
8
|
require 'butter_sand'
|
9
9
|
require 'faraday/response/raise_butter_sand_error'
|
10
10
|
require 'webmock/rspec'
|
11
|
+
require 'date'
|
12
|
+
require 'coveralls'
|
13
|
+
Coveralls.wear!
|
11
14
|
|
12
15
|
RSpec.configure do |config|
|
13
16
|
config.order = 'random'
|
@@ -19,4 +22,4 @@ end
|
|
19
22
|
|
20
23
|
def fixture(file)
|
21
24
|
File.new(fixture_path + '/' + file)
|
22
|
-
end
|
25
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: butter_sand
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-05-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -146,8 +146,10 @@ executables: []
|
|
146
146
|
extensions: []
|
147
147
|
extra_rdoc_files: []
|
148
148
|
files:
|
149
|
+
- .coveralls.yml
|
149
150
|
- .gitignore
|
150
151
|
- .rspec
|
152
|
+
- .travis.yml
|
151
153
|
- Gemfile
|
152
154
|
- LICENSE.txt
|
153
155
|
- README.md
|