message_channel 1.0.0
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.
- 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
|
+
|