highlogger 0.0.1

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.
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 0.0.1 2007-10-15
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/License.txt ADDED
@@ -0,0 +1,4 @@
1
+ Originally copyright (c) 2007 Noah Gibbs
2
+
3
+ This code may be used for any purpose. It is released into the public
4
+ domain by its author in 2007.
data/Manifest.txt ADDED
@@ -0,0 +1,24 @@
1
+ History.txt
2
+ License.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ config/hoe.rb
7
+ config/requirements.rb
8
+ lib/highlogger.rb
9
+ lib/highlogger/version.rb
10
+ log/debug.log
11
+ script/destroy
12
+ script/generate
13
+ script/txt2html
14
+ setup.rb
15
+ tasks/deployment.rake
16
+ tasks/environment.rake
17
+ tasks/website.rake
18
+ test/test_helper.rb
19
+ test/test_highlogger.rb
20
+ website/index.html
21
+ website/index.txt
22
+ website/javascripts/rounded_corners_lite.inc.js
23
+ website/stylesheets/screen.css
24
+ website/template.rhtml
data/README.txt ADDED
@@ -0,0 +1,20 @@
1
+ HighLogger
2
+
3
+ This is a simple heirarchical component-based logging system based on
4
+ Ruby's standard "Logger". Component-based means that you call the
5
+ logging function with a component such as a filename in addition to the
6
+ severity. This allows HighLogger to be configured from a file to
7
+ filter each component by severity. Thus, you could filter output from
8
+ one file to only errors and up, while another file that you just added
9
+ will log every message of every severity. This is useful for debugging
10
+ larger projects, and adding new components to projects of any size.
11
+
12
+ HighLogger is heirarchical because if a component has one or more
13
+ colons in the name, they are treated as separators. For instance, the
14
+ component name "Math:DiffEQ:Integrator:Cash-Karp" has four levels. If
15
+ a severity setting isn't given for the full name, each sub-name will
16
+ be checked in turn. For the above example, "Math:DiffEQ:Integrator"
17
+ would be checked next, then "Math:DiffEQ", then "Math". So if there
18
+ were no setting for the first three of those but "Math" was set to log
19
+ fatal errors only, then log messages directed to component
20
+ "Math:DiffEQ:Integrator:Cash-Karp" would be recorded only if fatal.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require 'config/requirements'
2
+ require 'config/hoe' # setup Hoe + all gem configuration
3
+
4
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
data/config/hoe.rb ADDED
@@ -0,0 +1,70 @@
1
+ require 'highlogger/version'
2
+
3
+ AUTHOR = 'Noah Gibbs'
4
+ EMAIL = "angelbob@nospam.users.sourceforge.net"
5
+ DESCRIPTION = "A heirarchical component-based logging system"
6
+ GEM_NAME = 'highlogger'
7
+ RUBYFORGE_PROJECT = 'ab-ext'
8
+ HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
9
+ DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
+
11
+ @config_file = "~/.rubyforge/user-config.yml"
12
+ @config = nil
13
+ RUBYFORGE_USERNAME = "unknown"
14
+ def rubyforge_username
15
+ unless @config
16
+ begin
17
+ @config = YAML.load(File.read(File.expand_path(@config_file)))
18
+ rescue
19
+ puts <<-EOS
20
+ ERROR: No rubyforge config file found: #{@config_file}
21
+ Run 'rubyforge setup' to prepare your env for access to Rubyforge
22
+ - See http://newgem.rubyforge.org/rubyforge.html for more details
23
+ EOS
24
+ exit
25
+ end
26
+ end
27
+ RUBYFORGE_USERNAME.replace @config["username"]
28
+ end
29
+
30
+
31
+ REV = nil
32
+ # UNCOMMENT IF REQUIRED:
33
+ # REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
34
+ VERS = Highlogger::VERSION::STRING + (REV ? ".#{REV}" : "")
35
+ RDOC_OPTS = ['--quiet', '--title', 'highlogger documentation',
36
+ "--opname", "index.html",
37
+ "--line-numbers",
38
+ "--main", "README",
39
+ "--inline-source"]
40
+
41
+ class Hoe
42
+ def extra_deps
43
+ @extra_deps.reject! { |x| Array(x).first == 'hoe' }
44
+ @extra_deps
45
+ end
46
+ end
47
+
48
+ # Generate all the Rake tasks
49
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
50
+ hoe = Hoe.new(GEM_NAME, VERS) do |p|
51
+ p.author = AUTHOR
52
+ p.description = DESCRIPTION
53
+ p.email = EMAIL
54
+ p.summary = DESCRIPTION
55
+ p.url = HOMEPATH
56
+ p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
57
+ p.test_globs = ["test/**/test_*.rb"]
58
+ p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
59
+
60
+ # == Optional
61
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\\n\\n")
62
+ #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
63
+
64
+ #p.spec_extras = {} # A hash of extra values to set in the gemspec.
65
+
66
+ end
67
+
68
+ CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
69
+ PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
70
+ hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
@@ -0,0 +1,17 @@
1
+ require 'fileutils'
2
+ include FileUtils
3
+
4
+ require 'rubygems'
5
+ %w[rake hoe newgem rubigen].each do |req_gem|
6
+ begin
7
+ require req_gem
8
+ rescue LoadError
9
+ puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
+ puts "Installation: gem install #{req_gem} -y"
11
+ exit
12
+ end
13
+ end
14
+
15
+ $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
16
+
17
+ require 'highlogger'
@@ -0,0 +1,9 @@
1
+ module Highlogger #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 0
5
+ TINY = 1
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
data/lib/highlogger.rb ADDED
@@ -0,0 +1,171 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ require "logger"
4
+
5
+ module LogSource
6
+ @logger = nil
7
+
8
+ def set_logger(logger_obj)
9
+ @logger = logger_obj
10
+ end
11
+
12
+ def log(severity, *strings, &block)
13
+ caller_str = caller()[0]
14
+ matchobj = /([^\/]+)\.rb/.match(caller_str)
15
+ raise "Call set_logger before logging!" if(not @logger)
16
+ @logger.add(matchobj[1], severity, *strings, &block)
17
+ end
18
+ end # module LogSource
19
+
20
+ # This class implements a simple heirarchical logging system.
21
+ #
22
+ class HighLogger < Logger
23
+ def initialize(*super_args)
24
+ super(*super_args)
25
+ @logmap = {}
26
+ @default_level = Logger::WARN
27
+ end
28
+
29
+ def add(component, severity, message = nil, progname = nil, &block)
30
+ return if severity == :none
31
+
32
+ level = level_for_component(component)
33
+ return if level and severity < level
34
+
35
+ # Logic copied from Logger class
36
+ if message.nil?
37
+ if block_given?
38
+ message = yield
39
+ else
40
+ message = progname
41
+ progname = @progname
42
+ end
43
+ end
44
+
45
+ super(severity, component + ": " + message, progname, &block);
46
+ end
47
+
48
+ alias log add
49
+
50
+ def debug?(*args)
51
+ return super() if args.empty?
52
+ @logmap[args[0]] <= Logger::DEBUG
53
+ end
54
+
55
+ def info?(*args)
56
+ return super() if args.empty?
57
+ @logmap[args[0]] <= Logger::INFO
58
+ end
59
+
60
+ def warn?(*args)
61
+ return super() if args.empty?
62
+ @logmap[args[0]] <= Logger::WARN
63
+ end
64
+
65
+ def error?(*args)
66
+ return super() if args.empty?
67
+ @logmap[args[0]] <= Logger::ERROR
68
+ end
69
+
70
+ def fatal?(*args)
71
+ return super() if args.empty?
72
+ @logmap[args[0]] <= Logger::FATAL
73
+ end
74
+
75
+ def debug(component, progname = nil, &block)
76
+ add(component, Logger::DEBUG, nil, progname, &block)
77
+ end
78
+
79
+ def info(component, progname = nil, &block)
80
+ add(component, Logger::INFO, nil, progname, &block)
81
+ end
82
+
83
+ def warn(component, progname = nil, &block)
84
+ add(component, Logger::WARN, nil, progname, &block)
85
+ end
86
+
87
+ def error(component, progname = nil, &block)
88
+ add(component, Logger::ERROR, nil, progname, &block)
89
+ end
90
+
91
+ def fatal(component, progname = nil, &block)
92
+ add(component, Logger::FATAL, nil, progname, &block)
93
+ end
94
+
95
+ def unknown(component, progname = nil, &block)
96
+ add(component, Logger::UNKNOWN, nil, progname, &block)
97
+ end
98
+
99
+
100
+ # Have this logger read a configuration file to determine
101
+ # what components will log at what levels.
102
+ #
103
+ def read_config_file(filename)
104
+ f = File.new(filename)
105
+ buf = f.read()
106
+ read_config_buffer(buf)
107
+ end
108
+
109
+ # Have this logger read a configuration buffer to determine
110
+ # what components will log at what levels.
111
+ #
112
+ def read_config_buffer(buf)
113
+ buf.each_line do |line|
114
+ mobj = /^\s*([A-Za-z0-9_:]+)\s*=\s*(.*?)\s*$/.match(line)
115
+ raise "Can't parse config line '#{line}'!" unless mobj
116
+
117
+ loglevel = parse_loglevel(mobj[2])
118
+ if mobj[1] =~ /default/i
119
+ @default_level = loglevel
120
+ parent.level = loglevel
121
+ next
122
+ end
123
+
124
+ @logmap[mobj[1]] = loglevel
125
+ end
126
+ end
127
+
128
+ private
129
+
130
+ def parse_loglevel(string)
131
+ if string =~ /debug/i
132
+ return Logger::DEBUG
133
+ end
134
+ if string =~ /info/i
135
+ return Logger::INFO
136
+ end
137
+ if string =~ /warn/i or string =~ /warning/i
138
+ return Logger::WARN
139
+ end
140
+ if string =~ /err/i or string =~ /error/i
141
+ return Logger::ERROR
142
+ end
143
+ if string =~ /fatal/i
144
+ return Logger::FATAL
145
+ end
146
+ if string =~ /all/i or string =~ /any/i
147
+ return Logger::DEBUG
148
+ end
149
+ if string =~ /unknown/i
150
+ return Logger::UNKNOWN
151
+ end
152
+ if string =~ /none/i
153
+ return :none
154
+ end
155
+ raise "Can't parse logging level from '#{string}'!"
156
+ end
157
+
158
+ def level_for_component(component)
159
+ return @logmap[component] if @logmap[component]
160
+
161
+ complist = component.split(/:/)
162
+ begin
163
+ complist = complist[0..-2]
164
+ this_comp = complist.join(":")
165
+ return @logmap[this_comp] if @logmap[this_comp]
166
+ end while not complist.empty?
167
+
168
+ @default_level
169
+ end
170
+
171
+ end # class HighLogger
data/log/debug.log ADDED
File without changes
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.join(File.dirname(__FILE__), '..')
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.join(File.dirname(__FILE__), '..')
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
data/script/txt2html ADDED
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ begin
5
+ require 'newgem'
6
+ rescue LoadError
7
+ puts "\n\nGenerating the website requires the newgem RubyGem"
8
+ puts "Install: gem install newgem\n\n"
9
+ exit(1)
10
+ end
11
+ require 'redcloth'
12
+ require 'syntax/convertors/html'
13
+ require 'erb'
14
+ require File.dirname(__FILE__) + '/../lib/highlogger/version.rb'
15
+
16
+ version = Highlogger::VERSION::STRING
17
+ download = 'http://rubyforge.org/projects/highlogger'
18
+
19
+ class Fixnum
20
+ def ordinal
21
+ # teens
22
+ return 'th' if (10..19).include?(self % 100)
23
+ # others
24
+ case self % 10
25
+ when 1: return 'st'
26
+ when 2: return 'nd'
27
+ when 3: return 'rd'
28
+ else return 'th'
29
+ end
30
+ end
31
+ end
32
+
33
+ class Time
34
+ def pretty
35
+ return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
36
+ end
37
+ end
38
+
39
+ def convert_syntax(syntax, source)
40
+ return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
41
+ end
42
+
43
+ if ARGV.length >= 1
44
+ src, template = ARGV
45
+ template ||= File.join(File.dirname(__FILE__), '/../website/template.rhtml')
46
+
47
+ else
48
+ puts("Usage: #{File.split($0).last} source.txt [template.rhtml] > output.html")
49
+ exit!
50
+ end
51
+
52
+ template = ERB.new(File.open(template).read)
53
+
54
+ title = nil
55
+ body = nil
56
+ File.open(src) do |fsrc|
57
+ title_text = fsrc.readline
58
+ body_text = fsrc.read
59
+ syntax_items = []
60
+ body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
61
+ ident = syntax_items.length
62
+ element, syntax, source = $1, $2, $3
63
+ syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
64
+ "syntax-temp-#{ident}"
65
+ }
66
+ title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
67
+ body = RedCloth.new(body_text).to_html
68
+ body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
69
+ end
70
+ stat = File.stat(src)
71
+ created = stat.ctime
72
+ modified = stat.mtime
73
+
74
+ $stdout << template.result(binding)