README.md in raisin-0.0.1 vs README.md in raisin-0.0.2

- old
+ new

@@ -16,10 +16,140 @@ $ gem install raisin ## Usage -Soon +Raisin is composed of two main elements : a router and a lists of API. An API is a file containing your endpoints, +with their paths, implementation and documentation. The router is where you modelize your API, saying which +API goes to which version. + +Under the hood, raisin will generate classes (one for each enpoint), enabling us to use unit test for them, but keeping it transparent for Rails router. + +Here's a basic example of an API + +```ruby +class UsersAPI < Raisin::API + get '/users' do + expose(:user) { User.all } + end + + post do + expose(:user) { User.new(params[:user]) } + + response do + user.save + respond_with(user) + end + end +end +``` + +### Endpoints + +Each endoint is defined by the http verb used to access it, its path and its implementation. When the path is omitted, raisin will default it to '/'. And since we are in the UsersAPI, raisin will set a prefix to 'users'. So the `post do` is equivalent to `post '/users' do`. +Same for the get method, since its path is the same as the prefix, it can be omitted. + +The `expose` method allows you to create variables elegantly and to access it in your endpoints body or your views (in you gems like jbuilder or rabl-rails). These exposed variables are evaluated in the response block so you have access to everything (like the params object). + +The response block is where your endpoint logic goes. It can be optionnal, as you can see in the get method. If no response is specified, raisin will behave like a a standart rails controller method (thus trying to render a file with tht same name as the endpoint or fallback to API rendering) + +We talk about the name of the endpoint but how is it determine? raisin is smart enough to recognize basic CRUD operations and RESTful endpoint + +```ruby +class UsersAPI < Raisin::API + get '/users' {} # index + post '/users' {} # create + + put '/users/:id/foo' # foo +end +``` + +You can see theses names if you run `rake routes` in your console. If you prefer to name your endpoint yourself, you can do it by passing an `:as` option + +```ruby +get '/users', as: :my_method_name +``` + +### Namespaces + +You often have endpoint that have a portion of their path in commons, a namespace in raisin. The most used is RESTful applications is the "member" namespace, that look like `/resource_name/:id`. + +raisin provides both generic namespace and member out of the box + +```ruby +class UsersAPI < Raisin::API + namespace 'foo' do + get '/bar' {} # GET /foo/bar + end + + member do + put do # PUT /users/:id + response do + user.update_attributes(params[:user]) + respond_with(user) + end + end + end +end +``` + +You see that in the `update` method we used a user variable. This is because you can also expose variable for a whole namespace, which does member automatically (the variable name will be the resource name singularize, 'user' in our example) + +Namespaces can be nested. + +### Miscellanous + +You can add `single_resource` in your API for single resources. + +Resources can be nested just as regular Rails. For example + +```ruby +class CommentsAPI < Raisin::API + nested_into_resource :posts + + get '/comments/:id' do # GET /posts/:post_id/comments/:id + expose(:comment) { post.comments.find(params[:id]) } + end +end +``` + +### Router + +raisin router is similar to the `routes.rb` in Rails. APIs that appears at the top have precedence on the ones after. Versionning is done by encapsulating APIs inside `version` block. `:all` can be used is a part of your api is accessible for all versions. + +```ruby +# /app/api/my_api.rb +class MyApi < Raisin::Router + version :v2, using: :header, vendor: 'mycompany' do + mount CommentsApi + end + + version [:v2, :v1] do + mount PostsApi + mount UsersApi + end + + version :all do + mount LoginApi + end +end + +# /config/routes.rb + +mount_api MyApi +``` + +Versionning can be done via the HTTP Accept header (application/vnd.mycompany-v1+json for example) or via the URL +(/v1/users/). When using the header versionning, the vendor must be set. These options can be set globally when configuring raisin. + +## Configuration + +```ruby +Raisin.configure do |c| + c.version.using = :header + c.version.vendor = 'mycompany' +end +``` ## Contributing 1. Fork it 2. Create your feature branch (`git checkout -b my-new-feature`)