GroupSpec   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 37
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 37
rs 10
wmc 12

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __repr__() 0 2 1
A __str__() 0 2 1
A org() 0 5 2
A group_name() 0 5 2
A member() 0 5 2
A __init__() 0 12 4
1
from six.moves.urllib.parse import urlparse
2
3
from binstar_client.errors import UserError
4
5
6
class PackageSpec(object):
7
    def __init__(self, user, package=None, version=None, basename=None, attrs=None, spec_str=None):
8
        self._user = user
9
        self._package = package
10
        self._version = version
11
        self._basename = basename
12
        self.attrs = attrs
13
        if spec_str:
14
            self.spec_str = spec_str
15
        else:
16
            spec_str = str(user)
17
            if package:
18
                spec_str = '%s/%s' % (spec_str, package)
19
            if version:
20
                spec_str = '%s/%s' % (spec_str, version)
21
            if basename:
22
                spec_str = '%s/%s' % (spec_str, basename)
23
            self.spec_str = spec_str
24
25
    def __str__(self):
26
        return self.spec_str
27
28
    def __repr__(self):
29
        return '<PackageSpec %r>' % (self.spec_str)
30
31
    @property
32
    def user(self):
33
        if self._user is None:
34
            raise UserError('user not given (got %r expected <username> )' % (self.spec_str,))
35
        return self._user
36
37
    @property
38
    def name(self):
39
        if self._package is None:
40
            raise UserError('package not given in spec (got %r expected <username>/<package> )' % (self.spec_str,))
41
        return self._package
42
43
    @property
44
    def package(self):
45
        if self._package is None:
46
            raise UserError('package not given in spec (got %r expected <username>/<package> )' % (self.spec_str,))
47
        return self._package
48
49
    @property
50
    def version(self):
51
        if self._version is None:
52
            raise UserError('version not given in spec (got %r expected <username>/<package>/<version> )' % (self.spec_str,))
53
        return self._version
54
55
    @property
56
    def basename(self):
57
        if self._basename is None:
58
            raise UserError('basename not given in spec (got %r expected <username>/<package>/<version>/<filename> )' % (self.spec_str,))
59
        return self._basename
60
61
62
def package_specs(spec):
63
    user = spec
64
    package = None
65
    attrs = {}
66
    if '/' in user:
67
        user, package = user.split('/', 1)
68
    if '/' in package:
69
        raise TypeError('invalid package spec')
70
71
    return PackageSpec(user, package, None, None, attrs, spec)
72
73
74
def parse_specs(spec):
75
    user = spec
76
    package = version = basename = None
77
    attrs = {}
78
    if '/' in user:
79
        user, package = user.split('/', 1)
80
    if package and '/' in package:
81
        package, version = package.split('/', 1)
82
83
    if version and '/' in version:
84
        version, basename = version.split('/', 1)
85
86
    if basename and '?' in basename:
87
        basename, qsl = basename.rsplit('?', 1)
88
        attrs = dict(urlparse.parse_qsl(qsl))
89
90
    return PackageSpec(user, package, version, basename, attrs, spec)
91
92
93
class GroupSpec(object):
94
    def __init__(self, org, group_name=None, member=None, spec_str=None):
95
        self._org = org
96
        self._group_name = group_name
97
        self._member = member
98
99
        if not spec_str:
100
            spec_str = str(org)
101
            if group_name:
102
                spec_str = '%s/%s' % (spec_str, group_name)
103
            if member:
104
                spec_str = '%s/%s' % (spec_str, member)
105
        self.spec_str = spec_str
106
107
    def __str__(self):
108
        return self.spec_str
109
110
    def __repr__(self):
111
        return '<GroupSpec %r>' % (self.spec_str)
112
113
    @property
114
    def org(self):
115
        if self._org is None:
116
            raise UserError('Organization not given (got %r expected <organization>)' % (self.spec_str,))
117
        return self._org
118
119
    @property
120
    def group_name(self):
121
        if self._group_name is None:
122
            raise UserError('Group name not given (got %r expected <organization>/<group_name>)' % (self.spec_str,))
123
        return self._group_name
124
125
    @property
126
    def member(self):
127
        if self._member is None:
128
            raise UserError('Member name not given (got %r expected <organization>/<group_name>/<member>)' % (self.spec_str,))
129
        return self._member
130
131
132
def group_spec(spec):
133
    '''<organization>/<group_name>/<member>'''
134
    org = spec
135
    group = member = None
136
    if '/' in org:
137
        org, group = org.split('/', 1)
138
    if group and '/' in group:
139
        group, member = group.split('/', 1)
140
    if member and '/' in member:
141
        raise UserError('Invalid group specification "%s" (unexpected "/" in %s)' % member)
142
143
    return GroupSpec(org, group, member, spec)
144