jets 1.0.18 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +10 -10
- data/README/testing.md +5 -2
- data/lib/jets.rb +2 -2
- data/lib/jets/application.rb +69 -40
- data/lib/jets/booter.rb +17 -20
- data/lib/jets/builders/code_builder.rb +7 -8
- data/lib/jets/cfn/ship.rb +0 -6
- data/lib/jets/commands/build.rb +0 -5
- data/lib/jets/commands/deploy.rb +0 -4
- data/lib/jets/commands/main.rb +31 -4
- data/lib/jets/commands/templates/skeleton/{.env → .env.tt} +1 -0
- data/lib/jets/commands/templates/skeleton/config.ru +1 -0
- data/lib/jets/commands/upgrade/v1.rb +12 -0
- data/lib/jets/controller.rb +5 -0
- data/lib/jets/controller/base.rb +43 -21
- data/lib/jets/controller/cookies.rb +40 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/middleware.rb +4 -0
- data/lib/jets/controller/middleware/local.rb +119 -0
- data/lib/jets/{server/lambda_aws_proxy.rb → controller/middleware/local/api_gateway.rb} +11 -49
- data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
- data/lib/jets/{server → controller/middleware/local}/route_matcher.rb +4 -4
- data/lib/jets/controller/middleware/main.rb +46 -0
- data/lib/jets/{server → controller/middleware}/webpacker_setup.rb +0 -1
- data/lib/jets/controller/params.rb +2 -1
- data/lib/jets/controller/rack.rb +5 -0
- data/lib/jets/controller/rack/adapter.rb +60 -0
- data/lib/jets/controller/rack/env.rb +96 -0
- data/lib/jets/controller/redirection.rb +1 -1
- data/lib/jets/controller/renderers.rb +1 -1
- data/lib/jets/controller/renderers/base_renderer.rb +0 -4
- data/lib/jets/controller/renderers/{aws_proxy_renderer.rb → rack_renderer.rb} +7 -19
- data/lib/jets/controller/renderers/template_renderer.rb +1 -1
- data/lib/jets/controller/request.rb +14 -44
- data/lib/jets/controller/response.rb +55 -7
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +13 -3
- data/lib/jets/mega.rb +7 -0
- data/lib/jets/{rack → mega}/hash_converter.rb +1 -1
- data/lib/jets/{rack → mega}/request.rb +17 -4
- data/lib/jets/middleware.rb +38 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +44 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/resource/function.rb +1 -1
- data/lib/jets/ruby_server.rb +1 -1
- data/lib/jets/server.rb +48 -13
- data/lib/jets/version.rb +1 -1
- metadata +24 -17
- data/lib/jets/application/middleware.rb +0 -23
- data/lib/jets/default/application.rb +0 -23
- data/lib/jets/rack.rb +0 -7
- data/lib/jets/rack/server.rb +0 -47
- data/lib/jets/server/api_gateway.rb +0 -39
- data/lib/jets/server/timing_middleware.rb +0 -33
- data/lib/jets/timing.rb +0 -65
- data/lib/jets/timing/report.rb +0 -82
@@ -1,33 +0,0 @@
|
|
1
|
-
class Jets::Server
|
2
|
-
class TimingMiddleware
|
3
|
-
FORMAT_STRING = "%0.6f" # :nodoc:
|
4
|
-
HEADER_NAME = "X-Runtime" # :nodoc:
|
5
|
-
|
6
|
-
def initialize(app)
|
7
|
-
@app = app
|
8
|
-
end
|
9
|
-
|
10
|
-
def call(env)
|
11
|
-
start_time = clock_time
|
12
|
-
status, headers, body = @app.call(env)
|
13
|
-
request_time = clock_time - start_time
|
14
|
-
|
15
|
-
unless headers.has_key?(HEADER_NAME)
|
16
|
-
headers[HEADER_NAME] = FORMAT_STRING % request_time
|
17
|
-
end
|
18
|
-
|
19
|
-
[status, headers, body]
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
if defined?(Process::CLOCK_MONOTONIC)
|
24
|
-
def clock_time
|
25
|
-
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
26
|
-
end
|
27
|
-
else
|
28
|
-
def clock_time
|
29
|
-
Time.now.to_f
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/jets/timing.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'json'
|
3
|
-
require 'active_support/concern'
|
4
|
-
|
5
|
-
# Used to record timing on how long `jets deploy` takes.
|
6
|
-
# So we can continually improve it.
|
7
|
-
#
|
8
|
-
# We inject timing code into choosen methods and then record the start and finish
|
9
|
-
# time for those methods in /tmp/jets/demo/timing/records.log. Each item in the log
|
10
|
-
# is in JSON.
|
11
|
-
#
|
12
|
-
# We later use the data in this log to generate a timing report.
|
13
|
-
module Jets
|
14
|
-
module Timing
|
15
|
-
autoload :Report, 'jets/timing/report'
|
16
|
-
extend ActiveSupport::Concern
|
17
|
-
RECORD_LOG_PATH = "#{Jets.build_root}/timing/records.log"
|
18
|
-
|
19
|
-
def record_data(meth, type)
|
20
|
-
# https://stackoverflow.com/questions/17267935/display-time-down-to-milliseconds-in-ruby-1-8-7
|
21
|
-
# Record time in milliseconds unit so we can calculate time differences later
|
22
|
-
time = (Time.now.to_f * 1000.0).to_i
|
23
|
-
JSON.dump(
|
24
|
-
class: self.class.name,
|
25
|
-
meth: meth,
|
26
|
-
time: time,
|
27
|
-
type: type,
|
28
|
-
)
|
29
|
-
end
|
30
|
-
|
31
|
-
def record_log(meth, type)
|
32
|
-
data = record_data(meth, type)
|
33
|
-
path = Timing::RECORD_LOG_PATH
|
34
|
-
FileUtils.mkdir_p(File.dirname(path))
|
35
|
-
File.open(path, 'a') {|f| f.write(data + "\n") }
|
36
|
-
end
|
37
|
-
|
38
|
-
# Clear out all timing data
|
39
|
-
def self.clear
|
40
|
-
return unless File.exist?(RECORD_LOG_PATH)
|
41
|
-
FileUtils.cp("/dev/null", RECORD_LOG_PATH)
|
42
|
-
end
|
43
|
-
|
44
|
-
def self.report
|
45
|
-
return unless ENV['JETS_TIMING']
|
46
|
-
Report.new.results
|
47
|
-
end
|
48
|
-
|
49
|
-
included do
|
50
|
-
def self.time(meth)
|
51
|
-
unrecorded_meth = "unrecorded_#{meth}"
|
52
|
-
alias_method unrecorded_meth, meth
|
53
|
-
|
54
|
-
module_eval <<-EOS, __FILE__, __LINE__ + 1
|
55
|
-
def #{meth}(*args, &block)
|
56
|
-
record_log(:#{meth}, :start)
|
57
|
-
result = #{unrecorded_meth}(*args, &block)
|
58
|
-
record_log(:#{meth}, :finish)
|
59
|
-
result
|
60
|
-
end
|
61
|
-
EOS
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
data/lib/jets/timing/report.rb
DELETED
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module Jets::Timing
|
4
|
-
class Report
|
5
|
-
extend Memoist
|
6
|
-
|
7
|
-
def initialize(log=Jets::Timing::RECORD_LOG_PATH)
|
8
|
-
@log = log
|
9
|
-
end
|
10
|
-
|
11
|
-
def results
|
12
|
-
unless File.exist?(@log)
|
13
|
-
puts "WARN: Timing #{@log} does not exist"
|
14
|
-
return
|
15
|
-
end
|
16
|
-
puts process
|
17
|
-
end
|
18
|
-
|
19
|
-
def process
|
20
|
-
deploy = times_for("Jets::Commands::Deploy")
|
21
|
-
deploy[:rest] = rest_time(deploy[:run], deploy[:build_code], deploy[:ship])
|
22
|
-
build = times_for("Jets::Commands::Build")
|
23
|
-
cfn_ship = times_for("Jets::Cfn::Ship")
|
24
|
-
code_builder = times_for("Jets::Builders::CodeBuilder")
|
25
|
-
|
26
|
-
# Two ships screw this up.
|
27
|
-
# The first ship creates the base parent stack with the s3 bucket.
|
28
|
-
# The second ship creates the app.
|
29
|
-
# Once the first stack exists, it is left alone and ship does not get called
|
30
|
-
# twice.
|
31
|
-
# This reporting logic currently only reports the last ship.
|
32
|
-
# Refer to timings.reverse.find in get_time method.
|
33
|
-
results = {
|
34
|
-
overall: deploy[:run],
|
35
|
-
"commands/deploy.rb": deploy,
|
36
|
-
"commands/build.rb": build,
|
37
|
-
"builders/code_builder.rb": code_builder,
|
38
|
-
"cfn/ship.rb": cfn_ship,
|
39
|
-
}
|
40
|
-
text = YAML.dump(results.deep_stringify_keys)
|
41
|
-
text.sub!('---', 'Timing report:')
|
42
|
-
text
|
43
|
-
end
|
44
|
-
|
45
|
-
# All times for a class
|
46
|
-
def times_for(class_name)
|
47
|
-
times = data.select { |i| i['class'] == class_name }
|
48
|
-
meths = times.map { |i| i['meth'] }.uniq
|
49
|
-
meths.inject({}) do |result, meth|
|
50
|
-
result.merge(meth => time_for(class_name, meth))
|
51
|
-
end.deep_symbolize_keys
|
52
|
-
end
|
53
|
-
|
54
|
-
def data
|
55
|
-
IO.readlines(@log).map { |l| JSON.load(l) }
|
56
|
-
end
|
57
|
-
memoize :data
|
58
|
-
|
59
|
-
def rest_time(total, *times)
|
60
|
-
result = total.to_f
|
61
|
-
times.each { |time| result -= time.to_f }
|
62
|
-
'%.3f' % result + 's'
|
63
|
-
end
|
64
|
-
|
65
|
-
# Returns String
|
66
|
-
# Example: 88.8s
|
67
|
-
def time_for(klass, meth)
|
68
|
-
timings = data.select { |l| l['class'] == klass && l['meth'] == meth }
|
69
|
-
start_time = get_time(timings, 'start')
|
70
|
-
finish_time = get_time(timings, 'finish')
|
71
|
-
diff = ( finish_time - start_time ) / 1000.0
|
72
|
-
'%.3f' % diff + 's'
|
73
|
-
end
|
74
|
-
|
75
|
-
# Input: timings is a pair of data. The start and end time.
|
76
|
-
def get_time(timings, type)
|
77
|
-
# reverse so we get the last ship
|
78
|
-
time = timings.reverse.find { |l| l['type'] == type }['time']
|
79
|
-
time.to_f # in milloseconds
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|