butter_sand 0.0.2 → 0.0.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/.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
|
+
[](https://rubygems.org/gems/butter_sand)
|
4
|
+
[](https://travis-ci.org/shunsugai/butter_sand)
|
5
|
+
[](https://coveralls.io/r/shunsugai/butter_sand?branch=master)
|
6
|
+
[](https://codeclimate.com/github/shunsugai/butter_sand)
|
7
|
+
[](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
|