billit_representers
Representers for the bill-it component of the Poplus project. These provide object-like access to remote data, adding variables, validations and HTTP verb methods to local objects. This is implemented with Resource-Oriented Architectures in Ruby (ROAR).
#Installation Make sure you have ruby 2.0 installed. If not visit https://rvm.io/rvm/install.
To install gem locally
gem install billit_representers
or add gem to your Gemfile to install with bundler.
gem 'billit_representers'
#Usage ##Adding representations to local model Include in local model to add bill attributes, validations and HTTP verb methods.
require 'billit_representers/representers/bill_representer'
class Bill
include Billit::BillRepresenter
end
Some bill attributes require their own models to be created. In this particular bill model these are:
- Directive
- Document
- Paperwork
- Priority
- Remark
- Report ##Using models included in the representer This is the preferred option if bill information is fetched and no persistence is needed. TO DO ##Validations Bills require some attributes to exist or to have restricted values.
Bill.class_variables
#=> list of class variables, which hold valid values for validated attributes
Bill.class_variable_get(:@@matters_valid_values)
#=> receives a class variable name, returns list of valid values for, in this example, the attribute 'matters'
To see the list of validations for bills:
Bill._validators
#=> validators for bill, this is, the restrictions for certain attributes
To check if an object's attributes are valid:
bill = Bill.new
bill.valid?
#=> true if all validations are passed, false otherwise
bill.errors.full_messages
#=> validations that are not passed, only exist once bill.valid? is executed
bill.errors.clear
#=> clears list of errors
##Working with remote API (HTTP verbs) This gem provides HTTP methods to your local objects, so that all remote data management is done through object methods. In the following examples, the Ciudadano Inteligente bill-it installation will be used as the remote API.
###Single Bill
####GET bill Used to retrieve bill information.
bill = Bill.new
bill.get('http://billit.ciudadanointeligente.org/bills/1-07', 'application/json')
Now all the '1-07' bill data is stored in 'bill'. You can see all available attributes with:
bill.instance_variable_get(:@representable_attrs).collect {|x| x.name if x.instance_of? Representable::Definition}
#=> array with represented bill attributes
To access attribute values, for instance the bill title:
bill.title
####POST (create new bill)
To create a new bill and assign values to its attributes:
bill = Bill.new
bill.uid = '0-00'
bill.title = 'new title'
To save the bill info on the remote API:
bill.post('http://billit.ciudadanointeligente.org/bills', 'application/json')
####PUT (modify existing bill)
To retrieve an existing bill and modify its values, for instance add a tag:
bill = Bill.new
bill.get('http://billit.ciudadanointeligente.org/bills/0-00', 'application/json')
bill.tags.push('tag')
bill.put('http://billit.ciudadanointeligente.org/bills/0-00', 'application/json')
###Bill Collections
Multiple bills can be retrieved in a single action, for instance, when performing a query. This list of bills comes paginated, thus its representer is named bill collection page. This representer can be included in a local model, as with bill representer. This inclusion will soon be made easy as with the BillRepresenter inclusion.
require 'billit_representers/representers/bill_collection_page_representer'
class BillCollectionPage < OpenStruct
include Roar::Representer::Feature::HttpVerbs
def initialize
extend Billit::BillCollectionPageRepresenter
extend Roar::Representer::Feature::Client
transport_engine = Roar::Representer::Transport::Faraday
end
def self
links[:self].href if links[:self]
end
def next
links[:next].href if links[:next]
end
def previous
links[:previous].href if links[:previous]
end
end
####GET search (search the API)
The following query urls exemplify query syntax and parameters.
- /bills/search.json?q=term
- => search for "term" in all fields
- /bills/search.json?title=hello|hola&tags=world
- => search for bills with a title that contains "hello" or "hola" and with the tag "world"
The result of a query can be retrieved as a bill collection page.
bill_page = BillCollectionPage.new
bill_page.get('http://billit.ciudadanointeligente.org/bills/search?q=term', 'application/json')
bill_page.bills
#=> array with resulting bills
Query metadata can also be retrieved and accessed via a bill collection page.
bill_page.total_entries
#=> number of resulting bills in all pages
bill_page.current_page
#=> current page number
bill_page.total_pages
#=> pages in total
You can also access links, like the next and previous page of the query results, and also retrieve them in a bill collection page. Note that in the following example the function next is used because it was defined in the model, but the actual representation access is through links[:next].href.
bill_next_page = BillCollectionPage.new
bill_next_page.get(bill_page.next, 'application/json')