steel_wheel 0.5.1 → 0.6.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 +4 -4
- data/.codeclimate.yml +2 -0
- data/.github/workflows/ruby.yml +21 -26
- data/.gitignore +0 -0
- data/.rspec +0 -0
- data/.rubocop.yml +188 -0
- data/.ruby-version +1 -1
- data/.travis.yml +0 -0
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +10 -0
- data/Gemfile.lock +114 -95
- data/LICENSE.txt +0 -0
- data/README.md +307 -4
- data/Rakefile +7 -1
- data/assets/action_diagram.png +0 -0
- data/bin/console +1 -0
- data/lib/generators/steel_wheel/application_handler/USAGE +8 -0
- data/lib/generators/steel_wheel/application_handler/application_handler_generator.rb +12 -0
- data/lib/generators/steel_wheel/application_handler/templates/handler_template.rb +4 -0
- data/lib/generators/steel_wheel/command/USAGE +0 -0
- data/lib/generators/steel_wheel/command/command_generator.rb +10 -10
- data/lib/generators/steel_wheel/command/templates/command_template.rb +3 -1
- data/lib/generators/steel_wheel/handler/USAGE +0 -0
- data/lib/generators/steel_wheel/handler/handler_generator.rb +10 -10
- data/lib/generators/steel_wheel/handler/templates/handler_template.rb +13 -7
- data/lib/generators/steel_wheel/params/USAGE +0 -0
- data/lib/generators/steel_wheel/params/params_generator.rb +10 -10
- data/lib/generators/steel_wheel/params/templates/params_template.rb +3 -1
- data/lib/generators/steel_wheel/query/USAGE +0 -0
- data/lib/generators/steel_wheel/query/query_generator.rb +10 -10
- data/lib/generators/steel_wheel/query/templates/query_template.rb +3 -1
- data/lib/steel_wheel/command.rb +8 -2
- data/lib/steel_wheel/handler.rb +86 -29
- data/lib/steel_wheel/params.rb +10 -1
- data/lib/steel_wheel/query.rb +7 -1
- data/lib/steel_wheel/response.rb +10 -5
- data/lib/steel_wheel/skip_active_model_errors_keys.rb +12 -1
- data/lib/steel_wheel/version.rb +3 -1
- data/lib/steel_wheel.rb +3 -1
- data/steel_wheel.gemspec +6 -11
- metadata +21 -101
- data/lib/generators/steel_wheel/generic_generator.rb +0 -23
data/lib/steel_wheel/handler.rb
CHANGED
@@ -1,50 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SteelWheel
|
2
|
-
class
|
3
|
-
|
4
|
-
|
4
|
+
# Base class that defines main flow
|
5
|
+
class Handler
|
6
|
+
include Nina
|
7
|
+
include ActiveModel::Validations
|
8
|
+
|
9
|
+
attr_reader :user_defined_callbacks
|
10
|
+
|
11
|
+
builder :main do
|
12
|
+
factory :params, produces: SteelWheel::Params
|
13
|
+
factory :query, produces: SteelWheel::Query
|
14
|
+
factory :command, produces: SteelWheel::Command
|
15
|
+
factory :response, produces: SteelWheel::Response
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.define(flow: :main, &block)
|
19
|
+
builders[flow].subclass(&block)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Runs validation on objects
|
23
|
+
class Validator
|
24
|
+
include ActiveModel::Validations
|
25
|
+
attr_accessor :http_status
|
26
|
+
|
27
|
+
def self.run(flow)
|
28
|
+
validator = new
|
29
|
+
[flow.params, flow.query, flow.command].each do |obj|
|
30
|
+
break if validator.errors.any?
|
31
|
+
|
32
|
+
validator.validate(obj)
|
33
|
+
end
|
34
|
+
flow.status = validator.http_status || :ok
|
35
|
+
flow.errors.merge!(validator.errors)
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate(object)
|
39
|
+
return if object.valid?
|
40
|
+
|
41
|
+
self.http_status ||= object.http_status
|
42
|
+
errors.merge!(object.errors) if errors.empty?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(&callbacks)
|
47
|
+
@user_defined_callbacks = callbacks
|
48
|
+
end
|
5
49
|
|
6
|
-
|
7
|
-
|
8
|
-
stage :query, base_class: SteelWheel::Query
|
9
|
-
stage :command, base_class: SteelWheel::Command
|
50
|
+
def on_params_created(params)
|
51
|
+
# NOOP
|
10
52
|
end
|
11
|
-
output :response, base_class: SteelWheel::Response
|
12
53
|
|
13
|
-
def
|
14
|
-
|
54
|
+
def on_query_created(query)
|
55
|
+
# NOOP
|
15
56
|
end
|
16
57
|
|
17
|
-
def
|
18
|
-
|
19
|
-
output.errors.merge!(output.params.errors)
|
58
|
+
def on_command_created(command)
|
59
|
+
# NOOP
|
20
60
|
end
|
21
61
|
|
22
|
-
def
|
23
|
-
|
24
|
-
output.errors.merge!(output.query.errors)
|
62
|
+
def on_response_created(response)
|
63
|
+
# NOOP
|
25
64
|
end
|
26
65
|
|
27
|
-
def
|
28
|
-
|
29
|
-
output.errors.merge!(output.command.errors)
|
66
|
+
def on_failure(flow)
|
67
|
+
# NOOP
|
30
68
|
end
|
31
69
|
|
32
|
-
def on_success
|
70
|
+
def on_success(flow)
|
33
71
|
# NOOP
|
34
72
|
end
|
35
73
|
|
74
|
+
def self.base_class_for(factory, flow: :main)
|
75
|
+
builders[flow].abstract_factory.factories[factory].base_class
|
76
|
+
end
|
77
|
+
|
36
78
|
def self.handle(input:, flow: :main, &block)
|
37
|
-
|
38
|
-
|
39
|
-
|
79
|
+
new.handle(input: input, flow: flow, &block)
|
80
|
+
end
|
81
|
+
|
82
|
+
def handle(input:, flow: :main, &block)
|
83
|
+
object = configure_builder(flow).wrap(delegate: true) { |i| i.params(input) }
|
84
|
+
yield(object) if block
|
85
|
+
Validator.run(object)
|
86
|
+
object.success? ? on_success(object) : on_failure(object)
|
87
|
+
object
|
40
88
|
end
|
41
89
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
90
|
+
private
|
91
|
+
|
92
|
+
def configure_builder(flow)
|
93
|
+
builder = self.class.builders[flow].with_callbacks(&required_callbacks)
|
94
|
+
builder = builder.with_callbacks(&user_defined_callbacks) if user_defined_callbacks
|
95
|
+
builder
|
96
|
+
end
|
97
|
+
|
98
|
+
def required_callbacks
|
99
|
+
lambda do |c|
|
100
|
+
c.params { |o| on_params_created(o) }
|
101
|
+
c.query { |o| on_query_created(o) }
|
102
|
+
c.command { |o| on_command_created(o) }
|
103
|
+
c.response { |o| on_response_created(o) }
|
104
|
+
end
|
48
105
|
end
|
49
106
|
end
|
50
107
|
end
|
data/lib/steel_wheel/params.rb
CHANGED
data/lib/steel_wheel/query.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SteelWheel
|
4
|
+
# Base class for queries
|
2
5
|
class Query
|
3
6
|
include Memery
|
4
7
|
include ActiveModel::Validations
|
@@ -8,7 +11,10 @@ module SteelWheel
|
|
8
11
|
end
|
9
12
|
|
10
13
|
def http_status
|
11
|
-
errors.
|
14
|
+
return :ok if errors.empty?
|
15
|
+
return errors.keys.first unless defined?(ActiveModel::Error)
|
16
|
+
|
17
|
+
errors.map(&:type).first
|
12
18
|
end
|
13
19
|
end
|
14
20
|
end
|
data/lib/steel_wheel/response.rb
CHANGED
@@ -1,14 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SteelWheel
|
4
|
+
# Base class for responses
|
2
5
|
class Response
|
3
6
|
attr_accessor :status
|
4
|
-
|
7
|
+
|
5
8
|
include ActiveModel::Validations
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
+
unless defined?(ActiveModel::Error)
|
11
|
+
def self.generic_validation_keys(*keys)
|
12
|
+
include SteelWheel::SkipActiveModelErrorsKeys[*keys]
|
13
|
+
end
|
10
14
|
|
11
|
-
|
15
|
+
generic_validation_keys(:not_found, :forbidden, :unprocessable_entity, :bad_request, :unauthorized)
|
16
|
+
end
|
12
17
|
|
13
18
|
def self.name
|
14
19
|
'SteelWheel::Response'
|
@@ -1,7 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SteelWheel
|
4
|
+
# Allows to treat some error codes as :base
|
5
|
+
# EX:
|
6
|
+
# generic_validation_keys :not_found
|
7
|
+
# errors.add(:not_found, 'Can not find')
|
8
|
+
# errors.full_messages => ['Can not find']
|
9
|
+
# not ['Not found an not find']
|
2
10
|
module SkipActiveModelErrorsKeys
|
3
11
|
def self.build_module
|
4
|
-
|
12
|
+
Module.new do
|
5
13
|
class << self
|
6
14
|
attr_accessor :skip_keys
|
7
15
|
|
@@ -12,6 +20,7 @@ module SteelWheel
|
|
12
20
|
end
|
13
21
|
end
|
14
22
|
|
23
|
+
# rubocop:disable Metrics/MethodLength
|
15
24
|
def self.patch_errors_method_on_instance(mod, klass)
|
16
25
|
class << klass
|
17
26
|
alias_method :__new__, :new
|
@@ -21,11 +30,13 @@ module SteelWheel
|
|
21
30
|
instance = __new__(*args)
|
22
31
|
instance.errors.define_singleton_method :full_message do |attribute, message|
|
23
32
|
return message if mod.skip_keys.include?(attribute)
|
33
|
+
|
24
34
|
super(attribute, message)
|
25
35
|
end
|
26
36
|
instance
|
27
37
|
end
|
28
38
|
end
|
39
|
+
# rubocop:enable Metrics/MethodLength
|
29
40
|
|
30
41
|
def self.[](*skip_keys)
|
31
42
|
mod = build_module
|
data/lib/steel_wheel/version.rb
CHANGED
data/lib/steel_wheel.rb
CHANGED
data/steel_wheel.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path('lib', __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'steel_wheel/version'
|
@@ -23,7 +25,7 @@ Gem::Specification.new do |spec|
|
|
23
25
|
# spec.metadata['changelog_uri'] = 'TODO: Put your gem's CHANGELOG.md URL here.'
|
24
26
|
else
|
25
27
|
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
26
|
-
|
28
|
+
'public gem pushes.'
|
27
29
|
end
|
28
30
|
|
29
31
|
# Specify which files should be added to the gem when it is released.
|
@@ -34,20 +36,13 @@ Gem::Specification.new do |spec|
|
|
34
36
|
spec.bindir = 'exe'
|
35
37
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
36
38
|
spec.require_paths = ['lib']
|
37
|
-
spec.required_ruby_version = '>= 2.
|
39
|
+
spec.required_ruby_version = '>= 2.6'
|
38
40
|
|
39
41
|
version_string = ['>= 3.2', '< 8']
|
40
42
|
|
41
43
|
spec.add_runtime_dependency 'railties', version_string
|
42
44
|
|
45
|
+
spec.add_dependency 'easy_params', '~> 0.3'
|
43
46
|
spec.add_dependency 'memery', '~> 1'
|
44
|
-
spec.add_dependency '
|
45
|
-
spec.add_dependency 'flow_object', '~> 0.3.1'
|
46
|
-
|
47
|
-
spec.add_development_dependency 'bundler', '~> 1.17'
|
48
|
-
spec.add_development_dependency 'pry', '~> 0.10'
|
49
|
-
spec.add_development_dependency 'rake', '>= 12.3.3'
|
50
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
51
|
-
spec.add_development_dependency 'simplecov', '0.17'
|
52
|
-
spec.add_development_dependency 'rspec_vars_helper', '~> 0.1'
|
47
|
+
spec.add_dependency 'nina', '~> 0.1.2'
|
53
48
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steel_wheel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrii Baran
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -30,132 +30,48 @@ dependencies:
|
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '8'
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: memery
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - "~>"
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '1'
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '1'
|
47
33
|
- !ruby/object:Gem::Dependency
|
48
34
|
name: easy_params
|
49
35
|
requirement: !ruby/object:Gem::Requirement
|
50
36
|
requirements:
|
51
37
|
- - "~>"
|
52
38
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.
|
39
|
+
version: '0.3'
|
54
40
|
type: :runtime
|
55
41
|
prerelease: false
|
56
42
|
version_requirements: !ruby/object:Gem::Requirement
|
57
43
|
requirements:
|
58
44
|
- - "~>"
|
59
45
|
- !ruby/object:Gem::Version
|
60
|
-
version: 0.
|
46
|
+
version: '0.3'
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
48
|
+
name: memery
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
64
50
|
requirements:
|
65
51
|
- - "~>"
|
66
52
|
- !ruby/object:Gem::Version
|
67
|
-
version:
|
53
|
+
version: '1'
|
68
54
|
type: :runtime
|
69
55
|
prerelease: false
|
70
56
|
version_requirements: !ruby/object:Gem::Requirement
|
71
57
|
requirements:
|
72
58
|
- - "~>"
|
73
59
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: bundler
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - "~>"
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '1.17'
|
82
|
-
type: :development
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - "~>"
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '1.17'
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: pry
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
92
|
-
requirements:
|
93
|
-
- - "~>"
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
version: '0.10'
|
96
|
-
type: :development
|
97
|
-
prerelease: false
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
99
|
-
requirements:
|
100
|
-
- - "~>"
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0.10'
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: rake
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - ">="
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 12.3.3
|
110
|
-
type: :development
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - ">="
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: 12.3.3
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: rspec
|
119
|
-
requirement: !ruby/object:Gem::Requirement
|
120
|
-
requirements:
|
121
|
-
- - "~>"
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: '3.0'
|
124
|
-
type: :development
|
125
|
-
prerelease: false
|
126
|
-
version_requirements: !ruby/object:Gem::Requirement
|
127
|
-
requirements:
|
128
|
-
- - "~>"
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: '3.0'
|
131
|
-
- !ruby/object:Gem::Dependency
|
132
|
-
name: simplecov
|
133
|
-
requirement: !ruby/object:Gem::Requirement
|
134
|
-
requirements:
|
135
|
-
- - '='
|
136
|
-
- !ruby/object:Gem::Version
|
137
|
-
version: '0.17'
|
138
|
-
type: :development
|
139
|
-
prerelease: false
|
140
|
-
version_requirements: !ruby/object:Gem::Requirement
|
141
|
-
requirements:
|
142
|
-
- - '='
|
143
|
-
- !ruby/object:Gem::Version
|
144
|
-
version: '0.17'
|
60
|
+
version: '1'
|
145
61
|
- !ruby/object:Gem::Dependency
|
146
|
-
name:
|
62
|
+
name: nina
|
147
63
|
requirement: !ruby/object:Gem::Requirement
|
148
64
|
requirements:
|
149
65
|
- - "~>"
|
150
66
|
- !ruby/object:Gem::Version
|
151
|
-
version:
|
152
|
-
type: :
|
67
|
+
version: 0.1.2
|
68
|
+
type: :runtime
|
153
69
|
prerelease: false
|
154
70
|
version_requirements: !ruby/object:Gem::Requirement
|
155
71
|
requirements:
|
156
72
|
- - "~>"
|
157
73
|
- !ruby/object:Gem::Version
|
158
|
-
version:
|
74
|
+
version: 0.1.2
|
159
75
|
description: Tiny DSL for code in controllers
|
160
76
|
email:
|
161
77
|
- andriy.baran.v@gmail.com
|
@@ -163,9 +79,11 @@ executables: []
|
|
163
79
|
extensions: []
|
164
80
|
extra_rdoc_files: []
|
165
81
|
files:
|
82
|
+
- ".codeclimate.yml"
|
166
83
|
- ".github/workflows/ruby.yml"
|
167
84
|
- ".gitignore"
|
168
85
|
- ".rspec"
|
86
|
+
- ".rubocop.yml"
|
169
87
|
- ".ruby-version"
|
170
88
|
- ".travis.yml"
|
171
89
|
- CODE_OF_CONDUCT.md
|
@@ -177,10 +95,12 @@ files:
|
|
177
95
|
- assets/action_diagram.png
|
178
96
|
- bin/console
|
179
97
|
- bin/setup
|
98
|
+
- lib/generators/steel_wheel/application_handler/USAGE
|
99
|
+
- lib/generators/steel_wheel/application_handler/application_handler_generator.rb
|
100
|
+
- lib/generators/steel_wheel/application_handler/templates/handler_template.rb
|
180
101
|
- lib/generators/steel_wheel/command/USAGE
|
181
102
|
- lib/generators/steel_wheel/command/command_generator.rb
|
182
103
|
- lib/generators/steel_wheel/command/templates/command_template.rb
|
183
|
-
- lib/generators/steel_wheel/generic_generator.rb
|
184
104
|
- lib/generators/steel_wheel/handler/USAGE
|
185
105
|
- lib/generators/steel_wheel/handler/handler_generator.rb
|
186
106
|
- lib/generators/steel_wheel/handler/templates/handler_template.rb
|
@@ -206,7 +126,7 @@ metadata:
|
|
206
126
|
allowed_push_host: https://rubygems.org
|
207
127
|
homepage_uri: https://github.com/andriy-baran/steel_wheel
|
208
128
|
source_code_uri: https://github.com/andriy-baran/steel_wheel
|
209
|
-
post_install_message:
|
129
|
+
post_install_message:
|
210
130
|
rdoc_options: []
|
211
131
|
require_paths:
|
212
132
|
- lib
|
@@ -214,15 +134,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
214
134
|
requirements:
|
215
135
|
- - ">="
|
216
136
|
- !ruby/object:Gem::Version
|
217
|
-
version: '2.
|
137
|
+
version: '2.6'
|
218
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
219
139
|
requirements:
|
220
140
|
- - ">="
|
221
141
|
- !ruby/object:Gem::Version
|
222
142
|
version: '0'
|
223
143
|
requirements: []
|
224
|
-
rubygems_version: 3.2.
|
225
|
-
signing_key:
|
144
|
+
rubygems_version: 3.2.22
|
145
|
+
signing_key:
|
226
146
|
specification_version: 4
|
227
147
|
summary: Adds operations to your rails code
|
228
148
|
test_files: []
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module SteelWheel
|
2
|
-
class GenericGenerator < Rails::Generators::NamedBase
|
3
|
-
def self.setup_templates_root(templates_relative_path)
|
4
|
-
source_root File.expand_path(templates_relative_path, __dir__)
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.on_revoke(&block)
|
8
|
-
block_given? ? @on_revoke = block : @on_revoke
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.on_invoke(&block)
|
12
|
-
block_given? ? @on_invoke = block : @on_invoke
|
13
|
-
end
|
14
|
-
|
15
|
-
def copy_files
|
16
|
-
if behavior == :revoke
|
17
|
-
instance_eval(&self.class.on_revoke)
|
18
|
-
elsif behavior == :invoke
|
19
|
-
instance_eval(&self.class.on_invoke)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|