Module: Polylog

Extended by:
Polylog
Included in:
Polylog
Defined in:
lib/polylog.rb,
lib/polylog/errors.rb,
lib/polylog/null_logger.rb,
lib/polylog/solo_provider.rb,
lib/polylog/multi_provider.rb

Defined Under Namespace

Classes: MultiProvider, NullLogger, SoloProvider

Constant Summary collapse

LIBPATH =
::File.expand_path('../', __FILE__)
PATH =
::File.dirname(LIBPATH)
Error =

Parent class for all Polylog errors.

Class.new StandardError
UnknownProvider =

This is error is raised when an unknown provider is requested by the user.

Class.new Error
InvalidProvider =

This is error is raised when a provider is registered and it does not respond to the logger method or the logger method has an arity other than 1.

Class.new Error

Instance Method Summary collapse

Instance Method Details

#libpath(*args) ⇒ Object

Internal: Returns the library path for the module. If any arguments are given, they will be joined to the end of the library path using File.join.



129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/polylog.rb', line 129

def libpath( *args )
  rv =  args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
  if block_given?
    begin
      $LOAD_PATH.unshift LIBPATH
      rv = yield
    ensure
      $LOAD_PATH.shift
    end
  end
  return rv
end

#logger(object = nil) ⇒ Object

Request a logger instance for the given object from the configured provider.

object - Any ruby object

Returns a logger instance from the provider.



11
12
13
14
# File 'lib/polylog.rb', line 11

def logger( object = nil )
  name = logger_name object
  provider.logger name
end

#logger_name(object) ⇒ Object

Internal: Given any ruby object, try to construct a sensible logger name to use for looking up specific logger instances from a provider. For nearly every object passed in this will be the class name of the instance.

If you pass in nil or a String then the original object is return. Symbols will be converted to Strings.

The only objects we cannot generate a logger name for are anonymous modules. For these we just return nil.

object - Any ruby object

Returns the logger name String or nil.



84
85
86
87
88
89
90
91
# File 'lib/polylog.rb', line 84

def logger_name( object )
  case object
  when nil, String; object
  when Symbol; object.to_s
  when Module; logger_name_for_module(object)
  when Object; logger_name_for_module(object.class)
  end
end

#logger_name_for_module(mod) ⇒ Object

Internal: Generate logger names for classes, modules, singleton classes, and anonymous modules. For all of these we use the class name or the module name. For anonymous modules we return nil.

mod - A Module or Class

Returns the logger name String or nil.



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/polylog.rb', line 100

def logger_name_for_module( mod )
  return mod.name unless mod.name.nil? or mod.name.empty?

  # check if we have a metaclass (or eigenclass)
  if mod.ancestors.include? Class
    mod.inspect =~ %r/#<Class:([^#>]+)>/
    return $1
  end

  # see if we have a superclass
  if mod.respond_to? :superclass
    return logger_name_for_module(mod.superclass)
  end

  # we have an anonymous module
  return nil
end

#path(*args) ⇒ Object

Internal: Returns the path for the module. If any arguments are given, they will be joined to the end of the path using File.join.



144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/polylog.rb', line 144

def path( *args )
  rv = args.empty? ? PATH : ::File.join(PATH, args.flatten)
  if block_given?
    begin
      $LOAD_PATH.unshift PATH
      rv = yield
    ensure
      $LOAD_PATH.shift
    end
  end
  return rv
end

#providerObject

Return the currently selected provider. If a provider has not yet been specified, then the “null” provider will be used.

Returns a logger provider.



20
21
22
23
# File 'lib/polylog.rb', line 20

def provider
  use_provider('null') unless defined? @provider
  @provider
end

#providersObject

Returns the list of available providers as an Array of Strings. These names are used to select which provider to use.



27
28
29
# File 'lib/polylog.rb', line 27

def providers
  @providers.keys
end

#register_provider(name, provider) ⇒ Object

Register a logger provider under the given name. The provider can be any Ruby object that responds to the logger method and returns valid logger instances. An exception is raised if the provider does not respond to the logger method or the logger method does not have an arity of 1.

name - The provider name as a String. provider - The provider object that responds to the logger method.

Returns the logger provider. Raises a Polylog::InvalidProvider exception.



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/polylog.rb', line 55

def register_provider( name, provider )
  @providers ||= Hash.new
  name = name.to_s

  unless provider.respond_to?(:logger)
    raise Polylog::InvalidProvider, "`logger` method not found for provider #{name.inspect}"
  end

  arity = provider.method(:logger).arity
  unless 1 == arity
    raise Polylog::InvalidProvider, "`logger` method arity must be 1; arity is #{arity} for provider #{name.inspect}"
  end

  @providers[name] = provider
end

#use_provider(name) ⇒ Object

Configure the logger provider that will be used by Polylog. The provider must already be registered using the same name.

name - The provider name as a String.

Returns the logger provider. Raises a Polylog::UnknownProvider exception.



38
39
40
41
42
43
# File 'lib/polylog.rb', line 38

def use_provider( name )
  name = name.to_s
  raise Polylog::UnknownProvider, "unknown provider: #{name.inspect}" unless @providers.key? name

  @provider = @providers[name]
end

#versionObject

Returns the version String for the library.



122
123
124
# File 'lib/polylog.rb', line 122

def version
  @version ||= File.read(path('version.txt')).strip
end