Class: Padrino::Mounter

Inherits:
Object
  • Object
show all
Defined in:
padrino-core/lib/padrino-core/mounter.rb,
padrino-core/lib/padrino-core/mounter/application_extension.rb

Overview

Represents a particular mounted Padrino application. Stores the name of the application (app folder name) and url mount path.

Examples:

Mounter.new("blog_app", :app_class => "Blog").to("/blog")
Mounter.new("blog_app", :app_file => "/path/to/blog/app.rb").to("/blog")

Defined Under Namespace

Modules: ApplicationExtension Classes: MounterException

Constant Summary

DEFAULT_CASCADE =
[404, 405]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, options = {}) ⇒ Mounter

Returns a new instance of Mounter

Parameters:

Options Hash (options):

  • :app_class (Symbol) — default: Detected from name
  • :app_file (Symbol) — default: Automatically detected
  • :app_obj (Symbol) — default: Detected
  • :app_root (Symbol) — default: Directory of :app_file
  • :gem (Symbol)

    The gem to load the app from (Detected from name)



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'padrino-core/lib/padrino-core/mounter.rb', line 30

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!
  unless padrino_application?
    @app_obj.extend ApplicationExtension
    @app_obj.mounter_options = options
  end
  @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]) : []
  Padrino::Reloader.exclude_constants << @app_class
end

Instance Attribute Details

#app_classObject

Returns the value of attribute app_class



17
18
19
# File 'padrino-core/lib/padrino-core/mounter.rb', line 17

def app_class
  @app_class
end

#app_fileObject

Returns the value of attribute app_file



17
18
19
# File 'padrino-core/lib/padrino-core/mounter.rb', line 17

def app_file
  @app_file
end

#app_hostObject

Returns the value of attribute app_host



17
18
19
# File 'padrino-core/lib/padrino-core/mounter.rb', line 17

def app_host
  @app_host
end

#app_objObject

Returns the value of attribute app_obj



17
18
19
# File 'padrino-core/lib/padrino-core/mounter.rb', line 17

def app_obj
  @app_obj
end

#app_rootObject

Returns the value of attribute app_root



17
18
19
# File 'padrino-core/lib/padrino-core/mounter.rb', line 17

def app_root
  @app_root
end

#cascadeObject

Returns the value of attribute cascade



17
18
19
# File 'padrino-core/lib/padrino-core/mounter.rb', line 17

def cascade
  @cascade
end

#nameObject

Returns the value of attribute name



17
18
19
# File 'padrino-core/lib/padrino-core/mounter.rb', line 17

def name
  @name
end

#uri_rootObject

Returns the value of attribute uri_root



17
18
19
# File 'padrino-core/lib/padrino-core/mounter.rb', line 17

def uri_root
  @uri_root
end

Instance Method Details

#==(other) ⇒ Object

Makes two Mounters equal if they have the same name and uri_root.

Parameters:



154
155
156
# File 'padrino-core/lib/padrino-core/mounter.rb', line 154

def ==(other)
  other.is_a?(Mounter) && self.app_class == other.app_class && self.uri_root == other.uri_root
end

#app_constantPadrino::Application

Returns the class object for the app if defined, nil otherwise.

Returns:



162
163
164
165
166
167
168
169
170
171
172
173
# File 'padrino-core/lib/padrino-core/mounter.rb', line 162

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

#host(mount_host) ⇒ Object

Registers the mounted application onto Padrino for the given host.

Examples:

Mounter.new("blog_app").to("/blog").host("blog.padrino.org")
Mounter.new("blog_app").host("blog.padrino.org")
Mounter.new("catch_all").host(/.*\.padrino.org/)

Parameters:

  • mount_host (String)

    Host name.



79
80
81
82
83
# File 'padrino-core/lib/padrino-core/mounter.rb', line 79

def host(mount_host)
  @app_host = mount_host
  Padrino.insert_mounted_app(self)
  self
end

#map_onto(router) ⇒ Padrino::Router

Maps Padrino application onto a Padrino::Router. For use in constructing a Rack application.

Examples:

@app.map_onto(router)

Parameters:

Returns:



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'padrino-core/lib/padrino-core/mounter.rb', line 96

def map_onto(router)
  app_data = self
  app_obj = @app_obj

  uri_root             = app_data.uri_root
  public_folder_exists = File.exist?(app_obj.public_folder)

  if padrino_application?
    app_obj.set :uri_root,       uri_root
    app_obj.set :app_name,       app_obj.app_name.to_s
    app_obj.set :root,           app_data.app_root
    app_obj.set :public_folder,  Padrino.root('public', uri_root) unless public_folder_exists
    app_obj.set :static,         public_folder_exists
    app_obj.set :cascade,        app_data.cascade
  else
    app_obj.uri_root      = uri_root
    app_obj.public_folder = Padrino.root('public', uri_root) unless public_folder_exists
  end
  app_obj.setup_application! # Initializes the app here with above settings.
  router.map(:to => app_obj, :path => uri_root, :host => app_data.app_host)
end

#named_routesArray

Returns the basic route information for each named route.

Returns:

  • (Array)

    Array of routes.



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'padrino-core/lib/padrino-core/mounter.rb', line 131

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

#padrino_application?Boolean

Returns:

  • (Boolean)


47
48
49
50
51
# File 'padrino-core/lib/padrino-core/mounter.rb', line 47

def padrino_application?
  @app_obj.ancestors.include?(Padrino::Application)
rescue NameError
  false
end

#routesObject

Returns the route objects for the mounted application.



121
122
123
# File 'padrino-core/lib/padrino-core/mounter.rb', line 121

def routes
  app_obj.routes
end

#to(mount_url) ⇒ Object

Registers the mounted application onto Padrino.

Examples:

Mounter.new("blog_app").to("/blog")

Parameters:

  • mount_url (String)

    Path where we mount the app.



62
63
64
65
66
# File 'padrino-core/lib/padrino-core/mounter.rb', line 62

def to(mount_url)
  @uri_root  = mount_url
  Padrino.insert_mounted_app(self)
  self
end