scribbler 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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