pm25 0.0.3 → 0.0.4
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.
- 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
|
+
[](http://badge.fury.io/rb/pm25)
|
3
4
|
[](https://www.travis-ci.org/ekohe/pm25)
|
4
5
|
[](https://codeclimate.com/github/ekohe/pm25)
|
6
|
+
[](https://gemnasium.com/ekohe/pm25)
|
7
|
+
[](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
|