logging 0.9.4 → 0.9.5

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.
@@ -72,9 +72,6 @@ class Layout
72
72
  #
73
73
  def footer( ) '' end
74
74
 
75
-
76
- protected
77
-
78
75
  # call-seq:
79
76
  # format_obj( obj )
80
77
  #
@@ -56,6 +56,10 @@ module Layouts
56
56
  # construction of the Layout until creation of the log event.
57
57
  # [t] Used to output the object ID of the thread that generated the
58
58
  # log event.
59
+ # [T] Used to output the name of the thread that generated the log event.
60
+ # Name can be specified using Thread.current[:name] notation. Output empty
61
+ # string if name not specified. This options helps to create more human
62
+ # readable output for multithread application log.
59
63
  # [%] The sequence '%%' outputs a single percent sign.
60
64
  #
61
65
  # The directives F, L, and M will only work if the Logger generating the
@@ -125,6 +129,7 @@ module Layouts
125
129
  'p' => 'Process.pid',
126
130
  'r' => 'Integer((Time.now-@created_at)*1000).to_s',
127
131
  't' => 'Thread.current.object_id.to_s',
132
+ 'T' => 'Thread.current[:name]',
128
133
  '%' => :placeholder
129
134
  }
130
135
 
@@ -449,8 +449,8 @@ module Logging
449
449
  str << spacer
450
450
  str << '.' * (base - str.length)
451
451
  end
452
- io.print(str.ljust(base))
453
- io.print(spacer)
452
+ io.write(str.ljust(base))
453
+ io.write(spacer)
454
454
 
455
455
  level_str = @level.nil? ? '' : '*'
456
456
  level_str << if level < ::Logging::LEVELS.length
@@ -460,24 +460,24 @@ module Logging
460
460
  end
461
461
  level_len = ::Logging::MAX_LEVEL_LENGTH + 1
462
462
 
463
- io.print("%#{level_len}s" % level_str)
464
- io.print(spacer)
463
+ io.write("%#{level_len}s" % level_str)
464
+ io.write(spacer)
465
465
 
466
466
  if self.respond_to?(:additive)
467
- io.print(additive ? '+A' : '-A')
467
+ io.write(additive ? '+A' : '-A')
468
468
  else
469
- io.print(' ')
469
+ io.write(' ')
470
470
  end
471
471
 
472
- io.print(spacer)
473
- io.print(trace ? '+T' : '-T')
474
- io.print("\n")
472
+ io.write(spacer)
473
+ io.write(trace ? '+T' : '-T')
474
+ io.write("\n")
475
475
 
476
476
  @appenders.each do |appender|
477
- io.print(indent_str)
478
- io.print('- ')
479
- io.print(appender.inspect)
480
- io.print("\n")
477
+ io.write(indent_str)
478
+ io.write('- ')
479
+ io.write(appender.inspect)
480
+ io.write("\n")
481
481
  end
482
482
 
483
483
  return io
data/logging.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{logging}
5
+ s.version = "0.9.5"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Tim Pease"]
9
+ s.date = %q{2009-01-25}
10
+ s.description = %q{Logging is a flexible logging library for use in Ruby programs based on the design of Java's log4j library. It features a hierarchical logging system, custom level names, multiple output destinations per log event, custom formatting, and more.}
11
+ s.email = %q{tim.pease@gmail.com}
12
+ s.extra_rdoc_files = ["History.txt", "README.rdoc"]
13
+ s.files = ["History.txt", "README.rdoc", "Rakefile", "data/bad_logging_1.rb", "data/bad_logging_2.rb", "data/logging.rb", "data/logging.yaml", "data/simple_logging.rb", "lib/logging.rb", "lib/logging/appender.rb", "lib/logging/appenders/buffering.rb", "lib/logging/appenders/console.rb", "lib/logging/appenders/email.rb", "lib/logging/appenders/file.rb", "lib/logging/appenders/growl.rb", "lib/logging/appenders/io.rb", "lib/logging/appenders/rolling_file.rb", "lib/logging/appenders/syslog.rb", "lib/logging/config/configurator.rb", "lib/logging/config/yaml_configurator.rb", "lib/logging/layout.rb", "lib/logging/layouts/basic.rb", "lib/logging/layouts/pattern.rb", "lib/logging/log_event.rb", "lib/logging/logger.rb", "lib/logging/repository.rb", "lib/logging/root_logger.rb", "lib/logging/stats.rb", "lib/logging/utils.rb", "test/appenders/test_buffered_io.rb", "test/appenders/test_console.rb", "test/appenders/test_email.rb", "test/appenders/test_file.rb", "test/appenders/test_growl.rb", "test/appenders/test_io.rb", "test/appenders/test_rolling_file.rb", "test/appenders/test_syslog.rb", "test/benchmark.rb", "test/config/test_configurator.rb", "test/config/test_yaml_configurator.rb", "test/layouts/test_basic.rb", "test/layouts/test_pattern.rb", "test/setup.rb", "test/test_appender.rb", "test/test_layout.rb", "test/test_log_event.rb", "test/test_logger.rb", "test/test_logging.rb", "test/test_repository.rb", "test/test_root_logger.rb", "test/test_stats.rb", "test/test_utils.rb"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://logging.rubyforge.org/}
16
+ s.rdoc_options = ["--main", "README.rdoc"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{logging}
19
+ s.rubygems_version = %q{1.3.1}
20
+ s.summary = %q{A flexible and extendable logging library for Ruby}
21
+ s.test_files = ["test/appenders/test_buffered_io.rb", "test/appenders/test_console.rb", "test/appenders/test_email.rb", "test/appenders/test_file.rb", "test/appenders/test_growl.rb", "test/appenders/test_io.rb", "test/appenders/test_rolling_file.rb", "test/appenders/test_syslog.rb", "test/config/test_configurator.rb", "test/config/test_yaml_configurator.rb", "test/layouts/test_basic.rb", "test/layouts/test_pattern.rb", "test/test_appender.rb", "test/test_layout.rb", "test/test_log_event.rb", "test/test_logger.rb", "test/test_logging.rb", "test/test_repository.rb", "test/test_root_logger.rb", "test/test_stats.rb", "test/test_utils.rb"]
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 2
26
+
27
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
+ s.add_runtime_dependency(%q<flexmock>, [">= 0.8.2"])
29
+ s.add_runtime_dependency(%q<lockfile>, [">= 1.4.3"])
30
+ s.add_development_dependency(%q<bones>, [">= 2.3.0"])
31
+ else
32
+ s.add_dependency(%q<flexmock>, [">= 0.8.2"])
33
+ s.add_dependency(%q<lockfile>, [">= 1.4.3"])
34
+ s.add_dependency(%q<bones>, [">= 2.3.0"])
35
+ end
36
+ else
37
+ s.add_dependency(%q<flexmock>, [">= 0.8.2"])
38
+ s.add_dependency(%q<lockfile>, [">= 1.4.3"])
39
+ s.add_dependency(%q<bones>, [">= 2.3.0"])
40
+ end
41
+ end
data/tasks/ann.rake CHANGED
@@ -42,7 +42,7 @@ namespace :ann do
42
42
  desc "Send an email announcement"
43
43
  task :email => ['ann:prereqs', PROJ.ann.file] do
44
44
  ann = PROJ.ann
45
- from = ann.email[:from] || PROJ.email
45
+ from = ann.email[:from] || Array(PROJ.authors).first || PROJ.email
46
46
  to = Array(ann.email[:to])
47
47
 
48
48
  ### build a mail header for RFC 822
data/tasks/gem.rake CHANGED
@@ -1,5 +1,94 @@
1
1
 
2
- require 'rake/gempackagetask'
2
+ require 'find'
3
+ require 'rake/packagetask'
4
+ require 'rubygems/user_interaction'
5
+ require 'rubygems/builder'
6
+
7
+ module Bones
8
+ class GemPackageTask < Rake::PackageTask
9
+ # Ruby GEM spec containing the metadata for this package. The
10
+ # name, version and package_files are automatically determined
11
+ # from the GEM spec and don't need to be explicitly provided.
12
+ #
13
+ attr_accessor :gem_spec
14
+
15
+ # Tasks from the Bones gem directory
16
+ attr_reader :bones_files
17
+
18
+ # Create a GEM Package task library. Automatically define the gem
19
+ # if a block is given. If no block is supplied, then +define+
20
+ # needs to be called to define the task.
21
+ #
22
+ def initialize(gem_spec)
23
+ init(gem_spec)
24
+ yield self if block_given?
25
+ define if block_given?
26
+ end
27
+
28
+ # Initialization tasks without the "yield self" or define
29
+ # operations.
30
+ #
31
+ def init(gem)
32
+ super(gem.name, gem.version)
33
+ @gem_spec = gem
34
+ @package_files += gem_spec.files if gem_spec.files
35
+ @bones_files = []
36
+
37
+ local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
38
+ if !test(?e, local_setup)
39
+ Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
40
+ end
41
+ end
42
+
43
+ # Create the Rake tasks and actions specified by this
44
+ # GemPackageTask. (+define+ is automatically called if a block is
45
+ # given to +new+).
46
+ #
47
+ def define
48
+ super
49
+ task :prereqs
50
+ task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
51
+ file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
52
+ when_writing("Creating GEM") {
53
+ chdir(package_dir_path) do
54
+ Gem::Builder.new(gem_spec).build
55
+ verbose(true) {
56
+ mv gem_file, "../#{gem_file}"
57
+ }
58
+ end
59
+ }
60
+ end
61
+
62
+ file package_dir_path => bones_files do
63
+ mkdir_p package_dir rescue nil
64
+
65
+ gem_spec.files = (gem_spec.files +
66
+ bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
67
+
68
+ bones_files.each do |fn|
69
+ base_fn = File.join('tasks', File.basename(fn))
70
+ f = File.join(package_dir_path, base_fn)
71
+ fdir = File.dirname(f)
72
+ mkdir_p(fdir) if !File.exist?(fdir)
73
+ if File.directory?(fn)
74
+ mkdir_p(f)
75
+ else
76
+ raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
77
+ safe_ln(fn, f)
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ def gem_file
84
+ if @gem_spec.platform == Gem::Platform::RUBY
85
+ "#{package_name}.gem"
86
+ else
87
+ "#{package_name}-#{@gem_spec.platform}.gem"
88
+ end
89
+ end
90
+ end # class GemPackageTask
91
+ end # module Bones
3
92
 
4
93
  namespace :gem do
5
94
 
@@ -18,6 +107,10 @@ namespace :gem do
18
107
  s.add_dependency(*dep)
19
108
  end
20
109
 
110
+ PROJ.gem.development_dependencies.each do |dep|
111
+ s.add_development_dependency(*dep)
112
+ end
113
+
21
114
  s.files = PROJ.gem.files
22
115
  s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
23
116
  s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
@@ -56,37 +149,21 @@ namespace :gem do
56
149
  end
57
150
  end # Gem::Specification.new
58
151
 
59
- # A prerequisites task that all other tasks depend upon
60
- task :prereqs
152
+ Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
153
+ pkg.need_tar = PROJ.gem.need_tar
154
+ pkg.need_zip = PROJ.gem.need_zip
155
+ end
61
156
 
62
157
  desc 'Show information about the gem'
63
158
  task :debug => 'gem:prereqs' do
64
159
  puts PROJ.gem._spec.to_ruby
65
160
  end
66
161
 
67
- pkg = Rake::PackageTask.new(PROJ.name, PROJ.version) do |pkg|
68
- pkg.need_tar = PROJ.gem.need_tar
69
- pkg.need_zip = PROJ.gem.need_zip
70
- pkg.package_files += PROJ.gem._spec.files
71
- end
72
- Rake::Task['gem:package'].instance_variable_set(:@full_comment, nil)
73
-
74
- gem_file = if PROJ.gem._spec.platform == Gem::Platform::RUBY
75
- "#{pkg.package_name}.gem"
76
- else
77
- "#{pkg.package_name}-#{PROJ.gem._spec.platform}.gem"
162
+ desc 'Write the gemspec '
163
+ task :spec => 'gem:prereqs' do
164
+ File.open("#{PROJ.name}.gemspec", 'w') do |f|
165
+ f.write PROJ.gem._spec.to_ruby
78
166
  end
79
-
80
- desc "Build the gem file #{gem_file}"
81
- task :package => ['gem:prereqs', "#{pkg.package_dir}/#{gem_file}"]
82
-
83
- file "#{pkg.package_dir}/#{gem_file}" => [pkg.package_dir] + PROJ.gem._spec.files do
84
- when_writing("Creating GEM") {
85
- Gem::Builder.new(PROJ.gem._spec).build
86
- verbose(true) {
87
- mv gem_file, "#{pkg.package_dir}/#{gem_file}"
88
- }
89
- }
90
167
  end
91
168
 
92
169
  desc 'Install the gem'
@@ -112,14 +189,13 @@ namespace :gem do
112
189
  task :cleanup do
113
190
  sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
114
191
  end
115
-
116
192
  end # namespace :gem
117
193
 
194
+
118
195
  desc 'Alias to gem:package'
119
196
  task :gem => 'gem:package'
120
197
 
121
198
  task :clobber => 'gem:clobber_package'
122
-
123
- remove_desc_for_task %w(gem:clobber_package)
199
+ remove_desc_for_task 'gem:clobber_package'
124
200
 
125
201
  # EOF
data/tasks/post_load.rake CHANGED
@@ -2,14 +2,15 @@
2
2
  # This file does not define any rake tasks. It is used to load some project
3
3
  # settings if they are not defined by the user.
4
4
 
5
- PROJ.rdoc.exclude << "^#{Regexp.escape(PROJ.manifest_file)}$"
6
5
  PROJ.exclude << ["^#{Regexp.escape(PROJ.ann.file)}$",
6
+ "^#{Regexp.escape(PROJ.ignore_file)}$",
7
7
  "^#{Regexp.escape(PROJ.rdoc.dir)}/",
8
8
  "^#{Regexp.escape(PROJ.rcov.dir)}/"]
9
9
 
10
10
  flatten_arrays = lambda do |this,os|
11
11
  os.instance_variable_get(:@table).each do |key,val|
12
- next if key == :dependencies
12
+ next if key == :dependencies \
13
+ or key == :development_dependencies
13
14
  case val
14
15
  when Array; val.flatten!
15
16
  when OpenStruct; this.call(this,val)
@@ -24,12 +25,7 @@ PROJ.description ||= paragraphs_of(PROJ.readme_file, 'description').join("\n\n")
24
25
 
25
26
  PROJ.summary ||= PROJ.description.split('.').first
26
27
 
27
- PROJ.gem.files ||=
28
- if test(?f, PROJ.manifest_file)
29
- files = File.readlines(PROJ.manifest_file).map {|fn| fn.chomp.strip}
30
- files.delete ''
31
- files
32
- else [] end
28
+ PROJ.gem.files ||= manifest
33
29
 
34
30
  PROJ.gem.executables ||= PROJ.gem.files.find_all {|fn| fn =~ %r/^bin/}
35
31
 
data/tasks/rubyforge.rake CHANGED
@@ -6,7 +6,7 @@ require 'rake/contrib/sshpublisher'
6
6
 
7
7
  namespace :gem do
8
8
  desc 'Package and upload to RubyForge'
9
- task :release => [:clobber, 'gem:package'] do |t|
9
+ task :release => [:clobber, 'gem'] do |t|
10
10
  v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
11
11
  abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
12
12
  pkg = "pkg/#{PROJ.gem._spec.full_name}"
@@ -26,9 +26,7 @@ namespace :gem do
26
26
  c['release_changes'] = PROJ.changes if PROJ.changes
27
27
  c['preformatted'] = true
28
28
 
29
- files = [(PROJ.gem.need_tar ? "#{pkg}.tgz" : nil),
30
- (PROJ.gem.need_zip ? "#{pkg}.zip" : nil),
31
- "#{pkg}.gem"].compact
29
+ files = Dir.glob("#{pkg}*.*")
32
30
 
33
31
  puts "Releasing #{PROJ.name} v. #{PROJ.version}"
34
32
  rf.add_release PROJ.rubyforge.name, PROJ.name, PROJ.version, *files
data/tasks/setup.rb CHANGED
@@ -4,9 +4,13 @@ require 'rake'
4
4
  require 'rake/clean'
5
5
  require 'fileutils'
6
6
  require 'ostruct'
7
+ require 'find'
7
8
 
8
9
  class OpenStruct; undef :gem; end
9
10
 
11
+ # TODO: make my own openstruct type object that includes descriptions
12
+ # TODO: use the descriptions to output help on the available bones options
13
+
10
14
  PROJ = OpenStruct.new(
11
15
  # Project Defaults
12
16
  :name => nil,
@@ -24,8 +28,8 @@ PROJ = OpenStruct.new(
24
28
  :ruby_opts => %w(-w),
25
29
  :libs => [],
26
30
  :history_file => 'History.txt',
27
- :manifest_file => 'Manifest.txt',
28
31
  :readme_file => 'README.txt',
32
+ :ignore_file => '.bnsignore',
29
33
 
30
34
  # Announce
31
35
  :ann => OpenStruct.new(
@@ -47,6 +51,7 @@ PROJ = OpenStruct.new(
47
51
  # Gem Packaging
48
52
  :gem => OpenStruct.new(
49
53
  :dependencies => [],
54
+ :development_dependencies => [],
50
55
  :executables => nil,
51
56
  :extensions => FileList['ext/**/extconf.rb'],
52
57
  :files => nil,
@@ -58,7 +63,7 @@ PROJ = OpenStruct.new(
58
63
  # File Annotations
59
64
  :notes => OpenStruct.new(
60
65
  :exclude => %w(^tasks/setup\.rb$),
61
- :extensions => %w(.txt .rb .erb) << '',
66
+ :extensions => %w(.txt .rb .erb .rdoc) << '',
62
67
  :tags => %w(FIXME OPTIMIZE TODO)
63
68
  ),
64
69
 
@@ -73,7 +78,7 @@ PROJ = OpenStruct.new(
73
78
  # Rdoc
74
79
  :rdoc => OpenStruct.new(
75
80
  :opts => [],
76
- :include => %w(^lib/ ^bin/ ^ext/ \.txt$),
81
+ :include => %w(^lib/ ^bin/ ^ext/ \.txt$ \.rdoc$),
77
82
  :exclude => %w(extconf\.rb$),
78
83
  :main => nil,
79
84
  :dir => 'doc',
@@ -109,8 +114,10 @@ PROJ = OpenStruct.new(
109
114
  )
110
115
 
111
116
  # Load the other rake files in the tasks folder
112
- rakefiles = Dir.glob('tasks/*.rake').sort
113
- rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
117
+ tasks_dir = File.expand_path(File.dirname(__FILE__))
118
+ post_load_fn = File.join(tasks_dir, 'post_load.rake')
119
+ rakefiles = Dir.glob(File.join(tasks_dir, '*.rake')).sort
120
+ rakefiles.unshift(rakefiles.delete(post_load_fn)).compact!
114
121
  import(*rakefiles)
115
122
 
116
123
  # Setup the project libraries
@@ -161,6 +168,12 @@ HAVE_SVN = (Dir.entries(Dir.pwd).include?('.svn') and
161
168
  HAVE_GIT = (Dir.entries(Dir.pwd).include?('.git') and
162
169
  system("git --version 2>&1 > #{DEV_NULL}"))
163
170
 
171
+ # Add bones as a development dependency
172
+ #
173
+ if HAVE_BONES
174
+ PROJ.gem.development_dependencies << ['bones', ">= #{Bones::VERSION}"]
175
+ end
176
+
164
177
  # Reads a file at +path+ and spits out an array of the +paragraphs+
165
178
  # specified.
166
179
  #
@@ -242,9 +255,25 @@ end
242
255
  # Scans the current working directory and creates a list of files that are
243
256
  # candidates to be in the manifest.
244
257
  #
245
- def manifest_files
258
+ def manifest
246
259
  files = []
247
- exclude = Regexp.new(PROJ.exclude.join('|'))
260
+ exclude = PROJ.exclude.dup
261
+ comment = %r/^\s*#/
262
+
263
+ # process the ignore file and add the items there to the exclude list
264
+ if test(?f, PROJ.ignore_file)
265
+ ary = File.readlines(PROJ.ignore_file).map do |line|
266
+ next if line =~ comment
267
+ line.chomp.strip
268
+ end
269
+ ary.compact!
270
+ ary.delete ''
271
+ exclude.concat ary
272
+ end
273
+
274
+ # generate a regular expression from the exclude list
275
+ exclude = Regexp.new(exclude.join('|'))
276
+
248
277
  Find.find '.' do |path|
249
278
  path.sub! %r/^(\.\/|\/)/o, ''
250
279
  next unless test ?f, path