nexus_cqrs 0.0.13 → 0.3.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: cdfe50446a77c51b914898af69e47f8cb90d5bbaf6b952570722bf22c5f1c216
4
- data.tar.gz: 50117d1c8c04e2855a966357038ce57c71f39c527b240b36a57c5862058cc64e
3
+ metadata.gz: c4e6e4a145007fe8658503e9745e3be716436749d9bea2c714bca1d47b1ea4ab
4
+ data.tar.gz: aedbcb7c36185faf7d546e3ea5c268cba6642d0880a0a2c2cdf612e761f5096c
5
5
  SHA512:
6
- metadata.gz: 8c2fce71a6eb75cf91a616dbaea01e6cc572a16d2ddc3d58036b61345e0c10d99120d24c15eb2c2fa02590131d4dc89ba2926ebd722a3d0555ff52de8801015b
7
- data.tar.gz: 582a7d078d000a12fe16959bb20da9c4b65770d6dc6c4dc13e9e6f53aa5dce11768ba4b15771dd7e0c9dbec790fe8b547a35c7b38f4f7bd0b44b371395bf3d4d
6
+ metadata.gz: 83c240bd9f056d0d82e5437f52c45527be6092e83f6356c765bfa127153d8d5c5c660437598707fb470879606ede7c9fc1a28f11e42355401b177c29b37e7c45
7
+ data.tar.gz: 0dab29f1d52e3f4110cfb948ffbe425c342f682c01f1945ceced2385aa022201e84c7025b1cc7eb633110029efdf4e7b5e0366baf2b7466183a164a040df5ff3
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.3.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.
@@ -2,7 +2,7 @@ Description:
2
2
  Generates a new Query object, along with the QueryHandler
3
3
 
4
4
  Example:
5
- rails generate cqrs:query GetUserById
5
+ rails generate cqrs:query GetUserById --permission
6
6
 
7
7
  This will create:
8
8
  app/domain/queries/get_user_by_id.rb
@@ -1,30 +1,30 @@
1
+ # frozen_string_literal: true
1
2
  require 'rails/generators/base'
2
3
 
3
4
  module NexusCqrs
4
5
  class CommandGenerator < Rails::Generators::NamedBase
5
6
  source_root File.expand_path('templates', __dir__)
7
+ class_option :permission, type: :string, default: nil
6
8
 
7
9
  def copy_command_file
8
10
  file_path = class_name.underscore
9
11
 
12
+ @permission = options['permission']
13
+
10
14
  template('command.rb', "app/domain/commands/#{file_path}.rb")
11
15
  template('command_handler.rb', "app/domain/commands/#{file_path}_handler.rb")
12
16
 
13
- register_command(class_name)
17
+ register_command
14
18
  end
15
19
 
16
20
  private
17
21
 
18
- def register_command(full_name)
22
+ def register_command
19
23
  handler_config = 'config/initializers/register_cqrs_handlers.rb'
20
24
 
21
25
  unless File.exist?('config/initializers/register_cqrs_handlers.rb')
22
26
  template('register_cqrs_handlers.rb', handler_config)
23
27
  end
24
-
25
- code_to_inject = "$COMMAND_EXECUTOR.register_command(#{full_name}, #{full_name}Handler.new)\n"
26
-
27
- inject_into_file(handler_config, code_to_inject, after: "# Register Commands\n")
28
28
  end
29
29
  end
30
30
  end
@@ -1,30 +1,30 @@
1
+ # frozen_string_literal: true
1
2
  require 'rails/generators/base'
2
3
 
3
4
  module NexusCqrs
4
5
  class QueryGenerator < Rails::Generators::NamedBase
5
6
  source_root File.expand_path('templates', __dir__)
7
+ class_option :permission, type: :string, default: nil
6
8
 
7
9
  def copy_query_file
8
10
  file_path = class_name.underscore
9
11
 
12
+ @permission = options['permission']
13
+
10
14
  template('query.rb', "app/domain/queries/#{file_path}.rb")
11
15
  template('query_handler.rb', "app/domain/queries/#{file_path}_handler.rb")
12
16
 
13
- register_query(class_name)
17
+ register_query
14
18
  end
15
19
 
16
20
  private
17
21
 
18
- def register_query(full_name)
22
+ def register_query
19
23
  handler_config = 'config/initializers/register_cqrs_handlers.rb'
20
24
 
21
25
  unless File.exist?('config/initializers/register_cqrs_handlers.rb')
22
26
  template('register_cqrs_handlers.rb', handler_config)
23
27
  end
24
-
25
- code_to_inject = "$QUERY_EXECUTOR.register_command(#{full_name}, #{full_name}Handler.new)\n"
26
-
27
- inject_into_file(handler_config, code_to_inject, after: "# Register Queries\n")
28
28
  end
29
29
  end
30
30
  end
@@ -1,9 +1,26 @@
1
+ # frozen_string_literal: true
1
2
  module Commands
2
- class <%= class_name %>Handler < NexusCqrs::BaseCommandHandler
3
+ # Command handler
4
+ class <%= class_name %>Handler < BaseCommandHandler
5
+ <% if @permission %>include NexusCqrs::Helpers<% end %>
3
6
 
4
- # call is where the Command is executed
7
+ # @param [<%= class_name %>] command
5
8
  def call(command)
9
+ <% if @permission %>authorize(command, Model)<% end %>
6
10
 
11
+ domain_event(command)
7
12
  end
13
+
14
+ private
15
+
16
+ def domain_event(command)
17
+ NexusDomainEvents::Event.new(
18
+ message_name: :ENTITY_WAS_ACTIONED,
19
+ actor: command.metadata[:current_user].member_id,
20
+ payload: {
21
+ object_id: command.id,
22
+ }
23
+ )
24
+ end
8
25
  end
9
26
  end
@@ -1,9 +1,10 @@
1
1
  module Queries
2
2
  class <%= class_name %>Handler < NexusCqrs::BaseQueryHandler
3
+ <% if @permission %>include NexusCqrs::Helpers<% end %>
3
4
 
4
- # call is where the Query is executed
5
+ # @param [<%= class_name %>] command
5
6
  def call(command)
6
-
7
+ <% if @permission %>authorize(command, Model)<% end %>
7
8
  end
8
9
  end
9
10
  end
@@ -1,9 +1,26 @@
1
- command_bus = NexusCqrs::CommandBus.new
2
- query_bus = NexusCqrs::CommandBus.new
1
+ # frozen_string_literal: true
2
+ Rails.configuration.to_prepare do
3
3
 
4
- $COMMAND_EXECUTOR = NexusCqrs::CommandExecutor.new command_bus
5
- $QUERY_EXECUTOR = NexusCqrs::CommandExecutor.new query_bus
4
+ middleware_stack = Middleware::Builder.new do |b|
5
+ b.use(NexusCqrsAuth::AuthMiddleware)
6
+ end
6
7
 
7
- # Register Queries
8
+ command_bus = NexusCqrs::CommandBus.new(middleware: middleware_stack)
9
+ query_bus = NexusCqrs::CommandBus.new(middleware: middleware_stack)
8
10
 
9
- # Register Commands
11
+ $COMMAND_EXECUTOR = NexusCqrs::CommandExecutor.new(command_bus)
12
+ $QUERY_EXECUTOR = NexusCqrs::CommandExecutor.new(query_bus)
13
+
14
+ # Register Commands
15
+ $QUERY_EXECUTOR.configure_handlers do |executor|
16
+ # Manually registered queries should always go above the autoregister
17
+
18
+ executor.autoregister(NexusCqrs::BaseQuery, 'app/domain/queries')
19
+ end
20
+
21
+ $COMMAND_EXECUTOR.configure_handlers do |executor|
22
+ # Manually registered commands should always go above the autoregister
23
+
24
+ executor.autoregister(NexusCqrs::BaseCommand, 'app/domain/commands')
25
+ end
26
+ end
@@ -1,4 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  module NexusCqrs
2
- class BaseCommand
3
+ class BaseCommand < BaseMessage
3
4
  end
4
5
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module NexusCqrs
2
3
  class BaseCommandHandler
3
4
  def call(command)
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ module NexusCqrs
3
+ class BaseMessage
4
+ def set_metadata(key, value)
5
+ @metadata = {} unless @metadata
6
+ @metadata[key.to_sym] = value
7
+ end
8
+
9
+ def metadata
10
+ @metadata || {}
11
+ end
12
+
13
+ def to_h
14
+ hash = instance_variables.each_with_object({}) do |var, acc|
15
+ acc[var.to_s[1..-1].to_sym] = instance_variable_get(var)
16
+ end
17
+ hash[:metadata] = @metadata || {}
18
+ hash
19
+ end
20
+
21
+ def policy_class
22
+ demodularised_class_name + 'Policy'
23
+ end
24
+
25
+ def demodularised_class_name
26
+ self.class.name.split('::').last
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+ module NexusCqrs
3
+ class BaseMiddleware
4
+ def initialize(next_)
5
+ @next = next_
6
+ end
7
+
8
+ # @param [BaseMessage] message
9
+ def call(message)
10
+ end
11
+ end
12
+ end
@@ -1,4 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  module NexusCqrs
2
- class BaseQuery
3
+ class BaseQuery < BaseMessage
3
4
  end
4
5
  end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  module NexusCqrs
2
3
  class BaseQueryHandler
3
- def call(command)
4
+ def call(query)
4
5
  end
5
6
  end
6
7
  end
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
1
2
  require 'thread_safe'
3
+ require 'middleware'
2
4
 
3
5
  module NexusCqrs
4
6
  class CommandBus
5
7
  UnregisteredHandler = Class.new(StandardError)
6
8
  MultipleHandlers = Class.new(StandardError)
7
9
 
8
- def initialize
9
- @handlers =
10
- ThreadSafe::Cache.new
10
+ def initialize(middleware: nil)
11
+ @handlers = ThreadSafe::Cache.new
12
+ @middleware = middleware || Middleware::Builder.new
11
13
  end
12
14
 
13
15
  def register(klass, handler)
@@ -17,19 +19,27 @@ module NexusCqrs
17
19
  end
18
20
 
19
21
  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)
22
+ runner = Middleware::Builder.new
23
+ runner.use(@middleware)
24
+ runner.use(->(command_) { handler_for_command(command_).call(command_) })
25
+ runner.call(command)
25
26
  end
26
27
 
27
28
  def registered_handlers
28
29
  handlers
29
30
  end
30
31
 
31
- private
32
+ def clear_handlers
33
+ @handlers = ThreadSafe::Cache.new
34
+ end
32
35
 
33
36
  attr_reader :handlers
37
+
38
+ private
39
+
40
+ def handler_for_command(command)
41
+ unregistered_handler = proc { raise UnregisteredHandler, "Missing handler for #{command.class}" }
42
+ handlers.fetch(command.class, &unregistered_handler)
43
+ end
34
44
  end
35
45
  end
@@ -1,24 +1,70 @@
1
+ # frozen_string_literal: true
1
2
  module NexusCqrs
2
3
  class CommandExecutor
4
+ # @param [NexusCqrs::CommandBus] command_bus
3
5
  def initialize(command_bus)
4
6
  @bus = command_bus
7
+ end
8
+
9
+ def autoregister(base_class, dir = 'app/domain/commands', ignore_strings = ['.rb', 'app/domain/'])
10
+
11
+ # Iterate over the director passed and find all ruby files, removing unwanted parts of the string.
12
+ Dir["#{dir}/*.rb"].each do |file|
13
+ ignore_strings.each { |i|
14
+ file.slice!(i)
15
+ }
16
+ begin
17
+ # Constantize class name to constant to force rails to autoload this class
18
+ file.camelize.constantize
19
+ rescue NameError => e
20
+ puts "WARN: Tried to autoregister #{file.camelize} but class could not be found"
21
+ end
22
+ end
23
+
24
+ ObjectSpace.each_object(Class).select { |klass| klass < base_class }.each do |c|
25
+ handler_name = (c.to_s + "Handler")
26
+ begin
27
+ handler = handler_name.constantize.new
28
+ rescue NameError => e
29
+ Rails.logger.error "WARN: A command/query called `#{c}` tried to autoregister `#{handler_name}` but the class was not found"
30
+ next
31
+ end
5
32
 
6
- register_commands
33
+ if handler.respond_to?(:call)
34
+ register_command(c, handler)
35
+ else
36
+ Rails.logger.error "WARN: A command/query called `#{c}` tried to autoregister `#{handler_name}` but the class did not have a `call` method"
37
+ end
38
+ end
7
39
  end
8
40
 
41
+ # Returns the bus used by this executor
42
+ #
43
+ # @return [NexusCqrs::CommandBus] command_bus
44
+ def command_bus
45
+ @bus
46
+ end
47
+
48
+ # @param [NexusCqrs::BaseCommand] command
9
49
  def execute(command)
10
50
  @bus.call(command)
11
51
  end
12
52
 
53
+ # @param [NexusCqrs::BaseCommandHandler] handler
13
54
  def register_command(klass, handler)
14
- Rails.logger.debug("Registered #{klass} to #{handler}")
15
- @bus.register(klass.name, handler)
55
+ @bus.register(klass, handler)
16
56
  end
17
57
 
18
- private
58
+ def reregister_handlers
59
+ return if @register_handlers.nil?
60
+
61
+ @bus.clear_handlers
62
+ @register_handlers.call(self)
63
+ end
19
64
 
20
- def register_commands
21
- # TODO, Register Commands/Queries
65
+ def configure_handlers(&block)
66
+ @register_handlers = block
67
+ @register_handlers.call(self)
22
68
  end
23
69
  end
24
70
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module NexusCqrs
2
3
  module Helpers
3
4
  # Executes a CQRS Command
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module NexusCqrs
2
- VERSION = '0.0.13'
3
+ VERSION = '0.3.0'
3
4
  end
data/lib/nexus_cqrs.rb CHANGED
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+ require 'nexus_cqrs/base_message'
3
+ require 'nexus_cqrs/base_middleware'
1
4
  require 'nexus_cqrs/base_command'
2
5
  require 'nexus_cqrs/base_command_handler'
3
6
  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.13
4
+ version: 0.3.0
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-11 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-11-11 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.31
67
112
  signing_key:
68
113
  specification_version: 4
69
114
  summary: Core package for the nexus cqrs gem