sg-ruby 0.1.0

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.
@@ -0,0 +1,67 @@
1
+ module SimpleGeo
2
+
3
+ class Endpoint
4
+
5
+ class << self
6
+ def record(layer, id)
7
+ endpoint_url "records/#{layer}/#{id}.json"
8
+ end
9
+
10
+ def records(layer, ids)
11
+ ids = ids.join(',') if ids.is_a? Array
12
+ endpoint_url "records/#{layer}/#{ids}.json"
13
+ end
14
+
15
+ def add_records(layer)
16
+ endpoint_url "records/#{layer}.json"
17
+ end
18
+
19
+ def history(layer, id)
20
+ endpoint_url "records/#{layer}/#{id}/history.json"
21
+ end
22
+
23
+ def nearby_geohash(layer, geohash)
24
+ endpoint_url "records/#{layer}/nearby/#{geohash}.json"
25
+ end
26
+
27
+ def nearby_coordinates(layer, lat, lon)
28
+ endpoint_url "records/#{layer}/nearby/#{lat},#{lon}.json"
29
+ end
30
+
31
+ def nearby_address(lat, lon)
32
+ endpoint_url "nearby/address/#{lat},#{lon}.json"
33
+ end
34
+
35
+ def density(lat, lon, day, hour=nil)
36
+ if hour.nil?
37
+ path = "density/#{day}/#{lat},#{lon}.json"
38
+ else
39
+ path = "density/#{day}/#{hour}/#{lat},#{lon}.json"
40
+ end
41
+ endpoint_url path
42
+ end
43
+
44
+ def layer(layer)
45
+ endpoint_url "layer/#{layer}.json"
46
+ end
47
+
48
+ def contains(lat, lon)
49
+ endpoint_url "contains/#{lat},#{lon}.json"
50
+ end
51
+
52
+ def overlaps(south, west, north, east)
53
+ endpoint_url "overlaps/#{south},#{west},#{north},#{east}.json"
54
+ end
55
+
56
+ def boundary(id)
57
+ endpoint_url "boundary/#{id}.json"
58
+ end
59
+
60
+ def endpoint_url(path)
61
+ [REALM, API_VERSION, path].join('/')
62
+ end
63
+ end
64
+
65
+ end
66
+
67
+ end
@@ -0,0 +1,24 @@
1
+ module SimpleGeo
2
+ class HashUtils
3
+ def self.symbolize_keys(hash)
4
+ hash.inject({}) do |options, (key, value)|
5
+ options[(key.to_sym rescue key) || key] = value
6
+ options
7
+ end
8
+ end
9
+
10
+ def self.recursively_symbolize_keys(object)
11
+ if object.is_a? Hash
12
+ symbolized_hash = symbolize_keys(object)
13
+ symbolized_hash.each do |key, value|
14
+ symbolized_hash[key] = recursively_symbolize_keys(value)
15
+ end
16
+ symbolized_hash
17
+ elsif object.is_a? Array
18
+ object.map { |value| recursively_symbolize_keys(value) }
19
+ else
20
+ object
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,57 @@
1
+ module SimpleGeo
2
+ class Record
3
+ attr_accessor :layer, :id, :lat, :lon, :type, :created, :properties
4
+
5
+ def initialize(options={})
6
+ options = {
7
+ :created => Time.now,
8
+ :type => 'object',
9
+ :properties => {}
10
+ }.merge(options)
11
+
12
+ @id = options[:id]
13
+ @layer = options[:layer]
14
+ @type = options[:type]
15
+ @lat = options[:lat]
16
+ @lon = options[:lon]
17
+ @created = options[:created]
18
+ @properties = options[:properties]
19
+ end
20
+
21
+ def to_hash
22
+ {
23
+ :type => 'Feature',
24
+ :id => id,
25
+ :created => created.to_i,
26
+ :geometry => {
27
+ :type => 'Point',
28
+ :coordinates => [ lon, lat ]
29
+ },
30
+ :properties => properties.merge({
31
+ :type => type,
32
+ :layer => layer
33
+ })
34
+ }
35
+ end
36
+
37
+ def to_json
38
+ self.to_hash.to_json
39
+ end
40
+
41
+ def ==(other)
42
+ other.class == self.class && self.to_hash == other.to_hash
43
+ end
44
+
45
+ def self.parse_geojson_hash(json_hash)
46
+ Record.new(
47
+ :id => json_hash['id'],
48
+ :type => json_hash['properties'].delete('type'),
49
+ :lat => json_hash['geometry']['coordinates'][1],
50
+ :lon => json_hash['geometry']['coordinates'][0],
51
+ :created => Time.at(json_hash['created']),
52
+ :properties => HashUtils.recursively_symbolize_keys(json_hash['properties'])
53
+ )
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,2 @@
1
+ # So you can require "simplegeo" instead of "simple_geo"
2
+ require "simple_geo"
@@ -0,0 +1,81 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{sg-ruby}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Dan Dofter"]
12
+ s.date = %q{2010-05-12}
13
+ s.email = %q{dan@dofter.com}
14
+ s.extra_rdoc_files = [
15
+ "LICENSE",
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ ".document",
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "lib/simple_geo.rb",
26
+ "lib/simple_geo/client.rb",
27
+ "lib/simple_geo/connection.rb",
28
+ "lib/simple_geo/endpoint.rb",
29
+ "lib/simple_geo/hash_utils.rb",
30
+ "lib/simple_geo/record.rb",
31
+ "lib/simplegeo.rb",
32
+ "sg-ruby.gemspec",
33
+ "spec/client_spec.rb",
34
+ "spec/fixtures/contains.json",
35
+ "spec/fixtures/get_density_by_day.json",
36
+ "spec/fixtures/get_density_by_hour.json",
37
+ "spec/fixtures/get_history.json",
38
+ "spec/fixtures/get_nearby.json",
39
+ "spec/fixtures/get_record.json",
40
+ "spec/fixtures/get_records.json",
41
+ "spec/fixtures/layer_info.json",
42
+ "spec/fixtures/nearby_address.json",
43
+ "spec/fixtures/no_such_record.json",
44
+ "spec/fixtures/nonetype_not_iterable.json",
45
+ "spec/fixtures/overlaps.json",
46
+ "spec/spec.opts",
47
+ "spec/spec_helper.rb"
48
+ ]
49
+ s.homepage = %q{http://github.com/archfear/sg-ruby}
50
+ s.rdoc_options = ["--charset=UTF-8"]
51
+ s.require_paths = ["lib"]
52
+ s.rubygems_version = %q{1.3.6}
53
+ s.summary = %q{A SimpleGeo Ruby Client}
54
+ s.test_files = [
55
+ "spec/client_spec.rb",
56
+ "spec/spec_helper.rb"
57
+ ]
58
+
59
+ if s.respond_to? :specification_version then
60
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
61
+ s.specification_version = 3
62
+
63
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
64
+ s.add_runtime_dependency(%q<oauth>, [">= 0.4.0"])
65
+ s.add_runtime_dependency(%q<json_pure>, [">= 0"])
66
+ s.add_development_dependency(%q<rspec>, [">= 1.2.0"])
67
+ s.add_development_dependency(%q<fakeweb>, [">= 1.2.0"])
68
+ else
69
+ s.add_dependency(%q<oauth>, [">= 0.4.0"])
70
+ s.add_dependency(%q<json_pure>, [">= 0"])
71
+ s.add_dependency(%q<rspec>, [">= 1.2.0"])
72
+ s.add_dependency(%q<fakeweb>, [">= 1.2.0"])
73
+ end
74
+ else
75
+ s.add_dependency(%q<oauth>, [">= 0.4.0"])
76
+ s.add_dependency(%q<json_pure>, [">= 0"])
77
+ s.add_dependency(%q<rspec>, [">= 1.2.0"])
78
+ s.add_dependency(%q<fakeweb>, [">= 1.2.0"])
79
+ end
80
+ end
81
+
@@ -0,0 +1,1165 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Client" do
4
+ before do
5
+ SimpleGeo::Client.set_credentials 'token', 'secret'
6
+ end
7
+
8
+ context "getting a record" do
9
+ context "with an id for an existing record" do
10
+ before do
11
+ stub_request :get,
12
+ 'http://api.simplegeo.com/0.1/records/com.simplegeo.global.geonames/5373629.json',
13
+ :fixture_file => 'get_record.json'
14
+ end
15
+
16
+ it "should return a single record with the correct attributes" do
17
+ record = SimpleGeo::Client.get_record('com.simplegeo.global.geonames', 5373629)
18
+ record.class.should == SimpleGeo::Record
19
+ record.id.should == '5373629'
20
+ record.type.should == 'place'
21
+ record.layer.should == 'com.simplegeo.global.geonames'
22
+ record.created.should == Time.at(1269832510)
23
+ record.lat.should == 37.759650000000001
24
+ record.lon.should == -122.42608
25
+ record.properties.should == {
26
+ :layer => "com.simplegeo.global.geonames",
27
+ :elevation => "22",
28
+ :gtopo30 => "60",
29
+ :feature_code => "PRK",
30
+ :last_modified => "2006-01-15",
31
+ :country_code => "US",
32
+ :alternatenames => "",
33
+ :timezone => "America/Los_Angeles",
34
+ :population => "0",
35
+ :name => "Mission Dolores Park",
36
+ :feature_class => "L",
37
+ :cc2 => "",
38
+ :admin1 => "CA",
39
+ :admin3 => "",
40
+ :admin2 => "075",
41
+ :admin4 => "",
42
+ :asciiname => "Mission Dolores Park"
43
+ }
44
+ end
45
+ end
46
+
47
+ context "with an id for a nonexistant record" do
48
+ before do
49
+ stub_request :get,
50
+ 'http://api.simplegeo.com/0.1/records/com.simplegeo.global.geonames/foo.json',
51
+ :fixture_file => 'no_such_record.json', :status => 404
52
+ end
53
+
54
+ it "should raise a NotFound exception" do
55
+ lambda {
56
+ SimpleGeo::Client.get_record('com.simplegeo.global.geonames', 'foo')
57
+ }.should raise_exception(SimpleGeo::NotFound)
58
+ end
59
+ end
60
+ end
61
+
62
+ #TODO: verify request data contains correct record data
63
+ context "adding/updating a record" do
64
+ before do
65
+ stub_request :put,
66
+ 'http://api.simplegeo.com/0.1/records/io.path.testlayer/1234.json',
67
+ :status => 202
68
+ end
69
+
70
+ it "should create or update the record" do
71
+ lambda {
72
+ record = SimpleGeo::Record.new({
73
+ :id => '1234',
74
+ :created => 1269832510,
75
+ :lat => 37.759650000000001,
76
+ :lon => -122.42608,
77
+ :layer => 'io.path.testlayer',
78
+ :properties => {
79
+ :test_property => 'foobar'
80
+ }
81
+ })
82
+ SimpleGeo::Client.add_record(record)
83
+ }.should_not raise_exception
84
+ end
85
+ end
86
+
87
+ context "deleting a record" do
88
+ before do
89
+ stub_request :delete,
90
+ 'http://api.simplegeo.com/0.1/records/io.path.testlayer/1234.json',
91
+ :status => 202
92
+ end
93
+
94
+ it "should delete the record" do
95
+ lambda {
96
+ SimpleGeo::Client.delete_record('io.path.testlayer', '1234')
97
+ }.should_not raise_exception
98
+ end
99
+ end
100
+
101
+ context "getting multiple records" do
102
+ context "with ids for two existing records" do
103
+ before do
104
+ stub_request :get,
105
+ 'http://api.simplegeo.com/0.1/records/com.simplegeo.us.business/41531696,41530629.json',
106
+ :fixture_file => 'get_records.json'
107
+ end
108
+
109
+ it "should return an array of records with the correct attributes" do
110
+ records = SimpleGeo::Client.get_records('com.simplegeo.us.business', ['41531696', '41530629'])
111
+ records.size.should == 2
112
+ records[0].id.should == '41530629'
113
+ records[0].type.should == 'place'
114
+ records[0].layer.should == 'com.simplegeo.us.business'
115
+ records[0].created.should == Time.at(1271985142)
116
+ records[0].lat.should == 37.760350000000003
117
+ records[0].lon.should == -122.419043
118
+ records[0].properties.should == {
119
+ :state => "CA",
120
+ :census_block_group => "2",
121
+ :street_type => "St",
122
+ :city => "San Francisco",
123
+ :census_block_id => "002",
124
+ :plus4 => "1811",
125
+ :cbsa => "41860",
126
+ :time_zone => "4",
127
+ :censustract => "020800",
128
+ :pubdate => "2009-12-01",
129
+ :std_name => "Beauty Bar",
130
+ :phone_number => "0323",
131
+ :state_fips => "06",
132
+ :company_sics => [
133
+ {
134
+ :sic => "72310000",
135
+ :industry_class => "7",
136
+ :relevancy => "1",
137
+ :naics_description => "BEAUTY SALONS",
138
+ :naics => "812112",
139
+ :sic_4 => "7231",
140
+ :description => "BEAUTY SHOPS",
141
+ :sic_4_description => "BEAUTY SHOPS"
142
+ },
143
+ {
144
+ :sic => "58130101",
145
+ :industry_class => "5",
146
+ :relevancy => "2",
147
+ :naics_description => "DRINKING PLACES (ALCOHOLIC BEVERAGES)",
148
+ :naics => "72241",
149
+ :sic_4 => "5813",
150
+ :description => "BAR (DRINKING PLACES)",
151
+ :sic_4_description => "DRINKING PLACES"
152
+ },
153
+ {
154
+ :sic => "58120310",
155
+ :industry_class => "5",
156
+ :relevancy => "3",
157
+ :naics_description => "LIMITED-SERVICE RESTAURANTS",
158
+ :naics => "722211",
159
+ :sic_4 => "5812",
160
+ :description => "GRILLS, ( EATING PLACES)",
161
+ :sic_4_description => "EATING PLACES"
162
+ }
163
+ ],
164
+ :dpv_confirm => "Y",
165
+ :zip => "94110",
166
+ :dpc => "996",
167
+ :street_name => "Mission",
168
+ :carrier_route => "C036",
169
+ :area_code => "415",
170
+ :company_headings => [
171
+ {
172
+ :category_name => "Bars, Taverns & Cocktail Lounges",
173
+ :condensed_name => "BARS GRILLS & PUBS",
174
+ :normalized_id => "138001000",
175
+ :category_id => "138000000",
176
+ :normalized_name => "BARS GRILLS & PUBS",
177
+ :condensed_id => "138001000"
178
+ }
179
+ ],
180
+ :mlsc => "4",
181
+ :val_date => "2010-03-22",
182
+ :confidence_score => "100",
183
+ :exppubcity => "San Francisco",
184
+ :housenumber => "2299",
185
+ :z4_type => "S",
186
+ :exchange => "285",
187
+ :business_name => "Beauty Bar",
188
+ :county_fips => "075",
189
+ :ll_match_level => "R",
190
+ :dso => "1",
191
+ :company_phones => [
192
+ {
193
+ :val_flag => "C",
194
+ :val_date => "2010-03-22",
195
+ :phone_type => "P",
196
+ :dnc => "",
197
+ :exchange => "285",
198
+ :phone_number => "0323",
199
+ :areacode => "415"
200
+ }
201
+ ],
202
+ :msa => "7360",
203
+ :val_flag => "C"
204
+ }
205
+ records[1].id.should == '41531696'
206
+ records[1].type.should == 'place'
207
+ records[1].layer.should == 'com.simplegeo.us.business'
208
+ records[1].created.should == Time.at(1271985146)
209
+ records[1].lat.should == 37.755470000000003
210
+ records[1].lon.should == -122.420646
211
+ records[1].properties.should == {
212
+ :carrier_route => "C010",
213
+ :pubdate => "2009-12-01",
214
+ :ll_match_level => "R",
215
+ :street_name => "22nd",
216
+ :std_name => "Latin American Club",
217
+ :val_flag => "C",
218
+ :census_block_id => "004",
219
+ :company_headings => [
220
+ {
221
+ :normalized_id => "138004000",
222
+ :condensed_name => "NIGHT CLUBS",
223
+ :condensed_id => "138004000",
224
+ :normalized_name => "NIGHT CLUBS",
225
+ :category_id => "138000000",
226
+ :category_name => "Bars, Taverns & Cocktail Lounges"
227
+ }
228
+ ],
229
+ :company_sics => [
230
+ {
231
+ :sic_4 => "5813",
232
+ :relevancy => "1",
233
+ :description => "NIGHT CLUBS",
234
+ :naics => "72241",
235
+ :sic => "58130200",
236
+ :industry_class => "5",
237
+ :sic_4_description => "DRINKING PLACES",
238
+ :naics_description => "DRINKING PLACES (ALCOHOLIC BEVERAGES)"
239
+ }
240
+ ],
241
+ :city => "San Francisco",
242
+ :county_fips => "075",
243
+ :zip => "94110",
244
+ :mlsc => "4",
245
+ :dso => "1",
246
+ :state => "CA",
247
+ :dpv_confirm => "Y",
248
+ :housenumber => "3286",
249
+ :msa => "7360",
250
+ :phone_number => "2732",
251
+ :exchange => "647",
252
+ :area_code => "415",
253
+ :censustract => "020800",
254
+ :state_fips => "06",
255
+ :street_type => "St",
256
+ :business_name => "Latin American Club",
257
+ :plus4 => "3033",
258
+ :val_date => "2010-03-22",
259
+ :dnc => "T",
260
+ :confidence_score => "100",
261
+ :time_zone => "4",
262
+ :cbsa => "41860",
263
+ :dpc => "862",
264
+ :company_phones => [
265
+ {
266
+ :phone_number => "2732",
267
+ :phone_type => "P",
268
+ :val_date => "2010-03-22",
269
+ :dnc => "T",
270
+ :exchange => "647",
271
+ :areacode => "415",
272
+ :val_flag => "C"
273
+ }
274
+ ],
275
+ :census_block_group => "4",
276
+ :z4_type => "S"
277
+ }
278
+ end
279
+ end
280
+
281
+ context "with ids for nonexistant records" do
282
+ before do
283
+ stub_request :get,
284
+ 'http://api.simplegeo.com/0.1/records/com.simplegeo.global.geonames/foo,bar.json',
285
+ :fixture_file => 'nonetype_not_iterable.json', :status => 500
286
+ end
287
+
288
+ it "should raise a NotFound exception" do
289
+ lambda {
290
+ SimpleGeo::Client.get_records('com.simplegeo.global.geonames', ['foo', 'bar'])
291
+ }.should raise_exception(SimpleGeo::ServerError)
292
+ end
293
+ end
294
+ end
295
+
296
+ context "adding multiple records" do
297
+ before do
298
+ stub_request :post,
299
+ 'http://api.simplegeo.com/0.1/records/io.path.testlayer.json',
300
+ :status => 202
301
+ end
302
+
303
+ it "should create or update the record" do
304
+ layer = 'io.path.testlayer'
305
+ lambda {
306
+ records = [
307
+ SimpleGeo::Record.new({
308
+ :id => '1234',
309
+ :created => 1269832510,
310
+ :lat => 37.759650000000001,
311
+ :lon => -122.42608,
312
+ :layer => layer,
313
+ :properties => {
314
+ :test_property => 'foobar'
315
+ }
316
+ }),
317
+ SimpleGeo::Record.new({
318
+ :id => '5678',
319
+ :created => 1269832510,
320
+ :lat => 37.755470000000003,
321
+ :lon => -122.420646,
322
+ :layer => layer,
323
+ :properties => {
324
+ :mad_prop => 'baz'
325
+ }
326
+ })
327
+ ]
328
+ SimpleGeo::Client.add_records(layer, records)
329
+ }.should_not raise_exception
330
+ end
331
+ end
332
+
333
+ context "getting a record's history" do
334
+ before do
335
+ stub_request :get,
336
+ 'http://api.simplegeo.com/0.1/records/com.simplegeo.global.geonames/5373629/history.json',
337
+ :fixture_file => 'get_history.json'
338
+ end
339
+
340
+ it "should create or update the record" do
341
+ history = SimpleGeo::Client.get_history('com.simplegeo.global.geonames', '5373629')
342
+ history.should == [
343
+ {
344
+ :created => Time.at(1269832510),
345
+ :lat => 37.759650000000001,
346
+ :lon => -122.42608
347
+ }
348
+ ]
349
+ end
350
+ end
351
+
352
+ context "getting nearby records" do
353
+ before do
354
+ @expected_records = {
355
+ :next_cursor => "QVSEifz7gri4J0w8FSQJ06Z5S5lOw6gZ75Co-fBbBQJEr7XMqN32bjMKNc9kwLKqKyqtVvxR_t5hgWW6XDgPnPTY",
356
+ :records => [
357
+ {
358
+ :distance => 0,
359
+ :record => SimpleGeo::Record.new(
360
+ :id => "5373629",
361
+ :lon => -122.42608,
362
+ :lat => 37.75965,
363
+ :type => "place",
364
+ :layer => "com.simplegeo.global.geonames",
365
+ :created => Time.at(1269832510),
366
+ :properties => {
367
+ :admin4 => "",
368
+ :feature_code => "PRK",
369
+ :feature_class => "L",
370
+ :last_modified => "2006-01-15",
371
+ :asciiname => "Mission Dolores Park",
372
+ :cc2 => "",
373
+ :country_code => "US",
374
+ :admin1 => "CA",
375
+ :alternatenames => "",
376
+ :admin3 => "",
377
+ :elevation => "22",
378
+ :layer => "com.simplegeo.global.geonames",
379
+ :timezone => "America/Los_Angeles",
380
+ :name => "Mission Dolores Park",
381
+ :gtopo30 => "60",
382
+ :admin2 => "075",
383
+ :population => "0"
384
+ }
385
+ )
386
+ },
387
+ {
388
+ :distance => 57.557068918956581,
389
+ :record => SimpleGeo::Record.new(
390
+ :id => "5352852",
391
+ :lon => -122.42553,
392
+ :lat => 37.75937,
393
+ :type => "place",
394
+ :layer => "com.simplegeo.global.geonames",
395
+ :created => Time.at(1269832039),
396
+ :properties => {
397
+ :admin4 => "",
398
+ :feature_code => "CH",
399
+ :feature_class => "S",
400
+ :last_modified => "2006-01-15",
401
+ :asciiname => "Golden Gate Lutheran Church",
402
+ :cc2 => "",
403
+ :country_code => "US",
404
+ :admin1 => "CA",
405
+ :alternatenames => "",
406
+ :admin3 => "",
407
+ :elevation => "23",
408
+ :layer => "com.simplegeo.global.geonames",
409
+ :timezone => "America/Los_Angeles",
410
+ :name=> "Golden Gate Lutheran Church",
411
+ :gtopo30 => "60",
412
+ :admin2 => "075",
413
+ :population => "0"
414
+ }
415
+ )
416
+ }
417
+ ]
418
+ }
419
+ end
420
+
421
+ context "by lat and lon" do
422
+ before do
423
+ stub_request :get,
424
+ 'http://api.simplegeo.com/0.1/records/com.simplegeo.global.geonames/nearby/37.75965,-122.42608.json',
425
+ :fixture_file => 'get_nearby.json'
426
+ end
427
+
428
+ it "should return a hash of nearby records" do
429
+ records = SimpleGeo::Client.get_nearby_records('com.simplegeo.global.geonames',
430
+ :lat => 37.759650000000001,
431
+ :lon => -122.42608)
432
+ records.should == @expected_records
433
+ end
434
+ end
435
+
436
+ context "by geohash" do
437
+ before do
438
+ stub_request :get,
439
+ 'http://api.simplegeo.com/0.1/records/com.simplegeo.global.geonames/nearby/9q8yy1ujcsfm.json',
440
+ :fixture_file => 'get_nearby.json'
441
+ end
442
+
443
+ it "should return a hash of nearby records" do
444
+ records = SimpleGeo::Client.get_nearby_records('com.simplegeo.global.geonames',
445
+ :geohash => '9q8yy1ujcsfm')
446
+ records.should == @expected_records
447
+ end
448
+ end
449
+ end
450
+
451
+ context "getting a nearby address" do
452
+ before do
453
+ stub_request :get,
454
+ 'http://api.simplegeo.com/0.1/nearby/address/37.75965,-122.42608.json',
455
+ :fixture_file => 'nearby_address.json'
456
+ end
457
+
458
+ it "should return a hash with the address information" do
459
+ nearby_address = SimpleGeo::Client.get_nearby_address(37.759650000000001, -122.42608)
460
+ nearby_address.should == {
461
+ :state_name => "California",
462
+ :street_number => "580",
463
+ :country => "US",
464
+ :street => "Dolores St",
465
+ :postal_code => "",
466
+ :county_name => "San Francisco",
467
+ :county_code => "075",
468
+ :state_code => "CA",
469
+ :place_name => "San Francisco"
470
+ }
471
+ end
472
+ end
473
+
474
+ context "getting layer information" do
475
+ context "for an existing layer" do
476
+ before do
477
+ stub_request :get,
478
+ 'http://api.simplegeo.com/0.1/layer/io.path.testlayer.json',
479
+ :fixture_file => 'layer_info.json'
480
+ end
481
+
482
+ it "should return a hash containing the layer information" do
483
+ layer_info = SimpleGeo::Client.get_layer_information('io.path.testlayer')
484
+ layer_info.should == {
485
+ :name => "io.path.testlayer",
486
+ :public => false,
487
+ :callback_urls => []
488
+ }
489
+ end
490
+ end
491
+
492
+ context "for a nonexistant layer" do
493
+ before do
494
+ stub_request :get,
495
+ 'http://api.simplegeo.com/0.1/layer/io.path.testlayer.json',
496
+ :status => 404
497
+ end
498
+
499
+ it "should raise a NotFound exception" do
500
+ lambda {
501
+ SimpleGeo::Client.get_layer_information('io.path.testlayer')
502
+ }.should raise_exception(SimpleGeo::NotFound)
503
+ end
504
+ end
505
+ end
506
+
507
+ context "getting SpotRank information for a day, hour and location" do
508
+ before do
509
+ stub_request :get,
510
+ 'http://api.simplegeo.com/0.1/density/sat/16/37.75965,-122.42608.json',
511
+ :fixture_file => 'get_density_by_hour.json'
512
+ end
513
+
514
+ it "should return a hash containing the density information" do
515
+ density_info = SimpleGeo::Client.get_density(37.75965, -122.42608, 'sat', '16' )
516
+ density_info.should == {
517
+ :city_rank => 10,
518
+ :local_rank => 8,
519
+ :trending_rank => 0,
520
+ :dayname => "sat",
521
+ :hour => 16,
522
+ :worldwide_rank => 8,
523
+ :geometry => {
524
+ :type => "Polygon",
525
+ :coordinates => [
526
+ [ 37.7587890625, -122.4267578125 ],
527
+ [ 37.759765625, -122.4267578125 ],
528
+ [ 37.759765625, -122.42578125 ],
529
+ [ 37.7587890625, -122.42578125 ],
530
+ [ 37.7587890625, -122.4267578125 ]
531
+ ]
532
+ }
533
+ }
534
+ end
535
+ end
536
+
537
+ context "getting SpotRank information for a day and location" do
538
+ before do
539
+ stub_request :get,
540
+ 'http://api.simplegeo.com/0.1/density/sat/37.75965,-122.42608.json',
541
+ :fixture_file => 'get_density_by_day.json'
542
+ end
543
+
544
+ it "should return an array of hashes containing the density information" do
545
+ density_info = SimpleGeo::Client.get_density(37.75965, -122.42608, 'sat')
546
+ density_info.should == [
547
+ {
548
+ :geometry => {
549
+ :type => "Polygon",
550
+ :coordinates => [
551
+ [ 37.7587890625, -122.4267578125 ],
552
+ [ 37.759765625, -122.4267578125 ],
553
+ [ 37.759765625, -122.42578125 ],
554
+ [ 37.7587890625, -122.42578125 ],
555
+ [ 37.7587890625, -122.4267578125 ]
556
+ ]
557
+ },
558
+ :hour => 0,
559
+ :trending_rank => 2,
560
+ :local_rank => 4,
561
+ :city_rank => 10,
562
+ :worldwide_rank => 4,
563
+ :dayname => "sat"
564
+ },
565
+ {
566
+ :geometry => {
567
+ :type => "Polygon",
568
+ :coordinates => [
569
+ [ 37.7587890625, -122.4267578125 ],
570
+ [ 37.759765625, -122.4267578125 ],
571
+ [ 37.759765625, -122.42578125 ],
572
+ [ 37.7587890625, -122.42578125 ],
573
+ [ 37.7587890625, -122.4267578125 ]
574
+ ]
575
+ },
576
+ :hour => 1,
577
+ :trending_rank => -2,
578
+ :local_rank => 6,
579
+ :city_rank => 10,
580
+ :worldwide_rank => 6,
581
+ :dayname => "sat"
582
+ },
583
+ {
584
+ :geometry => {
585
+ :type => "Polygon",
586
+ :coordinates => [
587
+ [ 37.7587890625, -122.4267578125 ],
588
+ [ 37.759765625, -122.4267578125 ],
589
+ [ 37.759765625, -122.42578125 ],
590
+ [ 37.7587890625, -122.42578125 ],
591
+ [ 37.7587890625, -122.4267578125 ]
592
+ ]
593
+ },
594
+ :hour => 2,
595
+ :trending_rank => 2,
596
+ :local_rank => 2,
597
+ :city_rank => 10,
598
+ :worldwide_rank => 2,
599
+ :dayname => "sat"
600
+ },
601
+ {
602
+ :geometry => {
603
+ :type => "Polygon",
604
+ :coordinates => [
605
+ [ 37.7587890625, -122.4267578125 ],
606
+ [ 37.759765625, -122.4267578125 ],
607
+ [ 37.759765625, -122.42578125 ],
608
+ [ 37.7587890625, -122.42578125 ],
609
+ [ 37.7587890625, -122.4267578125 ]
610
+ ]
611
+ },
612
+ :hour => 3,
613
+ :trending_rank => -2,
614
+ :local_rank => 6,
615
+ :city_rank => 10,
616
+ :worldwide_rank => 6,
617
+ :dayname => "sat"
618
+ },
619
+ {
620
+ :geometry => {
621
+ :type => "Polygon",
622
+ :coordinates => [
623
+ [ 37.7587890625, -122.4267578125 ],
624
+ [ 37.759765625, -122.4267578125 ],
625
+ [ 37.759765625, -122.42578125 ],
626
+ [ 37.7587890625, -122.42578125 ],
627
+ [ 37.7587890625, -122.4267578125 ]
628
+ ]
629
+ },
630
+ :hour => 4,
631
+ :trending_rank => -2,
632
+ :local_rank => 4,
633
+ :city_rank => 10,
634
+ :worldwide_rank => 4,
635
+ :dayname => "sat"
636
+ },
637
+ {
638
+ :geometry => {
639
+ :type => "Polygon",
640
+ :coordinates => [
641
+ [ 37.7587890625, -122.4267578125 ],
642
+ [ 37.759765625, -122.4267578125 ],
643
+ [ 37.759765625, -122.42578125 ],
644
+ [ 37.7587890625, -122.42578125 ],
645
+ [ 37.7587890625, -122.4267578125 ]
646
+ ]
647
+ },
648
+ :hour => 6,
649
+ :trending_rank => 2,
650
+ :local_rank => 2,
651
+ :city_rank => 10,
652
+ :worldwide_rank => 2,
653
+ :dayname => "sat"
654
+ },
655
+ {
656
+ :geometry => {
657
+ :type => "Polygon",
658
+ :coordinates => [
659
+ [ 37.7587890625, -122.4267578125 ],
660
+ [ 37.759765625, -122.4267578125 ],
661
+ [ 37.759765625, -122.42578125 ],
662
+ [ 37.7587890625, -122.42578125 ],
663
+ [ 37.7587890625, -122.4267578125 ]
664
+ ]
665
+ },
666
+ :hour => 7,
667
+ :trending_rank => 1,
668
+ :local_rank => 5,
669
+ :city_rank => 10,
670
+ :worldwide_rank => 5,
671
+ :dayname => "sat"
672
+ },
673
+ {
674
+ :geometry => {
675
+ :type => "Polygon",
676
+ :coordinates => [
677
+ [ 37.7587890625, -122.4267578125 ],
678
+ [ 37.759765625, -122.4267578125 ],
679
+ [ 37.759765625, -122.42578125 ],
680
+ [ 37.7587890625, -122.42578125 ],
681
+ [ 37.7587890625, -122.4267578125 ]
682
+ ]
683
+ },
684
+ :hour => 8,
685
+ :trending_rank => 0,
686
+ :local_rank => 6,
687
+ :city_rank => 10,
688
+ :worldwide_rank => 6,
689
+ :dayname => "sat"
690
+ },
691
+ {
692
+ :geometry => {
693
+ :type => "Polygon",
694
+ :coordinates => [
695
+ [ 37.7587890625, -122.4267578125 ],
696
+ [ 37.759765625, -122.4267578125 ],
697
+ [ 37.759765625, -122.42578125 ],
698
+ [ 37.7587890625, -122.42578125 ],
699
+ [ 37.7587890625, -122.4267578125 ]
700
+ ]
701
+ },
702
+ :hour => 9,
703
+ :trending_rank => 0,
704
+ :local_rank => 6,
705
+ :city_rank => 10,
706
+ :worldwide_rank => 6,
707
+ :dayname => "sat"
708
+ },
709
+ {
710
+ :geometry => {
711
+ :type => "Polygon",
712
+ :coordinates => [
713
+ [ 37.7587890625, -122.4267578125 ],
714
+ [ 37.759765625, -122.4267578125 ],
715
+ [ 37.759765625, -122.42578125 ],
716
+ [ 37.7587890625, -122.42578125 ],
717
+ [ 37.7587890625, -122.4267578125 ]
718
+ ]
719
+ },
720
+ :hour => 10,
721
+ :trending_rank => 2,
722
+ :local_rank => 6,
723
+ :city_rank => 10,
724
+ :worldwide_rank => 6,
725
+ :dayname => "sat"
726
+ },
727
+ {
728
+ :geometry => {
729
+ :type => "Polygon",
730
+ :coordinates => [
731
+ [ 37.7587890625, -122.4267578125 ],
732
+ [ 37.759765625, -122.4267578125 ],
733
+ [ 37.759765625, -122.42578125 ],
734
+ [ 37.7587890625, -122.42578125 ],
735
+ [ 37.7587890625, -122.4267578125 ]
736
+ ]
737
+ },
738
+ :hour => 11,
739
+ :trending_rank => -1,
740
+ :local_rank => 8,
741
+ :city_rank => 10,
742
+ :worldwide_rank => 8,
743
+ :dayname => "sat"
744
+ },
745
+ {
746
+ :geometry => {
747
+ :type => "Polygon",
748
+ :coordinates => [
749
+ [ 37.7587890625, -122.4267578125 ],
750
+ [ 37.759765625, -122.4267578125 ],
751
+ [ 37.759765625, -122.42578125 ],
752
+ [ 37.7587890625, -122.42578125 ],
753
+ [ 37.7587890625, -122.4267578125 ]
754
+ ]
755
+ },
756
+ :hour => 12,
757
+ :trending_rank => 1,
758
+ :local_rank => 7,
759
+ :city_rank => 10,
760
+ :worldwide_rank => 7,
761
+ :dayname => "sat"
762
+ },
763
+ {
764
+ :geometry => {
765
+ :type => "Polygon",
766
+ :coordinates => [
767
+ [ 37.7587890625, -122.4267578125 ],
768
+ [ 37.759765625, -122.4267578125 ],
769
+ [ 37.759765625, -122.42578125 ],
770
+ [ 37.7587890625, -122.42578125 ],
771
+ [ 37.7587890625, -122.4267578125 ]
772
+ ]
773
+ },
774
+ :hour => 13,
775
+ :trending_rank => 0,
776
+ :local_rank => 8,
777
+ :city_rank => 10,
778
+ :worldwide_rank => 8,
779
+ :dayname => "sat"
780
+ },
781
+ {
782
+ :geometry => {
783
+ :type => "Polygon",
784
+ :coordinates => [
785
+ [ 37.7587890625, -122.4267578125 ],
786
+ [ 37.759765625, -122.4267578125 ],
787
+ [ 37.759765625, -122.42578125 ],
788
+ [ 37.7587890625, -122.42578125 ],
789
+ [ 37.7587890625, -122.4267578125 ]
790
+ ]
791
+ },
792
+ :hour => 14,
793
+ :trending_rank => 0,
794
+ :local_rank => 8,
795
+ :city_rank => 10,
796
+ :worldwide_rank => 8,
797
+ :dayname => "sat"
798
+ },
799
+ {
800
+ :geometry => {
801
+ :type => "Polygon",
802
+ :coordinates => [
803
+ [ 37.7587890625, -122.4267578125 ],
804
+ [ 37.759765625, -122.4267578125 ],
805
+ [ 37.759765625, -122.42578125 ],
806
+ [ 37.7587890625, -122.42578125 ],
807
+ [ 37.7587890625, -122.4267578125 ]
808
+ ]
809
+ },
810
+ :hour => 15,
811
+ :trending_rank => 0,
812
+ :local_rank => 8,
813
+ :city_rank => 10,
814
+ :worldwide_rank => 8,
815
+ :dayname => "sat"
816
+ },
817
+ {
818
+ :geometry => {
819
+ :type => "Polygon",
820
+ :coordinates => [
821
+ [ 37.7587890625, -122.4267578125 ],
822
+ [ 37.759765625, -122.4267578125 ],
823
+ [ 37.759765625, -122.42578125 ],
824
+ [ 37.7587890625, -122.42578125 ],
825
+ [ 37.7587890625, -122.4267578125 ]
826
+ ]
827
+ },
828
+ :hour => 16,
829
+ :trending_rank => 0,
830
+ :local_rank => 8,
831
+ :city_rank => 10,
832
+ :worldwide_rank => 8,
833
+ :dayname => "sat"
834
+ },
835
+ {
836
+ :geometry => {
837
+ :type => "Polygon",
838
+ :coordinates => [
839
+ [ 37.7587890625, -122.4267578125 ],
840
+ [ 37.759765625, -122.4267578125 ],
841
+ [ 37.759765625, -122.42578125 ],
842
+ [ 37.7587890625, -122.42578125 ],
843
+ [ 37.7587890625, -122.4267578125 ]
844
+ ]
845
+ },
846
+ :hour => 17,
847
+ :trending_rank => 0,
848
+ :local_rank => 8,
849
+ :city_rank => 10,
850
+ :worldwide_rank => 8,
851
+ :dayname => "sat"
852
+ },
853
+ {
854
+ :geometry => {
855
+ :type => "Polygon",
856
+ :coordinates => [
857
+ [ 37.7587890625, -122.4267578125 ],
858
+ [ 37.759765625, -122.4267578125 ],
859
+ [ 37.759765625, -122.42578125 ],
860
+ [ 37.7587890625, -122.42578125 ],
861
+ [ 37.7587890625, -122.4267578125 ]
862
+ ]
863
+ },
864
+ :hour => 18,
865
+ :trending_rank => 0,
866
+ :local_rank => 8,
867
+ :city_rank => 10,
868
+ :worldwide_rank => 8,
869
+ :dayname => "sat"
870
+ },
871
+ {
872
+ :geometry => {
873
+ :type => "Polygon",
874
+ :coordinates => [
875
+ [ 37.7587890625, -122.4267578125 ],
876
+ [ 37.759765625, -122.4267578125 ],
877
+ [ 37.759765625, -122.42578125 ],
878
+ [ 37.7587890625, -122.42578125 ],
879
+ [ 37.7587890625, -122.4267578125 ]
880
+ ]
881
+ },
882
+ :hour => 19,
883
+ :trending_rank => 0,
884
+ :local_rank => 8,
885
+ :city_rank => 10,
886
+ :worldwide_rank => 8,
887
+ :dayname => "sat"
888
+ },
889
+ {
890
+ :geometry => {
891
+ :type => "Polygon",
892
+ :coordinates => [
893
+ [ 37.7587890625, -122.4267578125 ],
894
+ [ 37.759765625, -122.4267578125 ],
895
+ [ 37.759765625, -122.42578125 ],
896
+ [ 37.7587890625, -122.42578125 ],
897
+ [ 37.7587890625, -122.4267578125 ]
898
+ ]
899
+ },
900
+ :hour => 20,
901
+ :trending_rank => 0,
902
+ :local_rank => 8,
903
+ :city_rank => 10,
904
+ :worldwide_rank => 8,
905
+ :dayname => "sat"
906
+ },
907
+ {
908
+ :geometry => {
909
+ :type => "Polygon",
910
+ :coordinates => [
911
+ [ 37.7587890625, -122.4267578125 ],
912
+ [ 37.759765625, -122.4267578125 ],
913
+ [ 37.759765625, -122.42578125 ],
914
+ [ 37.7587890625, -122.42578125 ],
915
+ [ 37.7587890625, -122.4267578125 ]
916
+ ]
917
+ },
918
+ :hour => 21,
919
+ :trending_rank => -2,
920
+ :local_rank => 8,
921
+ :city_rank => 10,
922
+ :worldwide_rank => 8,
923
+ :dayname => "sat"
924
+ },
925
+ {
926
+ :geometry => {
927
+ :type => "Polygon",
928
+ :coordinates => [
929
+ [ 37.7587890625, -122.4267578125 ],
930
+ [ 37.759765625, -122.4267578125 ],
931
+ [ 37.759765625, -122.42578125 ],
932
+ [ 37.7587890625, -122.42578125 ],
933
+ [ 37.7587890625, -122.4267578125 ]
934
+ ]
935
+ },
936
+ :hour => 22,
937
+ :trending_rank => 0,
938
+ :local_rank => 5,
939
+ :city_rank => 10,
940
+ :worldwide_rank => 6,
941
+ :dayname => "sat"
942
+ },
943
+ {
944
+ :geometry => {
945
+ :type => "Polygon",
946
+ :coordinates => [
947
+ [ 37.7587890625, -122.4267578125 ],
948
+ [ 37.759765625, -122.4267578125 ],
949
+ [ 37.759765625, -122.42578125 ],
950
+ [ 37.7587890625, -122.42578125 ],
951
+ [ 37.7587890625, -122.4267578125 ]
952
+ ]
953
+ },
954
+ :hour => 23,
955
+ :trending_rank => 1,
956
+ :local_rank => 5,
957
+ :city_rank => 10,
958
+ :worldwide_rank => 5,
959
+ :dayname => "sat"
960
+ }
961
+ ]
962
+ end
963
+ end
964
+
965
+ context "getting contains info for a set of coordinates" do
966
+ before do
967
+ stub_request :get,
968
+ 'http://api.simplegeo.com/0.1/contains/37.7587890625,-122.4267578125.json',
969
+ :fixture_file => 'contains.json'
970
+ end
971
+
972
+ it "should return a hash with the correct info" do
973
+ info = SimpleGeo::Client.get_contains(37.7587890625, -122.4267578125)
974
+ info.should == [
975
+ {
976
+ :bounds =>
977
+ [
978
+ -122.435188,
979
+ 37.756093,
980
+ -122.42555,
981
+ 37.763030999999998
982
+ ],
983
+ :type => "Census Tract",
984
+ :id => "Census_Tract:06075020600:9q8yy1",
985
+ :abbr => "",
986
+ :name => "06075020600"
987
+ },
988
+ {
989
+ :bounds =>
990
+ [
991
+ -123.17382499999999,
992
+ 37.639829999999996,
993
+ -122.28178,
994
+ 37.929823999999996
995
+ ],
996
+ :type => "County",
997
+ :id => "County:San_Francisco:9q8yvv",
998
+ :abbr => "",
999
+ :name => "San Francisco"
1000
+ },
1001
+ {
1002
+ :bounds =>
1003
+ [
1004
+ -123.17382499999999,
1005
+ 37.639829999999996,
1006
+ -122.28178,
1007
+ 37.929823999999996
1008
+ ],
1009
+ :type => "City",
1010
+ :id => "City:San_Francisco:9q8yvv",
1011
+ :abbr => "",
1012
+ :name => "San Francisco"
1013
+ },
1014
+ {
1015
+ :bounds =>
1016
+ [
1017
+ -122.612285,
1018
+ 37.708131000000002,
1019
+ -122.28178,
1020
+ 37.929823999999996
1021
+ ],
1022
+ :type => "Congressional District",
1023
+ :id => "Congressional_District:Congressional_Di:9q8yyn",
1024
+ :abbr => "",
1025
+ :name => "Congressional District 8"
1026
+ },
1027
+ {
1028
+ :bounds =>
1029
+ [
1030
+ -179.14247147726383,
1031
+ 18.930137634111077,
1032
+ 179.78114994357418,
1033
+ 71.412179667308919
1034
+ ],
1035
+ :type => "Country",
1036
+ :id => "Country:United_States_of:9z12zg",
1037
+ :abbr => "",
1038
+ :name => "United States of America"
1039
+ },
1040
+ {
1041
+ :bounds =>
1042
+ [
1043
+ -122.428882,
1044
+ 37.758029999999998,
1045
+ -122.42138199999999,
1046
+ 37.772263000000002
1047
+ ],
1048
+ :type => "Neighborhood",
1049
+ :id => "Neighborhood:Mission_Dolores:9q8yy4",
1050
+ :abbr => "",
1051
+ :name => "Mission Dolores"
1052
+ },
1053
+ {
1054
+ :bounds =>
1055
+ [
1056
+ -122.51666666668193,
1057
+ 37.191666666628507,
1058
+ -121.73333333334497,
1059
+ 38.041666666640907
1060
+ ],
1061
+ :type => "Urban Area",
1062
+ :id => "Urban_Area:San_Francisco1:9q9jsg",
1063
+ :abbr => "",
1064
+ :name => "San Francisco1"
1065
+ },
1066
+ {
1067
+ :bounds =>
1068
+ [
1069
+ -122.451553,
1070
+ 37.746687000000001,
1071
+ -122.424773,
1072
+ 37.770451999999999
1073
+ ],
1074
+ :type => "Postal",
1075
+ :id => "Postal:94114:9q8yvc",
1076
+ :abbr => "",
1077
+ :name => "94114"
1078
+ },
1079
+ {
1080
+ :bounds =>
1081
+ [
1082
+ -124.48200299999999,
1083
+ 32.528832000000001,
1084
+ -114.13121099999999,
1085
+ 42.009516999999995
1086
+ ],
1087
+ :type => "Province",
1088
+ :id => "Province:CA:9qdguu",
1089
+ :abbr => "CA",
1090
+ :name => "California"
1091
+ }
1092
+ ]
1093
+ end
1094
+ end
1095
+
1096
+ context "getting overlaps info for a set of coordinates" do
1097
+ before do
1098
+ stub_request :get,
1099
+ 'http://api.simplegeo.com/0.1/overlaps/32.528832,-124.482003,42.009517,-114.131211.json',
1100
+ :fixture_file => 'overlaps.json'
1101
+ end
1102
+
1103
+ it "should return a hash with the correct info" do
1104
+ info = SimpleGeo::Client.get_overlaps(32.528832000000001, -124.48200299999999,
1105
+ 42.009516999999995, -114.13121099999999)
1106
+ info.should == [
1107
+ {
1108
+ :bounds =>
1109
+ [
1110
+ -122.998802,
1111
+ 42.002634,
1112
+ -122.597843,
1113
+ 42.266379000000001
1114
+ ],
1115
+ :type => "Census Tract",
1116
+ :id => "Census_Tract:41029002300:9r2xt4",
1117
+ :abbr => "",
1118
+ :name => "41029002300"
1119
+ },
1120
+ {
1121
+ :bounds =>
1122
+ [
1123
+ -123.858086,
1124
+ 41.995095999999997,
1125
+ -123.22998200000001,
1126
+ 42.272435999999999
1127
+ ],
1128
+ :type => "Census Tract",
1129
+ :id => "Census_Tract:41033361600:9r2psc",
1130
+ :abbr => "",
1131
+ :name => "41033361600"
1132
+ },
1133
+ {
1134
+ :bounds =>
1135
+ [
1136
+ -123.231629,
1137
+ 42.003022000000001,
1138
+ -122.907515,
1139
+ 42.433349
1140
+ ],
1141
+ :type => "Census Tract",
1142
+ :id => "Census_Tract:41029003002:9r2ryf",
1143
+ :abbr => "",
1144
+ :name => "41029003002"
1145
+ }
1146
+ ]
1147
+ end
1148
+ end
1149
+
1150
+ # this API call seems to always return a 404
1151
+ # context "getting boundary info by id" do
1152
+ # before do
1153
+ # stub_request :get,
1154
+ # 'http://api.simplegeo.com/0.1/boundary/Neighborhood:Mission_Dolores:9q8yy4.json',
1155
+ # :fixture_file => 'boundary.json'
1156
+ # end
1157
+ #
1158
+ # it "should return a hash with the correct info" do
1159
+ # info = SimpleGeo::Client.get_boundary("Neighborhood:Mission_Dolores:9q8yy4")
1160
+ # info.should == [
1161
+ #
1162
+ # ]
1163
+ # end
1164
+ # end
1165
+ end