Many ruby project scaffolders (like bueller &Co.) produce a file tree
consisting of main module
file (MODULE_NAME.rb
needed to syntax-sugaring the project stuff requires,)
some additional garbage and a lib/MODULE_NAME/version.rb
file. The latter looks like:
# encoding: utf-8
module MyModule
VERSION = "0.0.1"
end
I get used to utilize this version.rb
to define all the project-wide constants etc. If the project requires
config, there is a code to read config.yml
placed, as well as other predefines.
Nowadays I rejoice in even better approach. There is mere usual but very effective way to make a Logger
instance
(and others someone likely needs all over the project) accessible from anywhere around the code. To achieve
that I simply create a module Kernel
section inside the version.rb
and put there all the stuff I might need
everywhere:
# encoding: utf-8
module MyModule
VERSION = "0.0.1"
LOGGER_STREAM, LOGGER_LEVEL = load_config || STDOUT, Logger::INFO
end
module Kernel
@@logger = Logger.new(MyModule::LOGGER_STREAM)
@@logger.level = MyModule::LOGGER_LEVEL
end
The trick is that Kernel
module is being included within Object
class and since all the classes have Object
as
their superclass, all of them obtain an access to @@logger
class variable transparently. Now anywhere within the project
scope we may write:
@@logger.info "Hello, I’m logger"
yielding:
# ⇒ I, [2013-02-09T18:44:18.208111 #27511] INFO -- : Hello, I’m logger