Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/christhekeele/rom-http
HTTP support for ROM.
https://github.com/christhekeele/rom-http
Last synced: about 2 months ago
JSON representation
HTTP support for ROM.
- Host: GitHub
- URL: https://github.com/christhekeele/rom-http
- Owner: christhekeele
- License: other
- Created: 2015-04-16T00:01:43.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2015-04-21T19:51:35.000Z (over 9 years ago)
- Last Synced: 2024-06-10T00:13:30.304Z (7 months ago)
- Language: Ruby
- Size: 125 KB
- Stars: 2
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
ROM::HTTP
=========> **HTTP support for ROM.**
Synopsis
--------`rom-http` is an adapter that integrates the [http](https://rubygems.org/gems/http) HTTP client library with the [rom](https://rubygems.org/gems/rom) data library, allowing you to consume, transform, and even persist to external APIs.
**It's very much a work in progress. Use judiciously, and please report issues and feature requests!**
Installation
------------To install in your project:
```bash
$ echo "gem 'rom-http'" >> Gemfile
$ bundle install
```To install globally:
```bash
$ gem install rom-http
```Usage
-----### Setup
Provide the adapter with a root http url to get started:
```ruby
ROM.setup :http, 'http://jsonplaceholder.typicode.com'
```You can also pass in a pre-configured `HTTP` client:
```ruby
client = HTTP[accept: "application/json"].basic_auth(:user => "user", :pass => "pass")
ROM.setup :http, 'http://jsonplaceholder.typicode.com', client
# The repository will use those headers with the provided basic auth settings.
```### Relations
Define relations in the usual way:
```ruby
# Calls out to http://jsonplaceholder.typicode.com/posts
class Posts < ROM::Relation[:http]# Calls out to http://jsonplaceholder.typicode.com/posts/:id
def by_id(id)
get id
endend
rom = ROM.finalize
rom.relation(:posts).to_a
=begin
[
{
"userId"=>1,
"id"=>1,
"title"=>"sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body"=>"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum..."
{
"userId"=>1,
"id"=>2,
"title"=>"qui est esse",
"body"=>"est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores..."
}
#...
]
=endrom.relation(:posts).by_id(1)
=begin
[
{
"userId"=>1,
"id"=>1,
"title"=>"sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body"=>"quia et suscipit\nsuscipit recusandae consequuntur expedita et cum..."
}
]
=end
```### Dataset DSL
The underlying dataset available to you in your relations leverages a simple wrapper DSL around `http` that allows you to compose requests:
```ruby
class Posts < ROM::Relation[:http]
def example_usage(*args, opts = {}, &block)
# Generally, you won't need to access the raw `dataset` object.
# You definitely don't want to `.call` it or enumerate it inside of the relationship–
# let ROM do that for you. However, for rigor:# By default, this is a request to GET from root_url/relation_name:
dataset# To actually perform the HTTP call:
dataset.call# To perform the call, parse the body, and enumerate over the results:
dataset.each do |post|
puts post
end# The rest of the DSL delegates to the dataset object, allowing you to modify the request you send:
# HTTP verb methods allow you to modify the verb and append to the path in the same go:
# Append 'foobar' to the request: GET from root_url/relation_name/foobar
get 'foobar'# Append 'foobar' to the request, use query string parameters: GET from root_url/relation_name/foobar?fizz=buzz
get 'foobar', params: { fizz: :buzz }# Make a request to POST to root_url/relation_name with an encoded form
post form: { fizz: :buzz }# Make a request to POST to root_url/relation_name with a raw body
post body: "foo=42&bar=baz"# Make a request to POST to root_url/relation_name with a JSON body
post json: { fizz: :buzz }# Make a request to PUT to root_url/relation_name/1 with a JSON body
put 1, json: { fizz: :buzz }# Verbs can be chained to re-write the verb, allowing you to reuse requests as different types:
# Make a request to PUT to root_url/relation_name/1 with an encoded body
post(form: {fizz: :buzz}).put(1)# Using the params/form/body syntax above will override previously set values:
# Use query string parameters: GET from root_url/relation_name?fizz=buzz
get(params: { foo: :bar }).get(params: { fizz: :buzz })# For finer control, you can use the params/form/body DSL methods:
# Use query string parameters: GET from root_url/relation_name?foo=baz&fizz=buzz
get(params: { foo: :bar }).params(fizz: :buzz) do |old_params|
old_params.merge(foo: :bar)
end# Since the default dataset is a get request to the relation_name, and the DSL delegates to the dataset,
# it's trivial to make composable relation methods that simply modify the querystring parameters with a one-liner:
params page: opts.fetch(:page, 1), per_page: opts.fetch(:per_page, 10)
params order: opts.fetch(:order, :asc), column: opts.fetch(:column)# Finally, the rest of the `http` library DSL is available to modify other parts of the request:
get('foobar').headers("Cookie" => "9wq3w").basic_auth(:user => "user", :pass => "pass").accept(:json)end
end
```Most frequently in your relations, you'll just be making simple get requests to an endpoint, and using commands to do more involved things.
### Commands
Contributing
------------1. Fork it ( https://github.com/[my-github-username]/rom-http/fork )
1. Create your feature branch (`git checkout -b my-new-feature`)
1. Commit your changes (`git commit -am 'Add some feature'`)
1. Push to the branch (`git push origin my-new-feature`)
1. Create a new Pull Request