CondaProject   A
last analyzed

Complexity

Total Complexity 20

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 84
rs 10
c 0
b 0
f 0
wmc 20

11 Methods

Rating   Name   Duplication   Size   Complexity  
A size() 0 8 2
A tar_it() 0 7 3
A get_file_count() 0 5 2
A configuration() 0 8 1
A tar() 0 5 2
A basename() 0 3 1
A to_stage() 0 4 1
A name() 0 5 2
A to_project_creation() 0 7 1
A __init__() 0 12 3
A _get_project_name() 0 5 2
1
import inspect
2
import os
3
import tarfile
4
from tempfile import SpooledTemporaryFile
5
from binstar_client.errors import BinstarError
6
7
8
class CondaProject(object):
9
    # TODO: This class will be moved into Anaconda-Project
10
    def __init__(self, project_path, *args, **kwargs):
11
        self.project_path = project_path
12
        self._name = None
13
        self._tar = None
14
        self._size = None
15
        self.pfiles = []
16
        self.metadata = {
17
            'summary': kwargs.get('summary', None),
18
            'description': kwargs.get('description', None),
19
            'version': kwargs.get('version', None)
20
        }
21
        self.metadata = dict((k, v) for k, v in self.metadata.items() if v)
22
23
    def tar_it(self, fd=SpooledTemporaryFile()):
24
        with tarfile.open(mode='w', fileobj=fd) as tar:
25
            for pfile in self.pfiles:
26
                tar.add(pfile.fullpath, arcname=pfile.relativepath)
27
        fd.seek(0)
28
        self._tar = fd
29
        return fd
30
31
    def to_project_creation(self):
32
        return {
33
            'name': self.name,
34
            'access': 'public',
35
            'profile': {
36
                'description': self.metadata.get('description', ''),
37
                'summary': self.metadata.get('summary', ''),
38
            }
39
        }
40
41
    def to_stage(self):
42
        return {
43
            'basename': self.basename,
44
            'configuration': self.configuration,
45
        }
46
47
    @property
48
    def tar(self):
49
        if self._tar is None:
50
            self.tar_it()
51
        return self._tar
52
53
    @property
54
    def configuration(self):
55
        output = self.metadata.get('configuration', {})
56
        output.update({
57
            'size': self.size,
58
            'num_of_files': self.get_file_count()
59
        })
60
        return output
61
62
    def get_file_count(self):
63
        if os.path.isfile(self.project_path):
64
            return 1
65
        else:
66
            return len(self.pfiles)
67
68
    @property
69
    def basename(self):
70
        return "{}.tar".format(self.name)
71
72
    @property
73
    def size(self):
74
        if self._size is None:
75
            spos = self._tar.tell()
76
            self._tar.seek(0, os.SEEK_END)
77
            self._size = self._tar.tell() - spos
78
            self._tar.seek(spos)
79
        return self._size
80
81
    @property
82
    def name(self):
83
        if self._name is None:
84
            self._name = self._get_project_name()
85
        return self._name
86
87
    def _get_project_name(self):
88
        if os.path.isdir(self.project_path):
89
            return os.path.basename(os.path.abspath(self.project_path))
90
        else:
91
            return os.path.splitext(os.path.basename(self.project_path))[0]
92
93
94
class PFile(object):
95
    def __init__(self, **kwargs):
96
        self.fullpath = kwargs.get('fullpath', None)
97
        self.basename = kwargs.get('basename', None)
98
        self.relativepath = kwargs.get('relativepath', None)
99
        self.size = kwargs.get('size', None)
100
        self.populate()
101
102
    def __str__(self):
103
        if self.is_dir():
104
            return self.relativepath
105
        else:
106
            return "[{}] {}".format(self.size, self.relativepath)
107
108
    def __repr__(self):
109
        return self.__str__()
110
111
    def __eq__(self, other):
112
        return self.fullpath == other.fullpath
113
114
    def is_dir(self):
115
        return os.path.isdir(self.fullpath)
116
117
    def validate(self, validator):
118
        if inspect.isfunction(validator):
119
            return validator(basename=self.basename,
120
                             relativepath=self.relativepath,
121
                             fullpath=self.fullpath)
122
        elif inspect.isclass(validator):
123
            return validator(self)()
124
        raise BinstarError("Invalid validator {}".format(validator))
125
126
    def populate(self):
127
        if self.size is None:
128
            self.size = os.stat(self.fullpath).st_size
129
        if self.basename is None:
130
            self.basename = os.path.basename(self.fullpath)
131
132
    def to_dict(self):
133
        return {
134
            'basename': self.basename,
135
            'size': self.size,
136
            'relativepath': self.relativepath
137
        }
138