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/lib/timber/timer.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Timber
|
2
|
+
# This is an ultra-simple abstraction for timing code. This provides a little
|
3
|
+
# more control around how Timber automatically processes "timers".
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# timer = Timber::Timer.start
|
7
|
+
# # ... code to time
|
8
|
+
# logger.info("My log message", my_event: {time_ms: timer})
|
9
|
+
module Timer
|
10
|
+
# Abstract for starting a timber. Currently this is simply calling `Time.now`.
|
11
|
+
def self.start
|
12
|
+
Time.now
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get the duration in milliseconds from the object returned in {#start}
|
16
|
+
def self.duration_ms(timer)
|
17
|
+
now = Time.now
|
18
|
+
(now - timer) * 1000.0
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/timber/util/hash.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module Timber
|
2
2
|
module Util
|
3
|
+
# Utility module for dealing with HTTP events {Events::HTTPServerRequest},
|
4
|
+
# {Events::HTTPServerResponse}, {Events::HTTPClientRequest}, {Events::HTTPClientResponse}.
|
3
5
|
module HTTPEvent
|
4
|
-
|
6
|
+
HEADERS_TO_SANITIZE = ['authorization', 'x-amz-security-token'].freeze
|
5
7
|
QUERY_STRING_LIMIT = 5_000.freeze
|
6
8
|
STRING_CLASS_NAME = 'String'.freeze
|
7
9
|
|
@@ -15,14 +17,24 @@ module Timber
|
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
20
|
+
# Normalizes the body. If limit if passed it will truncate the body to that limit.
|
18
21
|
def normalize_body(body)
|
19
22
|
if body.respond_to?(:body)
|
20
23
|
body = body.body.to_s
|
21
24
|
end
|
22
25
|
|
23
|
-
|
26
|
+
limit = Config.instance.http_body_limit
|
27
|
+
if limit
|
28
|
+
body[0..(limit - 1)]
|
29
|
+
else
|
30
|
+
body
|
31
|
+
end
|
24
32
|
end
|
25
33
|
|
34
|
+
# Normalizes headers to:
|
35
|
+
#
|
36
|
+
# 1. Ensure the value is UTF8, this will otherwise throw errors upon capturing.
|
37
|
+
# 2. Sanitize sensitive headers such as `Authorization` or custom headers specified in
|
26
38
|
def normalize_headers(headers)
|
27
39
|
if headers.is_a?(::Hash)
|
28
40
|
h = headers.each_with_object({}) do |(k, v), h|
|
@@ -46,13 +58,14 @@ module Timber
|
|
46
58
|
end
|
47
59
|
end
|
48
60
|
|
49
|
-
keys_to_sanitize =
|
61
|
+
keys_to_sanitize = HEADERS_TO_SANITIZE + (Config.instance.http_header_filters || [])
|
50
62
|
Util::Hash.sanitize(h, keys_to_sanitize)
|
51
63
|
else
|
52
64
|
headers
|
53
65
|
end
|
54
66
|
end
|
55
67
|
|
68
|
+
# Normalizes the HTTP method into an uppercase string.
|
56
69
|
def normalize_method(method)
|
57
70
|
method.is_a?(::String) ? method.upcase : method
|
58
71
|
end
|
data/lib/timber/version.rb
CHANGED
data/spec/support/timber.rb
CHANGED
@@ -0,0 +1,160 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Timber::CLI::Installers::Rails, :rails_23 => true do
|
4
|
+
let(:api_key) { "abcd1234" }
|
5
|
+
let(:app) do
|
6
|
+
attributes = {
|
7
|
+
"api_key" => api_key,
|
8
|
+
"environment" => "development",
|
9
|
+
"framework_type" => "rails",
|
10
|
+
"heroku_drain_url" => "http://drain.heroku.com",
|
11
|
+
"name" => "My Rails App",
|
12
|
+
"platform_type" => "other"
|
13
|
+
}
|
14
|
+
Timber::CLI::API::Application.new(attributes)
|
15
|
+
end
|
16
|
+
let(:api) { Timber::CLI::API.new(api_key) }
|
17
|
+
let(:input) { StringIO.new }
|
18
|
+
let(:output) { StringIO.new }
|
19
|
+
let(:io) { Timber::CLI::IO.new(io_out: output, io_in: input) }
|
20
|
+
let(:installer) { described_class.new(io, api) }
|
21
|
+
let(:initial_config_contents) { "# Timber.io Ruby Configuration - Simple Structured Logging\n#\n# ^ ^ ^ ^ ___I_ ^ ^ ^ ^ ^ ^ ^\n# /|\\/|\\/|\\ /|\\ /\\-_--\\ /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\\n# /|\\/|\\/|\\ /|\\ / \\_-__\\ /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\\n# /|\\/|\\/|\\ /|\\ |[]| [] | /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\\n# -------------------------------------------------------------------\n# Website: https://timber.io\n# Documentation: https://timber.io/docs\n# Support: support@timber.io\n# -------------------------------------------------------------------\n\nconfig = Timber::Config.instance\n\n# Add additional configuration here.\n# For a full list of configuration options and their explanations see:\n# http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Config\n\n" }
|
22
|
+
|
23
|
+
describe ".run" do
|
24
|
+
it "should execute properly" do
|
25
|
+
expect(installer).to receive(:get_development_preference).exactly(1).times.and_return(:send)
|
26
|
+
expect(installer).to receive(:get_api_key_storage_preference).exactly(1).times.and_return(:environment)
|
27
|
+
expect(installer).to receive(:logrageify?).exactly(1).times.and_return(true)
|
28
|
+
expect(installer).to receive(:initializer).exactly(1).times.and_return(true)
|
29
|
+
expect(installer).to receive(:logrageify!).exactly(1).times.and_return(true)
|
30
|
+
expect(installer).to receive(:environment_file_paths).exactly(1).times.and_return(["config/environments/development.rb", "config/environments/production.rb", "config/environments/test.rb"])
|
31
|
+
expect(installer).to receive(:setup_development_environment).with("config/environments/development.rb", :send).and_return(true)
|
32
|
+
expect(installer).to receive(:setup_other_environment).with(app, "config/environments/production.rb", :environment).and_return(true)
|
33
|
+
expect(installer).to receive(:setup_test_environment).with("config/environments/test.rb").and_return(true)
|
34
|
+
|
35
|
+
installer.run(app)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe ".initializer" do
|
40
|
+
it "should create a config file" do
|
41
|
+
config_file_path = "config/initializers/timber.rb"
|
42
|
+
|
43
|
+
expect(Timber::CLI::FileHelper).to receive(:read_or_create).
|
44
|
+
with(config_file_path, initial_config_contents).
|
45
|
+
and_return(initial_config_contents)
|
46
|
+
|
47
|
+
config_file = installer.send(:initializer)
|
48
|
+
expect(config_file.path).to eq(config_file_path)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe ".logrageify?" do
|
53
|
+
it "should do nothing if Lograge is not detected" do
|
54
|
+
expect(installer.send(:logrageify?)).to eq(false)
|
55
|
+
expect(output.string).to eq("")
|
56
|
+
end
|
57
|
+
|
58
|
+
context "with a Lograge constant" do
|
59
|
+
around(:each) do |example|
|
60
|
+
Lograge = 1
|
61
|
+
example.run
|
62
|
+
Object.send(:remove_const, :Lograge)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should prompt for Lograge configuration and return true for y" do
|
66
|
+
input.string = "y\n"
|
67
|
+
expect(installer.send(:logrageify?)).to eq(true)
|
68
|
+
expect(output.string).to eq("\n--------------------------------------------------------------------------------\n\nWe noticed you have lograge installed. Would you like to configure \nTimber to function similarly?\n(This silences template renders, sql queries, and controller calls.\nYou can always do this later in config/initialzers/timber.rb)\n\n\e[34my) Yes, configure Timber like lograge\e[0m\n\e[34mn) No, use the Rails logging defaults\e[0m\n\nEnter your choice: (y/n) ")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe ".logrageify!" do
|
74
|
+
it "should set the option in the config file" do
|
75
|
+
config_file_path = "config/initializers/timber.rb"
|
76
|
+
|
77
|
+
expect(Timber::CLI::FileHelper).to receive(:read_or_create).
|
78
|
+
with(config_file_path, initial_config_contents).
|
79
|
+
and_return(initial_config_contents)
|
80
|
+
|
81
|
+
expect(Timber::CLI::FileHelper).to receive(:read).
|
82
|
+
with(config_file_path).
|
83
|
+
and_return(initial_config_contents)
|
84
|
+
|
85
|
+
new_config_contents = "# Timber.io Ruby Configuration - Simple Structured Logging\n#\n# ^ ^ ^ ^ ___I_ ^ ^ ^ ^ ^ ^ ^\n# /|\\/|\\/|\\ /|\\ /\\-_--\\ /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\\n# /|\\/|\\/|\\ /|\\ / \\_-__\\ /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\\n# /|\\/|\\/|\\ /|\\ |[]| [] | /|\\/|\\ /|\\/|\\/|\\ /|\\/|\\\n# -------------------------------------------------------------------\n# Website: https://timber.io\n# Documentation: https://timber.io/docs\n# Support: support@timber.io\n# -------------------------------------------------------------------\n\nconfig = Timber::Config.instance\n\nconfig.logrageify!\n\n# Add additional configuration here.\n# For a full list of configuration options and their explanations see:\n# http://www.rubydoc.info/github/timberio/timber-ruby/Timber/Config\n\n"
|
86
|
+
|
87
|
+
expect(Timber::CLI::FileHelper).to receive(:write).
|
88
|
+
with(config_file_path, new_config_contents).
|
89
|
+
and_return(true)
|
90
|
+
|
91
|
+
expect(installer.send(:logrageify!)).to eq(true)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe ".setup_development_environment" do
|
96
|
+
it "should setup properly" do
|
97
|
+
env_file_path = "config/environments/development.rb"
|
98
|
+
|
99
|
+
expect(Timber::CLI::FileHelper).to receive(:read).
|
100
|
+
with(env_file_path).
|
101
|
+
exactly(2).times.
|
102
|
+
and_return("\nend")
|
103
|
+
|
104
|
+
logger_code = defined?(ActiveSupport::TaggedLogging) ? "ActiveSupport::TaggedLogging.new(logger)" : "logger"
|
105
|
+
new_contents = "\n\n # Install the Timber.io logger, send logs over HTTP.\n # Note: When you are done testing, simply instantiate the logger like this:\n#\n# logger = Timber::Logger.new(STDOUT)\n#\n# Be sure to remove the \"log_device =\" and \"logger =\" lines below.\n log_device = Timber::LogDevices::HTTP.new('abcd1234')\n logger = Timber::Logger.new(log_device)\n logger.level = config.log_level\n config.logger = #{logger_code}\n\nend"
|
106
|
+
|
107
|
+
expect(Timber::CLI::FileHelper).to receive(:write).
|
108
|
+
with(env_file_path, new_contents).
|
109
|
+
and_return(true)
|
110
|
+
|
111
|
+
expect(api).to receive(:event).with(:file_written, path: env_file_path)
|
112
|
+
|
113
|
+
expect(installer.send(:setup_development_environment, env_file_path, :send)).to eq(true)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe ".setup_test_environment" do
|
118
|
+
it "should setup properly" do
|
119
|
+
env_file_path = "config/environments/test.rb"
|
120
|
+
|
121
|
+
expect(Timber::CLI::FileHelper).to receive(:read).
|
122
|
+
with(env_file_path).
|
123
|
+
exactly(2).times.
|
124
|
+
and_return("\nend")
|
125
|
+
|
126
|
+
logger_code = defined?(ActiveSupport::TaggedLogging) ? "ActiveSupport::TaggedLogging.new(logger)" : "logger"
|
127
|
+
new_contents = "\n\n # Install the Timber.io logger but silence all logs (log to nil). We install the\n # logger to ensure the Rails.logger object exposes the proper API.\n logger = Timber::Logger.new(nil)\n logger.level = config.log_level\n config.logger = #{logger_code}\n\nend"
|
128
|
+
|
129
|
+
expect(Timber::CLI::FileHelper).to receive(:write).
|
130
|
+
with(env_file_path, new_contents).
|
131
|
+
and_return(true)
|
132
|
+
|
133
|
+
expect(api).to receive(:event).with(:file_written, path: env_file_path)
|
134
|
+
|
135
|
+
expect(installer.send(:setup_test_environment, env_file_path)).to eq(true)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe ".setup_other_environment" do
|
140
|
+
it "should setup properly" do
|
141
|
+
env_file_path = "config/environments/production.rb"
|
142
|
+
|
143
|
+
expect(Timber::CLI::FileHelper).to receive(:read).
|
144
|
+
with(env_file_path).
|
145
|
+
exactly(2).times.
|
146
|
+
and_return("\nend")
|
147
|
+
|
148
|
+
logger_code = defined?(ActiveSupport::TaggedLogging) ? "ActiveSupport::TaggedLogging.new(logger)" : "logger"
|
149
|
+
new_contents = "\n\n # Install the Timber.io logger, send logs over HTTP.\n log_device = Timber::LogDevices::HTTP.new(ENV['TIMBER_API_KEY'])\n logger = Timber::Logger.new(log_device)\n logger.level = config.log_level\n config.logger = #{logger_code}\n\nend"
|
150
|
+
|
151
|
+
expect(Timber::CLI::FileHelper).to receive(:write).
|
152
|
+
with(env_file_path, new_contents).
|
153
|
+
and_return(true)
|
154
|
+
|
155
|
+
expect(api).to receive(:event).with(:file_written, path: env_file_path).exactly(1).times
|
156
|
+
|
157
|
+
expect(installer.send(:setup_other_environment, app, env_file_path, :environment)).to eq(true)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Timber::CLI::Installers::Root, :rails_23 => true do
|
6
|
+
let(:api_key) { "abcd1234" }
|
7
|
+
let(:app) do
|
8
|
+
attributes = {
|
9
|
+
"api_key" => api_key,
|
10
|
+
"environment" => "development",
|
11
|
+
"framework_type" => "rails",
|
12
|
+
"heroku_drain_url" => "http://drain.heroku.com",
|
13
|
+
"name" => "My Rails App",
|
14
|
+
"platform_type" => "other"
|
15
|
+
}
|
16
|
+
Timber::CLI::API::Application.new(attributes)
|
17
|
+
end
|
18
|
+
let(:api) { Timber::CLI::API.new(api_key) }
|
19
|
+
let(:input) { StringIO.new }
|
20
|
+
let(:output) { StringIO.new }
|
21
|
+
let(:io) { Timber::CLI::IO.new(io_out: output, io_in: input) }
|
22
|
+
let(:installer) { described_class.new(io, api) }
|
23
|
+
|
24
|
+
describe ".run" do
|
25
|
+
it "should run properly" do
|
26
|
+
input.string = "y\n"
|
27
|
+
|
28
|
+
expect(installer).to receive(:install_platform).with(app).exactly(1).times.and_return(true)
|
29
|
+
expect(installer).to receive(:run_sub_installer).with(app).exactly(1).times.and_return(true)
|
30
|
+
expect(installer).to receive(:send_test_messages).exactly(1).times.and_return(true)
|
31
|
+
expect(installer).to receive(:confirm_log_delivery).exactly(1).times.and_return(true)
|
32
|
+
expect(installer).to receive(:assist_with_git).exactly(1).times.and_return(true)
|
33
|
+
expect(api).to receive(:event).with(:success).exactly(1).times
|
34
|
+
expect(installer).to receive(:collect_feedback).exactly(1).times.and_return(true)
|
35
|
+
|
36
|
+
expect(installer.run(app)).to eq(true)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe ".install_platform" do
|
41
|
+
context "non-heroku" do
|
42
|
+
it "should do nothing" do
|
43
|
+
expect(installer.send(:install_platform, app)).to eq(true)
|
44
|
+
expect(output.string).to eq("")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "heroku" do
|
49
|
+
before(:each) do
|
50
|
+
app.platform_type = "heroku"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should prompt for Heroku install" do
|
54
|
+
input.string = "y\n"
|
55
|
+
|
56
|
+
expect(installer.send(:install_platform, app)).to eq(true)
|
57
|
+
|
58
|
+
copy_to_clipboard_message = Timber::CLI::OSHelper.copy_to_clipboard? ? "\n \e[32m(✓ copied to clipboard)\e[0m" : ""
|
59
|
+
expected_output = "\n--------------------------------------------------------------------------------\n\nFirst, let's setup your Heroku drain. Run this command in a separate window:\n\n \e[34mheroku drains:add http://drain.heroku.com\e[0m#{copy_to_clipboard_message}\n\nReady to proceed? (y/n) "
|
60
|
+
expect(output.string).to eq(expected_output)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe ".get_sub_installer" do
|
66
|
+
context "with Rails" do
|
67
|
+
around(:each) do |example|
|
68
|
+
if defined?(Rails)
|
69
|
+
example.run
|
70
|
+
else
|
71
|
+
Rails = true
|
72
|
+
example.run
|
73
|
+
Object.send(:remove_const, :Rails)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should return Rails" do
|
78
|
+
expect(installer.send(:get_sub_installer).class).to eq(Timber::CLI::Installers::Rails)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "without Rails" do
|
83
|
+
around(:each) do |example|
|
84
|
+
if defined?(Rails)
|
85
|
+
OldRails = Rails
|
86
|
+
Object.send(:remove_const, :Rails)
|
87
|
+
example.run
|
88
|
+
Rails = OldRails
|
89
|
+
Object.send(:remove_const, :OldRails)
|
90
|
+
else
|
91
|
+
example.run
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should return other" do
|
96
|
+
expect(installer.send(:get_sub_installer).class).to eq(Timber::CLI::Installers::Other)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "singleton"
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe Timber::Config, :rails_23 => true do
|
5
|
+
let(:config) { Timber::Config.send(:new) }
|
6
|
+
|
7
|
+
describe ".logrageify!" do
|
8
|
+
it "should logrageify" do
|
9
|
+
expect(Timber::Integrations::ActionController.silence?).to eq(false)
|
10
|
+
expect(Timber::Integrations::ActionView.silence?).to eq(false)
|
11
|
+
expect(Timber::Integrations::ActiveRecord.silence?).to eq(false)
|
12
|
+
expect(Timber::Integrations::Rack::HTTPEvents.collapse_into_single_event?).to eq(false)
|
13
|
+
|
14
|
+
config.logrageify!
|
15
|
+
|
16
|
+
expect(Timber::Integrations::ActionController.silence?).to eq(true)
|
17
|
+
expect(Timber::Integrations::ActionView.silence?).to eq(true)
|
18
|
+
expect(Timber::Integrations::ActiveRecord.silence?).to eq(true)
|
19
|
+
expect(Timber::Integrations::Rack::HTTPEvents.collapse_into_single_event?).to eq(true)
|
20
|
+
|
21
|
+
# Reset
|
22
|
+
Timber::Integrations::ActionController.silence = false
|
23
|
+
Timber::Integrations::ActionView.silence = false
|
24
|
+
Timber::Integrations::ActiveRecord.silence = false
|
25
|
+
Timber::Integrations::Rack::HTTPEvents.collapse_into_single_event = false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,19 +1,68 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Timber::CurrentContext, :rails_23 => true do
|
4
|
+
describe ".initialize" do
|
5
|
+
it "should not set the release context" do
|
6
|
+
context = described_class.send(:new)
|
7
|
+
expect(context.send(:hash)).to eq({})
|
8
|
+
end
|
9
|
+
|
10
|
+
context "with Heroku dyno metadata" do
|
11
|
+
around(:each) do |example|
|
12
|
+
ENV['HEROKU_SLUG_COMMIT'] = "2c3a0b24069af49b3de35b8e8c26765c1dba9ff0"
|
13
|
+
ENV['HEROKU_RELEASE_CREATED_AT'] = "2015-04-02T18:00:42Z"
|
14
|
+
ENV['HEROKU_RELEASE_VERSION'] = "v2.3.1"
|
15
|
+
|
16
|
+
example.run
|
17
|
+
|
18
|
+
ENV.delete('HEROKU_SLUG_COMMIT')
|
19
|
+
ENV.delete('HEROKU_RELEASE_CREATED_AT')
|
20
|
+
ENV.delete('HEROKU_RELEASE_VERSION')
|
21
|
+
|
22
|
+
described_class.reset
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should automatically set the release context" do
|
26
|
+
context = described_class.send(:new)
|
27
|
+
expect(context.send(:hash)).to eq({:release=>{:commit_hash=>"2c3a0b24069af49b3de35b8e8c26765c1dba9ff0", :created_at=>"2015-04-02T18:00:42Z", :version=>"v2.3.1"}})
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "with genric env vars" do
|
32
|
+
around(:each) do |example|
|
33
|
+
ENV['RELEASE_COMMIT'] = "2c3a0b24069af49b3de35b8e8c26765c1dba9ff0"
|
34
|
+
ENV['RELEASE_CREATED_AT'] = "2015-04-02T18:00:42Z"
|
35
|
+
ENV['RELEASE_VERSION'] = "v2.3.1"
|
36
|
+
|
37
|
+
example.run
|
38
|
+
|
39
|
+
ENV.delete('RELEASE_COMMIT')
|
40
|
+
ENV.delete('RELEASE_CREATED_AT')
|
41
|
+
ENV.delete('RELEASE_VERSION')
|
42
|
+
|
43
|
+
described_class.reset
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should automatically set the release context" do
|
47
|
+
context = described_class.send(:new)
|
48
|
+
expect(context.send(:hash)).to eq({:release=>{:commit_hash=>"2c3a0b24069af49b3de35b8e8c26765c1dba9ff0", :created_at=>"2015-04-02T18:00:42Z", :version=>"v2.3.1"}})
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
4
53
|
describe ".add" do
|
5
54
|
after(:each) do
|
6
55
|
described_class.reset
|
7
56
|
end
|
8
57
|
|
9
58
|
it "should add the context" do
|
10
|
-
expect(described_class.hash).to eq({})
|
59
|
+
expect(described_class.instance.send(:hash)).to eq({})
|
11
60
|
|
12
61
|
described_class.add({build: {version: "1.0.0"}})
|
13
|
-
expect(described_class.hash).to eq({:custom=>{:build=>{:version=>"1.0.0"}}})
|
62
|
+
expect(described_class.instance.send(:hash)).to eq({:custom=>{:build=>{:version=>"1.0.0"}}})
|
14
63
|
|
15
64
|
described_class.add({testing: {key: "value"}})
|
16
|
-
expect(described_class.hash).to eq({:custom=>{:build=>{:version=>"1.0.0"}, :testing=>{:key=>"value"}}})
|
65
|
+
expect(described_class.instance.send(:hash)).to eq({:custom=>{:build=>{:version=>"1.0.0"}, :testing=>{:key=>"value"}}})
|
17
66
|
end
|
18
67
|
end
|
19
68
|
|
@@ -21,37 +70,37 @@ describe Timber::CurrentContext, :rails_23 => true do
|
|
21
70
|
it "should remove the context by object" do
|
22
71
|
context = {:build=>{:version=>"1.0.0"}}
|
23
72
|
described_class.add(context)
|
24
|
-
expect(described_class.hash).to eq({:custom => context})
|
73
|
+
expect(described_class.instance.send(:hash)).to eq({:custom => context})
|
25
74
|
|
26
75
|
described_class.remove(context)
|
27
|
-
expect(described_class.hash).to eq({})
|
76
|
+
expect(described_class.instance.send(:hash)).to eq({})
|
28
77
|
end
|
29
78
|
|
30
79
|
it "should remove context by key" do
|
31
80
|
context = {:build=>{:version=>"1.0.0"}}
|
32
81
|
described_class.add(context)
|
33
|
-
expect(described_class.hash).to eq({:custom => context})
|
82
|
+
expect(described_class.instance.send(:hash)).to eq({:custom => context})
|
34
83
|
|
35
84
|
described_class.remove(:custom)
|
36
|
-
expect(described_class.hash).to eq({})
|
85
|
+
expect(described_class.instance.send(:hash)).to eq({})
|
37
86
|
end
|
38
87
|
end
|
39
88
|
|
40
89
|
describe ".with" do
|
41
90
|
it "should merge the context and cleanup on block exit" do
|
42
|
-
expect(described_class.hash).to eq({})
|
91
|
+
expect(described_class.instance.send(:hash)).to eq({})
|
43
92
|
|
44
93
|
described_class.with({build: {version: "1.0.0"}}) do
|
45
|
-
expect(described_class.hash).to eq({:custom=>{:build=>{:version=>"1.0.0"}}})
|
94
|
+
expect(described_class.instance.send(:hash)).to eq({:custom=>{:build=>{:version=>"1.0.0"}}})
|
46
95
|
|
47
96
|
described_class.with({testing: {key: "value"}}) do
|
48
|
-
expect(described_class.hash).to eq({:custom=>{:build=>{:version=>"1.0.0"}, :testing=>{:key=>"value"}}})
|
97
|
+
expect(described_class.instance.send(:hash)).to eq({:custom=>{:build=>{:version=>"1.0.0"}, :testing=>{:key=>"value"}}})
|
49
98
|
end
|
50
99
|
|
51
|
-
expect(described_class.hash).to eq({:custom=>{:build=>{:version=>"1.0.0"}}})
|
100
|
+
expect(described_class.instance.send(:hash)).to eq({:custom=>{:build=>{:version=>"1.0.0"}}})
|
52
101
|
end
|
53
102
|
|
54
|
-
expect(described_class.hash).to eq({})
|
103
|
+
expect(described_class.instance.send(:hash)).to eq({})
|
55
104
|
end
|
56
105
|
end
|
57
106
|
end
|