pub-sub 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af4c7ad4b78158564b9ccbfed7aa12a3bc5a6a4bff060d595a58e006f7a9b65a
4
- data.tar.gz: 4b874573cb05bb67ae84a3982bfd79d3eb05ed5dfac563e27a8639280912791c
3
+ metadata.gz: c40743db194975eb5a6157d9818dda65ecadbddef131c9b4048d61a26567ae67
4
+ data.tar.gz: 98e1db527cc5a8ddc442026857922afa800949da0054b5e53f1e7c6dfc71d0a6
5
5
  SHA512:
6
- metadata.gz: ebd6bb1269ba94e96923c8234595196b3ac8d0cfc55e767921d7416568ed794f4c4856eabb6b2d594cb62382684996a2f351717d04d8aee320c7d4517fcbfe14
7
- data.tar.gz: 82ba0ed1e78a29618f9d4a1092c0d0afe3512d3f3e47a447515ea51f6fed404ef666c7cfebb12baa9c16e7cd5a0968adb8c015aced43a4ece25ff13e61c25968
6
+ metadata.gz: 1342d94d8e4333fe598cf6419183ae4528be0aa9e4fe6f9bf1faf058f3a0409169be9585e6b93048c2460290cf32c1c0b9f4cd9090dda68bdc8450d1fcd65c81
7
+ data.tar.gz: 0f1b05c15ac460f40413a8530f44c87a0d44b1b2b277596d506f05632fcc1f275e83bace387b66f527ac0ea502c2b57d08f9db1da370f3056bb1e6c776949a6c
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+ require 'singleton'
3
+
4
+ require 'pub_sub/container'
5
+ require 'pub_sub/hash'
6
+ require 'pub_sub/publisher'
7
+ require 'pub_sub/subscriber'
8
+
9
+ module PubSub
10
+ class Configuration
11
+ private_class_method :new
12
+ attr_reader :container
13
+
14
+ @@singleton__instance = nil
15
+ @@singleton__mutex = Mutex.new
16
+
17
+ class << self
18
+ def init(container = ::PubSub::Hash)
19
+ this(container)
20
+ end
21
+
22
+ def this(container = ::PubSub::Hash)
23
+ return @@singleton__instance if @@singleton__instance
24
+
25
+ @@singleton__mutex.synchronize do
26
+ return @@singleton__instance if @@singleton__instance
27
+
28
+ @@singleton__instance = new(container)
29
+ end
30
+ @@singleton__instance
31
+ end
32
+
33
+ def container
34
+ this.container
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def initialize(container)
41
+ @container = container.new
42
+ end
43
+ end
44
+ end
45
+
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PubSub
4
+ class Container
5
+
6
+ def pub(*)
7
+ raise NotImplementedError
8
+ end
9
+
10
+ def sub(*)
11
+ raise NotImplementedError
12
+ end
13
+
14
+ def unsub(*)
15
+ raise NotImplementedError
16
+ end
17
+
18
+ protected
19
+
20
+ def retrieve_klasses(iterable)
21
+ iterable.map{|clazz| clazz.split('::').inject(Object) {|o,c| o.const_get c}}
22
+ end
23
+
24
+ def fan_out(clazzes, args)
25
+ mutex = Mutex.new
26
+
27
+ mutex.synchronize do
28
+ clazzes.each{ |clazz| clazz.call(args) }
29
+ true
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ require "request_store"
3
+
4
+ module PubSub
5
+ class Hash < Container
6
+ def initialize
7
+ RequestStore.store[:hash] = {}
8
+ end
9
+
10
+ def pub(event, args={})
11
+ iterable_subscriber_list = RequestStore.store[:hash][event]
12
+ return false unless iterable_subscriber_list
13
+
14
+ clazzes = retrieve_klasses(iterable_subscriber_list)
15
+ fan_out(clazzes, args)
16
+ end
17
+
18
+ def sub(event, klazz_name)
19
+ mutex = Mutex.new
20
+
21
+ mutex.synchronize do
22
+ RequestStore.store[:hash][event] = [] unless RequestStore.store[:hash][event]
23
+ RequestStore.store[:hash][event] << klazz_name unless RequestStore.store[:hash][event].include?(klazz_name)
24
+ end
25
+ true
26
+ end
27
+
28
+ def unsub(event, klazz_name)
29
+ mutex = Mutex.new
30
+
31
+ mutex.synchronize do
32
+ return false unless RequestStore.store[:hash][event]
33
+
34
+ RequestStore.store[:hash][event].delete(klazz_name)
35
+ true
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PubSub
4
+ module Publisher
5
+ Error = Class.new(StandardError)
6
+
7
+ def self.included(base)
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+ def pub(event, args={})
13
+ PubSub::Configuration.container.pub(event, args)
14
+ true
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PubSub
4
+ module Subscriber
5
+ Error = Class.new(StandardError)
6
+
7
+ def self.included(base)
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+ def sub(event)
13
+ PubSub::Configuration.container.sub(event, self.name)
14
+ true
15
+ end
16
+
17
+ def unsub(event)
18
+ PubSub::Configuration.container.unsub(event, self.name)
19
+ true
20
+ end
21
+ end
22
+ end
23
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pub-sub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleg Saltykov
@@ -15,7 +15,12 @@ email:
15
15
  executables: []
16
16
  extensions: []
17
17
  extra_rdoc_files: []
18
- files: []
18
+ files:
19
+ - lib/pub_sub/configuration.rb
20
+ - lib/pub_sub/container.rb
21
+ - lib/pub_sub/hash.rb
22
+ - lib/pub_sub/publisher.rb
23
+ - lib/pub_sub/subscriber.rb
19
24
  homepage: https://github.com/nucleom42/pub-sub
20
25
  licenses:
21
26
  - MIT