message_channel 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/Gemfile +5 -0
- data/README.adoc +174 -0
- data/README.ja.adoc +175 -0
- data/Rakefile +96 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/message_channel.rb +18 -0
- data/lib/message_channel/base.rb +54 -0
- data/lib/message_channel/druby.rb +182 -0
- data/lib/message_channel/mongodb.rb +131 -0
- data/lib/message_channel/mqtt.rb +79 -0
- data/lib/message_channel/observer.rb +82 -0
- data/lib/message_channel/redis.rb +90 -0
- data/lib/message_channel/version.rb +3 -0
- data/message_channel.gemspec +30 -0
- data/sample/all_1.rb +48 -0
- data/sample/sample.txt +31 -0
- data/sample/sample_1.rb +18 -0
- data/sample/sample_2.rb +21 -0
- data/sample/sample_3.rb +31 -0
- metadata +150 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d63211eee4c3d4c78fbc1d29982b911ca0bd3960e34042ac1409058e90764792
|
4
|
+
data.tar.gz: 218e4d678165d4eeb99e9ffe27fc66d4ea665ab9e69af3869b80ce8316c608aa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 692f1efac0613c714399114381b23bbc41819fee3397274f3cded23b01c8db72f51a68000ad019a0a7e600e304e7529f3f4125ae0746b0a87f225eadee091a12
|
7
|
+
data.tar.gz: 8d9ef41bbf851a7f6b346514531d2bdcd568b7a8370617de1aa0a0cc7c8bf716023cc26f7b1b3971b88fe8fcdf80b6506e8d14de6c2fc96502692fdd20694b2a
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/Gemfile.lock
|
4
|
+
/_yardoc/
|
5
|
+
/coverage/
|
6
|
+
/doc/
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
9
|
+
/tmp/
|
10
|
+
*.bundle
|
11
|
+
*.so
|
12
|
+
*.o
|
13
|
+
*.a
|
14
|
+
mkmf.log
|
15
|
+
/vendor/
|
16
|
+
*.pid
|
17
|
+
*.log
|
18
|
+
*.log.*
|
19
|
+
/var/
|
20
|
+
/log/
|
21
|
+
*.swp
|
22
|
+
/.rspec_status
|
23
|
+
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.adoc
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
= MessageChannel
|
2
|
+
|
3
|
+
Yet another observer pattern library via Observable, DRb, MQTT, Redis and Mongo.
|
4
|
+
|
5
|
+
== Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
[source,ruby]
|
10
|
+
----
|
11
|
+
gem 'message_channel'
|
12
|
+
----
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle install
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ gem install message_channel
|
21
|
+
or
|
22
|
+
$ gem install -l message_channel-x.x.x.gem
|
23
|
+
|
24
|
+
== Usage
|
25
|
+
|
26
|
+
=== Example 1
|
27
|
+
|
28
|
+
[source,ruby]
|
29
|
+
----
|
30
|
+
require "message_channel"
|
31
|
+
|
32
|
+
Signal.trap( :INT ) do
|
33
|
+
exit
|
34
|
+
end
|
35
|
+
|
36
|
+
channel = MessageChannel.new
|
37
|
+
|
38
|
+
channel.listen( "hello" ) do |topic, **items|
|
39
|
+
p [topic, items]
|
40
|
+
end
|
41
|
+
|
42
|
+
while true
|
43
|
+
channel.notify "hello", {at: Time.now.to_s}
|
44
|
+
sleep 1
|
45
|
+
end
|
46
|
+
----
|
47
|
+
|
48
|
+
=== Example 2
|
49
|
+
|
50
|
+
[source,ruby]
|
51
|
+
----
|
52
|
+
require "message_channel"
|
53
|
+
|
54
|
+
Signal.trap( :INT ) do
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
|
58
|
+
channel = MessageChannel.new
|
59
|
+
|
60
|
+
Thread.start do
|
61
|
+
while true
|
62
|
+
topic, items = channel.listen( "hello" )
|
63
|
+
p [topic, items]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
Thread.start do
|
68
|
+
while true
|
69
|
+
channel.notify "hello", {at: Time.now.to_s}
|
70
|
+
sleep 1
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
sleep
|
75
|
+
----
|
76
|
+
|
77
|
+
== Reference
|
78
|
+
|
79
|
+
=== Create a new MessageChannel::* with conditions.
|
80
|
+
|
81
|
+
[source,ruby]
|
82
|
+
----
|
83
|
+
MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: nil, name: nil )
|
84
|
+
----
|
85
|
+
|
86
|
+
* Result:
|
87
|
+
** MessageChannel::* object.
|
88
|
+
|
89
|
+
* Parameter:
|
90
|
+
** uri: scheme://host:port/params (default: nil)
|
91
|
+
*** "observer"
|
92
|
+
*** "druby://127.0.0.1:8787"
|
93
|
+
*** "mqtt://127.0.0.1:1883"
|
94
|
+
*** "redis://127.0.0.1:6379/0"
|
95
|
+
*** "mongodb://127.0.0.1:27017/test?size=4000&name=_event_queue"
|
96
|
+
** type: Channel type. (default: "observer")
|
97
|
+
*** "observer"
|
98
|
+
*** "druby"
|
99
|
+
*** "mqtt"
|
100
|
+
*** "redis"
|
101
|
+
*** "mongodb"
|
102
|
+
** host: Service host. (default: nil)
|
103
|
+
** port: Service port. (default: nil)
|
104
|
+
** db: Database name. (default: "test")
|
105
|
+
** size: Queue Size. (default: 4000)
|
106
|
+
** name: Queue Name. (default: "_event_queue")
|
107
|
+
|
108
|
+
=== Notify through the channel.
|
109
|
+
|
110
|
+
[source,ruby]
|
111
|
+
----
|
112
|
+
MessageChannel::Observer#notify( topic, **items )
|
113
|
+
MessageChannel::Druby#notify( topic, **items )
|
114
|
+
MessageChannel::Mqtt#notify( topic, **items )
|
115
|
+
MessageChannel::Redis#notify( topic, **items )
|
116
|
+
MessageChannel::Mongodb#notify( topic, **items )
|
117
|
+
----
|
118
|
+
|
119
|
+
* Result:
|
120
|
+
** nil.
|
121
|
+
|
122
|
+
* Parameter:
|
123
|
+
** topic: a notification topic.
|
124
|
+
** items: notification items.
|
125
|
+
|
126
|
+
=== Listen to notification through the channel.
|
127
|
+
|
128
|
+
[source,ruby]
|
129
|
+
----
|
130
|
+
MessageChannel::Observer#listen( *patterns, &block )
|
131
|
+
MessageChannel::Druby#listen( *patterns, &block )
|
132
|
+
MessageChannel::Mqtt#listen( *patterns, &block )
|
133
|
+
MessageChannel::Redis#listen( *patterns, &block )
|
134
|
+
MessageChannel::Mongodb#listen( *patterns, &block )
|
135
|
+
----
|
136
|
+
|
137
|
+
* Result:
|
138
|
+
** with block: (Non-blocing Mode)
|
139
|
+
*** nil.
|
140
|
+
** without block: (Blocking Mode)
|
141
|
+
*** topic: a notified topic.
|
142
|
+
*** items: notified items.
|
143
|
+
|
144
|
+
* Parameter:
|
145
|
+
** patterns: mask patterns.
|
146
|
+
|
147
|
+
* Block Parameter:
|
148
|
+
** topic: a notified topic.
|
149
|
+
** items: notified items.
|
150
|
+
|
151
|
+
=== Unlisten to notification.
|
152
|
+
|
153
|
+
[source,ruby]
|
154
|
+
----
|
155
|
+
MessageChannel::Observer#unlisten( *patterns )
|
156
|
+
MessageChannel::Druby#unlisten( *patterns )
|
157
|
+
MessageChannel::Mqtt#unlisten( *patterns )
|
158
|
+
MessageChannel::Redis#unlisten( *patterns )
|
159
|
+
MessageChannel::Mongodb#unlisten( *patterns )
|
160
|
+
----
|
161
|
+
|
162
|
+
* Result:
|
163
|
+
** nil.
|
164
|
+
|
165
|
+
* Parameter:
|
166
|
+
** patterns: mask patterns.
|
167
|
+
|
168
|
+
== Contributing
|
169
|
+
|
170
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/arimay/message_channel.
|
171
|
+
|
172
|
+
== License
|
173
|
+
|
174
|
+
The gem is available as open source under the terms of the http://opensource.org/licenses/MIT[MIT License].
|
data/README.ja.adoc
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
= MessageChannel
|
2
|
+
|
3
|
+
オブザーバパターンライブラリのひとつ.
|
4
|
+
Observable, DRb, MQTT, Redis and Mongo を用いる.
|
5
|
+
|
6
|
+
== 導入
|
7
|
+
|
8
|
+
アプリの Gemfile にこの行を追加
|
9
|
+
|
10
|
+
[source,ruby]
|
11
|
+
----
|
12
|
+
gem 'message_channel'
|
13
|
+
----
|
14
|
+
|
15
|
+
それから実行
|
16
|
+
|
17
|
+
$ bundle install
|
18
|
+
|
19
|
+
または次のように手動で導入
|
20
|
+
|
21
|
+
$ gem install message_channel
|
22
|
+
or
|
23
|
+
$ gem install -l message_channel-x.x.x.gem
|
24
|
+
|
25
|
+
== 使い方
|
26
|
+
|
27
|
+
=== Example 1
|
28
|
+
|
29
|
+
[source,ruby]
|
30
|
+
----
|
31
|
+
require "message_channel"
|
32
|
+
|
33
|
+
Signal.trap( :INT ) do
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
|
37
|
+
channel = MessageChannel.new
|
38
|
+
|
39
|
+
channel.listen( "hello" ) do |topic, **items|
|
40
|
+
p [topic, items]
|
41
|
+
end
|
42
|
+
|
43
|
+
while true
|
44
|
+
channel.notify "hello", {at: Time.now.to_s}
|
45
|
+
sleep 1
|
46
|
+
end
|
47
|
+
----
|
48
|
+
|
49
|
+
=== Example 2
|
50
|
+
|
51
|
+
[source,ruby]
|
52
|
+
----
|
53
|
+
require "message_channel"
|
54
|
+
|
55
|
+
Signal.trap( :INT ) do
|
56
|
+
exit
|
57
|
+
end
|
58
|
+
|
59
|
+
channel = MessageChannel.new
|
60
|
+
|
61
|
+
Thread.start do
|
62
|
+
while true
|
63
|
+
topic, items = channel.listen( "hello" )
|
64
|
+
p [topic, items]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
Thread.start do
|
69
|
+
while true
|
70
|
+
channel.notify "hello", {at: Time.now.to_s}
|
71
|
+
sleep 1
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
sleep
|
76
|
+
----
|
77
|
+
|
78
|
+
== リファレンス
|
79
|
+
|
80
|
+
=== 条件を指定して、新たな MessageChannel::* を作成する.
|
81
|
+
|
82
|
+
[source,ruby]
|
83
|
+
----
|
84
|
+
MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: nil, name: nil )
|
85
|
+
----
|
86
|
+
|
87
|
+
* Result:
|
88
|
+
** MessageChannel::* object.
|
89
|
+
|
90
|
+
* Parameter:
|
91
|
+
** uri: scheme://host:port/params (default: nil)
|
92
|
+
*** "observer"
|
93
|
+
*** "druby://127.0.0.1:8787"
|
94
|
+
*** "mqtt://127.0.0.1:1883"
|
95
|
+
*** "redis://127.0.0.1:6379/0"
|
96
|
+
*** "mongodb://127.0.0.1:27017/test?size=4000&name=_event_queue"
|
97
|
+
** type: Channel type. (default: "observer")
|
98
|
+
*** "observer"
|
99
|
+
*** "druby"
|
100
|
+
*** "mqtt"
|
101
|
+
*** "redis"
|
102
|
+
*** "mongodb"
|
103
|
+
** host: サービスホスト. (default: nil)
|
104
|
+
** port: サービスポート. (default: nil)
|
105
|
+
** db: データベース名. (default: "test")
|
106
|
+
** size: キューサイズ. (default: 4000)
|
107
|
+
** name: キュー名. (default: "_event_queue")
|
108
|
+
|
109
|
+
=== チャネル経由で通知.
|
110
|
+
|
111
|
+
[source,ruby]
|
112
|
+
----
|
113
|
+
MessageChannel::Observer#notify( topic, **items )
|
114
|
+
MessageChannel::Druby#notify( topic, **items )
|
115
|
+
MessageChannel::Mqtt#notify( topic, **items )
|
116
|
+
MessageChannel::Redis#notify( topic, **items )
|
117
|
+
MessageChannel::Mongodb#notify( topic, **items )
|
118
|
+
----
|
119
|
+
|
120
|
+
* Result:
|
121
|
+
** nil.
|
122
|
+
|
123
|
+
* Parameter:
|
124
|
+
** topic: 通知トピック.
|
125
|
+
** items: 通知アイテム.
|
126
|
+
|
127
|
+
=== チャネル経由で通知待機.
|
128
|
+
|
129
|
+
[source,ruby]
|
130
|
+
----
|
131
|
+
MessageChannel::Observer#listen( *patterns, &block )
|
132
|
+
MessageChannel::Druby#listen( *patterns, &block )
|
133
|
+
MessageChannel::Mqtt#listen( *patterns, &block )
|
134
|
+
MessageChannel::Redis#listen( *patterns, &block )
|
135
|
+
MessageChannel::Mongodb#listen( *patterns, &block )
|
136
|
+
----
|
137
|
+
|
138
|
+
* Result:
|
139
|
+
** ブロック引数あり: (Non-blocing Mode)
|
140
|
+
*** nil.
|
141
|
+
** ブロック引数なし: (Blocking Mode)
|
142
|
+
*** topic: 通知トピック.
|
143
|
+
*** items: 通知アイテム.
|
144
|
+
|
145
|
+
* Parameter:
|
146
|
+
** patterns: マスクパターンの配列.
|
147
|
+
|
148
|
+
* Block Parameter:
|
149
|
+
** topic: 通知トピック.
|
150
|
+
** items: 通知アイテム.
|
151
|
+
|
152
|
+
=== 通知待機を解除.
|
153
|
+
|
154
|
+
[source,ruby]
|
155
|
+
----
|
156
|
+
MessageChannel::Observer#unlisten( *patterns )
|
157
|
+
MessageChannel::Druby#unlisten( *patterns )
|
158
|
+
MessageChannel::Mqtt#unlisten( *patterns )
|
159
|
+
MessageChannel::Redis#unlisten( *patterns )
|
160
|
+
MessageChannel::Mongodb#unlisten( *patterns )
|
161
|
+
----
|
162
|
+
|
163
|
+
* Result:
|
164
|
+
** nil.
|
165
|
+
|
166
|
+
* Parameter:
|
167
|
+
** patterns: マスクパターンの配列.
|
168
|
+
|
169
|
+
== 貢献
|
170
|
+
|
171
|
+
不具合報告とプルリクエストは GitHub https://github.com/arimay/message_channel まで.
|
172
|
+
|
173
|
+
== ライセンス
|
174
|
+
|
175
|
+
この Gem は、 http://opensource.org/licenses/MIT[MITライセンス] の条件に基づいてオープンソースとして入手できる.
|
data/Rakefile
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
require "bundler/gem_helper"
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
require "rspec/core/rake_task"
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
|
7
|
+
task :default => :spec
|
8
|
+
|
9
|
+
class Bundler::GemHelper
|
10
|
+
|
11
|
+
def git_archive( dir = "../#{Time.now.strftime("%Y%m%d")}" )
|
12
|
+
FileUtils.mkdir_p dir
|
13
|
+
dest_path = File.join(dir, "#{name}-#{version}.zip")
|
14
|
+
cmnd = "git archive --format zip --prefix=#{name}/ HEAD > #{dest_path}"
|
15
|
+
|
16
|
+
out, code = sh_with_status( cmnd )
|
17
|
+
raise "Couldn't archive gem," unless code == 0
|
18
|
+
|
19
|
+
Bundler.ui.confirm "#{name} #{version} archived to #{dest_path}."
|
20
|
+
end
|
21
|
+
|
22
|
+
def git_push
|
23
|
+
ver = version.to_s
|
24
|
+
|
25
|
+
cmnd = "git push origin #{ver} "
|
26
|
+
out, code = sh_with_status( cmnd )
|
27
|
+
raise "Couldn't git push origin." unless code == 0
|
28
|
+
|
29
|
+
cmnd = "git push "
|
30
|
+
out, code = sh_with_status( cmnd )
|
31
|
+
raise "Couldn't git push." unless code == 0
|
32
|
+
|
33
|
+
Bundler.ui.confirm "Git Push #{ver}."
|
34
|
+
end
|
35
|
+
|
36
|
+
def update_version( new_version )
|
37
|
+
version_filename = %x[ find . -type f -name "version.rb" | grep -v vendor | head -1 ].chomp
|
38
|
+
version_pathname = File.expand_path( version_filename )
|
39
|
+
lines = File.open( version_pathname ).read
|
40
|
+
lines = lines.gsub( /VERSION\s*=\s*\"\d+\.\d+\.\d+\"/, "VERSION = \"#{new_version}\"" )
|
41
|
+
File.open( version_pathname, "w" ) do |file|
|
42
|
+
file.write( lines )
|
43
|
+
end
|
44
|
+
|
45
|
+
cmnd = "git add #{version_pathname} "
|
46
|
+
out, code = sh_with_status( cmnd )
|
47
|
+
raise "Couldn't git add," unless code == 0
|
48
|
+
|
49
|
+
cmnd = "git commit -m '#{new_version}' "
|
50
|
+
out, code = sh_with_status( cmnd )
|
51
|
+
raise "Couldn't git commit." unless code == 0
|
52
|
+
|
53
|
+
cmnd = "git tag #{new_version} "
|
54
|
+
out, code = sh_with_status( cmnd )
|
55
|
+
raise "Couldn't git tag." unless code == 0
|
56
|
+
|
57
|
+
Bundler.ui.confirm "Update Tags to #{new_version}."
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
Bundler::GemHelper.new(Dir.pwd).instance_eval do
|
63
|
+
|
64
|
+
desc "Archive #{name}-#{version}.zip from repository"
|
65
|
+
task 'zip' do
|
66
|
+
git_archive
|
67
|
+
end
|
68
|
+
|
69
|
+
desc "Git Push"
|
70
|
+
task 'push' do
|
71
|
+
git_push
|
72
|
+
end
|
73
|
+
|
74
|
+
desc "Update Version Tiny"
|
75
|
+
task 'tiny' do
|
76
|
+
major, minor, tiny = version.to_s.split('.')
|
77
|
+
new_version = [major, minor, tiny.to_i + 1].join('.')
|
78
|
+
update_version( new_version )
|
79
|
+
end
|
80
|
+
|
81
|
+
desc "Update Version Minor"
|
82
|
+
task 'minor' do
|
83
|
+
major, minor, tiny = version.to_s.split('.')
|
84
|
+
new_version = [major, minor.to_i + 1, 0].join('.')
|
85
|
+
update_version( new_version )
|
86
|
+
end
|
87
|
+
|
88
|
+
desc "Update Version Major"
|
89
|
+
task 'major' do
|
90
|
+
major, minor, tiny = version.to_s.split('.')
|
91
|
+
new_version = [major.to_i + 1, 0, 0].join('.')
|
92
|
+
update_version( new_version )
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|