timber 2.0.24 → 2.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG +3 -0
- data/README.md +314 -59
- data/bin/timber +11 -2
- data/lib/timber.rb +2 -7
- data/lib/timber/cli.rb +16 -28
- data/lib/timber/cli/api.rb +80 -14
- data/lib/timber/cli/api/application.rb +30 -0
- data/lib/timber/cli/config_file.rb +66 -0
- data/lib/timber/cli/file_helper.rb +43 -0
- data/lib/timber/cli/installer.rb +58 -0
- data/lib/timber/cli/installers.rb +37 -0
- data/lib/timber/cli/installers/other.rb +47 -0
- data/lib/timber/cli/installers/rails.rb +255 -0
- data/lib/timber/cli/installers/root.rb +189 -0
- data/lib/timber/cli/io.rb +97 -0
- data/lib/timber/cli/io/ansi.rb +22 -0
- data/lib/timber/cli/io/messages.rb +213 -0
- data/lib/timber/cli/os_helper.rb +53 -0
- data/lib/timber/config.rb +97 -43
- data/lib/timber/config/integrations.rb +63 -0
- data/lib/timber/config/integrations/rack.rb +74 -0
- data/lib/timber/context.rb +13 -10
- data/lib/timber/contexts.rb +1 -0
- data/lib/timber/contexts/custom.rb +16 -3
- data/lib/timber/contexts/http.rb +10 -3
- data/lib/timber/contexts/organization.rb +4 -0
- data/lib/timber/contexts/release.rb +46 -0
- data/lib/timber/contexts/runtime.rb +7 -1
- data/lib/timber/contexts/session.rb +8 -1
- data/lib/timber/contexts/system.rb +5 -1
- data/lib/timber/contexts/user.rb +9 -2
- data/lib/timber/current_context.rb +43 -11
- data/lib/timber/events/controller_call.rb +4 -0
- data/lib/timber/events/custom.rb +13 -5
- data/lib/timber/events/exception.rb +4 -0
- data/lib/timber/events/http_client_request.rb +4 -0
- data/lib/timber/events/http_client_response.rb +4 -0
- data/lib/timber/events/http_server_request.rb +5 -0
- data/lib/timber/events/http_server_response.rb +15 -3
- data/lib/timber/events/sql_query.rb +3 -0
- data/lib/timber/events/template_render.rb +3 -0
- data/lib/timber/integration.rb +40 -0
- data/lib/timber/integrations.rb +21 -14
- data/lib/timber/integrations/action_controller.rb +18 -0
- data/lib/timber/integrations/action_controller/log_subscriber.rb +2 -0
- data/lib/timber/integrations/action_controller/log_subscriber/timber_log_subscriber.rb +6 -0
- data/lib/timber/integrations/action_dispatch.rb +23 -0
- data/lib/timber/integrations/action_dispatch/debug_exceptions.rb +2 -0
- data/lib/timber/integrations/action_view.rb +18 -0
- data/lib/timber/integrations/action_view/log_subscriber.rb +2 -0
- data/lib/timber/integrations/action_view/log_subscriber/timber_log_subscriber.rb +10 -0
- data/lib/timber/integrations/active_record.rb +18 -0
- data/lib/timber/integrations/active_record/log_subscriber.rb +2 -0
- data/lib/timber/integrations/active_record/log_subscriber/timber_log_subscriber.rb +8 -0
- data/lib/timber/integrations/rack.rb +12 -2
- data/lib/timber/integrations/rack/exception_event.rb +38 -5
- data/lib/timber/integrations/rack/http_context.rb +4 -6
- data/lib/timber/integrations/rack/http_events.rb +177 -27
- data/lib/timber/integrations/rack/middleware.rb +28 -0
- data/lib/timber/integrations/rack/session_context.rb +5 -6
- data/lib/timber/integrations/rack/user_context.rb +90 -43
- data/lib/timber/integrations/rails.rb +22 -0
- data/lib/timber/integrations/rails/rack_logger.rb +2 -0
- data/lib/timber/integrator.rb +18 -3
- data/lib/timber/log_devices/http.rb +107 -99
- data/lib/timber/log_devices/http/dropping_sized_queue.rb +26 -0
- data/lib/timber/log_devices/http/flushable_sized_queue.rb +42 -0
- data/lib/timber/log_entry.rb +14 -2
- data/lib/timber/logger.rb +51 -36
- data/lib/timber/overrides.rb +2 -0
- data/lib/timber/overrides/active_support_3_tagged_logging.rb +103 -0
- data/lib/timber/overrides/active_support_tagged_logging.rb +53 -90
- data/lib/timber/timer.rb +21 -0
- data/lib/timber/util/hash.rb +1 -1
- data/lib/timber/util/http_event.rb +16 -3
- data/lib/timber/version.rb +1 -1
- data/spec/support/timber.rb +2 -3
- data/spec/timber/cli/installers/rails_spec.rb +160 -0
- data/spec/timber/cli/installers/root_spec.rb +100 -0
- data/spec/timber/config_spec.rb +28 -0
- data/spec/timber/current_context_spec.rb +61 -12
- data/spec/timber/events/custom_spec.rb +13 -2
- data/spec/timber/events/exception_spec.rb +15 -0
- data/spec/timber/events/http_server_request_spec.rb +3 -3
- data/spec/timber/integrations/rack/http_events_spec.rb +101 -0
- data/spec/timber/log_devices/http_spec.rb +20 -4
- data/spec/timber/log_entry_spec.rb +2 -1
- data/spec/timber/logger_spec.rb +8 -8
- metadata +40 -9
- data/benchmarks/rails.rb +0 -122
- data/lib/timber/cli/application.rb +0 -28
- data/lib/timber/cli/install.rb +0 -196
- data/lib/timber/cli/io_helper.rb +0 -65
- data/lib/timber/cli/messages.rb +0 -180
- data/lib/timber/integrations/active_support/tagged_logging.rb +0 -71
data/bin/timber
CHANGED
@@ -2,12 +2,21 @@
|
|
2
2
|
|
3
3
|
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
|
4
4
|
require "timber/cli"
|
5
|
+
require "timber/cli/io"
|
6
|
+
require "timber/cli/io/messages"
|
5
7
|
|
6
8
|
begin
|
7
9
|
Timber::CLI.run
|
8
10
|
rescue => e
|
9
11
|
raise e if $DEBUG
|
10
|
-
|
11
|
-
|
12
|
+
|
13
|
+
io = Timber::CLI::IO.new(io_out: STDERR)
|
14
|
+
io.puts ""
|
15
|
+
io.puts e.message, :red
|
16
|
+
io.puts ""
|
17
|
+
io.puts Timber::CLI::IO::Messages.separator
|
18
|
+
io.puts "Backtrace:"
|
19
|
+
io.puts ""
|
20
|
+
io.puts e.backtrace[0..25].join("\n")
|
12
21
|
exit 1
|
13
22
|
end
|
data/lib/timber.rb
CHANGED
@@ -1,14 +1,8 @@
|
|
1
|
-
# core classes
|
2
|
-
require "json" # brings to_json to the core classes
|
3
|
-
|
4
1
|
# Base (must come first, order matters)
|
2
|
+
require "timber/version"
|
5
3
|
require "timber/overrides"
|
6
4
|
require "timber/config"
|
7
|
-
require "timber/context"
|
8
|
-
require "timber/event"
|
9
|
-
require "timber/integrator"
|
10
5
|
require "timber/util"
|
11
|
-
require "timber/version"
|
12
6
|
|
13
7
|
# Other (sorted alphabetically)
|
14
8
|
require "timber/contexts"
|
@@ -18,6 +12,7 @@ require "timber/log_devices"
|
|
18
12
|
require "timber/log_entry"
|
19
13
|
require "timber/logger"
|
20
14
|
require "timber/integrations"
|
15
|
+
require "timber/timer"
|
21
16
|
|
22
17
|
# Load frameworks
|
23
18
|
require "timber/frameworks"
|
data/lib/timber/cli.rb
CHANGED
@@ -1,14 +1,10 @@
|
|
1
1
|
require "optparse"
|
2
2
|
require "yaml"
|
3
|
-
require "timber"
|
4
|
-
|
5
3
|
|
6
4
|
require "timber/cli/api"
|
7
|
-
require "timber/cli/
|
8
|
-
require "timber/cli/
|
9
|
-
require "timber/
|
10
|
-
|
11
|
-
require "timber/cli/install"
|
5
|
+
require "timber/cli/installers"
|
6
|
+
require "timber/cli/io"
|
7
|
+
require "timber/version"
|
12
8
|
|
13
9
|
module Timber
|
14
10
|
# @private
|
@@ -19,27 +15,25 @@ module Timber
|
|
19
15
|
attr_accessor :options
|
20
16
|
|
21
17
|
def run(argv = ARGV)
|
22
|
-
@options = {}
|
23
18
|
global = global_option_parser
|
24
|
-
commands = command_option_parser
|
25
19
|
global.order!(argv)
|
26
20
|
command = argv.shift
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
case command.to_sym
|
31
|
-
when :install
|
32
|
-
Timber::CLI::Install.run(argv.shift)
|
33
|
-
end
|
34
|
-
else
|
35
|
-
puts "Command '#{command}' does not exist, run timber -h to "\
|
36
|
-
"see the help"
|
37
|
-
exit(1)
|
38
|
-
end
|
39
|
-
else
|
21
|
+
|
22
|
+
case command
|
23
|
+
when nil
|
40
24
|
# Print help
|
41
25
|
puts global
|
42
26
|
exit(0)
|
27
|
+
|
28
|
+
when "install"
|
29
|
+
api_key = argv.shift
|
30
|
+
io = IO.new
|
31
|
+
Installers.run(api_key, io)
|
32
|
+
|
33
|
+
else
|
34
|
+
puts "Command '#{command}' does not exist, run timber -h to "\
|
35
|
+
"see the help"
|
36
|
+
exit(1)
|
43
37
|
end
|
44
38
|
end
|
45
39
|
|
@@ -61,12 +55,6 @@ module Timber
|
|
61
55
|
o.separator "Available commands: #{AVAILABLE_COMMANDS.join(", ")}"
|
62
56
|
end
|
63
57
|
end
|
64
|
-
|
65
|
-
def command_option_parser
|
66
|
-
{
|
67
|
-
"install" => OptionParser.new
|
68
|
-
}
|
69
|
-
end
|
70
58
|
end
|
71
59
|
end
|
72
60
|
end
|
data/lib/timber/cli/api.rb
CHANGED
@@ -4,41 +4,96 @@ require "net/https"
|
|
4
4
|
require "securerandom"
|
5
5
|
require "uri"
|
6
6
|
|
7
|
+
require "timber/cli/api/application"
|
8
|
+
require "timber/cli/io/messages"
|
9
|
+
require "timber/version"
|
10
|
+
|
7
11
|
module Timber
|
8
12
|
class CLI
|
13
|
+
# The API class provides an interface for all Timber API requests, parsing response
|
14
|
+
# and returning the appropriate objects.
|
9
15
|
class API
|
16
|
+
|
17
|
+
# Raise when the API key provided is invalid.
|
10
18
|
class APIKeyInvalidError < StandardError
|
11
19
|
def message
|
12
|
-
"Uh oh! The API key supplied is invalid. Please ensure that you copied the" \
|
13
|
-
"
|
20
|
+
"Uh oh! The API key supplied is invalid. Please ensure that you copied the \n" \
|
21
|
+
"key properly.\n\n#{IO::Messages.obtain_key_instructions}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class LogsNotReceivedError< StandardError
|
26
|
+
def message
|
27
|
+
"Bummer, we couldn't confirm log delivery with the Timber API, something is off. " \
|
28
|
+
"If you email support@timber.io, we'll work with you to figure out what's going on. " \
|
29
|
+
"And as a thank you sticking with us, we'll set you up with a 25% indefinite discount."
|
14
30
|
end
|
15
31
|
end
|
16
32
|
|
17
|
-
|
33
|
+
# Raised when Timber is returning 500s
|
34
|
+
class ServerError < StandardError
|
18
35
|
def message
|
19
|
-
"
|
36
|
+
"Crap, it looks like the Timber API is returning 500s :/. In order to properly " \
|
37
|
+
"install Timber and test integration we need the Timber API to work correctly. " \
|
38
|
+
"Chances are we're aware of the issue and if you try again later the API should " \
|
39
|
+
"be working. \n\n" \
|
40
|
+
"Status updates: http://status.timber.io \n" \
|
41
|
+
"Yell at us via email: support@timber.io \n"
|
20
42
|
end
|
21
43
|
end
|
22
44
|
|
23
|
-
|
45
|
+
# Raised when the API returns a response that a particular method is not expecting.
|
46
|
+
class UnrecognizedAPIResponse < StandardError
|
47
|
+
def initialize(res)
|
48
|
+
@res = res
|
49
|
+
end
|
50
|
+
|
51
|
+
def message
|
52
|
+
"Uh oh, we received a response from the Timber API that was not recognized " \
|
53
|
+
"(#{res.code}). We've been notified of the issue, but please feel free to " \
|
54
|
+
"yell at us via email to make sure we're aware: support@timber.io"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
TIMBER_PRODUCTION_API_URL = "https://api.timber.io".freeze
|
59
|
+
TIMBER_STAGING_API_URL = "https://api.timber-staging.io".freeze
|
60
|
+
TIMBER_API_URL = ENV['TIMBER_STAGING'] ? TIMBER_STAGING_API_URL : TIMBER_PRODUCTION_API_URL
|
61
|
+
TIMBER_API_URI = URI.parse(TIMBER_API_URL)
|
24
62
|
APPLICATION_PATH = "/installer/application".freeze
|
25
63
|
EVENT_PATH = "/installer/events".freeze
|
26
64
|
HAS_LOGS_PATH = "/installer/has_logs".freeze
|
27
65
|
USER_AGENT = "Timber Ruby/#{Timber::VERSION} (HTTP)".freeze
|
28
66
|
|
67
|
+
attr_reader :api_key
|
68
|
+
|
29
69
|
def initialize(api_key)
|
30
70
|
@api_key = api_key
|
31
71
|
@session_id = SecureRandom.uuid
|
32
72
|
end
|
33
73
|
|
74
|
+
# Returns the application for the given API key.
|
34
75
|
def application!
|
35
|
-
get!(APPLICATION_PATH)
|
76
|
+
res = get!(APPLICATION_PATH)
|
77
|
+
build_application(res)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Hits the API to clone the app for the provided API key to the specified environment.
|
81
|
+
def clone_application!(environment)
|
82
|
+
return nil
|
36
83
|
end
|
37
84
|
|
38
|
-
|
85
|
+
# Sends an event to Timber so that we can understand how the installer is performing
|
86
|
+
# an ensure a top notch user experience. We do not raise here because it is not
|
87
|
+
# critical for the install process.
|
88
|
+
def event(name, data = {})
|
39
89
|
post!(EVENT_PATH, event: {name: name, data: data})
|
90
|
+
true
|
91
|
+
rescue Exception
|
92
|
+
false
|
40
93
|
end
|
41
94
|
|
95
|
+
# After test logs are sent to the Timber API this method waits for them to be
|
96
|
+
# received. This is how we test integration.
|
42
97
|
def wait_for_logs(iteration = 0, &block)
|
43
98
|
if block_given?
|
44
99
|
yield iteration
|
@@ -46,9 +101,11 @@ module Timber
|
|
46
101
|
|
47
102
|
case iteration
|
48
103
|
when 0
|
49
|
-
event
|
50
|
-
when
|
51
|
-
event
|
104
|
+
event(:waiting_for_logs)
|
105
|
+
when 20
|
106
|
+
event(:excessively_waiting_for_logs)
|
107
|
+
when 60
|
108
|
+
raise LogsNotReceivedError.new
|
52
109
|
end
|
53
110
|
|
54
111
|
sleep 0.5
|
@@ -58,13 +115,20 @@ module Timber
|
|
58
115
|
case res.code
|
59
116
|
when "202"
|
60
117
|
wait_for_logs(iteration + 1, &block)
|
61
|
-
|
62
118
|
when "204"
|
63
119
|
true
|
120
|
+
else
|
121
|
+
raise UnrecognizedAPIResponse.new(res)
|
64
122
|
end
|
65
123
|
end
|
66
124
|
|
67
125
|
private
|
126
|
+
def build_application(res)
|
127
|
+
parsed_body = JSON.parse(res.body)
|
128
|
+
attributes = parsed_body.fetch("data")
|
129
|
+
Application.new(attributes)
|
130
|
+
end
|
131
|
+
|
68
132
|
def get!(path)
|
69
133
|
req = Net::HTTP::Get.new(path)
|
70
134
|
issue!(req)
|
@@ -85,10 +149,12 @@ module Timber
|
|
85
149
|
http.request(req)
|
86
150
|
end
|
87
151
|
|
88
|
-
|
89
|
-
|
90
|
-
|
152
|
+
code = Integer(res.code)
|
153
|
+
|
154
|
+
if [401, 403].include?(code)
|
91
155
|
raise APIKeyInvalidError.new
|
156
|
+
elsif code >= 500
|
157
|
+
raise ServerError.new
|
92
158
|
else
|
93
159
|
res
|
94
160
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Timber
|
2
|
+
class CLI
|
3
|
+
class API
|
4
|
+
class Application
|
5
|
+
DEVELOPMENT = "development".freeze
|
6
|
+
HEROKU = "heroku".freeze
|
7
|
+
|
8
|
+
attr_accessor :api_key, :environment, :framework_type, :heroku_drain_url,
|
9
|
+
:name, :platform_type
|
10
|
+
|
11
|
+
def initialize(attributes)
|
12
|
+
@api_key = attributes.fetch("api_key")
|
13
|
+
@environment = attributes.fetch("environment")
|
14
|
+
@framework_type = attributes.fetch("framework_type")
|
15
|
+
@heroku_drain_url = attributes.fetch("heroku_drain_url")
|
16
|
+
@name = attributes.fetch("name")
|
17
|
+
@platform_type = attributes.fetch("platform_type")
|
18
|
+
end
|
19
|
+
|
20
|
+
def development?
|
21
|
+
environment == DEVELOPMENT
|
22
|
+
end
|
23
|
+
|
24
|
+
def heroku?
|
25
|
+
platform_type == HEROKU
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "timber/cli/file_helper"
|
2
|
+
|
3
|
+
module Timber
|
4
|
+
class CLI
|
5
|
+
class ConfigFile
|
6
|
+
attr_reader :path
|
7
|
+
|
8
|
+
def initialize(path)
|
9
|
+
@path = path
|
10
|
+
FileHelper.read_or_create(path, initial_content)
|
11
|
+
end
|
12
|
+
|
13
|
+
def logrageify!
|
14
|
+
append("config.logrageify!")
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def get_content
|
19
|
+
FileHelper.read(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def append(code)
|
23
|
+
current_content = get_content
|
24
|
+
if !current_content.include?(code)
|
25
|
+
if current_content.include?(insert_hook)
|
26
|
+
new_content = current_content.gsub(insert_hook, "#{code}\n\n#{insert_hook}")
|
27
|
+
FileHelper.write(path, new_content)
|
28
|
+
else
|
29
|
+
FileHelper.append(path, new_content)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
def insert_hook
|
37
|
+
@insert_hook ||= "# Add additional configuration here."
|
38
|
+
end
|
39
|
+
|
40
|
+
# We provide this as an instance method so that the string is only defined when needed.
|
41
|
+
# This avoids allocating this string during normal app runtime.
|
42
|
+
def initial_content
|
43
|
+
<<-CONTENT
|
44
|
+
# Timber.io Ruby Configuration - Simple Structured Logging
|
45
|
+
#
|
46
|
+
# ^ ^ ^ ^ ___I_ ^ ^ ^ ^ ^ ^ ^
|
47
|
+
# /|\\/|\\/|\\ /|\\ /\\-_--\\ /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\
|
48
|
+
# /|\\/|\\/|\\ /|\\ / \\_-__\\ /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\
|
49
|
+
# /|\\/|\\/|\\ /|\\ |[]| [] | /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\
|
50
|
+
# -------------------------------------------------------------------
|
51
|
+
# Website: https://timber.io
|
52
|
+
# Documentation: https://timber.io/docs
|
53
|
+
# Support: support@timber.io
|
54
|
+
# -------------------------------------------------------------------
|
55
|
+
|
56
|
+
config = Timber::Config.instance
|
57
|
+
|
58
|
+
#{insert_hook}
|
59
|
+
# For a full list of configuration options and their explanations see:
|
60
|
+
# http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Config
|
61
|
+
|
62
|
+
CONTENT
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Timber
|
2
|
+
class CLI
|
3
|
+
module FileHelper
|
4
|
+
def self.append(path, contents)
|
5
|
+
File.open(path, "a") do |f|
|
6
|
+
f.write(contents)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.read_or_create(path, contents)
|
11
|
+
if !File.exists?(path)
|
12
|
+
write(path, contents)
|
13
|
+
end
|
14
|
+
|
15
|
+
File.read(path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.read(path)
|
19
|
+
File.read(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.write(path, contents)
|
23
|
+
File.open(path, "w") do |f|
|
24
|
+
f.write(contents)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.verify(path, io)
|
29
|
+
if !File.exists?(path)
|
30
|
+
io.puts ""
|
31
|
+
io.puts "Uh oh! It looks like we couldn't locate the #{path} file. "
|
32
|
+
io.puts "Please enter the correct path:"
|
33
|
+
io.puts
|
34
|
+
|
35
|
+
new_path = io.gets
|
36
|
+
verify(new_path, io)
|
37
|
+
else
|
38
|
+
path
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "timber/cli/io/messages"
|
2
|
+
|
3
|
+
module Timber
|
4
|
+
class CLI
|
5
|
+
class Installer
|
6
|
+
attr_reader :io, :api
|
7
|
+
|
8
|
+
def initialize(io, api)
|
9
|
+
@io = io
|
10
|
+
@api = api
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(app)
|
14
|
+
raise NotImplementedError.new
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
# Determines the API key storage prference (environment variable or inline)
|
19
|
+
def get_api_key_storage_preference
|
20
|
+
io.puts ""
|
21
|
+
io.puts IO::Messages.separator
|
22
|
+
io.puts ""
|
23
|
+
io.puts "For production/staging would you like to store your Timber API key"
|
24
|
+
io.puts "in an environment variable? (TIMBER_API_KEY)"
|
25
|
+
io.puts ""
|
26
|
+
io.puts "y) Yes, store in TIMBER_API_KEY", :blue
|
27
|
+
io.puts "n) No, just paste the API key inline", :blue
|
28
|
+
io.puts ""
|
29
|
+
|
30
|
+
case io.ask_yes_no("Enter your choice:", event_prompt: "Store API key in env?")
|
31
|
+
when :yes
|
32
|
+
io.puts ""
|
33
|
+
io.puts IO::Messages.http_environment_variables(api.api_key)
|
34
|
+
io.puts ""
|
35
|
+
|
36
|
+
io.ask_to_proceed
|
37
|
+
|
38
|
+
:environment
|
39
|
+
when :no
|
40
|
+
:inline
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Based on the API key storage preference, we generate the proper code.
|
45
|
+
def get_api_key_code(storage_type)
|
46
|
+
case storage_type
|
47
|
+
when :environment
|
48
|
+
"ENV['TIMBER_API_KEY']"
|
49
|
+
when :inline
|
50
|
+
"'#{api.api_key}'"
|
51
|
+
else
|
52
|
+
raise ArgumentError.new("API key storage type not recognized! " \
|
53
|
+
"#{storage_type.inspect}")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|