shog 0.0.1pre → 0.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c2911552953a643413c7b06c35bf76a64407365
4
- data.tar.gz: 1473e2dfc15bc9c0895f60296408715a9125d217
3
+ metadata.gz: e02b8810b0926489472a9c3ae7172681c903d247
4
+ data.tar.gz: 82e7c9c7d3fbc7ea093b79f3afd0c638c9bab046
5
5
  SHA512:
6
- metadata.gz: 53dd0a9a5398dfa7e027a805d1d2ec8a645b13fb54c563cd3de121d271148725626455de4c2502245c7342fab1b6b23cf3934feafdf1d8bfdc6dc16847eca49e
7
- data.tar.gz: 50a4677ac5ce8bab418930c97a327e52cadcfeff035140b3c9486ccfc641a6c37fb7369a93fccba9060cd44118f672d9d1d8c8384b71e5b02340f6afd274a092
6
+ metadata.gz: 3a851ea89f9357838dd1d6b2f31108757b1b846cdcfec47004887a08cf825c4afd086217251c49e403f2589f1697b15d5d1094043e715ba821c2e70258bf25c1
7
+ data.tar.gz: 515b080f51d3f66fa3d49f48c1a9e6fbc26916c46e27261195c38eb3aa244a384981b229ef3584e8f45314a198be31842cd0a4907b55f35c2f291fae4fe384e6
data/lib/shog.rb CHANGED
@@ -1,5 +1,11 @@
1
1
  require 'shog/version'
2
+ require 'shog/formatter'
3
+ require 'shog/formatters'
4
+ require 'shog/rails'
2
5
  require 'pry'
3
6
 
4
7
  module Shog
8
+ def self.configure(&block)
9
+ ::Rails.logger.formatter.configure &block
10
+ end
5
11
  end
@@ -0,0 +1,149 @@
1
+ require 'active_support/tagged_logging'
2
+ require 'colored'
3
+
4
+ module Shog
5
+ class Formatter < ::ActiveSupport::Logger::SimpleFormatter
6
+
7
+ include ActiveSupport::TaggedLogging::Formatter
8
+
9
+ def call( severity, time, progname, msg )
10
+ return if msg.blank?
11
+ tagged formatted_severity_tag( severity ) do
12
+ msg = formatted_message( severity, msg )
13
+ msg = timestamped_message( time, msg )
14
+ msg = prognamed_message( progname, msg )
15
+
16
+ super severity, time, progname, msg
17
+ end
18
+ end
19
+
20
+ def initialize
21
+ reset_config!
22
+ end
23
+
24
+ # Formats the message according to the configured settings.
25
+ # @param [String] msg to format.
26
+ def formatted_message( severity, msg )
27
+ msg = String === msg ? msg : msg.inspect
28
+
29
+ if args = matched( msg )
30
+ args.first.call msg, args.last
31
+ elsif proc = configuration[:severities][severity]
32
+ proc.call msg
33
+ else
34
+ msg
35
+ end
36
+ end
37
+
38
+ # Formats the severity indicator prefixed before each line when writing to
39
+ # the log.
40
+ # @param [String] the severity of the message (ex DEBUG, WARN, etc.)
41
+ # @return [String] formatted version of the severity
42
+ def formatted_severity_tag( severity )
43
+ length = configuration[:severity_tags][:_length] ||= begin
44
+ configuration[:severity_tags].reduce(0){ |l,(k,_)| [k.length,l].max }
45
+ end
46
+
47
+ padded_severity = severity.ljust length
48
+
49
+ if proc = configuration[:severity_tags][severity]
50
+ proc.call padded_severity
51
+ else
52
+ padded_severity
53
+ end
54
+ end
55
+
56
+ # Formats a ms time value.
57
+ def format_time( time, expected = 30 )
58
+ timef = time.to_f
59
+ case
60
+ when timef > expected * 2 then time.to_s.red
61
+ when timef > expected then time.to_s.yellow
62
+ else time
63
+ end
64
+ end
65
+
66
+
67
+ # ==========================================================================
68
+ # @!group Configuration
69
+
70
+ # Configure messages formatting for this formatter.
71
+ def configure( &block )
72
+ instance_eval( &block )
73
+ self
74
+ end
75
+
76
+ # Format the severity tagged before each line.
77
+ def severity_tag( level, &block )
78
+ configuration[:severity_tags][ level.to_s.upcase ] = block
79
+ end
80
+
81
+ # Provide customized formatting for messages of the given severity when they
82
+ # a custom matcher cannot be found.
83
+ # @param [String,Symbol] level to format.
84
+ def severity( level, &block )
85
+ configuration[:severities][ level.to_s.upcase ] = block
86
+ end
87
+
88
+ # Resets any previously configured formatting settings.
89
+ def reset_config!
90
+ @configuration ||= {
91
+ severity_tags: {},
92
+ severities: {},
93
+ matchers: {}
94
+ }
95
+ self
96
+ end
97
+
98
+ # When a log message matches the given pattern, provide a custom format
99
+ # for it.
100
+ def match( pattern, &block )
101
+ configuration[:matchers][pattern] = block
102
+ end
103
+
104
+ # Adds the named matchers to the log
105
+ def formatter( mod )
106
+ unless mod.is_a? Module
107
+ mod = "Shog::Formatters::#{mod.to_s.camelize}".constantize
108
+ end
109
+
110
+ mod.configure self
111
+ end
112
+
113
+ # Include timestamp in logged messages.
114
+ def timestamp( enabled = true )
115
+ configuration[:timestamp] = enabled
116
+ end
117
+
118
+ # Include the progname in logged messages.
119
+ def progname( enabled = true )
120
+ configuration[:progname] = enabled
121
+ end
122
+
123
+ # @!endgroup
124
+
125
+ private
126
+
127
+ attr_accessor :configuration
128
+
129
+ def matched( msg )
130
+ if matched = configuration[:matchers].find do |pattern,_|
131
+ pattern === msg
132
+ end
133
+ [matched.last, Regexp.last_match]
134
+ end
135
+ end
136
+
137
+ def timestamped_message( time, msg )
138
+ return msg unless configuration[:timestamp]
139
+
140
+ "[#{time}] #{msg}"
141
+ end
142
+
143
+ def prognamed_message( progname, msg )
144
+ return msg unless configuration[:progname]
145
+
146
+ "[#{progname}] #{msg}"
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,2 @@
1
+ require 'shog/formatters/defaults'
2
+ require 'shog/formatters/requests'
@@ -0,0 +1,20 @@
1
+ module Shog
2
+ module Formatters
3
+ # Default formatting options
4
+ module Defaults
5
+ module_function
6
+
7
+ def configure( formatter )
8
+ formatter.configure do
9
+ severity_tag( :debug ) { |msg| msg.black.bold }
10
+ severity_tag( :warn ) { |msg| msg.yellow }
11
+ severity_tag( :error ) { |msg| msg.red }
12
+ severity_tag( :fatal ) { |msg| msg.white_on_red }
13
+
14
+ severity( :error ){ |msg| msg.red }
15
+ severity( :fatal ){ |msg| msg.red }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,48 @@
1
+ module Shog
2
+ module Formatters
3
+ # Format log messages from the request processing such as controller endpoints and views.
4
+ module Requests
5
+ module_function
6
+
7
+ def configure( formatter )
8
+ formatter.configure do
9
+ match /Started\s+(?<method>PUT|PATCH|GET|POST|DELETE)\s+(?<path>"[^"]*")[^\d\.]+(?<ip>[\d\.]+)(?<time>.*)/ do |msg,match|
10
+ # http://refiddle.com/ge6
11
+ "#{match["method"].ljust 6} ".green.bold + " #{match["path"]} ".white.bold + " for " + "#{match["ip"]}".yellow + " #{match["time"]}".black.bold
12
+ end
13
+
14
+ match /\s*Rendered\s+(?<view>[^\s]+)\swithin\s(?<layout>[^\s]+)\s\((?<time>.*)\)/ do |msg,match|
15
+ # http://refiddle.com/18qr
16
+ " Rendered " + match["view"].white.bold + " within " + match["layout"].white + " " + format_time( match['time'] )
17
+ end
18
+
19
+ match /\s*Completed\s(?<code>\d+)\s(?<friendly>.*)\sin\s(?<time>\d+[^\s]*)\s(?<details>.*)/ do |msg,match|
20
+ # http://refiddle.com/18qq
21
+ parts = [ "Completed" ]
22
+ parts << case match['code'].to_i
23
+ when 200..399 then match['code'].green
24
+ when 400..499 then match['code'].yellow
25
+ else match['code'].red
26
+ end
27
+ parts << match['friendly'].yellow
28
+ parts << 'in'
29
+ parts << format_time( match['time'], 250 )
30
+ parts << match['details']
31
+
32
+ parts.join(" ")
33
+ end
34
+
35
+ match /Processing by (?<controller>[^\s]*) as (?<format>.*)/ do |msg,match|
36
+ # http://refiddle.com/18qs
37
+ "Processing by #{match['controller'].magenta.bold} as #{match['format'].yellow}"
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+
44
+
45
+
46
+ end
47
+ end
48
+ end
data/lib/shog/rails.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'rails'
2
+
3
+ module Shog
4
+ module Rails
5
+ class Railtie < ::Rails::Railtie
6
+ config.before_initialize do
7
+ ::Rails.logger.formatter = Shog::Formatter.new.configure do
8
+ formatter :defaults
9
+ formatter :requests
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
data/lib/shog/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Shog
2
- VERSION_NUMBER = "0.0.1"
3
- VERSION_SUFFIX = "pre"
2
+ VERSION_NUMBER = "0.0.2"
3
+ VERSION_SUFFIX = ""
4
4
  VERSION = "#{VERSION_NUMBER}#{VERSION_SUFFIX}"
5
5
  end
data/shog.gemspec CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_dependency 'rails', '~> 4.0'
22
+ spec.add_dependency 'colored', '~> 1.2'
22
23
  spec.required_ruby_version = '>= 1.9.2'
23
24
 
24
25
  spec.add_development_dependency "bundler", "~> 1.6"
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ module Shog::Formatters::Spec
4
+ module_function
5
+ def configure( formatter )
6
+ formatter.configure do
7
+ severity :test, ->{}
8
+ end
9
+ end
10
+ end
11
+
12
+ describe Shog::Formatter do
13
+ let(:formatter){ Shog::Formatter.new }
14
+
15
+ describe "#formatted_severity_tag" do
16
+ it "buffers to the same size" do
17
+ formatter.severity_tag( :warn ){ |msg| msg }
18
+ formatter.severity_tag( :longer ){ |msg| msg }
19
+
20
+ expect( formatter.formatted_severity_tag( "WARN" ) ).to eq "WARN "
21
+ expect( formatter.formatted_severity_tag( "LONGER" ) ).to eq "LONGER"
22
+ end
23
+ end
24
+
25
+ describe "#match" do
26
+ it "formats a matched line" do
27
+ formatter.match /GET/ do |msg,match|
28
+ "R'DONE"
29
+ end
30
+
31
+ result = formatter.call "INFO", Time.now, nil, "Started GET \"/Home\""
32
+ expect( result ).to eq "[INFO] R'DONE\n"
33
+ end
34
+
35
+ it "includes the match" do
36
+ formatter.match /GET/ do |msg,match|
37
+ expect( match ).to be_present
38
+ end
39
+
40
+ formatter.call "INFO", Time.now, nil, "Started GET \"/Home\""
41
+ end
42
+
43
+ it "doesn't match" do
44
+ result = formatter.call "INFO", Time.now, nil, "Started GET \"/Home\""
45
+ expect( result ).to eq "[INFO] Started GET \"/Home\"\n"
46
+ end
47
+
48
+ it "uses default severity when no matcher is found" do
49
+ formatter.severity( :info ){ |msg| "DEFAULT" }
50
+
51
+ result = formatter.call "INFO", Time.now, nil, "Started GET \"/Home\""
52
+ expect( result ).to eq "[INFO] DEFAULT\n"
53
+ end
54
+ end
55
+
56
+ describe "#formatters" do
57
+ it "loads from a symbol" do
58
+ formatter.should_receive(:severity).with(:test, anything())
59
+
60
+ formatter.configure do
61
+ formatter :spec
62
+ end
63
+ end
64
+ end
65
+
66
+
67
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1pre
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Alexander
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: colored
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -87,8 +101,14 @@ files:
87
101
  - README.md
88
102
  - Rakefile
89
103
  - lib/shog.rb
104
+ - lib/shog/formatter.rb
105
+ - lib/shog/formatters.rb
106
+ - lib/shog/formatters/defaults.rb
107
+ - lib/shog/formatters/requests.rb
108
+ - lib/shog/rails.rb
90
109
  - lib/shog/version.rb
91
110
  - shog.gemspec
111
+ - spec/lib/shog/formatter_spec.rb
92
112
  - spec/spec_helper.rb
93
113
  homepage: https://github.com/phallguy/shog
94
114
  licenses:
@@ -105,9 +125,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
125
  version: 1.9.2
106
126
  required_rubygems_version: !ruby/object:Gem::Requirement
107
127
  requirements:
108
- - - ">"
128
+ - - ">="
109
129
  - !ruby/object:Gem::Version
110
- version: 1.3.1
130
+ version: '0'
111
131
  requirements: []
112
132
  rubyforge_project:
113
133
  rubygems_version: 2.3.0
@@ -115,5 +135,6 @@ signing_key:
115
135
  specification_version: 4
116
136
  summary: Make rails 4.0 log details more colorful
117
137
  test_files:
138
+ - spec/lib/shog/formatter_spec.rb
118
139
  - spec/spec_helper.rb
119
140
  has_rdoc: