This class is used by sofine
to generate a proxy object around any HTTP plugin. sofine
dynamically creates the object based on the value in the environment variable
SOFINE_HTTP_PLUGIN_URL and the plugin name and plugin group in the call. This wrapper
simply lets the existing mechanism to run plugins call a Python object with the same
API as Python plugins.
The second important function of this class is that it depends on and expects that
all HTTP plugins will conform to the API for their return data types as defined in the
documentation for sofine
. In particular, all of the public methods expect that the return
values from calling an HTTP plugin will have keys with designated names.
""" This class is used by `sofine` to generate a proxy object around any HTTP plugin. `sofine` dynamically creates the object based on the value in the environment variable SOFINE_HTTP_PLUGIN_URL and the plugin name and plugin group in the call. This wrapper simply lets the existing mechanism to run plugins call a Python object with the same API as Python plugins. The second important function of this class is that it depends on and expects that all HTTP plugins will conform to the API for their return data types as defined in the documentation for `sofine`. In particular, all of the public methods expect that the return values from calling an HTTP plugin will have keys with designated names. """ import sofine.lib.utils.conf as conf from urllib import urlopen, urlencode import json class HttpPluginProxy(object): def __init__(self): self._plugin_url = '' # Clunky but we have to have a no-arg constructor to conform to the # way utils loads modules. It needs a reference to a class with a no-arg ctor. # The only place this plugin proxy is instantiated is internally in utils.load_module() # anyway, so this slight wart is encapsulated from users def set_plugin_url(self, plugin_name, plugin_group): self._plugin_url = (conf.CUSTOM_HTTP_PLUGIN_URL + '/{0}' + '/{1}').format(plugin_name, plugin_group) def _urlopen(self, url): ret = urlopen(url) ret = ret.read() ret = json.loads(ret) return ret def parse_args(self, args): qs_args = ','.join([urlencode({'x' : arg}).split('=')[1] for arg in args]) ret = self._urlopen(self._plugin_url + '/parse_args?args=' + qs_args) is_valid = ret["is_valid"] parsed_args = ret["parsed_args"] return is_valid, parsed_args def get_data(self, keys, parsed_args): """ * `keys`. An array of keys for a `sofine` data retrieval * `parsed_args` - an array of args to use in a data retrieval call Proxy wrapper for retrieving data from an HTTP plugin. Calls a pliugin's _required_ `get_data` method. Transforms `keys` and `parsed_args` values into the required query string format that HTTP plugins must expect and support. This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. """ qs_keys = ','.join([urlencode({'x' : key}).split('=')[1] for key in keys]) qs_args = ','.join([urlencode({'x' : arg}).split('=')[1] for arg in parsed_args]) ret = self._urlopen(self._plugin_url + '/get_data?keys=' + qs_keys + '&args=' + qs_args) return ret def get_schema(self): """ Proxy wrapper for retrieving the schema of data returned by an HTTP plugin. This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. """ ret = self._urlopen(self._plugin_url + '/get_schema') ret = ret["schema"] return ret def adds_keys(self): """ Proxy wrapper for discovering whether an HTTP plugin an add keys when the plugin is called as part of a chain of `sofine` plugins in one `get_data` call. This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. """ ret = self._urlopen(self._plugin_url + '/adds_keys') ret = ret["adds_keys"] return ret # utils.load_module() calls a function plugin(). For Py plugins this is reference # to the class placed in the module as an attribute plugin = class_name. So # it amounts to constructing an instance of the plugin. Here we need to pass # back an already constructed proxy object, bound to plugin_name and group # because of the order of which things happen in utils. So we just provide # a different implementation of plugin() which will resolve against the object # already returned and just passes back a pointer to itself def plugin(self): return self
class HttpPluginProxy
class HttpPluginProxy(object): def __init__(self): self._plugin_url = '' # Clunky but we have to have a no-arg constructor to conform to the # way utils loads modules. It needs a reference to a class with a no-arg ctor. # The only place this plugin proxy is instantiated is internally in utils.load_module() # anyway, so this slight wart is encapsulated from users def set_plugin_url(self, plugin_name, plugin_group): self._plugin_url = (conf.CUSTOM_HTTP_PLUGIN_URL + '/{0}' + '/{1}').format(plugin_name, plugin_group) def _urlopen(self, url): ret = urlopen(url) ret = ret.read() ret = json.loads(ret) return ret def parse_args(self, args): qs_args = ','.join([urlencode({'x' : arg}).split('=')[1] for arg in args]) ret = self._urlopen(self._plugin_url + '/parse_args?args=' + qs_args) is_valid = ret["is_valid"] parsed_args = ret["parsed_args"] return is_valid, parsed_args def get_data(self, keys, parsed_args): """ * `keys`. An array of keys for a `sofine` data retrieval * `parsed_args` - an array of args to use in a data retrieval call Proxy wrapper for retrieving data from an HTTP plugin. Calls a pliugin's _required_ `get_data` method. Transforms `keys` and `parsed_args` values into the required query string format that HTTP plugins must expect and support. This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. """ qs_keys = ','.join([urlencode({'x' : key}).split('=')[1] for key in keys]) qs_args = ','.join([urlencode({'x' : arg}).split('=')[1] for arg in parsed_args]) ret = self._urlopen(self._plugin_url + '/get_data?keys=' + qs_keys + '&args=' + qs_args) return ret def get_schema(self): """ Proxy wrapper for retrieving the schema of data returned by an HTTP plugin. This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. """ ret = self._urlopen(self._plugin_url + '/get_schema') ret = ret["schema"] return ret def adds_keys(self): """ Proxy wrapper for discovering whether an HTTP plugin an add keys when the plugin is called as part of a chain of `sofine` plugins in one `get_data` call. This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. """ ret = self._urlopen(self._plugin_url + '/adds_keys') ret = ret["adds_keys"] return ret # utils.load_module() calls a function plugin(). For Py plugins this is reference # to the class placed in the module as an attribute plugin = class_name. So # it amounts to constructing an instance of the plugin. Here we need to pass # back an already constructed proxy object, bound to plugin_name and group # because of the order of which things happen in utils. So we just provide # a different implementation of plugin() which will resolve against the object # already returned and just passes back a pointer to itself def plugin(self): return self
def __init__(
self)
def __init__(self): self._plugin_url = ''
def adds_keys(
self)
Proxy wrapper for discovering whether an HTTP plugin an add keys when the plugin is called
as part of a chain of sofine
plugins in one get_data
call.
This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec.
def adds_keys(self): """ y wrapper for discovering whether an HTTP plugin an add keys when the plugin is called art of a chain of `sofine` plugins in one `get_data` call. is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. ret = self._urlopen(self._plugin_url + '/adds_keys') ret = ret["adds_keys"] return ret
def get_data(
self, keys, parsed_args)
keys
. An array of keys for a sofine
data retrievalparsed_args
- an array of args to use in a data retrieval callProxy wrapper for retrieving data from an HTTP plugin. Calls a pliugin's required get_data
method. Transforms keys
and parsed_args
values into the required query string format that HTTP plugins must expect and support.
This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec.
def get_data(self, keys, parsed_args): """ eys`. An array of keys for a `sofine` data retrieval arsed_args` - an array of args to use in a data retrieval call y wrapper for retrieving data from an HTTP plugin. Calls a pliugin's _required_ `get_data` method. Transforms `keys` and `parsed_args` values into the required query string format that HTTP plugins must expect and support. is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. qs_keys = ','.join([urlencode({'x' : key}).split('=')[1] for key in keys]) qs_args = ','.join([urlencode({'x' : arg}).split('=')[1] for arg in parsed_args]) ret = self._urlopen(self._plugin_url + '/get_data?keys=' + qs_keys + '&args=' + qs_args) return ret
def get_schema(
self)
Proxy wrapper for retrieving the schema of data returned by an HTTP plugin.
This is a very thin proxy with no business logic of its own other than constructing plugin calls to spec.
def get_schema(self): """ y wrapper for retrieving the schema of data returned by an HTTP plugin. is a very thin proxy with no business logic of its own other than constructing plugin calls to spec. ret = self._urlopen(self._plugin_url + '/get_schema') ret = ret["schema"] return ret
def parse_args(
self, args)
def parse_args(self, args): qs_args = ','.join([urlencode({'x' : arg}).split('=')[1] for arg in args]) ret = self._urlopen(self._plugin_url + '/parse_args?args=' + qs_args) is_valid = ret["is_valid"] parsed_args = ret["parsed_args"] return is_valid, parsed_args
def plugin(
self)
def plugin(self): return self
def set_plugin_url(
self, plugin_name, plugin_group)
def set_plugin_url(self, plugin_name, plugin_group): self._plugin_url = (conf.CUSTOM_HTTP_PLUGIN_URL + '/{0}' + '/{1}').format(plugin_name, plugin_group)
Documentation generated by
pdoc
0.2.4.
pdoc is in the public domain with the
UNLICENSE.