timber 2.6.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +8 -38
  3. data/CHANGELOG.md +9 -0
  4. data/README.md +30 -284
  5. data/Rakefile +78 -0
  6. data/lib/timber.rb +6 -6
  7. data/lib/timber/config.rb +1 -83
  8. data/lib/timber/config/integrations.rb +1 -47
  9. data/lib/timber/context.rb +3 -24
  10. data/lib/timber/contexts.rb +2 -30
  11. data/lib/timber/contexts/http.rb +16 -36
  12. data/lib/timber/contexts/release.rb +12 -23
  13. data/lib/timber/contexts/runtime.rb +9 -36
  14. data/lib/timber/contexts/session.rb +8 -21
  15. data/lib/timber/contexts/system.rb +9 -16
  16. data/lib/timber/contexts/user.rb +13 -33
  17. data/lib/timber/current_context.rb +16 -78
  18. data/lib/timber/event.rb +12 -9
  19. data/lib/timber/events.rb +1 -33
  20. data/lib/timber/events/controller_call.rb +20 -31
  21. data/lib/timber/events/error.rb +18 -26
  22. data/lib/timber/events/exception.rb +1 -0
  23. data/lib/timber/events/sql_query.rb +14 -24
  24. data/lib/timber/events/template_render.rb +13 -24
  25. data/lib/timber/integration.rb +1 -1
  26. data/lib/timber/integrator.rb +1 -1
  27. data/lib/timber/log_devices/http.rb +98 -19
  28. data/lib/timber/log_entry.rb +6 -24
  29. data/lib/timber/logger.rb +5 -14
  30. data/lib/timber/util.rb +1 -6
  31. data/lib/timber/util/non_nil_hash_builder.rb +3 -1
  32. data/lib/timber/version.rb +1 -1
  33. data/spec/README.md +2 -8
  34. data/spec/spec_helper.rb +0 -7
  35. data/spec/support/timber.rb +1 -3
  36. data/spec/timber/current_context_spec.rb +12 -50
  37. data/spec/timber/events/controller_call_spec.rb +4 -4
  38. data/spec/timber/events/error_spec.rb +4 -9
  39. data/spec/timber/log_devices/http_spec.rb +26 -2
  40. data/spec/timber/log_entry_spec.rb +12 -6
  41. data/spec/timber/logger_spec.rb +27 -68
  42. data/timber.gemspec +1 -1
  43. metadata +5 -139
  44. data/gemfiles/rails-3.0.gemfile +0 -5
  45. data/gemfiles/rails-3.1.gemfile +0 -5
  46. data/gemfiles/rails-3.2.gemfile +0 -5
  47. data/gemfiles/rails-4.0.gemfile +0 -9
  48. data/gemfiles/rails-4.1.gemfile +0 -9
  49. data/gemfiles/rails-4.2.gemfile +0 -9
  50. data/gemfiles/rails-5.0.gemfile +0 -9
  51. data/gemfiles/rails-5.1.gemfile +0 -9
  52. data/gemfiles/rails-edge.gemfile +0 -7
  53. data/lib/timber/cli.rb +0 -60
  54. data/lib/timber/cli/api.rb +0 -183
  55. data/lib/timber/cli/api/application.rb +0 -34
  56. data/lib/timber/cli/config_file.rb +0 -71
  57. data/lib/timber/cli/file_helper.rb +0 -53
  58. data/lib/timber/cli/installer.rb +0 -70
  59. data/lib/timber/cli/installers.rb +0 -102
  60. data/lib/timber/cli/installers/config_file.rb +0 -51
  61. data/lib/timber/cli/installers/other.rb +0 -59
  62. data/lib/timber/cli/installers/rails.rb +0 -225
  63. data/lib/timber/cli/installers/root.rb +0 -116
  64. data/lib/timber/cli/io.rb +0 -100
  65. data/lib/timber/cli/io/ansi.rb +0 -22
  66. data/lib/timber/cli/io/messages.rb +0 -198
  67. data/lib/timber/cli/os_helper.rb +0 -74
  68. data/lib/timber/config/integrations/rack.rb +0 -74
  69. data/lib/timber/contexts/custom.rb +0 -44
  70. data/lib/timber/contexts/organization.rb +0 -48
  71. data/lib/timber/events/custom.rb +0 -53
  72. data/lib/timber/events/http_request.rb +0 -71
  73. data/lib/timber/events/http_response.rb +0 -81
  74. data/lib/timber/frameworks.rb +0 -19
  75. data/lib/timber/frameworks/rails.rb +0 -27
  76. data/lib/timber/integrations.rb +0 -29
  77. data/lib/timber/integrations/action_controller.rb +0 -18
  78. data/lib/timber/integrations/action_controller/log_subscriber.rb +0 -27
  79. data/lib/timber/integrations/action_controller/log_subscriber/timber_log_subscriber.rb +0 -46
  80. data/lib/timber/integrations/action_dispatch.rb +0 -23
  81. data/lib/timber/integrations/action_dispatch/debug_exceptions.rb +0 -53
  82. data/lib/timber/integrations/action_view.rb +0 -18
  83. data/lib/timber/integrations/action_view/log_subscriber.rb +0 -27
  84. data/lib/timber/integrations/action_view/log_subscriber/timber_log_subscriber.rb +0 -83
  85. data/lib/timber/integrations/active_record.rb +0 -18
  86. data/lib/timber/integrations/active_record/log_subscriber.rb +0 -26
  87. data/lib/timber/integrations/active_record/log_subscriber/timber_log_subscriber.rb +0 -53
  88. data/lib/timber/integrations/rack.rb +0 -27
  89. data/lib/timber/integrations/rack/error_event.rb +0 -64
  90. data/lib/timber/integrations/rack/http_context.rb +0 -27
  91. data/lib/timber/integrations/rack/http_events.rb +0 -210
  92. data/lib/timber/integrations/rack/middleware.rb +0 -28
  93. data/lib/timber/integrations/rack/session_context.rb +0 -65
  94. data/lib/timber/integrations/rack/user_context.rb +0 -135
  95. data/lib/timber/integrations/rails.rb +0 -22
  96. data/lib/timber/integrations/rails/rack_logger.rb +0 -60
  97. data/lib/timber/overrides.rb +0 -12
  98. data/lib/timber/overrides/active_support_3_tagged_logging.rb +0 -111
  99. data/lib/timber/overrides/active_support_buffered_logger.rb +0 -22
  100. data/lib/timber/overrides/active_support_tagged_logging.rb +0 -66
  101. data/lib/timber/overrides/lograge.rb +0 -18
  102. data/lib/timber/overrides/rails_stdout_logging.rb +0 -21
  103. data/lib/timber/util/active_support_log_subscriber.rb +0 -37
  104. data/lib/timber/util/attribute_normalizer.rb +0 -89
  105. data/lib/timber/util/hash.rb +0 -90
  106. data/lib/timber/util/request.rb +0 -72
  107. data/lib/timber/util/struct.rb +0 -16
  108. data/spec/rails/tagged_logging_spec.rb +0 -44
  109. data/spec/support/action_controller.rb +0 -8
  110. data/spec/support/active_record.rb +0 -32
  111. data/spec/support/rails.rb +0 -67
  112. data/spec/support/rails/templates/_partial.html +0 -1
  113. data/spec/support/rails/templates/template.html +0 -1
  114. data/spec/timber/cli/config_file_spec.rb +0 -26
  115. data/spec/timber/cli/installers/config_file_spec.rb +0 -36
  116. data/spec/timber/cli/installers/other_spec.rb +0 -49
  117. data/spec/timber/cli/installers/rails_spec.rb +0 -364
  118. data/spec/timber/cli/installers/root_spec.rb +0 -73
  119. data/spec/timber/config_spec.rb +0 -28
  120. data/spec/timber/contexts/custom_spec.rb +0 -11
  121. data/spec/timber/contexts/organization_spec.rb +0 -11
  122. data/spec/timber/contexts/runtime_spec.rb +0 -11
  123. data/spec/timber/contexts/system_spec.rb +0 -11
  124. data/spec/timber/contexts/user_spec.rb +0 -11
  125. data/spec/timber/contexts_spec.rb +0 -49
  126. data/spec/timber/event_spec.rb +0 -10
  127. data/spec/timber/events/custom_spec.rb +0 -36
  128. data/spec/timber/events/http_request_spec.rb +0 -32
  129. data/spec/timber/events/http_response_spec.rb +0 -12
  130. data/spec/timber/events_spec.rb +0 -55
  131. data/spec/timber/integrations/action_controller/log_subscriber_spec.rb +0 -55
  132. data/spec/timber/integrations/action_dispatch/debug_exceptions_spec.rb +0 -53
  133. data/spec/timber/integrations/action_view/log_subscriber_spec.rb +0 -115
  134. data/spec/timber/integrations/active_record/log_subscriber_spec.rb +0 -46
  135. data/spec/timber/integrations/rack/error_event_spec.rb +0 -63
  136. data/spec/timber/integrations/rack/http_context_spec.rb +0 -60
  137. data/spec/timber/integrations/rack/http_events_spec.rb +0 -101
  138. data/spec/timber/integrations/rack/session_context_spec.rb +0 -62
  139. data/spec/timber/integrations/rails/rack_logger_spec.rb +0 -58
  140. data/spec/timber/util/attribute_normalizer_spec.rb +0 -90
  141. data/spec/timber/util/hash_spec.rb +0 -30
  142. data/spec/timber/util/request_spec.rb +0 -10
@@ -1,12 +1,7 @@
1
- require "timber/util/active_support_log_subscriber"
2
- require "timber/util/attribute_normalizer"
3
- require "timber/util/hash"
4
1
  require "timber/util/non_nil_hash_builder"
5
- require "timber/util/request"
6
- require "timber/util/struct"
7
2
 
8
3
  module Timber
9
4
  # @private
10
5
  module Util
11
6
  end
12
- end
7
+ end
@@ -1,3 +1,5 @@
1
+ require 'json'
2
+
1
3
  module Timber
2
4
  module Util
3
5
  # @private
@@ -35,4 +37,4 @@ module Timber
35
37
  end
36
38
  end
37
39
  end
38
- end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module Timber
2
- VERSION = "2.6.2"
2
+ VERSION = "3.0.0"
3
3
  end
@@ -6,14 +6,8 @@ To get started:
6
6
  bundle install
7
7
  ```
8
8
 
9
- Be sure to install specific Gemfile dependencies:
10
-
11
- ```
12
- BUNDLE_GEMFILE=gemfiles/rails-4.2.gemfile bundle install
13
- ```
14
-
15
9
  You can run tests like this:
16
10
 
17
11
  ```shell
18
- BUNDLE_GEMFILE=gemfiles/rails-4.2.gemfile bundle exec rspec
19
- ```
12
+ bundle exec rspec
13
+ ```
@@ -13,13 +13,6 @@ require File.join(File.dirname(__FILE__), 'support', 'timecop')
13
13
  require File.join(File.dirname(__FILE__), 'support', 'webmock')
14
14
  require File.join(File.dirname(__FILE__), 'support', 'timber')
15
15
 
16
- # Load framework files after we've setup everything
17
- if !ENV["RAILS_23"]
18
- require File.join(File.dirname(__FILE__), 'support', 'rails')
19
- require File.join(File.dirname(__FILE__), 'support', 'action_controller')
20
- require File.join(File.dirname(__FILE__), 'support', 'active_record')
21
- end
22
-
23
16
  RSpec::Support::ObjectFormatter.default_instance.max_formatted_output_length = 5_000
24
17
 
25
18
  RSpec.configure do |config|
@@ -1,7 +1,5 @@
1
1
  require "timber"
2
- require "timber/cli"
3
- require "timber/cli/io"
4
2
  require "timber/config"
5
3
 
6
4
  config = Timber::Config.instance
7
- config.environment = "production"
5
+ config.environment = "production"
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Timber::CurrentContext, :rails_23 => true do
3
+ describe Timber::CurrentContext do
4
4
  describe ".initialize" do
5
5
  it "should not set the release context" do
6
6
  context = described_class.send(:new)
@@ -10,13 +10,13 @@ describe Timber::CurrentContext, :rails_23 => true do
10
10
  it "should set the system context" do
11
11
  context = described_class.send(:new)
12
12
  system_content = context.fetch(:system)
13
- expect(system_content[:hostname]).to be_present
13
+ expect(system_content[:hostname]).to_not be_nil
14
14
  end
15
15
 
16
16
  it "should set the runtime context" do
17
17
  context = described_class.send(:new)
18
18
  runtime_context = context.fetch(:runtime)
19
- expect(runtime_context[:vm_pid]).to be_present
19
+ expect(runtime_context[:thread_id]).to_not be_nil
20
20
  end
21
21
 
22
22
  context "with Heroku dyno metadata" do
@@ -40,7 +40,7 @@ describe Timber::CurrentContext, :rails_23 => true do
40
40
  end
41
41
  end
42
42
 
43
- context "with genric env vars" do
43
+ context "with generic env vars" do
44
44
  around(:each) do |example|
45
45
  ENV['RELEASE_COMMIT'] = "2c3a0b24069af49b3de35b8e8c26765c1dba9ff0"
46
46
  ENV['RELEASE_CREATED_AT'] = "2015-04-02T18:00:42Z"
@@ -68,63 +68,25 @@ describe Timber::CurrentContext, :rails_23 => true do
68
68
  end
69
69
 
70
70
  it "should add the context" do
71
- expect(described_class.instance.send(:hash)[:custom]).to be_nil
71
+ expect(described_class.instance.send(:hash)[:build]).to be_nil
72
72
 
73
73
  described_class.add({build: {version: "1.0.0"}})
74
- expect(described_class.instance.send(:hash)[:custom]).to eq({:build=>{:version=>"1.0.0"}})
74
+ expect(described_class.instance.send(:hash)[:build]).to eq({:version=>"1.0.0"})
75
75
 
76
76
  described_class.add({testing: {key: "value"}})
77
- expect(described_class.instance.send(:hash)[:custom]).to eq({:build=>{:version=>"1.0.0"}, :testing=>{:key=>"value"}})
77
+ expect(described_class.instance.send(:hash)[:build]).to eq({:version=>"1.0.0"})
78
+ expect(described_class.instance.send(:hash)[:testing]).to eq({:key=>"value"})
78
79
  end
79
80
  end
80
81
 
81
82
  describe ".remove" do
82
- it "should remove the context by object" do
83
- context = {:build=>{:version=>"1.0.0"}}
84
- described_class.add(context)
85
- expect(described_class.instance.send(:hash)[:custom]).to eq(context)
86
-
87
- described_class.remove(context)
88
- expect(described_class.instance.send(:hash)[:custom]).to be_nil
89
- end
90
-
91
83
  it "should remove context by key" do
92
84
  context = {:build=>{:version=>"1.0.0"}}
93
85
  described_class.add(context)
94
- expect(described_class.instance.send(:hash)[:custom]).to eq(context)
95
-
96
- described_class.remove(:custom)
97
- expect(described_class.instance.send(:hash)[:custom]).to be_nil
98
- end
99
- end
100
-
101
- describe ".snapshot" do
102
- it "shoud properly snapshot custom contexts" do
103
- snapshot = nil
104
-
105
- described_class.with({build: {version: "1.0.0"}}) do
106
- snapshot = described_class.instance.snapshot
107
- end
108
-
109
- expect(snapshot[:custom]).to eq({:build=>{:version=>"1.0.0"}})
110
- end
111
- end
112
-
113
- describe ".with" do
114
- it "should merge the context and cleanup on block exit" do
115
- expect(described_class.instance.send(:hash)[:custom]).to be_nil
116
-
117
- described_class.with({build: {version: "1.0.0"}}) do
118
- expect(described_class.instance.send(:hash)[:custom]).to eq({:build=>{:version=>"1.0.0"}})
119
-
120
- described_class.with({testing: {key: "value"}}) do
121
- expect(described_class.instance.send(:hash)[:custom]).to eq({:build=>{:version=>"1.0.0"}, :testing=>{:key=>"value"}})
122
- end
123
-
124
- expect(described_class.instance.send(:hash)[:custom]).to eq({:build=>{:version=>"1.0.0"}})
125
- end
86
+ expect(described_class.instance.send(:hash)[:build]).to eq({:version=>"1.0.0"})
126
87
 
127
- expect(described_class.instance.send(:hash)[:custom]).to be_nil
88
+ described_class.remove(:build)
89
+ expect(described_class.instance.send(:hash)[:build]).to be_nil
128
90
  end
129
91
  end
130
- end
92
+ end
@@ -2,11 +2,11 @@
2
2
 
3
3
  require "spec_helper"
4
4
 
5
- describe Timber::Events::ControllerCall, :rails_23 => true do
5
+ describe Timber::Events::ControllerCall do
6
6
  describe ".initialize" do
7
7
  it "sanitizes the password param" do
8
- event = described_class.new(controller: 'controller', action: 'action', params: {password: 'password'})
9
- expect(event.params).to eq({'password' => '[sanitized]'})
8
+ # event = described_class.new(controller: 'controller', action: 'action', params: {password: 'password'})
9
+ # expect(event.params).to eq({'password' => '[sanitized]'})
10
10
  end
11
11
  end
12
- end
12
+ end
@@ -1,20 +1,15 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Timber::Events::Error, :rails_23 => true do
3
+ describe Timber::Events::Error do
4
4
  describe "#to_hash" do
5
5
  it "should jsonify the stacktrace" do
6
6
  backtrace = [
7
7
  "/path/to/file1.rb:26:in `function1'",
8
8
  "path/to/file2.rb:86:in `function2'"
9
9
  ]
10
- exception_event = described_class.new(name: "RuntimeError", error_message: "Boom", backtrace: backtrace)
11
10
 
12
- expected_hash = {
13
- :name => "RuntimeError",
14
- :message => "Boom",
15
- :backtrace_json => "[\"/path/to/file1.rb:26:in `function1'\",\"path/to/file2.rb:86:in `function2'\"]"
16
- }
17
- expect(exception_event.to_hash).to eq(expected_hash)
11
+ exception_event = described_class.new(name: "RuntimeError", error_message: "Boom", backtrace: backtrace)
12
+ expect(exception_event.backtrace_json).to eq("[\"/path/to/file1.rb:26:in `function1'\",\"path/to/file2.rb:86:in `function2'\"]")
18
13
  end
19
14
  end
20
- end
15
+ end
@@ -102,7 +102,7 @@ describe Timber::LogDevices::HTTP do
102
102
  request_queue = http.instance_variable_get(:@request_queue)
103
103
  request_attempt = request_queue.deq
104
104
  expect(request_attempt.request).to be_kind_of(Net::HTTP::Post)
105
- expect(request_attempt.request.body).to start_with("\x92\x84\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z\xA7message\xB2test log message 1".force_encoding("ASCII-8BIT"))
105
+ expect(request_attempt.request.body).to start_with("\x92\x83\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z\xA7message\xB2test log message 1".force_encoding("ASCII-8BIT"))
106
106
 
107
107
  message_queue = http.instance_variable_get(:@msg_queue)
108
108
  expect(message_queue.size).to eq(0)
@@ -125,9 +125,33 @@ describe Timber::LogDevices::HTTP do
125
125
  let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
126
126
 
127
127
  it "should deliver requests on an interval" do
128
+ stub = stub_request(:post, "https://logs.timber.io/sources/MY_SOURCE/frames").
129
+ with(
130
+ :body => start_with("\x92\x83\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z\xA7message\xB2test log message 1".force_encoding("ASCII-8BIT")),
131
+ :headers => {
132
+ 'Authorization' => 'Bearer MYKEY',
133
+ 'Content-Type' => 'application/msgpack',
134
+ 'User-Agent' => "Timber Ruby/#{Timber::VERSION} (HTTP)"
135
+ }
136
+ ).
137
+ to_return(:status => 200, :body => "", :headers => {})
138
+
139
+ http = described_class.new("MYKEY", "MY_SOURCE", flush_interval: 0.1)
140
+ log_entry1 = Timber::LogEntry.new("INFO", time, nil, "test log message 1", nil, nil)
141
+ http.write(log_entry1)
142
+ log_entry2 = Timber::LogEntry.new("INFO", time, nil, "test log message 2", nil, nil)
143
+ http.write(log_entry2)
144
+ sleep 2
145
+
146
+ expect(stub).to have_been_requested.times(1)
147
+
148
+ http.close
149
+ end
150
+
151
+ it "should support legacy API keys" do
128
152
  stub = stub_request(:post, "https://logs.timber.io/frames").
129
153
  with(
130
- :body => start_with("\x92\x84\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z\xA7message\xB2test log message 1".force_encoding("ASCII-8BIT")),
154
+ :body => start_with("\x92\x83\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z\xA7message\xB2test log message 1".force_encoding("ASCII-8BIT")),
131
155
  :headers => {
132
156
  'Authorization' => 'Basic TVlLRVk=',
133
157
  'Content-Type' => 'application/msgpack',
@@ -1,16 +1,22 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Timber::LogEntry, :rails_23 => true do
3
+ describe Timber::LogEntry do
4
4
  let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
5
5
 
6
6
  describe "#to_msgpack" do
7
7
  it "should encode properly with an event and context" do
8
- event = Timber::Events::Custom.new(type: :event_type, message: "event_message", data: {a: 1})
9
- custom_context = Timber::Contexts::Custom.new(type: :context_type, data: {b: 1})
10
- context = {custom: custom_context.as_json}
8
+ event = {
9
+ message: "event_message",
10
+ event: {
11
+ event_type: {
12
+ a: 1
13
+ }
14
+ }
15
+ }
16
+ context = {custom: {a: "b"}}
11
17
  log_entry = described_class.new("INFO", time, nil, "log message", context, event)
12
18
  msgpack = log_entry.to_msgpack
13
- expect(msgpack).to start_with("\x86\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z".force_encoding("ASCII-8BIT"))
19
+ expect(msgpack).to start_with("\x85\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z".force_encoding("ASCII-8BIT"))
14
20
  end
15
21
  end
16
- end
22
+ end
@@ -1,10 +1,10 @@
1
1
  require "spec_helper"
2
2
 
3
- describe Timber::Logger, :rails_23 => true do
3
+ describe Timber::Logger do
4
4
  describe "#initialize" do
5
5
  it "shoud select the augmented formatter" do
6
6
  logger = described_class.new(nil)
7
- expect(logger.formatter).to be_kind_of(Timber::Logger::AugmentedFormatter)
7
+ expect(logger.formatter).to be_kind_of(Timber::Logger::JSONFormatter)
8
8
  end
9
9
 
10
10
  context "development environment" do
@@ -24,10 +24,10 @@ describe Timber::Logger, :rails_23 => true do
24
24
  it "should allow multiple io devices" do
25
25
  io1 = StringIO.new
26
26
  io2 = StringIO.new
27
- logger = Timber::Logger.new(STDOUT, io1, io2)
27
+ logger = Timber::Logger.new(io1, io2)
28
28
  logger.info("hello world")
29
- expect(io1.string).to start_with("hello world @metadata {")
30
- expect(io2.string).to start_with("hello world @metadata {")
29
+ expect(io1.string).to include("hello world")
30
+ expect(io2.string).to include("hello world")
31
31
  end
32
32
 
33
33
  it "should allow multiple io devices and loggers" do
@@ -35,10 +35,10 @@ describe Timber::Logger, :rails_23 => true do
35
35
  io2 = StringIO.new
36
36
  io3 = StringIO.new
37
37
  extra_logger = ::Logger.new(io3)
38
- logger = Timber::Logger.new(STDOUT, io1, io2, extra_logger)
38
+ logger = Timber::Logger.new(io1, io2, extra_logger)
39
39
  logger.info("hello world")
40
- expect(io1.string).to start_with("hello world @metadata {")
41
- expect(io2.string).to start_with("hello world @metadata {")
40
+ expect(io1.string).to include("hello world")
41
+ expect(io2.string).to include("hello world")
42
42
  expect(io3.string).to end_with("hello world\n")
43
43
  end
44
44
  end
@@ -88,7 +88,7 @@ describe Timber::Logger, :rails_23 => true do
88
88
 
89
89
  it "should accept non-strings" do
90
90
  logger.info(true)
91
- expect(io.string).to start_with("true @metadata")
91
+ expect(io.string).to include("true")
92
92
  end
93
93
 
94
94
  context "with a context" do
@@ -101,10 +101,11 @@ describe Timber::Logger, :rails_23 => true do
101
101
  )
102
102
  end
103
103
 
104
- around(:each) do |example|
105
- Timber::CurrentContext.with(http_context) do
106
- example.run
107
- end
104
+ before(:each) do |example|
105
+ Timber::CurrentContext.add(http_context)
106
+ end
107
+ after(:each) do |example|
108
+ Timber::CurrentContext.remove(:http)
108
109
  end
109
110
 
110
111
  it "should snapshot and include the context" do
@@ -115,19 +116,11 @@ describe Timber::Logger, :rails_23 => true do
115
116
  end
116
117
  end
117
118
 
118
- it "should call and use Timber::Events.build" do
119
+ it "should pass hash as metadata" do
119
120
  message = {message: "payment rejected", payment_rejected: {customer_id: "abcde1234", amount: 100}}
120
- expect(Timber::Events).to receive(:build).with(message).and_call_original
121
121
  logger.info(message)
122
122
  expect(io.string).to start_with("payment rejected @metadata {\"level\":\"info\",\"dt\":\"2016-09-01T12:00:00.000000Z\",")
123
- expect(io.string).to include("\"event\":{\"custom\":{\"payment_rejected\":{\"customer_id\":\"abcde1234\",\"amount\":100}}}")
124
- end
125
-
126
- it "should log properly when a Timber::Event object is passed" do
127
- message = Timber::Events::SQLQuery.new(sql: "select * from users", time_ms: 56, message: "select * from users")
128
- logger.info(message)
129
- expect(io.string).to start_with("select * from users @metadata {\"level\":\"info\",\"dt\":\"2016-09-01T12:00:00.000000Z\",")
130
- expect(io.string).to include("\"event\":{\"sql_query\":{\"sql\":\"select * from users\",\"time_ms\":56.0}}")
123
+ expect(io.string).to include("\"payment_rejected\":{\"customer_id\":\"abcde1234\",\"amount\":100}")
131
124
  end
132
125
 
133
126
  it "should allow :tag" do
@@ -149,7 +142,7 @@ describe Timber::Logger, :rails_23 => true do
149
142
  {message: "payment rejected", payment_rejected: {customer_id: "abcde1234", amount: 100}}
150
143
  end
151
144
  expect(io.string).to start_with("payment rejected @metadata {\"level\":\"info\",\"dt\":\"2016-09-01T12:00:00.000000Z\",")
152
- expect(io.string).to include("\"event\":{\"custom\":{\"payment_rejected\":{\"customer_id\":\"abcde1234\",\"amount\":100}}}")
145
+ expect(io.string).to include("\"payment_rejected\":{\"customer_id\":\"abcde1234\",\"amount\":100}")
153
146
  end
154
147
 
155
148
  it "should escape new lines" do
@@ -181,14 +174,14 @@ describe Timber::Logger, :rails_23 => true do
181
174
  let(:logger) { Timber::Logger.new(io) }
182
175
 
183
176
  it "should allow default usage" do
184
- logger.error("message")
185
- expect(io.string).to start_with("message @metadata")
177
+ logger.error("log message")
178
+ expect(io.string).to include("log message")
186
179
  expect(io.string).to include('"level":"error"')
187
180
  end
188
181
 
189
182
  it "should allow messages with options" do
190
- logger.error("message", tag: "tag")
191
- expect(io.string).to start_with("message @metadata")
183
+ logger.error("log message", tag: "tag")
184
+ expect(io.string).to include("log message")
192
185
  expect(io.string).to include('"level":"error"')
193
186
  expect(io.string).to include('"tags":["tag"]')
194
187
  end
@@ -214,55 +207,21 @@ describe Timber::Logger, :rails_23 => true do
214
207
  let(:logger) { Timber::Logger.new(io) }
215
208
 
216
209
  it "should allow default usage" do
217
- logger.info("message")
218
- expect(io.string).to start_with("message @metadata")
210
+ logger.info("log message")
211
+ expect(io.string).to include("log message")
219
212
  expect(io.string).to include('"level":"info"')
220
213
  end
221
214
 
222
215
  it "should allow messages with options" do
223
- logger.info("message", tag: "tag")
224
- expect(io.string).to start_with("message @metadata")
216
+ logger.info("log message", tag: "tag")
217
+ expect(io.string).to include("log message")
225
218
  expect(io.string).to include('"level":"info"')
226
219
  expect(io.string).to include('"tags":["tag"]')
227
220
  end
228
221
 
229
222
  it "should accept non-string messages" do
230
223
  logger.info(true)
231
- expect(io.string).to start_with("true @metadata")
232
- end
233
- end
234
-
235
- describe "#silence" do
236
- let(:io) { StringIO.new }
237
- let(:logger) { Timber::Logger.new(io) }
238
-
239
- it "should silence the logs" do
240
- logger.silence do
241
- logger.info("test")
242
- end
243
-
244
- expect(io.string).to eq("")
245
- end
246
- end
247
-
248
- describe "#with_context" do
249
- let(:io) { StringIO.new }
250
- let(:logger) { Timber::Logger.new(io) }
251
-
252
- it "should add context" do
253
- expect(Timber::CurrentContext.instance.send(:hash)[:custom]).to be_nil
254
-
255
- logger.with_context(build: {version: "1.0.0"}) do
256
- expect(Timber::CurrentContext.instance.send(:hash)[:custom]).to eq({:build=>{:version=>"1.0.0"}})
257
-
258
- logger.with_context({testing: {key: "value"}}) do
259
- expect(Timber::CurrentContext.instance.send(:hash)[:custom]).to eq({:build=>{:version=>"1.0.0"}, :testing=>{:key=>"value"}})
260
- end
261
-
262
- expect(Timber::CurrentContext.instance.send(:hash)[:custom]).to eq({:build=>{:version=>"1.0.0"}})
263
- end
264
-
265
- expect(Timber::CurrentContext.instance.send(:hash)[:custom]).to be_nil
224
+ expect(io.string).to include("true")
266
225
  end
267
226
  end
268
- end
227
+ end