/lib/transparency_data/client.rb

https://github.com/paulfranzen/transparency-data · Ruby · 249 lines · 216 code · 32 blank · 1 comment · 15 complexity · 85058f64cb3784282dbaa97625a56667 MD5 · raw file

  1. module TransparencyData
  2. class Client < MonsterMash::Base
  3. defaults do
  4. params :apikey => TransparencyData.api_key
  5. end
  6. get(:contributions) do |api_params|
  7. uri TransparencyData.api_url("/contributions")
  8. params TransparencyData::Client.prepare_params(api_params)
  9. handler do |response|
  10. TransparencyData::Client.handle_response(response)
  11. end
  12. end
  13. get(:lobbying) do |api_params|
  14. uri TransparencyData.api_url("/lobbying")
  15. params TransparencyData::Client.prepare_params(api_params)
  16. handler do |response|
  17. TransparencyData::Client.handle_response(response)
  18. end
  19. end
  20. get(:entities) do |api_params|
  21. uri TransparencyData.api_url("/entities")
  22. params TransparencyData::Client.prepare_params(api_params)
  23. handler do |response|
  24. TransparencyData::Client.handle_response(response)
  25. end
  26. end
  27. get(:id_lookup) do |api_params|
  28. uri TransparencyData.api_url("/entities/id_lookup")
  29. params TransparencyData::Client.prepare_params(api_params)
  30. handler do |response|
  31. TransparencyData::Client.handle_response(response)
  32. end
  33. end
  34. get(:entity) do |id, api_params|
  35. uri TransparencyData.api_url("/entities/#{id}")
  36. params TransparencyData::Client.prepare_params(api_params) if api_params
  37. handler do |response|
  38. Hashie::Mash.new(JSON.parse(response.body))
  39. end
  40. end
  41. get(:top_contributors) do |id, api_params|
  42. uri TransparencyData.api_url("/aggregates/pol/#{id}/contributors")
  43. params TransparencyData::Client.prepare_params(api_params) if api_params
  44. handler do |response|
  45. TransparencyData::Client.handle_response(response)
  46. end
  47. end
  48. get(:top_sectors) do |id, api_params|
  49. uri TransparencyData.api_url("/aggregates/pol/#{id}/contributors/sectors")
  50. params TransparencyData::Client.prepare_params(api_params) if api_params
  51. handler do |response|
  52. sectors = TransparencyData::Client.handle_response(response)
  53. TransparencyData::Client.process_sectors(sectors)
  54. end
  55. end
  56. get(:top_industries) do |id, sector, api_params|
  57. uri TransparencyData.api_url("/aggregates/pol/#{id}/contributors/sector/#{sector}/industries")
  58. params TransparencyData::Client.prepare_params(api_params) if api_params
  59. handler do |response|
  60. TransparencyData::Client.handle_response(response)
  61. end
  62. end
  63. get(:local_breakdown) do |id, api_params|
  64. uri TransparencyData.api_url("/aggregates/pol/#{id}/contributors/local_breakdown")
  65. params TransparencyData::Client.prepare_params(api_params) if api_params
  66. handler do |response|
  67. breakdown = Hashie::Mash.new(JSON.parse(response.body))
  68. TransparencyData::Client.process_local_breakdown(breakdown)
  69. end
  70. end
  71. get(:contributor_type_breakdown) do |id, api_params|
  72. uri TransparencyData.api_url("/aggregates/pol/#{id}/contributors/type_breakdown")
  73. params TransparencyData::Client.prepare_params(api_params) if api_params
  74. handler do |response|
  75. breakdown = Hashie::Mash.new(JSON.parse(response.body))
  76. TransparencyData::Client.process_contributor_type_breakdown(breakdown)
  77. end
  78. end
  79. get(:top_recipient_orgs) do |id, api_params|
  80. uri TransparencyData.api_url("/aggregates/indiv/#{id}/recipient_orgs")
  81. params TransparencyData::Client.prepare_params(api_params) if api_params
  82. handler do |response|
  83. TransparencyData::Client.handle_response(response)
  84. end
  85. end
  86. get(:top_recipient_pols) do |id, api_params|
  87. uri TransparencyData.api_url("/aggregates/indiv/#{id}/recipient_pols")
  88. params TransparencyData::Client.prepare_params(api_params) if api_params
  89. handler do |response|
  90. TransparencyData::Client.handle_response(response)
  91. end
  92. end
  93. get(:individual_party_breakdown) do |id, api_params|
  94. uri TransparencyData.api_url("/aggregates/indiv/#{id}/recipients/party_breakdown")
  95. params TransparencyData::Client.prepare_params(api_params) if api_params
  96. handler do |response|
  97. breakdown = Hashie::Mash.new(JSON.parse(response.body))
  98. TransparencyData::Client.process_party_breakdown(breakdown)
  99. end
  100. end
  101. get(:top_org_recipients) do |id, api_params|
  102. uri TransparencyData.api_url("/aggregates/org/#{id}/recipients")
  103. params TransparencyData::Client.prepare_params(api_params) if api_params
  104. handler do |response|
  105. TransparencyData::Client.handle_response(response)
  106. end
  107. end
  108. get(:org_party_breakdown) do |id, api_params|
  109. uri TransparencyData.api_url("/aggregates/org/#{id}/recipients/party_breakdown")
  110. params TransparencyData::Client.prepare_params(api_params) if api_params
  111. handler do |response|
  112. breakdown = Hashie::Mash.new(JSON.parse(response.body))
  113. TransparencyData::Client.process_org_party_breakdown(breakdown)
  114. end
  115. end
  116. get(:org_level_breakdown) do |id, api_params|
  117. uri TransparencyData.api_url("/aggregates/org/#{id}/recipients/level_breakdown")
  118. params TransparencyData::Client.prepare_params(api_params) if api_params
  119. handler do |response|
  120. breakdown = Hashie::Mash.new(JSON.parse(response.body))
  121. TransparencyData::Client.process_org_level_breakdown(breakdown)
  122. end
  123. end
  124. get(:recipient_contributor_summary) do |recipient_id, contributor_id, api_params|
  125. uri TransparencyData.api_url("/aggregates/recipient/#{recipient_id}/contributor/#{contributor_id}/amount")
  126. params TransparencyData::Client.prepare_params(api_params) if api_params
  127. handler do |response|
  128. Hashie::Mash.new(JSON.parse(response.body))
  129. end
  130. end
  131. def self.prepare_params(params)
  132. params.each do |key, value|
  133. if value.is_a?(Hash)
  134. case value.keys.first
  135. when :gte
  136. params[key] = ">|#{value.values.first}"
  137. when :lte
  138. params[key] = "<|#{value.values.first}"
  139. when :between
  140. params[key] = "><|#{value.values.first.join('|')}"
  141. end
  142. elsif value.is_a?(Array)
  143. params[key] = value.join("|")
  144. elsif value.is_a?(String)
  145. params[key] = value.sub(/[\*\?!=&%]/,'')
  146. end
  147. end
  148. params
  149. end
  150. def self.handle_response(response)
  151. # TODO: raise_errors
  152. JSON.parse(response.body).map {|c| Hashie::Mash.new(c)}
  153. end
  154. def self.process_sectors(sectors)
  155. sectors.each do |sector|
  156. sector["name"] = case sector.sector
  157. when "A" then "Agribusiness"
  158. when "B" then "Communications/Electronics"
  159. when "C" then "Construction"
  160. when "D" then "Defense"
  161. when "E" then "Energy/Natural Resources"
  162. when "F" then "Finance/Insurance/Real Estate"
  163. when "H" then "Health"
  164. when "K" then "Lawyers/Lobbyists"
  165. when "M" then "Transportation"
  166. when "N" then "Misc. Business"
  167. when "Q" then "Ideology/Single Issue"
  168. when "P" then "Labor"
  169. when "W" then "Other"
  170. when "Y" then "Unknown"
  171. when "Z" then "Administrative Use"
  172. end
  173. end
  174. end
  175. def self.process_local_breakdown(breakdown)
  176. TransparencyData::Client.mashize_key(breakdown, "in-state", "in_state")
  177. TransparencyData::Client.mashize_key(breakdown, "out-of-state", "out_of_state")
  178. breakdown
  179. end
  180. def self.process_contributor_type_breakdown(breakdown)
  181. TransparencyData::Client.mashize_key(breakdown, "Individuals", "individual")
  182. TransparencyData::Client.mashize_key(breakdown, "PACs", "pac")
  183. breakdown
  184. end
  185. def self.process_party_breakdown(breakdown)
  186. TransparencyData::Client.mashize_key(breakdown, "Democrats", "dem")
  187. TransparencyData::Client.mashize_key(breakdown, "Republicans", "rep")
  188. TransparencyData::Client.mashize_key(breakdown, "L", "lib")
  189. TransparencyData::Client.mashize_key(breakdown, "I", "ind")
  190. TransparencyData::Client.mashize_key(breakdown, "U", "unknown")
  191. TransparencyData::Client.mashize_key(breakdown, "Other", "other")
  192. TransparencyData::Client.mashize_key(breakdown, "3", "third")
  193. breakdown
  194. end
  195. def self.process_org_party_breakdown(breakdown)
  196. TransparencyData::Client.mashize_key(breakdown, "Democrats", "dem")
  197. TransparencyData::Client.mashize_key(breakdown, "Republicans", "rep")
  198. TransparencyData::Client.mashize_key(breakdown, "L", "lib")
  199. TransparencyData::Client.mashize_key(breakdown, "I", "ind")
  200. TransparencyData::Client.mashize_key(breakdown, "U", "unknown")
  201. TransparencyData::Client.mashize_key(breakdown, "Other", "other")
  202. TransparencyData::Client.mashize_key(breakdown, "3", "third")
  203. breakdown
  204. end
  205. def self.process_org_level_breakdown(breakdown)
  206. TransparencyData::Client.mashize_key(breakdown, "State", "state")
  207. TransparencyData::Client.mashize_key(breakdown, "Federal", "federal")
  208. breakdown
  209. end
  210. def self.mashize_key(breakdown, api_key, mash_key)
  211. if breakdown[api_key]
  212. breakdown["#{mash_key}_count"] = breakdown[api_key][0].to_i
  213. breakdown["#{mash_key}_amount"] = breakdown[api_key][1].to_f
  214. end
  215. end
  216. end
  217. end