evil_events 0.1.0rc4 → 0.1.0rc5

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
  SHA1:
3
- metadata.gz: c736b2f681a527cc5c3f01b2463954b8206864a2
4
- data.tar.gz: 5de17389672409a9a313820d9b1dbdbdbc86d17e
3
+ metadata.gz: 433dcd60c4b1a754d00e5a40051f8fce7f2b12c2
4
+ data.tar.gz: 01a0271699af053fdb782fc7cf45fa888ecb64bd
5
5
  SHA512:
6
- metadata.gz: c570fc9dedbdf9b8ee66cbf735a59d89cfe2ffc33e70c6a0b1e6866388379a06acd9ccd836e718ab9530d4626e04cb0d679891dbdd97b66c69d28f6cf1207079
7
- data.tar.gz: 0c65ec58f6114b0a469307920ba246eea79f0642b9e68ba8be75b2267886bb6778b1b9c2aeeb8b64b200ba4119c60cd5545b42ed0aabd5546adab7cff68fb848
6
+ metadata.gz: e1f5c5576c528da60b273de597037843801ba553e645895518595e8eeeb2b58b6c9136c392bdb12f657b813b755a4fc61d7f47fa9008a8b038d27b4f8b37f443
7
+ data.tar.gz: 1cb7b235ac6cbb07760cf6459f2e5848aabf35e9dcaf290b7c52d8d25c1a43ae313fe4706859c587f17745c66ea4792ac6b0c8fbebd781001aa4a8b4058d59f2
data/README.md CHANGED
@@ -4,62 +4,10 @@
4
4
  [![Build Status](https://travis-ci.org/ergosploit/evil_events.svg?branch=master)](https://travis-ci.org/ergosploit/evil_events)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/ergosploit/evil_events/badge.svg?branch=master)](https://coveralls.io/github/ergosploit/evil_events?branch=master)
6
6
 
7
- ### Proof of Concept
8
-
9
- ```ruby
10
- # 0. Subscribers:
11
- EventStore = Concurrent::Array.new
12
- ElasticStore = Concurrent::Array.new
13
-
14
- # 1. Create events:
15
- class UserRegistered < EvilEvents::Event['user_registered']
16
- payload :user_id, EvilEvents::Types::Strict::Int
17
- payload :ref_link, EvilEvents::Types::Strict::String.default('undefined')
18
-
19
- metadata :uuid, EvilEvents::Types::String.default('shared-uuid')
20
- metadata :timestamp, EvilEvents::Types::Time.default { Time.now }
21
-
22
- observe EventStore, delegator: :push
23
- observe ElasticStore, delegator: :<<
24
-
25
- adapter :memory_async
26
- end
27
-
28
- MatchLost = EvilEvents::Event.define('match_lost') do
29
- default_delegator :push
30
-
31
- payload :player_id
32
- payload :score
33
-
34
- metadata :timestamp, EvilEvents::Types::Time.default { Time.now }
35
-
36
- observe EventStore
37
-
38
- adapter :memory_sync
39
- end
40
-
41
- # 2. Emit via object or via event attributes:
42
- UserRegistered.new(payload: { user_id: 1, ref_id: 5 }, metadata: { uuid: 1_111 }).emit!
43
- EvilEvents::Event.emit('user_registered', payload: { user_id: 2, ref_id: 7 })
44
- EvilEvents::Event.emit('match_lost', payload: { player_id: 5, score: '2-1' })
45
-
46
- # 3. Logs:
47
- # => INFO -- [EvilEvents:EventEmitted(memory_async)]: Type: user_registered :: Payload: {:user_id=>1, :ref_id=>5} :: Metadata: {:uuid=>1111, :timestamp=>2017-10-15 20:08:09 +0300}
48
- # => INFO -- [EvilEvents:EventEmitted(memory_async)]: Type: user_registered :: Payload: {:user_id=>2, :ref_id=>7} :: Metadata: {:uuid=>"shared-uuid", :timestamp=>2017-10-15 20:08:09 +0300}
49
- # => INFO -- [EvilEvents:EventEmitted(memory_sync)]: Type: match_lost :: Payload: {:player_id=>5, :score=>"2-1"} :: Metadata: {:timestamp=>2017-10-15 20:08:09 +0300}
50
-
51
- # 4. State of observers:
52
- EventStore # => [#<UserRegistered...>, #<UserRegistered...>, <#MatchLost...>]
53
- ElasticStore # => [#<UserRegistered...>, #<UserRegistered...>]
54
- ```
55
-
56
7
  ### ROADMAP
57
8
  - Basic documentation (README) (0.1.0)
58
9
  - FULL documentation (0.1.1)
59
10
  - Notifier abstraction (0.2.0)
60
11
  - Event sourcing (0.3.0)
61
- - RSpec matchers (separated gem)
62
12
  - Concrete error messages for exceptions (0.1.1)
63
13
  - Hooks (0.2.0)
64
- - Scheduling (0.2.0)
65
- - Event logic (0.2.0)
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @api public
4
+ # @since 0.1.0
5
+ module EvilEvents::Config::Adapters
6
+ class << self
7
+ # @api public
8
+ # @since 0.1.0
9
+ def register(adapter_name, adapter_object)
10
+ EvilEvents::BootPoint[:event_system].register_adapter(adapter_name, adapter_object)
11
+ end
12
+ end
13
+ end
@@ -34,4 +34,6 @@ module EvilEvents
34
34
 
35
35
  setting :logger, EvilEvents::Shared::Logger.new(STDOUT), reader: true
36
36
  end
37
+
38
+ require_relative 'config/adapters'
37
39
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EvilEvents::Core::Broadcasting
4
+ # @api private
4
5
  # @since 0.1.0
5
6
  class Adapters
6
7
  extend EvilEvents::Shared::DependencyContainer::Mixin
@@ -2,13 +2,9 @@
2
2
 
3
3
  module EvilEvents::Core::Broadcasting
4
4
  class Dispatcher
5
- # @api public
5
+ # @api private
6
6
  # @since 0.1.0
7
- module Mixin
8
- # @param event [EvilEvents::Core::Events::AbstractEvent]
9
- # @return void
10
- #
11
- # @since 0.1.0
7
+ Mixin = EvilEvents::Shared::ClonableModuleBuilder.build do
12
8
  def dispatch(event)
13
9
  Dispatcher.dispatch(event)
14
10
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EvilEvents::Core
4
+ # @api private
4
5
  # @since 0.1.0
5
6
  module Broadcasting
6
7
  require_relative 'broadcasting/dispatcher'
@@ -24,7 +24,8 @@ module EvilEvents::Core::Events
24
24
  # @since 0.1.0
25
25
  extend EvilEvents::Shared::CombinedContextMixin
26
26
 
27
- # @param payload_attributes [Hash]
27
+ # @option payload [Hash]
28
+ # @option metadata [Hash]
28
29
  #
29
30
  # @since 0.1.0
30
31
  def initialize(payload: {}, metadata: {})
@@ -1,25 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # TODO: dry and refactor with AbstractPayload
4
3
  module EvilEvents::Core::Events::EventExtensions::MetadataExtendable
5
- # @abstract
6
4
  # @api private
7
5
  # @since 0.1.0
8
- class AbstractMetadata < EvilEvents::Shared::Structure
9
- class << self
10
- # @since 0.1.0
11
- alias_method :_native_attribute, :attribute
12
-
13
- # @param key [Symbol]
14
- # @param type [EvilEvents::Shared::Types::Any]
15
- #
16
- # @since 0.1.0
17
- def attribute(key, type = EvilEvents::Types::Any)
18
- _native_attribute(key, type)
19
- end
20
- end
21
-
22
- # NOTE: dry-struct API + dry-initializer API
23
- constructor_type :strict_with_defaults
24
- end
6
+ AbstractMetadata = Class.new(EvilEvents::Shared::Structure)
25
7
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # TODO: refactor with EvilEvents::Core::Events::EventExtensions::Payloadable
4
3
  module EvilEvents::Core::Events::EventExtensions
5
4
  # @api private
6
5
  # @since 0.1.0
@@ -1,25 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # TODO: dry and refactor with AbstractMetadata
4
3
  module EvilEvents::Core::Events::EventExtensions::Payloadable
5
- # @abstract
6
4
  # @api private
7
5
  # @since 0.1.0
8
- class AbstractPayload < EvilEvents::Shared::Structure
9
- class << self
10
- # @since 0.1.0
11
- alias_method :_native_attribute, :attribute
12
-
13
- # @param key [Symbol]
14
- # @param type [EvilEvents::Shared::Types::Any]
15
- #
16
- # @since 0.1.0
17
- def attribute(key, type = EvilEvents::Types::Any)
18
- _native_attribute(key, type)
19
- end
20
- end
21
-
22
- # NOTE: dry-struct API + dry-initializer API
23
- constructor_type :strict_with_defaults
24
- end
6
+ AbstractPayload = Class.new(EvilEvents::Shared::Structure)
25
7
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # TODO: refactor with EvilEvents::Core::Events::EventExtensions::MetadataExtendable
4
3
  module EvilEvents::Core::Events::EventExtensions
5
4
  # @api private
6
5
  # @since 0.1.0
@@ -6,7 +6,7 @@ module EvilEvents::Core::Events
6
6
  module ManagerFactory
7
7
  # @since 0.1.0
8
8
  ManagerFactoryError = Class.new(StandardError)
9
- # @sicne 0.1.0
9
+ # @since 0.1.0
10
10
  IncorrectEventClassError = Class.new(ManagerFactoryError)
11
11
 
12
12
  class << self
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EvilEvents::Core
4
+ # @api private
4
5
  # @since 0.1.0
5
6
  module Events
6
7
  require_relative 'events/serializers'
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EvilEvents::Shared
4
+ # @api public
5
+ # @since 0.1.0
6
+ module ClonableModuleBuilder
7
+ class << self
8
+ # @param module_definitions [Proc]
9
+ # @return [Module]
10
+ #
11
+ # @since 0.1.0
12
+ def build(&module_definitions)
13
+ Module.new do
14
+ class_eval(&module_definitions) if block_given?
15
+
16
+ singleton_class.instance_eval do
17
+ define_method :module do
18
+ Module.new { class_eval(&module_definitions) if block_given? }
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -46,6 +46,11 @@ module EvilEvents
46
46
  # @since 0.1.0
47
47
  attr_reader :__outer_context__
48
48
 
49
+ # @return [::Kernel]
50
+ #
51
+ # @since 0.1.0
52
+ attr_reader :__kernel_context__
53
+
49
54
  # @return [Proc]
50
55
  #
51
56
  # @since 0.1.0
@@ -60,6 +65,7 @@ module EvilEvents
60
65
 
61
66
  @__required_context__ = required_context
62
67
  @__outer_context__ = ::Kernel.eval('self', clojure.binding)
68
+ @__kernel_context__ = ::Kernel
63
69
  @__clojure__ = clojure
64
70
  end
65
71
 
@@ -81,8 +87,8 @@ module EvilEvents
81
87
  __outer_context__.public_send(method_name, *arguments, &block)
82
88
  when __required_context__.respond_to?(method_name)
83
89
  __required_context__.public_send(method_name, *arguments, &block)
84
- when ::Kernel.respond_to?(method_name)
85
- ::Kernel.public_send(method_name, *arguments, &block)
90
+ when __kernel_context__.respond_to?(method_name)
91
+ __kernel_context__.public_send(method_name, *arguments, &block)
86
92
  else
87
93
  super
88
94
  end
@@ -93,7 +99,8 @@ module EvilEvents
93
99
  # @since 0.1.0
94
100
  def respond_to_missing?(method_name, include_private = false)
95
101
  __outer_context__.respond_to?(method_name) ||
96
- __required_context__.respond_to?(method_name) || super
102
+ __required_context__.respond_to?(method_name) ||
103
+ __kernel_context__.respond_to?(method_name) || super
97
104
  end
98
105
 
99
106
  # @see #method_missing
@@ -106,8 +113,8 @@ module EvilEvents
106
113
  __outer_context__.method(method_name)
107
114
  when __required_context__.respond_to?(method_name)
108
115
  __required_context__.method(method_name)
109
- when ::Kernel.respond_to?(method_name)
110
- ::Kernel.method(method_name)
116
+ when __kernel_context__.respond_to?(method_name)
117
+ __kernel_context__.method(method_name)
111
118
  else
112
119
  super
113
120
  end
@@ -3,5 +3,21 @@
3
3
  module EvilEvents::Shared
4
4
  # @api public
5
5
  # @since 0.1.0
6
- Structure = Dry::Struct
6
+ class Structure < Dry::Struct
7
+ class << self
8
+ # @since 0.1.0
9
+ alias_method :_native_attribute, :attribute
10
+
11
+ # @param key [Symbol]
12
+ # @param type [EvilEvents::Shared::Types::Any]
13
+ #
14
+ # @since 0.1.0
15
+ def attribute(key, type = EvilEvents::Shared::Types::Any)
16
+ _native_attribute(key, type)
17
+ end
18
+ end
19
+
20
+ # NOTE: dry-struct API + dry-initializer API
21
+ constructor_type :strict_with_defaults
22
+ end
7
23
  end
@@ -13,5 +13,6 @@ module EvilEvents
13
13
  require_relative 'shared/dependency_container'
14
14
  require_relative 'shared/mockable_class_builder'
15
15
  require_relative 'shared/combined_context_mixin'
16
+ require_relative 'shared/clonable_module_builder'
16
17
  end
17
18
  end
@@ -38,5 +38,14 @@ class EvilEvents::System
38
38
  def resolve_adapter(adapter_name)
39
39
  EvilEvents::Core::Broadcasting::Adapters.resolve(adapter_name)
40
40
  end
41
+
42
+ # @param adapter_name [Symbol, String]
43
+ # @param adapter_object [Object]
44
+ # @return void
45
+ #
46
+ # @since 0.1.0
47
+ def register_adapter(adapter_name, adapter_object)
48
+ EvilEvents::Core::Broadcasting::Adapters.register(adapter_name, adapter_object)
49
+ end
41
50
  end
42
51
  end
@@ -11,9 +11,7 @@ class EvilEvents::System
11
11
  #
12
12
  # @since 0.1.0
13
13
  def define_event_class(event_type, &event_class_definitions)
14
- EvilEvents::Core::Events::EventClassFactory.create(
15
- event_type, &event_class_definitions
16
- )
14
+ EvilEvents::Core::Events::EventClassFactory.create(event_type, &event_class_definitions)
17
15
  end
18
16
 
19
17
  # @param event_type [String]
@@ -21,25 +19,23 @@ class EvilEvents::System
21
19
  #
22
20
  # @since 0.1.0
23
21
  def define_abstract_event_class(event_type)
24
- EvilEvents::Core::Events::EventClassFactory.create_abstract(
25
- event_type
26
- )
22
+ EvilEvents::Core::Events::EventClassFactory.create_abstract(event_type)
27
23
  end
28
24
 
29
25
  # @param serialized_event [String]
30
- # @return [Class{EvilEvents::Core::Events::AbstractEvent}]
26
+ # @return [EvilEvents::Core::Events::AbstractEvent]
31
27
  #
32
28
  # @since 0.1.0
33
29
  def deserialize_from_json(serialized_event)
34
- EvilEvents::Core::Events::Serializer.resolve[:json].deserialize(serialized_event)
30
+ EvilEvents::Core::Events::Serializers.resolve(:json).deserialize(serialized_event)
35
31
  end
36
32
 
37
33
  # @param serialized_event [Hash]
38
- # @return [Class{EvilEvents::Core::Events::AbstractEvent}]
34
+ # @return [EvilEvents::Core::Events::AbstractEvent]
39
35
  #
40
36
  # @since 0.1.0
41
37
  def deserialize_from_hash(serialized_event)
42
- EvilEvents::Core::Events::Serializer.resolve[:hash].deserialize(serialized_event)
38
+ EvilEvents::Core::Events::Serializers.resolve(:hash).deserialize(serialized_event)
43
39
  end
44
40
  end
45
41
  end
@@ -76,7 +76,8 @@ class EvilEvents::System
76
76
  end
77
77
 
78
78
  # @param event_type [String]
79
- # @param event_attributes [Hash]
79
+ # @option payload [Hash]
80
+ # @option metadata [Hash]
80
81
  # @return [EvilEvents::Core::Events::AbstractEvent]
81
82
  #
82
83
  # @since 0.1.0
@@ -39,6 +39,10 @@ class EvilEvents::System
39
39
  # @since 0.1.0
40
40
  def resolve_adapter(adapter_name); end
41
41
 
42
+ # @see EvilEvents::System
43
+ # @since 0.1.0
44
+ def register_adapter(adapter_name, adapter_object); end
45
+
42
46
  # @see EvilEvents::System
43
47
  # @since 0.1.0
44
48
  def register_event_class(event_class); end
@@ -19,7 +19,8 @@ class EvilEvents::System
19
19
  def_delegators :broadcaster,
20
20
  :emit,
21
21
  :raw_emit,
22
- :resolve_adapter
22
+ :resolve_adapter,
23
+ :register_adapter
23
24
 
24
25
  # @see EvilEvents::System::EventManager
25
26
  # @since 0.1.0
@@ -3,5 +3,5 @@
3
3
  module EvilEvents
4
4
  # @api public
5
5
  # @since 0.1.0
6
- VERSION = '0.1.0rc4'
6
+ VERSION = '0.1.0rc5'
7
7
  end
data/lib/evil_events.rb CHANGED
@@ -23,6 +23,10 @@ module EvilEvents
23
23
  # @since 0.1.0
24
24
  Types = Shared::Types
25
25
 
26
+ # @api public
27
+ # @since 0.1.0
28
+ DispatcherMixin = EvilEvents::Core::Broadcasting::Dispatcher::Mixin.module
29
+
26
30
  # @api public
27
31
  # @since 0.1.0
28
32
  module Serializer
@@ -45,32 +49,34 @@ module EvilEvents
45
49
 
46
50
  # @api public
47
51
  # @since 0.1.0
48
- module Event
52
+ module Emitter
49
53
  class << self
50
54
  # @see EvilEvents::System
51
55
  # @api public
52
56
  # @since 0.1.0
53
- def [](event_type)
54
- EvilEvents::BootPoint[:event_system].define_abstract_event_class(
55
- event_type
56
- )
57
+ def emit(event_type, **event_attributes)
58
+ EvilEvents::BootPoint[:event_system].raw_emit(event_type, **event_attributes)
57
59
  end
60
+ end
61
+ end
58
62
 
63
+ # @api public
64
+ # @since 0.1.0
65
+ module Event
66
+ class << self
59
67
  # @see EvilEvents::System
60
68
  # @api public
61
69
  # @since 0.1.0
62
- def define(event_type, &event_class_definitions)
63
- EvilEvents::BootPoint[:event_system].define_event_class(
64
- event_type, &event_class_definitions
65
- )
70
+ def [](event_type)
71
+ EvilEvents::BootPoint[:event_system].define_abstract_event_class(event_type)
66
72
  end
67
73
 
68
74
  # @see EvilEvents::System
69
75
  # @api public
70
76
  # @since 0.1.0
71
- def emit(event_type, **event_attributes)
72
- EvilEvents::BootPoint[:event_system].raw_emit(
73
- event_type, **event_attributes
77
+ def define(event_type, &event_class_definitions)
78
+ EvilEvents::BootPoint[:event_system].define_event_class(
79
+ event_type, &event_class_definitions
74
80
  )
75
81
  end
76
82
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evil_events
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0rc4
4
+ version: 0.1.0rc5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rustam Ibragimov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-15 00:00:00.000000000 Z
11
+ date: 2017-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-monads
@@ -229,7 +229,6 @@ extensions: []
229
229
  extra_rdoc_files: []
230
230
  files:
231
231
  - ".gitignore"
232
- - ".hound.yml"
233
232
  - ".jrubyrc"
234
233
  - ".rspec"
235
234
  - ".rubocop.yml"
@@ -246,6 +245,7 @@ files:
246
245
  - lib/evil_events.rb
247
246
  - lib/evil_events/boot_point.rb
248
247
  - lib/evil_events/config.rb
248
+ - lib/evil_events/config/adapters.rb
249
249
  - lib/evil_events/core.rb
250
250
  - lib/evil_events/core/activity_logger.rb
251
251
  - lib/evil_events/core/broadcasting.rb
@@ -278,6 +278,7 @@ files:
278
278
  - lib/evil_events/core/events/subscriber.rb
279
279
  - lib/evil_events/core/events/subscriber/mixin.rb
280
280
  - lib/evil_events/shared.rb
281
+ - lib/evil_events/shared/clonable_module_builder.rb
281
282
  - lib/evil_events/shared/combined_context.rb
282
283
  - lib/evil_events/shared/combined_context_mixin.rb
283
284
  - lib/evil_events/shared/configurable.rb
data/.hound.yml DELETED
@@ -1,2 +0,0 @@
1
- ruby:
2
- config_file: .rubocop.yml