Package: britney
Britney is a module that implements theSPORE specification. It is based onSpyre.
This module requires a SPORE description of an API. Some descriptions for known services are availablehere. You can write your own withthis guide.InstallBritney is working under Python 2.7 and Python >= 3.2. To install the module, you should use pip or easy_install :$> pip install britneyor$> easy_install britneyCreate your clientBasicsYou must create your client with thenewmethod that reads a json file containing the API description or an URI exposing the description. This can be done like that :import britney

# from a description file
client = britney.new('/path/to/api_desc.json')

# from an URI
client = britney.new('http://my-server/ws/api_desc.json')The base URLIf your API description file doesn’t specify the base URL of the service, you can pass it to thenewas the named argumentbase_url:import britney

client = britney.new('/path/to/api_desc.json', base_url='http://my-server/ws/api/')MiddlewaresSometimes, services need credentials to let you access the data or even send data. The client you created can enable middlewares at runtime and also extend his usage, by doing this :import britney
from britney.middleware import auth

client = britney.new('http://my-server/ws/api_desc.json')
client.enable(auth.Basic, username='login', password='xxxxxx')Sometimes, you want to enable middlewares on certain conditions. Another method calledenable_ifcan take a callable predicate as argument that can check the environment parameters of the request :import britney
from britney.middleware import auth

client = britney.new('http://my-server/ws/api_desc.json')
client.enable_if(lambda request: request['payload'] != '', auth.Basic, username='login', password='xxxxxx')Use your clientAccess dataSend dataA full exampleCreate your own middlewareBasicsCreating and enabling middlewares let you control how request are send or response are received by adding authentification or formatting data. To create your middleware, you should :inherit frombritney.middleware.Middlewaredefine how to instantiate your middlewareimplement the process_request method to process the requestimplement the process_response method to process the responseHere is a base class example to perform runtime on request :from britney.middleware import Middleware


class Runtime(Middleware):

    def __init__(self, runtime_header):
        self.runtime_header  = runtime_header

    def process_request(self, environ):
        pass

    def process_response(self, response):
        passProcessing requestWith this method, you can access all of the keys and values of the request’s base environment. By the way, you can add keys and values, change them or even delete them. Most of time, this method doesn’t return data but if you return a requests.Response object, the process will stop and return this response. The result environment data will be used to build the request :import datetime

[...]

def process_request(self, environ):
    self.start_time = datetime.datetime.now()
    environ[self.runtime_key] = 0Processing responseWith this method, you can access data from the response, change or format content or even check headers or status :[...]

def process_response(self, reponse):
    request_time = datetime.datetime.now() - self.start_time
    response.environ[self.runtime_key] = self.request_time.secondsUse itWhen you create your client, you only should enable your middleware and pass appopriatenamed argumentsto theenablemethod :import britney
from your_module.middleware import Runtime

client = britney.new('http:://server.org/ws/api.json')
client.enable(Runtime, runtime_key='X-Spore-Runtime')That’s all !Test itA mock middleware and a function to fakeRequestsresponse are available to test the middlewares you created by faking a server. To test the Runtime middleware, you can do as follow :import datetime
import unittest
import britney
from britney.middleware import utils
from your_module.middleware import Runtime

def test_response(request):
    return utils.fake_response(request, 'OK')

class TestRuntime(unittest.TestCase):

    def setUp(self):
        self.fake_server = {'/test', test_response}
        self.client = britney.new('/path/to/api.json')
        self.runtime_key = 'X-Spore-Runtime'

    def test_runtime(self):
        self.client.enable(Runtime, runtime_header=self.runtime_header)
        self.client.enable(utils.Mock, fakes=self.fake_server, middlewares=self.client.middlewares)
        start = datetime.datetime.now()
        result = self.client.test()
        stop = datetime.datetime.now()

        self.assertIn(result.environ, self.runtime_key)
        self.assertAlmostEqual(result.environ[self.runtime_key], (stop - start).seconds)