iraq_unrest 0.0.1

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.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +114 -0
  6. data/Rakefile +7 -0
  7. data/examples/example_01.png +0 -0
  8. data/examples/example_02.png +0 -0
  9. data/examples/example_03.png +0 -0
  10. data/examples/iraq_government_casualty_figure.csv +95 -0
  11. data/examples/iraq_government_casualty_figure.html +126 -0
  12. data/examples/iraqi_casualties_comparison.csv +119 -0
  13. data/examples/iraqi_casualties_comparison.html +105 -0
  14. data/iraq_unrest.gemspec +33 -0
  15. data/lib/iraq_unrest/concerns/serializable.rb +37 -0
  16. data/lib/iraq_unrest/concerns/validatable.rb +18 -0
  17. data/lib/iraq_unrest/config.rb +8 -0
  18. data/lib/iraq_unrest/data/Iraq_Government_Casualty_Figure.csv +116 -0
  19. data/lib/iraq_unrest/data_set.rb +41 -0
  20. data/lib/iraq_unrest/erb/header.html.erb +32 -0
  21. data/lib/iraq_unrest/erb/iraq_government_casualty_figure.html.erb +94 -0
  22. data/lib/iraq_unrest/erb/iraqi_casualties_comparison.html.erb +73 -0
  23. data/lib/iraq_unrest/format.rb +103 -0
  24. data/lib/iraq_unrest/google_doc.rb +31 -0
  25. data/lib/iraq_unrest/iraq_government_casualty_figure.rb +53 -0
  26. data/lib/iraq_unrest/iraq_unrest_record.rb +74 -0
  27. data/lib/iraq_unrest/iraqi_casualties_comparison.rb +46 -0
  28. data/lib/iraq_unrest/serializers.rb +46 -0
  29. data/lib/iraq_unrest/version.rb +3 -0
  30. data/lib/iraq_unrest.rb +50 -0
  31. data/test/fixtures/vcr_cassettes/iraq_government_casualty_figure.yml +161 -0
  32. data/test/fixtures/vcr_cassettes/iraqi_casualties_comparison.yml +184 -0
  33. data/test/google_doc_test.rb +56 -0
  34. data/test/iraq_government_casualty_figure_test.rb +253 -0
  35. data/test/iraqi_casualties_comparison_test.rb +246 -0
  36. data/test/test_helper.rb +17 -0
  37. data/test/validatable_test.rb +34 -0
  38. metadata +242 -0
@@ -0,0 +1,184 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://docs.google.com/spreadsheet/pub?gid=9&hl=en_US&key=0Aia6y6NymliRdEZESktBSWVqNWM1dkZOSGNIVmtFZEE&output=csv
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Content-Type:
16
+ - text/csv
17
+ X-Robots-Tag:
18
+ - noindex, nofollow, nosnippet
19
+ Content-Disposition:
20
+ - attachment; filename="Iraq Unrest.csv"
21
+ Set-Cookie:
22
+ - NID=67=dJclmwa8iaDNZ4CB0RxHEiP_3spkVXQxeKZpER9-lmcnWKK0luvNaqQXJhyKQg9u8-S1oJIq99n0uwyHao4h1KPz4NSZVy-3wqI8RSumVbTWz4lKwuNEnitFFPOsiD1k;Domain=.google.com;Path=/;Expires=Wed,
23
+ 14-May-2014 16:29:13 GMT;HttpOnly
24
+ P3p:
25
+ - CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657
26
+ for more info."
27
+ Date:
28
+ - Tue, 12 Nov 2013 16:29:13 GMT
29
+ Expires:
30
+ - Tue, 12 Nov 2013 16:29:13 GMT
31
+ Cache-Control:
32
+ - private, max-age=0
33
+ X-Content-Type-Options:
34
+ - nosniff
35
+ X-Xss-Protection:
36
+ - 1; mode=block
37
+ Server:
38
+ - GSE
39
+ Alternate-Protocol:
40
+ - 443:quic
41
+ Transfer-Encoding:
42
+ - chunked
43
+ body:
44
+ encoding: ASCII-8BIT
45
+ string: |-
46
+ Iraqi Casualties: A Comparison,,,
47
+ ,,,
48
+ "This sheet provides a comparison between data compiled by AFP, based on reports from security and medical officials, data compiled by the Iraqi ministries of health, interior and defence, and data compiled by Britain-based NGO Iraq Body Count",,,
49
+ ,,,
50
+ ,KILLED,,
51
+ ,Iraq Government,Iraq Body Count,AFP
52
+ Dec-2013,0,,
53
+ Nov-2013,0,,139
54
+ Oct-2013,964,,743
55
+ Sep-2013,885,,880
56
+ Aug-2013,356,,693
57
+ Jul-2013,921,,875
58
+ Jun-2013,240,,452
59
+ May-2013,630,887,614
60
+ Apr-2013,205,544,461
61
+ Mar-2013,163,395,271
62
+ Feb-2013,136,358,220
63
+ Jan-2013,177,357,246
64
+ 2013,4677,2541,5594
65
+ Dec-2012,208,275,144
66
+ Nov-2012,166,240,160
67
+ Oct-2012,144,290,136
68
+ Sep-2012,365,396,253
69
+ Aug-2012,164,422,278
70
+ Jul-2012,325,469,278
71
+ Jun-2012,131,529,282
72
+ May-2012,132,304,
73
+ Apr-2012,126,392,
74
+ Mar-2012,112,377,
75
+ Feb-2012,150,356,
76
+ Jan-2012,151,524,
77
+ 2012,2174,4574,1531
78
+ Dec-2011,155,388,
79
+ Nov-2011,187,279,
80
+ Oct-2011,258,366,
81
+ Sep-2011,185,397,
82
+ Aug-2011,239,401,
83
+ Jul-2011,259,308,
84
+ Jun-2011,271,386,
85
+ May-2011,177,381,
86
+ Apr-2011,211,289,
87
+ Mar-2011,247,311,
88
+ Feb-2011,197,252,
89
+ Jan-2011,259,389,
90
+ 2011,2645,4147,
91
+ Dec-2010,151,217,
92
+ Nov-2010,171,307,
93
+ Oct-2010,185,312,
94
+ Sep-2010,273,254,
95
+ Aug-2010,426,516,
96
+ Jul-2010,535,443,
97
+ Jun-2010,284,385,
98
+ May-2010,337,387,
99
+ Apr-2010,328,385,
100
+ Mar-2010,367,336,
101
+ Feb-2010,352,304,
102
+ Jan-2010,196,263,
103
+ 2010,3605,4109,
104
+ Dec-2009,367,475,
105
+ Nov-2009,122,226,
106
+ Oct-2009,410,435,
107
+ Sep-2009,203,332,
108
+ Aug-2009,456,618,
109
+ Jul-2009,275,407,
110
+ Jun-2009,437,498,
111
+ May-2009,155,387,
112
+ Apr-2009,355,565,
113
+ Mar-2009,252,426,
114
+ Feb-2009,258,402,
115
+ Jan-2009,191,366,
116
+ 2009,3481,5137,
117
+ Dec-2008,316,576,
118
+ Nov-2008,340,521,
119
+ Oct-2008,317,575,
120
+ Sep-2008,440,584,
121
+ Aug-2008,431,627,
122
+ Jul-2008,465,623,
123
+ Jun-2008,509,747,
124
+ May-2008,563,886,
125
+ Apr-2008,1073,1272,
126
+ Mar-2008,1082,1623,
127
+ Feb-2008,721,1049,
128
+ Jan-2008,541,844,
129
+ 2008,6798,9927,
130
+ Dec-2007,568,982,
131
+ Nov-2007,606,1095,
132
+ Oct-2007,887,1286,
133
+ Sep-2007,917,1360,
134
+ Aug-2007,1856,2457,
135
+ Jul-2007,1875,2671,
136
+ Jun-2007,1463,2180,
137
+ May-2007,2124,2809,
138
+ Apr-2007,1689,2495,
139
+ Mar-2007,2078,2682,
140
+ Feb-2007,1806,2607,
141
+ Jan-2007,2087,2948,
142
+ 2007,17956,25572,
143
+ Dec-2006,0,2886,
144
+ Nov-2006,1975,3064,
145
+ Oct-2006,1427,2977,
146
+ Sep-2006,0,2556,
147
+ Aug-2006,0,2835,
148
+ Jul-2006,1850,3279,
149
+ Jun-2006,1009,2553,
150
+ May-2006,1055,2251,
151
+ Apr-2006,0,1792,
152
+ Mar-2006,0,1940,
153
+ Feb-2006,0,1569,
154
+ Jan-2006,0,1543,
155
+ 2006,7316,29245,
156
+ Dec-2005,,1135,
157
+ Nov-2005,,1465,
158
+ Oct-2005,,1298,
159
+ Sep-2005,,1415,
160
+ Aug-2005,,2266,
161
+ Jul-2005,,1528,
162
+ Jun-2005,,1299,
163
+ May-2005,,1336,
164
+ Apr-2005,,1119,
165
+ Mar-2005,,871,
166
+ Feb-2005,,1266,
167
+ Jan-2005,,1188,
168
+ 2005,,16186,
169
+ Dec-2004,,1106,
170
+ Nov-2004,,1653,
171
+ Oct-2004,,1011,
172
+ Sep-2004,,1031,
173
+ Aug-2004,,868,
174
+ Jul-2004,,818,
175
+ Jun-2004,,900,
176
+ May-2004,,656,
177
+ Apr-2004,,1304,
178
+ Mar-2004,,1001,
179
+ Feb-2004,,660,
180
+ Jan-2004,,609,
181
+ 2004,,11617,
182
+ http_version:
183
+ recorded_at: Tue, 12 Nov 2013 16:29:13 GMT
184
+ recorded_with: VCR 2.6.0
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ module IraqUnrest
4
+
5
+ describe GoogleDoc do
6
+
7
+ before do
8
+ VCR.insert_cassette 'iraq_government_casualty_figure', :re_record_interval => 86400
9
+ @doc = GoogleDoc.new
10
+ end
11
+
12
+ after { VCR.eject_cassette }
13
+
14
+ describe "when asked for a spreadsheet by name" do
15
+
16
+ it "must return a String object" do
17
+ spreadsheet = @doc.spreadsheet(:iraq_government_casualty_figure)
18
+ spreadsheet.must_be_kind_of String
19
+ end
20
+
21
+ it "must return an ArgumentError when the name is invalid" do
22
+ proc {@doc.spreadsheet(:foobaz)}.must_raise ArgumentError
23
+ end
24
+
25
+ end
26
+
27
+ describe "when there are network problems" do
28
+
29
+ before do
30
+ WebMock.disable_net_connect!
31
+ @doc = GoogleDoc.new
32
+ end
33
+ after { WebMock.allow_net_connect! }
34
+
35
+ it "must raise a TimeoutError with a custom message for long requests" do
36
+ stub_request(:get,
37
+ "https://docs.google.com/spreadsheet/pub?gid=4&hl=en_US&key=0Aia6y6NymliRdEZESktBSWVqNWM1dkZOSGNIVmtFZEE&output=csv").
38
+ to_timeout
39
+ err = proc {@doc.spreadsheet(:iraq_government_casualty_figure)}.must_raise Curl::Err::TimeoutError
40
+ err.message.must_match /^Could not connect to Google Docs in a timely manner Curl::Err::TimeoutError$/
41
+ end
42
+
43
+ it "must raise an Exception with a custom message when the response code when not 200" do
44
+ stub_request(:get,
45
+ "https://docs.google.com/spreadsheet/pub?gid=4&hl=en_US&key=0Aia6y6NymliRdEZESktBSWVqNWM1dkZOSGNIVmtFZEE&output=csv").
46
+ to_return(:status => 500, :body => "", :headers => {})
47
+
48
+ err = proc {@doc.spreadsheet(:iraq_government_casualty_figure)}.must_raise Exception
49
+ err.message.must_match /^Did not receive a successfull response from Google Docs$/
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,253 @@
1
+ require 'test_helper'
2
+
3
+ module IraqUnrest
4
+
5
+ describe IraqGovernmentCasualtyFigure do
6
+
7
+ before { VCR.insert_cassette 'iraq_government_casualty_figure', :re_record_interval => 86400 }
8
+ after { VCR.eject_cassette }
9
+
10
+ describe "an instance" do
11
+
12
+ before { @object = IraqiCasualtiesComparison.new(:date => "Sep-2013") }
13
+
14
+ describe "when asked as_json" do
15
+ it "must be a Hash" do
16
+ @object.as_json.must_be_instance_of Hash
17
+ end
18
+ end
19
+
20
+ describe "when asked to_json" do
21
+ it "must be a String" do
22
+ @object.to_json.must_be_instance_of String
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ describe "the data set" do
29
+
30
+ it "must return 88 when asked for the number of Iraqi Civilians Killed in Feb-2013" do
31
+ IraqGovernmentCasualtyFigure.all.find {|item| item.date == "Feb-2013" }.civilian_killed.must_equal "88"
32
+ end
33
+
34
+ it "must return 58 when asked for the number of Iraqi Police Killed in Dec-2008" do
35
+ IraqGovernmentCasualtyFigure.all.find {|item| item.date == "Dec-2008" }.police_killed.must_equal "58"
36
+ end
37
+
38
+ it "must return 25 when asked for the number of Iraqi Army Killed in Nov-2006" do
39
+ IraqGovernmentCasualtyFigure.all.find {|item| item.date == "Nov-2006" }.army_killed.must_equal "25"
40
+ end
41
+
42
+ it "must return 1745 when asked for the number of Iraqi Civilian Wounded in Apr-2008" do
43
+ IraqGovernmentCasualtyFigure.all.find {|item| item.date == "Apr-2008" }.civilian_wounded.must_equal "1745"
44
+ end
45
+
46
+ it "must return when asked for the number of Iraqi Police Wounded in Oct-2006" do
47
+ IraqGovernmentCasualtyFigure.all.find {|item| item.date == "Oct-2006" }.police_wounded.must_equal "184"
48
+ end
49
+
50
+ it "must return 89 when asked for the number of Iraqi Army Wounded in Juy-2013" do
51
+ IraqGovernmentCasualtyFigure.all.find {|item| item.date == "Jul-2013" }.army_wounded.must_equal "89"
52
+ end
53
+
54
+ it "must return 54 when asked for the number of Insurgents Killed in Jan-2010" do
55
+ IraqGovernmentCasualtyFigure.all.find {|item| item.date == "Jan-2010" }.insurg_killed.must_equal "54"
56
+ end
57
+
58
+ it "must return 949 when asked for the number of Insurgents Arrested in Jun-2008" do
59
+ IraqGovernmentCasualtyFigure.all.find {|item| item.date == "Jun-2008" }.insurg_arrested.must_equal "949"
60
+ end
61
+
62
+ end
63
+
64
+ describe "class methods" do
65
+
66
+ describe "when asked for a raw csv" do
67
+ it "must return a String" do
68
+ IraqGovernmentCasualtyFigure.raw_csv.must_be_kind_of String
69
+ end
70
+ end
71
+
72
+ describe "when asked for a CSV" do
73
+
74
+ before { @csv = IraqGovernmentCasualtyFigure.to_csv }
75
+
76
+ it "must return a CSV String" do
77
+ @csv.must_be_kind_of String
78
+ end
79
+
80
+ describe "Parsring the String into a CSV object" do
81
+
82
+ before do
83
+ @csv_object = CSV.parse(@csv, :headers => true,
84
+ :header_converters => :symbol)
85
+ end
86
+
87
+ it "must have the correct headers" do
88
+ @csv_object.headers.must_equal IraqGovernmentCasualtyFigure::ATTRIBUTES
89
+ end
90
+
91
+ it "must have a dates in the format of mmm-YYYY in the first colum" do
92
+ @csv_object.values_at(:date).flatten.map {|date| Date::strptime(date,"%b-%Y") }
93
+ end
94
+
95
+ it "must have at least 90 rows" do
96
+ @csv_object.size.must_be :>=, 90
97
+ end
98
+
99
+ end
100
+
101
+ end
102
+
103
+ describe "when asked to generate a CSV" do
104
+
105
+ before { @file = IraqGovernmentCasualtyFigure.to_csv! }
106
+
107
+ it "must return a File object" do
108
+ @file.must_be_kind_of File
109
+ end
110
+
111
+ it "must create a file" do
112
+ @file.path.must_equal IraqGovernmentCasualtyFigure.file_name + ".csv"
113
+ (File.exists? @file.path).must_equal true
114
+ end
115
+
116
+ describe "CSV file" do
117
+
118
+ before do
119
+ @csv = CSV.table(@file.path, :skip_lines => /#/)
120
+ end
121
+
122
+ it "must have the correct headers" do
123
+ @csv.headers.must_equal IraqGovernmentCasualtyFigure::ATTRIBUTES
124
+ end
125
+
126
+ it "wont be empty" do
127
+ @csv.empty?.must_equal false
128
+ end
129
+
130
+ end
131
+
132
+ end
133
+
134
+ describe "when asked as_json#to_json" do
135
+
136
+ before do
137
+ @json = IraqUnrest::IraqGovernmentCasualtyFigure.as_json.to_json
138
+ end
139
+
140
+ it "must return a JSON string of all objects" do
141
+ @json.wont_be_nil
142
+ @json.must_be_kind_of String
143
+ @parsed = JSON.parse(@json)
144
+ @parsed.must_be_kind_of Array
145
+ @parsed.first.empty?.must_equal false
146
+ end
147
+
148
+ end
149
+
150
+ describe "when asked as_json" do
151
+
152
+ before do
153
+ @json = IraqUnrest::IraqGovernmentCasualtyFigure.as_json
154
+ end
155
+
156
+ it "must return an Array" do
157
+ @json.wont_be_nil
158
+ @json.must_be_kind_of Array
159
+ @generated = JSON.generate(@json)
160
+ @generated.must_be_kind_of String
161
+ end
162
+
163
+ end
164
+
165
+ describe "when asked to generate a rickshaw data structure" do
166
+ before do
167
+ @data = IraqGovernmentCasualtyFigure.as_rickshaw
168
+ @attr = [:civilian_killed, :police_killed, :army_killed, :civilian_wounded, :police_wounded, :army_wounded, :insurg_killed, :insurg_arrested]
169
+ end
170
+
171
+ it "must have all keys except a date" do
172
+ @data.keys.must_equal @attr
173
+ end
174
+
175
+ it "must contain formatted array of hashes for each attribute" do
176
+ @attr.each do |attr|
177
+ @data[attr].each do |data_point|
178
+ data_point.keys.must_equal [:x, :y]
179
+ Date.strptime(data_point[:x].to_s, "%s").must_be_instance_of Date
180
+ end
181
+ end
182
+ end
183
+
184
+ end
185
+
186
+ describe "when asked for HTML" do
187
+
188
+ before do
189
+ @html = IraqGovernmentCasualtyFigure.to_html
190
+ end
191
+
192
+ it "must return a String" do
193
+ @html.must_be_kind_of String
194
+ end
195
+
196
+ end
197
+
198
+ describe "when asked to generate HTML" do
199
+
200
+ before { @file = IraqGovernmentCasualtyFigure.to_html! }
201
+
202
+ it "must return a File object" do
203
+ @file.must_be_kind_of File
204
+ end
205
+
206
+ it "must create a file" do
207
+ @file.path.must_equal IraqGovernmentCasualtyFigure.file_name + ".html"
208
+ (File.exists? @file.path).must_equal true
209
+ end
210
+
211
+ end
212
+
213
+ describe "when asked to visualize all records" do
214
+
215
+ before { @file = IraqGovernmentCasualtyFigure.visualize! }
216
+
217
+ it "must return a File object" do
218
+ @file.must_be_kind_of File
219
+ end
220
+
221
+ it "must create a file" do
222
+ @file.path.must_equal IraqGovernmentCasualtyFigure.file_name + ".html"
223
+ (File.exists? @file.path).must_equal true
224
+ end
225
+
226
+ end
227
+
228
+ describe "when asked for all records" do
229
+ it "must return a collection of IraqGovernmentCasualtyFigure objects" do
230
+ data = IraqGovernmentCasualtyFigure.all
231
+ data.must_be_kind_of Enumerable
232
+ data.size.must_be :>, 90
233
+ data.first.must_be_kind_of IraqGovernmentCasualtyFigure
234
+ end
235
+ end
236
+
237
+ describe "when asked for a file name" do
238
+ it "must respond with a properly formatted file name" do
239
+ IraqGovernmentCasualtyFigure.file_name.must_equal 'iraq_government_casualty_figure'
240
+ end
241
+ end
242
+
243
+ describe "when asked to parse raw data" do
244
+ it "must raise an Exception if it cannot find a title" do
245
+ err = proc {IraqGovernmentCasualtyFigure.parse("Foo,Bar,Baz,\n")}.must_raise Exception
246
+ err.message.must_match /^Could not find a valid title in data source$/
247
+ end
248
+ end
249
+
250
+ end
251
+
252
+ end
253
+ end