lib/reflexive/application.rb in reflexive-0.0.6 vs lib/reflexive/application.rb in reflexive-0.1.0

- old
+ new

@@ -10,14 +10,16 @@ require "reflexive/helpers" require "reflexive/columnizer" require "reflexive/constantize" require "reflexive/descendants" require "reflexive/methods" +require "reflexive/method_lookup" if ENV["SINATRA_RELOADER"] require "rails/all" require "arel" + require File.expand_path("../../../spec/integration_spec_fixture", __FILE__) module ::Kernel def r(*args) raise((args.size == 1 ? args[0] : args).inspect) end @@ -58,14 +60,15 @@ action "dashboard" do erb :dashboard end action "constant_lookup" do - if klass = Reflexive.constant_lookup(*params.values_at(:name, :scope)) + if (klass = Reflexive.constant_lookup(*params.values_at(:name, :scope))) && + (klass.instance_of?(Class) || klass.instance_of?(Module)) redirect(constant_path(klass.to_s)) else - e "failed to lookup constant `#{ params[:name] }' in scope #{ params[:scope] }" + e "failed to lookup class/module with name `#{ params[:name] }' in scope #{ params[:scope] }" end end action "files/*" do |path| @path = "/" + path @@ -85,57 +88,74 @@ else e "failed to find feature: #{ path }" end end - get %r</reflexive/constants/([^/&#]+)/class_methods/([^/&#]+)/definition> do |klass, method| + def definition_action(klass, level, name) find_klass(klass) - @method_name = method - @path, @line = @klass.method(@method_name).source_location - @source = highlight_file(@path, :highlight_lines => [@line]) - erb :methods_definition + @method_name = name + @path, @line = @klass.send(level == :class ? :method : :instance_method, @method_name).source_location + if @path.include?("(eval)") + e "#{ name } #{ level } method was generated using `eval' function and can't be browsed" + else + @source = highlight_file(@path, :highlight_lines => [@line]) + erb :methods_definition + end end + get %r</reflexive/constants/([^/&#]+)/class_methods/([^/&#]+)/definition> do |klass, method| + definition_action(klass, :class, method) + end + get %r</reflexive/constants/([^/&#]+)/instance_methods/([^/&#]+)/definition> do |klass, method| + definition_action(klass, :instance, method) + end + + get %r</reflexive/constants/([^/&#]+)/instance_methods/([^/&#]+)/apidock> do |klass, method| find_klass(klass) @method_name = method - @path, @line = @klass.instance_method(@method_name).source_location - @source = highlight_file(@path, :highlight_lines => [@line]) - erb :methods_definition + @level = :instance + erb :methods_apidock end - get %r</reflexive/constants/([^/&#]+)/methods/([^/&#]+)/apidock> do |klass, method| + get %r</reflexive/constants/([^/&#]+)/class_methods/([^/&#]+)/apidock> do |klass, method| find_klass(klass) @method_name = method + @level = :class erb :methods_apidock end - get %r</reflexive/constants/([^/&#]+)/class_methods/([^/&#]+)> do |klass, method| - find_klass(klass) - begin - if @klass.method(method).source_location - redirect(class_method_definition_path(klass, method) + - "#highlighted") + def method_lookup_action(klass, level, name) + lookup = MethodLookup.new(klass: klass, level: level, name: name) + if definitions = lookup.definitions + if definitions.size == 1 + redirect(new_method_definition_path(*definitions[0]) + "#highlighted") else - redirect(method_documentation_path(klass, method)) + @definitions, @klass, @level, @name, @last_resort_lookup_used = + definitions, klass, level, name, lookup.last_resort_lookup_used? + erb :methods_choose end - rescue NameError - e "failed to find `#{ method }' class method for #{ klass }" + elsif documentations = lookup.documentations + if documentations.size == 1 + redirect(method_documentation_path(*documentations[0])) + else + raise ArgumentError, "don't know how to handle multiple documentations" + end + else + e "failed to find `#{ name }' #{ level } method for #{ klass }" end + # + # e "failed to find `#{ method }' instance method for #{ klass }" end + get %r</reflexive/constants/([^/&#]+)/class_methods/([^/&#]+)> do |klass, method| + find_klass(klass) + method_lookup_action(@klass, :class, method) + end + get %r</reflexive/constants/([^/&#]+)/instance_methods/([^/&#]+)> do |klass, method| find_klass(klass) - begin - if @klass.instance_method(method).source_location - redirect(instance_method_definition_path(klass, method) + - "#highlighted") - else - redirect(method_documentation_path(klass, method)) - end - rescue NameError - e "failed to find `#{ method }' instance method for #{ klass }" - end + method_lookup_action(@klass, :instance, method) end get %r</reflexive/constants/([^/&#]+)> do |klass| find_klass(klass) \ No newline at end of file