census_api 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/README.md +119 -92
- data/lib/census_api/client.rb +21 -10
- data/lib/census_api/request.rb +38 -35
- data/lib/census_api/version.rb +1 -1
- data/lib/census_api.rb +1 -3
- data/spec/census_api/client_spec.rb +34 -18
- data/spec/census_api/request_spec.rb +1 -1
- data/spec/vcr_setup.rb +1 -1
- metadata +2 -2
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -6,7 +6,9 @@ This gem provides a Ruby wrapper around the Census Bureau API.
|
|
6
6
|
## Obtaining an API key
|
7
7
|
|
8
8
|
To be able to use this gem, you'll need a Census Bureau API key. To request an API key, visit
|
9
|
-
http://www.census.gov/developers/tos/key_request.html and follow the instructions.
|
9
|
+
[http://www.census.gov/developers/tos/key_request.html][key] and follow the instructions.
|
10
|
+
|
11
|
+
[key]: (http://www.census.gov/developers/tos/key_request.html)
|
10
12
|
|
11
13
|
|
12
14
|
## Installing the gem
|
@@ -17,21 +19,46 @@ To use this gem, install it with <tt>gem install census_api</tt> or add it to yo
|
|
17
19
|
|
18
20
|
And install it with <tt>bundle install</tt>
|
19
21
|
|
20
|
-
## Usage
|
22
|
+
## Usage / Retrieving Census Data
|
23
|
+
|
24
|
+
### (Optional) Set the API key as an environment variable
|
25
|
+
|
26
|
+
Once you have the API key, you may want to store it as an environment variable.
|
27
|
+
|
28
|
+
```sh
|
29
|
+
$ export $CENSUS_API_KEY='your-api-key'
|
30
|
+
```
|
21
31
|
|
22
|
-
###
|
32
|
+
### Register a New Client
|
23
33
|
|
24
|
-
|
34
|
+
```ruby
|
35
|
+
@client = CensusApi::Client.new(API_KEY)
|
36
|
+
@client = CensusApi::Client.new(ENV['CENSUS_API_KEY']) # from the environment variable
|
37
|
+
@client = CensusApi::Client.new(API_KEY, dataset: 'SF1') # with a dataset
|
38
|
+
```
|
25
39
|
|
26
|
-
|
40
|
+
### Query a Dataset
|
27
41
|
|
28
|
-
To query the 2010 Census SF1 dataset:
|
42
|
+
To query the 2010 Census SF1 dataset, first set the dataset to 'SF1':
|
29
43
|
|
30
|
-
|
44
|
+
```ruby
|
45
|
+
@client = CensusApi::Client.new(API_KEY, dataset: 'SF1') # with a dataset # during intialization
|
46
|
+
@client.dataset = 'SF1' # or after initialization, setting the instance variable
|
47
|
+
```
|
31
48
|
|
32
|
-
To query the 2006-2010 ACS5 dataset:
|
49
|
+
To query the 2006-2010 ACS5 dataset, set the dataset to 'ACS5':
|
33
50
|
|
34
|
-
|
51
|
+
```ruby
|
52
|
+
@client = CensusApi::Client.new(API_KEY, dataset: 'ACS5') # with a dataset # during intialization
|
53
|
+
@client.dataset = 'ACS5' # or after initialization, setting the instance variable
|
54
|
+
```
|
55
|
+
|
56
|
+
Then, use `Client#find` with the below parameters to query for Census data. For example:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
@client.find('P0010001', 'STATE:02,06')
|
60
|
+
|
61
|
+
```
|
35
62
|
|
36
63
|
For a list of the fields available for each dataset, review the reference PDFs linked at the bottom of this document.
|
37
64
|
|
@@ -55,39 +82,39 @@ The 'in' parameter is optional, or required, depending upon the geography type.
|
|
55
82
|
|
56
83
|
Retrieve fields for all States:
|
57
84
|
|
58
|
-
`@client.
|
85
|
+
`@client.find('P0010001', 'STATE')`
|
59
86
|
|
60
87
|
Retrieve fields for California (geoid: 06):
|
61
88
|
|
62
|
-
`@client.
|
89
|
+
`@client.find('P0010001', 'STATE:06')`
|
63
90
|
|
64
91
|
Retrieve fields for California and Alaska:
|
65
92
|
|
66
|
-
`@client.
|
93
|
+
`@client.find('P0010001', 'STATE:06,02')`
|
67
94
|
|
68
95
|
#### COUNTY - *(050) state-county*
|
69
96
|
|
70
97
|
Retrieve fields for all Counties:
|
71
98
|
|
72
|
-
`@client.
|
99
|
+
`@client.find('P0010001', 'COUNTY')`
|
73
100
|
|
74
101
|
Retrieve fields for Counties in California:
|
75
102
|
|
76
|
-
`@client.
|
103
|
+
`@client.find('P0010001', 'COUNTY', 'STATE:06')`
|
77
104
|
|
78
105
|
Retrieve fields for a specific County in California:
|
79
106
|
|
80
|
-
`@client.
|
107
|
+
`@client.find('P0010001', 'COUNTY:001', 'STATE:06')`
|
81
108
|
|
82
109
|
#### COUSUB - *(060) state-county-county subdivision*
|
83
110
|
|
84
111
|
Retrieve fields for all County Subdivisions within a specific County:
|
85
112
|
|
86
|
-
`@client.
|
113
|
+
`@client.find('P0010001', 'COUSUB', 'STATE:02+COUNTY:290')`
|
87
114
|
|
88
115
|
Retrieve fields for a specific County Subdivision within a specific County:
|
89
116
|
|
90
|
-
`@client.
|
117
|
+
`@client.find('P0010001', 'COUSUB:86690', 'STATE:02+COUNTY:290')`
|
91
118
|
|
92
119
|
Note: You must also specify the State the County belongs to.
|
93
120
|
|
@@ -95,231 +122,231 @@ Note: You must also specify the State the County belongs to.
|
|
95
122
|
|
96
123
|
Retrieve fields for all Subminor Civil Subdivisions within a specific County Subdivision:
|
97
124
|
|
98
|
-
`@client.
|
125
|
+
`@client.find('P0010001', 'SUBMCD', 'STATE:72+COUNTY:127+COUSUB:79693')`
|
99
126
|
|
100
127
|
Retrieve fields for a specific Subminor Civil Subdivisions within a specific County Subdivision:
|
101
128
|
|
102
|
-
`@client.
|
129
|
+
`@client.find('P0010001', 'SUBMCD:02350', 'STATE:72+COUNTY:127+COUSUB:79693')`
|
103
130
|
|
104
131
|
#### TABBLOCK - *(101) state-county-tract-block*
|
105
132
|
|
106
133
|
Retrieve fields for all Blocks within a specific Tract
|
107
134
|
|
108
|
-
`@client.
|
135
|
+
`@client.find('P0010001', 'TABBLOCK', 'STATE:02+COUNTY:290+TRACT:00100')`
|
109
136
|
|
110
137
|
Retrieve fields for a specific Subminor Civil Subdivisions within a specific County Subdivision:
|
111
138
|
|
112
|
-
`@client.
|
139
|
+
`@client.find('P0010001', 'SUBMCD:02350', 'STATE:72+COUNTY:127+COUSUB:79693')`
|
113
140
|
|
114
141
|
#### TRACT - *(140) state-county-tract*
|
115
142
|
|
116
143
|
Retrieve fields for all Tracts within a specific County:
|
117
144
|
|
118
|
-
`@client.
|
145
|
+
`@client.find('P0010001', 'TRACT', 'STATE:02+COUNTY:170')`
|
119
146
|
|
120
147
|
Retrieve fields for a specific Tract within a specific County:
|
121
148
|
|
122
|
-
`@client.
|
149
|
+
`@client.find('P0010001', 'TRACT:000101', 'STATE:02+COUNTY:170')`
|
123
150
|
|
124
151
|
#### BG - *(150) state-county- tract-block group*
|
125
152
|
|
126
153
|
Retrieve fields for all Block Groups within a specific Tract:
|
127
154
|
|
128
|
-
`@client.
|
155
|
+
`@client.find('P0010001', 'BG', 'STATE:02+COUNTY:170+TRACT:000101')`
|
129
156
|
|
130
157
|
Retrieve fields for a specific Block Group within a specific Tract:
|
131
158
|
|
132
|
-
`@client.
|
159
|
+
`@client.find('P0010001', 'BG:1', 'STATE:02+COUNTY:170+TRACT:000101')`
|
133
160
|
|
134
161
|
#### PLACE -*(160) state-place*
|
135
162
|
|
136
163
|
Retrieve fields for all Places:
|
137
164
|
|
138
|
-
`@client.
|
165
|
+
`@client.find('P0010001', 'PLACE')`
|
139
166
|
|
140
167
|
Retrieve fields for all Places within a specific State:
|
141
168
|
|
142
|
-
`@client.
|
169
|
+
`@client.find('P0010001', 'PLACE', 'STATE:06')`
|
143
170
|
|
144
171
|
Retrieve fields for a specific place within a specific State:
|
145
172
|
|
146
|
-
`@client.
|
173
|
+
`@client.find('P0010001', 'PLACE:00135', 'STATE:06')`
|
147
174
|
|
148
175
|
#### ANRC - *(260) state-alaska native regional corporation*
|
149
176
|
|
150
177
|
Retrieve fields for all Alaska Native Regional Corporations:
|
151
178
|
|
152
|
-
`@client.
|
179
|
+
`@client.find('P0010001', 'ANRC')`
|
153
180
|
|
154
181
|
Retrieve fields for all Alaska Native Regional Corporations within a specific State:
|
155
182
|
|
156
|
-
`@client.
|
183
|
+
`@client.find('P0010001', 'ANRC', 'STATE:02')`
|
157
184
|
|
158
185
|
Retrieve fields for all Alaska Native Regional Corporations within a specific State:
|
159
186
|
|
160
|
-
`@client.
|
187
|
+
`@client.find('P0010001', 'ANRC:00590', 'STATE:02')`
|
161
188
|
|
162
189
|
#### AIANNH - *(280) state-american indian area/alaska native area/hawaiian home land*
|
163
190
|
|
164
191
|
Retrieve fields for all American Indian Area/Alaska Native Area/Hawaiian Home Land:
|
165
192
|
|
166
|
-
`@client.
|
193
|
+
`@client.find('P0010001', 'AIANNH')`
|
167
194
|
|
168
195
|
Retrieve fields for all American Indian Area/Alaska Native Area/Hawaiian Home Land within a specific State:
|
169
196
|
|
170
|
-
`@client.
|
197
|
+
`@client.find('P0010001', 'AIANNH', 'STATE:02')`
|
171
198
|
|
172
199
|
Retrieve fields for a specific American Indian Area/Alaska Native Area/Hawaiian Home Land within a specific State:
|
173
200
|
|
174
|
-
`@client.
|
201
|
+
`@client.find('P0010001', 'AIANNH:03800', 'STATE:02')`
|
175
202
|
|
176
203
|
#### AITS - *(281) state-american indian area-tribal subdivision*
|
177
204
|
|
178
205
|
Retrieve fields for all American Indian Area-Tribal Subdivisions:
|
179
206
|
|
180
|
-
`@client.
|
207
|
+
__DOES NOT WORK__: `@client.find('P0010001', 'AITS')`
|
181
208
|
|
182
209
|
Retrieve fields for all American Indian Area-Tribal Subdivisions in a specific American Indian Area:
|
183
210
|
|
184
|
-
`@client.
|
211
|
+
`@client.find('P0010001', 'AITS', 'STATE:40+AIANNH:13735')`
|
185
212
|
|
186
213
|
Retrieve fields for a specific American Indian Area-Tribal Subdivision in a specific American Indian Area:
|
187
214
|
|
188
|
-
`@client.
|
215
|
+
`@client.find('P0010001', 'AITS:83127', 'STATE:40+AIANNH:13735')`
|
189
216
|
|
190
217
|
#### CBSA - *(320) state-metropolitan statistical area/micropolitan statistical area*
|
191
218
|
|
192
219
|
Retrieve fields from all Metropolitan Statistical Areas / Micropolitan Statistical Areas in a specific State:
|
193
220
|
|
194
|
-
`@client.
|
221
|
+
`@client.find('P0010001', 'CBSA', 'STATE:02')`
|
195
222
|
|
196
223
|
Retrieve fields from a specific Metropolitan Statistical Areas / Micropolitan Statistical Areas in a specific State:
|
197
224
|
|
198
|
-
`@client.
|
225
|
+
`@client.find('P0010001', 'CBSA:11260', 'STATE:02')`
|
199
226
|
|
200
227
|
#### METDIV - *(323) state-metropolitan statistical area/micropolitan statistical area- metropolitan division*
|
201
228
|
|
202
229
|
Retrieve fields from all Metropolitan Divisions in a specific Metropolitan Statistical Area / Micropolitan Statistical Area:
|
203
230
|
|
204
|
-
`@client.
|
231
|
+
`@client.find('P0010001', 'METDIV', 'STATE:06+CBSA:31100')`
|
205
232
|
|
206
233
|
Retrieve fields from all Metropolitan Division in a specific Metropolitan Statistical Area / Micropolitan Statistical Area:
|
207
234
|
|
208
|
-
`@client.
|
235
|
+
`@client.find('P0010001', 'METDIV', 'STATE:06+CBSA:31100')`
|
209
236
|
|
210
237
|
Retrieve fields from a specific Metropolitan Division in a specific Metropolitan Statistical Area / Micropolitan Statistical Area:
|
211
238
|
|
212
|
-
`@client.
|
239
|
+
`@client.find('P0010001', 'METDIV:31084', 'STATE:06+CBSA:31100')`
|
213
240
|
|
214
241
|
#### CSA - *(340) - state-combined statistical area*
|
215
242
|
|
216
243
|
Retrieve fields from all Combined Statistical Areas in a specific State:
|
217
244
|
|
218
|
-
`@client.
|
245
|
+
`@client.find('P0010001', 'CSA', 'STATE:24')`
|
219
246
|
|
220
247
|
Retrieve fields from a specific Combined Statistical Area in a specific State:
|
221
248
|
|
222
|
-
`@client.
|
249
|
+
`@client.find('P0010001', 'CSA:428', 'STATE:24')`
|
223
250
|
|
224
251
|
#### CD - *(500) state-congressional district*
|
225
252
|
|
226
253
|
Retrieve fields from all Congressional Districts in a specific State:
|
227
254
|
|
228
|
-
`@client.
|
255
|
+
`@client.find('P0010001', 'CD', 'STATE:24')`
|
229
256
|
|
230
257
|
Retrieve fields from a specific Congressional District in a specific State:
|
231
258
|
|
232
|
-
`@client.
|
259
|
+
`@client.find('P0010001', 'CD:01', 'STATE:24')`
|
233
260
|
|
234
261
|
#### COUNTY (Remainder) - *(510) state-congressional district-county*
|
235
262
|
|
236
263
|
Retrieve fields for all Counties within a specific Congressional District:
|
237
264
|
|
238
|
-
`@client.
|
265
|
+
`@client.find('P0010001', 'COUNTY', 'STATE:24+CD:01')`
|
239
266
|
|
240
267
|
Retrieve fields for a specific County within a specific Congressional District:
|
241
268
|
|
242
|
-
`@client.
|
269
|
+
`@client.find('P0010001', 'COUNTY:01', 'STATE:24+CD:01')`
|
243
270
|
|
244
271
|
#### TRACT (Remainder) - *(511) state-congressional district-county-tract*
|
245
272
|
|
246
273
|
Retrieve fields for all Tracts within a specific Congressional District, County Remainder:
|
247
274
|
|
248
|
-
`@client.
|
275
|
+
`@client.find('P0010001', 'TRACT', 'STATE:24+CD:01+COUNTY:003')`
|
249
276
|
|
250
277
|
Retrieve fields for a specific County within a specific Congressional District, County Remainder:
|
251
278
|
|
252
|
-
`@client.
|
279
|
+
`@client.find('P0010001', 'TRACT:702100', 'STATE:24+CD:01+COUNTY:003')`
|
253
280
|
|
254
281
|
### COUSUB (Remainder) - *(521) state-congressional district-county-county subdivision*
|
255
282
|
|
256
283
|
Retrieve fields for all County Subdivisions within a specific Congressional District, County Remainder:
|
257
284
|
|
258
|
-
`@client.
|
285
|
+
`@client.find('P0010001', 'COUSUB', 'STATE:24+CD:01+COUNTY:003')`
|
259
286
|
|
260
287
|
Retrieve fields for a specific County Subdivision within a specific Congressional District, County Remainder:
|
261
288
|
|
262
|
-
`@client.
|
289
|
+
`@client.find('P0010001', 'COUSUB:90100', 'STATE:24+CD:01+COUNTY:003')`
|
263
290
|
|
264
291
|
#### PLACE (Remainder) - *(531) state congressional district-place*
|
265
292
|
|
266
293
|
Retrieve fields for all Places within a specific Congressional District:
|
267
294
|
|
268
|
-
`@client.
|
295
|
+
`@client.find('P0010001', 'PLACE', 'STATE:24+CD:01')`
|
269
296
|
|
270
297
|
Retrieve fields for a specific Place within a specific Congressional District, County Remainder:
|
271
298
|
|
272
|
-
`@client.
|
299
|
+
`@client.find('P0010001', 'PLACE:00125', 'STATE:24+CD:01')`
|
273
300
|
|
274
301
|
#### AIANNH (Remainder) - *550) state-congressional district-american indian area/alaska native area/hawaiian home land*
|
275
302
|
|
276
303
|
Retrieve fields for all American Indian Area/Alaska Native Area/Hawaiian Home Lands within a specific Congressional District:
|
277
304
|
|
278
|
-
`@client.
|
305
|
+
`@client.find('P0010001', 'AIANNH', 'STATE:02+CD:00')`
|
279
306
|
|
280
307
|
Retrieve fields for a specific American Indian Area/Alaska Native Area/Hawaiian Home Land within a specific Congressional District:
|
281
308
|
|
282
|
-
`@client.
|
309
|
+
`@client.find('P0010001', 'AIANNH:03800', 'STATE:02+CD:00')`
|
283
310
|
|
284
311
|
#### ANRC (Remainder) - *(560) state-congressional district-alaska native regional corporation*
|
285
312
|
|
286
313
|
Retrieve fields for all Alaska Native Regional Corporations within a specific Congressional District:
|
287
314
|
|
288
|
-
`@client.
|
315
|
+
`@client.find('P0010001', 'AIANNH', 'STATE:02+CD:00')`
|
289
316
|
|
290
317
|
Retrieve fields for a specific Alaska Native Regional Corporation within a specific Congressional District:
|
291
318
|
|
292
|
-
`@client.
|
319
|
+
`@client.find('P0010001', 'AIANNH:00590', 'STATE:02+CD:00')`
|
293
320
|
|
294
321
|
#### SLDU - *(610) state-state legislative district (upper chamber)*
|
295
322
|
|
296
323
|
Retrieve fields for all State Legislative Districts (Upper Chamber) within a State:
|
297
324
|
|
298
|
-
`@client.
|
325
|
+
`@client.find('P0010001', 'SLDU', 'STATE:02')`
|
299
326
|
|
300
327
|
Retrieve fields for a specific State Legislative District (Upper Chamber) within a State:
|
301
328
|
|
302
|
-
`@client.
|
329
|
+
`@client.find('P0010001', 'SLDU:00A', 'STATE:02')`
|
303
330
|
|
304
|
-
#### SLDU - *(620) state-state legislative district (
|
331
|
+
#### SLDU - *(620) state-state legislative district (lower chamber)*
|
305
332
|
|
306
333
|
Retrieve fields for all State Legislative Districts (Lower Chamber) within a State:
|
307
334
|
|
308
|
-
`@client.
|
335
|
+
`@client.find('P0010001', 'SLDL', 'STATE:02')`
|
309
336
|
|
310
|
-
Retrieve fields for a specific State Legislative District (
|
337
|
+
Retrieve fields for a specific State Legislative District (Lower Chamber) within a State:
|
311
338
|
|
312
|
-
`@client.
|
339
|
+
`@client.find('P0010001', 'SLDL:001', 'STATE:02')`
|
313
340
|

|
314
341
|
#### ZCTA5 - *(871) state-zip code tabulation area*
|
315
342
|
|
316
343
|
Retrieve fields for all Zip Code Tabulation Areas within a specific State:
|
317
344
|
|
318
|
-
`@client.
|
345
|
+
`@client.find('P0010001', 'ZCTA5', 'STATE:02')`
|
319
346
|
|
320
347
|
Retrieve fields for a specific Zip Code Tabulation Area within a specific State:
|
321
348
|
|
322
|
-
`@client.
|
349
|
+
`@client.find('P0010001', 'ZCTA5:99501', 'STATE:02')`
|
323
350
|
|
324
351
|
## ACS5 2010 Examples and Supported Geography
|
325
352
|
|
@@ -329,39 +356,39 @@ Querying the Census Bureau for ACS5 data is done in the same format as querying
|
|
329
356
|
|
330
357
|
Retrieve fields for all States:
|
331
358
|
|
332
|
-
`@client.
|
359
|
+
`@client.find('B00001_001E', 'STATE')`
|
333
360
|
|
334
361
|
Retrieve fields for California (geoid: 06):
|
335
362
|
|
336
|
-
`@client.
|
363
|
+
`@client.find('B00001_001E', 'STATE:06')`
|
337
364
|
|
338
365
|
Retrieve fields for California and Alaska:
|
339
366
|
|
340
|
-
`@client.
|
367
|
+
`@client.find('B00001_001E', 'STATE:06,02')`
|
341
368
|
|
342
369
|
#### COUNTY - *(050) state-county*
|
343
370
|
|
344
371
|
Retrieve fields for all Counties:
|
345
372
|
|
346
|
-
`@client.
|
373
|
+
`@client.find('B00001_001E', 'COUNTY')`
|
347
374
|
|
348
375
|
Retrieve fields for Counties in California:
|
349
376
|
|
350
|
-
`@client.
|
377
|
+
`@client.find('B00001_001E', 'COUNTY', 'STATE:06')`
|
351
378
|
|
352
379
|
Retrieve fields for a specific County in California:
|
353
380
|
|
354
|
-
`@client.
|
381
|
+
`@client.find('B00001_001E', 'COUNTY:001', 'STATE:06')`
|
355
382
|
|
356
383
|
#### COUSUB - *(060) state-county-county subdivision*
|
357
384
|
|
358
385
|
Retrieve fields for all County Subdivisions within a specific County:
|
359
386
|
|
360
|
-
`@client.
|
387
|
+
`@client.find('B00001_001E', 'COUSUB', 'STATE:02+COUNTY:290')`
|
361
388
|
|
362
389
|
Retrieve fields for a specific County Subdivision within a specific County:
|
363
390
|
|
364
|
-
`@client.
|
391
|
+
`@client.find('B00001_001E', 'COUSUB:86690', 'STATE:02+COUNTY:290')`
|
365
392
|
|
366
393
|
Note: You must also specify the State the County belongs to.
|
367
394
|
|
@@ -369,89 +396,89 @@ Note: You must also specify the State the County belongs to.
|
|
369
396
|
|
370
397
|
Retrieve fields for all Subminor Civil Subdivisions within a specific County Subdivision:
|
371
398
|
|
372
|
-
`@client.
|
399
|
+
`@client.find('B00001_001E', 'SUBMCD', 'STATE:72+COUNTY:127+COUSUB:79693')`
|
373
400
|
|
374
401
|
Retrieve fields for a specific Subminor Civil Subdivision within a specific County Subdivision:
|
375
402
|
|
376
|
-
`@client.
|
403
|
+
`@client.find('B00001_001E', 'SUBMCD:02350', 'STATE:72+COUNTY:127+COUSUB:79693')`
|
377
404
|
|
378
405
|
#### PLACE - *(070) state-county-county subdivision-place*
|
379
406
|
|
380
407
|
Retrieve fields for all Places within a specific County Subdivision:
|
381
408
|
|
382
|
-
`@client.
|
409
|
+
`@client.find('B00001_001E', 'PLACE', 'STATE:02+COUNTY:290+COUSUB:86690')`
|
383
410
|
|
384
411
|
Retrieve fields for a specific Place within a specific County Subdivision:
|
385
412
|
|
386
|
-
`@client.
|
413
|
+
`@client.find('B00001_001E', 'PLACE:05750', 'STATE:02+COUNTY:290+COUSUB:86690')`
|
387
414
|
|
388
415
|
#### TRACT - *(080) state-county-county subdivision-place-tract*
|
389
416
|
|
390
417
|
Retrieve fields for all Tracts within a specific Place:
|
391
418
|
|
392
|
-
`@client.
|
419
|
+
`@client.find('B00001_001E', 'TRACT', 'STATE:02+COUNTY:290+COUSUB:86690+PLACE:05750')`
|
393
420
|
|
394
421
|
Retrieve fields for a specific Tract within a specific Place:
|
395
422
|
|
396
|
-
`@client.
|
423
|
+
`@client.find('B00001_001E', 'TRACT:000100', 'STATE:02+COUNTY:290+COUSUB:86690+PLACE:05750')`
|
397
424
|
|
398
425
|
#### TRACT - *(140) state-county-tract*
|
399
426
|
|
400
427
|
Retrieve fields for all Tracts within a specific County:
|
401
428
|
|
402
|
-
`@client.
|
429
|
+
`@client.find('B00001_001E', 'TRACT', 'STATE:02+COUNTY:170')`
|
403
430
|
|
404
431
|
Retrieve fields for a specific Tract within a specific County:
|
405
432
|
|
406
|
-
`@client.
|
433
|
+
`@client.find('B00001_001E', 'TRACT:000101', 'STATE:02+COUNTY:170')`
|
407
434
|
|
408
435
|
#### BG - *(150) state-county- tract-block group*
|
409
436
|
|
410
437
|
Retrieve fields for all Block Groups within a specific Tract:
|
411
438
|
|
412
|
-
`@client.
|
439
|
+
`@client.find('B00001_001E', 'BG', 'STATE:02+COUNTY:170+TRACT:000101')`
|
413
440
|
|
414
441
|
Retrieve fields for a specific Block Group within a specific Tract:
|
415
442
|
|
416
|
-
`@client.
|
443
|
+
`@client.find('B00001_001E', 'BG:1', 'STATE:02+COUNTY:170+TRACT:000101')`
|
417
444
|
|
418
445
|
#### PLACE - *(160) state-place*
|
419
446
|
|
420
447
|
Retrieve fields for all Places:
|
421
448
|
|
422
|
-
`@client.
|
449
|
+
`@client.find('B00001_001E', 'PLACE')`
|
423
450
|
|
424
451
|
Retrieve fields for all Places within a specific State:
|
425
452
|
|
426
|
-
`@client.
|
453
|
+
`@client.find('B00001_001E', 'PLACE', 'STATE:06')`
|
427
454
|
|
428
455
|
Retrieve fields for a specific place within a specific State:
|
429
456
|
|
430
|
-
`@client.
|
457
|
+
`@client.find('B00001_001E', 'PLACE:00135', 'STATE:06')`
|
431
458
|
|
432
459
|
#### AIANNH - *(280) state-american indian area/alaska native area/hawaiian home land*
|
433
460
|
|
434
461
|
Retrieve fields for all American Indian Area/Alaska Native Area/Hawaiian Home Land:
|
435
462
|
|
436
|
-
`@client.
|
463
|
+
`@client.find('B00001_001E', 'AIANNH')`
|
437
464
|
|
438
465
|
Retrieve fields for all American Indian Area/Alaska Native Area/Hawaiian Home Land within a specific State:
|
439
466
|
|
440
|
-
`@client.
|
467
|
+
`@client.find('B00001_001E', 'AIANNH', 'STATE:02')`
|
441
468
|
|
442
469
|
Retrieve fields for a specific American Indian Area/Alaska Native Area/Hawaiian Home Land within a specific State:
|
443
470
|
|
444
|
-
`@client.
|
471
|
+
`@client.find('B00001_001E', 'AIANNH:03800', 'STATE:02')`
|
445
472
|
|
446
473
|
#### CD - *(500) state-congressional district*
|
447
474
|
|
448
475
|
Retrieve fields from all Congressional Districts in a specific State:
|
449
476
|
|
450
|
-
`@client.
|
477
|
+
`@client.find('B00001_001E', 'CD', 'STATE:24')`
|
451
478
|
|
452
479
|
Retrieve fields from a specific Congressional District in a specific State:
|
453
480
|
|
454
|
-
`@client.
|
481
|
+
`@client.find('B00001_001E', 'CD:01', 'STATE:24')`
|
455
482
|
|
456
483
|
## Additional Resources
|
457
484
|
|
data/lib/census_api/client.rb
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
module CensusApi
|
2
2
|
class Client
|
3
|
-
attr_reader :
|
4
|
-
|
3
|
+
attr_reader :api_key, :options
|
4
|
+
attr_accessor :dataset
|
5
|
+
|
6
|
+
DATASETS = %w( sf1 acs5 ) # can add more datasets as support becomes available
|
5
7
|
|
6
8
|
def initialize(api_key, options = {})
|
9
|
+
raise ArgumentError, "You must set an api_key." unless api_key
|
10
|
+
|
11
|
+
# Use RestClient directly to determine the validity of the API Key
|
12
|
+
path = "http://api.census.gov/data/2010/sf1?key=#{api_key}&get=P0010001&for=state:01"
|
13
|
+
response = RestClient.get(path)
|
14
|
+
|
15
|
+
if response.body.include? "Invalid Key"
|
16
|
+
raise "'#{api_key}' is not a valid API key. Check your key for errors, or request a new one at census.gov."
|
17
|
+
end
|
18
|
+
|
7
19
|
@api_key = api_key
|
8
|
-
|
20
|
+
if options[:dataset]
|
21
|
+
@dataset = options[:dataset].downcase if DATASETS.include? options[:dataset].downcase
|
22
|
+
end
|
9
23
|
end
|
10
24
|
|
11
|
-
def
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def acs5(field, level, *within)
|
16
|
-
Request.find("acs5", {:key => @api_key, :fields => field, :level => level, :within => within})
|
25
|
+
def find(fields, level, *within)
|
26
|
+
raise "Client has not been assigned a dataset to query. Try @client.dataset = 'SF1' or anything from #{DATASETS}" if self.dataset.nil?
|
27
|
+
Request.find(dataset, {key: @api_key, fields: fields, level: level, within: within})
|
17
28
|
end
|
18
29
|
end
|
19
|
-
end
|
30
|
+
end
|
data/lib/census_api/request.rb
CHANGED
@@ -12,22 +12,25 @@ module CensusApi
|
|
12
12
|
|
13
13
|
CENSUS_URL = "http://api.census.gov/data/2010"
|
14
14
|
|
15
|
+
def initialize(url, source, options)
|
16
|
+
path = "#{url}/#{source}?#{options.to_params}"
|
17
|
+
@response = RestClient.get(path) do |response, request, result, &block|
|
18
|
+
response
|
19
|
+
end
|
20
|
+
return @response
|
21
|
+
end
|
22
|
+
|
23
|
+
|
15
24
|
def self.find(source, options = {})
|
16
|
-
|
17
|
-
|
25
|
+
fields = options[:fields]
|
26
|
+
fields = fields.split(",").push("NAME").join(",") if fields.kind_of? String
|
27
|
+
fields = fields.push("NAME").join(",") if fields.kind_of? Array
|
28
|
+
params = { :key => options[:key], :get => fields, :for => format(options[:level],false) }
|
18
29
|
params.merge!({ :in => format(options[:within][0],true) }) if !options[:within].empty?
|
19
30
|
request = new(CENSUS_URL, source, params)
|
20
31
|
request.parse_response
|
21
32
|
end
|
22
33
|
|
23
|
-
def initialize(url, source, options)
|
24
|
-
path = "#{url}/#{source}?#{options.to_p}"
|
25
|
-
@response = RestClient.get(path){
|
26
|
-
|response, request, result, &block|
|
27
|
-
response
|
28
|
-
}
|
29
|
-
return @response
|
30
|
-
end
|
31
34
|
|
32
35
|
def parse_response
|
33
36
|
case @response.code
|
@@ -36,39 +39,39 @@ module CensusApi
|
|
36
39
|
header = response.delete_at(0)
|
37
40
|
return response.map{|r| Hash[header.map{|h| h.gsub("NAME","name")}.zip(r)]}
|
38
41
|
else
|
39
|
-
return {:code => @response.code, :message=> "Invalid API key or request", :location=> @response.headers[:location]}
|
42
|
+
return {:code => @response.code, :message=> "Invalid API key or request", :location=> @response.headers[:location], :body => @response.body}
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
46
|
protected
|
44
47
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
48
|
+
def self.format(str,truncate)
|
49
|
+
result = str.split("+").map{|s|
|
50
|
+
if s.match(":")
|
51
|
+
s = s.split(":")
|
52
|
+
else
|
53
|
+
s = [s,"*"]
|
54
|
+
end
|
55
|
+
shp = shapes[s[0].upcase]
|
56
|
+
s.shift && s.unshift(shp['name'].downcase.gsub(" ", "+")) if !shp.nil?
|
57
|
+
s.unshift(s.shift.split("/")[0]) if !s[0].scan("home+land").empty? && truncate
|
58
|
+
s.join(":")
|
59
|
+
}
|
60
|
+
return result.join("+")
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.shapes
|
64
|
+
return @@census_shapes if defined?( @@census_shapes)
|
65
|
+
@@census_shapes = {}
|
66
|
+
YAML.load_file(File.dirname(__FILE__).to_s + '/../yml/census_shapes.yml').each{|k,v| @@census_shapes[k] = v}
|
67
|
+
return @@census_shapes
|
68
|
+
end
|
69
|
+
|
65
70
|
end
|
66
|
-
|
67
71
|
end
|
68
|
-
end
|
69
72
|
|
70
73
|
class Hash
|
71
|
-
def
|
74
|
+
def to_params
|
72
75
|
self.map { |k,v| "#{k}=#{v}" }.join("&")
|
73
76
|
end
|
74
|
-
end
|
77
|
+
end
|
data/lib/census_api/version.rb
CHANGED
data/lib/census_api.rb
CHANGED
@@ -2,27 +2,43 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe CensusApi::Client do
|
4
4
|
|
5
|
-
|
6
|
-
lambda { CensusApi::Client.new }.should raise_error
|
7
|
-
end
|
5
|
+
describe "client initialization" do
|
8
6
|
|
9
|
-
|
10
|
-
@client = CensusApi::Client.new(api_key)
|
11
|
-
@client.api_key.should == api_key
|
12
|
-
end
|
7
|
+
use_vcr_cassette "initialize_client"
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
it 'should not initialize without an api_key' do
|
10
|
+
lambda { CensusApi::Client.new }.should raise_error
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should initialize with an api_key' do
|
14
|
+
@client = CensusApi::Client.new(api_key)
|
15
|
+
@client.api_key.should == api_key
|
16
|
+
end
|
19
17
|
end
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
describe "client and dataset initialization" do
|
20
|
+
|
21
|
+
use_vcr_cassette "initialize_client_and_dataset"
|
22
|
+
|
23
|
+
it 'should initialize with an api_key and dataset' do
|
24
|
+
dataset = 'SF1'
|
25
|
+
@client = CensusApi::Client.new(api_key, dataset: dataset)
|
26
|
+
@client.api_key.should == api_key
|
27
|
+
@client.dataset.should == dataset.downcase
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should request sf1' do
|
31
|
+
source, options = 'sf1', {:key=> api_key, :fields => 'P0010001', :level => 'STATE:06', :within=>[]}
|
32
|
+
@client = CensusApi::Client.new(api_key, dataset: source)
|
33
|
+
CensusApi::Request.should_receive(:find).with(@client.dataset, options)
|
34
|
+
@client.find(options[:fields], options[:level])
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should request acs5' do
|
38
|
+
source, options = 'acs5', {:key=> api_key, :fields => 'B00001_001E', :level => 'STATE:06', :within=>[]}
|
39
|
+
@client = CensusApi::Client.new(api_key, dataset: source)
|
40
|
+
CensusApi::Request.should_receive(:find).with(@client.dataset, options)
|
41
|
+
@client.find(options[:fields], options[:level])
|
42
|
+
end
|
26
43
|
end
|
27
|
-
|
28
44
|
end
|
@@ -9,7 +9,7 @@ describe CensusApi::Request do
|
|
9
9
|
]},
|
10
10
|
{:source => 'acs5', :field => 'B00001_001E', :results =>[
|
11
11
|
{"B00001_001E"=>"2330290", "name"=>"California", "state"=>"06"},
|
12
|
-
{"B00001_001E"=>"92854", "name"=>"Alameda County", "state"=>"06", "county"=>"001"}
|
12
|
+
{"B00001_001E"=>"92854", "name"=>"Alameda County, California", "state"=>"06", "county"=>"001"}
|
13
13
|
]}
|
14
14
|
].each do |test|
|
15
15
|
|
data/spec/vcr_setup.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: census_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
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: 2013-
|
12
|
+
date: 2013-07-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|