celerb 0.0.2 → 0.0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/Manifest.txt +1 -0
  2. data/README.rdoc +23 -0
  3. data/lib/celerb.rb +1 -1
  4. data/lib/uuid.rb +387 -0
  5. metadata +59 -31
@@ -6,6 +6,7 @@ lib/celerb.rb
6
6
  lib/celerb/task.rb
7
7
  lib/celerb/task_publisher.rb
8
8
  lib/celerb/result_consumer.rb
9
+ lib/uuid.rb
9
10
  test/test_celerb.rb
10
11
  test/test_helper.rb
11
12
  test/thumbTask.pb.rb
@@ -4,6 +4,29 @@ https://github.com/skrat/celerb
4
4
 
5
5
  Ruby client library for submitting task to celery queue.
6
6
 
7
+ == SYNOPSIS
8
+
9
+ class Add
10
+ include Celerb::Task
11
+ task_name 'tasks.conquer'
12
+
13
+ def initialize(a,b)
14
+ @a = a
15
+ @b = b
16
+ end
17
+
18
+ def to_celery
19
+ [@a,@b]
20
+ end
21
+ end
22
+
23
+ Add.new(7,6).delay.wait do |result|
24
+ puts "%s - 7 + 6 = %s" % [Time.now, result.body]
25
+ end
26
+
27
+ puts "%s - Not blocking..." % Time.now
28
+
29
+
7
30
  == LICENSE:
8
31
 
9
32
  (The GPL License)
@@ -7,7 +7,7 @@ require 'msgpack'
7
7
  require 'uuid'
8
8
 
9
9
  module Celerb
10
- VERSION = '0.0.2'
10
+ VERSION = '0.0.2.1'
11
11
  end
12
12
 
13
13
  require 'celerb/task'
@@ -0,0 +1,387 @@
1
+ #!/usr/bin/env ruby
2
+ ### http://mput.dip.jp/mput/uuid.txt
3
+
4
+ # Copyright(c) 2005 URABE, Shyouhei.
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this code, to deal in the code without restriction, including without
8
+ # limitation the rights to use, copy, modify, merge, publish, distribute,
9
+ # sublicense, and/or sell copies of the code, and to permit persons to whom the
10
+ # code is furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the code.
14
+ #
15
+ # THE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE CODE OR THE USE OR OTHER DEALINGS IN THE
21
+ # CODE.
22
+ #
23
+ # 2009-02-20: Modified by Pablo Lorenzoni <pablo@propus.com.br> to correctly
24
+ # include the version in the raw_bytes.
25
+
26
+
27
+ require 'digest/md5'
28
+ require 'digest/sha1'
29
+ require 'tmpdir'
30
+
31
+ # Pure ruby UUID generator, which is compatible with RFC4122
32
+ UUID = Struct.new :raw_bytes
33
+
34
+ class UUID
35
+ private_class_method :new
36
+
37
+ class << self
38
+ def mask19 v, str # :nodoc
39
+ nstr = str.bytes.to_a
40
+ version = [0, 16, 32, 48, 64, 80][v]
41
+ nstr[6] &= 0b00001111
42
+ nstr[6] |= version
43
+ # nstr[7] &= 0b00001111
44
+ # nstr[7] |= 0b01010000
45
+ nstr[8] &= 0b00111111
46
+ nstr[8] |= 0b10000000
47
+ str = ''
48
+ nstr.each { |s| str << s.chr }
49
+ str
50
+ end
51
+
52
+ def mask18 v, str # :nodoc
53
+ version = [0, 16, 32, 48, 64, 80][v]
54
+ str[6] &= 0b00001111
55
+ str[6] |= version
56
+ # str[7] &= 0b00001111
57
+ # str[7] |= 0b01010000
58
+ str[8] &= 0b00111111
59
+ str[8] |= 0b10000000
60
+ str
61
+ end
62
+
63
+ def mask v, str
64
+ if RUBY_VERSION >= "1.9.0"
65
+ return mask19 v, str
66
+ else
67
+ return mask18 v, str
68
+ end
69
+ end
70
+ private :mask, :mask18, :mask19
71
+
72
+ # UUID generation using SHA1. Recommended over create_md5.
73
+ # Namespace object is another UUID, some of them are pre-defined below.
74
+ def create_sha1 str, namespace
75
+ sha1 = Digest::SHA1.new
76
+ sha1.update namespace.raw_bytes
77
+ sha1.update str
78
+ sum = sha1.digest
79
+ raw = mask 5, sum[0..15]
80
+ ret = new raw
81
+ ret.freeze
82
+ ret
83
+ end
84
+ alias :create_v5 :create_sha1
85
+
86
+ # UUID generation using MD5 (for backward compat.)
87
+ def create_md5 str, namespace
88
+ md5 = Digest::MD5.new
89
+ md5.update namespace.raw_bytes
90
+ md5.update str
91
+ sum = md5.digest
92
+ raw = mask 3, sum[0..16]
93
+ ret = new raw
94
+ ret.freeze
95
+ ret
96
+ end
97
+ alias :create_v3 :create_md5
98
+
99
+ # UUID generation using random-number generator. From it's random
100
+ # nature, there's no warranty that the created ID is really universaly
101
+ # unique.
102
+ def create_random
103
+ rnd = [
104
+ rand(0x100000000),
105
+ rand(0x100000000),
106
+ rand(0x100000000),
107
+ rand(0x100000000),
108
+ ].pack "N4"
109
+ raw = mask 4, rnd
110
+ ret = new raw
111
+ ret.freeze
112
+ ret
113
+ end
114
+ alias :create_v4 :create_random
115
+
116
+ def read_state fp # :nodoc:
117
+ fp.rewind
118
+ Marshal.load fp.read
119
+ end
120
+
121
+ def write_state fp, c, m # :nodoc:
122
+ fp.rewind
123
+ str = Marshal.dump [c, m]
124
+ fp.write str
125
+ end
126
+
127
+ private :read_state, :write_state
128
+ STATE_FILE = 'ruby-uuid'
129
+
130
+ # create the "version 1" UUID with current system clock, current UTC
131
+ # timestamp, and the IEEE 802 address (so-called MAC address).
132
+ #
133
+ # Speed notice: it's slow. It writes some data into hard drive on every
134
+ # invokation. If you want to speed this up, try remounting tmpdir with a
135
+ # memory based filesystem (such as tmpfs). STILL slow? then no way but
136
+ # rewrite it with c :)
137
+ def create clock=nil, time=nil, mac_addr=nil
138
+ c = t = m = nil
139
+ Dir.chdir Dir.tmpdir do
140
+ unless FileTest.exist? STATE_FILE then
141
+ # Generate a pseudo MAC address because we have no pure-ruby way
142
+ # to know the MAC address of the NIC this system uses. Note
143
+ # that cheating with pseudo arresses here is completely legal:
144
+ # see Section 4.5 of RFC4122 for details.
145
+ sha1 = Digest::SHA1.new
146
+ 256.times do
147
+ r = [rand(0x100000000)].pack "N"
148
+ sha1.update r
149
+ end
150
+ str = sha1.digest
151
+ r = rand 14 # 20-6
152
+ node = str[r, 6] || str
153
+ if RUBY_VERSION >= "1.9.0"
154
+ nnode = node.bytes.to_a
155
+ nnode[0] |= 0x01
156
+ node = ''
157
+ nnode.each { |s| node << s.chr }
158
+ else
159
+ node[0] |= 0x01 # multicast bit
160
+ end
161
+ k = rand 0x40000
162
+ open STATE_FILE, 'w' do |fp|
163
+ fp.flock IO::LOCK_EX
164
+ write_state fp, k, node
165
+ fp.chmod 0o777 # must be world writable
166
+ end
167
+ end
168
+ open STATE_FILE, 'r+' do |fp|
169
+ fp.flock IO::LOCK_EX
170
+ c, m = read_state fp
171
+ c = clock % 0x4000 if clock
172
+ m = mac_addr if mac_addr
173
+ t = time
174
+ if t.nil? then
175
+ # UUID epoch is 1582/Oct/15
176
+ tt = Time.now
177
+ t = tt.to_i*10000000 + tt.tv_usec*10 + 0x01B21DD213814000
178
+ end
179
+ c = c.succ # important; increment here
180
+ write_state fp, c, m
181
+ end
182
+ end
183
+
184
+ tl = t & 0xFFFF_FFFF
185
+ tm = t >> 32
186
+ tm = tm & 0xFFFF
187
+ th = t >> 48
188
+ th = th & 0x0FFF
189
+ th = th | 0x1000
190
+ cl = c & 0xFF
191
+ ch = c & 0x3F00
192
+ ch = ch >> 8
193
+ ch = ch | 0x80
194
+ pack tl, tm, th, cl, ch, m
195
+ end
196
+ alias :create_v1 :create
197
+
198
+ # A simple GUID parser: just ignores unknown characters and convert
199
+ # hexadecimal dump into 16-octet object.
200
+ def parse obj
201
+ str = obj.to_s.sub %r/\Aurn:uuid:/, ''
202
+ str.gsub! %r/[^0-9A-Fa-f]/, ''
203
+ raw = str[0..31].lines.to_a.pack 'H*'
204
+ ret = new raw
205
+ ret.freeze
206
+ ret
207
+ end
208
+
209
+ # The 'primitive constructor' of this class
210
+ # Note UUID.pack(uuid.unpack) == uuid
211
+ def pack tl, tm, th, ch, cl, n
212
+ raw = [tl, tm, th, ch, cl, n].pack "NnnCCa6"
213
+ ret = new raw
214
+ ret.freeze
215
+ ret
216
+ end
217
+ end
218
+
219
+ # The 'primitive deconstructor', or the dual to pack.
220
+ # Note UUID.pack(uuid.unpack) == uuid
221
+ def unpack
222
+ raw_bytes.unpack "NnnCCa6"
223
+ end
224
+
225
+ # Generate the string representation (a.k.a GUID) of this UUID
226
+ def to_s
227
+ a = unpack
228
+ tmp = a[-1].unpack 'C*'
229
+ a[-1] = sprintf '%02x%02x%02x%02x%02x%02x', *tmp
230
+ "%08x-%04x-%04x-%02x%02x-%s" % a
231
+ end
232
+ alias guid to_s
233
+
234
+ # Convert into a RFC4122-comforming URN representation
235
+ def to_uri
236
+ "urn:uuid:" + self.to_s
237
+ end
238
+ alias urn to_uri
239
+
240
+ # Convert into 128-bit unsigned integer
241
+ # Typically a Bignum instance, but can be a Fixnum.
242
+ def to_int
243
+ tmp = self.raw_bytes.unpack "C*"
244
+ tmp.inject do |r, i|
245
+ r * 256 | i
246
+ end
247
+ end
248
+ alias to_i to_int
249
+
250
+ # Gets the version of this UUID
251
+ # returns nil if bad version
252
+ def version
253
+ a = unpack
254
+ v = (a[2] & 0xF000).to_s(16)[0].chr.to_i
255
+ return v if (1..5).include? v
256
+ return nil
257
+ end
258
+
259
+ # Two UUIDs are said to be equal if and only if their (byte-order
260
+ # canonicalized) integer representations are equivallent. Refer RFC4122 for
261
+ # details.
262
+ def == other
263
+ to_i == other.to_i
264
+ end
265
+
266
+ include Comparable
267
+ # UUIDs are comparable (don't know what benefits are there, though).
268
+ def <=> other
269
+ to_s <=> other.to_s
270
+ end
271
+
272
+ # Pre-defined UUID Namespaces described in RFC4122 Appendix C.
273
+ NameSpace_DNS = parse "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
274
+ NameSpace_URL = parse "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
275
+ NameSpace_OID = parse "6ba7b812-9dad-11d1-80b4-00c04fd430c8"
276
+ NameSpace_X500 = parse "6ba7b814-9dad-11d1-80b4-00c04fd430c8"
277
+
278
+ # The Nil UUID in RFC4122 Section 4.1.7
279
+ Nil = parse "00000000-0000-0000-0000-000000000000"
280
+ end
281
+
282
+ __END__
283
+ if __FILE__ == $0 then
284
+ require 'test/unit'
285
+
286
+ class TC_UUID < Test::Unit::TestCase
287
+ def test_v1
288
+ u1 = UUID.create
289
+ u2 = UUID.create
290
+ assert_not_equal u1, u2
291
+ end
292
+
293
+ def test_v1_repeatability
294
+ u1 = UUID.create 1, 2, "345678"
295
+ u2 = UUID.create 1, 2, "345678"
296
+ assert_equal u1, u2
297
+ end
298
+
299
+ def test_v3
300
+ u1 = UUID.create_md5 "foo", UUID::NameSpace_DNS
301
+ u2 = UUID.create_md5 "foo", UUID::NameSpace_DNS
302
+ u3 = UUID.create_md5 "foo", UUID::NameSpace_URL
303
+ assert_equal u1, u2
304
+ assert_not_equal u1, u3
305
+ end
306
+
307
+ def test_v5
308
+ u1 = UUID.create_sha1 "foo", UUID::NameSpace_DNS
309
+ u2 = UUID.create_sha1 "foo", UUID::NameSpace_DNS
310
+ u3 = UUID.create_sha1 "foo", UUID::NameSpace_URL
311
+ assert_equal u1, u2
312
+ assert_not_equal u1, u3
313
+ end
314
+
315
+ def test_v4
316
+ # This test is not perfect, because the random nature of version 4
317
+ # UUID it is not always true that the three objects below really
318
+ # differ. But in real life it's enough to say we're OK when this
319
+ # passes.
320
+ u1 = UUID.create_random
321
+ u2 = UUID.create_random
322
+ u3 = UUID.create_random
323
+ assert_not_equal u1.raw_bytes, u2.raw_bytes
324
+ assert_not_equal u1.raw_bytes, u3.raw_bytes
325
+ assert_not_equal u2.raw_bytes, u3.raw_bytes
326
+ end
327
+
328
+ def test_pack
329
+ u1 = UUID.pack 0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4,
330
+ "\000\300O\3240\310"
331
+ assert_equal UUID::NameSpace_DNS, u1
332
+ end
333
+
334
+ def test_unpack
335
+ tl, tm, th, cl, ch, m = UUID::NameSpace_DNS.unpack
336
+ assert_equal 0x6ba7b810, tl
337
+ assert_equal 0x9dad, tm
338
+ assert_equal 0x11d1, th
339
+ assert_equal 0x80, cl
340
+ assert_equal 0xb4, ch
341
+ assert_equal "\000\300O\3240\310", m
342
+ end
343
+
344
+ def test_parse
345
+ u1 = UUID.pack 0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4,
346
+ "\000\300O\3240\310"
347
+ u2 = UUID.parse "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
348
+ u3 = UUID.parse "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8"
349
+ assert_equal u1, u2
350
+ assert_equal u1, u3
351
+ end
352
+
353
+ def test_to_s
354
+ u1 = UUID.parse "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
355
+ assert_equal "6ba7b810-9dad-11d1-80b4-00c04fd430c8", u1.to_s
356
+ end
357
+
358
+ def test_to_i
359
+ u1 = UUID.parse "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
360
+ assert_equal 0x6ba7b8109dad11d180b400c04fd430c8, u1.to_i
361
+ end
362
+
363
+ def test_version
364
+ u1 = UUID.create_v1
365
+ assert_equal 1, u1.version
366
+ u3 = UUID.create_v3 "foo", UUID::NameSpace_DNS
367
+ assert_equal 3, u3.version
368
+ u4 = UUID.create_v4
369
+ assert_equal 4, u4.version
370
+ u5 = UUID.create_v5 "foo", UUID::NameSpace_DNS
371
+ assert_equal 5, u5.version
372
+ end
373
+ end
374
+ end
375
+
376
+
377
+
378
+ # Local Variables:
379
+ # mode: ruby
380
+ # code: utf-8
381
+ # indent-tabs-mode: t
382
+ # tab-width: 3
383
+ # ruby-indent-level: 3
384
+ # fill-column: 79
385
+ # default-justification: full
386
+ # End:
387
+ # vi: ts=3 sw=3
metadata CHANGED
@@ -1,7 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: celerb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ hash: 69
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ - 1
11
+ version: 0.0.2.1
5
12
  platform: ruby
6
13
  authors:
7
14
  - Dusan Maliarik
@@ -14,54 +21,68 @@ default_executable:
14
21
  dependencies:
15
22
  - !ruby/object:Gem::Dependency
16
23
  name: amqp
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
20
27
  requirements:
21
28
  - - "="
22
29
  - !ruby/object:Gem::Version
30
+ hash: 9
31
+ segments:
32
+ - 0
33
+ - 6
34
+ - 7
23
35
  version: 0.6.7
24
- version:
36
+ type: :runtime
37
+ version_requirements: *id001
25
38
  - !ruby/object:Gem::Dependency
26
39
  name: msgpack
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
30
43
  requirements:
31
44
  - - "="
32
45
  - !ruby/object:Gem::Version
46
+ hash: 9
47
+ segments:
48
+ - 0
49
+ - 4
50
+ - 3
33
51
  version: 0.4.3
34
- version:
52
+ type: :runtime
53
+ version_requirements: *id002
35
54
  - !ruby/object:Gem::Dependency
36
55
  name: rubyforge
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
40
59
  requirements:
41
60
  - - ">="
42
61
  - !ruby/object:Gem::Version
43
- version: 2.0.3
44
- version:
45
- - !ruby/object:Gem::Dependency
46
- name: gemcutter
62
+ hash: 7
63
+ segments:
64
+ - 2
65
+ - 0
66
+ - 4
67
+ version: 2.0.4
47
68
  type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- version: 0.3.0
54
- version:
69
+ version_requirements: *id003
55
70
  - !ruby/object:Gem::Dependency
56
71
  name: hoe
57
- type: :development
58
- version_requirement:
59
- version_requirements: !ruby/object:Gem::Requirement
72
+ prerelease: false
73
+ requirement: &id004 !ruby/object:Gem::Requirement
74
+ none: false
60
75
  requirements:
61
76
  - - ">="
62
77
  - !ruby/object:Gem::Version
63
- version: 2.5.0
64
- version:
78
+ hash: 19
79
+ segments:
80
+ - 2
81
+ - 6
82
+ - 2
83
+ version: 2.6.2
84
+ type: :development
85
+ version_requirements: *id004
65
86
  description: ""
66
87
  email:
67
88
  - dusan.maliarik@gmail.com
@@ -81,6 +102,7 @@ files:
81
102
  - lib/celerb/task.rb
82
103
  - lib/celerb/task_publisher.rb
83
104
  - lib/celerb/result_consumer.rb
105
+ - lib/uuid.rb
84
106
  - test/test_celerb.rb
85
107
  - test/test_helper.rb
86
108
  - test/thumbTask.pb.rb
@@ -97,21 +119,27 @@ rdoc_options:
97
119
  require_paths:
98
120
  - lib
99
121
  required_ruby_version: !ruby/object:Gem::Requirement
122
+ none: false
100
123
  requirements:
101
124
  - - ">="
102
125
  - !ruby/object:Gem::Version
126
+ hash: 3
127
+ segments:
128
+ - 0
103
129
  version: "0"
104
- version:
105
130
  required_rubygems_version: !ruby/object:Gem::Requirement
131
+ none: false
106
132
  requirements:
107
133
  - - ">="
108
134
  - !ruby/object:Gem::Version
135
+ hash: 3
136
+ segments:
137
+ - 0
109
138
  version: "0"
110
- version:
111
139
  requirements: []
112
140
 
113
141
  rubyforge_project: celerb
114
- rubygems_version: 1.3.5
142
+ rubygems_version: 1.3.7
115
143
  signing_key:
116
144
  specification_version: 3
117
145
  summary: ""