Class: Jets::Commands::Build
- Inherits:
-
Object
- Object
- Jets::Commands::Build
show all
- Includes:
- StackInfo
- Defined in:
- lib/jets/commands/build.rb
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from StackInfo
#first_run?, #parent_stack_name, #s3_bucket, #stack_type
#apigateway, #cfn, #lambda, #logs, #s3, #s3_resource, #sns, #sqs, #sts
#lookup, #stack_exists?, #stack_in_progress?
Constructor Details
#initialize(options) ⇒ Build
Returns a new instance of Build.
7
8
9
|
# File 'lib/jets/commands/build.rb', line 7
def initialize(options)
@options = options.dup
end
|
Class Method Details
.app_file?(path) ⇒ Boolean
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
|
# File 'lib/jets/commands/build.rb', line 191
def self.app_file?(path)
return false unless File.extname(path) == ".rb"
excludes = %w[
application_controller.rb
application_job.rb
]
return false if excludes.detect { |p| path.include?(p) }
includes = %w[
app/controllers
app/jobs
app/functions
app/rules
]
return true if includes.detect { |p| path.include?(p) }
false
end
|
.app_files ⇒ Object
Crucial that the Dir.pwd is in the tmp_code because for because Jets.boot set ups autoload_paths and this is how project classes are loaded. TODO: rework code so that Dir.pwd does not have to be in tmp_code for build to work.
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/jets/commands/build.rb', line 110
def self.app_files
paths = []
expression = "#{Jets.root}app/**/**/*.rb"
Dir.glob(expression).each do |path|
return false unless File.file?(path)
next unless app_file?(path)
relative_path = path.sub(Jets.root.to_s, '')
paths << relative_path
end
paths += internal_app_files
paths
end
|
.app_has_ruby? ⇒ Boolean
150
151
152
153
154
155
156
157
|
# File 'lib/jets/commands/build.rb', line 150
def self.app_has_ruby?
has_ruby = app_files.detect do |path|
app_class = Jets::Klass.from_path(path) langs = app_class.tasks.map(&:lang)
langs.include?(:ruby) && app_class != Jets::PreheatJob
end
!!has_ruby
end
|
.internal_app_files ⇒ Object
Add internal Jets controllers if they are being used
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
# File 'lib/jets/commands/build.rb', line 173
def self.internal_app_files
paths = []
controllers = File.expand_path("../../internal/app/controllers/jets", __FILE__)
public_catchall = Jets::Router.has_controller?("Jets::PublicController")
paths << "#{controllers}/public_controller.rb" if public_catchall
rack_catchall = Jets::Router.has_controller?("Jets::RackController")
paths << "#{controllers}/rack_controller.rb" if rack_catchall
if Jets.config.prewarm.enable
jobs = File.expand_path("../../internal/app/jobs/jets", __FILE__)
paths << "#{jobs}/preheat_job.rb"
end
paths
end
|
.poly_only? ⇒ Boolean
Finds out of the app has polymorphic functions only and zero ruby functions. In this case, we can skip a lot of the ruby related building and speed up the deploy process.
146
147
148
|
# File 'lib/jets/commands/build.rb', line 146
def self.poly_only?
!app_has_ruby? && !shared_has_ruby?
end
|
.shared_files ⇒ Object
129
130
131
132
133
134
135
136
137
138
139
140
141
|
# File 'lib/jets/commands/build.rb', line 129
def self.shared_files
paths = []
expression = "#{Jets.root}app/**/**/*.rb"
Dir.glob(expression).each do |path|
return false unless File.file?(path)
next unless path.include?("app/shared/resources")
relative_path = path.sub(Jets.root.to_s, '')
paths << relative_path
end
paths
end
|
.shared_has_ruby? ⇒ Boolean
159
160
161
162
163
164
165
166
167
168
169
170
|
# File 'lib/jets/commands/build.rb', line 159
def self.shared_has_ruby?
has_ruby = false
Jets::Stack.subclasses.each do |klass|
klass.functions.each do |fun|
if fun.lang == :ruby
has_ruby = true
break
end
end
end
has_ruby
end
|
.tmp_code(full_build_path = false) ⇒ Object
212
213
214
|
# File 'lib/jets/commands/build.rb', line 212
def self.tmp_code(full_build_path=false)
full_build_path ? "#{Jets.build_root}/stage/code" : "stage/code"
end
|
Instance Method Details
#app_files ⇒ Object
102
103
104
|
# File 'lib/jets/commands/build.rb', line 102
def app_files
self.class.app_files
end
|
#build ⇒ Object
21
22
23
24
|
# File 'lib/jets/commands/build.rb', line 21
def build
build_code unless @options[:templates]
build_templates
end
|
#build_all_templates ⇒ Object
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/jets/commands/build.rb', line 41
def build_all_templates
build_api_gateway_templates
build_app_child_templates
build_shared_resources_templates
build_parent_template end
|
#build_api_gateway_templates ⇒ Object
#build_app_child_templates ⇒ Object
62
63
64
65
66
|
# File 'lib/jets/commands/build.rb', line 62
def build_app_child_templates
app_files.each do |path|
build_child_template(path)
end
end
|
#build_child_template(path) ⇒ Object
path: app/controllers/comments_controller.rb path: app/jobs/easy_job.rb
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/jets/commands/build.rb', line 76
def build_child_template(path)
md = path.match(%r{app/(.*?)/}) process_class = md[1].classify
builder_class = "Jets::Cfn::Builders::#{process_class}Builder".constantize
app_class = Jets::Klass.from_path(path)
builder = builder_class.new(app_class)
unless Jets.poly_only? && app_class == Jets::PreheatJob
builder.build
end
end
|
#build_minimal_template ⇒ Object
#build_parent_template ⇒ Object
#build_shared_resources_templates ⇒ Object
#build_templates ⇒ Object
30
31
32
33
34
35
|
# File 'lib/jets/commands/build.rb', line 30
def build_templates
puts "Building CloudFormation templates."
clean_templates
build_minimal_template
build_all_templates if full?
end
|
#clean_templates ⇒ Object
98
99
100
|
# File 'lib/jets/commands/build.rb', line 98
def clean_templates
FileUtils.rm_rf("#{Jets.build_root}/templates")
end
|
#full? ⇒ Boolean
37
38
39
|
# File 'lib/jets/commands/build.rb', line 37
def full?
@options[:templates] || @options[:stack_type] == :full
end
|
#run ⇒ Object
11
12
13
14
15
16
17
18
19
|
# File 'lib/jets/commands/build.rb', line 11
def run
puts "Building project for Lambda..."
return if @options[:noop]
@options.merge!(stack_type: stack_type, s3_bucket: s3_bucket)
build
end
|
#shared_files ⇒ Object
125
126
127
|
# File 'lib/jets/commands/build.rb', line 125
def shared_files
self.class.shared_files
end
|