Class: Syntropy::App

Inherits:
Object
  • Object
show all
Defined in:
lib/syntropy/app.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**env) ⇒ App

Returns a new instance of App.



41
42
43
44
45
46
47
48
49
50
51
# File 'lib/syntropy/app.rb', line 41

def initialize(**env)
  @machine = env[:machine]
  @root_dir = File.expand_path(env[:root_dir])
  @mount_path = env[:mount_path]
  @env = env
  @logger = env[:logger]

  @module_loader = Syntropy::ModuleLoader.new(app: self, **env)
  setup_routing_tree
  start
end

Instance Attribute Details

#envObject (readonly)

Returns the value of attribute env.



39
40
41
# File 'lib/syntropy/app.rb', line 39

def env
  @env
end

#module_loaderObject (readonly)

Returns the value of attribute module_loader.



39
40
41
# File 'lib/syntropy/app.rb', line 39

def module_loader
  @module_loader
end

#mount_pathObject (readonly)

Returns the value of attribute mount_path.



39
40
41
# File 'lib/syntropy/app.rb', line 39

def mount_path
  @mount_path
end

#root_dirObject (readonly)

Returns the value of attribute root_dir.



39
40
41
# File 'lib/syntropy/app.rb', line 39

def root_dir
  @root_dir
end

#routing_treeObject (readonly)

Returns the value of attribute routing_tree.



39
40
41
# File 'lib/syntropy/app.rb', line 39

def routing_tree
  @routing_tree
end

Class Method Details

.load(env) ⇒ Object



18
19
20
# File 'lib/syntropy/app.rb', line 18

def load(env)
  site_file_app(env) || default_app(env)
end

Instance Method Details

#call(req) ⇒ void

This method returns an undefined value.

Processes an incoming HTTP request. Requests are processed by first looking up the route for the request path, then calling the route proc. If the route proc is not set, it is computed according to the route target, and composed recursively into hooks encountered up the routing tree.

Normal exceptions (StandardError and descendants) are trapped and passed to route’s error handler. If no such handler is found, the default error handler is used, which simply generates a textual response containing the error message, and with the appropriate HTTP status code, according to the type of error.

Parameters:

  • HTTP request



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/syntropy/app.rb', line 66

def call(req)
  path = req.path
  route = @router_proc.(path, req.route_params)
  if !route
    if (m = path.match(/^(.+)\/$/))
      return req.redirect(m[1], Qeweney::Status::MOVED_PERMANENTLY)
    else
      return handle_not_found(req)
    end
  end

  req.route = route
  proc = route[:proc] ||= compute_route_proc(route)
  proc.(req)
rescue ScriptError, StandardError => e
  @logger&.error(
    message: "Error while serving request: #{e.message}",
    method: req.method,
    path: path,
    error: e
  ) if Error.log_error?(e)
  error_handler = get_error_handler(route)
  error_handler.(req, e)
end

#route(path, params = {}, compute_proc: false) ⇒ Hash

Returns the route entry for the given path. If compute_proc is true, computes the route proc if not yet computed.

Parameters:

  • path

  • (defaults to: {})

    hash receiving path parameters

  • (defaults to: false)

    whether to compute the route proc

Returns:

  • route entry



98
99
100
101
102
103
104
# File 'lib/syntropy/app.rb', line 98

def route(path, params = {}, compute_proc: false)
  route = @router_proc.(path, params)
  return if !route

  route[:proc] ||= compute_route_proc(route) if compute_proc
  route
end