Skip to content

Files

Latest commit

f910c50 · May 2, 2012

History

History
This branch is 2041 commits behind github/github-services:master.

services

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Services

This is the directory that all Services go. Creating a Service is simple:

class Service::MyService < Service
  def receive_push
  end
end

Inside the method, you can access the configuration data in a hash named data, and the payload data in a Hash named payload.

Note: A service can respond to more than one event. Currently, only push is supported.

Tip: Check configuration data early.

class Service::MyService < Service
  def receive_push
    if data['username'].to_s.empty?
      raise_config_error "Needs a username"
    end
  end
end

Tip: Use http helpers to make HTTP calls easily.

class Service::MyService < Service
  def receive_push
    # Sets this basic auth info for every request.
    http.basic_auth(data['username'], data['password'])

    # Every request sends JSON.
    http.headers['Content-Type'] = 'application/json'

    # Uses this URL as a prefix for every request.
    http.url_prefix = "https://my-service.com/api"

    payload['commits'].each do |commit|

      # POST https://my-service.com/api/commits.json
      http_post "commits.json", commit.to_json

    end
  end
end

Tip: Test your service like a bossk.

class MyServiceTest < Service::TestCase
  def setup
    @stubs = Faraday::Adapter::Test::Stubs.new
  end

  def test_push
    @stubs.post "/api/create.json" do |env|
      assert_equal 'my-service.com', env[:url].host
      assert_equal 'application/json',
        env[:request_headers]['content-type']
      assert_equal basic_auth("user", "pass"),
        env[:request_headers]['authorization']
      [200, {}, '']
    end

    svc = service :push,
      {'username' => 'user', 'password' => 'pass'}, payload
    svc.receive_push
  end

  def service(*args)
    super Service::MyService, *args
  end
end

Documentation

Each Service needs to have documentation aimed at end users in /docs. See existing services for the format.