A tool used for generate moco(https://github.com/dreamhead/moco) configuration, for setup a RESTFul API in seconds.
Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
bin
lib
.gitignore
Gemfile
Gemfile.lock
README.md
Rakefile
moko.gemspec
moko.up

README.md

Moko

Moko is used to generate configuration for moco, and it allows you to define RESTFul API(s) in seconds.

Install

$ gem install 'moko'

or put this gem 'moko' in your Gemfile.

After the installation, you can use command mokoup shipped with moko to setup your RESTFul API.

➜  moko git:(master) ✗ mokoup help
Commands:
  mokoup generate        # generate moco configuration and restful resources
  mokoup help [COMMAND]  # Describe available commands or one specific command
  mokoup server          # startup the underlying moco server

There are 2 commands available currently, generate and server. generate command looks for a file named moko.up in your current directory, and use it to generate configuration for underlying moco server. And server command used to launch the moco server.

$ mokoup server

will first try to download the latest moco first, and then launch it at port 12306.

Define a resource

To define your resources in moko, the simplest way is by using resources method in file moko.up. That's pretty strightforward:

resources :users

and then run mokoup generate to generate resources, this will generate a configuration for moco: conf/moco.conf.json, and the corresponding resources in resources directory, of course it's empty in this case.

After that, you can launch the moco server by

$ mokoup server

and then you can get something like this:

run  java -jar /Users/twer/.rvm/gems/ruby-1.9.3-p448/gems/moko-0.1.0/bin/moco/moco-runner-standalone.jar start -p 12306 -c conf/moko.conf.json from "."

22 Feb 2014 19:47:38 [main] INFO  Server is started at 12306
22 Feb 2014 19:47:38 [main] INFO  Shutdown port is 56731

Since the server is up and running, you can use those resources freely just as they are really defined in the backend server (Rails, Php, Java...):

For example, you can use curl to test those APIs:

curl -X POST -d "{}" http://localhost:12306/users

or

curl http://localhost:12306/users/23

And of course you can define many resources at a time:

resources :users
resources :posts 
resources :comments

or

resources :users, :posts, :comments

Resource With data

Ok, the example above is boring I would say, but you can actually define some more intesting stuff, like this:

resource :user do |u|
    u.string :name
    u.integer :age
    u.string :type
    u.datetime :created_at
    u.datetime :updated_at
end

and run the mokoup generate && mokoup server again. This time, the response will be more meaningful:

$ curl -X POST -d "{}" http://localhost:12306/users | jq .

and you'll get the following as expected:

{
  "updated_at": "2014-02-12 00:16:29 +1100",
  "created_at": "2014-02-12 00:16:29 +1100",
  "type": "default String Value",
  "arg": 1,
  "name": "default String Value"
}

Under the hood

Basically, moko just use some magics from ruby meta programming, and generate a configuration which will be used by moco in file conf/moko.conf.json.

That file defined some rules of how a request should be responeded:

...
{
    "request": {
        "method": "get",
        "uri": {
            "match": "/users/\\d+"
        }
    },
    "response": {
        "status": 200,
        "headers" : {
            "content-type" : "application/json"
        },        
        "file": "resources/users.json"
    }
}
...

when arriving request is matching /users/\\d+(regular expression here matches an number as ID), the response will be returned, in json format, with data stored in resources/users.json. And the schema of the content of resources/users.json is defined in moko.up.

Pretty simple, right!

What's next

Maybe we can add namespace or nested resources to moko, or we can make the data make more sense. Any suggestions are more than welcomed.