Class: Praxis::Application

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/praxis/application.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeApplication

Returns a new instance of Application.



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/praxis/application.rb', line 32

def initialize
  @controllers = Set.new
  @resource_definitions = Set.new

  @error_handler = ErrorHandler.new
  @validation_handler = ValidationHandler.new

  @router = Router.new(self)

  @builder = Rack::Builder.new
  @app = nil

  @bootloader = Bootloader.new(self)
  @file_layout = nil
  @plugins = Hash.new
  @handlers = Hash.new
  @loaded_files = Set.new
  @config = Config.new
  @root = nil
  @logger = Logger.new(STDOUT)
end

Instance Attribute Details

#appObject (readonly)

Returns the value of attribute app.



12
13
14
# File 'lib/praxis/application.rb', line 12

def app
  @app
end

#bootloaderObject

Returns the value of attribute bootloader.



15
16
17
# File 'lib/praxis/application.rb', line 15

def bootloader
  @bootloader
end

#builderObject (readonly)

Returns the value of attribute builder.



13
14
15
# File 'lib/praxis/application.rb', line 13

def builder
  @builder
end

#controllersObject (readonly)

Returns the value of attribute controllers.



10
11
12
# File 'lib/praxis/application.rb', line 10

def controllers
  @controllers
end

#error_handlerObject

Returns the value of attribute error_handler.



22
23
24
# File 'lib/praxis/application.rb', line 22

def error_handler
  @error_handler
end

#file_layoutObject

Returns the value of attribute file_layout.



16
17
18
# File 'lib/praxis/application.rb', line 16

def file_layout
  @file_layout
end

#handlersObject

Returns the value of attribute handlers.



20
21
22
# File 'lib/praxis/application.rb', line 20

def handlers
  @handlers
end

#loaded_filesObject

Returns the value of attribute loaded_files.



17
18
19
# File 'lib/praxis/application.rb', line 17

def loaded_files
  @loaded_files
end

#loggerObject

Returns the value of attribute logger.



18
19
20
# File 'lib/praxis/application.rb', line 18

def logger
  @logger
end

#pluginsObject

Returns the value of attribute plugins.



19
20
21
# File 'lib/praxis/application.rb', line 19

def plugins
  @plugins
end

#resource_definitionsObject (readonly)

Returns the value of attribute resource_definitions.



11
12
13
# File 'lib/praxis/application.rb', line 11

def resource_definitions
  @resource_definitions
end

#rootObject

Returns the value of attribute root.



21
22
23
# File 'lib/praxis/application.rb', line 21

def root
  @root
end

#routerObject (readonly)

Returns the value of attribute router.



9
10
11
# File 'lib/praxis/application.rb', line 9

def router
  @router
end

#validation_handlerObject

Returns the value of attribute validation_handler.



23
24
25
# File 'lib/praxis/application.rb', line 23

def validation_handler
  @validation_handler
end

#versioning_schemeObject

Returns the value of attribute versioning_scheme.



25
26
27
# File 'lib/praxis/application.rb', line 25

def versioning_scheme
  @versioning_scheme
end

Class Method Details

.configure {|self.instance| ... } ⇒ Object

Yields:

  • (self.instance)


28
29
30
# File 'lib/praxis/application.rb', line 28

def self.configure
  yield(self.instance)
end

Instance Method Details

#call(env) ⇒ Object



110
111
112
113
114
115
# File 'lib/praxis/application.rb', line 110

def call(env)
  response = []
  Notifications.instrument 'rack.request.all'.freeze, response: response do
    response.push(*@app.call(env))
  end
end

#config(key = nil, type = Attributor::Struct, **opts, &block) ⇒ Object



121
122
123
124
125
126
127
# File 'lib/praxis/application.rb', line 121

def config(key=nil, type=Attributor::Struct, **opts, &block)
  if block_given? || (type==Attributor::Struct && !opts.empty? )
    @config.define(key, type, opts, &block)
  else
    @config.get
  end
end

#config=(config) ⇒ Object



129
130
131
# File 'lib/praxis/application.rb', line 129

def config=(config)
  @config.set(config)
end

#handler(name, handler) ⇒ Object

Register a media type handler used to transform medias’ structured data to HTTP response entitites with a specific encoding (JSON, XML, etc) and to parse request bodies into structured data.

Parameters:

  • name (String)
  • a (Class)

    class that responds to .new, #parse and #generate



97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/praxis/application.rb', line 97

def handler(name, handler)
  # Construct an instance, if the handler is a class and needs to be initialized.
  handler = handler.new

  # Make sure it quacks like a handler.
  unless handler.respond_to?(:generate) && handler.respond_to?(:parse)
    raise ArgumentError, "Media type handlers must respond to #generate and #parse"
  end

  # Register that thing!
  @handlers[name.to_s] = handler
end

#layout(&block) ⇒ Object



117
118
119
# File 'lib/praxis/application.rb', line 117

def layout(&block)
  self.file_layout = FileGroup.new(self.root, &block)
end

#middleware(middleware, *args, &block) ⇒ Object



86
87
88
# File 'lib/praxis/application.rb', line 86

def middleware(middleware, *args, &block)
  @builder.use(middleware, *args, &block)
end

#setup(root: '.') ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/praxis/application.rb', line 55

def setup(root: '.')
  return self unless @app.nil?

  @root = Pathname.new(root).expand_path

  builtin_handlers = {
    'plain' => Praxis::Handlers::Plain,
    'json' => Praxis::Handlers::JSON,
    'x-www-form-urlencoded' => Praxis::Handlers::WWWForm
  }
  # Register built-in handlers unless the app already provided its own
  builtin_handlers.each_pair do |name, handler|
    self.handler(name, handler) unless handlers.key?(name)
  end

  @bootloader.setup!

  @builder.run(@router)
  @app = @builder.to_app

  Notifications.subscribe 'rack.request.all'.freeze do |name, start, finish, _id, payload|
    duration = (finish - start) * 1000
    Stats.timing(name, duration)

    status, _, _ = payload[:response]
    Stats.increment "rack.request.#{status}"
  end

  self
end