From 6a46d698104f85d7cdb16b71245cd5dcaa7cfc6a Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Fri, 7 Nov 2008 02:49:02 -0500 Subject: [PATCH] Add API level to many methods --- merb-core/lib/merb-core.rb | 7 +- merb-core/lib/merb-core/bootloader.rb | 4 ++ merb-core/lib/merb-core/config.rb | 5 ++ .../controller/abstract_controller.rb | 18 ++--- .../lib/merb-core/controller/exceptions.rb | 5 ++ .../merb-core/controller/merb_controller.rb | 2 + .../controller/mixins/authentication.rb | 3 + .../lib/merb-core/controller/template.rb | 4 +- merb-core/lib/merb-core/core_ext/kernel.rb | 1 + merb-core/lib/merb-core/dispatch/cookies.rb | 13 ++++ .../default_exception/default_exception.rb | 13 +++- .../lib/merb-core/dispatch/dispatcher.rb | 1 + merb-core/lib/merb-core/dispatch/request.rb | 8 ++- .../merb-core/dispatch/router/cached_proc.rb | 12 ++++ .../merb-core/dispatch/router/resources.rb | 10 +-- .../lib/merb-core/dispatch/router/route.rb | 67 +++++++++++++++++-- merb-core/lib/merb-core/dispatch/session.rb | 6 ++ .../merb-core/dispatch/session/container.rb | 2 + .../lib/merb-core/dispatch/session/cookie.rb | 1 + .../merb-core/dispatch/session/memcached.rb | 2 + .../lib/merb-core/dispatch/session/memory.rb | 2 + .../dispatch/session/store_container.rb | 1 + merb-core/lib/merb-core/dispatch/worker.rb | 1 + merb-core/lib/merb-core/gem_ext/erubis.rb | 2 + merb-core/lib/merb-core/logger.rb | 2 + merb-core/lib/merb-core/rack/adapter.rb | 4 ++ merb-core/lib/merb-core/rack/adapter/ebb.rb | 4 +- .../merb-core/rack/adapter/evented_mongrel.rb | 1 + merb-core/lib/merb-core/rack/adapter/fcgi.rb | 2 + merb-core/lib/merb-core/rack/adapter/irb.rb | 9 +++ .../lib/merb-core/rack/adapter/mongrel.rb | 5 +- .../lib/merb-core/rack/adapter/runner.rb | 2 + .../rack/adapter/swiftiplied_mongrel.rb | 1 + merb-core/lib/merb-core/rack/adapter/thin.rb | 3 + .../lib/merb-core/rack/adapter/thin_turbo.rb | 1 + .../lib/merb-core/rack/adapter/webrick.rb | 40 ++--------- .../lib/merb-core/rack/handler/mongrel.rb | 7 ++ merb-core/lib/merb-core/rack/middleware.rb | 8 ++- .../rack/middleware/conditional_get.rb | 3 + .../rack/middleware/content_length.rb | 2 + .../merb-core/rack/middleware/path_prefix.rb | 4 ++ .../lib/merb-core/rack/middleware/profiler.rb | 2 + .../lib/merb-core/rack/middleware/static.rb | 8 ++- .../lib/merb-core/rack/middleware/tracer.rb | 1 + .../lib/merb-core/rack/stream_wrapper.rb | 65 +++++++++--------- merb-core/lib/merb-core/server.rb | 1 + .../lib/merb-core/test/helpers/cookie_jar.rb | 16 ++++- 47 files changed, 286 insertions(+), 95 deletions(-) diff --git a/merb-core/lib/merb-core.rb b/merb-core/lib/merb-core.rb index be860bb6..6176d1dc 100644 --- a/merb-core/lib/merb-core.rb +++ b/merb-core/lib/merb-core.rb @@ -194,9 +194,14 @@ def restart_environment(argv={}) start_environment(Merb::Config.to_hash.merge(argv)) end - attr_accessor :environment, :load_paths, :adapter, :environment_info, :started + # @api public + attr_accessor :environment, :adapter + # @api private + attr_accessor :load_paths, :environment_info, :started + # @api public alias :env :environment + # @api public alias :started? :started Merb.load_paths = Dictionary.new { [Merb.root] } unless Merb.load_paths.is_a?(Dictionary) diff --git a/merb-core/lib/merb-core/bootloader.rb b/merb-core/lib/merb-core/bootloader.rb index 1113d0bd..10273206 100644 --- a/merb-core/lib/merb-core/bootloader.rb +++ b/merb-core/lib/merb-core/bootloader.rb @@ -321,6 +321,8 @@ class << self # # ==== Returns # nil + # + # @api plugin def run $:.push Merb.root unless Merb.root == File.expand_path(Dir.pwd) build_framework @@ -1042,6 +1044,8 @@ def run # # ==== Returns # String:: The path to the router file if it exists, nil otherwise. + # + # @api private def router_file @router_file ||= begin if File.file?(router = Merb.dir_for(:router) / Merb.glob_for(:router)) diff --git a/merb-core/lib/merb-core/config.rb b/merb-core/lib/merb-core/config.rb index 78e40e31..845ba954 100644 --- a/merb-core/lib/merb-core/config.rb +++ b/merb-core/lib/merb-core/config.rb @@ -85,6 +85,8 @@ def [](key) # ==== Parameters # key:: The key to set the parameter for. # val:: The value of the parameter. + # + # @api public def []=(key, val) (@configuration ||= setup)[key] = val end @@ -111,6 +113,8 @@ def delete(key) # # ==== Returns # Object:: The value of the configuration parameter or the default. + # + # @api public def fetch(key, default) @configuration.fetch(key, default) end @@ -400,6 +404,7 @@ def parse_args(argv = ARGV) Merb::Config.setup(options) end + # @api private attr_accessor :configuration # Set configuration parameters from a code block, where each method diff --git a/merb-core/lib/merb-core/controller/abstract_controller.rb b/merb-core/lib/merb-core/controller/abstract_controller.rb index 6eefe832..d56b90d1 100644 --- a/merb-core/lib/merb-core/controller/abstract_controller.rb +++ b/merb-core/lib/merb-core/controller/abstract_controller.rb @@ -95,20 +95,20 @@ class Merb::AbstractController include Merb::RenderMixin include Merb::InlineTemplates - + class_inheritable_accessor :_layout, :_template_root, :template_roots class_inheritable_accessor :_before_filters, :_after_filters class_inheritable_accessor :_before_dispatch_callbacks, :_after_dispatch_callbacks cattr_accessor :_abstract_subclasses - #--- - # @api semipublic - attr_accessor :body - attr_accessor :action_name - attr_accessor :_benchmarks, :_thrown_content + # @api plugin + attr_accessor :body, :action_name, :_benchmarks + # @api private + attr_accessor :_thrown_content # Stub so content-type support in RenderMixin doesn't throw errors + # @api private attr_accessor :content_type FILTER_OPTIONS = [:only, :exclude, :if, :unless, :with] @@ -205,7 +205,7 @@ def self._reset_template_roots # Template roots as pairs of template root path and template location # method. # - # @api unknown + # @api plugin def self._template_roots self.template_roots || _reset_template_roots end @@ -215,7 +215,7 @@ def self._template_roots # Template roots as pairs of template root path and template location # method. # - # @api unknown + # @api plugin def self._template_roots=(roots) self.template_roots = roots end @@ -248,7 +248,7 @@ def self.inherited(klass) # ==== Parameters # *args:: The args are ignored in this class, but we need this so that subclassed initializes can have parameters # - # @overridable + # @api private def initialize(*args) @_benchmarks = {} @_caught_content = {} diff --git a/merb-core/lib/merb-core/controller/exceptions.rb b/merb-core/lib/merb-core/controller/exceptions.rb index d95ed99d..24bb02de 100644 --- a/merb-core/lib/merb-core/controller/exceptions.rb +++ b/merb-core/lib/merb-core/controller/exceptions.rb @@ -154,6 +154,9 @@ class Base < StandardError #:doc: # === Returns # Integer:: The status-code of the error. + # + # @overridable + # @api plugin def status; self.class.status; end alias :to_i :status @@ -338,6 +341,8 @@ class HTTPVersionNotSupported < Merb::ControllerExceptions::ServerError; sel # Required to show exceptions in the log file # # e:: The exception that a message is being generated for + # + # @api plugin def self.exception(e) "#{ e.message } - (#{ e.class })\n" << "#{(e.backtrace or []).join("\n")}" diff --git a/merb-core/lib/merb-core/controller/merb_controller.rb b/merb-core/lib/merb-core/controller/merb_controller.rb index 1ef778e0..b7ff0849 100644 --- a/merb-core/lib/merb-core/controller/merb_controller.rb +++ b/merb-core/lib/merb-core/controller/merb_controller.rb @@ -8,6 +8,7 @@ class Merb::Controller < Merb::AbstractController cattr_accessor :_subclasses self._subclasses = Set.new + # @api private def self.subclasses_list() _subclasses end include Merb::ResponderMixin @@ -195,6 +196,7 @@ def _dispatch(action=:index) self end + # @api public attr_reader :request, :headers # ==== Returns diff --git a/merb-core/lib/merb-core/controller/mixins/authentication.rb b/merb-core/lib/merb-core/controller/mixins/authentication.rb index 696e72b0..4e71be9b 100644 --- a/merb-core/lib/merb-core/controller/mixins/authentication.rb +++ b/merb-core/lib/merb-core/controller/mixins/authentication.rb @@ -101,6 +101,9 @@ def initialize(controller, realm = "Application", &authenticator) # # ==== Returns # Object:: False if basic auth is not provided, otherwise the return value of the authenticator block. + # + # @overridable + # @api public def authenticate(&authenticator) if @auth.provided? and @auth.basic? authenticator.call(*@auth.credentials) diff --git a/merb-core/lib/merb-core/controller/template.rb b/merb-core/lib/merb-core/controller/template.rb index d056c65a..b9c1b940 100644 --- a/merb-core/lib/merb-core/controller/template.rb +++ b/merb-core/lib/merb-core/controller/template.rb @@ -220,7 +220,7 @@ module Mixin #

Some Foo content!

# <% end %> # - # @private + # @api private def capture_erb(*args, &block) _old_buf, @_erb_buf = @_erb_buf, "" block.call(*args) @@ -229,7 +229,7 @@ def capture_erb(*args, &block) ret end - # @private + # @api private def concat_erb(string, binding) @_erb_buf << string end diff --git a/merb-core/lib/merb-core/core_ext/kernel.rb b/merb-core/lib/merb-core/core_ext/kernel.rb index 421ce728..ebb9482e 100644 --- a/merb-core/lib/merb-core/core_ext/kernel.rb +++ b/merb-core/lib/merb-core/core_ext/kernel.rb @@ -2,6 +2,7 @@ module Gem class Dependency + # @api private attr_accessor :require_block, :require_as end end diff --git a/merb-core/lib/merb-core/dispatch/cookies.rb b/merb-core/lib/merb-core/dispatch/cookies.rb index 17d784cd..b488f860 100644 --- a/merb-core/lib/merb-core/dispatch/cookies.rb +++ b/merb-core/lib/merb-core/dispatch/cookies.rb @@ -2,6 +2,7 @@ module Merb class Cookies < Mash + # @api private def initialize(constructor = {}) @_options_lookup = Mash.new @_cookie_defaults = { "domain" => Merb::Controller._default_cookie_domain, "path" => '/' } @@ -17,6 +18,8 @@ def initialize(constructor = {}) # ==== Notes # By using this method, a cookie key is marked for being # included in the Set-Cookie response header. + # + # @api public def []=(key, value) @_options_lookup[key] ||= {} super @@ -38,6 +41,8 @@ def []=(key, value) # ==== Notes # By using this method, a cookie key is marked for being # included in the Set-Cookie response header. + # + # @api private def set_cookie(name, value, options = {}) @_options_lookup[name] = options self[name] = value @@ -49,6 +54,8 @@ def set_cookie(name, value, options = {}) # ==== Parameters # name<~to_s>:: Name of the cookie to delete. # options:: Additional options to pass to +set_cookie+. + # + # @api public def delete(name, options = {}) set_cookie(name, "", options.merge("expires" => Time.at(0))) end @@ -57,6 +64,8 @@ def delete(name, options = {}) # # ==== Returns # Hash:: The headers to set, or an empty array if no cookies are set. + # + # @api private def extract_headers(controller_defaults = {}) defaults = @_cookie_defaults.merge(controller_defaults) cookies = [] @@ -101,6 +110,8 @@ def self.included(base) # ==== Notes # Headers are passed into the cookie object so that you can do: # cookies[:foo] = "bar" + # + # @api public def cookies request.cookies end @@ -114,6 +125,8 @@ module RequestMixin # If a method #default_cookies is defined it will be called. This can # be used for session fixation purposes for example. The method returns # a Hash of key => value pairs. + # + # @api public def cookies @cookies ||= begin values = Merb::Parse.query(@env[Merb::Const::HTTP_COOKIE], ';,') diff --git a/merb-core/lib/merb-core/dispatch/default_exception/default_exception.rb b/merb-core/lib/merb-core/dispatch/default_exception/default_exception.rb index 72257b2f..e38ce40a 100644 --- a/merb-core/lib/merb-core/dispatch/default_exception/default_exception.rb +++ b/merb-core/lib/merb-core/dispatch/default_exception/default_exception.rb @@ -1,10 +1,14 @@ module Merb class Dispatcher + # @api private module DefaultExceptionHelper + + # @api private def humanize_exception(e) e.class.name.split("::").last.gsub(/([a-z])([A-Z])/, '\1 \2') end + # @api private def error_codes(exception) if @show_details message, message_details = exception.message.split("\n", 2) @@ -14,6 +18,7 @@ def error_codes(exception) end end + # @api private def frame_details(line) filename, lineno, location = line.split(":") if filename.index(Merb.framework_root) @@ -32,6 +37,7 @@ def frame_details(line) [type, shortname, filename, lineno, location] end + # @api private def listing(key, value, arr) ret = [] ret << "" @@ -51,10 +57,12 @@ def listing(key, value, arr) ret.join("\n") end + # @api private def textmate_url(filename, line) "#{line}" end + # @api private def render_source(filename, line) line = line.to_i ret = [] @@ -76,13 +84,16 @@ def render_source(filename, line) end end + # @api private class DefaultException < Merb::Controller self._template_root = File.dirname(__FILE__) / "views" + # @api private def _template_location(context, type = nil, controller = controller_name) "#{context}.#{type}" - end + end + # @api private def index @exceptions = request.exceptions @show_details = Merb::Config[:exception_details] diff --git a/merb-core/lib/merb-core/dispatch/dispatcher.rb b/merb-core/lib/merb-core/dispatch/dispatcher.rb index 46dec12a..50b4a862 100644 --- a/merb-core/lib/merb-core/dispatch/dispatcher.rb +++ b/merb-core/lib/merb-core/dispatch/dispatcher.rb @@ -5,6 +5,7 @@ class Dispatcher class << self include Merb::ControllerExceptions + # @api private attr_accessor :use_mutex @@work_queue = Queue.new diff --git a/merb-core/lib/merb-core/dispatch/request.rb b/merb-core/lib/merb-core/dispatch/request.rb index a3667cae..f989c665 100644 --- a/merb-core/lib/merb-core/dispatch/request.rb +++ b/merb-core/lib/merb-core/dispatch/request.rb @@ -3,8 +3,12 @@ module Merb class Request - # def env def exceptions def route_params - attr_accessor :env, :exceptions, :route + + # @api private + attr_accessor :env, :route + # @api public + attr_accessor :exceptions + # @api private attr_reader :route_params # by setting these to false, auto-parsing is disabled; this way you can diff --git a/merb-core/lib/merb-core/dispatch/router/cached_proc.rb b/merb-core/lib/merb-core/dispatch/router/cached_proc.rb index a290e1ed..b5f99c51 100644 --- a/merb-core/lib/merb-core/dispatch/router/cached_proc.rb +++ b/merb-core/lib/merb-core/dispatch/router/cached_proc.rb @@ -2,20 +2,26 @@ module Merb class Router # Cache procs for future reference in eval statement + # @api private class CachedProc @@index = 0 @@list = [] + # @api private attr_accessor :cache, :index # ==== Parameters # cache:: The block of code to cache. + # + # @api private def initialize(cache) @cache, @index = cache, CachedProc.register(self) end # ==== Returns # String:: The CachedProc object in a format embeddable within a string. + # + # @api private def to_s "CachedProc[#{@index}].cache" end @@ -27,6 +33,8 @@ class << self # # ==== Returns # Fixnum:: The index of the newly registered CachedProc. + # + # @api private def register(cached_code) CachedProc[@@index] = cached_code @@index += 1 @@ -38,6 +46,8 @@ def register(cached_code) # ==== Parameters # index:: The index of the cached code to set. # code:: The cached code to set. + # + # @api private def []=(index, code) @@list[index] = code end # ==== Parameters @@ -45,6 +55,8 @@ def []=(index, code) @@list[index] = code end # # ==== Returns # CachedProc:: The cached code at index. + # + # @api private def [](index) @@list[index] end end end # CachedProc diff --git a/merb-core/lib/merb-core/dispatch/router/resources.rb b/merb-core/lib/merb-core/dispatch/router/resources.rb index 913a508a..fe801fe0 100644 --- a/merb-core/lib/merb-core/dispatch/router/resources.rb +++ b/merb-core/lib/merb-core/dispatch/router/resources.rb @@ -1,6 +1,6 @@ module Merb class Router - + module Resources # Behavior#+resources+ is a route helper for defining a collection of # RESTful resources. It yields to a block for child routes. @@ -271,7 +271,7 @@ def resource(name, *args, &block) protected - #api private + # @api private def register_resource(*key) options = extract_options_from_args!(key) || {} key = [ @options[:resource_prefix], key ].flatten.compact @@ -281,7 +281,7 @@ def register_resource(*key) self end - #api private + # @api private def resource_block(builders, &block) behavior = ResourceBehavior.new(builders, @proxy, @conditions, @params, @defaults, @identifiers, @options, @blocks) with_behavior_context(behavior, &block) @@ -301,14 +301,14 @@ class Behavior # Adding the collection and member methods to behavior class ResourceBehavior < Behavior #:nodoc: - #api private + # @api private def initialize(builders, *args) super(*args) @collection = builders[:collection] @member = builders[:member] end - #api private + # @api private def collection(action, options = {}) action = action.to_s method = options[:method] diff --git a/merb-core/lib/merb-core/dispatch/router/route.rb b/merb-core/lib/merb-core/dispatch/router/route.rb index 5dad8134..6674e427 100644 --- a/merb-core/lib/merb-core/dispatch/router/route.rb +++ b/merb-core/lib/merb-core/dispatch/router/route.rb @@ -10,10 +10,14 @@ class Route #:nodoc: JUST_BRACKETS = /\[(\d+)\]/ SEGMENT_CHARACTERS = "[^\/.,;?]".freeze + # @api private attr_reader :conditions, :params, :segments + # @api private attr_reader :index, :variables, :name + # @api private attr_accessor :fixation, :resource_identifiers + # @api private def initialize(conditions, params, deferred_procs, options = {}) @conditions, @params = conditions, params @@ -35,18 +39,22 @@ def initialize(conditions, params, deferred_procs, options = {}) compile end + # @api private def regexp? @regexp end - + + # @api private def generatable? @generatable && !regexp? end + # @api private def allow_fixation? @fixation end + # @api private def to_s regexp? ? "/#{conditions[:path].source}/" : @@ -56,6 +64,8 @@ def to_s alias_method :inspect, :to_s # Appends self to Merb::Router.routes + + # @api private def register @index = Merb::Router.routes.size Merb::Router.routes << self @@ -63,6 +73,7 @@ def register end # Inserts self to Merb::Router.routes at the specified index. + # @api private def register_at(index) @index = index Merb::Router.routes.insert(index, self) @@ -71,11 +82,13 @@ def register_at(index) # Sets the route as a resource route with the given key as the # lookup key. + # @api private def resource=(key) Router.resource_routes[key] = self key end + # @api private def name=(name) @name = name.to_sym Router.named_routes[@name] = self @@ -102,6 +115,8 @@ def name=(name) # # ==== Returns # String:: The generated URL. + # + # @api private def generate(args = [], defaults = {}, resource = false) unless generatable? raise GenerationError, "Cannot generate regexp Routes" if regexp? @@ -144,6 +159,8 @@ def generate(args = [], defaults = {}, resource = false) # # param_keys that end in _id are treated slightly differently in order # to get nested resources to work correctly. + # + # @api private def identify(obj, param_key = nil) identifier = identifier_for(obj) if identifier.is_a?(Array) @@ -161,6 +178,8 @@ def identify(obj, param_key = nil) # Returns the identifier for the passed object. Built in core ruby classes are # always identified with to_s. The method will return nil in that case (since # to_s is the default for objects that do not have identifiers.) + # + # @api private def identifier_for(obj) return if obj.is_a?(String) || obj.is_a?(Symbol) || obj.is_a?(Numeric) || obj.is_a?(TrueClass) || obj.is_a?(FalseClass) || obj.is_a?(NilClass) || @@ -175,6 +194,8 @@ def identifier_for(obj) # Returns the if statement and return value for for the main # Router.match compiled method. + # + # @api private def compiled_statement(first) els_if = first ? ' if ' : ' elsif ' @@ -197,6 +218,7 @@ def compiled_statement(first) # === Compilation === + # @api private def compile compile_conditions compile_params @@ -206,7 +228,8 @@ def compile # The Generator class handles compiling the route down to a lambda that # can generate the URL from a params hash and a default params hash. class Generator #:nodoc: - + + # @api private def initialize(segments, symbol_conditions, identifiers) @segments = segments @symbol_conditions = symbol_conditions @@ -216,6 +239,8 @@ def initialize(segments, symbol_conditions, identifiers) @opt_segment_stack = [[]] end + # + # @api private def compiled ruby = "" ruby << "lambda do |params, defaults|\n" @@ -242,6 +267,8 @@ def compiled # Cleans up methods a bunch. We don't need to pass the current segment # level around everywhere anymore. It's kept track for us in the stack. + # + # @api private def with(segments, &block) @stack.push(segments) retval = yield @@ -249,22 +276,27 @@ def with(segments, &block) retval end + # @api private def segments @stack.last || [] end - + + # @api private def symbol_segments segments.flatten.select { |s| s.is_a?(Symbol) } end - + + # @api private def current_segments segments.select { |s| s.is_a?(Symbol) } end - + + # @api private def nested_segments segments.select { |s| s.is_a?(Array) }.flatten.select { |s| s.is_a?(Symbol) } end - + + # @api private def block_for_level ruby = "" ruby << "if #{segment_level_matches_conditions}\n" @@ -273,7 +305,8 @@ def block_for_level ruby << %{ "#{combine_required_and_optional_segments}"\n} ruby << "end" end - + + # @api private def check_if_defaults_should_be_included ruby = "" ruby << "include_defaults = " @@ -282,6 +315,7 @@ def check_if_defaults_should_be_included end # --- Not so pretty --- + # @api private def segment_level_matches_conditions conditions = current_segments.map do |segment| condition = "(cached_#{segment} = params[#{segment.inspect}] || include_defaults && defaults[#{segment.inspect}])" @@ -299,10 +333,12 @@ def segment_level_matches_conditions conditions.join(" && ") end + # @api private def remove_used_segments_in_query_path "#{current_segments.inspect}.each { |s| query_params.delete(s) }" end + # @api private def generate_optional_segments optionals = [] @@ -321,6 +357,7 @@ def generate_optional_segments optionals.join("\n") end + # @api private def combine_required_and_optional_segments bits = "" @@ -340,6 +377,7 @@ def combine_required_and_optional_segments # === Conditions === + # @api private def compile_conditions @original_conditions = conditions.dup @@ -360,6 +398,8 @@ def compile_conditions # to concat all the parts together, then parse the path and extract the # variables. However, if any of the parts are a regular expression, then # we abort the parsing and just convert it to a regexp. + # + # @api private def compile_path(path) @segments = [] compiled = "" @@ -397,6 +437,8 @@ def compile_path(path) end # Simple nested parenthesis parser + # + # @api private def segments_with_optionals_from_string(path, nest_level = 0) segments = [] @@ -425,6 +467,7 @@ def segments_with_optionals_from_string(path, nest_level = 0) segments end + # @api private def segments_from_string(path) segments = [] @@ -441,6 +484,7 @@ def segments_from_string(path) end # --- Yeah, this could probably be refactored + # @api private def compile_path_segments(compiled, segments) segments.each do |segment| case segment @@ -463,6 +507,7 @@ def compile_path_segments(compiled, segments) end # Handles anchors in Regexp conditions + # @api private def compile_segment_condition(condition) return "(#{SEGMENT_CHARACTERS}+)" unless condition return "(#{condition})" unless condition.is_a?(Regexp) @@ -484,6 +529,7 @@ def compile_segment_condition(condition) "(#{condition})" end + # @api private def compile_params # Loop through each param and compile it @defaults.merge(@params).each do |key, value| @@ -498,6 +544,7 @@ def compile_params end # This was pretty much a copy / paste from the old router + # @api private def compile_param(value) result = [] match = true @@ -531,6 +578,7 @@ def compile_param(value) result.join(' + ').gsub("\\_", "_") end + # @api private def condition_statements statements = [] @@ -576,6 +624,7 @@ def condition_statements end # (request.matched? || ((block_result = process(proc.call)))) + # @api private def deferred_condition_statement(deferred) if current = deferred.first html = " && (request.matched? || (" @@ -589,6 +638,7 @@ def deferred_condition_statement(deferred) end end + # @api private def params_as_string elements = params.keys.map do |k| "#{k.inspect} => #{params[k]}" @@ -598,6 +648,7 @@ def params_as_string # ---------- Utilities ---------- + # @api private def arrays_to_regexps(condition) return condition unless condition.is_a?(Array) @@ -613,6 +664,7 @@ def arrays_to_regexps(condition) Regexp.compile(source.join('|')) end + # @api private def segment_level_to_s(segments) (segments || []).inject('') do |str, seg| str << case seg @@ -623,6 +675,7 @@ def segment_level_to_s(segments) end end + # @api private def capturing_parentheses_count(regexp) regexp = regexp.source if regexp.is_a?(Regexp) regexp.scan(/(?!\\)[(](?!\?[#=:!>-imx])/).length diff --git a/merb-core/lib/merb-core/dispatch/session.rb b/merb-core/lib/merb-core/dispatch/session.rb index cb722993..0a485dfd 100644 --- a/merb-core/lib/merb-core/dispatch/session.rb +++ b/merb-core/lib/merb-core/dispatch/session.rb @@ -61,6 +61,8 @@ def self.included(base) # # ==== Returns # SessionContainer:: The session that was extracted from the request object. + # + # @api public def session(session_store = nil) request.session(session_store) end @@ -69,6 +71,8 @@ def session(session_store = nil) # ==== Returns # String:: A random 32 character string for use as a unique session ID. + # + # @api private def rand_uuid values = [ rand(0x0010000), @@ -106,6 +110,8 @@ module RequestMixin # Adds class methods to Merb::Request object. # Sets up repository of session store types. # Sets the session ID key and expiry values. + # + # @api private def self.included(base) base.extend ClassMethods diff --git a/merb-core/lib/merb-core/dispatch/session/container.rb b/merb-core/lib/merb-core/dispatch/session/container.rb index 82fc0966..72598333 100644 --- a/merb-core/lib/merb-core/dispatch/session/container.rb +++ b/merb-core/lib/merb-core/dispatch/session/container.rb @@ -5,7 +5,9 @@ class SessionContainer < Mash cattr_accessor :subclasses self.subclasses = [] + # @api private attr_reader :session_id + # @api private attr_accessor :needs_new_cookie class << self diff --git a/merb-core/lib/merb-core/dispatch/session/cookie.rb b/merb-core/lib/merb-core/dispatch/session/cookie.rb index 534f6b66..0a2d4c5d 100644 --- a/merb-core/lib/merb-core/dispatch/session/cookie.rb +++ b/merb-core/lib/merb-core/dispatch/session/cookie.rb @@ -30,6 +30,7 @@ class TamperedWithCookie < StandardError; end MAX = 4096 DIGEST = OpenSSL::Digest::Digest.new('SHA1') # or MD5, RIPEMD160, SHA256? + # @api private attr_accessor :_original_session_data # The session store type diff --git a/merb-core/lib/merb-core/dispatch/session/memcached.rb b/merb-core/lib/merb-core/dispatch/session/memcached.rb index b7fa9f8b..5ac95049 100644 --- a/merb-core/lib/merb-core/dispatch/session/memcached.rb +++ b/merb-core/lib/merb-core/dispatch/session/memcached.rb @@ -53,6 +53,8 @@ def store_session(session_id, data) # ==== Parameters # session_id:: ID of the session to delete. + # + # @api private def delete_session(session_id) delete("session:#{session_id}") end diff --git a/merb-core/lib/merb-core/dispatch/session/memory.rb b/merb-core/lib/merb-core/dispatch/session/memory.rb index 6f49d627..491cb30e 100644 --- a/merb-core/lib/merb-core/dispatch/session/memory.rb +++ b/merb-core/lib/merb-core/dispatch/session/memory.rb @@ -21,11 +21,13 @@ class MemorySession < SessionStoreContainer self.session_store_type = :memory # Bypass normal implicit class attribute reader - see below. + # @api private def store self.class.store end # Lazy load/setup of MemorySessionStore. + # @api private def self.store @_store ||= MemorySessionStore.new(Merb::Config[:memory_session_ttl]) end diff --git a/merb-core/lib/merb-core/dispatch/session/store_container.rb b/merb-core/lib/merb-core/dispatch/session/store_container.rb index 404d2aa0..faa5ceec 100644 --- a/merb-core/lib/merb-core/dispatch/session/store_container.rb +++ b/merb-core/lib/merb-core/dispatch/session/store_container.rb @@ -3,6 +3,7 @@ module Merb class SessionStoreContainer < SessionContainer class_inheritable_accessor :store + # @api private attr_accessor :_fingerprint # The class attribute :store holds a reference to an object that implements diff --git a/merb-core/lib/merb-core/dispatch/worker.rb b/merb-core/lib/merb-core/dispatch/worker.rb index f89f3e3b..04a06276 100644 --- a/merb-core/lib/merb-core/dispatch/worker.rb +++ b/merb-core/lib/merb-core/dispatch/worker.rb @@ -1,6 +1,7 @@ module Merb class Worker + # @api private attr_accessor :thread class << self diff --git a/merb-core/lib/merb-core/gem_ext/erubis.rb b/merb-core/lib/merb-core/gem_ext/erubis.rb index 22f712d5..85e39aea 100644 --- a/merb-core/lib/merb-core/gem_ext/erubis.rb +++ b/merb-core/lib/merb-core/gem_ext/erubis.rb @@ -75,6 +75,8 @@ class MEruby < Erubis::Eruby # binding:: # The binding to use when evaluating the ERB tags. Defaults to the current # binding. + # + # @api private def self.load_yaml_file(file, binding = binding) YAML::load(Erubis::MEruby.new(IO.read(File.expand_path(file))).result(binding)) end diff --git a/merb-core/lib/merb-core/logger.rb b/merb-core/lib/merb-core/logger.rb index fb6e3145..367eba4e 100755 --- a/merb-core/lib/merb-core/logger.rb +++ b/merb-core/lib/merb-core/logger.rb @@ -1,10 +1,12 @@ # Merb::Logger = Extlib::Logger class Merb::Logger < Extlib::Logger + # @api public def verbose!(message, level = :warn) send("#{level}!", message) if Merb::Config[:verbose] end + # @api public def verbose(message, level = :warn) send(level, message) if Merb::Config[:verbose] end diff --git a/merb-core/lib/merb-core/rack/adapter.rb b/merb-core/lib/merb-core/rack/adapter.rb index bf7aa7db..75e6953c 100644 --- a/merb-core/lib/merb-core/rack/adapter.rb +++ b/merb-core/lib/merb-core/rack/adapter.rb @@ -11,6 +11,8 @@ class << self # # ==== Returns. # Class:: The adapter class. + # + # @api private def get(id) if @adapters[id.to_s] Object.full_const_get(@adapters[id.to_s]) @@ -24,6 +26,8 @@ def get(id) # ==== Parameters # ids:: Identifiers by which this adapter is recognized by. # adapter_class:: The Rack adapter class. + # + # @api plugin def register(ids, adapter_class) @adapters ||= Hash.new ids.each { |id| @adapters[id] = "Merb::Rack::#{adapter_class}" } diff --git a/merb-core/lib/merb-core/rack/adapter/ebb.rb b/merb-core/lib/merb-core/rack/adapter/ebb.rb index 219b3fd3..69a296d0 100644 --- a/merb-core/lib/merb-core/rack/adapter/ebb.rb +++ b/merb-core/lib/merb-core/rack/adapter/ebb.rb @@ -5,17 +5,19 @@ module Rack class Ebb < Merb::Rack::AbstractAdapter # start an Ebb server on given host and port. - + # @api plugin def self.new_server(port) Merb::Dispatcher.use_mutex = false opts = @opts.merge(:port => port) @th = Thread.new { Thread.current[:server] = ::Ebb.start_server(opts[:app], opts) } end + # @api plugin def self.start_server @th.join end + # @api plugin def self.stop(status = 0) ::Ebb.stop_server end diff --git a/merb-core/lib/merb-core/rack/adapter/evented_mongrel.rb b/merb-core/lib/merb-core/rack/adapter/evented_mongrel.rb index 27129803..b41f8467 100644 --- a/merb-core/lib/merb-core/rack/adapter/evented_mongrel.rb +++ b/merb-core/lib/merb-core/rack/adapter/evented_mongrel.rb @@ -4,6 +4,7 @@ module Merb module Rack class EventedMongrel < Mongrel + # @api plugin def self.new_server(port) Merb::Dispatcher.use_mutex = false super diff --git a/merb-core/lib/merb-core/rack/adapter/fcgi.rb b/merb-core/lib/merb-core/rack/adapter/fcgi.rb index 032b149c..eb54c5f2 100644 --- a/merb-core/lib/merb-core/rack/adapter/fcgi.rb +++ b/merb-core/lib/merb-core/rack/adapter/fcgi.rb @@ -7,6 +7,8 @@ class FastCGI # # ==== Options (opts) # :app>:: The application name. + # + # @api plugin def self.start(opts={}) Merb.logger.warn!("Using FastCGI adapter") Merb::Server.change_privilege diff --git a/merb-core/lib/merb-core/rack/adapter/irb.rb b/merb-core/lib/merb-core/rack/adapter/irb.rb index 4d220556..d383a81f 100644 --- a/merb-core/lib/merb-core/rack/adapter/irb.rb +++ b/merb-core/lib/merb-core/rack/adapter/irb.rb @@ -61,11 +61,13 @@ def url(name, *args) end # Reloads classes using Merb::BootLoader::ReloadClasses. + # @api public def reload! Merb::BootLoader::ReloadClasses.reload end # Prints all routes for the application. + # @api public def show_routes seen = [] unless Merb::Router.named_routes.empty? @@ -96,6 +98,7 @@ def show_routes # # An ORM should implement Merb::Orms::MyOrm#open_sandbox! to support this. # Usually this involves starting a transaction. + # @api public def open_sandbox! puts "Loading #{Merb.environment} environment in sandbox (Merb #{Merb::VERSION})" puts "Any modifications you make will be rolled back on exit" @@ -106,12 +109,14 @@ def open_sandbox! # # An ORM should implement Merb::Orms::MyOrm#close_sandbox! to support this. # Usually this involves rolling back a transaction. + # @api public def close_sandbox! orm_modules.each { |orm| orm.close_sandbox! if orm.respond_to?(:close_sandbox!) } puts "Modifications have been rolled back" end # Explictly show logger output during IRB session + # @api public def trace_log! Merb.logger.auto_flush = true end @@ -120,6 +125,7 @@ def trace_log! # ==== Returns # Array:: All Merb::Orms::* modules. + # @api private def orm_modules if Merb.const_defined?('Orms') Merb::Orms.constants.map { |c| Merb::Orms::const_get(c) } @@ -138,6 +144,8 @@ class Irb # ==== Notes # If the +.irbrc+ file exists, it will be loaded into the IRBRC # environment variable. + # + # @api plugin def self.start(opts={}) m = Merb::Rack::Console.new m.extend Merb::Test::RequestHelper @@ -156,6 +164,7 @@ def self.start(opts={}) private + # @api private def self.sandboxed? Merb::Config[:sandbox] end diff --git a/merb-core/lib/merb-core/rack/adapter/mongrel.rb b/merb-core/lib/merb-core/rack/adapter/mongrel.rb index 553f439d..e0fb11ab 100644 --- a/merb-core/lib/merb-core/rack/adapter/mongrel.rb +++ b/merb-core/lib/merb-core/rack/adapter/mongrel.rb @@ -14,6 +14,7 @@ module Rack class Mongrel < Merb::Rack::AbstractAdapter + # @api plugin def self.stop(status = 0) if @server begin @@ -25,11 +26,13 @@ def self.stop(status = 0) true end end - + + # @api plugin def self.new_server(port) @server = ::Mongrel::HttpServer.new(@opts[:host], port) end + # @api plugin def self.start_server @server.register('/', ::Merb::Rack::Handler::Mongrel.new(@opts[:app])) @server.run.join diff --git a/merb-core/lib/merb-core/rack/adapter/runner.rb b/merb-core/lib/merb-core/rack/adapter/runner.rb index 6f38d7a8..6b691a02 100644 --- a/merb-core/lib/merb-core/rack/adapter/runner.rb +++ b/merb-core/lib/merb-core/rack/adapter/runner.rb @@ -12,6 +12,8 @@ class Runner # ==== Notes # If opts[:runner_code] matches a filename, that file will be read and # the contents executed. Otherwise the code will be executed directly. + # + # @api plugin def self.start(opts={}) Merb::Server.change_privilege if opts[:runner_code] diff --git a/merb-core/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb b/merb-core/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb index bf181022..39e9a359 100644 --- a/merb-core/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb +++ b/merb-core/lib/merb-core/rack/adapter/swiftiplied_mongrel.rb @@ -4,6 +4,7 @@ module Merb module Rack class SwiftipliedMongrel < Mongrel + # @api plugin def self.new_server(port) Merb::Dispatcher.use_mutex = false super diff --git a/merb-core/lib/merb-core/rack/adapter/thin.rb b/merb-core/lib/merb-core/rack/adapter/thin.rb index 8cffacb2..d6ae8aa6 100644 --- a/merb-core/lib/merb-core/rack/adapter/thin.rb +++ b/merb-core/lib/merb-core/rack/adapter/thin.rb @@ -7,6 +7,7 @@ module Rack class Thin < Merb::Rack::AbstractAdapter # start a Thin server on given host and port. + # @api plugin def self.new_server(port) Merb::Dispatcher.use_mutex = false @@ -22,11 +23,13 @@ def self.new_server(port) end end + # @api plugin def self.start_server ::Thin::Logging.silent = true @server.start end + # @api plugin def self.stop(status = 0) if @server @server.stop diff --git a/merb-core/lib/merb-core/rack/adapter/thin_turbo.rb b/merb-core/lib/merb-core/rack/adapter/thin_turbo.rb index c162a632..5b42c5f2 100644 --- a/merb-core/lib/merb-core/rack/adapter/thin_turbo.rb +++ b/merb-core/lib/merb-core/rack/adapter/thin_turbo.rb @@ -7,6 +7,7 @@ module Rack class ThinTurbo < Thin # start a Thin Turbo server on given host and port. + # @api plugin def self.new_server(port) @opts.merge!(:backend => ::Thin::Backends::Turbo) super diff --git a/merb-core/lib/merb-core/rack/adapter/webrick.rb b/merb-core/lib/merb-core/rack/adapter/webrick.rb index 0b36792f..6009b6c3 100644 --- a/merb-core/lib/merb-core/rack/adapter/webrick.rb +++ b/merb-core/lib/merb-core/rack/adapter/webrick.rb @@ -7,9 +7,11 @@ module Rack class WEBrick < Merb::Rack::AbstractAdapter class << self + # @api private attr_accessor :server end - + + # @api plugin def self.new_server(port) options = { :Port => port, @@ -25,48 +27,20 @@ def self.new_server(port) @server = ::WEBrick::HTTPServer.new(options.merge(:DoNotListen => true)) @server.listeners.replace sockets end - + + # @api plugin def self.start_server @server.mount("/", ::Rack::Handler::WEBrick, @opts[:app]) @server.start exit(@status) end + # @api plugin def self.stop(status = 0) @status = status @server.shutdown end - - def self.exit_process(status = 0) - end - - # start WEBrick server on given host and port. - - # ==== Parameters - # opts:: Options for WEBrick (see below). - # - # ==== Options (opts) - # :host:: The hostname that WEBrick should serve. - # :port:: The port WEBrick should bind to. - # :app>:: The application name. - # def self.start(opts={}) - # Merb.logger.warn!("Using Webrick adapter") - # - # options = { - # :Port => opts[:port], - # :BindAddress => opts[:host], - # :Logger => Merb.logger, - # :AccessLog => [ - # [Merb.logger, ::WEBrick::AccessLog::COMMON_LOG_FORMAT], - # [Merb.logger, ::WEBrick::AccessLog::REFERER_LOG_FORMAT] - # ] - # } - # - # server = ::WEBrick::HTTPServer.new(options) - # Merb::Server.change_privilege - # server.mount("/", ::Rack::Handler::WEBrick, opts[:app]) - # server.start - # end + end end end \ No newline at end of file diff --git a/merb-core/lib/merb-core/rack/handler/mongrel.rb b/merb-core/lib/merb-core/rack/handler/mongrel.rb index 0a275fc4..6b4f74b6 100644 --- a/merb-core/lib/merb-core/rack/handler/mongrel.rb +++ b/merb-core/lib/merb-core/rack/handler/mongrel.rb @@ -31,6 +31,8 @@ class Mongrel < ::Mongrel::HttpHandler # :Host:: # The hostname on which the app should run. Defaults to "0.0.0.0" # :Port:: The port for the app. Defaults to 8080. + # + # @api plugin def self.run(app, options={}) @server = ::Mongrel::HttpServer.new(options[:Host] || '0.0.0.0', options[:Port] || 8080) @@ -39,12 +41,15 @@ def self.run(app, options={}) @server.run.join end + # @api private def self.stop(block = true) @server.stop end # ==== Parameters # app:: The app that Mongrel should handle. + # + # @api plugin def initialize(app) @app = app end @@ -52,6 +57,8 @@ def initialize(app) # ==== Parameters # request:: The HTTP request to handle. # response:: The response object to write response to. + # + # @api plugin def process(request, response) env = {}.replace(request.params) env.delete Merb::Const::HTTP_CONTENT_TYPE diff --git a/merb-core/lib/merb-core/rack/middleware.rb b/merb-core/lib/merb-core/rack/middleware.rb index 6de470e3..fcb1c9ad 100644 --- a/merb-core/lib/merb-core/rack/middleware.rb +++ b/merb-core/lib/merb-core/rack/middleware.rb @@ -2,14 +2,20 @@ module Merb module Rack class Middleware + # @overridable + # @api plugin def initialize(app) @app = app end - + + # @overridable + # @api plugin def deferred?(env) @app.deferred?(env) end + # @overridable + # @api plugin def call(env) @app.call(env) end diff --git a/merb-core/lib/merb-core/rack/middleware/conditional_get.rb b/merb-core/lib/merb-core/rack/middleware/conditional_get.rb index 7c2afd3f..9f93f792 100644 --- a/merb-core/lib/merb-core/rack/middleware/conditional_get.rb +++ b/merb-core/lib/merb-core/rack/middleware/conditional_get.rb @@ -2,6 +2,8 @@ module Merb module Rack class ConditionalGet < Merb::Rack::Middleware + + # @api plugin def call(env) status, headers, body = @app.call(env) @@ -16,6 +18,7 @@ def call(env) end private + # @api private def document_not_modified?(env, headers) if etag = headers[Merb::Const::ETAG] etag == env[Merb::Const::HTTP_IF_NONE_MATCH] diff --git a/merb-core/lib/merb-core/rack/middleware/content_length.rb b/merb-core/lib/merb-core/rack/middleware/content_length.rb index 151b9463..985d34eb 100644 --- a/merb-core/lib/merb-core/rack/middleware/content_length.rb +++ b/merb-core/lib/merb-core/rack/middleware/content_length.rb @@ -2,6 +2,8 @@ module Merb module Rack class ContentLength < Merb::Rack::Middleware + + # @api plugin def call(env) status, headers, body = @app.call(env) diff --git a/merb-core/lib/merb-core/rack/middleware/path_prefix.rb b/merb-core/lib/merb-core/rack/middleware/path_prefix.rb index 1a9b49c9..32ea048d 100644 --- a/merb-core/lib/merb-core/rack/middleware/path_prefix.rb +++ b/merb-core/lib/merb-core/rack/middleware/path_prefix.rb @@ -2,21 +2,25 @@ module Merb module Rack class PathPrefix < Merb::Rack::Middleware + # @api private def initialize(app, path_prefix = nil) super(app) @path_prefix = /^#{Regexp.escape(path_prefix)}/ end + # @api plugin def deferred?(env) strip_path_prefix(env) @app.deferred?(env) end + # @api plugin def call(env) strip_path_prefix(env) @app.call(env) end + # @api private def strip_path_prefix(env) ['PATH_INFO', 'REQUEST_URI'].each do |path_key| if env[path_key] =~ @path_prefix diff --git a/merb-core/lib/merb-core/rack/middleware/profiler.rb b/merb-core/lib/merb-core/rack/middleware/profiler.rb index ba69341c..6cda9a4e 100644 --- a/merb-core/lib/merb-core/rack/middleware/profiler.rb +++ b/merb-core/lib/merb-core/rack/middleware/profiler.rb @@ -2,11 +2,13 @@ module Merb module Rack class Profiler < Merb::Rack::Middleware + # @api private def initialize(app, min=1, iter=1) super(app) @min, @iter = min, iter end + # @api plugin def call(env) __profile__("profile_output", @min, @iter) do @app.call(env) diff --git a/merb-core/lib/merb-core/rack/middleware/static.rb b/merb-core/lib/merb-core/rack/middleware/static.rb index e54b2dc5..bba0776f 100644 --- a/merb-core/lib/merb-core/rack/middleware/static.rb +++ b/merb-core/lib/merb-core/rack/middleware/static.rb @@ -2,11 +2,13 @@ module Merb module Rack class Static < Merb::Rack::Middleware + # @api private def initialize(app,directory) super(app) @static_server = ::Rack::File.new(directory) end + # @api plugin def call(env) path = if env[Merb::Const::PATH_INFO] env[Merb::Const::PATH_INFO].chomp(Merb::Const::SLASH) @@ -27,11 +29,13 @@ def call(env) end end - # ==== Parameters + # ==== Parameters # path:: The path to the file relative to the server root. # # ==== Returns # Boolean:: True if file exists under the server root and is readable. + # + # @api private def file_exist?(path) full_path = ::File.join(@static_server.root, ::Merb::Parse.unescape(path)) ::File.file?(full_path) && ::File.readable?(full_path) @@ -39,6 +43,8 @@ def file_exist?(path) # ==== Parameters # env:: Environment variables to pass on to the server. + # + # @api private def serve_static(env) env[Merb::Const::PATH_INFO] = ::Merb::Parse.unescape(env[Merb::Const::PATH_INFO]) @static_server.call(env) diff --git a/merb-core/lib/merb-core/rack/middleware/tracer.rb b/merb-core/lib/merb-core/rack/middleware/tracer.rb index 9f2317af..fd468ace 100644 --- a/merb-core/lib/merb-core/rack/middleware/tracer.rb +++ b/merb-core/lib/merb-core/rack/middleware/tracer.rb @@ -2,6 +2,7 @@ module Merb module Rack class Tracer < Merb::Rack::Middleware + # @api plugin def call(env) Merb.logger.debug!("Rack environment:\n" + env.inspect + "\n\n") diff --git a/merb-core/lib/merb-core/rack/stream_wrapper.rb b/merb-core/lib/merb-core/rack/stream_wrapper.rb index df63936e..63cdb792 100644 --- a/merb-core/lib/merb-core/rack/stream_wrapper.rb +++ b/merb-core/lib/merb-core/rack/stream_wrapper.rb @@ -2,38 +2,43 @@ module Merb module Rack class StreamWrapper - def initialize(body) + # @api private + def initialize(body) @body = body - end + end + + # @api private + def each(&callback) + if Proc === @body + @writer = lambda { |x| callback.call(x) } + @body.call(self) + elsif @body.is_a?(String) + @body.each_line(&callback) + else + @body.each(&callback) + end + end + + # @api private + def write(str) + @writer.call str.to_s + str + end + + # @api private + def to_s + @body.to_s + end - def each(&callback) - if Proc === @body - @writer = lambda { |x| callback.call(x) } - @body.call(self) - elsif @body.is_a?(String) - @body.each_line(&callback) - else - @body.each(&callback) - end - end - - def write(str) - @writer.call str.to_s - str - end - - def to_s - @body.to_s - end - - def ==(other) - @body == other - end - - def method_missing(sym, *args, &blk) - @body.send(sym, *args, &blk) - end - + # @api private + def ==(other) + @body == other + end + + # @api private + def method_missing(sym, *args, &blk) + @body.send(sym, *args, &blk) + end end diff --git a/merb-core/lib/merb-core/server.rb b/merb-core/lib/merb-core/server.rb index 3dac9802..c11e3439 100644 --- a/merb-core/lib/merb-core/server.rb +++ b/merb-core/lib/merb-core/server.rb @@ -62,6 +62,7 @@ def alive?(port) Merb.fatal!("You don't have access to the PID file at #{pidfile}: #{e.message}") end + # @api private def pid_in_file(pidfile) File.read(pidfile).chomp.to_i end diff --git a/merb-core/lib/merb-core/test/helpers/cookie_jar.rb b/merb-core/lib/merb-core/test/helpers/cookie_jar.rb index 3140bb07..aacad553 100644 --- a/merb-core/lib/merb-core/test/helpers/cookie_jar.rb +++ b/merb-core/lib/merb-core/test/helpers/cookie_jar.rb @@ -4,8 +4,10 @@ module Merb module Test class Cookie + # :api: private attr_reader :name, :value + # :api: private def initialize(raw, default_host) # separate the name / value pair from the cookie options @name_value_raw, options = raw.split(/[;,] */n, 2) @@ -18,39 +20,48 @@ def initialize(raw, default_host) @options["domain"] ||= default_host end + # :api: private def raw @name_value_raw end + # :api: private def empty? @value.nil? || @value.empty? end + # :api: private def domain @options["domain"] end - + + # :api: private def path @options["path"] || "/" end + # :api: private def expires Time.parse(@options["expires"]) if @options["expires"] end + # :api: private def expired? expires && expires < Time.now end + # :api: private def valid?(uri) uri.host =~ Regexp.new("#{Regexp.escape(domain)}$") && uri.path =~ Regexp.new("^#{Regexp.escape(path)}") end + # :api: private def matches?(uri) ! expired? && valid?(uri) end + # :api: private def <=>(other) # Orders the cookies from least specific to most [name, path, domain.reverse] <=> [other.name, other.path, other.domain.reverse] @@ -60,10 +71,12 @@ def <=>(other) class CookieJar + # :api: private def initialize @jars = {} end + # :api: private def update(jar, uri, raw_cookies) return unless raw_cookies # Initialize all the the received cookies @@ -85,6 +98,7 @@ def update(jar, uri, raw_cookies) @jars[jar].sort! end + # :api: private def for(jar, uri) cookies = {}