logging 0.9.4 → 0.9.5

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