evil_events 0.1.0rc4 → 0.1.0rc5

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
  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