world_bank_fetcher 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,6 +3,7 @@ require 'world_bank'
3
3
  require 'world_bank_fetcher/job'
4
4
  require 'world_bank_fetcher/query_scheduler'
5
5
  require 'world_bank_fetcher/country_parser'
6
+ require 'world_bank_fetcher/indicator_data_parser'
6
7
 
7
8
  module WorldBankFetcher
8
9
  MAXIMUM_BUFFER_SIZE = 10000
@@ -0,0 +1,10 @@
1
+ require 'world_bank'
2
+
3
+ module WorldBankFetcher
4
+ class IndicatorDataParser
5
+
6
+ def self.filter(data_collection)
7
+ data = data_collection.keep_if {|datum| datum.value != nil }
8
+ end
9
+ end
10
+ end
@@ -14,15 +14,20 @@ module WorldBankFetcher
14
14
  def fetch
15
15
  all_data = fetch_everything query
16
16
  if all_data
17
- data = CountryParser.filter(all_data)
18
- data
17
+ data = @job_type == :country ? CountryParser.filter(all_data) : IndicatorDataParser.filter(all_data)
18
+ @checksum = checksum data
19
+ {:results => data, :checksum => @checksum}
19
20
  else
20
21
  nil
21
22
  end
22
23
  end
23
24
 
24
25
  private
25
-
26
+
27
+ def checksum(data)
28
+ Digest::MD5.hexdigest Marshal.dump(data)
29
+ end
30
+
26
31
  def build_query(options)
27
32
  options[:indicator] ? indicator_query(options[:indicator]) : countries_query
28
33
  end
@@ -1,3 +1,3 @@
1
1
  module WorldBankFetcher
2
- VERSION = "0.0.12"
2
+ VERSION = "0.0.13"
3
3
  end
@@ -0,0 +1,25 @@
1
+ require 'helper'
2
+
3
+ module WorldBankFetcher
4
+ describe IndicatorDataParser do
5
+ let(:other_attributes) { { }}
6
+ let(:good_data_1) { WorldBank::Data.new(attrs_with 'value' => 534) }
7
+ let(:good_data_2) { WorldBank::Data.new(attrs_with 'value' => 32) }
8
+ let(:bad_data_1) { WorldBank::Data.new(attrs_with 'value' => nil) }
9
+ let(:bad_data_2) { WorldBank::Data.new(attrs_with 'value' => nil) }
10
+
11
+
12
+ it "should filter data with nil values" do
13
+ # CountryParser.filter([france, arab_world, canada]).should eq([france, canada])
14
+ good_data = [good_data_1, good_data_2]
15
+ IndicatorDataParser.filter([good_data_1, bad_data_2, bad_data_1, good_data_2]).should eq(good_data)
16
+ end
17
+
18
+ private
19
+
20
+ def attrs_with(attr)
21
+ {'indicator' => {'value' => '2', 'id' => 23}, 'date' => '1999'}.merge attr
22
+ end
23
+
24
+ end
25
+ end
data/spec/job_spec.rb CHANGED
@@ -1,45 +1,98 @@
1
1
  require 'helper'
2
2
 
3
3
  module WorldBankFetcher
4
- describe Job do
4
+ describe Job do
5
+ before do
6
+ CountryParser.stub!(:filter) do |arg|
7
+ arg
8
+ end
9
+
10
+ IndicatorDataParser.stub!(:filter) do |arg|
11
+ arg
12
+ end
13
+ end
14
+
5
15
  let(:indicator_string) { 'SP.POP.TOTL' }
6
16
 
7
- describe 'initialize' do
17
+ context 'initialize' do
8
18
  it "should accept hash w/ indicator to specify job type in intializer" do
9
- country_parser_filters_nothing!
10
19
  WorldBank::Data.should_receive(:country).with('all').and_return(stubbed_query)
11
20
  Job.new(:indicator => indicator_string)
12
21
  end
13
22
 
14
23
  it "should accept countries to indicate all countries in initializer hash" do
15
- country_parser_filters_nothing!
16
24
  WorldBank::Country.should_receive(:all).and_return(stubbed_query)
17
25
  Job.new(:countries => true)
18
26
  end
19
27
  end
20
28
 
21
- describe 'fetch' do
29
+ context 'fetch' do
30
+ context 'filtering' do
31
+ it "should not use IndicatorDataParser to filter for country jobs" do
32
+ IndicatorDataParser.should_not_receive(:filter)
33
+ Job.new(:countries => true).fetch
34
+ end
35
+
36
+ it "should use IndicatorDataParser to filter for indicator jobs" do
37
+ WorldBank::DataQuery.any_instance.stub(:total).and_return(39)
38
+ QueryScheduler.any_instance.should_receive(:execute!).and_return(:something)
39
+
40
+ IndicatorDataParser.should_receive(:filter)
41
+ Job.new(:indicator => indicator_string).fetch
42
+ end
43
+
44
+ it "should not use CountryParser to filter for indicator jobs" do
45
+ WorldBank::DataQuery.any_instance.stub(:total).and_return(39)
46
+ QueryScheduler.any_instance.should_receive(:execute!).and_return(:something)
47
+
48
+ CountryParser.should_not_receive(:filter)
49
+ Job.new(:indicator => indicator_string).fetch
50
+ end
51
+
52
+ it "should use CountryParser to filter for country jobs" do
53
+ CountryParser.should_receive(:filter)
54
+ Job.new(:countries => true).fetch
55
+ end
56
+ end
57
+
22
58
  it "should return nil if query shceduler returns nil" do
23
- country_parser_filters_nothing!
59
+ WorldBank::DataQuery.any_instance.stub(:total).and_return(39)
24
60
  QueryScheduler.any_instance.should_receive(:execute!).and_return(nil)
25
61
  job = Job.new(:indicator => indicator_string)
26
62
  job.fetch.should be_nil
27
63
  end
28
64
 
29
65
  it "should not return nil if query shceduler returns non nil value" do
30
- country_parser_filters_nothing!
66
+ WorldBank::DataQuery.any_instance.stub(:total).and_return(39)
31
67
  QueryScheduler.any_instance.should_receive(:execute!).and_return(:something)
32
68
  job = Job.new(:indicator => indicator_string)
33
69
  job.fetch.should_not be_nil
34
70
  end
35
71
 
36
- it "filters return value from Query Scheduler through CountryParser" do
72
+ it "returns a hash if there are no errors" do
73
+ WorldBank::DataQuery.any_instance.stub(:total).and_return(39)
37
74
  QueryScheduler.any_instance.should_receive(:execute!).and_return(:something)
38
- CountryParser.should_receive(:filter).with(:something).and_return(:something_else)
75
+
39
76
  job = Job.new(:indicator => indicator_string)
40
- job.fetch.should eq(:something_else)
77
+ job.fetch.should be_an_instance_of(Hash)
41
78
  end
42
- end
79
+
80
+ context 'checksum' do
81
+ it "should return unique checksums given unique results" do
82
+ job = Job.new(:indicator => indicator_string)
83
+ d1 = [:blah, :blog, :dj]
84
+ d2 = [:bjad, :awe, :asdf]
85
+ job.send(:checksum, d1).should_not eq(job.send(:checksum, d2))
86
+ end
87
+
88
+ it "should receive same checksum if scheduler returns identical results" do
89
+ job = Job.new(:indicator => indicator_string)
90
+ d1 = [:blah, :blog, :dj]
91
+ job.send(:checksum, d1).should eq(job.send(:checksum, d1))
92
+ end
93
+
94
+ end
95
+ end
43
96
 
44
97
  private
45
98
  def stubbed_query
@@ -47,11 +100,5 @@ module WorldBankFetcher
47
100
  dummy_query.stub(:indicator)
48
101
  dummy_query
49
102
  end
50
-
51
- def country_parser_filters_nothing!
52
- CountryParser.stub!(:filter) do |arg|
53
- arg
54
- end
55
- end
56
103
  end
57
104
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: world_bank_fetcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
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: 2012-08-31 00:00:00.000000000 Z
12
+ date: 2012-10-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -61,11 +61,13 @@ files:
61
61
  - country_lists/sorted_countries.txt
62
62
  - lib/world_bank_fetcher.rb
63
63
  - lib/world_bank_fetcher/country_parser.rb
64
+ - lib/world_bank_fetcher/indicator_data_parser.rb
64
65
  - lib/world_bank_fetcher/job.rb
65
66
  - lib/world_bank_fetcher/query_scheduler.rb
66
67
  - lib/world_bank_fetcher/version.rb
67
68
  - spec/country_parser_spec.rb
68
69
  - spec/helper.rb
70
+ - spec/indicator_data_parser_spec.rb
69
71
  - spec/job_spec.rb
70
72
  - spec/query_scheduler_spec.rb
71
73
  - world_bank_fetcher.gemspec
@@ -83,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
83
85
  version: '0'
84
86
  segments:
85
87
  - 0
86
- hash: -4294862042739340307
88
+ hash: -4294314482202653082
87
89
  required_rubygems_version: !ruby/object:Gem::Requirement
88
90
  none: false
89
91
  requirements:
@@ -92,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
92
94
  version: '0'
93
95
  segments:
94
96
  - 0
95
- hash: -4294862042739340307
97
+ hash: -4294314482202653082
96
98
  requirements: []
97
99
  rubyforge_project:
98
100
  rubygems_version: 1.8.24
@@ -102,5 +104,6 @@ summary: Fetches local WorldBank country and indicator data.
102
104
  test_files:
103
105
  - spec/country_parser_spec.rb
104
106
  - spec/helper.rb
107
+ - spec/indicator_data_parser_spec.rb
105
108
  - spec/job_spec.rb
106
109
  - spec/query_scheduler_spec.rb