lib/dt.rb in rails_dt-0.1.4 vs lib/dt.rb in rails_dt-1.2.0

- old
+ new

@@ -1,227 +1,43 @@ -require "cgi" -require "erb" -Dir[File.join(File.dirname(__FILE__), "dt/**/*.rb")].each {|fn| require fn} +require "logger" +require "pathname" -# Debug toolkit. +# Ruby/Rails debug toolkit. # -# Allows to print debug messages from anywhere in your Rails project. Do a: +# Features: # -# DT.p "Hello, world!" +# * As simple as possible. +# * Suits Rails projects and stand-alone Ruby projects. +# * Has none or minimal dependencies. +# * Compatible with Ruby 1.9 and up. # -# , and see the message in log, <tt>log/dt.log</tt>, console and web. -# -# To set up web output, in your application root do a: -# -# $ rails generate rails_dt # Rails 3 -# $ script/generate rails_dt # Rails 2 -# -# Follow the instructions the generator gives you then. -module DT #:doc: - # Maximum number of stored messages, if they're not cleared. - # If web output is configured, messages are cleared before every request. - MAX_WEB_MESSAGES = 100 +# @see DT.p +module DT + require_relative "dt/config" + require_relative "dt/instance" - # Initializer. - def self._initialize #:nodoc: - clear_web_messages + class << self + attr_writer :conf, :instance - # NOTES: - # * Stuffing is inserted in order to work around buggy RDoc parser. - # "a""bc" => "abc", just in case. - # * Don't forget to update generator/initializers/dt.rb with these. - # * "Canonical" order of imporance: log, console, web. - @log_prefix = "[DT <""%= file_rel %>:<""%= line %>] " - @console_prefix = @log_prefix.dup - @web_prefix = '<a href="txmt://open?url=file://<''%= file %>&line=<''%= line %>"><''%= file_rel %>:<''%= line %></a> ' - - # In case of path problems @log will be nil. - @log = Logger.new(Rails.root + "log/dt.log") rescue nil - end - - # On-the-fly initializer. - def self._otf_init #:nodoc: - # Consider job done, replace self with a blank. - class_eval { - def self._otf_init #:nodoc: - end - } - - _initialize - end - - # Set message prefix for console. See <tt>log_prefix=</tt>. - def self.console_prefix=(s) - _otf_init - @console_prefix = s - end - - def self.console_prefix - _otf_init - @console_prefix - end - - # Set logger to use. Must be a <tt>Logger</tt>. - # - # log = Logger.new("log/my.log") - def self.log=(obj) - _otf_init - raise "Logger expected, #{obj.class} given" if not obj.is_a? Logger - @log = obj - end - - def self.log - _otf_init - @log - end - - # Set message prefix for log. Syntax is ERB. - # - # log_prefix = "[DT <""%= file_rel %>:<""%= line %>] " - # - # NOTE: In the above example some stuffing was made to satisfy the buggy RDoc parser. - # Just in case, <tt>"a""bc"</tt> is <tt>"abc"</tt> in Ruby. - # - # Template variables: - # - # * <tt>file</tt> -- full path to file. - # * <tt>file_base</tt> -- file base name. - # * <tt>file_rel</tt> -- file name relative to Rails application root. - # * <tt>line</tt> -- line number. - # - # By setting prefix to <tt>nil</tt> you disable respective output. - # - # web_prefix = nil # Disable web output. - def self.log_prefix=(s) - _otf_init - @log_prefix = s - end - - def self.log_prefix - _otf_init - @log_prefix - end - - # Return messages accumulated since last cleared. - def self.web_messages - _otf_init - @web_messages - end - - # Set message prefix for web. See <tt>log_prefix=</tt>. - def self.web_prefix=(s) - _otf_init - @web_prefix = s - end - - def self.web_prefix - _otf_init - @web_prefix - end - - #--------------------------------------- - - # Clear messages. - def self.clear_web_messages - _otf_init - @web_messages = [] - end - - # Print a debug message or dump a value. Somewhat similar to Ruby's native <tt>p</tt>. - # - # p "Hello, world!" - # p "myvar", myvar - def self.p(*args) - _otf_init - # Fetch caller information. - # NOTE: May be lacking file information, e.g. when in an irb session. - file, line = caller.first.split(":") - - # Assign template variables. - hc = { - :file => file, - :line => line, - :file_base => (begin; File.basename(file); rescue; file; end), - :file_rel => (begin; Pathname(file).relative_path_from(Rails.root).to_s; rescue; file; end), - } - - args.each do |r| - s = r.is_a?(String) ? r : r.inspect - - # To log. - if @log_prefix - ##Kernel.p "@log", @log #DEBUG - if @log - pfx = ERB.new(@log_prefix, nil, "-").result(_hash_kbinding(hc)) - msg = [pfx, s].join - @log.info msg - Rails.logger.info msg rescue nil # In case something's wrong with `Rails.logger`. - end - end - - # To console. - if @console_prefix - pfx = ERB.new(@console_prefix, nil, "-").result(_hash_kbinding(hc)) - puts [pfx, s].join - end - - # To web. - if @web_prefix - pfx = ERB.new(@web_prefix, nil, "-").result(_hash_kbinding(hc)) - - pcs = [] - pcs << pfx - pcs << CGI.escapeHTML(s).gsub("\n", "<br/>\n") - @web_messages << pcs.join - - # Rotate messages. - @web_messages.slice!(0..-(MAX_WEB_MESSAGES + 1)) - end + # @return [Config] + def conf + @conf ||= Config.new end - # Be like `puts`, return nil. - nil - end - - # Format accumulated web messages as HTML. Usually called from a view template. - # - # web_messages_as_html # => Something like "<ul><li>Message 1</li><li>Message 2</li>...</ul>". - def self.web_messages_as_html - _otf_init - - pcs = [] - pcs << "<ul>" - @web_messages.each do |s| - pcs << ["<li>", s, "</li>"].join + # @return [Instance] + def instance + @instance ||= Instance.new end - pcs << "</ul>" - if (out = pcs.join).respond_to? :html_safe - out.html_safe - else - out + # Print a debug message, dump values etc. + # + # DT.p "checkpoint 1" + # DT.p "user", user + # + # @return [nil] + # @see Instance#_p + def p(*args) + instance._p(caller, *args) end - end - - #--------------------------------------- - - # NOTE: Singletons can't be private, so mark them syntactically. - - # Turn hash's entries into locals and return binding. - # Useful for simple templating. - def self._hash_kbinding(h) #:nodoc: - # NOTE: This IS important, since assignment is eval'd in this context. - bnd = binding - - _value = nil - h.each do |k, v| - ##puts "-- k-#{k.inspect} v-#{_value.inspect}" #DEBUG - _value = v # IMPORTANT: Ruby 1.9 compatibility hack. - eval("#{k} = _value", bnd) - end - - bnd - end - - # DO NOT invoke `_initialize` load-time, it won't see Rails3 stuff. -end # DT + end # class << self +end