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