Project

moko

0.0
No commit activity in last 3 years
No release in over 3 years
moko is used for build restful API in secs, for testing puropse
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

>= 4.0.2, ~> 4.0
>= 0.18.1, ~> 0.18
 Project Readme

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.