Uploader   A
last analyzed

Complexity

Total Complexity 24

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 102
rs 10
c 0
b 0
f 0
wmc 24

11 Methods

Rating   Name   Duplication   Size   Complexity  
A summary() 0 5 2
A version() 0 5 2
A remove() 0 3 1
A username() 0 5 2
A release() 0 9 3
A project() 0 6 2
A files() 0 3 1
A notebook_attrs() 0 6 2
A upload() 0 20 3
A package() 0 10 3
A __init__() 0 9 3
1
import os
2
import re
3
import time
4
from os.path import basename
5
from binstar_client import errors
6
from .inflection import parameterize
7
from .data_uri import data_uri_from
8
9
VALID_FORMATS = ['ipynb', 'csv', 'yml', 'yaml', 'json', 'md', 'rst', 'txt']
10
11
12
class Uploader(object):
13
    """
14
    * Find or create a package (project)
15
    * Find or create release (version)
16
    * List files from project
17
    * Upload new files to project
18
    """
19
    _package = None
20
    _release = None
21
    _project = None
22
23
    def __init__(self, aserver_api, filepath, **kwargs):
24
        self.aserver_api = aserver_api
25
        self.filepath = filepath
26
        self._username = kwargs.get('user', None)
27
        self._version = kwargs.get('version', None)
28
        self._summary = kwargs.get('summary', None)
29
        self._thumbnail = kwargs.get('thumbnail', None)
30
        if 'name' in kwargs and kwargs['name'] is not None:
31
            self._project = parameterize(kwargs['name'])
32
33
    def upload(self, force=False):
34
        """
35
        Uploads a notebook
36
        :param force: True/False
37
        :returns {}
38
        """
39
        self.package and self.release
40
        try:
41
            return self.aserver_api.upload(self.username, self.project, self.version,
42
                                       basename(self.filepath), open(self.filepath, 'rb'),
43
                                       self.filepath.split('.')[-1])
44
        except errors.Conflict:
45
            if force:
46
                self.remove()
47
                return self.upload()
48
            else:
49
                msg = "Conflict: {} already exist in {}/{}".format(self.filepath,
50
                                                                   self.project,
51
                                                                   self.version)
52
                raise errors.BinstarError(msg)
53
54
    def remove(self):
55
        return self.aserver_api.remove_dist(self, self.username, self.project,
56
                                        self.version, basename=self.notebook)
57
58
    @property
59
    def notebook_attrs(self):
60
        if self._thumbnail is not None:
61
            return {'thumbnail': data_uri_from(self._thumbnail)}
62
        else:
63
            return {}
64
65
    @property
66
    def project(self):
67
        if self._project is None:
68
            return re.sub('\-ipynb$', '', parameterize(os.path.basename(self.filepath)))
69
        else:
70
            return self._project
71
72
    @property
73
    def username(self):
74
        if self._username is None:
75
            self._username = self.aserver_api.user()['login']
76
        return self._username
77
78
    @property
79
    def version(self):
80
        if self._version is None:
81
            self._version = time.strftime('%Y.%m.%d.%H%M')
82
        return self._version
83
84
    @property
85
    def summary(self):
86
        if self._summary is None:
87
            self._summary = "IPython notebook"
88
        return self._summary
89
90
    @property
91
    def package(self):
92
        if self._package is None:
93
            try:
94
                self._package = self.aserver_api.package(self.username, self.project)
95
            except errors.NotFound:
96
                self._package = self.aserver_api.add_package(self.username, self.project,
97
                                                         summary=self.summary,
98
                                                         attrs=self.notebook_attrs)
99
        return self._package
100
101
    @property
102
    def release(self):
103
        if self._release is None:
104
            try:
105
                self._release = self.aserver_api.release(self.username, self.project, self.version)
106
            except errors.NotFound:
107
                self._release = self.aserver_api.add_release(self.username, self.project,
108
                                                         self.version, None, None, None)
109
        return self._release
110
111
    @property
112
    def files(self):
113
        return self.package['files']
114