antonio/docnmock

View on GitHub
README.md

Summary

Maintainability
Test Coverage
[![Code
Climate](https://codeclimate.com/github/antonio/docnmock.png)](https://codeclimate.com/github/antonio/docnmock)
[![Build Status](https://travis-ci.org/antonio/docnmock.png?branch=master)](https://travis-ci.org/antonio/docnmock)

# Docnmock

## Disclaimer

This is a work in progress. I first wrote this document and then started
implementing the functionality, so don't expect things to work if you can still
read this message :)

## Rationale

APIs are cool.

But documenting them sucks. And mocking them sucks. I want to see if double suck
can be cool, or at the very least get all the boring parts in the same place.

This is an *experiment* and it will probably go nowhere. You have been warned.

## The experiment

I want to be able to automatically mock an API from its documentation. Using
`docnmock` you will create the documentation for your API using `Ruby` and
generate an HTML site from it.

Also, `docnmock` will let you mock your API using the examples included in your
documentation. The idea is to have a small, self contained package that you can
require from a client application that needs to integrate against your API.

I am going to describe the possible operations using the [GitHub users
API](http://developer.github.com/v3/users/)

## Demo

Check out these other two projects

* [docnmock_github](https://github.com/antonio/docnmock_github)
* [github-user-info](https://github.com/antonio/github-user-info)

## Why not reuse an existing solution? (aka why are you reinventing the wheel?)

There are excellent alternatives out there, like
[apipie-rails](https://github.com/Pajk/apipie-rails://github.com/Pajk/apipie-rails)
and [grape](https://github.com/intridea/grape). Oh, and also
[swagger](https://developers.helloreverb.com/swagger), which is language
agnostic and great.

But none of them was exactly what I was looking for.

I don't want it to be coupled to a specific web framework.

Adding a lot of documentation to the code using a DSL makes it more difficult to
read both the documentation and the code to me.

I want the documentation to be distributed as an independent project so that the
gems can be required from the application that wants to use the mocks.

So in the end I preferred to roll my own implementation of the wheel :)

## Documenting

`Docnmock` allows you to document your API using a simple syntax. To define your
API, all you need is its url. See example below

```ruby

Docnmock.api 'http://myawesomeservice.com/api' do

  resource_group 'Users' do

    description <<-EOD
      Many of the resources on the users API provide a shortcut for
      getting information about the currently authenticated user. If a request URL
      does not include a :user parameter then the response will be for the logged in
      user (and you must pass authentication information with your request).
    EOD

    resource :get, '/users/:user' do
      description 'Get a single user'
      parameter name: :user, description: 'The user', required: false
      example path: '/users/octocat', response: response('get_users_octocat.json')
    end

end

```

`parameter` accepts a hash with the following attributes:

* name

  The name of the parameter. In the resource path, it is preceded by a colon.

* description

  Freestyle description of the parameter.

* required

  Either true or false, defaults to false.

* type

  Type of the parameter. There are no boundaries for this, but try to use well
  known primitives as a guideline (string, int, boolean, etc)

`example` accepts two arguments. The first one is the request path, including
whatever parameters are needed. The second one is the response that will be
returned (as a string). As you can see in the example above, you can (and
should!) use a helper to load the response from a file bundled with your gem.
`docnmock` assumes your fixtures will be under a folder named `responses`. For
more information, please have a look at the
[docnmock-github](https://github.com/antonio/docnmock-github) project.

The contents of `responses/get_users_octocat.json` would be something similar to

```json
{
  "login": "octocat",
  "id": 1,
  "avatar_url": "https://github.com/images/error/octocat_happy.gif",
  "gravatar_id": "somehexcode",
  "url": "https://api.github.com/users/octocat",
  "name": "monalisa octocat",
  "company": "GitHub",
  "blog": "https://github.com/blog",
  "location": "San Francisco",
  "email": "octocat@github.com",
  "hireable": false,
  "bio": "There once was...",
  "public_repos": 2,
  "public_gists": 1,
  "followers": 20,
  "following": 0,
  "html_url": "https://github.com/octocat",
  "created_at": "2008-01-14T04:33:35Z",
  "type": "User"
}
```

## Generate documentation

## Mocking

Everything can be mocked

```ruby
Docnmock.api('http://api.github.com').mock
Docnmock.api('http://api.github.com').resource_group('Users').mock
Docnmock.api('http://api.github.com').resource_group('Users').resource(:get, '/users/:user').mock
```

## To-Do

As I said before, this is just an experiment. If I find it useful, here is
a list of improvements that can be done.

* API versions
* Description of resources written in markdown
* Tomdoc
* Rails integration?
* Create Error classes instead of using the standard one
* Pass headers to example
* Resource validation and rake tasks to validate the API (say you are missing parameters in your
  resources, for instance)
* Refactor specs, I am pretty sure that there are some shared examples hidden
  there.
* Allow using a port other than 80


[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/antonio/docnmock/trend.png)](https://bitdeli.com/free "Bitdeli Badge")