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.
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 +5 -5
  11. data/app/models/concerns/mobile_workflow/displayable/steps/form.rb +12 -69
  12. data/app/models/concerns/mobile_workflow/displayable/steps/list.rb +9 -8
  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 +27 -7
  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