Morpheus Travis CI Build Status

A RESTful API Client library built over Typhoeus

  • The project is working toward a DSL that is very ActiveResource/ActiveRecord-like with some features stolen from other great libraries like DataMapper.

  • We started working on this at a point when we felt we were pushing ActiveResource to its limits.

  • We wanted a little more flexibility in terms of API coupling.

  • We have plans to make Morpheus as flexible as possible in terms of query interface, and resource representation.

  • Additionally, Morpheus is built on top of Typhoeus and will be building in intuitive interfaces for working with parallel requests.

    ```Ruby
    class Dummy < Morpheus::Base
    property :name
    property :created_at
    property :has_smarts
    
    belongs_to :thingy
    has_many :thingamabobs
    has_one :doohickey
    end
    ```
    

Creating new resources

  • Morpheus uses ActiveModel and so has an interface that tries to not stray too far from the similar ActiveRecord interface.

    ```Ruby
    @dummy = Dummy.new(
    :name       => 'Dumb',
    :has_smarts => false,
    :thingy_id  => 2)     # => #<Dummy:0x1016858d8>
    @dummy.new_record?      # => true
    @dummy.save             # => POST http://example.com/dummies
    ```
    

Finding existing resources

  • Resources can be retrieved with as little as their classname and unique identifier.

    ```Ruby
    @dummy = Dummy.find(1) # => GET http:example.com/dummies/1
    @dummy.new_record?     # => false
    @dummy.name            # => 'Dumb'
    ```
    

Updating existing resources

  • Resources can be updated just in the same way you would expect from a Active* library.

    ```Ruby
    @dummy.name = 'Dumber'                        # => 'Dumber'
    @dummy.save                                   # => PUT http://example.com/dummies/1
    @dummy.update_attributes(:has_smarts => true) # => PUT http://example.com/dummies/1
    ```
    

Associations

  • Morpheus was originally conceived at a point when we needed ActiveResource with a little more.

  • Associations are a bit of that 'little more'.

    ```Ruby
    @dummy.thingy       # => GET http://example.com/thingies/2
    @dummy.thingamabobs # => GET http://example.com/thingamabobs?dummy_id=1
    @dummy.doohickey    # => GET http://example.com/doohickey?dummy_id=1
    ```
    

Query Interface

  • ARel has a beautiful query interface.

  • We have ported its method-chaining style to fit our query interface.

    ```Ruby
    Dummy.all                                          # => GET http://example.com/dummies
    Dummy.find(1,2,3)                                  # => GET http://example.com/dummies?ids=1,2,3
    
    Dummy.where(:name => 'Dumb')                       # => GET http://example.com/dummies?name=Dumb
    Dummy.where(:name => 'Dumb', :has_smarts => false) # => GET http://example.com/dummies?name=Dumb&has_smarts=false
    Dummy.limit(1)                                     # => GET http://example.com/dummies?limit=1
    Dummy.result_per_page = 25                         # => 25
    Dummy.page(3)                                      # => GET http://example.com/dummies?limit=25&offset=50
    ```
    

More about the project

Design informed by Service-Oriented Design with Ruby and Rails by Paul Dix, Amazon