scribbler 0.1.1 → 0.1.2

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.
@@ -23,14 +23,28 @@ to your Gemfile and
23
23
 
24
24
  Then
25
25
 
26
- rake scribbler:install # THIS DOESN'T WORK YET
26
+ scribbler install # For options do `scribbler` first
27
27
 
28
28
  You'll find your configuration options in `config/initializers/scribbler.rb`.
29
+ **Better, more documented examples in the template file provided by `scribbler install`**
29
30
  As an example, with this configuration file in a Rails app called `Blogger`:
30
31
 
31
32
  Scribbler::Base.configure do
32
33
  config.application_include = true
34
+
35
+ # config.log_directory = File.new '/a/better/path'
36
+
33
37
  config.logs = %w[production delayed_job]
38
+
39
+ config.use_template_by_default = true # Default: false
40
+
41
+ # config.template = proc do |options|
42
+ # <<-MSG
43
+ # ##########
44
+ # Cool template bro!
45
+ # Message: #{options[:message]}
46
+ # MSG
47
+ # end
34
48
  end
35
49
 
36
50
  You are given a few methods for free. To get the production logfile location:
@@ -62,8 +76,25 @@ More importantly you're given access to a sweet `log` method:
62
76
  Blogger.log File.expand_path(File.join(File.dirname(__FILE__), 'logfile.log')), :message => "#{e} broke stuff"
63
77
  Scribbler::Base.log File.expand_path(File.join(File.dirname(__FILE__), 'logfile.log')), :message => "#{e} broke stuff"
64
78
 
79
+ Log options with the default template proc:
80
+
81
+ options - Hash of options for logging on Ngin
82
+ :error - Error object, mostly for passing to NewRelic
83
+ :message - Message to log in the actual file [REQUIRED]
84
+ :custom_fields - Custom fields dropped into the default template
85
+ :template - Whether or not to use the template at this log
86
+ :new_relic - Notify NewRelic of the error (default: true)
87
+
88
+ With the template enabled (either during call to log [:template => true] or by setting to
89
+ be used by default) you will have each log entry wrapped into a template to pretty-up and
90
+ get some more boilerplate data. As you can see in the config above. See method
91
+ docs and specs for more information.
92
+
65
93
  ## Todo
66
94
 
67
- * More options in configure
68
- * Make block available in log method for better extensibility
95
+ * Configure the module/class receiving the include
96
+ * Configurable notification gem (NewRelic, Airbrake, etc.)
69
97
  * Currently attempts to notify NewRelic if its there, abstract and allow custom services
98
+ * Allow a class to set default options for a log call within itself
99
+ * Allow there to be a log made without the option[:message], in case its all custom_fields or someting
100
+ * Allow event hooks on log call?
@@ -102,7 +102,8 @@ module Scribbler
102
102
  # Returns Nothing.
103
103
  def self.log(location, options={})
104
104
  options = {
105
- :template => config.use_template_by_default
105
+ :template => config.use_template_by_default,
106
+ :stack_frame => options[:call_stack] ? Kernel.caller[1..-1] : nil
106
107
  }.merge options
107
108
  begin
108
109
  NewRelic::Agent.notice_error(options[:error]) if options[:error] and options[:new_relic] != false
@@ -160,13 +161,21 @@ module Scribbler
160
161
  #
161
162
  # Returns Nothing
162
163
  def self.apply_to_log(location, options={})
163
- if location.present? and options[:message].present?
164
- log = File.open(find_file_at(location), 'a')
165
- log.puts build_with_template(options)
166
- log.close
164
+ if can_apply_to_log? location, options
165
+ File.open(find_file_at(location), 'a') do |f|
166
+ f.puts build_with_template(options)
167
+ end
167
168
  end
168
169
  end
169
170
 
171
+ # TODO: Fix to work with any template
172
+ def self.can_apply_to_log?(location, options)
173
+ location.present? and
174
+ (options[:message].present? or
175
+ options[:object].present? or
176
+ options[:custom_fields].present?)
177
+ end
178
+
170
179
  # Attempts to turn a symbol or string into the *_log_location method that
171
180
  # was auto-build based on Configurator.logs and finds the file path
172
181
  #
@@ -182,12 +191,14 @@ module Scribbler
182
191
  # # => :another_file # The method `another_file_log_location` does not exist
183
192
  #
184
193
  # Returns Nothing
185
- #
186
- # TODO: allow the log base directory to be set in configurator
187
194
  def self.find_file_at(location)
188
195
  if location.is_a?(Symbol) or location.is_a?(String)
189
196
  real_method = location.to_s + "_log_location"
190
- location = respond_to?(real_method) ? send(real_method) : location.to_s
197
+ if respond_to?(real_method)
198
+ location = send(real_method)
199
+ else
200
+ location = "#{config.log_directory.to_s}/#{location.to_s}"
201
+ end
191
202
  end
192
203
  location
193
204
  end
@@ -135,7 +135,11 @@ module Scribbler
135
135
  template << "#{Time.now}\n"
136
136
  template << "#{options[:object].class.name}: #{if_id}\n" if options[:object]
137
137
  template << "#{custom_fields}\n" if custom_fields.present?
138
- template << "#{options[:message]}\n\n"
138
+ template << "#{options[:message]}\n"
139
+ template << "Call Stack:\n#{options[:stack_frame].join("\n")}" if options[:call_stack]
140
+ template << "\n"
141
+
142
+ template
139
143
  end
140
144
  end
141
145
  end
@@ -1,3 +1,3 @@
1
1
  module Scribbler
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -58,17 +58,17 @@ module Scribbler
58
58
  end
59
59
 
60
60
  it "calls log, skips templater and still works" do
61
- Scribbler::Base.send(:build_with_template,
61
+ subject.send(:build_with_template,
62
62
  :object => some_object,
63
63
  :template => false,
64
64
  :message => "test\n123").should == "test\n123"
65
65
  end
66
66
 
67
67
  it "calls log and gets message with template wrapper" do
68
- Scribbler::Base.send(:build_with_template,
69
- :object => some_object,
70
- :template => true,
71
- :message => <<-MSG
68
+ subject.send(:build_with_template,
69
+ :template => true,
70
+ :object => some_object,
71
+ :message => <<-MSG
72
72
  test
73
73
  123
74
74
  MSG
@@ -83,11 +83,11 @@ module Scribbler
83
83
  end
84
84
 
85
85
  it "calls log and gets message with custom params" do
86
- Scribbler::Base.send(:build_with_template,
87
- :template => true,
88
- :object => some_object,
89
- :custom_fields => {:test1 => 1, :test2 => 2},
90
- :message => <<-MSG
86
+ subject.send(:build_with_template,
87
+ :template => true,
88
+ :object => some_object,
89
+ :custom_fields => {:test1 => 1, :test2 => 2},
90
+ :message => <<-MSG
91
91
  test
92
92
  123
93
93
  MSG
@@ -122,12 +122,10 @@ module Scribbler
122
122
 
123
123
  it "should build a template and try to put it in a file" do
124
124
  options = { :message => "..." }
125
- subject.should_receive(:send).with "test_log_log_location"
125
+ file = mock(:puts => true)
126
126
  subject.should_receive(:build_with_template).with options
127
- file_stub = stub
128
- file_stub.should_receive :puts
129
- file_stub.should_receive :close
130
- File.should_receive(:open) { file_stub }
127
+ subject.should_receive(:send).with "test_log_log_location"
128
+ File.should_receive(:open).and_yield(file)
131
129
  subject.apply_to_log :test_log, options
132
130
  end
133
131
  end
@@ -137,7 +135,7 @@ module Scribbler
137
135
  # in case we have bad config data lingering
138
136
  subject.stub(:respond_to?).with('test_log_log_location').and_return false
139
137
  subject.should_not_receive(:test_log_log_location)
140
- subject.find_file_at(:test_log).should == 'test_log'
138
+ subject.find_file_at(:test_log).should == "#{Dir.pwd}/log/test_log"
141
139
  end
142
140
 
143
141
  it "finds a file method defined" do
@@ -31,10 +31,9 @@ module Scribbler
31
31
  end
32
32
 
33
33
  it "falls back to pwd/log without rails" do
34
- dir = "dir/"
34
+ subject.log_directory = nil #RESET
35
35
  Rails.should_receive(:root).and_raise(NameError)
36
- Dir.should_receive(:pwd).and_return('dir')
37
- subject.log_directory.should == 'dir/log'
36
+ subject.log_directory.should == "#{Dir.pwd}/log"
38
37
  end
39
38
 
40
39
  it "sets the log directory" do
@@ -18,9 +18,7 @@ RSpec.configure do |config|
18
18
  config.filter_run :focus
19
19
  config.color = true
20
20
  config.after(:all) do # Force a reset of some Classes
21
- project_dir = ENV['BUNDLE_GEMFILE'].split('/')
22
- project_dir.delete_at(-1)
23
- project_dir = project_dir.join('/')
21
+ project_dir = File.expand_path('../..', __FILE__)
24
22
  singletons.each do |s|
25
23
  Scribbler.send(:remove_const, s)
26
24
  load "#{project_dir}/lib/scribbler/#{s.downcase}.rb"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scribbler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-21 00:00:00.000000000 Z
12
+ date: 2012-07-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -104,7 +104,7 @@ files:
104
104
  - .travis.yml
105
105
  - Gemfile
106
106
  - Gemfile.lock
107
- - README.markdown
107
+ - README.md
108
108
  - Rakefile
109
109
  - bin/scribbler
110
110
  - lib/scribbler.rb
@@ -140,7 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
140
140
  version: '0'
141
141
  segments:
142
142
  - 0
143
- hash: -4412993880917242240
143
+ hash: 1839906776393005062
144
144
  required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  none: false
146
146
  requirements:
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
149
  version: '0'
150
150
  segments:
151
151
  - 0
152
- hash: -4412993880917242240
152
+ hash: 1839906776393005062
153
153
  requirements: []
154
154
  rubyforge_project:
155
155
  rubygems_version: 1.8.24