mobile_workflow 0.10.2 → 0.11.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -1
  3. data/app/controllers/concerns/mobile_workflow/param_parser.rb +6 -3
  4. data/app/controllers/concerns/mobile_workflow/s3_storable.rb +18 -12
  5. data/app/controllers/mobile_workflow/sns_notifications_controller.rb +25 -22
  6. data/app/helpers/mobile_workflow/application_helper.rb +2 -0
  7. data/app/jobs/mobile_workflow/add_attachment_job.rb +2 -1
  8. data/app/jobs/mobile_workflow/application_job.rb +2 -0
  9. data/app/mailers/mobile_workflow/application_mailer.rb +2 -0
  10. data/app/models/concerns/mobile_workflow/attachable.rb +3 -3
  11. data/app/models/concerns/mobile_workflow/displayable/steps/form.rb +12 -69
  12. data/app/models/concerns/mobile_workflow/displayable/steps/list.rb +6 -3
  13. data/app/models/concerns/mobile_workflow/displayable/steps/map.rb +8 -4
  14. data/app/models/concerns/mobile_workflow/displayable/steps/question.rb +14 -8
  15. data/app/models/concerns/mobile_workflow/displayable/steps/stack.rb +22 -75
  16. data/app/models/concerns/mobile_workflow/displayable/steps/styled_content/grid.rb +10 -21
  17. data/app/models/concerns/mobile_workflow/displayable/steps/styled_content/stack.rb +8 -28
  18. data/app/models/concerns/mobile_workflow/displayable.rb +10 -8
  19. data/bin/mwf +11 -10
  20. data/config/initializers/add_frozen_string_literal.rb +4 -3
  21. data/config/routes.rb +2 -0
  22. data/lib/generators/mobile_workflow/controller_generator.rb +26 -21
  23. data/lib/generators/mobile_workflow/install/install_generator.rb +55 -52
  24. data/lib/generators/mobile_workflow/install/templates/app/helpers/application_helper.rb +2 -0
  25. data/lib/generators/mobile_workflow/install/templates/app/models/ability.rb +2 -0
  26. data/lib/generators/mobile_workflow/install/templates/app/models/application_record.rb +2 -0
  27. data/lib/generators/mobile_workflow/install/templates/create_users.rb +2 -0
  28. data/lib/generators/mobile_workflow/install/templates/spec/factories/users.rb +2 -0
  29. data/lib/generators/mobile_workflow/model_generator.rb +7 -3
  30. data/lib/mobile_workflow/cli/app_builder.rb +147 -140
  31. data/lib/mobile_workflow/cli/app_server_cleaner.rb +19 -14
  32. data/lib/mobile_workflow/cli/app_server_generator.rb +53 -49
  33. data/lib/mobile_workflow/cli/aws_backend.rb +82 -74
  34. data/lib/mobile_workflow/cli/dokku_backend.rb +58 -55
  35. data/lib/mobile_workflow/cli/heroku_backend.rb +54 -49
  36. data/lib/mobile_workflow/cli.rb +9 -7
  37. data/lib/mobile_workflow/deprecated.rb +34 -0
  38. data/lib/mobile_workflow/displayable.rb +10 -9
  39. data/lib/mobile_workflow/engine.rb +3 -1
  40. data/lib/mobile_workflow/open_api_spec/parser.rb +25 -24
  41. data/lib/mobile_workflow/railtie.rb +3 -1
  42. data/lib/mobile_workflow/tasks/s3.rake +5 -3
  43. data/lib/mobile_workflow/tasks/set_env.rake +30 -31
  44. data/lib/mobile_workflow/version.rb +3 -1
  45. data/lib/mobile_workflow.rb +5 -2
  46. metadata +21 -21
  47. 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 = [:primary, :outline, :danger, :textOnly]
16
- ON_SUCCESS_OPTIONS = [:none, :reload, :backward, :forward]
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("_").map(&:capitalize).join
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 "USAGE: mwf <platform> <command> [options]"
12
- puts "Example: mwf rails create:app_server --help"
13
- puts "Example: mwf rails destroy:app_server --help"
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' == ARGV[0] && 'create:app_server' == ARGV[1]
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("..", "lib", "generators", "mobile_workflow", "install", "templates"), File.dirname(__FILE__))
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' == ARGV[0] && 'destroy:app_server' == ARGV[1]
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(self.destination)
15
- "# frozen_string_literal: true\n\n" + super
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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  MobileWorkflow::Engine.routes.draw do
2
4
  resources :sns_notifications, only: :create
3
5
  end
@@ -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("../templates", __FILE__)
8
-
9
- class_option :attributes, type: :array, default: [], banner: "field:type field:type"
10
- class_option :actions, type: :array, default: [], banner: "index create update destroy"
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 "controller.rb.erb", File.join("app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
16
- template "controller_spec.rb.erb", File.join("spec/controllers", controller_class_path, "#{controller_file_name}_controller_spec.rb")
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(":").first }
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?("index")
44
+ actions.include?('index')
40
45
  end
41
-
46
+
42
47
  def show_action?
43
- actions.include?("show")
48
+ actions.include?('show')
44
49
  end
45
-
50
+
46
51
  def create_action?
47
- actions.include?("create")
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
- require "rails/generators/base"
2
- require "rails/generators/active_model"
3
- require "rails/generators/active_record/migration"
4
- require "active_record"
5
- require "mobile_workflow/open_api_spec/parser"
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
- class_option :open_api_spec_path, type: :string, default: "config/open_api_spec.json"
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("api_controller.rb.erb", "app/controllers/api_controller.rb")
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
- say "Generating Doorkeeper OAuth"
30
-
31
- migration_template "create_users.rb", "db/migrate/create_users.rb"
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', '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))'
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("user.rb.erb", "app/models/user.rb")
38
- template("sessions_controller.rb.erb", "app/controllers/sessions_controller.rb")
39
- route "resources :sessions, only: [:new, :create]"
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("app/views/layouts/application.html.erb")
43
- copy_file("app/views/sessions/new.html.erb")
44
- copy_file("app/helpers/application_helper.rb")
45
- copy_file("spec/factories/users.rb")
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 "Generating models"
51
-
52
- copy_file("app/models/application_record.rb")
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("app/models/ability.rb")
74
+ copy_file('app/models/ability.rb')
72
75
  end
73
76
 
74
77
  def generate_deserializers
75
- say "Generating deserializers"
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("deserializer.rb.erb", "app/services/#{model_name}_deserializer.rb")
82
- template("deserializer_spec.rb.erb", "spec/services/#{model_name}_deserializer_spec.rb")
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 "Generating controllers"
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 = "text:string"
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(" ")} --attributes #{model_properties} #{generate_controller_args}".strip
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("seeds.rb.erb", "db/seeds.rb", force: true)
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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ApplicationHelper
2
4
  def bootstrap_class_for(flash_type)
3
5
  { success: "alert-success", error: "alert-danger", alert: "alert-warning", notice: "alert-info" }.stringify_keys[flash_type.to_s] || flash_type.to_s
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Ability
2
4
  include CanCan::Ability
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ApplicationRecord < ActiveRecord::Base
2
4
  include MobileWorkflow::Attachable
3
5
  include MobileWorkflow::Displayable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CreateUsers < ActiveRecord::Migration[6.0]
2
4
  def change
3
5
  create_table :users do |t|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  FactoryBot.define do
2
4
  factory :user do
3
5
  sequence(:email) { |n| "person#{n}@example.com" }
@@ -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(File.dirname(ActiveRecord::Generators::ModelGenerator.instance_method(:create_migration_file).source_location.first), "templates")
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__), "templates", "model.rb.erb"), File.join('app/models', class_path, "#{file_name}.rb")
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