mobile_workflow 0.10.1 → 0.11.1
Sign up to get free protection for your applications and to get access to all the features.
- 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 +9 -8
- 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/displayable.rb +10 -9
- 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 +5 -2
- metadata +27 -7
- data/app/models/concerns/mobile_workflow/displayable/steps/pie_chart.rb +0 -11
@@ -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
|