Class: Padrino::Mounter

Inherits:
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 collapse

DEFAULT_CASCADE =
[404, 405]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of Mounter.

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
46
47
48
49
# File 'padrino-core/lib/padrino-core/mounter.rb', line 30

def initialize(name, options = {})
  @name      = name.to_s
  @app_class = options[:app_class] || Inflections.camelize(@name)
  @gem       = options[:gem]       || Inflections.underscore(@app_class.split('::').first)
  @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   = DEFAULT_CASCADE.dup if options[:cascade] == true
  @cascade ||= options[:cascade] ? 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.



161
162
163
# File 'padrino-core/lib/padrino-core/mounter.rb', line 161

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

#app_constantPadrino::Application



169
170
171
172
173
174
175
176
# File 'padrino-core/lib/padrino-core/mounter.rb', line 169

def app_constant
  app_class.split('::').inject(Object) do |klass, piece|
    piece = piece.to_sym
    break unless klass.const_defined?(piece, false)

    klass.const_get(piece)
  end
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/)


83
84
85
86
87
# File 'padrino-core/lib/padrino-core/mounter.rb', line 83

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)


100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'padrino-core/lib/padrino-core/mounter.rb', line 100

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.cascade       = app_data.cascade
    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.



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'padrino-core/lib/padrino-core/mounter.rb', line 136

def named_routes
  return [] unless app_obj.respond_to?(:routes)

  app_obj.routes.map do |route|
    request_method = route.request_methods.first
    next if !route.name || request_method == 'HEAD'
    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})"
    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)
  end.compact
end

#padrino_application?Boolean



51
52
53
54
55
# File 'padrino-core/lib/padrino-core/mounter.rb', line 51

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

#routesObject

Returns the route objects for the mounted application.



126
127
128
# File 'padrino-core/lib/padrino-core/mounter.rb', line 126

def routes
  app_obj.routes
end

#to(mount_url) ⇒ Object

Registers the mounted application onto Padrino.

Examples:

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


66
67
68
69
70
# File 'padrino-core/lib/padrino-core/mounter.rb', line 66

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