usatoday-census 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ pkg/*
2
+ *.gem
3
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in usatoday-census.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # usatoday-census
2
+
3
+
4
+ * [Source](http://github.com/dwillis/usatoday-census)
5
+
6
+ ## DESCRIPTION:
7
+
8
+ Simple ruby wrapper for the [USA TODAY Census API](http://developer.usatoday.com/docs/read/Census). You'll need an API key.
9
+
10
+ ## INSTALL:
11
+
12
+ * <tt>gem install usatoday-census</tt>
13
+
14
+ ## USAGE:
15
+
16
+ require 'rubygems'
17
+ require 'usatoday-census'
18
+ include Usatoday::Census
19
+
20
+ You'll want to set your API key as an environment variable in order to run the tests. Otherwise, you'll need to set it like so:
21
+
22
+ Base.api_key = YOUR_API_KEY
23
+
24
+ or via an environment variable:
25
+
26
+ API_KEY = ENV['USAT_CENSUS_API_KEY']
27
+ Base.api_key = API_KEY
28
+
29
+ The gem queries the USA TODAY Census API to return information about a state's population, ethnicity, housing, racial composition and other geographic details, including the USA TODAY Diversity Index. The initial version of the gem supports state-level requests, so the results will be for states only. Future support for other geographic levels (National, County and City or Town) will be added soon. Users can search for a state by its postal abbreviation or name:
30
+
31
+ Location.search('va') # find demographic information about Virginia
32
+ Ethnicity.search("Virginia", "Placename") # can also search by full state name using the Placename attribute.
33
+ Race.search("51", 'FIPS') # Or search by FIPS code, too.
34
+
35
+ Check out the tests for further examples. Run the tests via rake test. Note: you'll need to set your API key as an environment variable before running the tests. The API has a limit of two queries per second, so the test requests are delayed by one second to ensure passage.
36
+
37
+ ## Note on Patches/Pull Requests
38
+
39
+ * Fork the project.
40
+ * Make your feature addition or bug fix.
41
+ * Add tests for it. This is important so I don't break it in a
42
+ future version unintentionally.
43
+ * Commit, do not mess with rakefile, version, or history.
44
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
45
+ * Send me a pull request. Bonus points for topic branches.
46
+
47
+ ## LICENSE:
48
+
49
+ (The MIT License)
50
+
51
+ Copyright (c) 2011 Derek Willis
52
+
53
+ Permission is hereby granted, free of charge, to any person obtaining
54
+ a copy of this software and associated documentation files (the
55
+ 'Software'), to deal in the Software without restriction, including
56
+ without limitation the rights to use, copy, modify, merge, publish,
57
+ distribute, sublicense, and/or sell copies of the Software, and to
58
+ permit persons to whom the Software is furnished to do so, subject to
59
+ the following conditions:
60
+
61
+ The above copyright notice and this permission notice shall be
62
+ included in all copies or substantial portions of the Software.
63
+
64
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
65
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
66
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
67
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
68
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
69
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
70
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+ task :default => :test
12
+
13
+ require 'rake/rdoctask'
14
+ Rake::RDocTask.new do |rdoc|
15
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
16
+
17
+ rdoc.rdoc_dir = 'rdoc'
18
+ rdoc.title = "campaign_cash #{version}"
19
+ rdoc.rdoc_files.include('README*')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
@@ -0,0 +1,5 @@
1
+ %w(base exceptions location ethnicity housing population race).each do |f|
2
+ require File.join(File.dirname(__FILE__), 'usatoday-census', f)
3
+ end
4
+
5
+
@@ -0,0 +1,86 @@
1
+ require 'open-uri'
2
+ require 'json'
3
+ require 'htmlentities'
4
+
5
+ module Usatoday
6
+ module Census
7
+ class Base
8
+
9
+ API_SERVER = "api.usatoday.com"
10
+ API_NAME = "census"
11
+ API_BASE = "/open/#{API_NAME}"
12
+
13
+ @@api_key = nil
14
+ @@debug = false
15
+ @@decode_html_entities = true
16
+
17
+ def self.api_key=(key)
18
+ @@api_key = key
19
+ end
20
+
21
+ def self.api_key
22
+ @@api_key
23
+ end
24
+
25
+ def self.build_request_url(method, params)
26
+ URI::HTTP.build :host => API_SERVER,
27
+ :path => API_BASE + '/' + method,
28
+ :query => params.map {|k,v| "#{URI.escape(k)}=#{URI.escape(v.to_s)}"}.join('&')
29
+ end
30
+
31
+ def self.text_field(value)
32
+ return nil if value.nil?
33
+ @@decode_html_entities ? HTMLEntities.new.decode(value) : value
34
+ end
35
+
36
+ def self.integer_field(value)
37
+ return nil if value.nil?
38
+ value.to_i
39
+ end
40
+
41
+ def self.float_field(value)
42
+ return nil if value.nil?
43
+ value.to_f
44
+ end
45
+
46
+ def self.prepare_params(method, keyname=nil)
47
+ params = {"keypath" => method }
48
+ params["keyname"] = keyname if keyname
49
+ params
50
+ end
51
+
52
+
53
+ def self.invoke(method, params={})
54
+ begin
55
+ raise AuthenticationError, "You must initialize the API key before you run any API queries" if @@api_key.nil?
56
+
57
+ full_params = params.merge 'api_key' => @@api_key
58
+ uri = build_request_url(method, full_params)
59
+ puts "REQUEST: #{uri}" if @@debug
60
+
61
+ reply = uri.read
62
+ parsed_reply = JSON.parse reply
63
+
64
+ raise BadResponseError, "Empty reply returned from API" if parsed_reply.nil?
65
+ parsed_reply['response'].first
66
+ rescue OpenURI::HTTPError => e
67
+ case e.message
68
+ when /^400/
69
+ raise BadRequestError
70
+ when /^403/
71
+ raise AuthenticationError
72
+ when /^404/
73
+ return nil
74
+ when /^500/
75
+ raise ServerError
76
+ else
77
+ raise ConnectionError
78
+ end
79
+ raise "Error connecting to URL #{uri} #{e}"
80
+ rescue JSON::ParserError => e
81
+ raise BadResponseError, "Invalid JSON returned from API:\n#{reply}"
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,40 @@
1
+ module Usatoday
2
+ module Census
3
+ class Ethnicity < Base
4
+
5
+ TEXT_FIELDS = %w(place_name state_postal)
6
+ NUMERIC_FIELDS = %w(fips gnis)
7
+ DECIMAL_FIELDS = %w(pct_hispanic pct_non_hispanic_white usat_diversity_index)
8
+
9
+ ALL_FIELDS = TEXT_FIELDS + DECIMAL_FIELDS + NUMERIC_FIELDS
10
+
11
+ attr_reader *ALL_FIELDS
12
+
13
+ def initialize(params={})
14
+ params.each_pair do |k,v|
15
+ instance_variable_set("@#{k}", v)
16
+ end
17
+ end
18
+
19
+ def self.init_from_api(params)
20
+ ethnicity = Ethnicity.new(
21
+ :place_name => text_field(params['Placename']),
22
+ :state_postal => text_field(params['StatePostal']),
23
+ :fips => integer_field(params['FIPS']),
24
+ :gnis => integer_field(params['GNIS']),
25
+ :pct_hispanic => float_field(params['PctHisp']),
26
+ :pct_non_hispanic_white => float_field(params['PctNonHispWhite']),
27
+ :usat_diversity_index => float_field(params['USATDiversityIndex'])
28
+ )
29
+ ethnicity
30
+ end
31
+
32
+ def self.search(keypat, keyname=nil)
33
+ params = prepare_params(keypat, keyname)
34
+ response = invoke('ethnicity', params)
35
+ init_from_api(response)
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,38 @@
1
+ module Usatoday
2
+ module Census
3
+ ##
4
+ # The generic Error class from which all other Errors are derived.
5
+ class Error < ::RuntimeError
6
+ end
7
+
8
+ ##
9
+ # This error is thrown if there are problems authenticating your API key.
10
+ class AuthenticationError < Error
11
+ end
12
+
13
+ ##
14
+ # This error is thrown if the request was not parsable by the API server.
15
+ class BadRequestError < Error
16
+ end
17
+
18
+ ##
19
+ # This error is thrown if the response from the API server is not parsable.
20
+ class BadResponseError < Error
21
+ end
22
+
23
+ ##
24
+ # This error is thrown if there is an error connecting to the API server.
25
+ class ServerError < Error
26
+ end
27
+
28
+ ##
29
+ # This error is thrown if there is a timeout connecting to the server (to be implemented).
30
+ class TimeoutError < Error
31
+ end
32
+
33
+ ##
34
+ # This error is thrown for general connection errors to the API server.
35
+ class ConnectionError < Error
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ module Usatoday
2
+ module Census
3
+ class Housing < Base
4
+
5
+ TEXT_FIELDS = %w(place_name state_postal)
6
+ NUMERIC_FIELDS = %w(fips gnis housing_units)
7
+ DECIMAL_FIELDS = %w(pct_vacant)
8
+
9
+ ALL_FIELDS = TEXT_FIELDS + DECIMAL_FIELDS + NUMERIC_FIELDS
10
+
11
+ attr_reader *ALL_FIELDS
12
+
13
+ def initialize(params={})
14
+ params.each_pair do |k,v|
15
+ instance_variable_set("@#{k}", v)
16
+ end
17
+ end
18
+
19
+ def self.init_from_api(params)
20
+ housing = Housing.new(
21
+ :place_name => text_field(params['Placename']),
22
+ :state_postal => text_field(params['StatePostal']),
23
+ :fips => integer_field(params['FIPS']),
24
+ :gnis => integer_field(params['GNIS']),
25
+ :pct_vacant => float_field(params['PctHisp']),
26
+ :housing_units => integer_field(params['HousingUnits'])
27
+ )
28
+ housing
29
+ end
30
+
31
+ def self.search(keypat, keyname=nil)
32
+ params = prepare_params(keypat, keyname)
33
+ response = invoke('housing', params)
34
+ init_from_api(response)
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,59 @@
1
+ module Usatoday
2
+ module Census
3
+ class Location < Base
4
+
5
+ TEXT_FIELDS = %w(place_name place_name_full state_ap state_postal)
6
+ NUMERIC_FIELDS = %w(fips gnis population housing_units)
7
+ DECIMAL_FIELDS = %w(pct_change pct_hispanic pct_non_hispanic pct_white pct_non_hispanic_white pct_black pct_american_indian pct_asian pct_native_hawaiian pct_two_or_more pct_other usat_diversity_index population_density land_square_miles water_square_miles total_square_miles latitude longitude pct_vacant)
8
+
9
+ ALL_FIELDS = TEXT_FIELDS + DECIMAL_FIELDS + NUMERIC_FIELDS
10
+
11
+ attr_reader *ALL_FIELDS
12
+
13
+ def initialize(params={})
14
+ params.each_pair do |k,v|
15
+ instance_variable_set("@#{k}", v)
16
+ end
17
+ end
18
+
19
+ def self.init_from_api(params)
20
+ location = Location.new(
21
+ :place_name => text_field(params['Placename']),
22
+ :place_name_full => text_field(params['PlacenameFull']),
23
+ :state_ap => text_field(params['StateAP']),
24
+ :state_postal => text_field(params['StatePostal']),
25
+ :fips => integer_field(params['FIPS']),
26
+ :gnis => integer_field(params['GNIS']),
27
+ :population => integer_field(params['Pop']),
28
+ :housing_units => integer_field(params['HousingUnits']),
29
+ :pct_change => float_field(params['PctChange']),
30
+ :pct_hispanic => float_field(params['PctHisp']),
31
+ :pct_non_hispanic => float_field(params['PctNonHisp']),
32
+ :pct_white => float_field(params['PctWhite']),
33
+ :pct_non_hispanic_white => float_field(params['PctNonHispWhite']),
34
+ :pct_black => float_field(params['PctBlack']),
35
+ :pct_american_indian => float_field(params['PctAmInd']),
36
+ :pct_asian => float_field(params['PctAsian']),
37
+ :pct_native_hawaiian => float_field(params['PctNatHawOth']),
38
+ :pct_two_or_more => float_field(params['PctTwoOrMore']),
39
+ :pct_other => float_field(params['PctOther']),
40
+ :usat_diversity_index => float_field(params['USATDiversityIndex']),
41
+ :population_density => float_field(params['PopSqMi']),
42
+ :land_square_miles => float_field(params['LandSqMi']),
43
+ :water_square_miles => float_field(params['WaterSqMi']),
44
+ :total_square_miles => float_field(params['TotSqMi']),
45
+ :latitude => float_field(params['Lat']),
46
+ :longitude => float_field(params['Long']),
47
+ :pct_vacant => float_field(params['PctVacant'])
48
+ )
49
+ location
50
+ end
51
+
52
+ def self.search(keypat, keyname=nil)
53
+ params = prepare_params(keypat, keyname)
54
+ response = invoke('locations', params)
55
+ init_from_api(response)
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,40 @@
1
+ module Usatoday
2
+ module Census
3
+ class Population < Base
4
+
5
+ TEXT_FIELDS = %w(place_name state_postal)
6
+ NUMERIC_FIELDS = %w(fips gnis population)
7
+ DECIMAL_FIELDS = %w(pct_change population_density)
8
+
9
+ ALL_FIELDS = TEXT_FIELDS + DECIMAL_FIELDS + NUMERIC_FIELDS
10
+
11
+ attr_reader *ALL_FIELDS
12
+
13
+ def initialize(params={})
14
+ params.each_pair do |k,v|
15
+ instance_variable_set("@#{k}", v)
16
+ end
17
+ end
18
+
19
+ def self.init_from_api(params)
20
+ population = Population.new(
21
+ :place_name => text_field(params['Placename']),
22
+ :state_postal => text_field(params['StatePostal']),
23
+ :fips => integer_field(params['FIPS']),
24
+ :gnis => integer_field(params['GNIS']),
25
+ :pct_change => float_field(params['PctChange']),
26
+ :population => integer_field(params['Pop']),
27
+ :population_density => float_field(params['PopSqMi'])
28
+ )
29
+ population
30
+ end
31
+
32
+ def self.search(keypat, keyname=nil)
33
+ params = prepare_params(keypat, keyname)
34
+ response = invoke('population', params)
35
+ init_from_api(response)
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,28 @@
1
+ require 'digest'
2
+
3
+ module Usatoday
4
+ module Census
5
+ ##
6
+ # The Query class represents a single query to the Census API. Supports
7
+ # all of the named parameters to C.search as accessor methods.
8
+ #
9
+ class Query
10
+ FIELDS = [:only_facets, :except_facets, :begin_date, :end_date, :since,
11
+ :before, :fee, :has_thumbnail, :facets, :fields, :query, :offset] + Article::TEXT_FIELDS.map{|f| f.to_sym}
12
+ FIELDS.each {|f| attr_accessor f}
13
+
14
+ # Produce a hash which uniquely identifies this query
15
+ def hash
16
+ strs = FIELDS.collect {|f| "#{f}:#{send(f).inspect}"}
17
+ Digest::SHA256.hexdigest(strs.join(' '))
18
+ end
19
+
20
+ # Perform this query. Returns result of Article.search
21
+ def perform
22
+ params = {}
23
+ FIELDS.each {|f| params[f] = send(f) unless send(f).nil?}
24
+ Article.search(params)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ module Usatoday
2
+ module Census
3
+ class Race < Base
4
+
5
+ TEXT_FIELDS = %w(place_name state_postal)
6
+ NUMERIC_FIELDS = %w(fips gnis)
7
+ DECIMAL_FIELDS = %w(pct_white pct_black pct_american_indian pct_asian pct_native_hawaiian pct_two_or_more)
8
+
9
+ ALL_FIELDS = TEXT_FIELDS + DECIMAL_FIELDS + NUMERIC_FIELDS
10
+
11
+ attr_reader *ALL_FIELDS
12
+
13
+ def initialize(params={})
14
+ params.each_pair do |k,v|
15
+ instance_variable_set("@#{k}", v)
16
+ end
17
+ end
18
+
19
+ def self.init_from_api(params)
20
+ race = Race.new(
21
+ :place_name => text_field(params['Placename']),
22
+ :state_postal => text_field(params['StatePostal']),
23
+ :fips => integer_field(params['FIPS']),
24
+ :gnis => integer_field(params['GNIS']),
25
+ :pct_white => float_field(params['PctWhite']),
26
+ :pct_black => float_field(params['PctBlack']),
27
+ :pct_american_indian => float_field(params['PctAmInd']),
28
+ :pct_asian => float_field(params['PctAsian']),
29
+ :pct_native_hawaiian => float_field(params['PctNatHawOth']),
30
+ :pct_two_or_more => float_field(params['PctTwoOrMore'])
31
+ )
32
+ race
33
+ end
34
+
35
+ def self.search(keypat, keyname=nil)
36
+ params = prepare_params(keypat, keyname)
37
+ response = invoke('race', params)
38
+ init_from_api(response)
39
+ end
40
+
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,5 @@
1
+ module Usatoday
2
+ module Census
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'shoulda'
4
+ require 'json'
5
+
6
+ %w(base exceptions location ethnicity housing population race).each do |f|
7
+ require File.join(File.dirname(__FILE__), '../lib/usatoday-census', f)
8
+ end
9
+
10
+ include Usatoday::Census
11
+
12
+ # set your USAT Census API key as an environment variable to run the tests
13
+ API_KEY = ENV['USAT_CENSUS_API_KEY']
14
+ Base.api_key = API_KEY
15
+
16
+ module TestUsatoday
17
+ end
@@ -0,0 +1,36 @@
1
+ class TestUsatoday::TestEthnicity < Test::Unit::TestCase
2
+ include Usatoday::Census
3
+
4
+ context "Ethnicity.new" do
5
+ setup do
6
+ sleep(1)
7
+ response = Base.invoke('ethnicity', {'keypat' => 'pa'})
8
+ @ethnicity = Ethnicity.init_from_api(response)
9
+ end
10
+
11
+ should "return an object of the Ethnicity type" do
12
+ assert_kind_of(Ethnicity, @ethnicity)
13
+ end
14
+ end
15
+
16
+ context "Ethnicity.new with placename" do
17
+ setup do
18
+ sleep(1)
19
+ @ethnicity = Ethnicity.search('Virginia', 'Placename')
20
+ end
21
+ should "return an object of the Ethnicity type" do
22
+ assert_kind_of(Ethnicity, @ethnicity)
23
+ end
24
+ end
25
+
26
+ context "Ethnicity.new with FIPS" do
27
+ setup do
28
+ sleep(1)
29
+ @ethnicity = Ethnicity.search(51, 'FIPS')
30
+ end
31
+ should "return an object of the Ethnicity type" do
32
+ assert_kind_of(Ethnicity, @ethnicity)
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,36 @@
1
+ class TestUsatoday::TestHousing < Test::Unit::TestCase
2
+ include Usatoday::Census
3
+ context "Housing.new" do
4
+ setup do
5
+ sleep(1)
6
+ response = Base.invoke('housing', {'keypat' => 'va'})
7
+ @housing = Housing.init_from_api(response)
8
+ end
9
+
10
+ should "return an object of the Housing type" do
11
+ assert_kind_of(Housing, @housing)
12
+ end
13
+ end
14
+
15
+ context "Housing.new with placename" do
16
+ setup do
17
+ sleep(1)
18
+ @housing = Housing.search('Virginia', 'Placename')
19
+ end
20
+ should "return an object of the Housing type" do
21
+ assert_kind_of(Housing, @housing)
22
+ end
23
+ end
24
+
25
+ context "Housing.new with FIPS" do
26
+ setup do
27
+ sleep(1)
28
+ @housing = Housing.search(51, 'FIPS')
29
+ end
30
+ should "return an object of the Housing type" do
31
+ assert_kind_of(Housing, @housing)
32
+ end
33
+ end
34
+
35
+
36
+ end
@@ -0,0 +1,36 @@
1
+ class TestUsatoday::TestLocation < Test::Unit::TestCase
2
+ include Usatoday::Census
3
+ context "Location.new" do
4
+ setup do
5
+ sleep(1)
6
+ response = Base.invoke('locations', {'keypat' => 'va'})
7
+ @location = Location.init_from_api(response)
8
+ end
9
+
10
+ should "return an object of the Location type" do
11
+ assert_kind_of(Location, @location)
12
+ end
13
+ end
14
+
15
+ context "Location.new with placename" do
16
+ setup do
17
+ sleep(1)
18
+ @location = Location.search('Virginia', 'Placename')
19
+ end
20
+ should "return an object of the Location type" do
21
+ assert_kind_of(Location, @location)
22
+ end
23
+ end
24
+
25
+ context "Location.new with FIPS" do
26
+ setup do
27
+ sleep(1)
28
+ @location = Location.search(51, 'FIPS')
29
+ end
30
+ should "return an object of the Location type" do
31
+ assert_kind_of(Location, @location)
32
+ end
33
+ end
34
+
35
+
36
+ end
@@ -0,0 +1,36 @@
1
+ class TestUsatoday::TestPopulation < Test::Unit::TestCase
2
+ include Usatoday::Census
3
+ context "Population.new" do
4
+ setup do
5
+ sleep(1)
6
+ response = Base.invoke('population', {'keypat' => 'va'})
7
+ @population = Population.init_from_api(response)
8
+ end
9
+
10
+ should "return an object of the Population type" do
11
+ assert_kind_of(Population, @population)
12
+ end
13
+ end
14
+
15
+ context "Population.new with placename" do
16
+ setup do
17
+ sleep(1)
18
+ @population = Population.search('Virginia', 'Placename')
19
+ end
20
+ should "return an object of the Population type" do
21
+ assert_kind_of(Population, @population)
22
+ end
23
+ end
24
+
25
+ context "Population.new with FIPS" do
26
+ setup do
27
+ sleep(1)
28
+ @population = Population.search(51, 'FIPS')
29
+ end
30
+ should "return an object of the Population type" do
31
+ assert_kind_of(Population, @population)
32
+ end
33
+ end
34
+
35
+
36
+ end
@@ -0,0 +1,36 @@
1
+ class TestUsatoday::TestRace < Test::Unit::TestCase
2
+ include Usatoday::Census
3
+ context "Race.new" do
4
+ setup do
5
+ sleep(1)
6
+ response = Base.invoke('race', {'keypat' => 'va'})
7
+ @race = Race.init_from_api(response)
8
+ end
9
+
10
+ should "return an object of the Race type" do
11
+ assert_kind_of(Race, @race)
12
+ end
13
+ end
14
+
15
+ context "Race.new with placename" do
16
+ setup do
17
+ sleep(1)
18
+ @race = Race.search('Virginia', 'Placename')
19
+ end
20
+ should "return an object of the Race type" do
21
+ assert_kind_of(Race, @race)
22
+ end
23
+ end
24
+
25
+ context "Race.new with FIPS" do
26
+ setup do
27
+ sleep(1)
28
+ @race = Race.search(51, 'FIPS')
29
+ end
30
+ should "return an object of the Race type" do
31
+ assert_kind_of(Race, @race)
32
+ end
33
+ end
34
+
35
+
36
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "usatoday-census/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "usatoday-census"
7
+ s.version = Usatoday::Census::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Derek Willis"]
10
+ s.email = ["dwillis@gmail.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{Wrapper for USA Today Census API}
13
+ s.description = %q{Retrieves state population and demographic information.}
14
+
15
+ s.rubyforge_project = "usatoday-census"
16
+
17
+ s.add_dependency "shoulda"
18
+ s.add_dependency "json"
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: usatoday-census
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Derek Willis
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-05-31 00:00:00 -04:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: shoulda
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: json
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ description: Retrieves state population and demographic information.
50
+ email:
51
+ - dwillis@gmail.com
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ extra_rdoc_files: []
57
+
58
+ files:
59
+ - .gitignore
60
+ - Gemfile
61
+ - README.md
62
+ - Rakefile
63
+ - lib/usatoday-census.rb
64
+ - lib/usatoday-census/base.rb
65
+ - lib/usatoday-census/ethnicity.rb
66
+ - lib/usatoday-census/exceptions.rb
67
+ - lib/usatoday-census/housing.rb
68
+ - lib/usatoday-census/location.rb
69
+ - lib/usatoday-census/population.rb
70
+ - lib/usatoday-census/query.rb
71
+ - lib/usatoday-census/race.rb
72
+ - lib/usatoday-census/version.rb
73
+ - test/test_helper.rb
74
+ - test/usatoday-census/test_ethnicity.rb
75
+ - test/usatoday-census/test_housing.rb
76
+ - test/usatoday-census/test_location.rb
77
+ - test/usatoday-census/test_population.rb
78
+ - test/usatoday-census/test_race.rb
79
+ - usatoday-census.gemspec
80
+ has_rdoc: true
81
+ homepage: ""
82
+ licenses: []
83
+
84
+ post_install_message:
85
+ rdoc_options: []
86
+
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ hash: 3
95
+ segments:
96
+ - 0
97
+ version: "0"
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
106
+ version: "0"
107
+ requirements: []
108
+
109
+ rubyforge_project: usatoday-census
110
+ rubygems_version: 1.4.2
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Wrapper for USA Today Census API
114
+ test_files:
115
+ - test/test_helper.rb
116
+ - test/usatoday-census/test_ethnicity.rb
117
+ - test/usatoday-census/test_housing.rb
118
+ - test/usatoday-census/test_location.rb
119
+ - test/usatoday-census/test_population.rb
120
+ - test/usatoday-census/test_race.rb