class Tennpipes::Mounter
Represents a particular mounted Tennpipes
application. Stores the name of the application (app folder name) and url mount path.
@example
Mounter.new("blog_app", :app_class => "Blog").to("/blog") Mounter.new("blog_app", :app_file => "/path/to/blog/app.rb").to("/blog")
Constants
- DEFAULT_CASCADE
Attributes
Public Class Methods
@param [String, Tennpipes::Application] name
The app name or the {Tennpipes::Application} class.
@param [Hash] options @option options [Symbol] :app_class (Detected from name) @option options [Symbol] :app_file (Automatically detected) @option options [Symbol] :app_obj (Detected) @option options [Symbol] :app_root (Directory of :app_file) @option options [Symbol] :gem The gem to load the app from (Detected from name)
# File lib/tennpipes-base/mounter.rb, line 79 def initialize(name, options={}) @name = name.to_s @app_class = options[:app_class] || @name.camelize @gem = options[:gem] || @app_class.split("::").first.underscore @app_file = options[:app_file] || locate_app_file @app_obj = options[:app_obj] || app_constant || locate_app_object ensure_app_file! || ensure_app_object! @app_obj = ApplicationWrapper.new(@app_obj, options) unless tennpipes_application? @app_root = options[:app_root] || (@app_obj.respond_to?(:root) && @app_obj.root || File.dirname(@app_file)) @uri_root = "/" @cascade = options[:cascade] ? true == options[:cascade] ? DEFAULT_CASCADE.dup : Array(options[:cascade]) : [] Tennpipes::Reloader.exclude_constants << @app_class end
Public Instance Methods
Makes two Mounters equal if they have the same name and uri_root.
@param [Tennpipes::Mounter] other
# File lib/tennpipes-base/mounter.rb, line 197 def ==(other) other.is_a?(Mounter) && self.app_class == other.app_class && self.uri_root == other.uri_root end
@return [Tennpipes::Application]
the class object for the app if defined, nil otherwise.
# File lib/tennpipes-base/mounter.rb, line 205 def app_constant klass = Object for piece in app_class.split("::") piece = piece.to_sym if klass.const_defined?(piece, false) klass = klass.const_get(piece) else return end end klass end
Registers the mounted application onto Tennpipes
for the given host.
@param [String] mount_host
Host name.
@example
Mounter.new("blog_app").to("/blog").host("blog.tennpipes.org") Mounter.new("blog_app").host("blog.tennpipes.org") Mounter.new("catch_all").host(/.*\.tennpipes.org/)
# File lib/tennpipes-base/mounter.rb, line 125 def host(mount_host) @app_host = mount_host Tennpipes.insert_mounted_app(self) self end
Maps Tennpipes
application onto a Tennpipes::Router
. For use in constructing a Rack application.
@param [Tennpipes::Router]
@return [Tennpipes::Router]
@example
@app.map_onto(router)
# File lib/tennpipes-base/mounter.rb, line 142 def map_onto(router) app_data = self app_obj = @app_obj if tennpipes_application? app_obj.set :uri_root, app_data.uri_root app_obj.set :app_name, app_data.app_obj.app_name.to_s app_obj.set :app_file, app_data.app_file unless File.exist?(app_obj.app_file) app_obj.set :root, app_data.app_root unless app_data.app_root.blank? app_obj.set :public_folder, Tennpipes.root('public', app_data.uri_root) unless File.exist?(app_obj.public_folder) app_obj.set :static, File.exist?(app_obj.public_folder) if app_obj.nil? app_obj.set :cascade, app_data.cascade else app_obj.uri_root = app_data.uri_root app_obj.public_folder = Tennpipes.root('public', app_data.uri_root) unless File.exist?(app_obj.public_folder) end app_obj.setup_application! # Initializes the app here with above settings. router.map(:to => app_obj, :path => app_data.uri_root, :host => app_data.app_host) end
Returns the basic route information for each named route.
@return [Array]
Array of routes.
# File lib/tennpipes-base/mounter.rb, line 174 def named_routes app_obj.routes.map { |route| route_name = route.name.to_s route_name = if route.controller route_name.split(" ", 2).map{|name| ":#{name}" }.join(", ") else ":#{route_name}" end name_array = "(#{route_name})" request_method = route.request_methods.first next if route.name.blank? || request_method == 'HEAD' original_path = route.original_path.is_a?(Regexp) ? route.original_path.inspect : route.original_path full_path = File.join(uri_root, original_path) OpenStruct.new(:verb => request_method, :identifier => route.name, :name => name_array, :path => full_path) }.compact end
Returns the route objects for the mounted application.
# File lib/tennpipes-base/mounter.rb, line 164 def routes app_obj.routes end
# File lib/tennpipes-base/mounter.rb, line 93 def tennpipes_application? @app_obj.ancestors.include?(Tennpipes::Application) rescue NameError false end
Registers the mounted application onto Tennpipes
.
@param [String] mount_url
Path where we mount the app.
@example
Mounter.new("blog_app").to("/blog")
# File lib/tennpipes-base/mounter.rb, line 108 def to(mount_url) @uri_root = mount_url Tennpipes.insert_mounted_app(self) self end
Protected Instance Methods
Raises an exception unless app_file
is located properly.
# File lib/tennpipes-base/mounter.rb, line 252 def ensure_app_file! message = "Unable to locate source file for app '#{app_class}', try with :app_file => '/path/app.rb'" raise MounterException, message unless @app_file end
Raises an exception unless app_obj
is defined properly.
# File lib/tennpipes-base/mounter.rb, line 260 def ensure_app_object! message = "Unable to locate app for '#{app_class}', try with :app_class => 'MyAppClass'" raise MounterException, message unless @app_obj end
Returns the determined location of the mounted application main file.
# File lib/tennpipes-base/mounter.rb, line 233 def locate_app_file candidates = [] candidates << app_constant.app_file if app_constant.respond_to?(:app_file) && File.exist?(app_constant.app_file.to_s) candidates << Tennpipes.first_caller if File.identical?(Tennpipes.first_caller.to_s, Tennpipes.called_from.to_s) candidates << Tennpipes.mounted_root(name.downcase, "app.rb") simple_name = name.split("::").last.downcase mod_name = name.split("::")[0..-2].join("::") Tennpipes.modules.each do |mod| if mod.name == mod_name candidates << mod.root(simple_name, "app.rb") end end candidates << Tennpipes.root("app", "app.rb") candidates.find { |candidate| File.exist?(candidate) } end
Locates and requires the file to load the app constant.
# File lib/tennpipes-base/mounter.rb, line 222 def locate_app_object @_app_object ||= begin ensure_app_file! Tennpipes.require_dependencies(app_file) app_constant end end