nexus_cqrs 0.0.12 → 0.2.2

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: 194d9582819dfbce269179cd41d5c442a3a66a3797b0d77d09ef80e7343f6b25
4
- data.tar.gz: ff860d659e433356d3ce6880aa445257fb6eab5ee1f9e53ea6e7ef2161e7be2c
3
+ metadata.gz: 24bafc3e27cbf1ef65d1e507bdb2798b67283c92c64b274bbf8818cfffa9618a
4
+ data.tar.gz: e653d3e7b76bc2173a780cf6128974afaecaba8278c0f39e56527ae442395cff
5
5
  SHA512:
6
- metadata.gz: f4d420c2e28c58bfa155ac015f95a3edf51a201bf3e6ab478529b41be162b5cd375c01a0de66ee8559ea07de663bc703f8ae14d19086ea80d879d00158a49c21
7
- data.tar.gz: 134ab0e8e19e9d1e3378f4fe2d8efabb8f469b7924e30bc9685f82e5e4cc7fc0761191e988e80c9c46b3b36d8b9eb7a9232ef65253ce05ac6f6150ff5384cc7a
6
+ metadata.gz: 38a848d5da2a2a61116f1bb2f04df2fae1c0cb368e6482854e0f7896a9bfcd0b2baab39e58c223c2b1f5a1a0c62bc028c0dddf1d2daccebc7268010e9506559c
7
+ data.tar.gz: 6f7b0c32343f39b5b3eb61b9c4afb5cc338bbce81eeb5d998b0d0e1293fe1fa35984264f86ed8fbc8d1a0a29106602566a0ee00096951b4d54fc63ddb3d9f3d7
data/.gitlab-ci.yml CHANGED
@@ -1,5 +1,9 @@
1
1
  image: "ruby:2.7"
2
2
 
3
+ stages:
4
+ - release
5
+ - test
6
+
3
7
  before_script:
4
8
  - sudo apt-get update -qq && sudo apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
5
9
  - ruby -v
@@ -13,4 +17,23 @@ rspec:
13
17
 
14
18
  rubocop:
15
19
  script:
16
- - bundle exec rubocop
20
+ - bundle exec rubocop
21
+
22
+ release:
23
+ stage: release
24
+ rules:
25
+ - if: '$CI_COMMIT_TAG'
26
+ script:
27
+ - mkdir -p ~/.gem
28
+ - cp $RUBYGEMS_CREDENTIALS ~/.gem/credentials
29
+ - chmod 0600 ~/.gem/credentials
30
+ - gem update --system
31
+ - ruby --version
32
+ - gem env version
33
+ - sed -i "s/0.1.0/$CI_COMMIT_TAG/g" lib/nexus_cqrs/version.rb
34
+ - gem build nexus_cqrs.gemspec
35
+ - gem push nexus_cqrs*.gem
36
+ artifacts:
37
+ paths:
38
+ - nexus_cqrs*.gem
39
+ expire_in: 30 days
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/Gemfile CHANGED
@@ -9,3 +9,4 @@ gem 'rubocop-shopify', "~> 1.0.4", require: false
9
9
  gem 'rspec'
10
10
  gem "generator_spec"
11
11
  gem 'thread_safe'
12
+ gem 'ibsciss-middleware'
data/Gemfile.lock CHANGED
@@ -1,7 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nexus_cqrs (0.0.8)
4
+ nexus_cqrs (0.1.0)
5
+ generator_spec
6
+ ibsciss-middleware
7
+ thread_safe
5
8
 
6
9
  GEM
7
10
  remote: https://rubygems.org/
@@ -36,17 +39,13 @@ GEM
36
39
  railties (>= 3.0.0)
37
40
  i18n (1.8.5)
38
41
  concurrent-ruby (~> 1.0)
42
+ ibsciss-middleware (0.4.2)
39
43
  loofah (2.6.0)
40
44
  crass (~> 1.0.2)
41
45
  nokogiri (>= 1.5.9)
42
46
  method_source (1.0.0)
43
47
  mini_portile2 (2.4.0)
44
48
  minitest (5.14.1)
45
- multi_json (1.15.0)
46
- net-scp (3.0.0)
47
- net-ssh (>= 2.6.5, < 7.0.0)
48
- net-ssh (6.1.0)
49
- net-telnet (0.1.1)
50
49
  nokogiri (1.10.10)
51
50
  mini_portile2 (~> 2.4.0)
52
51
  parallel (1.19.2)
@@ -79,9 +78,6 @@ GEM
79
78
  rspec-expectations (3.9.2)
80
79
  diff-lcs (>= 1.2.0, < 2.0)
81
80
  rspec-support (~> 3.9.0)
82
- rspec-its (1.3.0)
83
- rspec-core (>= 3.0.0)
84
- rspec-expectations (>= 3.0.0)
85
81
  rspec-mocks (3.9.1)
86
82
  diff-lcs (>= 1.2.0, < 2.0)
87
83
  rspec-support (~> 3.9.0)
@@ -100,17 +96,6 @@ GEM
100
96
  rubocop-shopify (1.0.4)
101
97
  rubocop (>= 0.85, < 0.87)
102
98
  ruby-progressbar (1.10.1)
103
- serverspec (2.41.5)
104
- multi_json
105
- rspec (~> 3.0)
106
- rspec-its
107
- specinfra (~> 2.72)
108
- sfl (2.3)
109
- specinfra (2.82.19)
110
- net-scp
111
- net-ssh (>= 2.7)
112
- net-telnet (= 0.1.1)
113
- sfl
114
99
  thor (1.0.1)
115
100
  thread_safe (0.3.6)
116
101
  tzinfo (1.2.7)
@@ -123,11 +108,11 @@ PLATFORMS
123
108
 
124
109
  DEPENDENCIES
125
110
  generator_spec
111
+ ibsciss-middleware
126
112
  nexus_cqrs!
127
113
  rspec
128
114
  rubocop
129
115
  rubocop-shopify (~> 1.0.4)
130
- serverspec
131
116
  thread_safe
132
117
 
133
118
  BUNDLED WITH
data/README.md CHANGED
@@ -29,6 +29,32 @@ Generators can be used to aide in the creation of Commands and Queries:
29
29
 
30
30
  Once installed, a CommandBus is required to control the flow of Commands and/or Queries:
31
31
 
32
+ ### Middleware
33
+
34
+ Middleware can be created by extending the base middleware:
35
+
36
+ ```ruby
37
+ class MyMiddleware < NexusCqrs::BaseMiddleware
38
+ def call(command)
39
+ @next.call(command)
40
+ end
41
+ end
42
+ ```
43
+
44
+ The above middleware will pass responsibility for execution to the next responder in the chain.
45
+
46
+ For more information on writing middleware see: https://github.com/Ibsciss/ruby-middleware
47
+
48
+ When creating a bus, middleware can be attached like so:
49
+
50
+ ```ruby
51
+ middleware_stack = Middleware::Builder.new do |b|
52
+ b.use MyMiddleware
53
+ end
54
+
55
+ command_bus = Bus.new(middleware: middleware_stack)
56
+ ```
57
+
32
58
  ## Development
33
59
 
34
60
  To contribute to this gem, simple pull the repository, run `bundle install` and run tests:
@@ -36,4 +62,8 @@ To contribute to this gem, simple pull the repository, run `bundle install` and
36
62
  ```shell script
37
63
  bundle exec rspec
38
64
  bundle exec rubocop
39
- ```
65
+ ```
66
+
67
+ ## Releasing
68
+
69
+ The release process is tied to the git tags. Simply creating a new tag and pushing will trigger a new release to reubygems.
@@ -1,4 +1,4 @@
1
1
  module NexusCqrs
2
- class BaseCommand
2
+ class BaseCommand < BaseMessage
3
3
  end
4
4
  end
@@ -0,0 +1,28 @@
1
+ module NexusCqrs
2
+ class BaseMessage
3
+ def set_metadata(key, value)
4
+ @metadata = {} unless @metadata
5
+ @metadata[key.to_sym] = value
6
+ end
7
+
8
+ def metadata
9
+ @metadata || {}
10
+ end
11
+
12
+ def to_h
13
+ hash = instance_variables.each_with_object({}) do |var, acc|
14
+ acc[var.to_s[1..-1].to_sym] = instance_variable_get(var)
15
+ end
16
+ hash[:metadata] = @metadata || {}
17
+ hash
18
+ end
19
+
20
+ def policy_class
21
+ demodularised_class_name + 'Policy'
22
+ end
23
+
24
+ def demodularised_class_name
25
+ self.class.name.split('::').last
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ module NexusCqrs
2
+ class BaseMiddleware
3
+ def initialize(next_)
4
+ @next = next_
5
+ end
6
+
7
+ # @param [BaseMessage] message
8
+ def call(message)
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,4 @@
1
1
  module NexusCqrs
2
- class BaseQuery
2
+ class BaseQuery < BaseMessage
3
3
  end
4
4
  end
@@ -1,6 +1,6 @@
1
1
  module NexusCqrs
2
2
  class BaseQueryHandler
3
- def call(command)
3
+ def call(query)
4
4
  end
5
5
  end
6
6
  end
@@ -1,13 +1,14 @@
1
1
  require 'thread_safe'
2
+ require 'middleware'
2
3
 
3
4
  module NexusCqrs
4
5
  class CommandBus
5
6
  UnregisteredHandler = Class.new(StandardError)
6
7
  MultipleHandlers = Class.new(StandardError)
7
8
 
8
- def initialize
9
- @handlers =
10
- ThreadSafe::Cache.new
9
+ def initialize(middleware: nil)
10
+ @handlers = ThreadSafe::Cache.new
11
+ @middleware = middleware || Middleware::Builder.new
11
12
  end
12
13
 
13
14
  def register(klass, handler)
@@ -17,19 +18,27 @@ module NexusCqrs
17
18
  end
18
19
 
19
20
  def call(command)
20
- unregistered_handler = proc { raise UnregisteredHandler, "Missing handler for #{command.class}" }
21
-
22
- handlers
23
- .fetch(command.class.name, &unregistered_handler)
24
- .call(command)
21
+ runner = Middleware::Builder.new
22
+ runner.use(@middleware)
23
+ runner.use(->(command_) { handler_for_command(command_).call(command_) })
24
+ runner.call(command)
25
25
  end
26
26
 
27
27
  def registered_handlers
28
28
  handlers
29
29
  end
30
30
 
31
- private
31
+ def clear_handlers
32
+ @handlers = ThreadSafe::Cache.new
33
+ end
32
34
 
33
35
  attr_reader :handlers
36
+
37
+ private
38
+
39
+ def handler_for_command(command)
40
+ unregistered_handler = proc { raise UnregisteredHandler, "Missing handler for #{command.class}" }
41
+ handlers.fetch(command.class, &unregistered_handler)
42
+ end
34
43
  end
35
44
  end
@@ -1,24 +1,30 @@
1
1
  module NexusCqrs
2
2
  class CommandExecutor
3
+ # @param [NexusCqrs::CommandBus] command_bus
3
4
  def initialize(command_bus)
4
5
  @bus = command_bus
5
-
6
- register_commands
7
6
  end
8
7
 
8
+ # @param [NexusCqrs::BaseCommand] command
9
9
  def execute(command)
10
10
  @bus.call(command)
11
11
  end
12
12
 
13
+ # @param [NexusCqrs::BaseCommandHandler] handler
13
14
  def register_command(klass, handler)
14
- Rails.logger.debug("Registered #{klass} to #{handler}")
15
- @bus.register(klass.name, handler)
15
+ @bus.register(klass, handler)
16
16
  end
17
17
 
18
- private
18
+ def reregister_handlers
19
+ return if @register_handlers.nil?
20
+
21
+ @bus.clear_handlers
22
+ @register_handlers.call(self)
23
+ end
19
24
 
20
- def register_commands
21
- # TODO, Register Commands/Queries
25
+ def configure_handlers(&block)
26
+ @register_handlers = block
27
+ @register_handlers.call(self)
22
28
  end
23
29
  end
24
30
  end
@@ -7,12 +7,16 @@ module NexusCqrs
7
7
 
8
8
  # Executes a CQRS Query
9
9
  def query(query)
10
- command_executor.execute(query)
10
+ query_executor.execute(query)
11
11
  end
12
12
 
13
13
  # Provide access to the CQRS executor
14
14
  def command_executor
15
15
  @command_executor ||= $COMMAND_EXECUTOR
16
16
  end
17
+
18
+ def query_executor
19
+ @query_executor ||= $QUERY_EXECUTOR
20
+ end
17
21
  end
18
22
  end
@@ -1,3 +1,3 @@
1
1
  module NexusCqrs
2
- VERSION = '0.0.12'
2
+ VERSION = '0.2.2'
3
3
  end
data/lib/nexus_cqrs.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'nexus_cqrs/base_message'
2
+ require 'nexus_cqrs/base_middleware'
1
3
  require 'nexus_cqrs/base_command'
2
4
  require 'nexus_cqrs/base_command_handler'
3
5
  require 'nexus_cqrs/base_query'
data/nexus_cqrs.gemspec CHANGED
@@ -17,4 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.bindir = 'exe'
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ['lib']
20
+ spec.add_dependency('generator_spec')
21
+ spec.add_dependency('thread_safe')
22
+ spec.add_dependency('ibsciss-middleware')
20
23
  end
metadata CHANGED
@@ -1,15 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexus_cqrs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dean Lovett
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-09 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-08-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: generator_spec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thread_safe
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ibsciss-middleware
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
13
55
  description:
14
56
  email:
15
57
  - dean.lovett@nexusmods.com
@@ -19,6 +61,7 @@ extra_rdoc_files: []
19
61
  files:
20
62
  - ".gitignore"
21
63
  - ".gitlab-ci.yml"
64
+ - ".rspec"
22
65
  - ".rubocop.yml"
23
66
  - CODE_OF_CONDUCT.md
24
67
  - Gemfile
@@ -38,6 +81,8 @@ files:
38
81
  - lib/nexus_cqrs.rb
39
82
  - lib/nexus_cqrs/base_command.rb
40
83
  - lib/nexus_cqrs/base_command_handler.rb
84
+ - lib/nexus_cqrs/base_message.rb
85
+ - lib/nexus_cqrs/base_middleware.rb
41
86
  - lib/nexus_cqrs/base_query.rb
42
87
  - lib/nexus_cqrs/base_query_handler.rb
43
88
  - lib/nexus_cqrs/command_bus.rb
@@ -63,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
63
108
  - !ruby/object:Gem::Version
64
109
  version: '0'
65
110
  requirements: []
66
- rubygems_version: 3.1.2
111
+ rubygems_version: 3.2.26
67
112
  signing_key:
68
113
  specification_version: 4
69
114
  summary: Core package for the nexus cqrs gem