mobile_workflow 0.5.11 → 0.6.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/lib/generators/mobile_workflow/install/install_generator.rb +26 -40
- data/lib/generators/mobile_workflow/install/templates/Gemfile.erb +3 -0
- data/lib/generators/mobile_workflow/model_generator.rb +15 -0
- data/lib/{templates/active_record/model → generators/mobile_workflow/templates}/model.rb.erb +4 -1
- 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: 74a57b5231432fa5532bc2757c6785604c833bf0b637770c15ea34faa41b3b13
|
4
|
+
data.tar.gz: 33a6f90850d5e6fb2522d76012336899b585ab1b8fd7db6dc768018c12eeca2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54c3c9504079480aaba63c9974a17eb2c428254503568230ca058ad52a71119a0a6d469d30142cd7a41843b8757e4d24fcf94fccffeefe8fe06b5ab14e88b6a5
|
7
|
+
data.tar.gz: 62a5f5d474522fa2ade3fdccfb5a7f84b66f02d0c612a998cb235baee27e09cb33f0c12fc82019a010cfabd666fd614c5b98710d3a149914ac889048746cd2fe
|
@@ -1,12 +1,10 @@
|
|
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"
|
@@ -40,25 +38,33 @@ module MobileWorkflow
|
|
40
38
|
end
|
41
39
|
|
42
40
|
def generate_models
|
41
|
+
say "Loading OpenAPI Spec: #{open_api_spec_path}"
|
43
42
|
say "Generating models"
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
@model_properties[model_name] = model_properties
|
43
|
+
model_name_to_properties.each_pair do |model_name, model_properties|
|
44
|
+
if interactive? && !yes?("Use generated schema #{model_name}(#{model_properties})[yn]?")
|
45
|
+
model_properties = ask "Specify schema for #{model_name}: (e.g. text:string image:attachment region:reference)"
|
46
|
+
end
|
47
|
+
|
48
|
+
generate_model(model_name, model_properties)
|
49
|
+
@model_name_to_properties[model_name] = model_properties
|
52
50
|
end
|
53
51
|
end
|
54
52
|
|
55
53
|
def generate_controllers_and_routes
|
56
54
|
say "Generating controllers"
|
57
|
-
route "root to: 'admin/#{controller_names.first}#index'"
|
55
|
+
route "root to: 'admin/#{open_api_spec.controller_names.first}#index'"
|
58
56
|
|
59
|
-
controller_names.each do |plural_controller_name|
|
57
|
+
open_api_spec.controller_names.each do |plural_controller_name|
|
60
58
|
controller_name = plural_controller_name.singularize
|
61
|
-
model_properties =
|
59
|
+
model_properties = model_name_to_properties[controller_name]
|
60
|
+
|
61
|
+
unless model_properties
|
62
|
+
# Generate a model because it probably wasnt present in the schema
|
63
|
+
# And set default attributes
|
64
|
+
model_properties = "text:string"
|
65
|
+
generate_model(controller_name, model_properties)
|
66
|
+
end
|
67
|
+
|
62
68
|
generate "mobile_workflow:controller #{controller_name} --attributes #{model_properties}"
|
63
69
|
route "resources :#{plural_controller_name}, only: [:index, :show, :create]"
|
64
70
|
end
|
@@ -69,21 +75,17 @@ module MobileWorkflow
|
|
69
75
|
end
|
70
76
|
|
71
77
|
private
|
72
|
-
def controller_names
|
73
|
-
@controller_names ||= oai_spec_paths.collect{|url_path| url_path.split('/')[1] }.uniq
|
74
|
-
end
|
75
78
|
|
76
|
-
def
|
77
|
-
|
79
|
+
def generate_model(model_name, model_properties)
|
80
|
+
generate("mobile_workflow:model #{model_name} #{model_properties}")
|
78
81
|
end
|
79
82
|
|
80
|
-
def
|
81
|
-
@
|
83
|
+
def model_name_to_properties
|
84
|
+
@model_name_to_properties ||= open_api_spec.model_name_to_properties
|
82
85
|
end
|
83
86
|
|
84
|
-
def
|
85
|
-
|
86
|
-
return JSON.parse(File.read(open_api_spec_path)).with_indifferent_access
|
87
|
+
def open_api_spec
|
88
|
+
@open_api_spec ||= ::MobileWorkflow::OpenApiSpec::Parser.new(File.read(open_api_spec_path))
|
87
89
|
end
|
88
90
|
|
89
91
|
def open_api_spec_path
|
@@ -93,22 +95,6 @@ module MobileWorkflow
|
|
93
95
|
def interactive?
|
94
96
|
options[:interactive]
|
95
97
|
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
98
|
end
|
113
99
|
end
|
114
100
|
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
|
data/lib/{templates/active_record/model → generators/mobile_workflow/templates}/model.rb.erb
RENAMED
@@ -17,7 +17,10 @@ class <%= class_name %> < <%= parent_class_name.classify %>
|
|
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: text)
|
23
|
+
]
|
21
24
|
end
|
22
25
|
|
23
26
|
end
|
@@ -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.0
|
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-24 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
|