pitosalas-govsdk 0.0.4 → 0.0.5
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/README.textile +33 -9
- data/VERSION.yml +1 -1
- data/lib/congress_person.rb +11 -2
- data/lib/govsdk_base.rb +20 -3
- data/lib/govsdkgem.rb +1 -0
- data/lib/util.rb +110 -0
- data/test/congressperson_test.rb +9 -0
- data/test/test_helper.rb +1 -0
- data/test/test_template.rb +1 -1
- data/test/util_test.rb +42 -0
- metadata +4 -2
data/README.textile
CHANGED
@@ -22,22 +22,46 @@ Unfortunately for now, each of the different services request that you use it's
|
|
22
22
|
|
23
23
|
h2. IDs
|
24
24
|
|
25
|
-
There are various IDs (identifiers assigned by some outside, real world agency to some outside real world thing) throughout the government. One you know is a drivers license number assigned to a person.
|
25
|
+
There are various IDs (identifiers assigned by some outside, real world agency to some outside real world thing) throughout the government. One you know is a drivers license number assigned to a person.
|
26
|
+
|
27
|
+
h2. Basic usage
|
28
|
+
|
29
|
+
Here is a very simplistic minimal example:
|
30
|
+
<pre>
|
31
|
+
<code>
|
32
|
+
# You always have to start off by declaring that you want to use Govsdk. You need to supply one or more of your API keys.
|
33
|
+
GovSdk.init :sunlight => "enter your API key..."
|
34
|
+
|
35
|
+
#Lookup a congress person "barney" "frank". The call returns an array of matching congresspeople
|
36
|
+
cp = CongressPerson.find_by_names("barney", "frank")
|
37
|
+
|
38
|
+
# print the photo url of the first congress person matching
|
39
|
+
puts cp[0].photo_url
|
40
|
+
</code>
|
41
|
+
</pre>
|
26
42
|
|
27
|
-
# CrpId - Center for responsible politics IDs for congress persons
|
28
|
-
|
29
|
-
In many cases none of the APIs furnish a useful ID.
|
30
43
|
|
31
44
|
h1. KEY CLASSES
|
32
45
|
|
46
|
+
# CongressPerson - Work with legislators: senators and congressmen
|
47
|
+
|
48
|
+
#### self.find_by_name - return an array of CongressPersons
|
49
|
+
#### self.find_by_zipcode - return an array of CongressPersons
|
50
|
+
#### self.find_by_crp_id - return the CongressPerson with specified crp id
|
51
|
+
|
52
|
+
h2. Internal classes
|
53
|
+
|
33
54
|
# APIMgr - Parent class of each of the manager classes below
|
34
55
|
## NewYorkTimesAPI - Class managing access to the New York Times API
|
35
56
|
## SunlightAPI - Class managing access to the Sunlight API
|
36
57
|
## SpenSecretsAPI - Class managing the OpenSecrets API
|
37
58
|
### Methods: setAPIKey/getAPIKey
|
38
59
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
60
|
+
|
61
|
+
|
62
|
+
h1. Utils
|
63
|
+
|
64
|
+
There are lots of simple transformations which come up in using these
|
65
|
+
APIs and so for convenience sake some of those are built right into this library
|
66
|
+
|
67
|
+
Utils.lookup_state_name(string) -> two letter state code for that state
|
data/VERSION.yml
CHANGED
data/lib/congress_person.rb
CHANGED
@@ -32,7 +32,7 @@ class CongressPerson < GovSdkBase
|
|
32
32
|
|
33
33
|
attr_reader :firstname, :lastname, :party, :state, :congress_office, :phone, :fax, :emai,
|
34
34
|
:website, :webform, :website_url, :bioguide_id, :congresspedia_url, :state_machine_id,
|
35
|
-
:district, :title, :govtrack_id, :crp_id, :nickname, :votesmart_id
|
35
|
+
:district, :title, :govtrack_id, :crp_id, :nickname, :votesmart_id, :votesmart_id
|
36
36
|
|
37
37
|
# Maps specific set of CongressPerson attributes to Sunlight APIs. Mapping is structured as
|
38
38
|
# "name of attr in CongressPerson object" => "name of hash key in result returned from API call"
|
@@ -78,7 +78,16 @@ class CongressPerson < GovSdkBase
|
|
78
78
|
sunlight_hash = GovSdk.sunlight_api.legislators_search(name)
|
79
79
|
sunlight_hash.collect {|leg| convert_to_congressperson(leg["result"]["legislator"])}
|
80
80
|
end
|
81
|
-
|
81
|
+
|
82
|
+
# Return an array of Congress People, searching using first and last name
|
83
|
+
def self.find_by_names(firstname, lastname)
|
84
|
+
assume_string lastname
|
85
|
+
assume_string firstname
|
86
|
+
assume_uses_sunl_api
|
87
|
+
result_array = GovSdk.sunlight_api.legislators_getlist(:firstname => firstname, :lastname => lastname)
|
88
|
+
result_array.collect { |leg| convert_to_congressperson(leg["legislator"])}
|
89
|
+
end
|
90
|
+
|
82
91
|
def self.find_by_zipcode(zip)
|
83
92
|
raise ArgumentError, 'zipcodes must be Strings' unless zip.is_a?(String)
|
84
93
|
end
|
data/lib/govsdk_base.rb
CHANGED
@@ -36,19 +36,36 @@ class GovSdkBase
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def assume_uses_google_api
|
39
|
-
raise ArgumentError, "Call requires Google API and Google key" +
|
39
|
+
raise ArgumentError, "Call requires Google API and Google key" + caller.shift unless GovSdk.google_api.initialized?
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.assume_uses_sunl_api
|
43
|
+
raise ArgumentError, "Call requires Sunlight API, so it needs you to set the Sunlight API key" + caller.shift unless GovSdk.sunlight_api.initialized?
|
44
|
+
end
|
45
|
+
|
46
|
+
def assume_uses_sunl_api
|
47
|
+
self.assume_uses_sunl_api
|
40
48
|
end
|
41
49
|
|
42
50
|
def assume_nil_or_integer val
|
43
|
-
raise ArgumentError, "Requires nil or integer argument. Called from " +
|
51
|
+
raise ArgumentError, "Requires nil or integer argument. Called from " + caller.shift unless val.nil? || val.kind_of?(Integer)
|
44
52
|
end
|
45
53
|
|
46
54
|
def self.assume_hash val
|
47
|
-
raise ArgumentError, "Requires a hash argument. Called from " +
|
55
|
+
raise ArgumentError, "Requires a hash argument. Called from " + caller.shift unless val.kind_of?(Hash)
|
48
56
|
end
|
49
57
|
|
50
58
|
def assume_hash val
|
51
59
|
self.assume_hash val
|
52
60
|
end
|
53
61
|
|
62
|
+
def self.assume_string(val)
|
63
|
+
raise ArgumentError, "Requires a string argument. Called from " + caller.shift unless val.kind_of?(String)
|
64
|
+
end
|
65
|
+
|
66
|
+
def assume_string(val)
|
67
|
+
self.assume_string val
|
68
|
+
end
|
69
|
+
|
70
|
+
|
54
71
|
end
|
data/lib/govsdkgem.rb
CHANGED
data/lib/util.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
=begin
|
2
|
+
* Name: util.rb
|
3
|
+
* Description: Small handy translators to support users of govsdk
|
4
|
+
* Author: Pito Salas
|
5
|
+
* Copyright: (c) R. Pito Salas and Associates, Inc.
|
6
|
+
* Date: January 2009
|
7
|
+
* License: GPL
|
8
|
+
|
9
|
+
This file is part of GovSDK.
|
10
|
+
|
11
|
+
GovSDK is free software: you can redistribute it and/or modify
|
12
|
+
it under the terms of the GNU General Public License as published by
|
13
|
+
the Free Software Foundation, either version 3 of the License, or
|
14
|
+
(at your option) any later version.
|
15
|
+
|
16
|
+
GovSDK is distributed in the hope that it will be useful,
|
17
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
GNU General Public License for more details.
|
20
|
+
|
21
|
+
You should have received a copy of the GNU General Public License
|
22
|
+
along with GovSDK. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
|
24
|
+
require "ruby-debug"
|
25
|
+
Debugger.settings[:autolist] = 1 # list nearby lines on stop
|
26
|
+
Debugger.settings[:autoeval] = 1
|
27
|
+
Debugger.start
|
28
|
+
|
29
|
+
=end
|
30
|
+
|
31
|
+
STATE_ABBR = {
|
32
|
+
'AL' => 'Alabama',
|
33
|
+
'AK' => 'Alaska',
|
34
|
+
'AS' => 'America Samoa',
|
35
|
+
'AZ' => 'Arizona',
|
36
|
+
'AR' => 'Arkansas',
|
37
|
+
'CA' => 'California',
|
38
|
+
'CO' => 'Colorado',
|
39
|
+
'CT' => 'Connecticut',
|
40
|
+
'DE' => 'Delaware',
|
41
|
+
'DC' => 'District of Columbia',
|
42
|
+
'FM' => 'Micronesia1',
|
43
|
+
'FL' => 'Florida',
|
44
|
+
'GA' => 'Georgia',
|
45
|
+
'GU' => 'Guam',
|
46
|
+
'HI' => 'Hawaii',
|
47
|
+
'ID' => 'Idaho',
|
48
|
+
'IL' => 'Illinois',
|
49
|
+
'IN' => 'Indiana',
|
50
|
+
'IA' => 'Iowa',
|
51
|
+
'KS' => 'Kansas',
|
52
|
+
'KY' => 'Kentucky',
|
53
|
+
'LA' => 'Louisiana',
|
54
|
+
'ME' => 'Maine',
|
55
|
+
'MH' => 'Islands1',
|
56
|
+
'MD' => 'Maryland',
|
57
|
+
'MA' => 'Massachusetts',
|
58
|
+
'MI' => 'Michigan',
|
59
|
+
'MN' => 'Minnesota',
|
60
|
+
'MS' => 'Mississippi',
|
61
|
+
'MO' => 'Missouri',
|
62
|
+
'MT' => 'Montana',
|
63
|
+
'NE' => 'Nebraska',
|
64
|
+
'NV' => 'Nevada',
|
65
|
+
'NH' => 'New Hampshire',
|
66
|
+
'NJ' => 'New Jersey',
|
67
|
+
'NM' => 'New Mexico',
|
68
|
+
'NY' => 'New York',
|
69
|
+
'NC' => 'North Carolina',
|
70
|
+
'ND' => 'North Dakota',
|
71
|
+
'OH' => 'Ohio',
|
72
|
+
'OK' => 'Oklahoma',
|
73
|
+
'OR' => 'Oregon',
|
74
|
+
'PW' => 'Palau',
|
75
|
+
'PA' => 'Pennsylvania',
|
76
|
+
'PR' => 'Puerto Rico',
|
77
|
+
'RI' => 'Rhode Island',
|
78
|
+
'SC' => 'South Carolina',
|
79
|
+
'SD' => 'South Dakota',
|
80
|
+
'TN' => 'Tennessee',
|
81
|
+
'TX' => 'Texas',
|
82
|
+
'UT' => 'Utah',
|
83
|
+
'VT' => 'Vermont',
|
84
|
+
'VI' => 'Virgin Island',
|
85
|
+
'VA' => 'Virginia',
|
86
|
+
'WA' => 'Washington',
|
87
|
+
'WV' => 'West Virginia',
|
88
|
+
'WI' => 'Wisconsin',
|
89
|
+
'WY' => 'Wyoming'
|
90
|
+
}
|
91
|
+
#
|
92
|
+
# Simple collection of Utilities useful to govsdk users
|
93
|
+
#
|
94
|
+
class Util
|
95
|
+
|
96
|
+
#
|
97
|
+
# 2 letter code for state that most closely matches state_name, or nil.
|
98
|
+
#
|
99
|
+
def self.lookup_state_name(state_name)
|
100
|
+
matches = STATE_ABBR.select { |k,v| v.include? state_name.capitalize}
|
101
|
+
if matches.length == 1
|
102
|
+
return matches[0][0]
|
103
|
+
else
|
104
|
+
return nil
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
|
data/test/congressperson_test.rb
CHANGED
@@ -35,6 +35,8 @@ class CongressPersonTest < Test::Unit::TestCase
|
|
35
35
|
setup do
|
36
36
|
GovSdk.load_apis
|
37
37
|
GovSdk.sunlight_api.key = "4ffa22917ab1ed010a8e681c550c9593"
|
38
|
+
GovSdk.google_api.key = "ABQIAAAAyvWaJgF_91PvBZhITx5FDxRIYAcXj39F4zFQfQ2X3IEFURxvMRRUi0aCG6WofnUSRRoI-Pgytm5yUA"
|
39
|
+
|
38
40
|
@cpnone = CongressPerson.fuzzy_find_by_name("Pito Salas")
|
39
41
|
@cpkennedy = CongressPerson.fuzzy_find_by_name("Kennedy")
|
40
42
|
@cpkennedy[0].nickname == "Ted" ? @ted_crp_id = @cpkennedy[0].crp_id : @ted_crp_id = @cpkennedy[1].crp_id
|
@@ -50,6 +52,13 @@ class CongressPersonTest < Test::Unit::TestCase
|
|
50
52
|
assert ["Edward", "Patrick Joseph"].include? a_kennedy.firstname
|
51
53
|
end
|
52
54
|
end
|
55
|
+
|
56
|
+
should "locate barney frank by first and last name" do
|
57
|
+
cp = CongressPerson.find_by_names("barney", "frank")
|
58
|
+
assert_equal 1, cp.length
|
59
|
+
assert_equal "26897", cp[0].votesmart_id
|
60
|
+
pp cp[0].photo_url
|
61
|
+
end
|
53
62
|
|
54
63
|
context "trying to use CRP from earlier test" do
|
55
64
|
setup do
|
data/test/test_helper.rb
CHANGED
data/test/test_template.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper'
|
2
1
|
=begin
|
3
2
|
* Name: test_template.rb
|
4
3
|
* Description: Template for GovSdk Tests
|
@@ -27,6 +26,7 @@ require File.dirname(__FILE__) + '/test_helper'
|
|
27
26
|
Debugger.settings[:autoeval] = 1
|
28
27
|
Debugger.start
|
29
28
|
=end
|
29
|
+
require File.dirname(__FILE__) + '/test_helper'
|
30
30
|
|
31
31
|
class MyTest < Test::Unit::TestCase
|
32
32
|
context "Test context" do
|
data/test/util_test.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
=begin
|
2
|
+
* Name: test_template.rb
|
3
|
+
* Description: Template for GovSdk Tests
|
4
|
+
* Author: Pito Salas
|
5
|
+
* Copyright: (c) R. Pito Salas and Associates, Inc.
|
6
|
+
* Date: January 2009
|
7
|
+
* License: GPL
|
8
|
+
|
9
|
+
This file is part of GovSDK.
|
10
|
+
|
11
|
+
GovSDK is free software: you can redistribute it and/or modify
|
12
|
+
it under the terms of the GNU General Public License as published by
|
13
|
+
the Free Software Foundation, either version 3 of the License, or
|
14
|
+
(at your option) any later version.
|
15
|
+
|
16
|
+
GovSDK is distributed in the hope that it will be useful,
|
17
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
GNU General Public License for more details.
|
20
|
+
|
21
|
+
You should have received a copy of the GNU General Public License
|
22
|
+
along with GovSDK. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
|
24
|
+
require "ruby-debug"
|
25
|
+
Debugger.settings[:autolist] = 1 # list nearby lines on stop
|
26
|
+
Debugger.settings[:autoeval] = 1
|
27
|
+
Debugger.start
|
28
|
+
=end
|
29
|
+
|
30
|
+
require File.dirname(__FILE__) + '/test_helper'
|
31
|
+
|
32
|
+
class MyTest < Test::Unit::TestCase
|
33
|
+
context "Util methods test" do
|
34
|
+
|
35
|
+
should "Lookup a state" do
|
36
|
+
assert_equal "MA", Util.lookup_state_name("Mass")
|
37
|
+
assert_equal "MA", Util.lookup_state_name("mass")
|
38
|
+
assert_equal nil, Util.lookup_state_name("new")
|
39
|
+
assert_equal nil, Util.lookup_state_name("pito")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pitosalas-govsdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pito Salas
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-02-
|
12
|
+
date: 2009-02-25 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- lib/govsdk.rb
|
35
35
|
- lib/govsdk_base.rb
|
36
36
|
- lib/govsdkgem.rb
|
37
|
+
- lib/util.rb
|
37
38
|
- test/congressperson_test.rb
|
38
39
|
- test/google_api_test.rb
|
39
40
|
- test/govsdk_test.rb
|
@@ -41,6 +42,7 @@ files:
|
|
41
42
|
- test/sunlight_api_test.rb
|
42
43
|
- test/test_helper.rb
|
43
44
|
- test/test_template.rb
|
45
|
+
- test/util_test.rb
|
44
46
|
- test/vote_smart_api_test.rb
|
45
47
|
has_rdoc: true
|
46
48
|
homepage: http://github.com/pitosalas/govsdk
|