munster 0.2.0 → 0.3.1

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: 2b1a49a264687c05fd36a4331d73d98218d8ff6fcf8f972384fe26db3182a2c5
4
- data.tar.gz: 75102940fdd3d31b317f16fbe05ff8d9135aeed8229c45fb20445348719e7ccd
3
+ metadata.gz: 70c4c7bb98c04fb6e5d429ac03cd9dd8734e8a8d55d8934a1eb41d1a4e359aec
4
+ data.tar.gz: 4d2ec2780fe9900c61512b2cdeb7c70351ec8a80d69bf4a23734e600b69d3a83
5
5
  SHA512:
6
- metadata.gz: f61d40aa299eeed7a67f2998ed346f1655da7c2be4b87f3e2f7d4470b2e0c5eadee345a6fca3f98a2aa85d573ca079e8306b9b97dc2b96f260703159ac7e587c
7
- data.tar.gz: d41554221b5c68ef67e8136bdf7904c6392466a79cf5d0f377e7f5bb8df37ae0b9311d0cbf34bdc5f44876c7e21cecb03e9311fac202d4b98b43a553e91f5e99
6
+ metadata.gz: bb7319560e29abf5011b73e595cba880100402ff03713d9b4d051c8d06b27ff17591703f077f5c5366d2824cf8d8ec4fab93bc72fb74b8c4517215a4aea5e5e2
7
+ data.tar.gz: 0712b43343c58e637d90c4171de3b9e4c5cd8c96815d3afa84ccdf7718ccf3115cc7a2ec2ee552878c88ec307c021b9e9d905dff0e345f29aca18de55683b92f
data/CHANGELOG.md CHANGED
@@ -1,8 +1,32 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ This format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
+
6
+ ## 0.3.1
7
+
8
+ ### Changed
9
+
10
+ - BaseHandler#expose_errors_to_sender? default to true now.
11
+
12
+ ## 0.3.0
13
+
14
+ ### Changed
15
+ - state_machine_enum library was moved in it's own library/gem.
16
+
17
+ ### Fixed
18
+ - Provide handled: true attribute for Rails.error.report method, because it is required in Rails 7.0.
19
+
1
20
  ## 0.2.0
2
21
 
22
+ ### Changed
23
+
3
24
  - Handler methods are now defined as instance methods for simplicity.
4
25
  - Define service_id in initializer with active_handlers, instead of handler class.
5
26
  - Use ruby 3.0 as a base for standard/rubocop, format all code according to it.
27
+
28
+ ### Added
29
+
6
30
  - Introduce Rails common error reporter ( https://guides.rubyonrails.org/error_reporting.html )
7
31
 
8
32
  ## 0.1.0
@@ -48,7 +48,7 @@ module Munster
48
48
  # on a per-handler basis - a better webhooks sender will be able to make out
49
49
  # some sense of the errors.
50
50
  def expose_errors_to_sender?
51
- false
51
+ true
52
52
  end
53
53
 
54
54
  # Tells the controller whether this handler is active or not. This can be used
@@ -20,7 +20,9 @@ module Munster
20
20
  render_error("Required parameters were not present in the request", :not_found)
21
21
  rescue => e
22
22
  Rails.error.set_context(**Munster.configuration.error_context)
23
- Rails.error.report(e)
23
+ # Rails 7.1 only requires `error` attribute for .report method, but Rails 7.0 requires `handled:` attribute additionally.
24
+ # We're setting `handled:` and `severity:` attributes to maintain compatibility with all versions of > rails 7.
25
+ Rails.error.report(e, handled: true, severity: :error)
24
26
 
25
27
  if handler&.expose_errors_to_sender?
26
28
  error_for_sender_from_exception(e)
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../state_machine_enum"
3
+ require 'state_machine_enum'
4
4
 
5
5
  module Munster
6
6
  class ReceivedWebhook < ActiveRecord::Base
7
7
  self.implicit_order_column = "created_at"
8
8
  self.table_name = "received_webhooks"
9
9
 
10
- include Munster::StateMachineEnum
10
+ include StateMachineEnum
11
11
 
12
12
  state_machine_enum :status do |s|
13
13
  s.permit_transition(:received, :processing)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Munster
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: munster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stanislav Katkov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-06 00:00:00.000000000 Z
11
+ date: 2024-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '7.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: state_machine_enum
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'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -164,7 +178,6 @@ files:
164
178
  - lib/munster/install_generator.rb
165
179
  - lib/munster/jobs/processing_job.rb
166
180
  - lib/munster/models/received_webhook.rb
167
- - lib/munster/state_machine_enum.rb
168
181
  - lib/munster/templates/create_munster_tables.rb.erb
169
182
  - lib/munster/templates/munster.rb
170
183
  - lib/munster/version.rb
@@ -1,125 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # This concern adds a method called "state_enum" useful for defining an enum using
4
- # string values along with valid state transitions. Validations will be added for the
5
- # state transitions and a proper enum is going to be defined. For example:
6
- #
7
- # state_machine_enum :state do |states|
8
- # states.permit_transition(:created, :approved_pending_settlement)
9
- # states.permit_transition(:approved_pending_settlement, :rejected)
10
- # states.permit_transition(:created, :rejected)
11
- # states.permit_transition(:approved_pending_settlement, :settled)
12
- # end
13
- module Munster
14
- module StateMachineEnum
15
- extend ActiveSupport::Concern
16
-
17
- class StatesCollector
18
- attr_reader :states
19
- attr_reader :after_commit_hooks
20
- attr_reader :common_after_commit_hooks
21
- attr_reader :after_attribute_write_hooks
22
- attr_reader :common_after_write_hooks
23
-
24
- def initialize
25
- @transitions = Set.new
26
- @states = Set.new
27
- @after_commit_hooks = {}
28
- @common_after_commit_hooks = []
29
- @after_attribute_write_hooks = {}
30
- @common_after_write_hooks = []
31
- end
32
-
33
- def permit_transition(from, to)
34
- @states << from.to_s << to.to_s
35
- @transitions << [from.to_s, to.to_s]
36
- end
37
-
38
- def may_transition?(from, to)
39
- @transitions.include?([from.to_s, to.to_s])
40
- end
41
-
42
- def after_inline_transition_to(target_state, &blk)
43
- @after_attribute_write_hooks[target_state.to_s] ||= []
44
- @after_attribute_write_hooks[target_state.to_s] << blk.to_proc
45
- end
46
-
47
- def after_committed_transition_to(target_state, &blk)
48
- @after_commit_hooks[target_state.to_s] ||= []
49
- @after_commit_hooks[target_state.to_s] << blk.to_proc
50
- end
51
-
52
- def after_any_committed_transition(&blk)
53
- @common_after_commit_hooks << blk.to_proc
54
- end
55
-
56
- def validate(model, attribute_name)
57
- return unless model.persisted?
58
-
59
- was = model.attribute_was(attribute_name)
60
- is = model[attribute_name]
61
-
62
- unless was == is || @transitions.include?([was, is])
63
- model.errors.add(attribute_name, "Invalid transition from #{was} to #{is}")
64
- end
65
- end
66
- end
67
-
68
- class InvalidState < StandardError
69
- end
70
-
71
- class_methods do
72
- def state_machine_enum(attribute_name, **options_for_enum)
73
- # Collect the states
74
- collector = StatesCollector.new
75
- yield(collector).tap do
76
- # Define the enum using labels, with string values
77
- enum_map = collector.states.map(&:to_sym).zip(collector.states.to_a).to_h
78
- enum(attribute_name, enum_map, **options_for_enum)
79
-
80
- # Define validations for transitions
81
- validates attribute_name, presence: true
82
- validate { |model| collector.validate(model, attribute_name) }
83
-
84
- # Define inline hooks
85
- before_save do |model|
86
- _value_was, value_has_become = model.changes[attribute_name]
87
- next unless value_has_become
88
- hook_procs = collector.after_attribute_write_hooks[value_has_become].to_a + collector.common_after_write_hooks.to_a
89
- hook_procs.each do |hook_proc|
90
- hook_proc.call(model)
91
- end
92
- end
93
-
94
- # Define after commit hooks
95
- after_commit do |model|
96
- _value_was, value_has_become = model.previous_changes[attribute_name]
97
- next unless value_has_become
98
- hook_procs = collector.after_commit_hooks[value_has_become].to_a + collector.common_after_commit_hooks.to_a
99
- hook_procs.each do |hook_proc|
100
- hook_proc.call(model)
101
- end
102
- end
103
-
104
- # Define the check methods
105
- define_method(:"ensure_#{attribute_name}_one_of!") do |*allowed_states|
106
- val = self[attribute_name]
107
- return if Set.new(allowed_states.map(&:to_s)).include?(val)
108
- raise InvalidState, "#{attribute_name} must be one of #{allowed_states.inspect} but was #{val.inspect}"
109
- end
110
-
111
- define_method(:"ensure_#{attribute_name}_may_transition_to!") do |next_state|
112
- val = self[attribute_name]
113
- raise InvalidState, "#{attribute_name} already is #{val.inspect}" if next_state.to_s == val
114
- end
115
-
116
- define_method(:"#{attribute_name}_may_transition_to?") do |next_state|
117
- val = self[attribute_name]
118
- return false if val == next_state.to_s
119
- collector.may_transition?(val, next_state)
120
- end
121
- end
122
- end
123
- end
124
- end
125
- end