From efce8dc07f3a53c53a611996c628397d7c33e526 Mon Sep 17 00:00:00 2001 From: Piotr Date: Thu, 25 Sep 2014 20:53:23 +0200 Subject: [PATCH] [#69] Added begging of function for connection all together, decorator for params and func to get regex which need to be fixed to concatenate lists --- src/shmir/data/models.py | 4 +++ src/shmir/decorators.py | 13 +++++++++ src/shmir/designer/connection.py | 45 ++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 src/shmir/designer/connection.py diff --git a/src/shmir/data/models.py b/src/shmir/data/models.py index 724ae54..371db35 100644 --- a/src/shmir/data/models.py +++ b/src/shmir/data/models.py @@ -90,6 +90,10 @@ def generate_regexp_all(cls): db_session.commit() + @classmethod + def get_all_regexp(cls): + return [bone.regex for bone in db_session.query(cls).all()] + @classmethod def get_mirna(cls, name=None): if name: diff --git a/src/shmir/decorators.py b/src/shmir/decorators.py index a7de003..1160727 100644 --- a/src/shmir/decorators.py +++ b/src/shmir/decorators.py @@ -10,6 +10,7 @@ import json from shmir.utils import json_error +from shmir.designer import errors def require_json(require_data=True, required_data_words=None, @@ -63,3 +64,15 @@ def jsonify(f): def wrapped(*args, **kwargs): return dumps(f(*args, **kwargs)) return wrapped + + +def param(name, g_type, description, default=None, required=False): + def wrapper(func): + def wrapped(**kwargs): + if not kwargs[name]: + if required: + raise errors.InputException('{} is required'.format(name)) + kwargs[name] = g_type(default) + return func(**kwargs) + return wrapped + return wrapper diff --git a/src/shmir/designer/connection.py b/src/shmir/designer/connection.py new file mode 100644 index 0000000..1ca0a92 --- /dev/null +++ b/src/shmir/designer/connection.py @@ -0,0 +1,45 @@ +from shmir import cache +from shmir.data import ( + models, + ncbi_api, +) +from shmir.decorators import param +from shmir.designer.validators import calculate_gc_content + + +def create_cache_key(*args): + return ':'.join(args) + + +@param('transcript_name', str, 'Name of transcript', required=True) +@param('min_gc', int, 'Minimum of GC content', default=40) +@param('max_gc', int, 'Maximum of GC content', default=60) +@param('max_offtarget', int, 'Maximum offtarget, minimum is 0', default=10) +@param('mirna_name', str, 'miRNA name of Backbone', default=None) +@param( + 'stymulators', bool, 'Bool if immuno stimulators are wanted', default=False +) +def connection( + transcript_name, min_gc, max_gc, max_offtarget, mirna_name, stymulators +): + sequence = '?' + cg_content = calculate_gc_content(sequence) + + cache_key = create_cache_key( + transcript_name, + cg_content, + mirna_name, + max_offtarget, + str(stymulators) + ) + + sequence = cache.get(cache_key) # TODO: check if get take cache by key xD + + if not sequence: + sequence = ncbi_api.get_mRNA(transcript_name) + + backbones = models.Backbone.get_mirna(mirna_name) + if not isinstance(backbones, list): + backbones = [backbones] + + all_regex = models.Backbone.get_all_regexp()