From 705eeaf138f05a589a707178dac01b9cf39a0c3e Mon Sep 17 00:00:00 2001 From: "M. Simon Borg" Date: Thu, 14 Mar 2019 08:25:09 -0400 Subject: [PATCH] add jurisdictions/1 and people_from/1 functions --- lib/open_states.ex | 86 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 73 insertions(+), 13 deletions(-) diff --git a/lib/open_states.ex b/lib/open_states.ex index 76f66d0..fce426f 100644 --- a/lib/open_states.ex +++ b/lib/open_states.ex @@ -1,8 +1,11 @@ defmodule OpenStates do @moduledoc """ - Documentation for OpenStates. + An Elixir client for the OpenStates GraphQL API. """ + @type response :: {:ok, Neuron.Response.t()} | {:error, response :: term} + @type args :: [atom | String.t()] + @doc """ Returns the API endpoint URL. @@ -46,19 +49,20 @@ defmodule OpenStates do {:ok, response} = OpenStates.query(\"\"\" - {jurisdictions { - edges { - node { - id + { + jurisdictions { + edges { + node { + id + } } } - }} + } \"\"\") #=> {:ok, %Neuron.Response{body: %{ ... }, headers: [ ... ], status_code: 200}} """ - @spec query(query_string :: String.t()) :: - {:ok, Neuron.Response.t()} | {:error, response :: term} + @spec query(query_string :: String.t()) :: response def query(query_string) do Neuron.query(query_string, _variables = %{}, url: url(), headers: headers()) end @@ -69,15 +73,71 @@ defmodule OpenStates do ## Example ~q\"\"\" - {jurisdictions { - edges { - node { - id + { + jurisdictions { + edges { + node { + id + } } } - }} + } \"\"\" #=> {:ok, %Neuron.Response{body: %{ ... }, headers: [ ... ], status_code: 200}} """ + @spec sigil_q(query_string :: String.t(), list) :: response def sigil_q(query_string, []), do: query(query_string) + + @doc """ + Fetches the jurisdiction objects from the API. + """ + @spec jurisdictions() :: response + def jurisdictions, do: jurisdictions(attrs: [:id, :name]) + + @spec jurisdictions(attrs: args) :: response + def jurisdictions(attrs: attrs) do + attrs = Enum.join(attrs, "\n") + + ~q""" + { + jurisdictions { + edges { + node { + #{attrs} + } + } + } + } + """ + end + + @doc """ + Fetches legislators from a particular jurisdiction and organization. + """ + def people_from(opts) do + name = Keyword.get(opts, :name) + id = Keyword.get(opts, :id) + classification = Keyword.get(opts, :classification) + attrs = Keyword.get(opts, :attrs) + + ~q""" + { + jurisdiction(name: "#{name}", id: "#{id}") { + name + organizations(first: 1, classification: "#{classification}") { + edges { + node { + name + currentMemberships { + person { + #{Enum.join(attrs, "\n")} + } + } + } + } + } + } + } + """ + end end