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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 24e4161405736a8da53f830ee7f46f84a58930a3f4d7e5fd28456005f4d1f99f
4
- data.tar.gz: 9f13aa23db9a97150e0c0bd9c3a64b6b5161460df709c14a56a2af87ce3db784
3
+ metadata.gz: 2d3b107beb896ad8c143fe376e7532d3f7d3093435f1b0b59a15401dba17d752
4
+ data.tar.gz: '097097c10f64a32065c90e42779b672fecd4b964a15eb43e887d686718c3acfb'
5
5
  SHA512:
6
- metadata.gz: 2e6056e6a06c99156d2106114ea885caedf5eb5ec83d62a02469aa645b7fb2498ab4ccf5fcc73bd1de5def857f64b8532fc65e669c870ed073d865e7c228d7e5
7
- data.tar.gz: 8e6fc1fd000da48eddc130b84dec03ee8c1db5a0a1e95a5783d544a0fd720e364800b2c9b8cd769e222817a1304e4d32892664b61e159ae63c5520f1be132e71
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
- @model_properties = {}
45
- open_api_spec[:components][:schemas].each_pair do |model_name, schema|
46
- next if SKIP_SCHEMAS.include? model_name # Don't generate schemas for MW schemas
47
-
48
- model_name = model_name.underscore
49
- model_properties = model_properties(model_name, schema)
50
- generate(:model, "#{model_name} #{model_properties}")
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 = @model_properties[controller_name]
62
- generate "mobile_workflow:controller #{controller_name} --attributes #{model_properties}"
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
- def controller_names
73
- @controller_names ||= oai_spec_paths.collect{|url_path| url_path.split('/')[1] }.uniq
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 oai_spec_paths
77
- @oai_spec_paths ||= open_api_spec[:paths].keys
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 ||= read_openapi_spec
89
+ @open_api_spec ||= ::MobileWorkflow::OpenApiSpec::Parser.new(File.read(open_api_spec_path))
82
90
  end
83
91
 
84
- def read_openapi_spec
85
- say "Loading OpenAPI Spec: #{open_api_spec_path}"
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
@@ -31,6 +31,9 @@ gem 'aws-sdk-s3', '~> 1.60', '>= 1.60.1'
31
31
  gem 'aws-sdk-sns', '~> 1.23'
32
32
  <%- end %>
33
33
 
34
+ # FFI for Mac M1
35
+ gem 'ffi', github: 'ffi/ffi'
36
+
34
37
  group :development do
35
38
  gem 'web-console', '>= 3.3.0'
36
39
  gem 'listen', '>= 3.0.5', '< 3.2'
@@ -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
- # include MobileWorkflow::S3Storable
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
@@ -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: text)
16
+ mw_list_item(text: <%= attributes.first.name %>)
17
17
  end
18
18
 
19
19
  def display_as_json
20
- [mw_display_text(label: 'ID', text: id.to_s)]
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' }
@@ -33,6 +33,7 @@ module MobileWorkflow::Cli
33
33
  after_bundle do
34
34
  build :procfiles
35
35
  build :rspec_generator
36
+ build :factory_bot
36
37
  build :ability_generator
37
38
  build :active_storage if options[:s3_storage]
38
39
  build :mobile_workflow_generator, ARGV[1]
@@ -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
@@ -1,5 +1,5 @@
1
1
  module MobileWorkflow
2
- VERSION = '0.5.11'
2
+ VERSION = '0.6.4'
3
3
  RUBY_VERSION = '2.7.2'
4
4
  RAILS_VERSION = '6.1.0'
5
5
  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.5.11
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-19 00:00:00.000000000 Z
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