ichannel 6.1.0 → 6.1.1

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/.travis.yml CHANGED
@@ -3,6 +3,8 @@ rvm:
3
3
  - 1.9.3
4
4
  - 2.0.0
5
5
  - ruby-head
6
+ - rbx-19mode
7
+ - jruby-19mode
6
8
 
7
9
  env:
8
10
  - SERIALIZER=YAML
data/ChangeLog.txt CHANGED
@@ -1,4 +1,12 @@
1
- == HEAD
1
+ == v6.1.1
2
+ - Add support for Rubinius, JRuby (1.9+ mode)
3
+
4
+ - Fix the optional dependency on Redis.
5
+ This was totally broken :/ We explicitly required Redis in lib/ichannel.rb.
6
+ Now we require "ichannel/redis" when IChannel.redis is invoked, which in turn
7
+ requires "redis", so the dependency is only exposed when invoking that method.
8
+
9
+ == v6.1.0
2
10
  - Redis#last_msg, UNIXSocket#last_msg changes.
3
11
  The last_msg method returns the last value read by #get when a channel is
4
12
  not readable.
@@ -9,7 +17,7 @@
9
17
  - Add IChannel::Redis.
10
18
  Add Redis as a backend.
11
19
 
12
- == v0.6.0
20
+ == v6.0.0
13
21
  - IChannel::UNIXSocket can now be serialized by Marshal.
14
22
  IChannel::UNIXSocket can be serialized by Marshal but there's a gotcha: it
15
23
  only really works on the same machine between one or more Ruby processes.
data/Gemfile CHANGED
@@ -2,7 +2,7 @@ source 'http://rubygems.org'
2
2
  group :development do
3
3
  gem "pry"
4
4
  gem "rake"
5
- gem "redcarpet"
5
+ gem "redcarpet" unless RUBY_ENGINE == "jruby"
6
6
  gem "yard"
7
7
  gem "foreman"
8
8
  end
data/README.md CHANGED
@@ -11,25 +11,10 @@ __OVERVIEW__
11
11
  __DESCRIPTION__
12
12
 
13
13
  ichannel is a channel for interprocess communication between ruby processes on
14
- the same machine(or network). The basic premise is that you can "put" a ruby
14
+ the same machine or network. The basic premise is that you can "put" a ruby
15
15
  object onto the channel and on the other end(maybe in a different process,
16
16
  or maybe on a different machine) you can "get" the object from the channel.
17
-
18
- The two main modes of transport are a UNIXSocket(streamed) or [redis](https://redis.io).
19
- A unix socket is fast and operates without any external dependencies but it
20
- can't go beyond a single machine. A channel that uses redis can operate between
21
- different machines. And incase you're wondering ichannel uses a
22
- redis [list](http://redis.io/commands#list) to queue messages.
23
-
24
- The last topic I feel I should talk about before the examples is serialization.
25
- A ruby object is serialized(on write) and deserialized(on read) when passing
26
- through a channel. A channel can use any serializer that implements the dump and
27
- load methods but the default is [Marshal](http://ruby-doc.org/core-2.0/Marshal.html).
28
- There are also a number of objects that cannot be serialized (such as IO,
29
- anonymous classes/modules, Proc, …) but I've found most of the time I send
30
- simple objects like Hash.
31
-
32
-
17
+
33
18
  __EXAMPLES__
34
19
 
35
20
  __1.__
@@ -70,14 +55,15 @@ Process.wait pid
70
55
 
71
56
  __3.__
72
57
 
73
- A demo of how to use ichannel with Redis:
58
+ A demo of a channel sending messages between machines by using
59
+ [redis](https://redis.io) as a backend:
74
60
 
75
61
  ```ruby
76
- channel = IChannel.redis
62
+ channel = IChannel.redis Marshal, key: "readme-example"
77
63
  channel.put %w(a)
78
64
 
79
- # In another process, far away…
80
- channel = IChannel.redis
65
+ # In another process, on another machine, far away…
66
+ channel = IChannel.redis Marshal, key: "readme-example"
81
67
  channel.get # => ["a"]
82
68
  ```
83
69
 
@@ -103,14 +89,19 @@ __PLATFORM SUPPORT__
103
89
 
104
90
  _supported_
105
91
 
106
- * CRuby (1.9+)
92
+ * CRuby (1.9+)
93
+ * Rubinius (1.9+)
94
+ * JRuby (1.9+ - some tests skipped)
95
+ JRuby is supported and passes the test suite but it has a few skips.
96
+ Three skips are because jruby does not implement Kernel.fork and one
97
+ looks like a possible bug in JRuby's Marshal when trying to deserialize
98
+ a channel that uses a unix socket. The other 24 tests pass on jruby, &
99
+ those tests cover both unix sockets & redis.
107
100
 
108
101
  _unsupported_
109
-
110
- * CRuby 1.8
102
+
103
+ * Any 1.8 implementation
111
104
  * MacRuby
112
- * JRuby
113
- * Rubinius (support for Rubinius will come sometime in the future).
114
105
 
115
106
  __INSTALL__
116
107
 
@@ -1,5 +1,5 @@
1
+ require "redis"
1
2
  class IChannel::Redis
2
-
3
3
  #
4
4
  # @param [#dump,#load] serializer
5
5
  # A serializer.
@@ -1,3 +1,3 @@
1
1
  module IChannel
2
- VERSION = "6.1.0"
2
+ VERSION = "6.1.1"
3
3
  end
data/lib/ichannel.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  module IChannel
2
- require 'redis'
2
+ require "timeout"
3
3
  require_relative "ichannel/unix_socket"
4
- require_relative "ichannel/redis"
5
4
 
6
5
  #
7
6
  # @param
@@ -22,9 +21,9 @@ module IChannel
22
21
  # (see Redis#initialize)
23
22
  #
24
23
  def self.redis(serializer = Marshal, options = {})
25
- unless defined?(::Redis)
26
- require 'redis'
24
+ unless defined?(IChannel::Redis)
25
+ require_relative "ichannel/redis"
27
26
  end
28
- Redis.new serializer, options
27
+ IChannel::Redis.new serializer, options
29
28
  end
30
29
  end
@@ -27,26 +27,43 @@ class IChannelUNIXTest < Test::Unit::TestCase
27
27
  end
28
28
 
29
29
  def test_last_msg_after_read
30
- @channel.put 42
30
+ @channel.put [42]
31
31
  @channel.get
32
- assert_equal 42, @channel.last_msg
32
+ assert_equal [42], @channel.last_msg
33
33
  end
34
34
 
35
35
  def test_serialization_in_fork
36
+ if RUBY_ENGINE == "jruby"
37
+ skip "jruby does not implement Kernel.fork"
38
+ end
36
39
  dump = Marshal.dump(@channel)
37
40
  pid = fork do
38
- Marshal.load(dump).put 42
41
+ Marshal.load(dump).put [42]
39
42
  end
40
43
  Process.wait pid
41
- assert_equal 42, @channel.get
44
+ assert_equal [42], @channel.get
42
45
  end
43
46
 
44
47
  def test_serialization
45
- @channel.put 42
48
+ if RUBY_ENGINE == "jruby"
49
+ skip "fails on jruby"
50
+ end
51
+ @channel.put [42]
46
52
  dump = Marshal.dump @channel
47
- assert_equal 42, Marshal.load(dump).get
53
+ assert_equal [42], Marshal.load(dump).get
48
54
  end
49
55
 
56
+ def test_fork
57
+ if RUBY_ENGINE == "jruby"
58
+ skip "jruby does not implement Kernel.fork"
59
+ end
60
+ pid = fork do
61
+ @channel.put [42]
62
+ end
63
+ Process.wait pid
64
+ assert_equal [42], @channel.get
65
+ end
66
+
50
67
  def test_last_msg
51
68
  @channel.put %w(a)
52
69
  @channel.put %w(b)
@@ -67,14 +84,6 @@ class IChannelUNIXTest < Test::Unit::TestCase
67
84
  2.times { assert_equal %w(b), @channel.last_msg }
68
85
  end
69
86
 
70
- def test_put_and_get
71
- pid = fork do
72
- @channel.put %w(a b c)
73
- end
74
- Process.wait pid
75
- assert_equal %w(a b c), @channel.get
76
- end
77
-
78
87
  def test_put_on_closed_channel
79
88
  @channel.close
80
89
  assert_raises IOError do
@@ -90,11 +99,8 @@ class IChannelUNIXTest < Test::Unit::TestCase
90
99
  end
91
100
 
92
101
  def test_queued_messages
93
- pid = fork do
94
- @channel.put %w(a)
95
- @channel.put %w(b)
96
- end
97
- Process.wait pid
102
+ @channel.put %w(a)
103
+ @channel.put %w(b)
98
104
  assert_equal %w(a), @channel.get
99
105
  assert_equal %w(b), @channel.get
100
106
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ichannel
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.0
4
+ version: 6.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-03 00:00:00.000000000 Z
12
+ date: 2013-05-05 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! "A modern and easy-to-use interprocess communication \n primitive."
15
15
  email:
@@ -51,7 +51,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
51
51
  version: '0'
52
52
  segments:
53
53
  - 0
54
- hash: 3267569127984942618
54
+ hash: -277858576396614172
55
55
  required_rubygems_version: !ruby/object:Gem::Requirement
56
56
  none: false
57
57
  requirements:
@@ -60,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
60
  version: '0'
61
61
  segments:
62
62
  - 0
63
- hash: 3267569127984942618
63
+ hash: -277858576396614172
64
64
  requirements: []
65
65
  rubyforge_project:
66
66
  rubygems_version: 1.8.23