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.
@@ -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
+