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.



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

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.



37
38
39
# File 'lib/syntropy/app.rb', line 37

def env
  @env
end

#module_loaderObject (readonly)

Returns the value of attribute module_loader.



37
38
39
# File 'lib/syntropy/app.rb', line 37

def module_loader
  @module_loader
end

#mount_pathObject (readonly)

Returns the value of attribute mount_path.



37
38
39
# File 'lib/syntropy/app.rb', line 37

def mount_path
  @mount_path
end

#root_dirObject (readonly)

Returns the value of attribute root_dir.



37
38
39
# File 'lib/syntropy/app.rb', line 37

def root_dir
  @root_dir
end

#routing_treeObject (readonly)

Returns the value of attribute routing_tree.



37
38
39
# File 'lib/syntropy/app.rb', line 37

def routing_tree
  @routing_tree
end

Class Method Details

.load(env) ⇒ Object



16
17
18
# File 'lib/syntropy/app.rb', line 16

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:



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

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 (String)

    path

  • params (Hash) (defaults to: {})

    hash receiving path parameters

  • compute_proc (bool) (defaults to: false)

    whether to compute the route proc

Returns:

  • (Hash)

    route entry



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

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