Class: Tanuki::Application

Inherits:
Object show all
Defined in:
lib/tanuki/application.rb

Overview

Tanuki::Application is the starting point for all framework applications. It contains core application functionality like configuration, request handling and view management.

Class Method Summary collapse

Class Method Details

.configure(env) ⇒ Object

Initializes application settings using configuration for environment env. These include settings for server, context, and middleware. Returns true, if configuration is successful.



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/tanuki/application.rb', line 15

def configure(env)
  @environment = env
  begin
    default_root = File.expand_path(File.join('..', '..', '..'), __FILE__)
    @cfg = Configurator.new(Context, pwd = Dir.pwd)
    if pwd != default_root
      @cfg.config_root = File.join(default_root, 'config')
      @cfg.load_config(([:development, :production].include? env) ? :"#{env}_application" : :common_application)
    end
    @cfg.config_root = File.join(pwd, 'config')
    @cfg.load_config :"#{env}_application", pwd != default_root
    return true
  rescue NameError => e
    if e.name =~ /\AA-Z/
      raise NameError, "missing class or module for constant `#{e.name}'", e.backtrace
    else
      raise e
    end
  end
  false
end

.configure_middleware(rack_builder) ⇒ Object

Add utilized middleware to a given Rack::Builder instance rack_builder.



38
39
40
# File 'lib/tanuki/application.rb', line 38

def configure_middleware(rack_builder)
  @rack_middleware.each {|item| rack_builder.use(item[0], *item[1], &item[2]) }
end

.discard(middleware) ⇒ Object

Removes all occurences of a given middleware from the Rack middleware pipeline.



43
44
45
# File 'lib/tanuki/application.rb', line 43

def discard(middleware)
  @rack_middleware.delete_if {|item| item[0] == middleware }
end

.environmentObject

Returns current environment Symbol, if application is configured. Returns nil otherwise.



49
50
51
# File 'lib/tanuki/application.rb', line 49

def environment
  @environment ||= nil
end

.runObject

Runs the application with current settings.



54
55
56
57
58
59
60
61
# File 'lib/tanuki/application.rb', line 54

def run
  configure_middleware(rack_builder = Rack::Builder.new)
  rack_builder.run(rack_app)
  @context.running_server = available_server
  puts "A#{'n' if @environment =~ /\A[aeiou]/} #{@environment} Tanuki appears! Press Ctrl-C to set it free.",
    "You used #{@context.running_server.name.gsub(/.*::/, '')} at #{@context.host}:#{@context.port}."
  @context.running_server.run rack_builder.to_app, :Host => @context.host, :Port => @context.port
end

.use(middleware, *args, &block) ⇒ Object

Adds a given middleware with optional args and block to the Rack middleware pipeline.



64
65
66
# File 'lib/tanuki/application.rb', line 64

def use(middleware, *args, &block)
  @rack_middleware << [middleware, args, block]
end

.visitor(sym, &block) ⇒ Object

Adds a template visitor block. This block must return a Proc.

visitor :escape do
  s = ''
  proc {|out| s << CGI.escapeHTML(out.to_s) }
end
visitor :printf do |format|
  s = ''
  proc {|out| s << format % out.to_s }
end

It can later be used in a template via the visitor syntax.

<_escape escaped_view %>
<_printf('<div>%s</div>') formatted_view %>


83
84
85
# File 'lib/tanuki/application.rb', line 83

def visitor(sym, &block)
  BaseBehavior.instance_eval { define_method "#{sym}_visitor".to_sym, &block }
end