census_api 1.0.1 → 1.0.2
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.
- 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
|