Module: Kernel
- Defined in:
- lib/merb-core/core_ext/kernel.rb
Instance Method Summary collapse
-
#__caller_info__(i = 1) ⇒ Array[Array]
The file, line and method of the caller.
-
#__caller_lines__(file, line, size = 4) ⇒ Array[Array]
Triplets containing the line number, the line and whether this was the searched line.
-
#__profile__(name, min = 1, iter = 100) ⇒ String
Takes a block, profiles the results of running the block specified number of times and generates HTML report.
-
#debugger ⇒ Object
Define debugger method so that code even works if debugger was not requested.
-
#dependencies(*args) ⇒ Object
Loads both gem and library dependencies that are passed in as arguments.
-
#dependency(name, *ver) ⇒ Gem::Dependency
Loads the given string as a gem.
-
#enforce!(opts = {}) ⇒ Object
Checks that the given objects quack like the given conditions.
-
#extract_options_from_args!(args) ⇒ Object
Extracts an options hash if it is the last item in the args array.
-
#load_dependencies(*args) ⇒ Object
Loads both gem and library dependencies that are passed in as arguments.
-
#load_dependency(name, *ver) ⇒ Gem::Dependency
Loads the given string as a gem.
-
#rescue_require(library, message = nil) ⇒ Object
Does a basic require, and prints a message if an error occurs.
-
#track_dependency(name, *ver) ⇒ Gem::Dependency
private
Keep track of all required dependencies.
-
#use_orm(orm) ⇒ Object
Used in Merb.root/config/init.rb to tell Merb which ORM (Object Relational Mapper) you wish to use.
-
#use_template_engine(template_engine) ⇒ Object
Used in Merb.root/config/init.rb to tell Merb which template engine to prefer.
-
#use_test(test_framework, *test_dependencies) ⇒ Object
Used in Merb.root/config/init.rb to tell Merb which testing framework to use.
Instance Method Details
#__caller_info__(i = 1) ⇒ Array[Array]
Returns The file, line and method of the caller.
204 205 206 |
# File 'lib/merb-core/core_ext/kernel.rb', line 204 def __caller_info__(i = 1) file, line, meth = caller[i].scan(/(.*?):(\d+):in `(.*?)'/).first end |
#__caller_lines__(file, line, size = 4) ⇒ Array[Array]
Returns Triplets containing the line number, the line and whether this was the searched line.
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
# File 'lib/merb-core/core_ext/kernel.rb', line 227 def __caller_lines__(file, line, size = 4) line = line.to_i if file =~ /\(erubis\)/ yield :error, "Template Error! Problem while rendering", false elsif !File.file?(file) || !File.readable?(file) yield :error, "File `#{file}' not available", false else lines = File.read(file).split("\n") first_line = (f = line - size - 1) < 0 ? 0 : f old_lines = lines lines = lines[first_line, size * 2 + 1] lines && lines.each_with_index do |str, index| yield index + line - size, str.chomp end end # # lines = File.readlines(file) # current = line.to_i - 1 # # first = current - size # first = first < 0 ? 0 : first # # last = current + size # last = last > lines.size ? lines.size : last # # log = lines[first..last] # # area = [] # # log.each_with_index do |line, index| # index = index + first + 1 # area << [index, line.chomp, index == current + 1] # end # # area end |
#__profile__(name, min = 1, iter = 100) ⇒ String
Requires ruby-prof (sudo gem install ruby-prof)
Takes a block, profiles the results of running the block specified number of times and generates HTML report.
291 292 293 294 295 296 297 298 299 300 301 302 303 304 |
# File 'lib/merb-core/core_ext/kernel.rb', line 291 def __profile__(name, min=1, iter=100) require 'ruby-prof' unless defined?(RubyProf) return_result = '' result = RubyProf.profile do iter.times{return_result = yield} end printer = RubyProf::GraphHtmlPrinter.new(result) path = File.join(Merb.root, 'log', "#{name}.html") File.open(path, 'w') do |file| printer.print(file, {:min_percent => min, :print_file => true}) end return_result end |
#debugger ⇒ Object
Define debugger method so that code even works if debugger was not requested. Drops a note to the logs that Debugger was not available.
338 339 340 341 342 |
# File 'lib/merb-core/core_ext/kernel.rb', line 338 def debugger Merb.logger.info! "\n***** Debugger requested, but was not " + "available: Start server with --debugger " + "to enable *****\n" end |
#dependencies(*args) ⇒ Object
Loads both gem and library dependencies that are passed in as arguments. Execution is deferred to the Merb::BootLoader::Dependencies.run during bootup.
80 81 82 83 84 85 86 87 88 |
# File 'lib/merb-core/core_ext/kernel.rb', line 80 def dependencies(*args) args.map do |arg| case arg when String then dependency(arg) when Hash then arg.map { |r,v| dependency(r, v) } when Array then arg.map { |r| dependency(r) } end end end |
#dependency(name, *ver) ⇒ Gem::Dependency
Loads the given string as a gem. Execution is deferred until after the logger has been instantiated and the framework directory structure is defined.
If that has already happened, the gem will be activated immediately, but it will still be registered.
41 42 43 44 45 46 47 48 |
# File 'lib/merb-core/core_ext/kernel.rb', line 41 def dependency(name, *ver) immediate = ver.last.is_a?(Hash) && ver.pop[:immediate] if immediate || Merb::BootLoader.finished?(Merb::BootLoader::Dependencies) load_dependency(name, *ver) else track_dependency(name, *ver) end end |
#enforce!(opts = {}) ⇒ Object
Checks that the given objects quack like the given conditions.
328 329 330 331 332 |
# File 'lib/merb-core/core_ext/kernel.rb', line 328 def enforce!(opts = {}) opts.each do |k,v| raise ArgumentError, "#{k.inspect} doesn't quack like #{v.inspect}" unless k.quacks_like?(v) end end |
#extract_options_from_args!(args) ⇒ Object
Extracts an options hash if it is the last item in the args array. Used internally in methods that take *args.
316 317 318 |
# File 'lib/merb-core/core_ext/kernel.rb', line 316 def (args) args.pop if Hash === args.last end |
#load_dependencies(*args) ⇒ Object
Each argument can be:
- String
-
Single dependency.
- Hash
-
Multiple dependencies where the keys are names and the values versions.
- Array
-
Multiple string dependencies.
Loads both gem and library dependencies that are passed in as arguments.
104 105 106 107 108 109 110 111 112 |
# File 'lib/merb-core/core_ext/kernel.rb', line 104 def load_dependencies(*args) args.map do |arg| case arg when String then load_dependency(arg) when Hash then arg.map { |r,v| load_dependency(r, v) } when Array then arg.map { |r| load_dependency(r) } end end end |
#load_dependency(name, *ver) ⇒ Gem::Dependency
If the gem cannot be found, the method will attempt to require the string as a library.
Loads the given string as a gem.
This new version tries to load the file via ROOT/gems first before moving off to the system gems (so if you have a lower version of a gem in ROOT/gems, it’ll still get loaded).
66 67 68 69 70 71 72 73 74 |
# File 'lib/merb-core/core_ext/kernel.rb', line 66 def load_dependency(name, *ver) dep = name.is_a?(Gem::Dependency) ? name : track_dependency(name, *ver) gem(dep) rescue Gem::LoadError ensure require dep.name Merb.logger.info!("loading gem '#{dep.name}' ...") return dep # ensure needs explicit return end |
#rescue_require(library, message = nil) ⇒ Object
Does a basic require, and prints a message if an error occurs.
118 119 120 121 122 |
# File 'lib/merb-core/core_ext/kernel.rb', line 118 def rescue_require(library, = nil) require library rescue LoadError, RuntimeError Merb.logger.error!() if end |
#track_dependency(name, *ver) ⇒ Gem::Dependency
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Keep track of all required dependencies.
14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/merb-core/core_ext/kernel.rb', line 14 def track_dependency(name, *ver) dep = Gem::Dependency.new(name, ver) existing = Merb::BootLoader::Dependencies.dependencies.find { |d| d.name == dep.name } if existing index = Merb::BootLoader::Dependencies.dependencies.index(existing) Merb::BootLoader::Dependencies.dependencies.delete(existing) Merb::BootLoader::Dependencies.dependencies.insert(index, dep) else Merb::BootLoader::Dependencies.dependencies << dep end return dep end |
#use_orm(orm) ⇒ Object
If for some reason this is called more than once, latter call takes over other.
Used in Merb.root/config/init.rb to tell Merb which ORM (Object Relational Mapper) you wish to use. Currently Merb has plugins to support ActiveRecord, DataMapper, and Sequel.
140 141 142 143 144 145 146 147 148 149 |
# File 'lib/merb-core/core_ext/kernel.rb', line 140 def use_orm(orm) begin Merb.orm = orm orm_plugin = "merb_#{orm}" Kernel.dependency(orm_plugin) rescue LoadError => e Merb.logger.warn!("The #{orm_plugin} gem was not found. You may need to install it.") raise e end end |
#use_template_engine(template_engine) ⇒ Object
Used in Merb.root/config/init.rb to tell Merb which template engine to prefer.
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/merb-core/core_ext/kernel.rb', line 181 def use_template_engine(template_engine) Merb.template_engine = template_engine if template_engine != :erb if template_engine.in?(:haml, :builder) template_engine_plugin = "merb-#{template_engine}" else template_engine_plugin = "merb_#{template_engine}" end Kernel.dependency(template_engine_plugin) end rescue LoadError => e Merb.logger.warn!("The #{template_engine_plugin} gem was not found. You may need to install it.") raise e end |
#use_test(test_framework, *test_dependencies) ⇒ Object
Used in Merb.root/config/init.rb to tell Merb which testing framework to use. Currently Merb has plugins to support RSpec and Test::Unit.
163 164 165 166 167 |
# File 'lib/merb-core/core_ext/kernel.rb', line 163 def use_test(test_framework, *test_dependencies) Merb.test_framework = test_framework Kernel.dependencies test_dependencies if Merb.env == "test" || Merb.env.nil? end |