Class: YARD::Server::Commands::Base Abstract
- Inherits:
-
Object
- Object
- YARD::Server::Commands::Base
- 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 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, {:myattr => '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.
Direct Known Subclasses
Basic Command and Adapter Options collapse
-
#adapter ⇒ Adapter
The server adapter.
-
#caching ⇒ Boolean
Whether to cache.
-
#command_options ⇒ Hash
The options passed to the command’s constructor.
Attributes Set Per Request collapse
-
#body ⇒ String
The response body.
-
#headers ⇒ Hash{String => String}
Response headers.
-
#path ⇒ String
The path after the command base URI.
-
#request ⇒ Rack::Request
Request object.
-
#status ⇒ Numeric
Status code.
Instance Method Summary collapse
-
#call(request) ⇒ Array(Numeric,Hash,Array<String>)
The main method called by a router with a request object.
-
#initialize(opts = {}) ⇒ Base
constructor
Creates a new command object, setting attributes named by keys in the options hash.
Abstract Methods collapse
-
#run ⇒ void
abstract
Subclass this method to implement a custom command.
Helper Methods collapse
-
#cache(data) ⇒ String
protected
Override this method to implement custom caching mechanisms for.
-
#not_found ⇒ void
protected
Sets the body and headers for a 404 response.
-
#redirect(url) ⇒ Object
protected
Sets the headers and status code for a redirection to a given URL.
-
#render(object = nil) ⇒ String
protected
Renders a specific object if provided, or a regular template rendering if object is not provided.
Constructor Details
#initialize(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.
75 76 77 78 79 80 |
# 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
Returns the server adapter.
41 42 43 |
# File 'lib/yard/server/commands/base.rb', line 41 def adapter @adapter end |
#body ⇒ String
Returns the response body. Defaults to empty string.
61 62 63 |
# File 'lib/yard/server/commands/base.rb', line 61 def body @body end |
#caching ⇒ Boolean
Returns whether to cache.
44 45 46 |
# File 'lib/yard/server/commands/base.rb', line 44 def caching @caching end |
#command_options ⇒ Hash
Returns the options passed to the command’s constructor.
38 39 40 |
# File 'lib/yard/server/commands/base.rb', line 38 def @command_options end |
#headers ⇒ Hash{String => String}
Returns response headers.
55 56 57 |
# File 'lib/yard/server/commands/base.rb', line 55 def headers @headers end |
#path ⇒ String
Returns the path after the command base URI.
52 53 54 |
# File 'lib/yard/server/commands/base.rb', line 52 def path @path end |
#request ⇒ Rack::Request
Returns request object.
49 50 51 |
# File 'lib/yard/server/commands/base.rb', line 49 def request @request end |
#status ⇒ Numeric
Returns status code. Defaults to 200 per request.
58 59 60 |
# File 'lib/yard/server/commands/base.rb', line 58 def status @status end |
Instance Method Details
#cache(data) ⇒ String (protected)
Override this method to implement custom caching mechanisms for
165 166 167 168 169 170 171 172 173 174 |
# File 'lib/yard/server/commands/base.rb', line 165 def cache(data) if caching && adapter.document_root path = File.join(adapter.document_root, request.path_info.sub(/\.html$/, '') + '.html') path = path.sub(%r{/\.html$}, '.html') FileUtils.mkdir_p(File.dirname(path)) log.debug "Caching data to #{path}" File.open(path, 'wb') {|f| f.write(data) } end self.body = data end |
#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.
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# 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 |
#not_found ⇒ void (protected)
This method returns an undefined value.
Sets the body and headers for a 404 response. Does not modify the body if already set.
180 181 182 183 184 185 186 187 |
# File 'lib/yard/server/commands/base.rb', line 180 def not_found self.status = 404 return unless body.empty? self.body = "Not found: #{request.path}" headers['Content-Type'] = 'text/plain' headers['X-Cascade'] = 'pass' headers.delete('Cache-Control') end |
#redirect(url) ⇒ Object (protected)
Sets the headers and status code for a redirection to a given URL
192 193 194 195 196 |
# File 'lib/yard/server/commands/base.rb', line 192 def redirect(url) headers['Location'] = url self.status = 302 raise FinishRequest end |
#render(object = nil) ⇒ String (protected)
This method is dependent on #options
, it should be in LibraryCommand.
Renders a specific object if provided, or a regular template rendering if object is not provided.
144 145 146 147 148 149 150 151 152 153 |
# File 'lib/yard/server/commands/base.rb', line 144 def render(object = nil) case object when CodeObjects::Base cache object.format() when nil cache Templates::Engine.render() else cache object end end |
#run ⇒ void
128 129 130 |
# File 'lib/yard/server/commands/base.rb', line 128 def run raise NotImplementedError end |