wicked-pipeline 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile +6 -2
- data/README.md +16 -12
- data/Rakefile +14 -0
- data/config/locales/wicked/pipeline/en.yml +7 -0
- data/lib/generators/erb/wicked/pipeline/controller/controller_generator.rb +44 -0
- data/lib/generators/erb/wicked/pipeline/controller/templates/_step.html.erb +41 -0
- data/lib/generators/erb/wicked/pipeline/controller/templates/view.html.erb.tt +4 -0
- data/lib/generators/wicked/pipeline/USAGE +2 -0
- data/lib/generators/wicked/pipeline/controller/USAGE +30 -0
- data/lib/generators/wicked/pipeline/controller/controller_generator.rb +124 -0
- data/lib/generators/wicked/pipeline/controller/templates/controller.rb.tt +37 -0
- data/lib/generators/wicked/pipeline/controller/templates/locale.yml +15 -0
- data/lib/generators/wicked/pipeline/helpers.rb +41 -0
- data/lib/generators/wicked/pipeline/pipeline_generator.rb +6 -12
- data/lib/generators/wicked/pipeline/step/USAGE +3 -0
- data/lib/generators/wicked/pipeline/step/step_generator.rb +17 -5
- data/lib/generators/wicked/pipeline/step/templates/locale.yml +17 -0
- data/lib/wicked/pipeline/engine.rb +1 -1
- data/lib/wicked/pipeline/version.rb +1 -1
- data/wicked-pipeline.gemspec +4 -4
- metadata +12 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0cb739756e551e6a258cc5740d86873e2f66953bded3b80c64feeca23d7c7ae6
|
4
|
+
data.tar.gz: 05c232626e1e34f79064bc51bcd4478f48fc7d2ffebec5642422c5f4ae2041ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 158695e62113c19dcec9769c90487f811d39bb258b6eec3725194c4aee034f12e3015d7a735cadaa6de97422ffb867fe717716195952a07b25d980d9cce29c95
|
7
|
+
data.tar.gz: 7dfeeb9ca234a1fadc1d8fc410a54c180c4dbe224eac07bbc7da3b74ebf80de6b992262467aa30dee2aea6241be457283a3abdb2f8b889f390e26ae8ceb1d510
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
@@ -7,8 +7,12 @@ gemspec
|
|
7
7
|
|
8
8
|
gem "rails", ">= 6.1", "< 7"
|
9
9
|
gem "rake", "~> 13.0"
|
10
|
-
gem "standard", "~> 1.3"
|
11
|
-
gem "yard", "~> 0.9"
|
10
|
+
gem "standard", "~> 1.3", require: false
|
11
|
+
gem "yard", "~> 0.9", require: false
|
12
|
+
|
13
|
+
group :development do
|
14
|
+
gem "solargraph", require: false
|
15
|
+
end
|
12
16
|
|
13
17
|
group :development, :test do
|
14
18
|
gem "rspec-rails", "~> 5.0"
|
data/README.md
CHANGED
@@ -45,6 +45,10 @@ If bundler is not being used to manage dependencies, install the gem by executin
|
|
45
45
|
$ gem install wicked-pipeline
|
46
46
|
```
|
47
47
|
|
48
|
+
### Compatibility
|
49
|
+
|
50
|
+
Currently this gem requires Rails >= 6.1
|
51
|
+
|
48
52
|
Usage
|
49
53
|
-----
|
50
54
|
|
@@ -68,7 +72,7 @@ This will generate the `IdentificationStep` with the `email`, `subscribe_to_news
|
|
68
72
|
|
69
73
|
A step object is very similar to a form object. It takes a "resource" (the `ActiveRecord` model) and optional params as arguments and will contain attribute definitions, validations for the step, a list of permitted params and a `#save` method. The validations are specific to the step but the resource will also be validated before being saved.
|
70
74
|
|
71
|
-
Step objects are subclasses of the `BaseStep` class, and they live in the `app/steps` directory. Here are the rules that must be respected in a step object:
|
75
|
+
Step objects are subclasses of the `Wicked::Pipeline::BaseStep` class, and they live in the `app/steps` directory. Here are the rules that must be respected in a step object:
|
72
76
|
|
73
77
|
- The name of a step class must end with `Step`
|
74
78
|
- Attributes must be defined using the `ActiveModel::Attributes` API (more on that later)
|
@@ -81,7 +85,7 @@ The only method that needs to be implemented is the `permitted_params` private m
|
|
81
85
|
|
82
86
|
```ruby
|
83
87
|
module Users
|
84
|
-
class ProfileStep < ::BaseStep
|
88
|
+
class ProfileStep < ::Wicked::Pipeline::BaseStep
|
85
89
|
private
|
86
90
|
|
87
91
|
def permitted_params
|
@@ -107,7 +111,7 @@ To define a String attributes as an Array, the second argument must be `array: t
|
|
107
111
|
|
108
112
|
```ruby
|
109
113
|
module Users
|
110
|
-
class ProfileStep < ::BaseStep
|
114
|
+
class ProfileStep < ::Wicked::Pipeline::BaseStep
|
111
115
|
attribute :email
|
112
116
|
attribute :first_name
|
113
117
|
attribute :last_name
|
@@ -133,7 +137,7 @@ _Hint: A custom validation method must be used for uniqueness validations, but u
|
|
133
137
|
|
134
138
|
```ruby
|
135
139
|
module Users
|
136
|
-
class ProfileStep < ::BaseStep
|
140
|
+
class ProfileStep < ::Wicked::Pipeline::BaseStep
|
137
141
|
# ...
|
138
142
|
|
139
143
|
validates_presence_of :email, :first_name, :last_name
|
@@ -163,7 +167,7 @@ A step can be marked as "blocking" by overriding the `blocking?` predicate metho
|
|
163
167
|
|
164
168
|
```ruby
|
165
169
|
module Users
|
166
|
-
class ProfileStep < ::BaseStep
|
170
|
+
class ProfileStep < ::Wicked::Pipeline::BaseStep
|
167
171
|
attribute :first_name
|
168
172
|
attribute :is_us_citizen, :boolean
|
169
173
|
|
@@ -184,7 +188,7 @@ To specify a reason why the step is marked as blocking, the `blocking_reason` me
|
|
184
188
|
|
185
189
|
```ruby
|
186
190
|
module Users
|
187
|
-
class ProfileStep < ::BaseStep
|
191
|
+
class ProfileStep < ::Wicked::Pipeline::BaseStep
|
188
192
|
attribute :first_name
|
189
193
|
attribute :is_us_citizen, :boolean
|
190
194
|
|
@@ -209,12 +213,12 @@ end
|
|
209
213
|
|
210
214
|
### Step pipelines
|
211
215
|
|
212
|
-
A step pipeline class is a subclass of the `BasePipeline` class and live in `app/steps`. At the most basic level should contain a list of step classes.
|
216
|
+
A step pipeline class is a subclass of the `Wicked::Pipeline::BasePipeline` class and live in `app/steps`. At the most basic level should contain a list of step classes.
|
213
217
|
|
214
218
|
**Note:** Step pipeline should only be used with step objects!
|
215
219
|
|
216
220
|
```ruby
|
217
|
-
class UserAccountPipeline < BasePipeline
|
221
|
+
class UserAccountPipeline < Wicked::Pipeline::BasePipeline
|
218
222
|
def steps
|
219
223
|
[
|
220
224
|
User::ProfileStep,
|
@@ -248,7 +252,7 @@ UserAccountPipeline.valid?(User.last)
|
|
248
252
|
|
249
253
|
### Steps controllers
|
250
254
|
|
251
|
-
A steps controller is a subclass of `BaseStepsController`, it can have any name and can be placed anywhere under the `app/controllers` directory. Unlike a regular controller, the `:id` parameter references the current step **not** the ID of a resource. For this reason, the name of the resource ID parameter must be specified using the `#resource_param_name` private method.
|
255
|
+
A steps controller is a subclass of `Wicked::Pipeline::BaseStepsController`, it can have any name and can be placed anywhere under the `app/controllers` directory. Unlike a regular controller, the `:id` parameter references the current step **not** the ID of a resource. For this reason, the name of the resource ID parameter must be specified using the `#resource_param_name` private method.
|
252
256
|
|
253
257
|
Steps controllers **must** implement the following private methods:
|
254
258
|
|
@@ -257,7 +261,7 @@ Steps controllers **must** implement the following private methods:
|
|
257
261
|
- `#find_resource`: This method takes care of finding the resource object from the database.
|
258
262
|
|
259
263
|
```ruby
|
260
|
-
class UsersController < BaseStepsController
|
264
|
+
class UsersController < Wicked::Pipeline::BaseStepsController
|
261
265
|
# ...
|
262
266
|
|
263
267
|
private
|
@@ -321,7 +325,7 @@ A step controller has the `show` and `update` actions. **It cannot have the `new
|
|
321
325
|
Both action must call `super` with a block and set the `@step_processor` instance variable inside of that block:
|
322
326
|
|
323
327
|
```ruby
|
324
|
-
class UsersController < BaseStepsController
|
328
|
+
class UsersController < Wicked::Pipeline::BaseStepsController
|
325
329
|
def show
|
326
330
|
super do
|
327
331
|
@user = find_resource
|
@@ -361,7 +365,7 @@ end
|
|
361
365
|
Flash messages can be set manually **after** calling `super`. Step objects have a `#saved?` method which can be used to verify that it was successfully saved. The method should be used before setting a flash messages:
|
362
366
|
|
363
367
|
```ruby
|
364
|
-
class UsersController < BaseStepsController
|
368
|
+
class UsersController < Wicked::Pipeline::BaseStepsController
|
365
369
|
# ...
|
366
370
|
|
367
371
|
def update
|
data/Rakefile
CHANGED
@@ -5,10 +5,24 @@ require "rspec/core/rake_task"
|
|
5
5
|
require "standard/rake"
|
6
6
|
require "yard"
|
7
7
|
|
8
|
+
# Taken from https://gist.github.com/AlexWayfer/d57f6fa0d69a8e352197ab83a82cff98
|
9
|
+
def alias_task(name, old_name)
|
10
|
+
t = Rake::Task[old_name]
|
11
|
+
desc t.full_comment if t.full_comment
|
12
|
+
task name, *t.arg_names do |_, args|
|
13
|
+
# values_at is broken on Rake::TaskArguments
|
14
|
+
args = t.arg_names.map { |a| args[a] }
|
15
|
+
t.invoke(*args)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
8
19
|
RSpec::Core::RakeTask.new(:spec)
|
9
20
|
|
10
21
|
YARD::Rake::YardocTask.new do |t|
|
11
22
|
t.files = ["lib/**/*.rb"]
|
12
23
|
end
|
13
24
|
|
25
|
+
alias_task "lint", "standard"
|
26
|
+
alias_task "lint:fix", "standard:fix"
|
27
|
+
|
14
28
|
task default: [:standard, :spec]
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators/erb"
|
4
|
+
require_relative "../../../../wicked/pipeline/helpers"
|
5
|
+
|
6
|
+
module Erb
|
7
|
+
module Wicked
|
8
|
+
module Pipeline
|
9
|
+
class ControllerGenerator < Erb::Generators::Base
|
10
|
+
include ::Wicked::Pipeline::Generators::Helpers
|
11
|
+
|
12
|
+
hide!
|
13
|
+
|
14
|
+
argument :resource_name, required: true, desc: "The name of the resource associated with the pipeline"
|
15
|
+
argument :pipeline_name, required: true, desc: "The name of the pipeline"
|
16
|
+
argument :steps, type: :array, default: [], desc: "List of steps"
|
17
|
+
|
18
|
+
source_root File.expand_path("templates", __dir__)
|
19
|
+
|
20
|
+
def copy_step_partial_layout_view
|
21
|
+
empty_directory base_path
|
22
|
+
|
23
|
+
template "_step.html.erb", File.join(base_path, "_step.html.erb")
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_step_view_files
|
27
|
+
steps.each do |step_name|
|
28
|
+
@step_name = step_name
|
29
|
+
|
30
|
+
template "view.html.erb", File.join(base_path, "#{step_name}.html.erb")
|
31
|
+
end
|
32
|
+
|
33
|
+
@step_name = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def base_path
|
39
|
+
@_base_path ||= File.join("app/views", class_path, file_name)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<nav aria-label="breadcrumb">
|
2
|
+
<ol>
|
3
|
+
<%% steps_metadata.each do |step_name, step_metadata| %>
|
4
|
+
<li class="<%%= "active-step" if step_metadata[:active] %> <%%= "valid-step" if step_metadata[:valid] %> <%%= "<%= pipeline_name.dasherize %>-#{step_name.dasherize}-step" %>">
|
5
|
+
<%%= link_to_if step_metadata[:accessible], t(".breadcrumbs.#{step_name}"), step_metadata[:url] %>
|
6
|
+
</li>
|
7
|
+
<%% end %>
|
8
|
+
</ol>
|
9
|
+
</nav>
|
10
|
+
|
11
|
+
<div>
|
12
|
+
<%% if I18n.exists?("#{step_i18n_scope}.subtitle", I18n.locale) %>
|
13
|
+
<h2>
|
14
|
+
<%%= t "subtitle", scope: step_i18n_scope %>
|
15
|
+
</h2>
|
16
|
+
<%% end %>
|
17
|
+
|
18
|
+
<%%= form_with model: <%= resource_name %>, url: step_path, method: :patch, html: { id: "<%= resource_name.dasherize %>-form" } do |f| %>
|
19
|
+
<%%= yield(f) %>
|
20
|
+
|
21
|
+
<%% unless local_assigns[:skip_form_buttons] %>
|
22
|
+
<div>
|
23
|
+
<%% unless steps_pipeline.first_step?(step_processor) %>
|
24
|
+
<%%= link_to step_path(step_name: steps_pipeline.previous_step(step_processor).step_name) do %>
|
25
|
+
<%%= t "previous_step", scope: step_i18n_scope, default: t("steps.previous_step", scope: Wicked::Pipeline::Engine.i18n_scope) %>
|
26
|
+
<%% end %>
|
27
|
+
<%% end %>
|
28
|
+
|
29
|
+
<%% if steps_metadata.keys.last == step %>
|
30
|
+
<%%= button_tag type: "submit" do %>
|
31
|
+
<%%= t "finish", scope: step_i18n_scope, default: t("steps.finish", scope: Wicked::Pipeline::Engine.i18n_scope) %>
|
32
|
+
<%% end %>
|
33
|
+
<%% else %>
|
34
|
+
<%%= button_tag type: "submit" do %>
|
35
|
+
<%%= t "next_step", scope: step_i18n_scope, default: t("steps.next_step", scope: Wicked::Pipeline::Engine.i18n_scope) %>
|
36
|
+
<%% end %>
|
37
|
+
<%% end %>
|
38
|
+
</div>
|
39
|
+
<%% end %>
|
40
|
+
<%% end %>
|
41
|
+
</div>
|
@@ -2,6 +2,8 @@ Description:
|
|
2
2
|
Generates a new pipeline. Pass the pipeline name, either CamelCased or
|
3
3
|
under_scored, and an optional list of steps.
|
4
4
|
|
5
|
+
Duplicate steps will be ignored.
|
6
|
+
|
5
7
|
To create a pipeline within a module, specify the pipeline name as a
|
6
8
|
path like "parent_module/pipeline_name".
|
7
9
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Description:
|
2
|
+
Generates a new steps controller. Pass the controller name, the resource name,
|
3
|
+
the pipeline name and a list of steps, either CamelCased or under_scored.
|
4
|
+
|
5
|
+
If either the resource name or the pipeline name are missing they will be
|
6
|
+
infered from the controller name.
|
7
|
+
|
8
|
+
Duplicate steps will be ignored.
|
9
|
+
|
10
|
+
To create a controller within a module, specify the controller name as a
|
11
|
+
path like 'parent_module/controller_name'.
|
12
|
+
|
13
|
+
This generates a controller class in app/controllers and invokes the
|
14
|
+
template engine generators. If no steps were provided then only the
|
15
|
+
partial step view will be created.
|
16
|
+
|
17
|
+
It will also create a locales file for the controller for each available locale.
|
18
|
+
|
19
|
+
Example:
|
20
|
+
`bin/rails generate wicked:pipeline:controller suitability User questionnaire identification experience objectives risks`
|
21
|
+
|
22
|
+
CreditCards controller with URLs like /credit_cards/debit.
|
23
|
+
Controller: app/controllers/suitability_steps_controller.rb
|
24
|
+
Views: app/views/suitability_steps/_step.html.erb
|
25
|
+
app/views/suitability/identification.html.erb
|
26
|
+
app/views/suitability/experience.html.erb
|
27
|
+
app/views/suitability/objectives.html.erb
|
28
|
+
app/views/suitability/risks.html.erb
|
29
|
+
I18n: config/locales/views/suitability_steps.en.yml
|
30
|
+
Route resources :suitability_steps, only: [:show, :update], param: :user_id
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rails/generators/named_base"
|
4
|
+
require_relative "../helpers"
|
5
|
+
|
6
|
+
module Wicked
|
7
|
+
module Pipeline
|
8
|
+
class ControllerGenerator < Rails::Generators::NamedBase
|
9
|
+
include ::Wicked::Pipeline::Generators::Helpers
|
10
|
+
|
11
|
+
argument :resource, optional: true, desc: "The resource associated with the pipeline"
|
12
|
+
argument :pipeline, optional: true, desc: "The pipeline used in the controller"
|
13
|
+
argument :steps, optional: true, type: :array, default: [], desc: "The pipeline's steps"
|
14
|
+
|
15
|
+
class_option :generate_pipeline, type: :boolean, default: false, desc: "Generate the pipeline class"
|
16
|
+
class_option :generate_steps, type: :boolean, default: false, desc: "Generate the pipeline's step classes"
|
17
|
+
class_option :skip_locales, type: :boolean, default: false, desc: "Don't generate locale files"
|
18
|
+
class_option :skip_routes, type: :boolean, desc: "Don't add routes to config/routes.rb."
|
19
|
+
|
20
|
+
check_class_collision suffix: "StepsController"
|
21
|
+
|
22
|
+
source_root File.expand_path("templates", __dir__)
|
23
|
+
|
24
|
+
def create_controller_files
|
25
|
+
template "controller.rb", File.join("app/controllers", class_path, "#{file_name}_steps_controller.rb")
|
26
|
+
end
|
27
|
+
|
28
|
+
hook_for :template_engine, as: "wicked:pipeline:controller" do |generator|
|
29
|
+
invoke generator, [
|
30
|
+
remove_possible_suffix(name),
|
31
|
+
resource_name,
|
32
|
+
remove_possible_suffix(pipeline_name, "pipeline"),
|
33
|
+
step_names
|
34
|
+
]
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_locale_file
|
38
|
+
return if options[:skip_locales]
|
39
|
+
|
40
|
+
@structure = hashify_locale_keypath([*class_path, "#{file_name}_steps"].join("."))
|
41
|
+
|
42
|
+
available_locales.each do |locale|
|
43
|
+
@locale = locale
|
44
|
+
template "locale.yml", File.join("config/locales/views", class_path, "#{file_name}_steps.#{locale}.yml")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def add_routes
|
49
|
+
return if options[:skip_routes]
|
50
|
+
|
51
|
+
routing_code = "resources :#{file_name}_steps, only: [:show, :update], param: :#{resource_param_name}"
|
52
|
+
|
53
|
+
route routing_code, namespace: regular_class_path
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_pipeline_file
|
57
|
+
return unless options[:generate_pipeline]
|
58
|
+
|
59
|
+
pipeline_args = [pipeline]
|
60
|
+
pipeline_args.concat(steps) if options[:generate_steps]
|
61
|
+
pipeline_args.concat(options_as_switches)
|
62
|
+
|
63
|
+
Rails::Generators.invoke "wicked:pipeline", pipeline_args, behavior: behavior
|
64
|
+
end
|
65
|
+
|
66
|
+
def create_step_files
|
67
|
+
return if options[:generate_pipeline] || !options[:generate_steps]
|
68
|
+
|
69
|
+
steps.each do |step|
|
70
|
+
Rails::Generators.invoke "wicked:pipeline:step", [step, *options_as_switches], behavior: behavior
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def file_name
|
77
|
+
@_file_name ||= remove_possible_suffix(super)
|
78
|
+
end
|
79
|
+
|
80
|
+
def resource
|
81
|
+
@resource ||= file_name.singularize
|
82
|
+
end
|
83
|
+
|
84
|
+
def pipeline
|
85
|
+
@pipeline ||= file_name.singularize
|
86
|
+
end
|
87
|
+
|
88
|
+
def steps
|
89
|
+
@_steps ||= (@steps.presence || []).uniq
|
90
|
+
end
|
91
|
+
|
92
|
+
def resource_class_name
|
93
|
+
@_resource_class ||= resource.camelize
|
94
|
+
end
|
95
|
+
|
96
|
+
def resource_name
|
97
|
+
@_resource_name ||= resource_class_name.demodulize.underscore
|
98
|
+
end
|
99
|
+
|
100
|
+
def resource_param_name
|
101
|
+
@_resource_param_name ||= "#{resource_name}_id"
|
102
|
+
end
|
103
|
+
|
104
|
+
def pipeline_class_name
|
105
|
+
@_pipeline_class_name ||=
|
106
|
+
if pipeline.match?(/\/|::/)
|
107
|
+
String.new(remove_possible_suffix(pipeline).camelize) << "Pipeline"
|
108
|
+
else
|
109
|
+
String.new((class_path + [remove_possible_suffix(pipeline)]).map!(&:camelize).join("::")) << "Pipeline"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def pipeline_name
|
114
|
+
@_pipeline_name ||= pipeline_class_name.underscore.parameterize.underscore
|
115
|
+
end
|
116
|
+
|
117
|
+
def step_names
|
118
|
+
@_step_names ||= steps.map do |step_name|
|
119
|
+
remove_possible_suffix(step_name).camelize.demodulize.underscore
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
<% if namespaced? -%>
|
4
|
+
require_dependency "<%= namespaced_path %>/application_controller"
|
5
|
+
|
6
|
+
<% end -%>
|
7
|
+
<% module_namespacing do -%>
|
8
|
+
class <%= class_name %>StepsController < ::Wicked::Pipeline::BaseStepsController
|
9
|
+
def show
|
10
|
+
super do
|
11
|
+
@<%= resource_name %> = find_resource
|
12
|
+
@step_processor = step_class.new(@<%= resource_name %>)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def update
|
17
|
+
super do
|
18
|
+
@<%= resource_name %> = find_resource
|
19
|
+
@step_processor = step_class.new(@<%= resource_name %>, params.require(:<%= resource_name %>))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def resource_param_name
|
26
|
+
:<%= resource_param_name %>
|
27
|
+
end
|
28
|
+
|
29
|
+
def steps_pipeline
|
30
|
+
<%= pipeline_class_name %>
|
31
|
+
end
|
32
|
+
|
33
|
+
def find_resource
|
34
|
+
<%= resource_class_name %>.find(params[resource_param_name])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
<% end -%>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%= @locale %>:
|
2
|
+
<%= indent(@structure.to_yaml.sub("---\n", ""), 2) -%>
|
3
|
+
<% indented(((file_path.count("/") + 1) * 2) + 2) do -%>
|
4
|
+
step:
|
5
|
+
breadcrumbs:
|
6
|
+
<% step_names.each do |step_name| -%>
|
7
|
+
<%= step_name %>: "<%= step_name.humanize %>"
|
8
|
+
<% end -%>
|
9
|
+
|
10
|
+
<% step_names.each do |step_name| -%>
|
11
|
+
<%= step_name %>:
|
12
|
+
subtitle: "<%= step_name.humanize %>"
|
13
|
+
<%= "\n" unless step_name == step_names.last -%>
|
14
|
+
<% end -%>
|
15
|
+
<% end -%>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Wicked
|
4
|
+
module Pipeline
|
5
|
+
module Generators
|
6
|
+
module Helpers
|
7
|
+
def available_locales
|
8
|
+
@_available_locales ||= I18n.available_locales.presence || [I18n.default_locale.presence || :en]
|
9
|
+
end
|
10
|
+
|
11
|
+
def hashify_locale_keypath(keypath)
|
12
|
+
keypath.split(".").reverse.inject(nil) { |assigned_value, key| {key.to_s => assigned_value} }
|
13
|
+
end
|
14
|
+
|
15
|
+
def indented(indentation = 2, &block)
|
16
|
+
concat(indent(capture(&block), indentation))
|
17
|
+
end
|
18
|
+
|
19
|
+
def remove_possible_suffix(name, *suffixes)
|
20
|
+
regex =
|
21
|
+
if suffixes.empty?
|
22
|
+
/_?(?:(:?steps_?)?controller|pipeline|step)\z/i
|
23
|
+
else
|
24
|
+
/_?(?:#{Regexp.union(*suffixes)})\z/i
|
25
|
+
end
|
26
|
+
|
27
|
+
name.sub(regex, "")
|
28
|
+
end
|
29
|
+
|
30
|
+
def options_as_switches
|
31
|
+
@options_as_switches ||= options.compact_blank.each_with_object([]) do |(option, value), obj|
|
32
|
+
next unless value
|
33
|
+
|
34
|
+
obj << "--#{option.to_s.dasherize}"
|
35
|
+
obj << value.presence unless value == true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,9 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "rails/generators/named_base"
|
4
|
+
require_relative "helpers"
|
4
5
|
|
5
6
|
module Wicked
|
6
7
|
class PipelineGenerator < Rails::Generators::NamedBase
|
8
|
+
include ::Wicked::Pipeline::Generators::Helpers
|
9
|
+
|
7
10
|
check_class_collision suffix: "Pipeline"
|
8
11
|
|
9
12
|
source_root File.expand_path("templates", __dir__)
|
@@ -25,11 +28,11 @@ module Wicked
|
|
25
28
|
private
|
26
29
|
|
27
30
|
def file_name
|
28
|
-
@_file_name ||= remove_possible_suffix(super)
|
31
|
+
@_file_name ||= remove_possible_suffix(super, "pipeline")
|
29
32
|
end
|
30
33
|
|
31
|
-
def
|
32
|
-
|
34
|
+
def steps
|
35
|
+
@_steps ||= (@steps.presence || []).uniq
|
33
36
|
end
|
34
37
|
|
35
38
|
def step_classes
|
@@ -41,14 +44,5 @@ module Wicked
|
|
41
44
|
end
|
42
45
|
end
|
43
46
|
end
|
44
|
-
|
45
|
-
def options_as_switches
|
46
|
-
@options_as_switches ||= options.compact_blank.each_with_object([]) do |(option, value), obj|
|
47
|
-
next unless value
|
48
|
-
|
49
|
-
obj << "--#{option.to_s.dasherize}"
|
50
|
-
obj << value.presence unless value == true
|
51
|
-
end
|
52
|
-
end
|
53
47
|
end
|
54
48
|
end
|
@@ -8,8 +8,11 @@ Description:
|
|
8
8
|
To create a step within a module, specify the step name as a
|
9
9
|
path like "parent_module/step_name".
|
10
10
|
|
11
|
+
It will also create locales files for the step for each available locale.
|
12
|
+
|
11
13
|
Example:
|
12
14
|
`bin/rails generate wicked:pipeline:step UserIdendification name is_active:boolean hobbies:array`
|
13
15
|
|
14
16
|
UserIdentificationStep.
|
15
17
|
Step: app/steps/user_identification_step.rb
|
18
|
+
I18n: config/locales/steps/user_identification_step.en.yml
|
@@ -1,30 +1,42 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "rails/generators/named_base"
|
4
|
+
require_relative "../helpers"
|
4
5
|
|
5
6
|
module Wicked
|
6
7
|
module Pipeline
|
7
8
|
class StepGenerator < Rails::Generators::NamedBase
|
9
|
+
include ::Wicked::Pipeline::Generators::Helpers
|
10
|
+
|
8
11
|
check_class_collision suffix: "Step"
|
9
12
|
|
10
13
|
source_root File.expand_path("templates", __dir__)
|
11
14
|
|
12
15
|
argument :attributes, type: :array, default: [], banner: "attribute[:type] attribute[:type]"
|
13
16
|
|
17
|
+
class_option :skip_locales, type: :boolean, default: false, desc: "Don't generate locale files"
|
18
|
+
|
14
19
|
def create_step_file
|
15
20
|
template "step.rb", File.join("app/steps", class_path, "#{file_name}_step.rb")
|
16
21
|
end
|
17
22
|
|
18
23
|
hook_for :test_framework, as: "wicked:pipeline:step"
|
19
24
|
|
20
|
-
|
25
|
+
def create_locale_file
|
26
|
+
return if options[:skip_locales]
|
21
27
|
|
22
|
-
|
23
|
-
|
28
|
+
@structure = hashify_locale_keypath([*class_path, "#{file_name}_step"].join("."))
|
29
|
+
|
30
|
+
available_locales.each do |locale|
|
31
|
+
@locale = locale
|
32
|
+
template "locale.yml", File.join("config/locales/steps", class_path, "#{file_name}_step.#{locale}.yml")
|
33
|
+
end
|
24
34
|
end
|
25
35
|
|
26
|
-
|
27
|
-
|
36
|
+
private
|
37
|
+
|
38
|
+
def file_name
|
39
|
+
@_file_name ||= remove_possible_suffix(super, "step")
|
28
40
|
end
|
29
41
|
|
30
42
|
def array_attributes
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<%= @locale %>:
|
2
|
+
steps:
|
3
|
+
<%= indent(@structure.to_yaml.sub("---\n", ""), 4) -%>
|
4
|
+
<% indented(((file_path.count("/") + 1) * 2) + 4) do -%>
|
5
|
+
# blocking_reasons:
|
6
|
+
# blocking_reasons:
|
7
|
+
# not_compatible: "This answer is not compatible with our offer."
|
8
|
+
<% end -%>
|
9
|
+
|
10
|
+
activemodel:
|
11
|
+
errors:
|
12
|
+
models:
|
13
|
+
<%= file_path %>_step:
|
14
|
+
# required: "is required"
|
15
|
+
# attributes:
|
16
|
+
# total_percentage:
|
17
|
+
# total_percentage_must_equal_100_percent: "Total must be 100%"
|
@@ -18,7 +18,7 @@ module Wicked
|
|
18
18
|
initializer :i18n_load_path do |app|
|
19
19
|
ActiveSupport.on_load(:i18n) do
|
20
20
|
# Prepend the engine i18n load path so that translations can be overriden in the main app
|
21
|
-
engine_i18n_load_path = Dir[Engine.root.join("config", "locales", "
|
21
|
+
engine_i18n_load_path = Dir[Engine.root.join("config", "locales", "wicked", "pipeline", "*.yml").to_s]
|
22
22
|
app.config.i18n.load_path = engine_i18n_load_path.concat(app.config.i18n.load_path)
|
23
23
|
end
|
24
24
|
end
|
data/wicked-pipeline.gemspec
CHANGED
@@ -25,10 +25,10 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
spec.require_paths = ["lib"]
|
27
27
|
|
28
|
-
spec.add_dependency "railties", ">= 6.1"
|
29
|
-
spec.add_dependency "activesupport", ">= 6.1"
|
30
|
-
spec.add_dependency "activemodel", ">= 6.1"
|
31
|
-
spec.add_dependency "actionpack", ">= 6.1"
|
28
|
+
spec.add_dependency "railties", ">= 6.1"
|
29
|
+
spec.add_dependency "activesupport", ">= 6.1"
|
30
|
+
spec.add_dependency "activemodel", ">= 6.1"
|
31
|
+
spec.add_dependency "actionpack", ">= 6.1"
|
32
32
|
|
33
33
|
spec.add_dependency "wicked", "~> 1.3"
|
34
34
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wicked-pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Audi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-04-
|
11
|
+
date: 2022-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -17,9 +17,6 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '6.1'
|
20
|
-
- - "<"
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '7'
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -27,9 +24,6 @@ dependencies:
|
|
27
24
|
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '6.1'
|
30
|
-
- - "<"
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: '7'
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: activesupport
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -37,9 +31,6 @@ dependencies:
|
|
37
31
|
- - ">="
|
38
32
|
- !ruby/object:Gem::Version
|
39
33
|
version: '6.1'
|
40
|
-
- - "<"
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '7'
|
43
34
|
type: :runtime
|
44
35
|
prerelease: false
|
45
36
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -47,9 +38,6 @@ dependencies:
|
|
47
38
|
- - ">="
|
48
39
|
- !ruby/object:Gem::Version
|
49
40
|
version: '6.1'
|
50
|
-
- - "<"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '7'
|
53
41
|
- !ruby/object:Gem::Dependency
|
54
42
|
name: activemodel
|
55
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -57,9 +45,6 @@ dependencies:
|
|
57
45
|
- - ">="
|
58
46
|
- !ruby/object:Gem::Version
|
59
47
|
version: '6.1'
|
60
|
-
- - "<"
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '7'
|
63
48
|
type: :runtime
|
64
49
|
prerelease: false
|
65
50
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -67,9 +52,6 @@ dependencies:
|
|
67
52
|
- - ">="
|
68
53
|
- !ruby/object:Gem::Version
|
69
54
|
version: '6.1'
|
70
|
-
- - "<"
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: '7'
|
73
55
|
- !ruby/object:Gem::Dependency
|
74
56
|
name: actionpack
|
75
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -77,9 +59,6 @@ dependencies:
|
|
77
59
|
- - ">="
|
78
60
|
- !ruby/object:Gem::Version
|
79
61
|
version: '6.1'
|
80
|
-
- - "<"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '7'
|
83
62
|
type: :runtime
|
84
63
|
prerelease: false
|
85
64
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -87,9 +66,6 @@ dependencies:
|
|
87
66
|
- - ">="
|
88
67
|
- !ruby/object:Gem::Version
|
89
68
|
version: '6.1'
|
90
|
-
- - "<"
|
91
|
-
- !ruby/object:Gem::Version
|
92
|
-
version: '7'
|
93
69
|
- !ruby/object:Gem::Dependency
|
94
70
|
name: wicked
|
95
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,6 +96,10 @@ files:
|
|
120
96
|
- README.md
|
121
97
|
- Rakefile
|
122
98
|
- app/controllers/wicked/pipeline/base_steps_controller.rb
|
99
|
+
- config/locales/wicked/pipeline/en.yml
|
100
|
+
- lib/generators/erb/wicked/pipeline/controller/controller_generator.rb
|
101
|
+
- lib/generators/erb/wicked/pipeline/controller/templates/_step.html.erb
|
102
|
+
- lib/generators/erb/wicked/pipeline/controller/templates/view.html.erb.tt
|
123
103
|
- lib/generators/rspec/wicked/pipeline/USAGE
|
124
104
|
- lib/generators/rspec/wicked/pipeline/pipeline_generator.rb
|
125
105
|
- lib/generators/rspec/wicked/pipeline/step/USAGE
|
@@ -127,9 +107,15 @@ files:
|
|
127
107
|
- lib/generators/rspec/wicked/pipeline/step/templates/step_spec.rb.tt
|
128
108
|
- lib/generators/rspec/wicked/pipeline/templates/pipeline_spec.rb.tt
|
129
109
|
- lib/generators/wicked/pipeline/USAGE
|
110
|
+
- lib/generators/wicked/pipeline/controller/USAGE
|
111
|
+
- lib/generators/wicked/pipeline/controller/controller_generator.rb
|
112
|
+
- lib/generators/wicked/pipeline/controller/templates/controller.rb.tt
|
113
|
+
- lib/generators/wicked/pipeline/controller/templates/locale.yml
|
114
|
+
- lib/generators/wicked/pipeline/helpers.rb
|
130
115
|
- lib/generators/wicked/pipeline/pipeline_generator.rb
|
131
116
|
- lib/generators/wicked/pipeline/step/USAGE
|
132
117
|
- lib/generators/wicked/pipeline/step/step_generator.rb
|
118
|
+
- lib/generators/wicked/pipeline/step/templates/locale.yml
|
133
119
|
- lib/generators/wicked/pipeline/step/templates/step.rb.tt
|
134
120
|
- lib/generators/wicked/pipeline/templates/pipeline.rb.tt
|
135
121
|
- lib/wicked/pipeline.rb
|