mobile_workflow 0.10.2 → 0.12.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/Rakefile +3 -1
- data/app/controllers/concerns/mobile_workflow/param_parser.rb +6 -3
- data/app/controllers/concerns/mobile_workflow/s3_storable.rb +18 -12
- data/app/controllers/mobile_workflow/sns_notifications_controller.rb +25 -22
- data/app/helpers/mobile_workflow/application_helper.rb +2 -0
- data/app/jobs/mobile_workflow/add_attachment_job.rb +2 -1
- data/app/jobs/mobile_workflow/application_job.rb +2 -0
- data/app/mailers/mobile_workflow/application_mailer.rb +2 -0
- data/app/models/concerns/mobile_workflow/attachable.rb +5 -5
- data/app/models/concerns/mobile_workflow/displayable/steps/form.rb +12 -69
- data/app/models/concerns/mobile_workflow/displayable/steps/list.rb +6 -3
- data/app/models/concerns/mobile_workflow/displayable/steps/map.rb +8 -4
- data/app/models/concerns/mobile_workflow/displayable/steps/question.rb +14 -8
- data/app/models/concerns/mobile_workflow/displayable/steps/stack.rb +22 -75
- data/app/models/concerns/mobile_workflow/displayable/steps/styled_content/grid.rb +10 -21
- data/app/models/concerns/mobile_workflow/displayable/steps/styled_content/stack.rb +8 -28
- data/app/models/concerns/mobile_workflow/displayable.rb +10 -8
- data/bin/mwf +11 -10
- data/config/initializers/add_frozen_string_literal.rb +4 -3
- data/config/routes.rb +2 -0
- data/lib/generators/mobile_workflow/controller_generator.rb +26 -21
- data/lib/generators/mobile_workflow/install/install_generator.rb +55 -52
- data/lib/generators/mobile_workflow/install/templates/app/helpers/application_helper.rb +2 -0
- data/lib/generators/mobile_workflow/install/templates/app/models/ability.rb +2 -0
- data/lib/generators/mobile_workflow/install/templates/app/models/application_record.rb +2 -0
- data/lib/generators/mobile_workflow/install/templates/create_users.rb +2 -0
- data/lib/generators/mobile_workflow/install/templates/spec/factories/users.rb +2 -0
- data/lib/generators/mobile_workflow/model_generator.rb +7 -3
- data/lib/mobile_workflow/cli/app_builder.rb +147 -140
- data/lib/mobile_workflow/cli/app_server_cleaner.rb +19 -14
- data/lib/mobile_workflow/cli/app_server_generator.rb +53 -49
- data/lib/mobile_workflow/cli/aws_backend.rb +82 -74
- data/lib/mobile_workflow/cli/dokku_backend.rb +58 -55
- data/lib/mobile_workflow/cli/heroku_backend.rb +54 -49
- data/lib/mobile_workflow/cli.rb +9 -7
- data/lib/mobile_workflow/deprecated.rb +34 -0
- data/lib/mobile_workflow/engine.rb +3 -1
- data/lib/mobile_workflow/open_api_spec/parser.rb +25 -24
- data/lib/mobile_workflow/railtie.rb +3 -1
- data/lib/mobile_workflow/tasks/s3.rake +5 -3
- data/lib/mobile_workflow/tasks/set_env.rake +30 -31
- data/lib/mobile_workflow/version.rb +3 -1
- data/lib/mobile_workflow.rb +4 -2
- metadata +22 -23
- data/app/models/concerns/mobile_workflow/displayable/steps/pie_chart.rb +0 -11
- data/lib/mobile_workflow/displayable.rb +0 -9
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module MobileWorkflow
|
2
4
|
module Displayable
|
3
5
|
def self.included(base)
|
@@ -6,29 +8,29 @@ module MobileWorkflow
|
|
6
8
|
|
7
9
|
include Steps::List
|
8
10
|
include Steps::Map
|
9
|
-
include Steps::PieChart
|
10
11
|
include Steps::Question
|
11
12
|
include Steps::Stack
|
12
13
|
include Steps::StyledContent::Grid
|
13
14
|
include Steps::StyledContent::Stack
|
14
15
|
|
15
|
-
BUTTON_STYLES = [
|
16
|
-
ON_SUCCESS_OPTIONS = [
|
17
|
-
|
16
|
+
BUTTON_STYLES = %i[primary outline danger textOnly].freeze
|
17
|
+
ON_SUCCESS_OPTIONS = %i[none reload backward forward].freeze
|
18
|
+
|
18
19
|
private
|
20
|
+
|
19
21
|
def validate_on_success!(on_success)
|
20
22
|
raise 'Unknown on_success action' unless ON_SUCCESS_OPTIONS.include?(on_success)
|
21
23
|
end
|
22
|
-
|
24
|
+
|
23
25
|
def validate_button_style!(style)
|
24
|
-
raise 'Unknown style' unless BUTTON_STYLES.include?(style)
|
26
|
+
raise 'Unknown style' unless BUTTON_STYLES.include?(style)
|
25
27
|
end
|
26
28
|
|
27
29
|
def camelcase_converter(string, first_letter: :upper)
|
28
|
-
string = string.split(
|
30
|
+
string = string.split('_').map(&:capitalize).join
|
29
31
|
return string unless first_letter == :lower
|
30
32
|
|
31
33
|
string[0].downcase + string[1..-1]
|
32
34
|
end
|
33
35
|
end
|
34
|
-
end
|
36
|
+
end
|
data/bin/mwf
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require_relative '../lib/mobile_workflow/cli'
|
3
5
|
|
4
6
|
# Byebug for dev
|
@@ -8,27 +10,26 @@ rescue LoadError
|
|
8
10
|
end
|
9
11
|
|
10
12
|
if ARGV.empty?
|
11
|
-
puts
|
12
|
-
puts
|
13
|
-
puts
|
13
|
+
puts 'USAGE: mwf <platform> <command> [options]'
|
14
|
+
puts 'Example: mwf rails create:app_server --help'
|
15
|
+
puts 'Example: mwf rails destroy:app_server --help'
|
14
16
|
exit 0
|
15
17
|
elsif ['-v', '--version'].include? ARGV[0]
|
16
18
|
puts MobileWorkflow::VERSION
|
17
19
|
exit 0
|
18
|
-
elsif 'rails'
|
20
|
+
elsif ARGV[0] == 'rails' && ARGV[1] == 'create:app_server'
|
19
21
|
ARGV.shift
|
20
22
|
ARGV.shift
|
21
|
-
|
22
|
-
templates_root = File.expand_path(File.join(
|
23
|
+
|
24
|
+
templates_root = File.expand_path(File.join('..', 'lib', 'generators', 'mobile_workflow', 'install', 'templates'),
|
25
|
+
File.dirname(__FILE__))
|
23
26
|
MobileWorkflow::Cli::AppServerGenerator.source_root templates_root
|
24
27
|
MobileWorkflow::Cli::AppServerGenerator.source_paths << Rails::Generators::AppGenerator.source_root << templates_root
|
25
28
|
MobileWorkflow::Cli::AppServerGenerator.start
|
26
|
-
elsif 'rails'
|
29
|
+
elsif ARGV[0] == 'rails' && ARGV[1] == 'destroy:app_server'
|
27
30
|
ARGV.shift
|
28
31
|
ARGV.shift
|
29
|
-
|
32
|
+
|
30
33
|
ARGV.unshift(MobileWorkflow::Cli::AppServerCleaner.default_task) unless ARGV[0] == '--help'
|
31
34
|
MobileWorkflow::Cli::AppServerCleaner.start(ARGV)
|
32
35
|
end
|
33
|
-
|
34
|
-
|
@@ -8,11 +8,12 @@
|
|
8
8
|
return unless defined?(::Rails::Generators)
|
9
9
|
|
10
10
|
module RailsGeneratorFrozenStringLiteralPrepend
|
11
|
-
RUBY_EXTENSIONS = %w[.rb .rake]
|
11
|
+
RUBY_EXTENSIONS = %w[.rb .rake].freeze
|
12
12
|
|
13
13
|
def render
|
14
|
-
return super unless RUBY_EXTENSIONS.include? File.extname(
|
15
|
-
|
14
|
+
return super unless RUBY_EXTENSIONS.include? File.extname(destination)
|
15
|
+
|
16
|
+
"# frozen_string_literal: true\n\n#{super}"
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
data/config/routes.rb
CHANGED
@@ -1,55 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module MobileWorkflow
|
2
4
|
module Generators
|
3
5
|
# Custom scaffolding generator
|
4
6
|
# https://github.com/rails/rails/blob/master/railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb
|
5
7
|
class ControllerGenerator < Rails::Generators::NamedBase
|
6
8
|
include Rails::Generators::ResourceHelpers
|
7
|
-
source_root File.expand_path(
|
8
|
-
|
9
|
-
class_option :attributes, type: :array, default: [], banner:
|
10
|
-
class_option :actions, type: :array, default: [], banner:
|
9
|
+
source_root File.expand_path('templates', __dir__)
|
10
|
+
|
11
|
+
class_option :attributes, type: :array, default: [], banner: 'field:type field:type'
|
12
|
+
class_option :actions, type: :array, default: [], banner: 'index create update destroy'
|
11
13
|
class_option :doorkeeper_oauth, type: :boolean, default: false
|
12
14
|
class_option :s3_storage, type: :boolean, default: false
|
13
|
-
|
15
|
+
|
14
16
|
def copy_controller_and_spec_files
|
15
|
-
template
|
16
|
-
|
17
|
+
template 'controller.rb.erb',
|
18
|
+
File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")
|
19
|
+
template 'controller_spec.rb.erb',
|
20
|
+
File.join('spec/controllers', controller_class_path, "#{controller_file_name}_controller_spec.rb")
|
17
21
|
end
|
18
|
-
|
22
|
+
|
19
23
|
private
|
24
|
+
|
20
25
|
def doorkeeper_oauth?
|
21
26
|
options[:doorkeeper_oauth]
|
22
27
|
end
|
23
|
-
|
28
|
+
|
24
29
|
def s3_storage?
|
25
30
|
options[:s3_storage]
|
26
31
|
end
|
27
|
-
|
32
|
+
|
28
33
|
def attributes_names
|
29
|
-
options[:attributes].map{ |attribute| attribute.split(
|
34
|
+
options[:attributes].map { |attribute| attribute.split(':').first }
|
30
35
|
end
|
31
|
-
|
36
|
+
|
32
37
|
def permitted_params
|
33
38
|
permitted_attributes = attributes_names.dup
|
34
39
|
permitted_attributes.delete('user')
|
35
|
-
permitted_attributes.map{ |name| ":#{name}" }.join(
|
40
|
+
permitted_attributes.map { |name| ":#{name}" }.join(', ')
|
36
41
|
end
|
37
|
-
|
42
|
+
|
38
43
|
def index_action?
|
39
|
-
actions.include?(
|
44
|
+
actions.include?('index')
|
40
45
|
end
|
41
|
-
|
46
|
+
|
42
47
|
def show_action?
|
43
|
-
actions.include?(
|
48
|
+
actions.include?('show')
|
44
49
|
end
|
45
|
-
|
50
|
+
|
46
51
|
def create_action?
|
47
|
-
actions.include?(
|
52
|
+
actions.include?('create')
|
48
53
|
end
|
49
|
-
|
54
|
+
|
50
55
|
def actions
|
51
56
|
options[:actions]
|
52
57
|
end
|
53
58
|
end
|
54
59
|
end
|
55
|
-
end
|
60
|
+
end
|
@@ -1,63 +1,66 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/base'
|
4
|
+
require 'rails/generators/active_model'
|
5
|
+
require 'rails/generators/active_record/migration'
|
6
|
+
require 'active_record'
|
7
|
+
require 'mobile_workflow/open_api_spec/parser'
|
6
8
|
|
7
9
|
module MobileWorkflow
|
8
10
|
module Generators
|
9
11
|
class InstallGenerator < Rails::Generators::Base
|
10
12
|
include ActiveRecord::Generators::Migration
|
11
|
-
|
12
|
-
source_root File.expand_path("../templates", __FILE__)
|
13
13
|
|
14
|
-
|
14
|
+
source_root File.expand_path('templates', __dir__)
|
15
|
+
|
16
|
+
class_option :open_api_spec_path, type: :string, default: 'config/open_api_spec.json'
|
15
17
|
class_option :doorkeeper_oauth, type: :boolean, default: false
|
16
18
|
class_option :s3_storage, type: :boolean, default: false
|
17
19
|
class_option :interactive, type: :boolean, default: false
|
18
20
|
|
19
21
|
def create_api_controller
|
20
|
-
template(
|
22
|
+
template('api_controller.rb.erb', 'app/controllers/api_controller.rb')
|
21
23
|
end
|
22
|
-
|
24
|
+
|
23
25
|
def mount_engine
|
24
26
|
route "mount MobileWorkflow::Engine => '/'"
|
25
27
|
end
|
26
|
-
|
28
|
+
|
27
29
|
def generate_doorkeeper
|
28
30
|
return unless options[:doorkeeper_oauth]
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
|
32
|
+
say 'Generating Doorkeeper OAuth'
|
33
|
+
|
34
|
+
migration_template 'create_users.rb', 'db/migrate/create_users.rb'
|
35
|
+
|
33
36
|
generate 'doorkeeper:install'
|
34
|
-
gsub_file 'config/initializers/doorkeeper.rb',
|
37
|
+
gsub_file 'config/initializers/doorkeeper.rb',
|
38
|
+
%(raise "Please configure doorkeeper resource_owner_authenticator block located in #{__FILE__}"), 'User.find_by_id(session.delete(:user_id)) || redirect_to(new_session_url(return_to: request.fullpath))'
|
35
39
|
generate 'doorkeeper:migration'
|
36
40
|
generate 'doorkeeper:pkce'
|
37
|
-
template(
|
38
|
-
template(
|
39
|
-
route
|
40
|
-
|
41
|
+
template('user.rb.erb', 'app/models/user.rb')
|
42
|
+
template('sessions_controller.rb.erb', 'app/controllers/sessions_controller.rb')
|
43
|
+
route 'resources :sessions, only: [:new, :create]'
|
44
|
+
|
41
45
|
# View related for login screen
|
42
|
-
copy_file(
|
43
|
-
copy_file(
|
44
|
-
copy_file(
|
45
|
-
copy_file(
|
46
|
+
copy_file('app/views/layouts/application.html.erb')
|
47
|
+
copy_file('app/views/sessions/new.html.erb')
|
48
|
+
copy_file('app/helpers/application_helper.rb')
|
49
|
+
copy_file('spec/factories/users.rb')
|
46
50
|
end
|
47
|
-
|
51
|
+
|
48
52
|
def generate_models
|
49
53
|
say "Loading OpenAPI Spec: #{open_api_spec_path}"
|
50
|
-
say
|
51
|
-
|
52
|
-
copy_file(
|
53
|
-
|
54
|
-
model_name_to_properties.each_pair do |model_name, model_properties|
|
55
|
-
|
54
|
+
say 'Generating models'
|
55
|
+
|
56
|
+
copy_file('app/models/application_record.rb')
|
57
|
+
|
58
|
+
model_name_to_properties.each_pair do |model_name, model_properties|
|
56
59
|
if doorkeeper_oauth?
|
57
60
|
model_properties = "#{model_properties} user:references"
|
58
61
|
@model_name_to_properties[model_name] = model_properties
|
59
62
|
end
|
60
|
-
|
63
|
+
|
61
64
|
if interactive? && !yes?("Use generated schema #{model_name}(#{model_properties})[yn]?")
|
62
65
|
model_properties = ask "Specify schema for #{model_name}: (e.g. text:string image:attachment region:reference)"
|
63
66
|
@model_name_to_properties[model_name] = model_properties
|
@@ -68,63 +71,63 @@ module MobileWorkflow
|
|
68
71
|
end
|
69
72
|
|
70
73
|
def ability_generator
|
71
|
-
copy_file(
|
74
|
+
copy_file('app/models/ability.rb')
|
72
75
|
end
|
73
76
|
|
74
77
|
def generate_deserializers
|
75
|
-
say
|
78
|
+
say 'Generating deserializers'
|
76
79
|
|
77
80
|
model_name_to_properties.each_pair do |model_name, properties|
|
78
81
|
@deserializer_class = model_name
|
79
82
|
@deserializer_properties = properties.split(' ').map { |attribute| attribute.split(':').first }
|
80
83
|
|
81
|
-
template(
|
82
|
-
template(
|
84
|
+
template('deserializer.rb.erb', "app/services/#{model_name}_deserializer.rb")
|
85
|
+
template('deserializer_spec.rb.erb', "spec/services/#{model_name}_deserializer_spec.rb")
|
83
86
|
end
|
84
87
|
end
|
85
88
|
|
86
89
|
def generate_controllers_and_routes
|
87
|
-
say
|
90
|
+
say 'Generating controllers'
|
88
91
|
controller_name_to_actions = open_api_spec.controller_name_to_actions
|
89
92
|
route "root to: 'admin/#{controller_name_to_actions.keys.first}#index'"
|
90
|
-
|
93
|
+
|
91
94
|
controller_name_to_actions.each_pair do |plural_controller_name, actions|
|
92
95
|
controller_name = plural_controller_name.singularize
|
93
96
|
model_properties = model_name_to_properties[controller_name]
|
94
|
-
|
97
|
+
|
95
98
|
unless model_properties
|
96
99
|
# Generate a model because it probably wasnt present in the schema
|
97
100
|
# And set default attributes
|
98
|
-
model_properties =
|
101
|
+
model_properties = 'text:string'
|
99
102
|
generate_model(controller_name, model_properties)
|
100
103
|
end
|
101
|
-
|
102
|
-
generate "mobile_workflow:controller #{controller_name} --actions #{actions.join(
|
103
|
-
route "resources :#{plural_controller_name}, only: [#{actions.map{|a| ":#{a}"}.join(
|
104
|
+
|
105
|
+
generate "mobile_workflow:controller #{controller_name} --actions #{actions.join(' ')} --attributes #{model_properties} #{generate_controller_args}".strip
|
106
|
+
route "resources :#{plural_controller_name}, only: [#{actions.map { |a| ":#{a}" }.join(', ')}]"
|
104
107
|
end
|
105
108
|
end
|
106
109
|
|
107
110
|
def generate_seeds
|
108
|
-
template(
|
111
|
+
template('seeds.rb.erb', 'db/seeds.rb', force: true)
|
109
112
|
end
|
110
113
|
|
111
114
|
private
|
112
|
-
|
115
|
+
|
113
116
|
def generate_model(model_name, model_properties)
|
114
117
|
generate("mobile_workflow:model #{model_name} #{model_properties}")
|
115
118
|
end
|
116
|
-
|
119
|
+
|
117
120
|
def generate_controller_args
|
118
121
|
args = ''
|
119
122
|
args += ' --s3-storage' if s3_storage?
|
120
123
|
args += ' --doorkeeper-oauth' if doorkeeper_oauth?
|
121
124
|
args.strip
|
122
125
|
end
|
123
|
-
|
126
|
+
|
124
127
|
def model_name_to_properties
|
125
128
|
@model_name_to_properties ||= open_api_spec.model_name_to_properties
|
126
129
|
end
|
127
|
-
|
130
|
+
|
128
131
|
def open_api_spec
|
129
132
|
@open_api_spec ||= ::MobileWorkflow::OpenApiSpec::Parser.new(File.read(open_api_spec_path))
|
130
133
|
end
|
@@ -132,18 +135,18 @@ module MobileWorkflow
|
|
132
135
|
def doorkeeper_oauth?
|
133
136
|
options[:doorkeeper_oauth]
|
134
137
|
end
|
135
|
-
|
138
|
+
|
136
139
|
def s3_storage?
|
137
140
|
options[:s3_storage]
|
138
141
|
end
|
139
|
-
|
142
|
+
|
140
143
|
def open_api_spec_path
|
141
144
|
options[:open_api_spec_path]
|
142
145
|
end
|
143
|
-
|
146
|
+
|
144
147
|
def interactive?
|
145
148
|
options[:interactive]
|
146
149
|
end
|
147
150
|
end
|
148
151
|
end
|
149
|
-
end
|
152
|
+
end
|
@@ -1,15 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rails/generators/active_record/model/model_generator'
|
2
4
|
|
3
5
|
module MobileWorkflow
|
4
6
|
module Generators
|
5
|
-
|
6
7
|
class ModelGenerator < ActiveRecord::Generators::ModelGenerator
|
7
|
-
source_root File.join(
|
8
|
+
source_root File.join(
|
9
|
+
File.dirname(ActiveRecord::Generators::ModelGenerator.instance_method(:create_migration_file).source_location.first), 'templates'
|
10
|
+
)
|
8
11
|
|
9
12
|
class_option :doorkeeper_oauth, type: :boolean, default: false
|
10
13
|
|
11
14
|
def create_model_file
|
12
|
-
template File.join(File.dirname(__FILE__),
|
15
|
+
template File.join(File.dirname(__FILE__), 'templates', 'model.rb.erb'),
|
16
|
+
File.join('app/models', class_path, "#{file_name}.rb")
|
13
17
|
end
|
14
18
|
|
15
19
|
private
|