Class: Rester::Service
- Inherits:
-
Object
- Object
- Rester::Service
- Defined in:
- lib/rester/service.rb,
lib/rester/service/request.rb,
lib/rester/service/resource.rb
Defined Under Namespace
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::ErrorHandling, Middleware::Ping ].freeze
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
-
.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.
-
#rack_call(env) ⇒ Object
To be called by Rack.
Class Method Details
._load_resources(version_module) ⇒ Object
75 76 77 78 79 80 81 |
# File 'lib/rester/service.rb', line 75 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
64 65 66 67 68 69 |
# File 'lib/rester/service.rb', line 64 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
31 32 33 |
# File 'lib/rester/service.rb', line 31 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.
46 47 48 |
# File 'lib/rester/service.rb', line 46 def call(env) instance.rack_call(env) end |
.instance ⇒ Object
40 41 42 |
# File 'lib/rester/service.rb', line 40 def instance @instance ||= new end |
.method_missing(meth, *args, &block) ⇒ Object
50 51 52 |
# File 'lib/rester/service.rb', line 50 def method_missing(meth, *args, &block) instance.public_send(meth, *args, &block) end |
.resources(version_module) ⇒ Object
71 72 73 |
# File 'lib/rester/service.rb', line 71 def resources(version_module) (@__resources ||= {})[version_module] ||= _load_resources(version_module) end |
.use(klass, *args) ⇒ Object
Middleware DSL
27 28 29 |
# File 'lib/rester/service.rb', line 27 def use(klass, *args) _middleware << [klass, *args] end |
.version_module(version) ⇒ Object
60 61 62 |
# File 'lib/rester/service.rb', line 60 def version_module(version) (@__version_modules ||= {})[version.to_sym] ||= _load_version_module(version) end |
.versions ⇒ Object
54 55 56 57 58 |
# File 'lib/rester/service.rb', line 54 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.
95 96 97 |
# File 'lib/rester/service.rb', line 95 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.
104 105 106 |
# File 'lib/rester/service.rb', line 104 def call!(env) _process_request(Request.new(env)) end |
#rack_call(env) ⇒ Object
To be called by Rack. Wraps the app in middleware.
86 87 88 |
# File 'lib/rester/service.rb', line 86 def rack_call(env) _rack_app.call(env) end |