Passed
Pull Request — master (#69)
by
unknown
03:52
created

nextcloud.base.BaseApiWrapper.__init__()   A

Complexity

Conditions 2

Size

Total Lines 8
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 2
nop 5
1
# -*- coding: utf-8 -*-
2
"""
3
Define what is an api wrapper
4
"""
5
import six
6
from nextcloud.requester import Requester, OCSRequester, WebDAVRequester
7
from nextcloud.codes import ProvisioningCode, OCSCode, WebDAVCode
8
9
API_WRAPPER_CLASSES = []
10
11
12
class MetaWrapper(type):
13
    def __new__(meta, name, bases, attrs):
14
        cls = type.__new__(meta, name, bases, attrs)
15
        if (cls.API_URL != NotImplementedError and cls.VERIFIED):
16
            API_WRAPPER_CLASSES.append(cls)
17
        return cls
18
19
20
class BaseApiWrapper(object, six.with_metaclass(MetaWrapper)):
21
    """
22
    Define an API wrapper
23
24
    Example of an abstract API wrapper.
25
    >>> class ApiWrapper(BaseApiWrapper):
26
    >>>    REQUESTER = WebDAVRequester
27
    >>>    SUCCESS_CODE = 100
28
29
30
    If API_URL is provided (and if attribute ''VERIFIED = False'' is not in the new
31
    class),then public methods of the class are added to NextCloud object.
32
    Example of a concerete API wrapper.
33
    >>> class Info(ApiWrapper):
34
    >>>    API_URL = 'remote.php/info'
35
    >>>
36
    >>>    def get_info(self):
37
    >>>        return self.requester.get()
38
39
    """
40
    API_URL = NotImplementedError
41
    VERIFIED = True
42
    JSON_ABLE = True
43
    REQUIRE_CLIENT = False
44
    REQUIRE_USER = False
45
    REQUESTER = Requester
46
47
    def __init__(self, session, json_output=None, client=None, user=None):
48
        self.json_output = json_output
49
        self.client = client
50
        self.user = user
51
        self.requester = self.REQUESTER(session, json_output=json_output)
52
53
        for attr_name in ['API_URL', 'SUCCESS_CODE', 'METHODS_SUCCESS_CODES']:
54
            setattr(self.requester, attr_name, getattr(self, attr_name, None))
55
56
    def _arguments_get(self, varnames, vals):
57
        """
58
        allows to automatically fetch values of varnames
59
        using generic values computing '_default_get_VARNAME'
60
61
        Example
62
        >>> def get_file_id(self, **kwargs):
63
        >>>     file_id, = self._arguments_get(['file_id'], locals())
64
        >>>
65
        >>> def _default_get_file_id(self, vals):
66
        >>>     return self.get_file_id_from_name(vals.get('name', None))
67
        >>>
68
        >>> nxc.get_file_id(name='foo.bar')
69
        """
70
        if 'kwargs' in vals:
71
            vals.update(vals['kwargs'])
72
        ret = []
73
        for varname in varnames:
74
            val = vals.get(varname, None)
75
            if val is None:
76
                getter_func_name = '_default_get_%s' % varname
77
                if hasattr(self, getter_func_name):
78
                    val = getattr(self, getter_func_name)(vals)
79
            ret.append(val)
80
81
        return ret
82
83
84
85
86
class ProvisioningApiWrapper(BaseApiWrapper):
87
    """ Define "Provisioning API" wrapper classes """
88
    REQUESTER = OCSRequester
89
    SUCCESS_CODE = ProvisioningCode.SUCCESS
90
91
92
class OCSv1ApiWrapper(BaseApiWrapper):
93
    """ Define OCS wrapper classes """
94
    REQUESTER = OCSRequester
95
    SUCCESS_CODE = OCSCode.SUCCESS_V1
96
97
98
class OCSv2ApiWrapper(BaseApiWrapper):
99
    """ Define OCS wrapper classes """
100
    REQUESTER = OCSRequester
101
    SUCCESS_CODE = OCSCode.SUCCESS_V2
102
103
104
class WebDAVApiWrapper(BaseApiWrapper):
105
    """ Define WebDav wrapper classes """
106
    REQUESTER = WebDAVRequester
107
108
    SUCCESS_CODE = {
109
        'PROPFIND': [WebDAVCode.MULTISTATUS],
110
        'PROPPATCH': [WebDAVCode.MULTISTATUS],
111
        'REPORT': [WebDAVCode.MULTISTATUS],
112
        'MKCOL': [WebDAVCode.CREATED],
113
        'COPY': [WebDAVCode.CREATED, WebDAVCode.NO_CONTENT],
114
        'MOVE': [WebDAVCode.CREATED, WebDAVCode.NO_CONTENT],
115
        'PUT': [WebDAVCode.CREATED],
116
        'POST': [WebDAVCode.CREATED],
117
        'DELETE': [WebDAVCode.NO_CONTENT]
118
    }
119