gl_command 1.0.1 → 1.1.0

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
  SHA256:
3
- metadata.gz: 11a5d5ab9dd4a28700cb671153c1a757612f5b735194a28ad22f8be660a09250
4
- data.tar.gz: a3a351134af335563ee6e970d5920d08e52f2b4375cef1c8adc87e555bd1e64f
3
+ metadata.gz: b0e88d785a51d72653d8691d86236df3791dadaa84b46a548895e045509e1428
4
+ data.tar.gz: 582d39e38c74b40ac251dd91071fe602a8860f6ecda15a7ece244e21541352d1
5
5
  SHA512:
6
- metadata.gz: 4344a62dca3bccad299425f9d22db05ca7e3062518c0f4a0c3b1be2d3708de8ccb3d310380c5a4eb73b515a21c4866c8b3385f9ee18c23e9389fd49e9afb8803
7
- data.tar.gz: '08c842fe87ac92bc793fad76498e0b12ecc772a8d5385fea2d5c34670115ba40a17545227e572a5ce1bcee9b3bc6c52f2e70f59e45a8755a871b93ebe3d344a2'
6
+ metadata.gz: e8758b174cdf1f76a4b35d466876a8fbaa848f2546628ea777e7db594a1221a3ca9db2c31f0be77a6d58c62a739f62294e23e63050ed76bd48ca85fcbbfcdb0b
7
+ data.tar.gz: ed20e53cb69da3c59f2919e7f89c505d2470a9fa44138fdd9334c12c6bebcb1c89dd34a9598b9f33a0c0a29ea875fefa7f10c89e16a2d0cfe07fb1bcb133c392
@@ -6,7 +6,7 @@ require 'gl_command/validatable'
6
6
 
7
7
  module GLCommand
8
8
  class Callable
9
- DEFAULT_OPTS = { raise_errors: false, skip_unknown_parameters: true }.freeze
9
+ DEFAULT_OPTS = { raise_errors: false, skip_unknown_parameters: true, in_chain: false }.freeze
10
10
  RESERVED_WORDS = (DEFAULT_OPTS.keys + GLCommand::ChainableContext.reserved_words).sort.freeze
11
11
 
12
12
  class << self
@@ -25,7 +25,8 @@ module GLCommand
25
25
 
26
26
  # DEFAULT_OPTS contains skip_unknown_parameters: true - so it raises on call
27
27
  # (rather than in context initialize) to make errors more legible
28
- opts = DEFAULT_OPTS.merge(raise_errors: args.delete(:raise_errors)).compact
28
+ opts = DEFAULT_OPTS.merge(raise_errors: args.delete(:raise_errors),
29
+ in_chain: args.delete(:in_chain)).compact
29
30
  # args are passed in in perform_call(args) so that invalid args raise in a legible place
30
31
  new(build_context(**args.merge(opts))).perform_call(args)
31
32
  end
@@ -70,7 +71,7 @@ module GLCommand
70
71
  (arguments + returns).uniq
71
72
  end
72
73
 
73
- # Used internally by GLCommand (probably don't reference them in your own GLCommands)
74
+ # Used internally by GLCommand (probably don't reference in your own GLCommands)
74
75
  # is true in GLCommand::Chainable
75
76
  def chain?
76
77
  false
@@ -106,7 +107,9 @@ module GLCommand
106
107
 
107
108
  def perform_call(args)
108
109
  raise_for_invalid_args!(**args)
110
+ instrument_command(:before_call)
109
111
  call_with_callbacks
112
+ instrument_command(:after_call)
110
113
  raise_unless_chained_or_skipped if self.class.chain? # defined in GLCommand::Chainable
111
114
  context.failure? ? handle_failure : context
112
115
  rescue StandardError => e
@@ -133,6 +136,11 @@ module GLCommand
133
136
 
134
137
  private
135
138
 
139
+ # trigger: [:before_call, :after_call, :before_rollback]
140
+ def instrument_command(trigger)
141
+ # Override where gem is used if you want to instrument commands
142
+ end
143
+
136
144
  # rubocop:disable Metrics/AbcSize
137
145
  def handle_failure(e = nil)
138
146
  context.error ||= e
@@ -159,9 +167,7 @@ module GLCommand
159
167
  rescue GLCommand::CommandNoNotifyError
160
168
  raise context.error # makes CommandNoNotifyError the cause
161
169
  end
162
- # rubocop:enable Metrics/AbcSize
163
170
 
164
- # rubocop:disable Metrics/AbcSize
165
171
  def call_with_callbacks
166
172
  GLExceptionNotifier.breadcrumbs(data: { context: context.inspect }, message: self.class.to_s)
167
173
  validate_validatable! # defined in GLCommand::Validatable
@@ -186,6 +192,8 @@ module GLCommand
186
192
  def call_rollbacks
187
193
  return if defined?(@rolled_back) # Not sure this is required
188
194
 
195
+ instrument_command(:before_rollback)
196
+
189
197
  @rolled_back = true
190
198
 
191
199
  chain_rollback if self.class.chain? # defined in GLCommand::Chainable
@@ -41,7 +41,7 @@ module GLCommand
41
41
 
42
42
  commands.map do |command|
43
43
  cargs = context.chain_arguments_and_returns.slice(*command.arguments)
44
- .merge(context.opts_hash)
44
+ .merge(context.opts_hash).merge(in_chain: true)
45
45
 
46
46
  result = command.call(**cargs)
47
47
  context.assign_parameters(skip_unknown_parameters: true, **result.returns)
@@ -7,9 +7,10 @@ require 'active_support/core_ext/module'
7
7
  module GLCommand
8
8
  class Context
9
9
  def initialize(klass, raise_errors: false, skip_unknown_parameters: false,
10
- **arguments_and_returns)
10
+ in_chain: false, **arguments_and_returns)
11
11
  @klass = klass
12
12
  @raise_errors = raise_errors.nil? ? false : raise_errors
13
+ @in_chain = in_chain
13
14
  @klass.arguments_and_returns.each { |key| singleton_class.class_eval { attr_accessor key } }
14
15
  initialize_chain_context(**arguments_and_returns) if chain?
15
16
  assign_parameters(skip_unknown_parameters:, **arguments_and_returns)
@@ -30,6 +31,10 @@ module GLCommand
30
31
  false
31
32
  end
32
33
 
34
+ def in_chain?
35
+ @in_chain
36
+ end
37
+
33
38
  def returns
34
39
  @klass.returns.index_with { |rattr| send(rattr) }
35
40
  end
@@ -1,3 +1,3 @@
1
1
  module GLCommand
2
- VERSION = '1.0.1'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gl_command
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Give Lively
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-19 00:00:00.000000000 Z
11
+ date: 2024-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord