Passed
Push — master ( ef1ceb...20aa4c )
by Jordi
06:12
created

bika.lims.decorators.XXX_REMOVEME()   A

Complexity

Conditions 1

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 10
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
# -*- coding: utf-8 -*-
2
#
3
# This file is part of SENAITE.CORE
4
#
5
# Copyright 2018 by it's authors.
6
# Some rights reserved. See LICENSE.rst, CONTRIBUTORS.rst.
7
8
import cProfile
9
import json
10
import os
11
import time
12
from functools import wraps
13
14
from bika.lims import api
15
from bika.lims import logger
16
from senaite.core.supermodel.interfaces import ISuperModel
17
from zope.component import queryAdapter
18
19
20
def XXX_REMOVEME(func):
21
    """Decorator for dead code removal
22
    """
23
    @wraps(func)
24
    def decorator(self, *args, **kwargs):
25
        msg = "~~~~~~~ XXX REMOVEME marked method called: {}.{}".format(
26
            self.__class__.__name__, func.func_name)
27
        raise RuntimeError(msg)
28
        return func(self, *args, **kwargs)
29
    return decorator
30
31
32 View Code Duplication
def returns_json(func):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
33
    """Decorator for functions which return JSON
34
    """
35
    def decorator(*args, **kwargs):
36
        instance = args[0]
37
        request = getattr(instance, 'request', None)
38
        request.response.setHeader("Content-Type", "application/json")
39
        result = func(*args, **kwargs)
40
        return json.dumps(result)
41
    return decorator
42
43
44
def returns_super_model(func):
45
    """Decorator to return standard content objects as SuperModels
46
    """
47
    def to_super_model(obj):
48
        # avoid circular imports
49
        from senaite.core.supermodel import SuperModel
50
51
        # Object is already a SuperModel
52
        if isinstance(obj, SuperModel):
53
            return obj
54
55
        # Only portal objects are supported
56
        if not api.is_object(obj):
57
            raise TypeError("Expected a portal object, got '{}'"
58
                            .format(type(obj)))
59
60
        # Wrap the object into a specific Publication Object Adapter
61
        uid = api.get_uid(obj)
62
        portal_type = api.get_portal_type(obj)
63
64
        adapter = queryAdapter(uid, ISuperModel, name=portal_type)
65
        if adapter is None:
66
            return SuperModel(uid)
67
        return adapter
68
69
    @wraps(func)
70
    def wrapper(*args, **kwargs):
71
        obj = func(*args, **kwargs)
72
        if isinstance(obj, (list, tuple)):
73
            return map(to_super_model, obj)
74
        return to_super_model(obj)
75
76
    return wrapper
77
78
79
def profileit(path=None):
80
    """cProfile decorator to profile a function
81
82
    :param path: output file path
83
    :type path: str
84
    :return: Function
85
    """
86
87
    def inner(func):
88
        @wraps(func)
89
        def wrapper(*args, **kwargs):
90
            prof = cProfile.Profile()
91
            retval = prof.runcall(func, *args, **kwargs)
92
            if path is not None:
93
                print prof.print_stats()
94
                prof.dump_stats(os.path.expanduser(path))
95
            else:
96
                print prof.print_stats()
97
            return retval
98
        return wrapper
99
    return inner
100
101
102
def timeit(threshold=0):
103
    """Decorator to log the execution time of a function
104
    """
105
106
    def inner(func):
107
        @wraps(func)
108
        def wrapper(*args, **kwargs):
109
            start = time.time()
110
            return_value = func(*args, **kwargs)
111
            end = time.time()
112
            duration = float(end-start)
113
            if duration > threshold:
114
                logger.info("Execution of '{}{}' took {:2f}s".format(
115
                    func.__name__, args, duration))
116
            return return_value
117
        return wrapper
118
    return inner
119