campaign_cash 2.0.8 → 2.1.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.
- data/.gitignore +1 -0
- data/README.rdoc +3 -2
- data/lib/campaign_cash.rb +1 -1
- data/lib/campaign_cash/contribution.rb +1 -2
- data/lib/campaign_cash/filing.rb +0 -1
- data/lib/campaign_cash/filing_summary.rb +23 -0
- data/lib/campaign_cash/independent_expenditure.rb +4 -2
- data/lib/campaign_cash/individual_contribution.rb +35 -0
- data/lib/campaign_cash/president.rb +29 -19
- data/lib/campaign_cash/version.rb +1 -1
- data/test/campaign_cash/test_filing.rb +1 -1
- data/test/campaign_cash/test_filing_summary.rb +14 -0
- data/test/campaign_cash/test_individual_contribution.rb +22 -0
- data/test/campaign_cash/test_president.rb +32 -9
- data/test/test_helper.rb +1 -1
- metadata +10 -4
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -12,11 +12,11 @@ Simple ruby wrapper for The New York Times Campaign Finance API[http://developer
|
|
12
12
|
|
13
13
|
== News
|
14
14
|
|
15
|
+
* Feb. 8, 2012: Version 2.1.0 released. Added better support for independent expenditures and FilingSummary class for presidential candidate filings.
|
16
|
+
* Jan. 28, 2012: Version 2.0.8 released. Bugfix for Candidate#search. Thanks to @benjaminjackson for patch.
|
15
17
|
* Jan. 24, 2012: Version 2.0.7 released. Added candidate_name attribute accessor to IndependentExpenditure objects.
|
16
18
|
* Jan. 19, 2012: Version 2.0.6 released. Added transaction_id param to IndependentExpenditure objects.
|
17
19
|
* Jan. 19, 2012: Version 2.0.5 released. Bugfix to add amendment param to IndependentExpenditure objects.
|
18
|
-
* Jan. 18, 2012: Version 2.0.4 released. Bugfix to handle offsets better.
|
19
|
-
* Jan. 14, 2012: Version 2.0.3 released. Bugfix so that President.detail returns 1 object, not an array.
|
20
20
|
|
21
21
|
== INSTALL:
|
22
22
|
|
@@ -203,6 +203,7 @@ The IE responses also accept an optional offset argument, using multiples of 20.
|
|
203
203
|
* Derek Willis, dwillis@nytimes.com
|
204
204
|
* Al Shaw, almshaw@gmail.com
|
205
205
|
* Jason Holt, jjh@offensivepolitics.net
|
206
|
+
* Benjamin Jackson, http://twitter.com/benjaminjackson
|
206
207
|
|
207
208
|
== Copyright
|
208
209
|
|
data/lib/campaign_cash.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
%w(base candidate committee contribution filing form independent_expenditure president).each do |f|
|
1
|
+
%w(base candidate committee contribution individual_contribution filing filing_summary form independent_expenditure president).each do |f|
|
2
2
|
require File.join(File.dirname(__FILE__), '../lib/campaign_cash', f)
|
3
3
|
end
|
data/lib/campaign_cash/filing.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
module CampaignCash
|
2
|
+
class FilingSummary < Base
|
3
|
+
|
4
|
+
attr_reader :pac_contributions_period, :contributions_2300, :party_contributions_cycle, :fundraising_offsets_period, :primary_general, :pac_refunds_cycle, :created_at, :party_refunds_cycle, :fundraising_expenses_period, :net_party_contributions, :num_contributions_200_499, :individual_refunds_cycle, :candidate_contributions_period, :legal_offsets_cycle, :num_contributions_500_1499, :net_operating_expenses, :total_debts_owed, :refunds_200_499, :refunds_1500_2299, :transfers_out_period, :net_primary, :liquidate_period, :contributions_200_499, :operating_offsets_cycle, :num_contributions_1500_2299, :candidate_loan_repayments_period, :committee_uri, :federal_funds_cycle, :net_candidate_contributions, :candidate_loans_period, :filing_id, :net_pac_contributions, :num_refunds_200_499, :candidate_loan_repayments_cycle, :total_offsets_cycle, :party_contributions_period, :net_individual_contributions, :num_refunds_1500_2299, :net_general, :total_receipts_cycle, :federal_funds_period, :transfers_out_cycle, :cycle, :other_loan_repayments_period, :contributions_500_1499, :legal_offsets_period, :date_coverage_from, :contributions_less_than_200, :fec_form_type, :candidate_contributions_cycle, :cash_on_hand_beginning, :individual_refunds_period, :updated_at, :fundraising_expenses_cycle, :num_refunds_500_1499, :cash_on_hand_close, :num_contributions_less_than_200, :total_loans_cycle, :candidate_uri, :contributions_1500_2299, :refunds_2300, :flag_most_current_report, :total_loan_repayments_period, :other_loans_period, :operating_expenditures_cycle, :other_disbursements_period, :total_loans_period, :transfers_in_period, :transfers_in_cycle, :report, :legal_expenses_period, :candidate_loans_cycle, :individual_contributions_period, :other_disbursements_cycle, :total_disbursements_period, :other_loans_cycle, :net_transfers_in, :net_disbursements, :operating_expenditures_period, :fundraising_offsets_cycle, :date_coverage_to, :total_loan_repayments_cycle, :total_disbursements_cycle, :party_refunds_period, :individual_contributions_cycle, :net_total_contributions, :other_loan_repayments_cycle, :total_refunds_cycle, :total_receipts_period, :total_offsets_period, :total_contributions_period, :total_contributions_cycle, :refunds_500_1499, :pac_refunds_period, :flag_valid_report, :legal_expenses_cycle, :num_refunds_less_than_200, :refunds_less_than_200, :pac_contributions_cycle, :net_legal_expenses, :net_fundraising_expenses, :num_contributions_2300, :total_refunds_period, :operating_offsets_period, :num_refunds_2300
|
5
|
+
|
6
|
+
def initialize(params={})
|
7
|
+
params.each_pair do |k,v|
|
8
|
+
instance_variable_set("@#{k}", v)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.create(params={})
|
13
|
+
self.new(params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.by_id(id)
|
17
|
+
cycle = CURRENT_CYCLE
|
18
|
+
result = FilingSummary.create(Base.invoke("#{cycle}/filings/#{id}")["results"]["filing_summary"])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
@@ -14,7 +14,7 @@ module CampaignCash
|
|
14
14
|
:committee_name => params['fec_committee_name'],
|
15
15
|
:candidate => parse_candidate(params['fec_candidate']),
|
16
16
|
:office => params['office'],
|
17
|
-
:state => params['state'].strip,
|
17
|
+
:state => params['state'] ? params['state'].strip : nil,
|
18
18
|
:district => params['district'],
|
19
19
|
:date => date_parser(params['date']),
|
20
20
|
:support_or_oppose => params['support_or_oppose'],
|
@@ -25,7 +25,9 @@ module CampaignCash
|
|
25
25
|
:date_received => date_parser(params['date_received']),
|
26
26
|
:amendment => params['amendment'],
|
27
27
|
:transaction_id => params['transaction_id'],
|
28
|
-
:candidate_name => params['candidate_name']
|
28
|
+
:candidate_name => params['candidate_name'],
|
29
|
+
# hash is a SHA1 of committee_id, date and transaction_id
|
30
|
+
:hash => params['hash']
|
29
31
|
end
|
30
32
|
|
31
33
|
def self.latest(offset=nil)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module CampaignCash
|
2
|
+
class IndividualContribution < Base
|
3
|
+
|
4
|
+
attr_reader :zip5, :system_code, :occupation, :conduit_zip, :conduit_address_two, :city, :zip, :increased_limit, :donor_candidate, :conduit_name, :conduit_city, :prefix, :memo_text, :back_ref_tran_id, :aggregate_amount, :filing_id, :donor_office, :back_ref_sched_name, :address_two, :pac_name, :exclude, :conduit_address_one, :amount, :transaction_type, :lng, :flag_orgind, :date, :fec_form_type, :donor_state, :donor_cand_id, :last_name, :full_name, :employer, :donor_district, :conduit_state, :address_one, :tran_id, :suffix, :donor_cmte_id, :display_name, :transaction_description, :prigen, :memo_code, :linenumber, :lat, :amended_cd, :state, :middle_name, :first_name
|
5
|
+
|
6
|
+
def initialize(params={})
|
7
|
+
params.each_pair do |k,v|
|
8
|
+
instance_variable_set("@#{k}", v)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.create(params={})
|
13
|
+
self.new(params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.committee(fecid, offset=nil)
|
17
|
+
cycle = CURRENT_CYCLE
|
18
|
+
results = invoke("#{cycle}/contributions/committee/#{fecid}", {:offset => offset})['results']
|
19
|
+
results.map{|c| IndividualContribution.create(c["contribution"]) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.filing(form_id, offset=nil)
|
23
|
+
cycle = CURRENT_CYCLE
|
24
|
+
results = invoke("#{cycle}/contributions/filing/#{form_id}", {:offset => offset})['results']
|
25
|
+
results.map{|c| IndividualContribution.create(c["contribution"]) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.candidate(fecid, offset=nil)
|
29
|
+
cycle = CURRENT_CYCLE
|
30
|
+
results = invoke("#{cycle}/contributions/candidate/#{fecid}", {:offset => offset})['results']
|
31
|
+
results.map{|c| IndividualContribution.create(c["contribution"]) }
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -1,23 +1,24 @@
|
|
1
1
|
module CampaignCash
|
2
2
|
class President < Base
|
3
|
-
|
4
|
-
attr_reader :committee_id, :name, :id, :party, :date_coverage_from, :date_coverage_to, :total_receipts, :total_disbursements,
|
5
|
-
:end_cash, :total_refunds, :total_contributions, :net_individual_contributions, :net_pac_contributions,
|
3
|
+
|
4
|
+
attr_reader :committee_id, :name, :id, :party, :office, :date_coverage_from, :date_coverage_to, :total_receipts, :total_disbursements,
|
5
|
+
:end_cash, :total_refunds, :total_contributions, :net_individual_contributions, :net_pac_contributions,
|
6
6
|
:net_party_contributions, :net_candidate_contributions, :net_primary_contributions, :net_general_contributions,
|
7
7
|
:federal_funds, :contributions_less_than_200, :contributions_200_499, :contributions_500_1499, :contributions_1500_2499,
|
8
8
|
:contributions_max
|
9
|
-
|
9
|
+
|
10
10
|
def initialize(params={})
|
11
11
|
params.each_pair do |k,v|
|
12
12
|
instance_variable_set("@#{k}", v)
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
# Creates a new president summary object from a JSON API presidential response.
|
17
17
|
def self.create_summary(params={})
|
18
18
|
self.new :name => params['name'],
|
19
19
|
:id => params['candidate_id'],
|
20
|
-
|
20
|
+
:party => get_party(params['party']),
|
21
|
+
:office => 'president',
|
21
22
|
:committee_id => params['committee_id'],
|
22
23
|
:total_receipts => params['total_receipts'],
|
23
24
|
:total_disbursements => params['total_disbursements'],
|
@@ -25,12 +26,13 @@ module CampaignCash
|
|
25
26
|
:date_coverage_from => params['date_coverage_from'],
|
26
27
|
:date_coverage_to => params['date_coverage_to']
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
# Creates a detailed president object
|
30
31
|
def self.create_detail(params={})
|
31
32
|
self.new :name => params['candidate_name'],
|
32
33
|
:id => params['candidate_id'],
|
33
|
-
|
34
|
+
:party => get_party(params['party']),
|
35
|
+
:office => 'president',
|
34
36
|
:committee_id => params['committee_id'],
|
35
37
|
:total_receipts => params['total_receipts'],
|
36
38
|
:total_contributions => params['total_contributions'],
|
@@ -39,20 +41,20 @@ module CampaignCash
|
|
39
41
|
:date_coverage_from => params['date_coverage_from'],
|
40
42
|
:date_coverage_to => params['date_coverage_to'],
|
41
43
|
:total_refunds => params['total_refunds'],
|
42
|
-
:net_individual_contributions => params['net_individual_contributions'],
|
43
|
-
:net_pac_contributions => params['net_pac_contributions'],
|
44
|
-
:net_party_contributions => params['net_party_contributions'],
|
45
|
-
:net_candidate_contributions => params['net_candidate_contributions'],
|
46
|
-
:net_primary_contributions => params['net_primary_contributions'],
|
44
|
+
:net_individual_contributions => params['net_individual_contributions'],
|
45
|
+
:net_pac_contributions => params['net_pac_contributions'],
|
46
|
+
:net_party_contributions => params['net_party_contributions'],
|
47
|
+
:net_candidate_contributions => params['net_candidate_contributions'],
|
48
|
+
:net_primary_contributions => params['net_primary_contributions'],
|
47
49
|
:net_general_contributions => params['net_general_contributions'],
|
48
|
-
:federal_funds => params['federal_funds'],
|
49
|
-
:contributions_less_than_200 => params['total_contributions_less_than_200'],
|
50
|
-
:contributions_200_499 => params['contributions_200_499'],
|
51
|
-
:contributions_500_1499 => params['contributions_500_1499'],
|
50
|
+
:federal_funds => params['federal_funds'],
|
51
|
+
:contributions_less_than_200 => params['total_contributions_less_than_200'],
|
52
|
+
:contributions_200_499 => params['contributions_200_499'],
|
53
|
+
:contributions_500_1499 => params['contributions_500_1499'],
|
52
54
|
:contributions_1500_2499 => params['contributions_1500_2499'],
|
53
55
|
:contributions_max => params['total_contributions_max']
|
54
56
|
end
|
55
|
-
|
57
|
+
|
56
58
|
# Returns an array of presidential candidates for a given cycle, defaults to the current cycle.
|
57
59
|
# Only returns candidates that The New York Times is tracking for financial activity.
|
58
60
|
def self.summary(cycle=CURRENT_CYCLE)
|
@@ -60,7 +62,7 @@ module CampaignCash
|
|
60
62
|
results = reply['results']
|
61
63
|
results.map{|c| self.create_summary(c)}
|
62
64
|
end
|
63
|
-
|
65
|
+
|
64
66
|
# Returns a President object for a given presidential candidate in a given cycle, defaults to the current cycle.
|
65
67
|
# Only returns candidates tracked by The New York Times.
|
66
68
|
def self.detail(id, cycle=CURRENT_CYCLE)
|
@@ -68,5 +70,13 @@ module CampaignCash
|
|
68
70
|
results = reply['results'].first
|
69
71
|
create_detail(results)
|
70
72
|
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def self.get_party party_identifier
|
77
|
+
return "DEM" if party_identifier == "D"
|
78
|
+
return "REP" if party_identifier == "R"
|
79
|
+
party_identifier
|
80
|
+
end
|
71
81
|
end
|
72
82
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestCampaignCash::TestFilingSummary < Test::Unit::TestCase
|
4
|
+
include CampaignCash
|
5
|
+
|
6
|
+
context "filing summaries" do
|
7
|
+
setup do
|
8
|
+
@filing_summary = FilingSummary.by_id(751678)
|
9
|
+
end
|
10
|
+
should "get a filing by form id" do
|
11
|
+
assert_kind_of(FilingSummary, @filing_summary)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestCampaignCash::TestIndividualContribution < Test::Unit::TestCase
|
4
|
+
include CampaignCash
|
5
|
+
|
6
|
+
context "get contributions" do
|
7
|
+
objs_collection = []
|
8
|
+
objs_collection << IndividualContribution.committee("C00496497")
|
9
|
+
objs_collection << IndividualContribution.filing("724196")
|
10
|
+
objs_collection << IndividualContribution.candidate("P80003353")
|
11
|
+
|
12
|
+
objs_collection.each do |objs|
|
13
|
+
should "return a list of objects of the IndividualContribution type or an empty list" do
|
14
|
+
if objs.size > 0
|
15
|
+
assert_kind_of(IndividualContribution, objs.first)
|
16
|
+
else
|
17
|
+
assert_equal([], objs)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class TestCampaignCash::TestPresident < Test::Unit::TestCase
|
4
4
|
include CampaignCash
|
5
|
-
|
5
|
+
|
6
6
|
context "President.summary" do
|
7
7
|
setup do
|
8
8
|
reply = Base.invoke('2012/president/totals', {})
|
@@ -10,33 +10,56 @@ class TestCampaignCash::TestPresident < Test::Unit::TestCase
|
|
10
10
|
@summaries = @results.map{|r| President.create_summary(r)}
|
11
11
|
@summary = @summaries.first
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
should "return an array of objects of the President type" do
|
15
15
|
assert_kind_of(President, @summary)
|
16
16
|
end
|
17
|
-
|
18
|
-
%w(name total_contributions
|
17
|
+
|
18
|
+
%w(name total_contributions total_receipts).each do |attr|
|
19
19
|
should "assign the value of the @#{attr} attribute from the '#{attr}' key in the hash" do
|
20
20
|
assert_equal(@results.first[attr], @summary.send(attr))
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
should "assign the office to 'president'" do
|
25
|
+
assert_equal('president', @summary.office)
|
26
|
+
end
|
27
|
+
|
28
|
+
should "assign the party to 'REP' if the candidate is republican or 'DEM' if democrat" do
|
29
|
+
party = @results.first['party']
|
30
|
+
party = "REP" if party == "R"
|
31
|
+
party = "DEM" if party == "D"
|
32
|
+
assert_equal(party, @summary.party)
|
33
|
+
end
|
34
|
+
|
23
35
|
end
|
24
|
-
|
36
|
+
|
25
37
|
context "President.detail" do
|
26
38
|
setup do
|
27
39
|
reply = Base.invoke('2012/president/candidates/C00496034', {})
|
28
40
|
@results = reply['results']
|
29
41
|
@detail = President.create_detail(@results.first)
|
30
42
|
end
|
31
|
-
|
43
|
+
|
32
44
|
should "return an array of objects of the President type" do
|
33
45
|
assert_kind_of(President, @detail)
|
34
46
|
end
|
35
|
-
|
36
|
-
%w(net_primary_contributions
|
47
|
+
|
48
|
+
%w(net_primary_contributions total_refunds).each do |attr|
|
37
49
|
should "assign the value of the @#{attr} attribute from the '#{attr}' key in the hash" do
|
38
50
|
assert_equal(@results.first[attr], @detail.send(attr))
|
39
51
|
end
|
40
52
|
end
|
41
|
-
|
53
|
+
|
54
|
+
should "assign the office to 'president'" do
|
55
|
+
assert_equal('president', @detail.office)
|
56
|
+
end
|
57
|
+
|
58
|
+
should "assign the party to 'REP' if the candidate is republican or 'DEM' if democrat" do
|
59
|
+
party = @results.first['party']
|
60
|
+
party = "REP" if party == "R"
|
61
|
+
party = "DEM" if party == "D"
|
62
|
+
assert_equal(party, @detail.party)
|
63
|
+
end
|
64
|
+
end
|
42
65
|
end
|
data/test/test_helper.rb
CHANGED
@@ -4,7 +4,7 @@ require 'shoulda'
|
|
4
4
|
require 'json'
|
5
5
|
require 'ostruct'
|
6
6
|
|
7
|
-
%w(base candidate committee contribution filing form independent_expenditure president).each do |f|
|
7
|
+
%w(base candidate committee contribution individual_contribution filing filing_summary form independent_expenditure president).each do |f|
|
8
8
|
require File.join(File.dirname(__FILE__), '../lib/campaign_cash', f)
|
9
9
|
end
|
10
10
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: campaign_cash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 2.0.8
|
10
|
+
version: 2.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Derek Willis
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-02-08 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -101,15 +101,19 @@ files:
|
|
101
101
|
- lib/campaign_cash/committee.rb
|
102
102
|
- lib/campaign_cash/contribution.rb
|
103
103
|
- lib/campaign_cash/filing.rb
|
104
|
+
- lib/campaign_cash/filing_summary.rb
|
104
105
|
- lib/campaign_cash/form.rb
|
105
106
|
- lib/campaign_cash/independent_expenditure.rb
|
107
|
+
- lib/campaign_cash/individual_contribution.rb
|
106
108
|
- lib/campaign_cash/president.rb
|
107
109
|
- lib/campaign_cash/version.rb
|
108
110
|
- test/campaign_cash/test_candidate.rb
|
109
111
|
- test/campaign_cash/test_committee.rb
|
110
112
|
- test/campaign_cash/test_filing.rb
|
113
|
+
- test/campaign_cash/test_filing_summary.rb
|
111
114
|
- test/campaign_cash/test_form.rb
|
112
115
|
- test/campaign_cash/test_independent_expenditure.rb
|
116
|
+
- test/campaign_cash/test_individual_contribution.rb
|
113
117
|
- test/campaign_cash/test_president.rb
|
114
118
|
- test/test_helper.rb
|
115
119
|
has_rdoc: true
|
@@ -152,7 +156,9 @@ test_files:
|
|
152
156
|
- test/campaign_cash/test_candidate.rb
|
153
157
|
- test/campaign_cash/test_committee.rb
|
154
158
|
- test/campaign_cash/test_filing.rb
|
159
|
+
- test/campaign_cash/test_filing_summary.rb
|
155
160
|
- test/campaign_cash/test_form.rb
|
156
161
|
- test/campaign_cash/test_independent_expenditure.rb
|
162
|
+
- test/campaign_cash/test_individual_contribution.rb
|
157
163
|
- test/campaign_cash/test_president.rb
|
158
164
|
- test/test_helper.rb
|