govkit 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. data/.rspec +3 -0
  2. data/Gemfile +13 -0
  3. data/README.md +0 -5
  4. data/Rakefile +1 -1
  5. data/VERSION +1 -1
  6. data/generators/govkit/templates/govkit.rb +3 -0
  7. data/govkit.gemspec +41 -13
  8. data/lib/gov_kit/acts_as_noteworthy.rb +15 -9
  9. data/lib/gov_kit/configuration.rb +3 -1
  10. data/lib/gov_kit/open_congress/bill.rb +3 -5
  11. data/lib/gov_kit/open_congress/blog_post.rb +3 -7
  12. data/lib/gov_kit/open_congress/news_post.rb +3 -7
  13. data/lib/gov_kit/open_congress/person.rb +2 -4
  14. data/lib/gov_kit/open_congress/person_stat.rb +2 -7
  15. data/lib/gov_kit/open_congress/roll_call.rb +4 -6
  16. data/lib/gov_kit/open_congress/roll_call_comparison.rb +1 -4
  17. data/lib/gov_kit/open_congress/voting_comparison.rb +1 -3
  18. data/lib/gov_kit/open_congress.rb +8 -0
  19. data/lib/gov_kit/open_states.rb +63 -14
  20. data/lib/gov_kit/railtie.rb +4 -0
  21. data/lib/gov_kit/resource.rb +62 -12
  22. data/lib/gov_kit/search_engines/bing.rb +38 -0
  23. data/lib/gov_kit/search_engines/google_blog.rb +3 -2
  24. data/lib/gov_kit/search_engines/google_news.rb +26 -16
  25. data/lib/gov_kit/search_engines/technorati.rb +1 -0
  26. data/lib/gov_kit/search_engines/wikipedia.rb +1 -1
  27. data/lib/gov_kit/search_engines.rb +1 -0
  28. data/lib/gov_kit/transparency_data.rb +98 -0
  29. data/lib/gov_kit/vote_smart.rb +9 -2
  30. data/lib/gov_kit.rb +4 -2
  31. data/spec/fixtures/bing/news_search.response +1 -0
  32. data/spec/fixtures/bing/no_results.response +1 -0
  33. data/spec/fixtures/open_congress/person.response +8 -0
  34. data/spec/fixtures/open_states/401.response +8 -4
  35. data/spec/fixtures/open_states/404.response +9 -0
  36. data/spec/fixtures/open_states/committee_find.response +53 -0
  37. data/spec/fixtures/open_states/committee_query.response +190 -0
  38. data/spec/fixtures/search_engines/google_news.response +8 -0
  39. data/spec/fixtures/transparency_data/contributions.response +18 -0
  40. data/spec/fixtures/transparency_data/entities_search.response +7 -0
  41. data/spec/fixtures/transparency_data/entities_search_limit_0.response +7 -0
  42. data/spec/fixtures/transparency_data/entities_search_limit_1.response +7 -0
  43. data/spec/fixtures/transparency_data/grants_find_all.response +7 -0
  44. data/spec/fixtures/transparency_data/lobbyists_find_all.response +7 -0
  45. data/spec/follow_the_money_spec.rb +7 -3
  46. data/spec/open_congress_spec.rb +36 -0
  47. data/spec/open_states_spec.rb +98 -16
  48. data/spec/search_engines_spec.rb +44 -0
  49. data/spec/spec_helper.rb +2 -3
  50. data/spec/transparency_data_spec.rb +106 -0
  51. metadata +118 -32
  52. data/spec/spec.opts +0 -6
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --colour
2
+ --format nested
3
+ --backtrace
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem "active_support"
6
+ gem "nokogiri"
7
+ gem "httparty"
8
+ gem "i18n"
9
+
10
+ group :test do
11
+ gem "rspec"
12
+ gem "fakeweb"
13
+ end
data/README.md CHANGED
@@ -59,9 +59,4 @@ For Canadian open government data, our friends up north have created a [govkit-c
59
59
 
60
60
  Let us know if you'd like to build a govkit for your region! We'd love to link to you. Your gem should be called, for example, govkit-uk (ISO 3166 country code), and your methods should live in the GovKit::GB namespace (for example).
61
61
 
62
- # TODOs
63
-
64
- * Guaranteed Eachability: If an API call is expected to return zero or more records, then GovKit should always return an array or nil to the caller, not a single object, even if there's only one record returned in this particular API call.
65
- * Migration & documentation for acts_as_noteworthy
66
-
67
62
  Copyright (c) 2010 Participatory Politics Foundation, released under the MIT license
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ begin
22
22
  gem.email = "develop@opencongress.org"
23
23
  gem.homepage = "http://github.com/opengovernment/govkit"
24
24
  gem.authors = ["Participatory Politics Foundation", "Srinivas Aki", "Carl Tashian"]
25
- gem.add_dependency('httparty', '>= 0.5.2')
25
+ gem.add_dependency('httparty', '>= 0.7.4')
26
26
  gem.add_dependency('json', '>= 1.4.3')
27
27
  gem.add_dependency('nokogiri', '>= 1.4.4')
28
28
  gem.add_dependency('fastercsv', '>= 1.5.3')
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.1
1
+ 0.7.0
@@ -19,6 +19,9 @@ if defined? GovKit
19
19
  # Technorati API key
20
20
  config.technorati_apikey = 'YOUR_TECHNORATI_APIKEY'
21
21
 
22
+ # Bing App ID
23
+ config.bing_appid = 'YOUR_BING_APPID'
24
+
22
25
  # Other things you could set here include alternate URLs for
23
26
  # the APIs. See GovKit::Configuration for available attributes.
24
27
  end
data/govkit.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{govkit}
8
- s.version = "0.6.1"
8
+ s.version = "0.7.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Participatory Politics Foundation", "Srinivas Aki", "Carl Tashian"]
12
- s.date = %q{2011-03-03}
12
+ s.date = %q{2011-06-29}
13
13
  s.description = %q{Govkit lets you quickly get encapsulated Ruby objects for common open government APIs. We're starting with Sunlight's Open States API and the Project Vote Smart API.}
14
14
  s.email = %q{develop@opencongress.org}
15
15
  s.extra_rdoc_files = [
@@ -18,6 +18,8 @@ Gem::Specification.new do |s|
18
18
  ]
19
19
  s.files = [
20
20
  ".document",
21
+ ".rspec",
22
+ "Gemfile",
21
23
  "LICENSE",
22
24
  "README.md",
23
25
  "Rakefile",
@@ -46,6 +48,7 @@ Gem::Specification.new do |s|
46
48
  "lib/gov_kit/railtie.rb",
47
49
  "lib/gov_kit/resource.rb",
48
50
  "lib/gov_kit/search_engines.rb",
51
+ "lib/gov_kit/search_engines/bing.rb",
49
52
  "lib/gov_kit/search_engines/google_blog.rb",
50
53
  "lib/gov_kit/search_engines/google_news.rb",
51
54
  "lib/gov_kit/search_engines/technorati.rb",
@@ -53,48 +56,73 @@ Gem::Specification.new do |s|
53
56
  "lib/gov_kit/transparency_data.rb",
54
57
  "lib/gov_kit/vote_smart.rb",
55
58
  "lib/govkit.rb",
59
+ "spec/fixtures/bing/news_search.response",
60
+ "spec/fixtures/bing/no_results.response",
56
61
  "spec/fixtures/follow_the_money/business-page0.response",
57
62
  "spec/fixtures/follow_the_money/business-page1.response",
58
63
  "spec/fixtures/follow_the_money/contribution.response",
59
64
  "spec/fixtures/follow_the_money/unauthorized.response",
65
+ "spec/fixtures/open_congress/person.response",
60
66
  "spec/fixtures/open_states/401.response",
67
+ "spec/fixtures/open_states/404.response",
61
68
  "spec/fixtures/open_states/410.response",
62
69
  "spec/fixtures/open_states/bill.response",
63
70
  "spec/fixtures/open_states/bill_query.response",
71
+ "spec/fixtures/open_states/committee_find.response",
72
+ "spec/fixtures/open_states/committee_query.response",
64
73
  "spec/fixtures/open_states/legislator.response",
65
74
  "spec/fixtures/open_states/legislator_query.response",
66
75
  "spec/fixtures/open_states/state.response",
76
+ "spec/fixtures/search_engines/google_news.response",
77
+ "spec/fixtures/transparency_data/contributions.response",
78
+ "spec/fixtures/transparency_data/entities_search.response",
79
+ "spec/fixtures/transparency_data/entities_search_limit_0.response",
80
+ "spec/fixtures/transparency_data/entities_search_limit_1.response",
81
+ "spec/fixtures/transparency_data/grants_find_all.response",
82
+ "spec/fixtures/transparency_data/lobbyists_find_all.response",
67
83
  "spec/follow_the_money_spec.rb",
84
+ "spec/open_congress_spec.rb",
68
85
  "spec/open_states_spec.rb",
69
- "spec/spec.opts",
70
- "spec/spec_helper.rb"
86
+ "spec/search_engines_spec.rb",
87
+ "spec/spec_helper.rb",
88
+ "spec/transparency_data_spec.rb"
71
89
  ]
72
90
  s.homepage = %q{http://github.com/opengovernment/govkit}
73
91
  s.require_paths = ["lib"]
74
- s.rubygems_version = %q{1.5.2}
92
+ s.rubygems_version = %q{1.6.2}
75
93
  s.summary = %q{Simple access to open government APIs around the web}
76
- s.test_files = [
77
- "spec/follow_the_money_spec.rb",
78
- "spec/open_states_spec.rb",
79
- "spec/spec_helper.rb"
80
- ]
81
94
 
82
95
  if s.respond_to? :specification_version then
83
96
  s.specification_version = 3
84
97
 
85
98
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
86
- s.add_runtime_dependency(%q<httparty>, [">= 0.5.2"])
99
+ s.add_runtime_dependency(%q<govkit>, [">= 0"])
100
+ s.add_runtime_dependency(%q<active_support>, [">= 0"])
101
+ s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
102
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
103
+ s.add_runtime_dependency(%q<i18n>, [">= 0"])
104
+ s.add_runtime_dependency(%q<httparty>, [">= 0.7.4"])
87
105
  s.add_runtime_dependency(%q<json>, [">= 1.4.3"])
88
106
  s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.4"])
89
107
  s.add_runtime_dependency(%q<fastercsv>, [">= 1.5.3"])
90
108
  else
91
- s.add_dependency(%q<httparty>, [">= 0.5.2"])
109
+ s.add_dependency(%q<govkit>, [">= 0"])
110
+ s.add_dependency(%q<active_support>, [">= 0"])
111
+ s.add_dependency(%q<nokogiri>, [">= 0"])
112
+ s.add_dependency(%q<httparty>, [">= 0"])
113
+ s.add_dependency(%q<i18n>, [">= 0"])
114
+ s.add_dependency(%q<httparty>, [">= 0.7.4"])
92
115
  s.add_dependency(%q<json>, [">= 1.4.3"])
93
116
  s.add_dependency(%q<nokogiri>, [">= 1.4.4"])
94
117
  s.add_dependency(%q<fastercsv>, [">= 1.5.3"])
95
118
  end
96
119
  else
97
- s.add_dependency(%q<httparty>, [">= 0.5.2"])
120
+ s.add_dependency(%q<govkit>, [">= 0"])
121
+ s.add_dependency(%q<active_support>, [">= 0"])
122
+ s.add_dependency(%q<nokogiri>, [">= 0"])
123
+ s.add_dependency(%q<httparty>, [">= 0"])
124
+ s.add_dependency(%q<i18n>, [">= 0"])
125
+ s.add_dependency(%q<httparty>, [">= 0.7.4"])
98
126
  s.add_dependency(%q<json>, [">= 1.4.3"])
99
127
  s.add_dependency(%q<nokogiri>, [">= 1.4.4"])
100
128
  s.add_dependency(%q<fastercsv>, [">= 1.5.3"])
@@ -6,19 +6,18 @@ module GovKit::ActsAsNoteworthy
6
6
 
7
7
  module ActMethods
8
8
  def acts_as_noteworthy(options={})
9
- options[:keywords] ||= []
10
-
11
9
  class_inheritable_accessor :options
12
10
  self.options = options
13
11
 
14
12
  unless included_modules.include? InstanceMethods
15
13
  instance_eval do
16
- has_many :mentions, :as => :owner
14
+ has_many :mentions, :as => :owner, :order => 'date desc'
17
15
 
18
16
  with_options :as => :owner, :class_name => "Mention" do |c|
19
17
  c.has_many :google_news_mentions, :conditions => {:search_source => "Google News"}, :order => 'date desc'
20
18
  c.has_many :google_blog_mentions, :conditions => {:search_source => "Google Blogs"}, :order => 'date desc'
21
19
  c.has_many :technorati_mentions, :conditions => {:search_source => "Technorati"}, :order => 'date desc'
20
+ c.has_many :bing_mentions, :conditions => {:search_source => "Bing"}, :order => 'date desc'
22
21
  end
23
22
  end
24
23
 
@@ -34,16 +33,23 @@ module GovKit::ActsAsNoteworthy
34
33
  module InstanceMethods
35
34
 
36
35
  def raw_mentions
37
- params = self.options[:keywords].clone
38
- attributes = self.options[:with].clone
36
+ opts = self.options.clone
37
+ attributes = opts.delete(:with)
38
+
39
+ if opts[:geo]
40
+ opts[:geo] = self.instance_eval("#{opts[:geo]}")
41
+ end
39
42
 
43
+ query = []
40
44
  attributes.each do |attr|
41
- params << self.instance_eval("#{attr}")
45
+ query << self.instance_eval("#{attr}")
42
46
  end
47
+
43
48
  {
44
- :google_news => GovKit::SearchEngines::GoogleNews.search(params),
45
- :google_blogs => GovKit::SearchEngines::GoogleBlog.search(params),
46
- :technorati => GovKit::SearchEngines::Technorati.search(params)
49
+ :google_news => GovKit::SearchEngines::GoogleNews.search(query, opts),
50
+ :google_blogs => GovKit::SearchEngines::GoogleBlog.search(query, opts),
51
+ # :technorati => GovKit::SearchEngines::Technorati.search(query),
52
+ :bing => GovKit::SearchEngines::Bing.search(query, opts)
47
53
  }
48
54
  end
49
55
  end
@@ -2,11 +2,12 @@ module GovKit
2
2
  class Configuration
3
3
  attr_accessor :sunlight_apikey, :openstates_base_url, :transparency_data_base_url, :transparency_data_categories_url
4
4
  attr_accessor :votesmart_apikey, :votesmart_base_url
5
- attr_accessor :ftm_apikey, :ftm_base_url
5
+ attr_accessor :openstates_apikey, :ftm_apikey, :ftm_base_url
6
6
  attr_accessor :opencongress_apikey, :opencongress_base_url
7
7
  attr_accessor :technorati_apikey, :technorati_base_url
8
8
  attr_accessor :google_blog_base_url, :google_news_base_url
9
9
  attr_accessor :wikipedia_base_url
10
+ attr_accessor :bing_appid, :bing_base_url
10
11
 
11
12
  def initialize
12
13
  @openstates_apikey = @votesmart_apikey = @ftm_apikey = ''
@@ -16,6 +17,7 @@ module GovKit
16
17
  @ftm_base_url = 'api.followthemoney.org/'
17
18
  @opencongress_base_url = 'www.opencongress.org/'
18
19
  @technorati_base_url = 'api.technorati.com'
20
+ @bing_base_url = 'api.search.live.net'
19
21
  @google_blog_base_url = 'blogsearch.google.com'
20
22
  @google_news_base_url = 'news.google.com'
21
23
  @wikipedia_base_url = 'en.wikipedia.org'
@@ -2,13 +2,11 @@ module GovKit
2
2
  module OpenCongress
3
3
  class Bill < OpenCongressObject
4
4
  attr_accessor :bill_type, :id, :introduced, :last_speech, :last_vote_date, :last_vote_roll, :last_vote_where, :last_action, :number, :plain_language_summary, :session, :sponsor, :co_sponsors, :title_full_common, :status, :most_recent_actions, :bill_titles, :recent_blogs, :recent_news, :ident
5
-
5
+
6
6
  def initialize(params)
7
- params.each do |key, value|
8
- instance_variable_set("@#{key}", value) if Bill.instance_methods.include? key
9
- end
7
+ super Bill, params
10
8
  end
11
-
9
+
12
10
  def ident
13
11
  "#{session}-#{bill_type}#{number}"
14
12
  end
@@ -4,14 +4,10 @@ module GovKit
4
4
  class BlogPost < OpenCongressObject
5
5
 
6
6
  attr_accessor :title, :date, :url, :source_url, :excerpt, :source, :average_rating
7
-
8
-
9
- def initialize(params)
10
- params.each do |key, value|
11
- instance_variable_set("@#{key}", value) if BlogPost.instance_methods.include? key
12
- end
13
- end
14
7
 
8
+ def initialize(params)
9
+ super BlogPost, params
10
+ end
15
11
 
16
12
  end
17
13
 
@@ -4,14 +4,10 @@ module GovKit
4
4
  class NewsPost < OpenCongressObject
5
5
 
6
6
  attr_accessor :title, :date, :url, :source_url, :excerpt, :source, :average_rating
7
-
8
-
9
- def initialize(params)
10
- params.each do |key, value|
11
- instance_variable_set("@#{key}", value) if NewsPost.instance_methods.include? key
12
- end
13
- end
14
7
 
8
+ def initialize(params)
9
+ super NewsPost, params
10
+ end
15
11
 
16
12
  end
17
13
 
@@ -7,11 +7,9 @@ module GovKit
7
7
  :name, :nickname, :osid, :party, :religion, :state, :title, :unaccented_name, :url, :user_approval,
8
8
  :youtube_id, :oc_user_comments, :oc_users_tracking, :abstains_percentage, :with_party_percentage, :recent_news,
9
9
  :recent_blogs, :person_stats
10
-
10
+
11
11
  def initialize(params)
12
- params.each do |key, value|
13
- instance_variable_set("@#{key}", value) if Person.instance_methods.include? key
14
- end
12
+ super Person, params
15
13
  end
16
14
 
17
15
  def self.find(params)
@@ -4,14 +4,9 @@ module GovKit
4
4
 
5
5
  attr_accessor :votes_most_often_with_id, :opposing_party_votes_most_often_with_id, :votes_least_often_with_id, :same_party_votes_least_often_with_id, :party_votes_percentage, :abstains_percentage, :abstains_percentage_rank, :party_votes_percentage_rank, :sponsored_bills, :cosponsored_bills, :abstains, :sponsored_bills_passed_rank, :cosponsored_bills_passed_rank, :sponsored_bills_passed, :cosponsored_bills_passed, :sponsored_bills_rank, :cosponsored_bills_rank
6
6
 
7
-
8
7
  def initialize(params)
9
- params.each do |key, value|
10
- instance_variable_set("@#{key}", value) if PersonStat.instance_methods.include? key
11
- end
12
- end
13
-
14
-
8
+ super PersonStat, params
9
+ end
15
10
  end
16
11
 
17
12
  end
@@ -4,13 +4,11 @@ module GovKit
4
4
 
5
5
  attr_accessor :abstains, :presents, :roll_type, :title, :question, :republican_position, :democratic_position,
6
6
  :amendment_id, :ayes, :nays, :bill, :date, :number, :id, :required, :where
7
-
7
+
8
8
  def initialize(params)
9
- params.each do |key, value|
10
- instance_variable_set("@#{key}", value) if RollCall.instance_methods.include? key
11
- end
12
- end
13
-
9
+ super RollCall, params
10
+ end
11
+
14
12
  end
15
13
  end
16
14
  end
@@ -5,10 +5,7 @@ module GovKit
5
5
  attr_accessor :roll_call, :person1, :person2
6
6
 
7
7
  def initialize(params)
8
- params.each do |key, value|
9
- instance_variable_set("@#{key}", value) if RollCallComparison.instance_methods.include? key
10
- end
11
-
8
+ super RollCallComparison, params
12
9
 
13
10
  set_people
14
11
  set_roll_call
@@ -7,9 +7,7 @@ module GovKit
7
7
  :other_votes
8
8
 
9
9
  def initialize(params)
10
- params.each do |key, value|
11
- instance_variable_set("@#{key}", value) if VotingComparison.instance_methods.include? key
12
- end
10
+ super VotingComparison, params
13
11
 
14
12
  set_people
15
13
  set_votes
@@ -1,6 +1,7 @@
1
1
  require 'nokogiri'
2
2
  require 'open-uri'
3
3
  require 'json'
4
+ require 'CGI'
4
5
 
5
6
  module GovKit::OpenCongress
6
7
  autoload :Bill, 'gov_kit/open_congress/bill'
@@ -12,6 +13,13 @@ module GovKit::OpenCongress
12
13
  autoload :PersonStat, 'gov_kit/open_congress/person_stat'
13
14
 
14
15
  class OpenCongressObject
16
+
17
+ def initialize(obj, params)
18
+ params.each do |key, value|
19
+ key = key.to_sym if RUBY_VERSION[0,3] == "1.9"
20
+ instance_variable_set("@#{key}", value) if obj.instance_methods.include? key
21
+ end
22
+ end
15
23
 
16
24
  def self.construct_url(api_method, params)
17
25
  url = nil
@@ -1,34 +1,76 @@
1
1
  module GovKit
2
+
3
+ # Parent class for OpenStates resources
4
+ # See http://openstates.sunlightlabs.com/api/
2
5
  class OpenStatesResource < Resource
6
+
7
+ # Uses default_params from the HTTParty gem.
8
+ # See HTTParty::ClassMethods:
9
+ # http://rubydoc.info/gems/httparty/0.7.4/HTTParty/ClassMethods#default_params-instance_method
3
10
  default_params :output => 'json', :apikey => GovKit::configuration.sunlight_apikey
4
11
  base_uri GovKit::configuration.openstates_base_url
12
+
13
+ # Do a GET query, with optional parameters.
14
+ #
15
+ # OpenStates returns a 404 error when a query
16
+ # returns nothing.
17
+ #
18
+ # So, if a query result is a resource not found error,
19
+ # we return an empty set.
20
+ def self.get_uri(uri, options={})
21
+ begin
22
+ response = get(uri, options)
23
+ result = parse(response)
24
+ rescue ResourceNotFound
25
+ return []
26
+ end
27
+ result
28
+ end
29
+
5
30
  end
6
31
 
32
+ # Ruby module for interacting with the Open States Project API
33
+ # See http://openstates.sunlightlabs.com/api/
34
+ # Most +find+ and +search+ methods:
35
+ # * call HTTParty::ClassMethods#get
36
+ # * which returns an HTTParty::Response object
37
+ # * which is passed to GovKit::Resource#parse
38
+ # * which uses the response to populate a Resource
39
+ #
7
40
  module OpenStates
8
41
  ROLE_MEMBER = "member"
9
42
  ROLE_COMMITTEE_MEMBER = "committee member"
10
43
  CHAMBER_UPPER = "upper"
11
44
  CHAMBER_LOWER = "lower"
12
45
 
46
+ # The State class represents the state data returned from Open States.
47
+ #
48
+ # For details about fields returned, see the Open States documentation, at
49
+ # http://openstates.sunlightlabs.com/api/metadata/,
50
+ #
13
51
  class State < OpenStatesResource
14
52
  def self.find_by_abbreviation(abbreviation)
15
- response = get("/metadata/#{abbreviation}/")
16
- parse(response)
53
+ get_uri("/metadata/#{abbreviation}/")
17
54
  end
18
55
  end
19
56
 
57
+ # The Bill class represents the bill data returned from Open States.
58
+ #
59
+ # For details about fields returned, see the Open States documentation, at
60
+ # http://openstates.sunlightlabs.com/api/bills/,
61
+ #
20
62
  class Bill < OpenStatesResource
21
63
  # http://openstates.sunlightlabs.com/api/v1/bills/ca/20092010/AB 667/
22
64
  def self.find(state_abbrev, session, bill_id, chamber = '')
23
65
  escaped_bill_id = bill_id.gsub(/ /, '%20')
24
66
  escaped_session = session.gsub(/ /, '%20')
25
- response = get("/bills/#{state_abbrev.downcase}/#{escaped_session}/#{chamber.blank? ? '' : chamber + '/'}#{escaped_bill_id}/")
26
- parse(response)
67
+
68
+ get_uri("/bills/#{state_abbrev.downcase}/#{escaped_session}/#{chamber.blank? ? '' : chamber + '/'}#{escaped_bill_id}/")
27
69
  end
28
70
 
29
71
  def self.search(query, options = {})
30
- response = get('/bills/', :query => {:q => query}.merge(options))
31
- parse(response)
72
+ result = get_uri('/bills/', :query => {:q => query}.merge(options))
73
+ return Array(result)
32
74
  end
33
75
 
34
76
  def self.latest(updated_since, ops = {})
@@ -37,27 +79,34 @@ module GovKit
37
79
  end
38
80
  end
39
81
 
82
+ # The Legislator class represents the legislator data returned from Open States.
83
+ #
84
+ # For details about fields returned, see the Open States documentation, at
85
+ # http://openstates.sunlightlabs.com/api/legislators/,
86
+ #
40
87
  class Legislator < OpenStatesResource
41
88
  def self.find(legislator_id)
42
- response = get("/legislators/#{legislator_id}/")
43
- parse(response)
89
+ get_uri("/legislators/#{legislator_id}/")
44
90
  end
45
91
 
46
92
  def self.search(options = {})
47
- response = get('/legislators/', :query => options)
48
- parse(response)
93
+ result = get_uri('/legislators/', :query => options)
94
+ return Array(result)
49
95
  end
50
96
  end
51
97
 
98
+ # The Committee class represents the committee data returned from Open States.
99
+ #
100
+ # For details about fields returned, see the Open States documentation, at
101
+ # http://openstates.sunlightlabs.com/api/committees/,
102
+ #
52
103
  class Committee < OpenStatesResource
53
104
  def self.find(committee_id)
54
- response = get("/committees/#{committee_id}/")
55
- parse(response)
105
+ get_uri("/committees/#{committee_id}/")
56
106
  end
57
107
 
58
108
  def self.search(options = {})
59
- response = get('/committees/', :query => options)
60
- parse(response)
109
+ get_uri('/committees/', :query => options)
61
110
  end
62
111
  end
63
112
 
@@ -12,6 +12,10 @@ module GovKit
12
12
  end
13
13
  end
14
14
 
15
+ # This class exists in order to run its insert method while
16
+ # Rails is loading.
17
+ # This then adds GovKit::ActsAsNoteworthy to ActiveRecord::Base.
18
+ # See http://api.rubyonrails.org/classes/Rails/Railtie.html
15
19
  class Railtie
16
20
  def self.insert
17
21
  ActiveRecord::Base.send(:include, GovKit::ActsAsNoteworthy)