message_channel 1.0.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d63211eee4c3d4c78fbc1d29982b911ca0bd3960e34042ac1409058e90764792
4
- data.tar.gz: 218e4d678165d4eeb99e9ffe27fc66d4ea665ab9e69af3869b80ce8316c608aa
3
+ metadata.gz: 7e76774a75506f2c670888b319bf69ee3abf09fa5ed509e56549d8bccda8ea26
4
+ data.tar.gz: b1bbe6889b83970a86a7405d7ce3ee6a1e95438445fa1bad7539c0bcb15162ef
5
5
  SHA512:
6
- metadata.gz: 692f1efac0613c714399114381b23bbc41819fee3397274f3cded23b01c8db72f51a68000ad019a0a7e600e304e7529f3f4125ae0746b0a87f225eadee091a12
7
- data.tar.gz: 8d9ef41bbf851a7f6b346514531d2bdcd568b7a8370617de1aa0a0cc7c8bf716023cc26f7b1b3971b88fe8fcdf80b6506e8d14de6c2fc96502692fdd20694b2a
6
+ metadata.gz: f793f863eccdde06bed75405f2268159aeaa286bd4d612fc82e656dfacb4b23917030978ce153613499dcc0f17760246b7a6d916b50b749243f8b274213dee03
7
+ data.tar.gz: fadae6f9289d7307cf939f0818db11008f1aa4270dff733d7639aa12e5703fe0be7f41030c988faa561bb9c10f824cbd923a91bc27a84b5e1edb65d8c3b83aec
data/.rubocop.yml ADDED
@@ -0,0 +1,73 @@
1
+
2
+ AllCops:
3
+ Exclude:
4
+ - '.*'
5
+ - '*'
6
+ - '*.gemspec'
7
+ - 'Gemfile*'
8
+ - 'bin/**'
9
+ - 'exe/**'
10
+ - 'config/**/*'
11
+ - 'spec/**/*'
12
+ - 'tmp/**/*'
13
+ - 'vendor/**/*'
14
+ TargetRubyVersion: 2.7
15
+
16
+ Layout/ExtraSpacing:
17
+ Enabled: false
18
+
19
+ Layout/SpaceAroundOperators:
20
+ Enabled: false
21
+
22
+ Layout/SpaceBeforeFirstArg:
23
+ Enabled: false
24
+
25
+ Layout/SpaceInsideParens:
26
+ Enabled: false
27
+
28
+ Layout/SpaceInsideArrayLiteralBrackets:
29
+ Enabled: false
30
+
31
+ Layout/SpaceInsideRangeLiteral:
32
+ Enabled: false
33
+
34
+ Layout/SpaceInsideReferenceBrackets:
35
+ Enabled: false
36
+
37
+ Layout/SpaceInsideStringInterpolation:
38
+ Enabled: false
39
+
40
+ Lint/AmbiguousBlockAssociation:
41
+ Enabled: false
42
+
43
+ Lint/EmptyWhen:
44
+ Enabled: false
45
+
46
+ Lint/ReturnInVoidContext:
47
+ Enabled: false
48
+
49
+ Lint/UselessAssignment:
50
+ Enabled: false
51
+
52
+ Metrics/BlockLength:
53
+ Enabled: false
54
+
55
+ Metrics/LineLength:
56
+ Enabled: false
57
+ Max: 120
58
+
59
+ Metrics/MethodLength:
60
+ Enabled: false
61
+
62
+ Style/Documentation:
63
+ Enabled: true
64
+
65
+ Style/FrozenStringLiteralComment:
66
+ Enabled: false
67
+
68
+ Style/NumericPredicate:
69
+ Enabled: false
70
+
71
+ Style/StringLiterals:
72
+ Enabled: false
73
+
data/README.adoc CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  Yet another observer pattern library via Observable, DRb, MQTT, Redis and Mongo.
4
4
 
5
+ == Features
6
+
7
+ * Thread based observer pattern library.
8
+ * Implemented as a wrapper for Obserbable, DRb, MQTT, Redis and Mongo.
9
+ * Observer can communicate without using sockets.
10
+ * DRb can communicate between processes without using an external server.
11
+ * MQTT, Redis, and Mongo can create apps that can communicate in other languages.
12
+ * Distribute topic as a character string and data as a JSON-encoded character string.
13
+
5
14
  == Installation
6
15
 
7
16
  Add this line to your application's Gemfile:
@@ -172,3 +181,5 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/arimay
172
181
  == License
173
182
 
174
183
  The gem is available as open source under the terms of the http://opensource.org/licenses/MIT[MIT License].
184
+
185
+ Copyright (c) ARIMA Yasuhiro <arima.yasuhiro@gmail.com>
data/README.ja.adoc CHANGED
@@ -1,7 +1,15 @@
1
1
  = MessageChannel
2
2
 
3
- オブザーバパターンライブラリのひとつ.
4
- Observable, DRb, MQTT, Redis and Mongo を用いる.
3
+ オブザーバパターンライブラリのひとつ. Observable, DRb, MQTT, Redis, Mongo を用いる.
4
+
5
+ == 特徴
6
+
7
+ * スレッドベースのオブザーバパターンライブラリ.
8
+ * Obserbable, DRb, MQTT, Redis および Mongo のラッパーとして実装.
9
+ * Observer はソケットを使わずに通信できる.
10
+ * DRb は外部サーバを使わずにプロセス間通信できる.
11
+ * MQTT, Redis, Mongo は通信できるアプリを他言語でも作成できる.
12
+ * トピックは文字列として、データは JSON 化した文字列として配信する.
5
13
 
6
14
  == 導入
7
15
 
@@ -173,3 +181,5 @@ MessageChannel::Mongodb#unlisten( *patterns )
173
181
  == ライセンス
174
182
 
175
183
  この Gem は、 http://opensource.org/licenses/MIT[MITライセンス] の条件に基づいてオープンソースとして入手できる.
184
+
185
+ Copyright (c) ARIMA Yasuhiro <arima.yasuhiro@gmail.com>
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ task :default => :spec
8
8
 
9
9
  class Bundler::GemHelper
10
10
 
11
- def git_archive( dir = "../#{Time.now.strftime("%Y%m%d")}" )
11
+ def git_archive( dir = "../zip" )
12
12
  FileUtils.mkdir_p dir
13
13
  dest_path = File.join(dir, "#{name}-#{version}.zip")
14
14
  cmnd = "git archive --format zip --prefix=#{name}/ HEAD > #{dest_path}"
@@ -1,6 +1,4 @@
1
1
  module MessageChannel
2
- class Error < StandardError; end
3
-
4
2
  module Base
5
3
 
6
4
  # uri:
@@ -49,7 +49,7 @@ module MessageChannel
49
49
 
50
50
  def publish( topic, message )
51
51
  @mutex.synchronize do
52
- @patterns.each do |queue_id, items|
52
+ @patterns.each do |_queue_id, items|
53
53
  pattern, queue = *items
54
54
  if File.fnmatch( pattern, topic, File::FNM_PATHNAME )
55
55
  queue.push( [topic, message] )
@@ -94,7 +94,7 @@ module MessageChannel
94
94
  end
95
95
 
96
96
  def unlisten( pattern )
97
- if queue_id = @queue_ids[pattern]
97
+ if ( queue_id = @queue_ids[pattern] )
98
98
  @drb.unsubscribe( queue_id )
99
99
  @queue_ids.delete( pattern ) rescue nil
100
100
  end
@@ -118,10 +118,10 @@ module MessageChannel
118
118
  queue = Queue.new
119
119
  threads = {}
120
120
  patterns.each do |pattern|
121
- threads[pattern] = Thread.start(pattern) do |pattern|
121
+ threads[pattern] = Thread.start( pattern ) do |pttrn|
122
122
  agent = Agent.new
123
123
  begin
124
- topic, message = * agent.listen_once( pattern )
124
+ topic, message = * agent.listen_once( pttrn )
125
125
  items = JSON.parse( message, symbolize_names: true )
126
126
  queue.push( [topic, items] )
127
127
  rescue => error
@@ -142,9 +142,9 @@ module MessageChannel
142
142
 
143
143
  def listen_each( *patterns, &block )
144
144
  patterns.each do |pattern|
145
- @threads[pattern] = Thread.start(pattern) do |pattern|
145
+ @threads[pattern] = Thread.start( pattern ) do |pttrn|
146
146
  begin
147
- @agent.listen_each( pattern ) do |topic, message|
147
+ @agent.listen_each( pttrn ) do |topic, message|
148
148
  items = JSON.parse( message, symbolize_names: true )
149
149
  block.call( topic, items )
150
150
  end
@@ -44,8 +44,8 @@ module MessageChannel
44
44
 
45
45
  def get_event_tail( event_queue )
46
46
  filter = {}
47
- if enum = event_queue.find( {}, { sort: { "$natural" => -1 } } ).to_enum
48
- if doc = enum.next rescue nil
47
+ if ( enum = event_queue.find( {}, { sort: { "$natural" => -1 } } ).to_enum )
48
+ if ( doc = enum.next rescue nil )
49
49
  filter = { "_id"=>{ "$gt"=>doc["_id"] } }
50
50
  end
51
51
  end
@@ -56,20 +56,21 @@ module MessageChannel
56
56
  queue = Queue.new
57
57
  threads = {}
58
58
  patterns.each do |pattern|
59
- threads[pattern] = ::Thread.start(pattern) do |pattern|
59
+ threads[pattern] = ::Thread.start( pattern ) do |pttrn|
60
60
  event_queue = get_event_queue
61
61
  event_tail = get_event_tail( event_queue )
62
62
  begin
63
- while doc = event_tail.next
63
+ while ( doc = event_tail.next )
64
64
  items = JSON.parse( doc.to_json, symbolize_names: true )
65
65
  topic = items[:topic]
66
- if File.fnmatch( pattern, topic, File::FNM_PATHNAME )
66
+ if File.fnmatch( pttrn, topic, File::FNM_PATHNAME )
67
67
  items.delete( :_id )
68
68
  items.delete( :topic )
69
69
  queue.push [topic, items]
70
70
  end
71
71
  end
72
- ensure
72
+ rescue => e
73
+ nil
73
74
  end
74
75
  end
75
76
  end
@@ -84,20 +85,21 @@ module MessageChannel
84
85
 
85
86
  def listen_each( *patterns, &block )
86
87
  patterns.each do |pattern|
87
- @threads[pattern] = ::Thread.start(pattern) do |pattern|
88
+ @threads[pattern] = ::Thread.start( pattern ) do |pttrn|
88
89
  begin
89
90
  event_queue = get_event_queue
90
91
  event_tail = get_event_tail( event_queue )
91
- while doc = event_tail.next
92
+ while ( doc = event_tail.next )
92
93
  items = JSON.parse( doc.to_json, symbolize_names: true )
93
94
  topic = items[:topic]
94
- if File.fnmatch( pattern, topic, File::FNM_PATHNAME )
95
+ if File.fnmatch( pttrn, topic, File::FNM_PATHNAME )
95
96
  items.delete( :_id )
96
97
  items.delete( :topic )
97
98
  block.call( topic, items )
98
99
  end
99
100
  end
100
- ensure
101
+ rescue => e
102
+ nil
101
103
  end
102
104
  end
103
105
  end
@@ -15,15 +15,16 @@ module MessageChannel
15
15
  queue = Queue.new
16
16
  threads = {}
17
17
  patterns.each do |pattern|
18
- threads[pattern] = ::Thread.start(pattern) do |pattern|
18
+ threads[pattern] = ::Thread.start( pattern ) do |pttrn|
19
19
  mqtt = MQTT::Client.connect( @host, @port )
20
20
  begin
21
- mqtt.get( pattern ) do |topic, message|
21
+ mqtt.get( pttrn ) do |topic, message|
22
22
  items = JSON.parse( message, symbolize_names: true )
23
23
  mqtt.disconnect rescue nil
24
24
  queue.push [topic, items]
25
25
  end
26
- ensure
26
+ rescue => e
27
+ nil
27
28
  end
28
29
  end
29
30
  end
@@ -38,10 +39,10 @@ module MessageChannel
38
39
 
39
40
  def listen_each( *patterns, &block )
40
41
  patterns.each do |pattern|
41
- @threads[pattern] = ::Thread.start(pattern) do |pattern|
42
+ @threads[pattern] = ::Thread.start( pattern ) do |pttrn|
42
43
  mqtt = MQTT::Client.connect( @host, @port )
43
44
  begin
44
- mqtt.get( pattern ) do |topic, message|
45
+ mqtt.get( pttrn ) do |topic, message|
45
46
  items = JSON.parse( message, symbolize_names: true )
46
47
  block.call( topic, items )
47
48
  end
@@ -14,7 +14,7 @@ module MessageChannel
14
14
  end
15
15
  end
16
16
 
17
- def initialize( **options )
17
+ def initialize( **_options )
18
18
  @asyncs = {}
19
19
  @awaits = {}
20
20
  @queues = {}
@@ -26,7 +26,7 @@ module MessageChannel
26
26
  items = JSON.parse( message, symbolize_names: true )
27
27
  @asyncs.keys.each do |pattern|
28
28
  if File.fnmatch( pattern, topic, File::FNM_PATHNAME )
29
- if action = @asyncs[pattern]
29
+ if ( action = @asyncs[pattern] )
30
30
  action.call( topic, items )
31
31
  end
32
32
  end
@@ -66,7 +66,7 @@ module MessageChannel
66
66
 
67
67
  def unlisten( **patterns )
68
68
  patterns.each do |pattern|
69
- if action = @asyncs[pattern]
69
+ if ( action = @asyncs[pattern] )
70
70
  @asyncs.delete( pattern )
71
71
  end
72
72
  end
@@ -16,20 +16,19 @@ module MessageChannel
16
16
  queue = Queue.new
17
17
  threads = {}
18
18
  patterns.each do |pattern|
19
- threads[pattern] = ::Thread.start(pattern) do |pattern|
19
+ threads[pattern] = ::Thread.start( pattern ) do |pttrn|
20
20
  redis = ::Redis.new( host: @host, port: @port, db: @db )
21
21
  begin
22
- redis.psubscribe( pattern ) do |on|
23
- on.pmessage do |pattern, channel, message|
22
+ redis.psubscribe( pttrn ) do |on|
23
+ on.pmessage do |ptn, channel, message|
24
24
  items = JSON.parse( message, symbolize_names: true )
25
- redis.punsubscribe( topic ) rescue nil
25
+ redis.punsubscribe( ptn ) rescue nil
26
26
  queue.push [channel, items]
27
27
  end
28
28
  end
29
29
  rescue ::Redis::BaseConnectionError => error
30
30
  sleep 1
31
31
  retry
32
- ensure
33
32
  end
34
33
  end
35
34
  end
@@ -44,11 +43,11 @@ module MessageChannel
44
43
 
45
44
  def listen_each( *patterns, &block )
46
45
  patterns.each do |pattern|
47
- @threads[pattern] = ::Thread.start(pattern) do |pattern|
46
+ @threads[pattern] = ::Thread.start( pattern ) do |pttrn|
48
47
  redis = ::Redis.new( host: @host, port: @port, db: @db )
49
48
  begin
50
- redis.psubscribe( pattern ) do |on|
51
- on.pmessage do |pattern, channel, message|
49
+ redis.psubscribe( pttrn ) do |on|
50
+ on.pmessage do |_ptn, channel, message|
52
51
  items = JSON.parse( message, symbolize_names: true )
53
52
  block.call( channel, items )
54
53
  end
@@ -57,7 +56,7 @@ module MessageChannel
57
56
  sleep 1
58
57
  retry
59
58
  ensure
60
- redis.punsubscribe( topic ) rescue nil
59
+ redis.punsubscribe( pttrn ) rescue nil
61
60
  end
62
61
  end
63
62
  end
@@ -1,3 +1,3 @@
1
1
  module MessageChannel
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -7,9 +7,9 @@ Gem::Specification.new do |spec|
7
7
  spec.email = ["arima.yasuhiro@gmail.com"]
8
8
 
9
9
  spec.summary = %q{ Wrapper library for publish/subscribe pattern. }
10
- spec.description = %q{ Yet another observer pattern wrapper library via Observable, DRb, MQTT, Redis and Mongo. }
10
+ spec.description = %q{ Yet another observer pattern wrapper library via Observable, DRb, MQTT, Redis or Mongo. }
11
11
  spec.homepage = "https://github.com/arimay/message_channel"
12
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
12
+ spec.license = "MIT"
13
13
 
14
14
  # Specify which files should be added to the gem when it is released.
15
15
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -25,6 +25,6 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "msgpack"
26
26
  spec.add_development_dependency "mongo"
27
27
 
28
- spec.add_development_dependency "rake", "~> 12.0"
29
- spec.add_development_dependency "rspec", "~> 3.0"
28
+ spec.add_development_dependency "rake"
29
+ spec.add_development_dependency "rspec"
30
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: message_channel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - arimay
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-18 00:00:00.000000000 Z
11
+ date: 2021-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mqtt
@@ -70,32 +70,32 @@ dependencies:
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '12.0'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '12.0'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '3.0'
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '3.0'
96
+ version: '0'
97
97
  description: " Yet another observer pattern wrapper library via Observable, DRb, MQTT,
98
- Redis and Mongo. "
98
+ Redis or Mongo. "
99
99
  email:
100
100
  - arima.yasuhiro@gmail.com
101
101
  executables: []
@@ -104,6 +104,7 @@ extra_rdoc_files: []
104
104
  files:
105
105
  - ".gitignore"
106
106
  - ".rspec"
107
+ - ".rubocop.yml"
107
108
  - ".travis.yml"
108
109
  - Gemfile
109
110
  - README.adoc
@@ -126,9 +127,10 @@ files:
126
127
  - sample/sample_2.rb
127
128
  - sample/sample_3.rb
128
129
  homepage: https://github.com/arimay/message_channel
129
- licenses: []
130
+ licenses:
131
+ - MIT
130
132
  metadata: {}
131
- post_install_message:
133
+ post_install_message:
132
134
  rdoc_options: []
133
135
  require_paths:
134
136
  - lib
@@ -136,15 +138,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
138
  requirements:
137
139
  - - ">="
138
140
  - !ruby/object:Gem::Version
139
- version: 2.3.0
141
+ version: '0'
140
142
  required_rubygems_version: !ruby/object:Gem::Requirement
141
143
  requirements:
142
144
  - - ">="
143
145
  - !ruby/object:Gem::Version
144
146
  version: '0'
145
147
  requirements: []
146
- rubygems_version: 3.1.4
147
- signing_key:
148
+ rubygems_version: 3.2.3
149
+ signing_key:
148
150
  specification_version: 4
149
151
  summary: Wrapper library for publish/subscribe pattern.
150
152
  test_files: []