Class: YARD::Server::Commands::Base Abstract
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
Inherits: | Object |
Defined in: | lib/yard/server/commands/base.rb |
Overview
This is the base command class used to implement custom commands for
a server. A command will be routed to by the ::YARD::Server::Router
class and return
a Rack-style response.
Attribute Initializers
All attributes can be initialized via options passed into the #initialize
method. When creating a custom command, the Adapter#options will
automatically be mapped to attributes by the same name on your class.
class MyCommand < Base attr_accessor :myattr end
Adapter.new(libs, => 'foo'
).start
# when a request comes in, cmd.myattr == 'foo'
Subclassing Notes
To implement a custom command, override the #run method, not #call. In your implementation, you should set the body and status for requests. See details in the #run method documentation.
Note that if your command deals directly with libraries, you should
consider subclassing the more specific LibraryCommand
class instead.
Basic Command and Adapter Options
Attributes Set Per Request
Instance Method Summary
-
#call(request) ⇒ Array(Numeric,Hash,Array<String>)
The main method called by a router with a request object.
-
.new(opts = {}) ⇒ Base
constructor
Creates a new command object, setting attributes named by keys in the options hash.
Abstract Methods
-
#run ⇒ void
abstract
Subclass this method to implement a custom command.
Helper Methods
-
#add_cache_control
private
Add a conservative cache control policy to reduce load on requests served with "?1234567890" style timestamp query strings.
Constructor Details
.new(opts = {}) ⇒ Base
Creates a new command object, setting attributes named by keys in the options hash. After initialization, the options hash is saved in #command_options for further inspection.
# File 'lib/yard/server/commands/base.rb', line 75
def initialize(opts = {}) opts.each do |key, value| send("#{key}=", value) if respond_to?("#{key}=") end self. = opts end
Instance Attribute Details
#adapter ⇒ Adapter (rw)
# File 'lib/yard/server/commands/base.rb', line 41
attr_accessor :adapter
#body ⇒ String (rw)
# File 'lib/yard/server/commands/base.rb', line 61
attr_accessor :body
#caching ⇒ Boolean
(rw)
# File 'lib/yard/server/commands/base.rb', line 44
attr_accessor :caching
#command_options ⇒ Hash (rw)
# File 'lib/yard/server/commands/base.rb', line 38
attr_accessor :
#headers ⇒ Hash{String => String} (rw)
# File 'lib/yard/server/commands/base.rb', line 55
attr_accessor :headers
#path ⇒ String (rw)
# File 'lib/yard/server/commands/base.rb', line 52
attr_accessor :path
#request ⇒ Rack::Request (rw)
# File 'lib/yard/server/commands/base.rb', line 49
attr_accessor :request
#status ⇒ Numeric
(rw)
# File 'lib/yard/server/commands/base.rb', line 58
attr_accessor :status
Instance Method Details
#add_cache_control (private)
Add a conservative cache control policy to reduce load on requests served with "?1234567890" style timestamp query strings.
#call(request) ⇒ Array(Numeric
,Hash,Array<String>)
This command should not be overridden by subclasses. Implement the callback method #run instead.
The main method called by a router with a request object.
# File 'lib/yard/server/commands/base.rb', line 89
def call(request) self.request = request self.path ||= request.path_info[1..-1] self.headers = {'Content-Type' => 'text/html'} self.body = '' self.status = 200 add_cache_control begin run rescue FinishRequest nil # noop rescue NotFoundError => e self.body = e. if e. != e.class.to_s not_found end # keep this to support commands setting status manually. not_found if status == 404 [status, headers, body.is_a?(Array) ? body : [body]] end
#run ⇒ void
# File 'lib/yard/server/commands/base.rb', line 128
def run raise NotImplementedError end