kisyo 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kisyo.rb +1 -0
- data/lib/kisyo/cache.rb +28 -0
- data/lib/kisyo/daily.rb +21 -7
- data/lib/kisyo/version.rb +1 -1
- data/spec/kisyo/daily_spec.rb +62 -37
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8a99f62b8535e4a98f5852dfe53fafa38452f83
|
4
|
+
data.tar.gz: 99a1477bb5740fcda0fea9b75b0434491ce70933
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8c8bb2db8af4f8950f4fb9c173df90b63d35bf931dc505e45aaa0eeba91bdc71e5805500ac64032f6e1c3f7519cfdd989e4455eedb7622563c7c8d482c73744
|
7
|
+
data.tar.gz: 8a8e10cc74bd021ef9dc5921f8163447233d19f0e009a0ee91590ea5c92388a19432b0d55344aa0e5bc0f1532cb0b83bcdaab5a91ce5b92e8a746d90c048f2ed
|
data/lib/kisyo.rb
CHANGED
data/lib/kisyo/cache.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Kisyo
|
2
|
+
class Cache
|
3
|
+
CACHE_SIZE = 100
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@keys = []
|
7
|
+
@values = {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(key)
|
11
|
+
values[key]
|
12
|
+
end
|
13
|
+
|
14
|
+
def set(key, value)
|
15
|
+
keys << key
|
16
|
+
values[key] = value
|
17
|
+
|
18
|
+
if keys.size > CACHE_SIZE
|
19
|
+
oldest_key = keys.shift
|
20
|
+
values.delete(oldest_key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
attr_reader :keys, :values
|
27
|
+
end
|
28
|
+
end
|
data/lib/kisyo/daily.rb
CHANGED
@@ -3,14 +3,23 @@ require 'open-uri'
|
|
3
3
|
|
4
4
|
module Kisyo
|
5
5
|
class Daily
|
6
|
+
CACHE_SIZE = 100
|
7
|
+
|
6
8
|
def initialize(location)
|
7
9
|
@location = location
|
10
|
+
@cache = Cache.new
|
8
11
|
end
|
9
12
|
|
10
13
|
def at(date)
|
14
|
+
key = [date.year, date.month, date.day].join(',')
|
15
|
+
|
16
|
+
if value = cache.get(key)
|
17
|
+
return value
|
18
|
+
end
|
19
|
+
|
11
20
|
url = 'http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=%i&block_no=%i&year=%i&month=%i&day=01&view=p1' % [
|
12
|
-
|
13
|
-
|
21
|
+
location.prefecture_id,
|
22
|
+
location.block_id,
|
14
23
|
date.year,
|
15
24
|
date.month
|
16
25
|
]
|
@@ -22,13 +31,18 @@ module Kisyo
|
|
22
31
|
raise WeatherInformationNotAvailable if days.size == 0
|
23
32
|
|
24
33
|
days.each do |el|
|
25
|
-
|
26
|
-
|
27
|
-
values = tr.css('td').map(&:text)
|
34
|
+
tr = el.parent.parent
|
35
|
+
values = tr.css('td').map(&:text)
|
28
36
|
|
29
|
-
|
30
|
-
|
37
|
+
k = [date.year, date.month, values[0]].join(',')
|
38
|
+
cache.set(k, Element::Day.new(*values[1 .. -1]))
|
31
39
|
end
|
40
|
+
|
41
|
+
cache.get(key)
|
32
42
|
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
attr_reader :cache, :location
|
33
47
|
end
|
34
48
|
end
|
data/lib/kisyo/version.rb
CHANGED
data/spec/kisyo/daily_spec.rb
CHANGED
@@ -23,52 +23,77 @@ describe Kisyo::Daily do
|
|
23
23
|
'201611.html'
|
24
24
|
}
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
context 'single request' do
|
27
|
+
before do
|
28
|
+
stub_request(:get, url).
|
29
|
+
to_return(:body => read_fixture_file(fixture_file_name))
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'information is available' do
|
33
|
+
it 'returns weather information for given day' do
|
34
|
+
info = daily.at(date)
|
30
35
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
expect(info.day_length).to eql(0.0)
|
44
|
-
expect(info.general_weather_condition_day).to eql('曇後時々雨')
|
45
|
-
expect(info.general_weather_condition_night).to eql('雨時々曇')
|
36
|
+
expect(info.precipitation_total).to eql(1.5)
|
37
|
+
expect(info.precipitation_hourly_max).to eql(1.0)
|
38
|
+
expect(info.precipitation_10min_max).to eql(0.5)
|
39
|
+
expect(info.temperature_avg).to eql(10.9)
|
40
|
+
expect(info.temperature_max).to eql(12.2)
|
41
|
+
expect(info.temperature_min).to eql(8.6)
|
42
|
+
expect(info.humidity_avg).to eql(68.0)
|
43
|
+
expect(info.humidity_min).to eql(53.0)
|
44
|
+
expect(info.day_length).to eql(0.0)
|
45
|
+
expect(info.general_weather_condition_day).to eql('曇後時々雨')
|
46
|
+
expect(info.general_weather_condition_night).to eql('雨時々曇')
|
47
|
+
end
|
46
48
|
end
|
47
|
-
end
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
context 'information is not available' do
|
51
|
+
let(:fixture_file_name) {
|
52
|
+
'ng.html'
|
53
|
+
}
|
54
|
+
|
55
|
+
it 'raises error' do
|
56
|
+
expect {
|
57
|
+
daily.at(date)
|
58
|
+
}.to raise_error(Kisyo::WeatherInformationNotAvailable)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'value is "--"' do
|
63
|
+
let(:date) {
|
64
|
+
Date.parse('2016-11-04')
|
65
|
+
}
|
66
|
+
|
67
|
+
it '"--" is converted to nil' do
|
68
|
+
info = daily.at(date)
|
53
69
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
70
|
+
expect(info.precipitation_total).to be_nil
|
71
|
+
expect(info.precipitation_hourly_max).to be_nil
|
72
|
+
expect(info.precipitation_10min_max).to be_nil
|
73
|
+
end
|
58
74
|
end
|
59
75
|
end
|
76
|
+
context 'multiple request' do
|
77
|
+
before do
|
78
|
+
stub_request(:get, url).
|
79
|
+
to_return(:body => read_fixture_file(fixture_file_name)).
|
80
|
+
times(number_of_request)
|
81
|
+
end
|
82
|
+
|
83
|
+
context '2016-11-01 - 2016-11-05' do
|
84
|
+
let(:number_of_request) { 1 }
|
60
85
|
|
61
|
-
|
62
|
-
|
63
|
-
Date.parse('2016-11-04')
|
64
|
-
}
|
86
|
+
it 'caches and reuses first response' do
|
87
|
+
date = Date.parse('2016-11-01')
|
65
88
|
|
66
|
-
|
67
|
-
|
89
|
+
expect(daily.at(date).precipitation_total).to eql(10.0)
|
90
|
+
expect(daily.at(date + 1).precipitation_total).to eql(1.5)
|
91
|
+
expect(daily.at(date + 2).precipitation_total).to eql(3.0)
|
92
|
+
expect(daily.at(date + 3).precipitation_total).to be_nil
|
93
|
+
expect(daily.at(date + 4).precipitation_total).to eql(0.0)
|
68
94
|
|
69
|
-
|
70
|
-
|
71
|
-
expect(info.precipitation_10min_max).to be_nil
|
95
|
+
expect(a_request(:get, url)).to have_been_made.times(1)
|
96
|
+
end
|
72
97
|
end
|
73
98
|
end
|
74
99
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kisyo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- youpy
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- Rakefile
|
96
96
|
- kisyo.gemspec
|
97
97
|
- lib/kisyo.rb
|
98
|
+
- lib/kisyo/cache.rb
|
98
99
|
- lib/kisyo/daily.rb
|
99
100
|
- lib/kisyo/elements/day.rb
|
100
101
|
- lib/kisyo/error.rb
|