jets 0.8.18 → 0.9.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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/CHANGELOG.md +20 -1
  4. data/Gemfile.lock +6 -2
  5. data/README/prerelease.md +6 -0
  6. data/README/testing.md +41 -0
  7. data/Rakefile +9 -1
  8. data/jets.gemspec +1 -0
  9. data/lib/jets.rb +17 -18
  10. data/lib/jets/application.rb +26 -3
  11. data/lib/jets/aws_services.rb +26 -59
  12. data/lib/jets/aws_services/stack_status.rb +52 -0
  13. data/lib/jets/builders.rb +3 -2
  14. data/lib/jets/builders/handler_generator.rb +38 -2
  15. data/lib/jets/builders/shared_deducer.rb +32 -0
  16. data/lib/jets/cfn/builders.rb +3 -1
  17. data/lib/jets/cfn/builders/api_deployment_builder.rb +1 -1
  18. data/lib/jets/cfn/builders/api_gateway_builder.rb +1 -1
  19. data/lib/jets/cfn/builders/base_child_builder.rb +37 -7
  20. data/lib/jets/cfn/builders/controller_builder.rb +6 -1
  21. data/lib/jets/cfn/builders/function_builder.rb +5 -0
  22. data/lib/jets/cfn/builders/interface.rb +5 -6
  23. data/lib/jets/cfn/builders/job_builder.rb +5 -0
  24. data/lib/jets/cfn/builders/parent_builder.rb +17 -16
  25. data/lib/jets/cfn/builders/rule_builder.rb +6 -1
  26. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  27. data/lib/jets/commands.rb +9 -8
  28. data/lib/jets/commands/build.rb +36 -14
  29. data/lib/jets/commands/console.rb +1 -0
  30. data/lib/jets/commands/help/runner.md +17 -0
  31. data/lib/jets/commands/main.rb +7 -0
  32. data/lib/jets/commands/new.rb +39 -19
  33. data/lib/jets/commands/runner.rb +18 -0
  34. data/lib/jets/commands/sequence.rb +27 -1
  35. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  36. data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -1
  37. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +2 -0
  38. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +2 -1
  39. data/lib/jets/commands/templates/skeleton/config/routes.rb +5 -1
  40. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +5 -4
  41. data/lib/jets/core.rb +8 -6
  42. data/lib/jets/default/application.rb +1 -0
  43. data/lib/jets/generator.rb +1 -1
  44. data/lib/jets/inflections.rb +23 -0
  45. data/lib/jets/job/dsl.rb +69 -47
  46. data/lib/jets/klass.rb +6 -1
  47. data/lib/jets/lambda/dsl.rb +102 -34
  48. data/lib/jets/lambda/function_constructor.rb +2 -2
  49. data/lib/jets/lambda/task.rb +10 -5
  50. data/lib/jets/naming.rb +13 -2
  51. data/lib/jets/processors/deducer.rb +13 -2
  52. data/lib/jets/processors/main_processor.rb +1 -1
  53. data/lib/jets/rails_overrides.rb +1 -1
  54. data/lib/jets/resource.rb +20 -5
  55. data/lib/jets/resource/api_gateway/deployment.rb +0 -1
  56. data/lib/jets/resource/associated.rb +26 -0
  57. data/lib/jets/resource/base.rb +12 -0
  58. data/lib/jets/resource/child_stack.rb +2 -0
  59. data/lib/jets/resource/child_stack/api_deployment.rb +9 -15
  60. data/lib/jets/resource/child_stack/api_gateway.rb +8 -8
  61. data/lib/jets/resource/child_stack/app_class.rb +41 -16
  62. data/lib/jets/resource/child_stack/base.rb +24 -0
  63. data/lib/jets/resource/child_stack/shared.rb +90 -0
  64. data/lib/jets/resource/config.rb +4 -0
  65. data/lib/jets/resource/config/config_rule.rb +66 -0
  66. data/lib/jets/resource/config/managed_rule.rb +15 -0
  67. data/lib/jets/resource/events.rb +3 -0
  68. data/lib/jets/resource/events/rule.rb +31 -0
  69. data/lib/jets/resource/iam/application_role.rb +2 -2
  70. data/lib/jets/resource/iam/base_role_definition.rb +4 -2
  71. data/lib/jets/resource/iam/class_role.rb +50 -2
  72. data/lib/jets/resource/iam/function_role.rb +28 -0
  73. data/lib/jets/resource/iam/policy_document.rb +0 -4
  74. data/lib/jets/resource/permission.rb +12 -6
  75. data/lib/jets/resource/replacer.rb +4 -0
  76. data/lib/jets/resource/sns.rb +3 -0
  77. data/lib/jets/resource/standardizer.rb +42 -0
  78. data/lib/jets/router.rb +9 -1
  79. data/lib/jets/rule/dsl.rb +51 -78
  80. data/lib/jets/stack.rb +105 -0
  81. data/lib/jets/stack/builder.rb +38 -0
  82. data/lib/jets/stack/definition.rb +50 -0
  83. data/lib/jets/stack/function.rb +60 -0
  84. data/lib/jets/stack/main.rb +5 -0
  85. data/lib/jets/stack/main/dsl.rb +33 -0
  86. data/lib/jets/stack/main/extensions/base.rb +45 -0
  87. data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
  88. data/lib/jets/stack/main/extensions/lambda.rb +69 -0
  89. data/lib/jets/stack/main/extensions/sns.rb +12 -0
  90. data/lib/jets/stack/main/extensions/sqs.rb +8 -0
  91. data/lib/jets/stack/output.rb +38 -0
  92. data/lib/jets/stack/output/dsl.rb +19 -0
  93. data/lib/jets/stack/output/lookup.rb +36 -0
  94. data/lib/jets/stack/parameter.rb +38 -0
  95. data/lib/jets/stack/parameter/dsl.rb +42 -0
  96. data/lib/jets/stack/resource.rb +30 -0
  97. data/lib/jets/stack/resource/dsl.rb +19 -0
  98. data/lib/jets/version.rb +1 -1
  99. metadata +53 -4
  100. data/support/clean +0 -3
  101. data/support/console +0 -3
@@ -15,7 +15,35 @@ class Jets::Builders
15
15
 
16
16
  def generate
17
17
  poly_shims
18
- ruby_node_shim
18
+ app_ruby_shim
19
+ shared_shims
20
+ end
21
+
22
+ def shared_shims
23
+ Jets::Stack.subclasses.each do |subclass|
24
+ subclass.functions.each do |fun|
25
+ if fun.lang.to_s == "ruby"
26
+ shared_ruby_shim(fun)
27
+ else
28
+ copy_source_as_handler(fun)
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ # app/shared/functions/kevin.py => /tmp/jets/demo/app_root/handlers/shared/functions/kevin.py
35
+ def copy_source_as_handler(fun)
36
+ source_path = fun.source_file
37
+ unless source_path
38
+ attributes = fun.template.values.first
39
+ function_name = attributes['Properties']['FunctionName']
40
+ puts "WARN: missing source file for: '#{function_name}' function".colorize(:yellow)
41
+ return
42
+ end
43
+
44
+ dest_path = "#{tmp_app_root}/#{fun.handler_dest}"
45
+ FileUtils.mkdir_p(File.dirname(dest_path))
46
+ FileUtils.cp(source_path, dest_path)
19
47
  end
20
48
 
21
49
  def poly_shims
@@ -55,10 +83,18 @@ class Jets::Builders
55
83
  FileUtils.cp(source_path, dest_path)
56
84
  end
57
85
 
86
+ def shared_ruby_shim(fun)
87
+ deducer = Jets::Builders::SharedDeducer.new(fun)
88
+ generate_shim(deducer)
89
+ end
90
+
58
91
  # Generates one big node shim for a entire controller.
59
- def ruby_node_shim
92
+ def app_ruby_shim
60
93
  deducer = Jets::Builders::Deducer.new(@path)
94
+ generate_shim(deducer)
95
+ end
61
96
 
97
+ def generate_shim(deducer)
62
98
  js_path = "#{tmp_app_root}/#{deducer.js_path}"
63
99
  FileUtils.mkdir_p(File.dirname(js_path))
64
100
 
@@ -0,0 +1,32 @@
1
+ # Deducer.new(path)
2
+ #
3
+ # @deducer.functions.each do |function_name|
4
+ # @deducer.handler_for(function_name)
5
+ # end
6
+ #
7
+ # Implements:
8
+ #
9
+ # functions
10
+ # handler_for(function_name)
11
+ # js_path
12
+ #
13
+ class Jets::Builders
14
+ class SharedDeducer < Deducer
15
+ def initialize(fun)
16
+ @fun = fun
17
+ end
18
+
19
+ def functions
20
+ [@fun.meth] # function_names
21
+ end
22
+
23
+ # dont need function_name arg but keeping the same interface as parent class
24
+ def handler_for(function_name)
25
+ @fun.handler_dest
26
+ end
27
+
28
+ def js_path
29
+ @fun.handler_dest
30
+ end
31
+ end
32
+ end
@@ -9,11 +9,13 @@ class Jets::Cfn
9
9
  # These build the app/controllers, app/jobs, and app/functions
10
10
  autoload :BaseChildBuilder, "jets/cfn/builders/base_child_builder"
11
11
  autoload :ControllerBuilder, "jets/cfn/builders/controller_builder"
12
- autoload :JobBuilder, "jets/cfn/builders/job_builder"
13
12
  autoload :FunctionBuilder, "jets/cfn/builders/function_builder"
13
+ autoload :JobBuilder, "jets/cfn/builders/job_builder"
14
14
  autoload :RuleBuilder, "jets/cfn/builders/rule_builder"
15
15
 
16
16
  autoload :ApiGatewayBuilder, "jets/cfn/builders/api_gateway_builder"
17
17
  autoload :ApiDeploymentBuilder, "jets/cfn/builders/api_deployment_builder"
18
+
19
+ autoload :SharedBuilder, "jets/cfn/builders/shared_builder"
18
20
  end
19
21
  end
@@ -10,7 +10,7 @@ class Jets::Cfn::Builders
10
10
 
11
11
  # compose is an interface method
12
12
  def compose
13
- return if @options[:stack_type] == :minimal
13
+ return unless @options[:full] || @options[:stack_type] != :minimal
14
14
 
15
15
  deployment = Jets::Resource::ApiGateway::Deployment.new
16
16
  add_resource(deployment)
@@ -10,7 +10,7 @@ class Jets::Cfn::Builders
10
10
 
11
11
  # compose is an interface method
12
12
  def compose
13
- return if @options[:stack_type] == :minimal
13
+ return unless @options[:full] || @options[:stack_type] != :minimal
14
14
 
15
15
  add_gateway_rest_api
16
16
  add_gateway_routes
@@ -1,27 +1,57 @@
1
+ # Implements:
2
+ #
3
+ # * template_path
4
+ #
5
+ # FYI
6
+ #
7
+ # * compose implemented by the classes that include this
1
8
  class Jets::Cfn::Builders
2
9
  class BaseChildBuilder
3
10
  include Interface
4
11
 
5
- # The app_klass is can be a controller, job or anonymous function class.
12
+ # The app_class is can be a controller, job or anonymous function class.
6
13
  # IE: PostsController, HardJob
7
- def initialize(app_klass)
8
- @app_klass = app_klass
14
+ def initialize(app_class)
15
+ @app_class = app_class
9
16
  @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
10
17
  end
11
18
 
12
19
  # template_path is an interface method for Interface module
13
20
  def template_path
14
- Jets::Naming.template_path(@app_klass)
21
+ Jets::Naming.app_template_path(@app_class)
15
22
  end
16
23
 
17
24
  def add_common_parameters
18
25
  add_parameter("IamRole", Description: "Iam Role that Lambda function uses.")
19
26
  add_parameter("S3Bucket", Description: "S3 Bucket for source code.")
27
+ depends_on_params.each do |logical_id, desc|
28
+ add_parameter(logical_id, Description: desc)
29
+ end
30
+ end
31
+
32
+ def depends_on_params
33
+ return {} unless @app_class.depends_on
34
+
35
+ params = {}
36
+ @app_class.depends_on.each do |shared_stack|
37
+ dependency = shared_stack.to_s.camelize # logical_id
38
+ dependency_outputs(dependency).each do |output|
39
+ dependency_class = dependency.to_s.classify
40
+ desc = "From #{dependency_class}.Outputs.#{output}"
41
+ # key: logical_id , value: description
42
+ params[output] = desc
43
+ end
44
+ end
45
+ params
46
+ end
47
+
48
+ def dependency_outputs(dependency)
49
+ dependency.to_s.classify.constantize.output_keys
20
50
  end
21
51
 
22
52
  def add_functions
23
53
  add_class_iam_policy
24
- @app_klass.tasks.each do |task|
54
+ @app_class.tasks.each do |task|
25
55
  add_function(task)
26
56
  add_function_iam_policy(task)
27
57
  end
@@ -33,9 +63,9 @@ class Jets::Cfn::Builders
33
63
  end
34
64
 
35
65
  def add_class_iam_policy
36
- return unless @app_klass.build_class_iam?
66
+ return unless @app_class.build_class_iam?
37
67
 
38
- resource = Jets::Resource::Iam::ClassRole.new(@app_klass)
68
+ resource = Jets::Resource::Iam::ClassRole.new(@app_class)
39
69
  add_resource(resource)
40
70
  end
41
71
 
@@ -1,3 +1,8 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
1
6
  class Jets::Cfn::Builders
2
7
  class ControllerBuilder < BaseChildBuilder
3
8
  # compose is an interface method for Interface module
@@ -30,7 +35,7 @@ class Jets::Cfn::Builders
30
35
  # routes scoped to this controller template.
31
36
  def scoped_routes
32
37
  @routes ||= Jets::Router.routes.select do |route|
33
- route.controller_name == @app_klass.to_s
38
+ route.controller_name == @app_class.to_s
34
39
  end
35
40
  end
36
41
  end
@@ -1,3 +1,8 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
1
6
  class Jets::Cfn::Builders
2
7
  class FunctionBuilder < BaseChildBuilder
3
8
  # compose is an interface method for Interface module
@@ -7,9 +7,8 @@ class Jets::Cfn::Builders
7
7
  extend Memoist
8
8
 
9
9
  def build
10
- # Do not bother building
11
- # or writing the template unless there are functions defined
12
- return if @app_klass && !@app_klass.build?
10
+ # Do not bother building or writing the template unless there are functions defined
11
+ return if @app_class && !@app_class.build?
13
12
 
14
13
  compose # must be implemented by subclass
15
14
  write
@@ -74,9 +73,9 @@ class Jets::Cfn::Builders
74
73
  end
75
74
 
76
75
  def add_resources
77
- @app_klass.tasks.each do |task|
78
- task.resources.each do |definition|
79
- resource = Jets::Resource.new(definition, task.replacements)
76
+ @app_class.tasks.each do |task|
77
+ task.associated_resources.each do |associated|
78
+ resource = Jets::Resource.new(associated.definition, task.replacements)
80
79
  add_resource(resource)
81
80
  add_resource(resource.permission)
82
81
  end
@@ -1,3 +1,8 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
1
6
  class Jets::Cfn::Builders
2
7
  class JobBuilder < BaseChildBuilder
3
8
  def compose
@@ -15,7 +15,7 @@ class Jets::Cfn::Builders
15
15
  puts "Building parent CloudFormation template."
16
16
 
17
17
  build_minimal_resources
18
- build_child_resources unless @options[:stack_type] == :minimal
18
+ build_child_resources if @options[:full] || @options[:stack_type] == :full
19
19
  end
20
20
 
21
21
  # template_path is an interface method
@@ -38,26 +38,37 @@ class Jets::Cfn::Builders
38
38
  def build_child_resources
39
39
  puts "Building child CloudFormation templates."
40
40
 
41
- expression = "#{Jets::Naming.template_path_prefix}-*"
41
+ expression = "#{Jets::Naming.template_path_prefix}-app-*"
42
42
  # IE: path: #{Jets.build_root}/templates/demo-dev-2-comments_controller.yml
43
43
  Dir.glob(expression).each do |path|
44
44
  next unless File.file?(path)
45
- next if api_gateway_paths.include?(path) # specially treated
46
-
47
45
  add_app_class_stack(path)
48
46
  end
49
47
 
50
- if @options[:stack_type] == :full and !Jets::Router.routes.empty?
48
+ expression = "#{Jets::Naming.template_path_prefix}-shared-*"
49
+ # IE: path: #{Jets.build_root}/templates/demo-dev-2-shared-resources.yml
50
+ Dir.glob(expression).each do |path|
51
+ next unless File.file?(path)
52
+
53
+ add_shared_resources(path)
54
+ end
55
+
56
+ if (@options[:full] || @options[:stack_type] == :full) and !Jets::Router.routes.empty?
51
57
  add_api_gateway
52
58
  add_api_deployment
53
59
  end
54
60
  end
55
61
 
56
62
  def add_app_class_stack(path)
57
- resource = Jets::Resource::ChildStack::AppClass.new(path, @options[:s3_bucket])
63
+ resource = Jets::Resource::ChildStack::AppClass.new(@options[:s3_bucket], path: path)
58
64
  add_child_resources(resource)
59
65
  end
60
66
 
67
+ def add_shared_resources(path)
68
+ resource = Jets::Resource::ChildStack::Shared.new(@options[:s3_bucket], path: path)
69
+ add_child_resources(resource) if resource.resources?
70
+ end
71
+
61
72
  def add_api_gateway
62
73
  resource = Jets::Resource::ChildStack::ApiGateway.new(@options[:s3_bucket])
63
74
  add_child_resources(resource)
@@ -72,15 +83,5 @@ class Jets::Cfn::Builders
72
83
  add_resource(resource)
73
84
  add_outputs(resource.outputs)
74
85
  end
75
-
76
- def api_gateway_paths
77
- files = %w[
78
- api-deployment.yml
79
- api-gateway.yml
80
- ]
81
- files.map do |name|
82
- "#{Jets::Naming.template_path_prefix}-#{name}"
83
- end
84
- end
85
86
  end
86
87
  end
@@ -1,3 +1,8 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
1
6
  class Jets::Cfn::Builders
2
7
  class RuleBuilder < BaseChildBuilder
3
8
  def compose
@@ -10,7 +15,7 @@ class Jets::Cfn::Builders
10
15
  # Handle config_rules associated with aws managed rules.
11
16
  # List of AWS Config Managed Rules: https://amzn.to/2BOt9KN
12
17
  def add_managed_rules
13
- @app_klass.managed_rules.each do |rule|
18
+ @app_class.managed_rules.each do |rule|
14
19
  resource = Jets::Resource.new(rule[:definition], rule[:replacements])
15
20
  add_resource(resource)
16
21
  end
@@ -0,0 +1,14 @@
1
+ class Jets::Cfn::Builders
2
+ class SharedBuilder < BaseChildBuilder
3
+ def compose
4
+ stack = @app_class.new # @app_class is subclass. IE: Alarm < Jets::Stack
5
+ builder = Jets::Stack::Builder.new(stack)
6
+ @template = builder.template # overwrite entire @template
7
+ end
8
+
9
+ # template_path is an interface method for Interface module
10
+ def template_path
11
+ Jets::Naming.shared_template_path(@app_class)
12
+ end
13
+ end
14
+ end
@@ -1,23 +1,24 @@
1
1
  module Jets::Commands
2
- autoload :Help, "jets/commands/help"
3
2
  autoload :Base, "jets/commands/base"
4
3
  autoload :Build, "jets/commands/build"
5
- autoload :Deploy, "jets/commands/deploy"
6
- autoload :Delete, "jets/commands/delete"
7
- autoload :New, "jets/commands/new"
8
4
  autoload :Call, "jets/commands/call"
5
+ autoload :Clean, "jets/commands/clean"
9
6
  autoload :Console, "jets/commands/console"
10
7
  autoload :Db, "jets/commands/db"
8
+ autoload :Dbconsole, "jets/commands/dbconsole"
9
+ autoload :Delete, "jets/commands/delete"
10
+ autoload :Deploy, "jets/commands/deploy"
11
11
  autoload :Dynamodb, "jets/commands/dynamodb"
12
+ autoload :Help, "jets/commands/help"
12
13
  autoload :Main, "jets/commands/main"
14
+ autoload :Markdown, "jets/commands/markdown"
15
+ autoload :New, "jets/commands/new"
13
16
  autoload :Process, "jets/commands/process"
14
17
  autoload :RakeCommand, "jets/commands/rake_command"
15
18
  autoload :RakeTasks, 'jets/commands/rake_tasks'
16
- autoload :WebpackerTemplate, 'jets/commands/webpacker_template'
19
+ autoload :Runner, 'jets/commands/runner'
17
20
  autoload :Sequence, "jets/commands/sequence"
18
21
  autoload :StackInfo, "jets/commands/stack_info"
19
- autoload :Dbconsole, "jets/commands/dbconsole"
20
22
  autoload :Url, "jets/commands/url"
21
- autoload :Markdown, "jets/commands/markdown"
22
- autoload :Clean, "jets/commands/clean"
23
+ autoload :WebpackerTemplate, 'jets/commands/webpacker_template'
23
24
  end
@@ -31,10 +31,10 @@ module Jets::Commands
31
31
  time :build_code
32
32
 
33
33
  def build_templates
34
- if @options[:stack_type] == :minimal
35
- build_minimal_template
36
- else
34
+ if @options[:full] || @options[:stack_type] == :full
37
35
  build_all_templates
36
+ else
37
+ build_minimal_template
38
38
  end
39
39
  end
40
40
  time :build_templates
@@ -45,8 +45,10 @@ module Jets::Commands
45
45
  # 1. Shared templates - child templates needs them
46
46
  build_api_gateway_templates
47
47
  # 2. Child templates - parent template needs them
48
- build_child_templates
49
- # 3. Finally parent template
48
+ build_app_child_templates
49
+ # 2. Child templates - parent template needs them
50
+ build_shared_resources_templates
51
+ # 4. Finally parent template
50
52
  build_parent_template # must be called at the end
51
53
  end
52
54
 
@@ -59,19 +61,21 @@ module Jets::Commands
59
61
  Jets::Cfn::Builders::ApiDeploymentBuilder.new(@options).build
60
62
  end
61
63
 
62
- def build_child_templates
64
+ def build_app_child_templates
63
65
  app_files.each do |path|
64
66
  build_child_template(path)
65
67
  end
66
68
  end
67
69
 
70
+ def build_shared_resources_templates
71
+ Jets::Stack.subclasses.each do |subclass|
72
+ Jets::Cfn::Builders::SharedBuilder.new(subclass).build
73
+ end
74
+ end
75
+
68
76
  # path: app/controllers/comments_controller.rb
69
77
  # path: app/jobs/easy_job.rb
70
78
  def build_child_template(path)
71
- class_path = path.sub(%r{.*app/\w+/},'').sub(/\.rb$/,'')
72
- class_name = class_path.classify
73
- class_name.constantize # load app/**/* class definition
74
-
75
79
  md = path.match(%r{app/(.*?)/}) # extract: controller, job or function
76
80
  process_class = md[1].classify
77
81
  builder_class = "Jets::Cfn::Builders::#{process_class}Builder".constantize
@@ -82,8 +86,8 @@ module Jets::Commands
82
86
  # Jets::Cfn::Builders::RuleBuilder.new(CheckRule)
83
87
  # Jets::Cfn::Builders::FunctionBuilder.new(Hello)
84
88
  # Jets::Cfn::Builders::FunctionBuilder.new(HelloFunction)
85
- app_klass = Jets::Klass.from_path(path)
86
- builder = builder_class.new(app_klass)
89
+ app_class = Jets::Klass.from_path(path)
90
+ builder = builder_class.new(app_class)
87
91
  builder.build
88
92
  end
89
93
 
@@ -119,6 +123,24 @@ module Jets::Commands
119
123
  paths
120
124
  end
121
125
 
126
+ def shared_files
127
+ self.class.shared_files
128
+ end
129
+
130
+ def self.shared_files
131
+ paths = []
132
+ expression = "#{Jets.root}app/**/**/*.rb"
133
+ Dir.glob(expression).each do |path|
134
+ return false unless File.file?(path)
135
+ next unless path.include?("app/shared/resources")
136
+
137
+ relative_path = path.sub(Jets.root.to_s, '')
138
+ # Rids of the Jets.root at beginning
139
+ paths << relative_path
140
+ end
141
+ paths
142
+ end
143
+
122
144
  def self.poly_only?
123
145
  # Scans all the app code and look for any methods that are ruby.
124
146
  # If any method is written in ruby then we know the app is not a
@@ -129,8 +151,8 @@ module Jets::Commands
129
151
  app_file = path.sub(%r{app/\w+/},'').sub(/\.rb$/,'')
130
152
  # Internal jets controllers like Welcome and Public need a different regexp
131
153
  app_file = app_file.sub(%r{.*lib/jets/internal/},'')
132
- app_klass = app_file.classify.constantize # IE: PostsController, Jets::PublicController
133
- langs = app_klass.tasks.map(&:lang)
154
+ app_class = app_file.classify.constantize # IE: PostsController, Jets::PublicController
155
+ langs = app_class.tasks.map(&:lang)
134
156
  langs.include?(:ruby)
135
157
  end
136
158
  !has_ruby