josh-gmail-backup 0.104

Sign up to get free protection for your applications and to get access to all the features.
data/svc/utils.py ADDED
@@ -0,0 +1,261 @@
1
+ # Copyright (C) 2008 Jan Svec and Filip Jurcicek
2
+ #
3
+ # YOU USE THIS TOOL ON YOUR OWN RISK!
4
+ #
5
+ # email: info@gmail-backup.com
6
+ #
7
+ #
8
+ # Disclaimer of Warranty
9
+ # ----------------------
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, licensor provides
12
+ # this tool (and each contributor provides its contributions) on an "AS IS"
13
+ # BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14
+ # implied, including, without limitation, any warranties or conditions of
15
+ # TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR
16
+ # PURPOSE. You are solely responsible for determining the appropriateness of
17
+ # using this work and assume any risks associated with your exercise of
18
+ # permissions under this license.
19
+
20
+ import sys
21
+ import codecs
22
+ from types import StringTypes
23
+ from inspect import isroutine
24
+
25
+ class sym(object):
26
+ def __init__(self, s):
27
+ self.__s = s
28
+
29
+ def __hash__(self):
30
+ return hash(self.__s)
31
+
32
+ def __eq__(self, other):
33
+ return self.__s == other
34
+
35
+ def __str__(self):
36
+ return str(self.__s)
37
+
38
+ def __repr__(self):
39
+ return str(self.__s)
40
+
41
+ def isstr(obj):
42
+ """Return True if `obj` is string (Unicode or 8-bit)
43
+
44
+ :RType: bool
45
+ """
46
+ return isinstance(obj, StringTypes)
47
+
48
+ def issequence(obj):
49
+ """Return True if `obj` is sequence, but not string
50
+
51
+ :RType: bool
52
+ """
53
+ if isstr(obj):
54
+ return False
55
+ else:
56
+ try:
57
+ len(obj)
58
+ return True
59
+ except TypeError:
60
+ return False
61
+
62
+ def partial(fn, *cargs, **ckwargs):
63
+ def partial_fn(*fargs, **fkwargs):
64
+ d = ckwargs.copy()
65
+ d.update(fkwargs)
66
+ return fn(*(cargs + fargs), **d)
67
+ return partial_fn
68
+
69
+ def strnumber(obj):
70
+ """Return string representation of `obj`.
71
+
72
+ If `obj` is float representing integer number (eg. 2.0), it will return
73
+ integer number (eg. '2'). Otherwise `obj` is converted into string using
74
+ ``str(obj)``.
75
+
76
+ :RType: str
77
+ """
78
+ try:
79
+ if int(obj) == float(obj):
80
+ obj = int(obj)
81
+ except (ValueError, TypeError):
82
+ pass
83
+ return str(obj)
84
+
85
+ def strcomma(seq, comma=', '):
86
+ """Return string representation of sequence `seq`
87
+
88
+ Objects of sequence are converted into strings using ``str(obj)``.
89
+ Resulting sequence is then joint using `comma` string. If `comma` is not
90
+ supplied, ', ' will be used.
91
+
92
+ :RType: str
93
+ """
94
+ return comma.join(str(o) for o in seq)
95
+
96
+ def cartezian(*vectors):
97
+ """Compute Cartesian product of passed arguments
98
+ """
99
+ ret = ret_old = [(v,) for v in vectors[0]]
100
+ for vec in vectors[1:]:
101
+ ret = []
102
+ for v in vec:
103
+ for r in ret_old:
104
+ ret.append(r+(v,))
105
+ ret_old = ret
106
+ return ret
107
+
108
+ def iterslice(sl, length=None):
109
+ """Return xrange() created from slice object `sl`
110
+ """
111
+ if sl.start is None:
112
+ start = 0
113
+ else:
114
+ start = sl.start
115
+ if sl.stop is None:
116
+ if length is None:
117
+ raise ValueError("If slice.stop is None, you must supply length arg.")
118
+ else:
119
+ stop = length
120
+ else:
121
+ stop = sl.stop
122
+ if sl.step is None:
123
+ step = 1
124
+ else:
125
+ step = sl.step
126
+ return xrange(start, stop, step)
127
+
128
+ def seqIntoDict(seq, format):
129
+ _posOptsDict = {}
130
+ _negativeAfter = sys.maxint
131
+ have_ellipsis = False
132
+ i = 0
133
+ if format.count(Ellipsis) > 1:
134
+ raise ValueError("Ellipsis must be used only once")
135
+ while i < len(format):
136
+ opt_name = format[i]
137
+ if opt_name == Ellipsis:
138
+ have_ellipsis = True
139
+ if i == 0:
140
+ raise ValueError("Ellipsis must be after option name")
141
+ j = -1
142
+ while True:
143
+ opt_name = format[j]
144
+ if opt_name == Ellipsis:
145
+ break
146
+ _posOptsDict[opt_name] = j
147
+ j -= 1
148
+ if j+1 == 0:
149
+ # slice [i-1:] != [i-1:0]
150
+ _posOptsDict[format[i-1]] = slice(i-1, None)
151
+ else:
152
+ # slice [i-1:j+1]
153
+ _posOptsDict[format[i-1]] = slice(i-1, j+1)
154
+ # Negative indices can be used if there was enough arguments to
155
+ # fill options preceding Ellipsis
156
+ _negativeAfter = len(_posOptsDict)-1
157
+ break
158
+ _posOptsDict[opt_name] = i
159
+ i += 1
160
+
161
+ # Is there enough positional arguments to use negative indices?
162
+ use_negative = ( len(seq) >= _negativeAfter )
163
+ ret = {}
164
+
165
+ for opt_name, getter in _posOptsDict.iteritems():
166
+ try:
167
+ if not isinstance(getter, slice):
168
+ # Skip negative indices if there wasn't enough positional
169
+ # arguments
170
+ if getter < 0 and not use_negative:
171
+ continue
172
+ value = seq[getter]
173
+ if not isinstance(getter, slice):
174
+ ret[opt_name] = value
175
+ elif value:
176
+ ret[opt_name] = value
177
+ except IndexError:
178
+ # Option is not specified
179
+ pass
180
+ return ret
181
+
182
+ def linspace(start, stop, count):
183
+ if stop < 0:
184
+ (start, stop) = (start+stop, start-stop)
185
+ step = (stop - start) / float(count-1)
186
+ return [start+i*step for i in range(count)]
187
+
188
+ def linrange(start, stop, step):
189
+ if stop < 0:
190
+ (start, stop) = (start+stop, start-stop)
191
+ count = int(round((stop - start) / step) + 1)
192
+ return [start+i*step for i in range(count)]
193
+
194
+ unique_value = ['unique_value']
195
+
196
+ def all_same(seq, default=unique_value):
197
+ for i in seq:
198
+ if default is unique_value:
199
+ default = i
200
+ if i != default:
201
+ return False
202
+ else:
203
+ return True
204
+
205
+ def _defaultZero():
206
+ return 0
207
+
208
+ class ADict(dict):
209
+ 'Accumulator dictionary'
210
+ def __init__(self, source={}, default=_defaultZero, **kwargs):
211
+ super(ADict, self).__init__(source, **kwargs)
212
+ self._default = default
213
+
214
+ def __getitem__(self, key):
215
+ if key not in self:
216
+ ret = self._default()
217
+ try:
218
+ hash(ret)
219
+ except TypeError:
220
+ # Store it
221
+ self[key] = ret
222
+ return ret
223
+ else:
224
+ return super(ADict, self).__getitem__(key)
225
+
226
+ def __add__(self, other):
227
+ new = self.__class__(self)
228
+ for key, value in other.iteritems():
229
+ new[key] += value
230
+ return new
231
+
232
+ def sum(self):
233
+ return sum(self.values())
234
+
235
+ def writeToFile(self, fn, key=None, format='%d', encoding='utf-8'):
236
+ fw = codecs.open(fn, 'w', encoding)
237
+ try:
238
+ for key, count in sorted(self.iteritems(), key=key):
239
+ if not issequence(key):
240
+ key = [key]
241
+ string = u'\t'.join(unicode(i) for i in key)
242
+ value = format % count
243
+ fw.write('%s\t%s\n' % (string, value))
244
+ finally:
245
+ fw.close()
246
+
247
+ @classmethod
248
+ def readFromFile(cls, fn, format=int, encoding='utf-8'):
249
+ fr = codecs.open(fn, 'r', encoding)
250
+ try:
251
+ new = cls()
252
+ for line in fr:
253
+ items = line.split()
254
+ value = format(items[-1])
255
+ key = tuple(items[:-1])
256
+ new[key] += value
257
+ return new
258
+ finally:
259
+ fr.close()
260
+
261
+
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: josh-gmail-backup
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.104"
5
+ platform: ruby
6
+ authors:
7
+ - "Jan \xC5\xA0vec"
8
+ - "Filip Jur\xC4\x8D\xC3\xAD\xC4\x8Dek"
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2008-10-15 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description:
18
+ email: info@gmail-backup.com
19
+ executables:
20
+ - gmail-backup
21
+ - gmail-backup-gui
22
+ extensions: []
23
+
24
+ extra_rdoc_files: []
25
+
26
+ files:
27
+ - gmail-backup-gui.pyo
28
+ - gmail-backup-gui.sh
29
+ - gmail-backup.gemspec
30
+ - gmail-backup.pyo
31
+ - gmail-backup.sh
32
+ - gmb.gif
33
+ - gmb.ico
34
+ - gmb.pyo
35
+ - svc/__init__.py
36
+ - svc/egg.py
37
+ - svc/LICENSE.TXT
38
+ - svc/map.py
39
+ - svc/osutils.py
40
+ - svc/registry.py
41
+ - svc/retrans.py
42
+ - svc/scripting
43
+ - svc/scripting/__init__.py
44
+ - svc/scripting/conversions.py
45
+ - svc/scripting/externals.py
46
+ - svc/scripting/extractors.py
47
+ - svc/scripting/help.py
48
+ - svc/template.py
49
+ - svc/utils.py
50
+ has_rdoc: false
51
+ homepage: http://www.gmail-backup.com/
52
+ post_install_message:
53
+ rdoc_options: []
54
+
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.2.0
73
+ signing_key:
74
+ specification_version: 2
75
+ summary: The ultimate one-click solution for doing backups of your GMail account
76
+ test_files: []
77
+