Class: Rester::Service
- Inherits:
-
Object
- Object
- Rester::Service
- Defined in:
- lib/rester/service.rb,
lib/rester/service/request.rb,
lib/rester/service/resource.rb,
lib/rester/service/middleware.rb
Defined Under Namespace
Modules: Middleware Classes: Request, Resource
Constant Summary collapse
- BASE_MIDDLEWARE =
The base set of middleware to use for every service. Middleware will be executed in the order specified.
[ Rack::Head, Middleware::RequestHandler, Middleware::ErrorHandling, Middleware::Ping ].freeze
Instance Attribute Summary collapse
-
#logger ⇒ Object
Class methods.
Class Method Summary collapse
- ._load_resources(version_module) ⇒ Object
- ._load_version_module(version) ⇒ Object
- ._middleware ⇒ Object
-
.call(env) ⇒ Object
The call method needs to call the rack_call method, which adds additional rack middleware.
- .instance ⇒ Object
- .method_missing(meth, *args, &block) ⇒ Object
- .resources(version_module) ⇒ Object
- .service_name ⇒ Object
-
.use(klass, *args) ⇒ Object
Middleware DSL.
- .version_module(version) ⇒ Object
- .versions ⇒ Object
Instance Method Summary collapse
-
#call(env) ⇒ Object
Call the service app directly.
-
#call!(env) ⇒ Object
Process the request.
- #name ⇒ Object
-
#rack_call(env) ⇒ Object
To be called by Rack.
Instance Attribute Details
#logger ⇒ Object
Class methods
93 94 95 |
# File 'lib/rester/service.rb', line 93 def logger @logger end |
Class Method Details
._load_resources(version_module) ⇒ Object
84 85 86 87 88 89 90 |
# File 'lib/rester/service.rb', line 84 def _load_resources(version_module) version_module.constants.map { |c| version_module.const_get(c) }.select { |c| c.is_a?(Class) && c < Service::Resource } end |
._load_version_module(version) ⇒ Object
73 74 75 76 77 78 |
# File 'lib/rester/service.rb', line 73 def _load_version_module(version) versions.include?(version.to_sym) or raise ArgumentError, "invalid version #{version.inspect}" const_get(version.to_s.upcase) end |
._middleware ⇒ Object
36 37 38 |
# File 'lib/rester/service.rb', line 36 def _middleware @__middleware ||= BASE_MIDDLEWARE.dup end |
.call(env) ⇒ Object
The call method needs to call the rack_call method, which adds additional rack middleware.
51 52 53 |
# File 'lib/rester/service.rb', line 51 def call(env) instance.rack_call(env) end |
.instance ⇒ Object
45 46 47 |
# File 'lib/rester/service.rb', line 45 def instance @instance ||= new end |
.method_missing(meth, *args, &block) ⇒ Object
55 56 57 |
# File 'lib/rester/service.rb', line 55 def method_missing(meth, *args, &block) instance.public_send(meth, *args, &block) end |
.resources(version_module) ⇒ Object
80 81 82 |
# File 'lib/rester/service.rb', line 80 def resources(version_module) (@__resources ||= {})[version_module] ||= _load_resources(version_module) end |
.service_name ⇒ Object
65 66 67 |
# File 'lib/rester/service.rb', line 65 def service_name @__name ||= (name && name.split('::').last) || 'Anonymous' end |
.use(klass, *args) ⇒ Object
Middleware DSL
32 33 34 |
# File 'lib/rester/service.rb', line 32 def use(klass, *args) _middleware << [klass, *args] end |
.version_module(version) ⇒ Object
69 70 71 |
# File 'lib/rester/service.rb', line 69 def version_module(version) (@__version_modules ||= {})[version.to_sym] ||= _load_version_module(version) end |
.versions ⇒ Object
59 60 61 62 63 |
# File 'lib/rester/service.rb', line 59 def versions @__versions ||= constants.map(&:to_s).select { |c| c.match(/^V\d{1,3}$/) }.map(&:downcase).map(&:to_sym) end |
Instance Method Details
#call(env) ⇒ Object
Call the service app directly.
Duplicates the instance before processing the request so individual requests can’t impact each other.
117 118 119 |
# File 'lib/rester/service.rb', line 117 def call(env) dup.call!(env) end |
#call!(env) ⇒ Object
Process the request.
Calls methods that may modify instance variables, so the instance should be dup’d beforehand.
126 127 128 |
# File 'lib/rester/service.rb', line 126 def call!(env) _process_request(Rester.request) end |
#name ⇒ Object
102 103 104 |
# File 'lib/rester/service.rb', line 102 def name self.class.service_name end |
#rack_call(env) ⇒ Object
To be called by Rack. Wraps the app in middleware.
108 109 110 |
# File 'lib/rester/service.rb', line 108 def rack_call(env) _rack_app.call(env) end |