mobile_workflow 0.5.11 → 0.6.4
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/lib/generators/mobile_workflow/controller_generator.rb +5 -0
- data/lib/generators/mobile_workflow/install/install_generator.rb +30 -39
- data/lib/generators/mobile_workflow/install/templates/Gemfile.erb +3 -0
- data/lib/generators/mobile_workflow/model_generator.rb +15 -0
- data/lib/generators/mobile_workflow/templates/controller.rb.erb +5 -1
- data/lib/generators/mobile_workflow/templates/controller_spec.rb.erb +2 -0
- data/lib/{templates/active_record/model → generators/mobile_workflow/templates}/model.rb.erb +5 -2
- data/lib/mobile_workflow/cli/app_builder.rb +6 -0
- data/lib/mobile_workflow/cli/app_server_generator.rb +1 -0
- data/lib/mobile_workflow/open_api_spec/parser.rb +59 -0
- data/lib/mobile_workflow/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d3b107beb896ad8c143fe376e7532d3f7d3093435f1b0b59a15401dba17d752
|
4
|
+
data.tar.gz: '097097c10f64a32065c90e42779b672fecd4b964a15eb43e887d686718c3acfb'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8fea51abb663711210ef86a67a8a2b5bcaaedd95d8772fb1297d6deaa10ee4142af6a0a2a6948db56f088da31aa26833b580c6ed7be994c16df6884338394dd
|
7
|
+
data.tar.gz: 41fee4840d3925030a310530cca5f778a1b989d5f37bea0c8fc7440d3947d04fade3ac3abf040b0f6bf6a0e3508b492b840871c7c73c50fb7b9201decf8703b7
|
@@ -9,6 +9,7 @@ module MobileWorkflow
|
|
9
9
|
class_option :attributes, type: :array, default: [], banner: "field:type field:type"
|
10
10
|
class_option :actions, type: :array, default: [], banner: "index create update destroy"
|
11
11
|
class_option :doorkeeper_oauth, type: :boolean, default: false
|
12
|
+
class_option :s3_storage, type: :boolean, default: false
|
12
13
|
|
13
14
|
def copy_controller_and_spec_files
|
14
15
|
template "controller.rb.erb", File.join("app/controllers", controller_class_path, "#{controller_file_name}_controller.rb")
|
@@ -20,6 +21,10 @@ module MobileWorkflow
|
|
20
21
|
options[:doorkeeper_oauth]
|
21
22
|
end
|
22
23
|
|
24
|
+
def s3_storage?
|
25
|
+
options[:s3_storage]
|
26
|
+
end
|
27
|
+
|
23
28
|
def attributes_names
|
24
29
|
options[:attributes].map{ |attribute| attribute.split(":").first }
|
25
30
|
end
|
@@ -1,16 +1,15 @@
|
|
1
1
|
require "rails/generators/base"
|
2
|
+
require "mobile_workflow/open_api_spec/parser"
|
2
3
|
|
3
4
|
module MobileWorkflow
|
4
5
|
module Generators
|
5
6
|
class InstallGenerator < Rails::Generators::Base
|
6
7
|
|
7
|
-
# Schemas to avoid generating models for (static items from MW)
|
8
|
-
SKIP_SCHEMAS = ["attachment", "ListItem", "DisplayItem", "DisplayText", "DisplayButton", "DisplayImage", "DisplayVideo"]
|
9
|
-
|
10
8
|
source_root File.expand_path("../templates", __FILE__)
|
11
9
|
|
12
10
|
class_option :open_api_spec_path, type: :string, default: "config/open_api_spec.json"
|
13
11
|
class_option :doorkeeper_oauth, type: :boolean, default: false
|
12
|
+
class_option :s3_storage, type: :boolean, default: false
|
14
13
|
class_option :interactive, type: :boolean, default: false
|
15
14
|
|
16
15
|
def create_api_controller
|
@@ -40,26 +39,34 @@ module MobileWorkflow
|
|
40
39
|
end
|
41
40
|
|
42
41
|
def generate_models
|
42
|
+
say "Loading OpenAPI Spec: #{open_api_spec_path}"
|
43
43
|
say "Generating models"
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
@model_properties[model_name] = model_properties
|
44
|
+
model_name_to_properties.each_pair do |model_name, model_properties|
|
45
|
+
if interactive? && !yes?("Use generated schema #{model_name}(#{model_properties})[yn]?")
|
46
|
+
model_properties = ask "Specify schema for #{model_name}: (e.g. text:string image:attachment region:reference)"
|
47
|
+
end
|
48
|
+
|
49
|
+
generate_model(model_name, model_properties)
|
50
|
+
@model_name_to_properties[model_name] = model_properties
|
52
51
|
end
|
53
52
|
end
|
54
53
|
|
55
54
|
def generate_controllers_and_routes
|
56
55
|
say "Generating controllers"
|
57
|
-
route "root to: 'admin/#{controller_names.first}#index'"
|
56
|
+
route "root to: 'admin/#{open_api_spec.controller_names.first}#index'"
|
58
57
|
|
59
|
-
controller_names.each do |plural_controller_name|
|
58
|
+
open_api_spec.controller_names.each do |plural_controller_name|
|
60
59
|
controller_name = plural_controller_name.singularize
|
61
|
-
model_properties =
|
62
|
-
|
60
|
+
model_properties = model_name_to_properties[controller_name]
|
61
|
+
|
62
|
+
unless model_properties
|
63
|
+
# Generate a model because it probably wasnt present in the schema
|
64
|
+
# And set default attributes
|
65
|
+
model_properties = "text:string"
|
66
|
+
generate_model(controller_name, model_properties)
|
67
|
+
end
|
68
|
+
|
69
|
+
generate "mobile_workflow:controller #{controller_name} --attributes #{model_properties} #{s3_storage? ? '--s3-storage' : ''}".strip
|
63
70
|
route "resources :#{plural_controller_name}, only: [:index, :show, :create]"
|
64
71
|
end
|
65
72
|
end
|
@@ -69,21 +76,21 @@ module MobileWorkflow
|
|
69
76
|
end
|
70
77
|
|
71
78
|
private
|
72
|
-
|
73
|
-
|
79
|
+
|
80
|
+
def generate_model(model_name, model_properties)
|
81
|
+
generate("mobile_workflow:model #{model_name} #{model_properties}")
|
74
82
|
end
|
75
83
|
|
76
|
-
def
|
77
|
-
@
|
84
|
+
def model_name_to_properties
|
85
|
+
@model_name_to_properties ||= open_api_spec.model_name_to_properties
|
78
86
|
end
|
79
87
|
|
80
88
|
def open_api_spec
|
81
|
-
@open_api_spec ||=
|
89
|
+
@open_api_spec ||= ::MobileWorkflow::OpenApiSpec::Parser.new(File.read(open_api_spec_path))
|
82
90
|
end
|
83
91
|
|
84
|
-
def
|
85
|
-
|
86
|
-
return JSON.parse(File.read(open_api_spec_path)).with_indifferent_access
|
92
|
+
def s3_storage?
|
93
|
+
options[:s3_storage]
|
87
94
|
end
|
88
95
|
|
89
96
|
def open_api_spec_path
|
@@ -93,22 +100,6 @@ module MobileWorkflow
|
|
93
100
|
def interactive?
|
94
101
|
options[:interactive]
|
95
102
|
end
|
96
|
-
|
97
|
-
def model_properties(name, schema)
|
98
|
-
generated_properties_args = schema["properties"].keys.collect{|key| "#{key}:#{model_property_type(schema["properties"][key])}" }.join(" ")
|
99
|
-
if !interactive? || yes?("Use generated schema #{name}(#{generated_properties_args})[yn]?")
|
100
|
-
generated_properties_args
|
101
|
-
else
|
102
|
-
ask "Specify schema for #{name}: (e.g. text:string image:attachment region:reference)"
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def model_property_type(property)
|
107
|
-
return property["type"] unless property["type"].blank?
|
108
|
-
return 'attachment' if property['$ref'] == "#/components/schemas/attachment"
|
109
|
-
|
110
|
-
raise 'Unknown property type'
|
111
|
-
end
|
112
103
|
end
|
113
104
|
end
|
114
105
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rails/generators/active_record/model/model_generator'
|
2
|
+
|
3
|
+
module MobileWorkflow
|
4
|
+
module Generators
|
5
|
+
|
6
|
+
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
|
+
|
9
|
+
def create_model_file
|
10
|
+
template File.join(File.dirname(__FILE__), "templates", "model.rb.erb"), File.join('app/models', class_path, "#{file_name}.rb")
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<% module_namespacing do -%>
|
2
2
|
class <%= controller_class_name %>Controller < ApiController
|
3
|
-
|
3
|
+
<%= s3_storage? ? "include MobileWorkflow::S3Storable" : "" %>
|
4
4
|
before_action :rewrite_payload, only: :create
|
5
5
|
|
6
6
|
load_and_authorize_resource
|
@@ -15,7 +15,11 @@ class <%= controller_class_name %>Controller < ApiController
|
|
15
15
|
|
16
16
|
def create
|
17
17
|
if @<%= singular_table_name %>.save
|
18
|
+
<% if s3_storage? -%>
|
18
19
|
render json: { binary_urls: binary_urls(@<%= singular_table_name %>), response: @<%= singular_table_name %> }, status: :created
|
20
|
+
<% else -%>
|
21
|
+
render json: { response: @<%= singular_table_name %> }, status: :created
|
22
|
+
<% end -%>
|
19
23
|
else
|
20
24
|
head :unprocessable_entity
|
21
25
|
end
|
@@ -54,7 +54,9 @@ RSpec.describe <%= controller_class_name %>Controller do
|
|
54
54
|
context 'ok' do
|
55
55
|
it { expect(<%= controller_class_name.singularize %>.count).to eq 1 }
|
56
56
|
it { expect(response.status).to eq 201 }
|
57
|
+
<% if s3_storage? -%>
|
57
58
|
it { expect(json_response[:binary_urls]).to_not be_nil }
|
59
|
+
<% end %>
|
58
60
|
end
|
59
61
|
end
|
60
62
|
end
|
data/lib/{templates/active_record/model → generators/mobile_workflow/templates}/model.rb.erb
RENAMED
@@ -13,11 +13,14 @@ class <%= class_name %> < <%= parent_class_name.classify %>
|
|
13
13
|
<% end -%>
|
14
14
|
|
15
15
|
def list_item_as_json
|
16
|
-
mw_list_item(text:
|
16
|
+
mw_list_item(text: <%= attributes.first.name %>)
|
17
17
|
end
|
18
18
|
|
19
19
|
def display_as_json
|
20
|
-
[
|
20
|
+
[
|
21
|
+
mw_display_text(label: 'ID', text: id.to_s),
|
22
|
+
mw_display_text(label: 'Text', text: <%= attributes.first.name %>)
|
23
|
+
]
|
21
24
|
end
|
22
25
|
|
23
26
|
end
|
@@ -16,6 +16,12 @@ module MobileWorkflow::Cli
|
|
16
16
|
def rspec_generator
|
17
17
|
generate 'rspec:install'
|
18
18
|
end
|
19
|
+
|
20
|
+
def factory_bot
|
21
|
+
inject_into_file 'spec/rails_helper.rb', before: "end\n" do
|
22
|
+
"config.include FactoryBot::Syntax::Methods"
|
23
|
+
end
|
24
|
+
end
|
19
25
|
|
20
26
|
def administrate_generator
|
21
27
|
Bundler.with_unbundled_env { generate 'administrate:install' }
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module MobileWorkflow
|
2
|
+
module OpenApiSpec
|
3
|
+
class Parser
|
4
|
+
|
5
|
+
# Schemas to avoid generating models for (static items from MW)
|
6
|
+
SKIP_SCHEMAS = ["attachment", "ListItem", "DisplayItem", "DisplayText", "DisplayButton", "DisplayImage", "DisplayVideo"]
|
7
|
+
|
8
|
+
def initialize(open_api_spec_string)
|
9
|
+
@open_api_spec_string = open_api_spec_string
|
10
|
+
end
|
11
|
+
|
12
|
+
def model_name_to_properties
|
13
|
+
@model_properties = {}
|
14
|
+
schemas.each_pair do |model_name, schema|
|
15
|
+
next if SKIP_SCHEMAS.include? model_name # Don't generate schemas for MW schemas
|
16
|
+
|
17
|
+
model_name = model_name.underscore
|
18
|
+
model_properties = schema_model_properties(model_name, schema)
|
19
|
+
|
20
|
+
@model_properties[model_name] = model_properties
|
21
|
+
end
|
22
|
+
@model_properties
|
23
|
+
end
|
24
|
+
|
25
|
+
def controller_names
|
26
|
+
@controller_names ||= paths.collect{|url_path| url_path.split('/')[1] }.uniq
|
27
|
+
end
|
28
|
+
|
29
|
+
def paths
|
30
|
+
@paths ||= open_api_spec[:paths].keys
|
31
|
+
end
|
32
|
+
|
33
|
+
def schemas
|
34
|
+
@schemas ||= open_api_spec[:components][:schemas]
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def open_api_spec
|
39
|
+
@open_api_spec ||= read_openapi_spec
|
40
|
+
end
|
41
|
+
|
42
|
+
def schema_model_properties(name, schema)
|
43
|
+
schema["properties"].keys.collect{|key| "#{key}:#{model_property_type(schema["properties"][key])}" }.join(" ")
|
44
|
+
end
|
45
|
+
|
46
|
+
def model_property_type(property)
|
47
|
+
return property["type"] unless property["type"].blank?
|
48
|
+
return 'attachment' if property['$ref'] == "#/components/schemas/attachment"
|
49
|
+
|
50
|
+
raise 'Unknown property type'
|
51
|
+
end
|
52
|
+
|
53
|
+
def read_openapi_spec
|
54
|
+
@read_openapi_spec ||= JSON.parse(@open_api_spec_string).with_indifferent_access
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mobile_workflow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Brooke-Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01-
|
11
|
+
date: 2021-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -119,8 +119,10 @@ files:
|
|
119
119
|
- lib/generators/mobile_workflow/install/templates/user.rb.erb
|
120
120
|
- lib/generators/mobile_workflow/install/templates/views/layouts/application.html.erb
|
121
121
|
- lib/generators/mobile_workflow/install/templates/views/sessions/new.html.erb
|
122
|
+
- lib/generators/mobile_workflow/model_generator.rb
|
122
123
|
- lib/generators/mobile_workflow/templates/controller.rb.erb
|
123
124
|
- lib/generators/mobile_workflow/templates/controller_spec.rb.erb
|
125
|
+
- lib/generators/mobile_workflow/templates/model.rb.erb
|
124
126
|
- lib/mobile_workflow.rb
|
125
127
|
- lib/mobile_workflow/cli.rb
|
126
128
|
- lib/mobile_workflow/cli/app_builder.rb
|
@@ -130,8 +132,8 @@ files:
|
|
130
132
|
- lib/mobile_workflow/cli/dokku_backend.rb
|
131
133
|
- lib/mobile_workflow/cli/heroku_backend.rb
|
132
134
|
- lib/mobile_workflow/engine.rb
|
135
|
+
- lib/mobile_workflow/open_api_spec/parser.rb
|
133
136
|
- lib/mobile_workflow/version.rb
|
134
|
-
- lib/templates/active_record/model/model.rb.erb
|
135
137
|
homepage: https://github.com/futureworkshops/mobile_workflow
|
136
138
|
licenses:
|
137
139
|
- MIT
|