README.md in rest-more-0.8.0 vs README.md in rest-more-1.0.0
- old
+ new
@@ -1,9 +1,18 @@
-# rest-more [![Build Status](http://travis-ci.org/godfat/rest-more.png)](http://travis-ci.org/godfat/rest-more)
+# rest-more [![Build Status](https://secure.travis-ci.org/godfat/rest-more.png?branch=master)](http://travis-ci.org/godfat/rest-more)
by Cardinal Blue <http://cardinalblue.com>
+Lin Jen-Shin ([godfat][]) had given a talk about rest-core on
+[RubyConf Taiwan 2011][talk]. The slide is in English, but the
+talk is in Mandarin.
+
+You can also read some other topics at [doc](https://github.com/cardinalblue/rest-core/blob/master/doc/ToC.md).
+
+[godfat]: https://github.com/godfat
+[talk]: http://rubyconf.tw/2011/#6
+
## LINKS:
* [github](https://github.com/cardinalblue/rest-more)
* [rubygems](https://rubygems.org/gems/rest-more)
* [rdoc](http://rdoc.info/projects/cardinalblue/rest-more)
@@ -13,26 +22,60 @@
Various REST clients such as Facebook and Twitter built with [rest-core][]
[rest-core]: https://github.com/cardinalblue/rest-core
+## FEATURES:
+
+Out-of-box REST clients built with rest-core for:
+
+* Bing
+* Dropbox
+* Facebook
+* Flurry
+* Github
+* Linkedin
+* Mixi
+* Twitter
+
+Rails utilities are also included.
+
## REQUIREMENTS:
-* Tested with MRI (official CRuby) 1.8.7, 1.9.2, 1.9.3, Rubinius and JRuby
-* gem install rest-core
+### Mandatory:
+* MRI (official CRuby) 1.8.7, 1.9.2, 1.9.3, Rubinius 1.8/1.9 and JRuby 1.8/1.9
+* gem rest-client
+
+### Optional:
+
+* Fibers only work on Ruby 1.9+
+* gem [em-http-request][] (if using eventmachine)
+* gem [cool.io-http][] (if using cool.io)
+* gem json or yajl-ruby (if using `JsonDecode` middleware)
+
+[em-http-request]: https://github.com/igrigorik/em-http-request
+[cool.io-http]: https://github.com/godfat/cool.io-http
+
## INSTALLATION:
+``` shell
gem install rest-more
+```
Or if you want development version, put this in Gemfile:
+``` ruby
gem 'rest-more', :git => 'git://github.com/cardinalblue/rest-more.git',
:submodules => true
+```
## SYNOPSIS:
+The simplest usage:
+
+``` ruby
require 'rest-more'
RestCore::Twitter.new.statuses('_cardinalblue') # get user tweets
RestCore::Github.new.get('users/cardinalblue') # get user info
@@ -41,25 +84,141 @@
linkedin.authorize_url! # copy and paste the URL in browser to authorize
linkedin.authorize!('..') # paste your code from browser
linkedin.me # get current user info
RestCore::Facebook.new.get('4') # get user info
+```
-See [example][] for more complex examples.
+Runnable example is here: [example/simple.rb][]. Please see [slides][] from
+[rubyconf.tw/2011][rubyconf.tw] for concepts.
-[example]: https://github.com/cardinalblue/rest-more/tree/master/example
+[example/simple.rb]: https://github.com/cardinalblue/rest-more/blob/master/example/simple.rb
+[slides]: http://www.godfat.org/slide/2011-08-27-rest-core.html
+[rubyconf.tw]: http://rubyconf.tw/2011/#6
-## List of supported clients:
+## Asynchronous HTTP Requests:
-* Bing
-* Facebook
-* Flurry
-* Github
-* Linkedin
-* Mixi
-* Twitter
+I/O bound operations shouldn't be blocking the CPU! If you have a reactor,
+i.e. event loop, you should take the advantage of that to make HTTP requests
+not block the whole process/thread. For now, we support eventmachine and
+cool.io. By default, all clients are using `RestClient`, which is a
+synchronous HTTP client, thus blocking. It's very easy to use, but not
+very scalable (not concurrent-efficient). You can change the default app
+(i.e. HTTP clients) to an asynchronous one:
+``` ruby
+ require 'rest-more'
+ RestCore::Builder.default_app = RestCore::EmHttpRequest
+```
+
+or an auto-picking one, which would try to infer the correct HTTP client
+depending on the context. Either em-http-request, cool.io-http, or even
+rest-client if none of reactors is available.
+
+``` ruby
+ require 'rest-more'
+ RestCore::Builder.default_app = RestCore::Auto
+```
+
+You can also setup the `default_app` for a specific client, so that it won't
+change all the `default_app` for all the clients, like this:
+
+``` ruby
+ require 'rest-more'
+ RestCore::Facebook.builder.default_app = RestCore::Auto
+```
+
+If you're passing a block, the block is called after the response is
+available. That is the block is the callback for the request.
+
+``` ruby
+ require 'rest-more'
+ require 'eventmachine'
+ RestCore::Builder.default_app = RestCore::EmHttpRequest
+ EM.run{
+ RestCore::Facebook.new.get('4'){ |response|
+ p response
+ EM.stop
+ }
+ puts "It's not blocking..."
+ }
+```
+
+Otherwise, if you don't pass a block as the callback, EmHttpRequest (i.e.
+the HTTP client for eventmachine) would call `Fiber.yield` to yield to the
+original fiber, making asynchronous HTTP requests look like synchronous.
+If you don't understand what does this mean, you can take a look at
+[em-synchrony][]. It's basically the same idea.
+
+``` ruby
+ require 'rest-more'
+ require 'eventmachine'
+
+ RestCore::Builder.default_app = RestCore::EmHttpRequest
+
+ EM.run{
+ Fiber.new{
+ p RestCore::Facebook.new.get('4')
+ EM.stop
+ }.resume
+ puts "It's not blocking..."
+ }
+```
+
+[em-synchrony]: https://github.com/igrigorik/em-synchrony
+
+Runnable example is here: [example/facebook.rb][].
+You can also make multi-requests synchronously like this:
+
+``` ruby
+ require 'rest-more'
+ require 'eventmachine'
+
+ RestCore::Builder.default_app = RestCore::Auto
+ facebook = RestCore::Facebook.new(:log_method => method(:puts))
+
+ EM.run{
+ Fiber.new{
+ fiber = Fiber.current
+ result = {}
+ facebook.get('4'){ |response|
+ result[0] = response
+ fiber.resume(result) if result.size == 2
+ }
+ puts "It's not blocking..."
+ facebook.get('4'){ |response|
+ result[1] = response
+ fiber.resume(result) if result.size == 2
+ }
+ p Fiber.yield
+ EM.stop
+ }.resume
+ puts "It's not blocking..."
+ }
+```
+
+Runnable example is here: [example/multi.rb][]. All `RestCore::EmHttpRequest`
+above is interchangeable with `RestCore::Auto` because `RestCore::Auto` would
+pick the right HTTP client when running inside the eventmachine's event loop.
+
+[example/facebook.rb]: https://github.com/cardinalblue/rest-more/blob/master/example/facebook.rb
+[example/multi.rb]: https://github.com/cardinalblue/rest-more/blob/master/example/multi.rb
+
+## Supported HTTP clients:
+
+* `RestCore::RestClient` (gem rest-client)
+* `RestCore::EmHttpRequest` (gem em-http-request)
+* `RestCore::Coolio` (gem cool.io)
+* `RestCore::Auto` (which would pick one of the above depending on the
+ context)
+
+## Rails Utilities
+
+To be added. But you can take a look at the [Facebook tutorial][] first.
+
+[Facebook tutorial]: https://github.com/cardinalblue/rest-more/blob/master/doc/tutorial/facebook.md
+
## A simple interactive shell with [rib][]:
You need to install [rib][] in order to try this interactive shell:
gem install rib
@@ -77,14 +236,28 @@
## rest-more users:
* [s2sync](https://github.com/brucehsu/s2sync)
* [s2sync_web](https://github.com/brucehsu/s2sync_web)
+## Powered sites:
+
+* [PicCollage](http://pic-collage.com/)
+
+## CHANGES:
+
+* [CHANGES](https://github.com/cardinalblue/rest-more/blob/master/CHANGES.md)
+
+## CONTRIBUTORS:
+
+* ayaya (@ayamomiji)
+* Lin Jen-Shin (@godfat)
+* Yun-Yan Chi (@jaiyalas)
+
## LICENSE:
Apache License 2.0
-Copyright (c) 2011, Cardinal Blue
+Copyright (c) 2011-2012, Cardinal Blue
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at