message_channel 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -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
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.7.1
6
+ before_install: gem install bundler -v 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in message_channel.gemspec
4
+ gemspec
5
+
@@ -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].
@@ -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ライセンス] の条件に基づいてオープンソースとして入手できる.
@@ -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
+