timber 2.6.2 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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