pm25 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +2 -1
- data/README.md +8 -3
- data/lib/pm25/base.rb +7 -4
- data/lib/pm25/version.rb +2 -2
- data/pm25.gemspec +1 -1
- data/spec/pm25/base_spec.rb +63 -0
- data/spec/pm25/cities_spec.rb +74 -0
- data/spec/pm25_spec.rb +2 -6
- data/spec/spec_helper.rb +3 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc572dc7b0470481bf49d0af5120410fbcbdd331
|
4
|
+
data.tar.gz: cf76f74f9da3fb29c51d2bd74aa68a9bf7e08a0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef22e986f06fbece1d130fcb98ee0dcada03544fb621e8fa39e8df1d07b6512c9afc0cb6143bbf28ead2d3ce43896160205ede70aa6081fdc7768fc870197960
|
7
|
+
data.tar.gz: 048130ad1ac1f10a20dca49436173e32fc6ff9fef3dd6eaec442a72bc6bfdfc187551d0cf27f12af452b9eb9e960076a5fb8de4383993dfd885886905457ce60
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
# PM25
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/pm25.png)](http://badge.fury.io/rb/pm25)
|
3
4
|
[![Build Status](https://www.travis-ci.org/ekohe/pm25.png?branch=master)](https://www.travis-ci.org/ekohe/pm25)
|
4
5
|
[![Code Climate](https://codeclimate.com/github/ekohe/pm25.png)](https://codeclimate.com/github/ekohe/pm25)
|
6
|
+
[![Dependency Status](https://gemnasium.com/ekohe/pm25.png)](https://gemnasium.com/ekohe/pm25)
|
7
|
+
[![Coverage Status](https://coveralls.io/repos/ekohe/pm25/badge.png)](https://coveralls.io/r/ekohe/pm25)
|
5
8
|
|
6
|
-
PM2.5 and ozone readings Data From U.S. Consulate.
|
7
|
-
|
8
|
-
Include below cities of China:
|
9
|
+
China PM2.5 and ozone readings Data From U.S. Consulate. Include below cities of China:
|
9
10
|
|
10
11
|
- Beijing
|
11
12
|
- Shanghai
|
@@ -13,6 +14,8 @@ Include below cities of China:
|
|
13
14
|
- Guangzhou
|
14
15
|
- Shenyang
|
15
16
|
|
17
|
+
Another gem about Air Quality Index of China available here [ChinaAqi][china_aqi], all monitoring stations in most cities of China are available, most AQI data are available, all the data is form China's official sector. Check it out!
|
18
|
+
|
16
19
|
## Installation
|
17
20
|
|
18
21
|
Add this line to your application's Gemfile:
|
@@ -103,3 +106,5 @@ PM25::Shenyang.last
|
|
103
106
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
104
107
|
4. Push to the branch (`git push origin my-new-feature`)
|
105
108
|
5. Create new Pull Request
|
109
|
+
|
110
|
+
[china_aqi]: https://github.com/Xuhao/china_aqi
|
data/lib/pm25/base.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'httparty'
|
2
2
|
require 'active_support/core_ext/class/attribute'
|
3
3
|
require 'active_support/core_ext/hash/conversions'
|
4
|
+
require 'active_support/core_ext/hash/slice'
|
4
5
|
module PM25
|
5
6
|
class Base
|
6
7
|
include HTTParty
|
@@ -35,10 +36,12 @@ module PM25
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def self.parse(data)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
data
|
39
|
+
parsed_data = {}
|
40
|
+
parsed_data['Conc'] = data['Conc'].to_f
|
41
|
+
parsed_data['AQI'] = data['AQI'].to_i
|
42
|
+
parsed_data['Desc'] = data['Desc'].to_s
|
43
|
+
parsed_data['ReadingDateTime'] = DateTime.strptime(data['ReadingDateTime'], '%m/%d/%Y %I:%M:%S %p')
|
44
|
+
parsed_data
|
42
45
|
end
|
43
46
|
end
|
44
47
|
end
|
data/lib/pm25/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "0.0.
|
1
|
+
module PM25
|
2
|
+
VERSION = "0.0.4"
|
3
3
|
end
|
data/pm25.gemspec
CHANGED
@@ -5,7 +5,7 @@ require 'pm25/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "pm25"
|
8
|
-
spec.version =
|
8
|
+
spec.version = PM25::VERSION
|
9
9
|
spec.authors = ["Xuhao"]
|
10
10
|
spec.email = ["xuhao@rubyfans.com"]
|
11
11
|
spec.description = %q{PM2.5 reporting from U.S. Consulate}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pm25/base'
|
3
|
+
|
4
|
+
describe PM25::Base do
|
5
|
+
shared_examples "raise NotImplementedError" do |class_method_name|
|
6
|
+
it "should raise NotImplementedError when call #{class_method_name} class method" do
|
7
|
+
expect { PM25::Base.__send__ class_method_name }.to raise_error(NotImplementedError, "Please set value for 'city_id' class attributes in 'PM25::Base' class.")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
shared_examples 'helper methods' do |_class|
|
12
|
+
let(:hash_a) do
|
13
|
+
{"Conc" => '125.0', "AQI" => '187', "Desc" => "Unhealthy (at 24-hour exposure at this level)", "ReadingDateTime" => "06/04/2013 6:00:00 PM", 'a' => 'a value', 'b' => 'b value'}
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should slice a hash with ATTRS when call `slice` method' do
|
17
|
+
hash_b = _class.slice(hash_a)
|
18
|
+
hash_b.should be_a(Hash)
|
19
|
+
_class::ATTRS.all?{|x| hash_b.key?(x)}.should eq(true)
|
20
|
+
hash_b.key?('a').should eq(false)
|
21
|
+
hash_b.key?('b').should eq(false)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should parse hash values to ruby data type when call `parse` method' do
|
25
|
+
hash_b = _class.parse(hash_a)
|
26
|
+
hash_b.should be_a(Hash)
|
27
|
+
hash_b.key?('a').should eq(false)
|
28
|
+
hash_b.key?('b').should eq(false)
|
29
|
+
|
30
|
+
hash_b['Conc'].should be_a(Float)
|
31
|
+
hash_b['Conc'].should eq(125.0)
|
32
|
+
hash_b['AQI'].should be_a(Integer)
|
33
|
+
hash_b['AQI'].should eq(187)
|
34
|
+
hash_b['ReadingDateTime'].should be_a(DateTime)
|
35
|
+
hash_b['ReadingDateTime'].should eq(DateTime.strptime(hash_a['ReadingDateTime'], '%m/%d/%Y %I:%M:%S %p'))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'Class attributes and constant' do
|
40
|
+
it 'should have constant ATTRS with array values' do
|
41
|
+
PM25::Base::ATTRS.should eq(%w(Conc AQI Desc ReadingDateTime))
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should not have city_id' do
|
45
|
+
PM25::Base.city_id.should be_nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should have base_uri with host "ww.stateair.net"' do
|
49
|
+
PM25::Base.base_uri.should be_a(URI::HTTP)
|
50
|
+
PM25::Base.base_uri.host.should eq('www.stateair.net')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'Class methods' do
|
55
|
+
include_examples "raise NotImplementedError", 'uri'
|
56
|
+
include_examples "raise NotImplementedError", 'get'
|
57
|
+
include_examples "raise NotImplementedError", 'all'
|
58
|
+
include_examples "raise NotImplementedError", 'last'
|
59
|
+
include_examples "raise NotImplementedError", 'url'
|
60
|
+
|
61
|
+
include_examples "helper methods", PM25::Base
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pm25/base'
|
3
|
+
|
4
|
+
shared_examples "city common examples" do |city_class, city_id|
|
5
|
+
include_examples "helper methods", city_class
|
6
|
+
context 'class attribute' do
|
7
|
+
it "should has city_id equal to #{city_id}" do
|
8
|
+
city_class.city_id.should_not be_nil
|
9
|
+
city_class.city_id.should eq(city_id)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context 'class methods' do
|
14
|
+
it 'should return an array with pollution data from remote when call `get` method' do
|
15
|
+
data = city_class.get
|
16
|
+
data.should be_a(Array)
|
17
|
+
data.any? {|measure| measure.key? 'AQI'}.should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should return an array with clean parsed data clice by ATTRS from remote when call `all` method' do
|
21
|
+
data = city_class.all
|
22
|
+
measure = data.first
|
23
|
+
data.should be_a(Array)
|
24
|
+
measure.keys.should eq(city_class::ATTRS)
|
25
|
+
measure['Conc'].should be_a(Float)
|
26
|
+
measure['AQI'].should be_a(Integer)
|
27
|
+
measure['Desc'].should be_a(String)
|
28
|
+
measure['ReadingDateTime'].should be_a(DateTime)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should return the latest parsed data clice by ATTRS from remote when call `last` method' do
|
32
|
+
data = city_class.last
|
33
|
+
data.should be_a(Hash)
|
34
|
+
data.keys.should eq(city_class::ATTRS)
|
35
|
+
data['Conc'].should be_a(Float)
|
36
|
+
data['AQI'].should be_a(Integer)
|
37
|
+
data['Desc'].should be_a(String)
|
38
|
+
data['ReadingDateTime'].should be_a(DateTime)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should return URI::HTTP object own context when call `uri` method' do
|
42
|
+
uri = city_class.uri
|
43
|
+
uri.should be_a(URI::HTTP)
|
44
|
+
uri.host.should eq('www.stateair.net')
|
45
|
+
uri.path.should eq("/web/rss/1/#{city_id}.xml")
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should return url string with own context when call `url` method' do
|
49
|
+
city_class.url.should be_a(String)
|
50
|
+
city_class.url.should eq("http://www.stateair.net/web/rss/1/#{city_id}.xml")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
describe PM25::Beijing do
|
57
|
+
include_examples "city common examples", PM25::Beijing, '1'
|
58
|
+
end
|
59
|
+
|
60
|
+
describe PM25::Chengdu do
|
61
|
+
include_examples "city common examples", PM25::Chengdu, '2'
|
62
|
+
end
|
63
|
+
|
64
|
+
describe PM25::Guangzhou do
|
65
|
+
include_examples "city common examples", PM25::Guangzhou, '3'
|
66
|
+
end
|
67
|
+
|
68
|
+
describe PM25::Shanghai do
|
69
|
+
include_examples "city common examples", PM25::Shanghai, '4'
|
70
|
+
end
|
71
|
+
|
72
|
+
describe PM25::Shenyang do
|
73
|
+
include_examples "city common examples", PM25::Shenyang, '5'
|
74
|
+
end
|
data/spec/pm25_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pm25
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Xuhao
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -104,6 +104,8 @@ files:
|
|
104
104
|
- lib/pm25/exceptions.rb
|
105
105
|
- lib/pm25/version.rb
|
106
106
|
- pm25.gemspec
|
107
|
+
- spec/pm25/base_spec.rb
|
108
|
+
- spec/pm25/cities_spec.rb
|
107
109
|
- spec/pm25_spec.rb
|
108
110
|
- spec/spec_helper.rb
|
109
111
|
homepage: ''
|
@@ -131,5 +133,7 @@ signing_key:
|
|
131
133
|
specification_version: 4
|
132
134
|
summary: PM2.5 reporting from U.S. Consulate
|
133
135
|
test_files:
|
136
|
+
- spec/pm25/base_spec.rb
|
137
|
+
- spec/pm25/cities_spec.rb
|
134
138
|
- spec/pm25_spec.rb
|
135
139
|
- spec/spec_helper.rb
|