ipc_transit 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/bin/transitd CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'net/http'
3
4
  require 'uri'
4
5
  require 'ipc_transit'
data/bin/trlist CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'ipc_transit'
3
4
 
4
5
 
data/bin/trrecv CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'ipc_transit'
3
4
  require 'json'
4
5
 
@@ -10,6 +11,6 @@ nowait = ARGV[1]
10
11
  #puts message
11
12
 
12
13
  while ret = IPCTransit.receive('qname' => qname, 'nowait' => 1)
13
- puts ret
14
+ puts JSON.pretty_generate(ret)
14
15
  end
15
16
 
data/bin/trsend CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'ipc_transit'
3
4
  require 'json'
4
5
 
data/bin/trserver CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ require 'rubygems'
2
3
  require 'webrick'
3
4
  require 'ipc_transit'
4
5
 
@@ -0,0 +1,33 @@
1
+ require 'zlib'
2
+
3
+ def transit_deflate(args)
4
+ if args['c'].nil?
5
+ compression_type = 'none'
6
+ else
7
+ compression_type = args['c']
8
+ end
9
+ case compression_type
10
+ when 'none'
11
+ return args['frozen']
12
+ when 'zlib'
13
+ return Zlib::deflate(args['frozen'])
14
+ end
15
+ end
16
+
17
+ def transit_inflate(args)
18
+ if args['wire_headers'].nil?
19
+ compression_type = 'none'
20
+ else
21
+ if args['wire_headers']['c'].nil?
22
+ compression_type = 'none'
23
+ else
24
+ compression_type = args['wire_headers']['c']
25
+ end
26
+ end
27
+ case compression_type
28
+ when 'none'
29
+ return args['serialized_message']
30
+ when 'zlib'
31
+ return Zlib::inflate(args['serialized_message'])
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ require 'rubygems'
2
+ require 'json'
3
+ require 'yaml'
4
+ require 'ipc_transit/compress'
5
+
6
+ def transit_freeze(args)
7
+ if args['e'].nil?
8
+ serialize_type = 'json'
9
+ else
10
+ serialize_type = args['e']
11
+ end
12
+ case serialize_type
13
+ when 'json'
14
+ args['frozen'] = args['message'].to_json
15
+ when 'yaml'
16
+ args['frozen'] = YAML.dump(args['message'])
17
+ end
18
+ return transit_deflate(args)
19
+ end
20
+
21
+ def transit_thaw(args)
22
+ if args['wire_headers'].nil?
23
+ serialize_type = 'json'
24
+ else
25
+ if args['wire_headers']['e'].nil?
26
+ serialize_type = 'json'
27
+ else
28
+ serialize_type = args['wire_headers']['e']
29
+ end
30
+ end
31
+ begin
32
+ inflated = transit_inflate(args)
33
+ rescue Exception => msg
34
+ puts "transit_thaw exception: #{e}"
35
+ end
36
+ case serialize_type
37
+ when 'json'
38
+ args['thawed'] = JSON.parse(inflated)
39
+ when 'yaml'
40
+ args['thawed'] = YAML.load(inflated)
41
+ end
42
+ return args['thawed']
43
+ end
44
+
@@ -0,0 +1,21 @@
1
+ #kind of ghetto, but I don't have a better way right now
2
+ def drain_test_queue
3
+ begin
4
+ while ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
5
+ end
6
+ rescue Exception => msg
7
+ end
8
+ end
9
+
10
+ def run_daemon(prog)
11
+ pid = fork
12
+ if pid.nil? #child
13
+ exec "bin/#{prog}"
14
+ exit
15
+ end
16
+ return pid
17
+ end
18
+ def kill_daemon(pid)
19
+ Process.kill(9, pid)
20
+ end
21
+
data/lib/ipc_transit.rb CHANGED
@@ -1,6 +1,8 @@
1
- require 'json'
1
+ require 'rubygems'
2
2
  require 'SysVIPC'
3
3
  include SysVIPC
4
+ require 'ipc_transit/serialize'
5
+
4
6
 
5
7
  ##
6
8
  # Fast, brokerless message queueing
@@ -89,7 +91,7 @@ class IPCTransit
89
91
  self.unpack_data(args)
90
92
  #at this point I need to see if this is a remote transit
91
93
  #if it is, then do not thaw the message proper
92
- args['message'] = self.transit_thaw(args)
94
+ args['message'] = transit_thaw(args)
93
95
  rescue Exception => msg
94
96
  # puts "Exception: #{msg}"
95
97
  # need to do something smarter with this
@@ -184,7 +186,8 @@ class IPCTransit
184
186
  end
185
187
  begin
186
188
  self.lock_dir()
187
- file = File.open("/tmp/transit/#{qname}", 'w')
189
+ File.umask(0000)
190
+ file = File.open("/tmp/transit/#{qname}", 'w', 0666)
188
191
  new_qid = get_next_id
189
192
  file.puts("qid=#{new_qid}")
190
193
  file.puts("qname=#{qname}")
@@ -199,6 +202,7 @@ class IPCTransit
199
202
  end
200
203
 
201
204
  def self.lock_dir()
205
+ File.umask(0000)
202
206
  File.open('/tmp/transit.lock', File::WRONLY|File::EXCL|File::CREAT, 0666)
203
207
  end
204
208
  def self.unlock_dir()
@@ -209,7 +213,7 @@ class IPCTransit
209
213
  self.mk_queue_dir()
210
214
  Dir.glob('/tmp/transit/*').each do |filename|
211
215
  info = {}
212
- file = File.new(filename, 'r')
216
+ file = File.new(filename, 'r', 0666)
213
217
  while (line = file.gets)
214
218
  line.chomp!
215
219
  (key, value) = line.split('=')
@@ -234,16 +238,6 @@ class IPCTransit
234
238
  end
235
239
 
236
240
 
237
- def self.transit_freeze(args)
238
- return args['message'].to_json
239
- end
240
-
241
- def self.transit_thaw(args)
242
- return JSON.parse(args['serialized_message'])
243
- end
244
-
245
-
246
-
247
241
  #returns a scalar, ready to be sent on the wire
248
242
  #it takes message and wire_meta_data
249
243
  def self.pack_message(args)
@@ -253,7 +247,7 @@ class IPCTransit
253
247
  next if @@ipc_transit_std_args[k]
254
248
  args['message']['.ipc_transit_meta'][k] = args[k]
255
249
  end
256
- args['serialized_message'] = self.transit_freeze(args)
250
+ args['serialized_message'] = transit_freeze(args)
257
251
  self.serialize_wire_meta(args)
258
252
  l = args['serialized_wire_meta_data'].length
259
253
  args['serialized_wire_data'] = "#{l}:#{args['serialized_wire_meta_data']}#{args['serialized_message']}"
@@ -1,28 +1,15 @@
1
1
  require 'test/unit'
2
2
  require 'ipc_transit'
3
+ require 'ipc_transit/test'
3
4
 
4
- #kind of ghetto, but I don't have a better way right now
5
- def drain_test_queue
6
- begin
7
- while ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
5
+ class TestIPCTransit < Test::Unit::TestCase
6
+ def teardown
7
+ if not @transitd_pid.nil?
8
+ kill_daemon(@transitd_pid)
9
+ kill_daemon(@trserver_pid)
8
10
  end
9
- rescue Exception => msg
10
11
  end
11
- end
12
12
 
13
- def run_daemon(prog)
14
- pid = fork
15
- if pid.nil? #child
16
- exec "bin/#{prog}"
17
- exit
18
- end
19
- return pid
20
- end
21
- def kill_daemon(pid)
22
- Process.kill(9, pid)
23
- end
24
-
25
- class TestIPCTransit < Test::Unit::TestCase
26
13
  def test_basic_remote
27
14
  drain_test_queue()
28
15
  IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'd' => '127.0.0.1')
@@ -34,18 +21,17 @@ class TestIPCTransit < Test::Unit::TestCase
34
21
  def test_full_remote
35
22
  drain_test_queue()
36
23
  begin
37
- trserver_pid = run_daemon('trserver')
38
- transitd_pid = run_daemon('transitd')
39
- sleep 1
24
+ @trserver_pid = run_daemon('trserver')
25
+ @transitd_pid = run_daemon('transitd')
26
+ sleep 2
40
27
  IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'd' => '127.0.0.1')
28
+ sleep 2
41
29
  ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
42
- assert(ret, 'IPCTransit.receive returned true')
43
- assert_equal(ret['foo'], 'bar')
44
30
  rescue Exception => msg
45
31
  puts "Exception: #{msg}"
46
32
  end
47
- kill_daemon(transitd_pid)
48
- kill_daemon(trserver_pid)
33
+ assert(ret, 'IPCTransit.receive returned true')
34
+ assert_equal(ret['foo'], 'bar')
49
35
  end
50
36
  end
51
37
 
@@ -1,14 +1,6 @@
1
1
  require 'test/unit'
2
2
  require 'ipc_transit'
3
-
4
- #kind of ghetto, but I don't have a better way right now
5
- def drain_test_queue
6
- begin
7
- while ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
8
- end
9
- rescue Exception => msg
10
- end
11
- end
3
+ require 'ipc_transit/test'
12
4
 
13
5
  class TestIPCTransit < Test::Unit::TestCase
14
6
  def test_typical
@@ -36,7 +28,7 @@ class TestIPCTransit < Test::Unit::TestCase
36
28
  'c' => 'none',
37
29
  'something' => 'else',
38
30
  'x' => { 'this' => 'that' },
39
- 'once' => ['more',2],
31
+ 'once' => ['more',2]
40
32
  )
41
33
  ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
42
34
  assert(ret, 'IPCTransit.receive returned true')
@@ -0,0 +1,43 @@
1
+ require 'test/unit'
2
+ require 'ipc_transit'
3
+ require 'ipc_transit/test'
4
+
5
+ class TestIPCTransit < Test::Unit::TestCase
6
+ def test_yaml_typical
7
+ drain_test_queue()
8
+ IPCTransit.send('message' => { 'foo' => 'bar' }, 'e' => 'yaml', 'qname' => 'test_qname')
9
+ ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
10
+ assert(ret, 'IPCTransit.receive returned true')
11
+ assert_equal(ret['foo'], 'bar')
12
+ end
13
+
14
+ def test_yaml_wire_raw
15
+ drain_test_queue()
16
+ IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'e' => 'yaml', 'c' => 'none')
17
+ ret = IPCTransit.receive('qname' => 'test_qname', 'raw' => 1, 'nowait' => 1)
18
+ assert(ret, 'IPCTransit.receive returned true')
19
+ assert(ret['serialized_message'] =~ /^---/, 'data verified as YAML')
20
+ assert_equal(ret['message']['foo'], 'bar')
21
+ assert_equal(ret['wire_headers']['e'], 'yaml')
22
+ assert_equal(ret['wire_headers']['c'], 'none')
23
+ end
24
+ def test_yaml_message_meta
25
+ drain_test_queue()
26
+ IPCTransit.send( 'qname' => 'test_qname',
27
+ 'message' => { 'foo' => 'bar' },
28
+ 'e' => 'json',
29
+ 'c' => 'none',
30
+ 'something' => 'else',
31
+ 'x' => { 'this' => 'that' },
32
+ 'once' => ['more',2]
33
+ )
34
+ ret = IPCTransit.receive('qname' => 'test_qname', 'e' => 'yaml', 'nowait' => 1)
35
+ assert(ret, 'IPCTransit.receive returned true')
36
+ assert_equal(ret['foo'], 'bar')
37
+ assert_equal(ret['.ipc_transit_meta']['something'], 'else')
38
+ assert_equal(ret['.ipc_transit_meta']['x']['this'], 'that')
39
+ assert_equal(ret['.ipc_transit_meta']['once'][0], 'more')
40
+ assert_equal(ret['.ipc_transit_meta']['once'][1], 2)
41
+ end
42
+ end
43
+
@@ -0,0 +1,41 @@
1
+ require 'test/unit'
2
+ require 'ipc_transit'
3
+ require 'ipc_transit/test'
4
+
5
+ class TestIPCTransit < Test::Unit::TestCase
6
+ def test_zlib_typical
7
+ drain_test_queue()
8
+ IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'c' => 'zlib', 'e' => 'json')
9
+ ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
10
+ assert(ret, 'IPCTransit.receive returned true')
11
+ assert_equal(ret['foo'], 'bar')
12
+ end
13
+
14
+ def test_zlib_wire_raw
15
+ drain_test_queue()
16
+ IPCTransit.send('message' => { 'foo' => 'bar' }, 'qname' => 'test_qname', 'c' => 'zlib')
17
+ ret = IPCTransit.receive('qname' => 'test_qname', 'raw' => 1, 'nowait' => 1)
18
+ assert(ret, 'IPCTransit.receive returned true')
19
+ assert_equal(ret['message']['foo'], 'bar')
20
+ assert_equal(ret['wire_headers']['c'], 'zlib')
21
+ end
22
+ def test_zlib_message_meta
23
+ drain_test_queue()
24
+ IPCTransit.send( 'qname' => 'test_qname',
25
+ 'message' => { 'foo' => 'bar' },
26
+ 'e' => 'json',
27
+ 'c' => 'zlib',
28
+ 'something' => 'else',
29
+ 'x' => { 'this' => 'that' },
30
+ 'once' => ['more',2]
31
+ )
32
+ ret = IPCTransit.receive('qname' => 'test_qname', 'nowait' => 1)
33
+ assert(ret, 'IPCTransit.receive returned true')
34
+ assert_equal(ret['foo'], 'bar')
35
+ assert_equal(ret['.ipc_transit_meta']['something'], 'else')
36
+ assert_equal(ret['.ipc_transit_meta']['x']['this'], 'that')
37
+ assert_equal(ret['.ipc_transit_meta']['once'][0], 'more')
38
+ assert_equal(ret['.ipc_transit_meta']['once'][1], 2)
39
+ end
40
+ end
41
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ipc_transit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -27,6 +27,38 @@ dependencies:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: yaml
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: zlib
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
30
62
  - !ruby/object:Gem::Dependency
31
63
  name: SysVIPC
32
64
  requirement: !ruby/object:Gem::Requirement
@@ -56,6 +88,9 @@ extra_rdoc_files: []
56
88
  files:
57
89
  - Rakefile
58
90
  - lib/ipc_transit.rb
91
+ - lib/ipc_transit/test.rb
92
+ - lib/ipc_transit/serialize.rb
93
+ - lib/ipc_transit/compress.rb
59
94
  - bin/trrecv
60
95
  - bin/trsend
61
96
  - bin/trlist
@@ -63,6 +98,8 @@ files:
63
98
  - bin/trserver
64
99
  - test/tc_transit_simple.rb
65
100
  - test/tc_transit_remote.rb
101
+ - test/tc_transit_yaml.rb
102
+ - test/tc_transit_zlib.rb
66
103
  homepage: http://rubygems.org/gems/ipc_transit
67
104
  licenses: []
68
105
  post_install_message:
@@ -90,3 +127,5 @@ summary: Brokerless, cross-language, fast message queue library
90
127
  test_files:
91
128
  - test/tc_transit_simple.rb
92
129
  - test/tc_transit_remote.rb
130
+ - test/tc_transit_yaml.rb
131
+ - test/tc_transit_zlib.rb