Skip to content

Commit

Permalink
Simpler structure.
Browse files Browse the repository at this point in the history
  • Loading branch information
AlphaHydrae committed Jan 21, 2015
1 parent 7a70ad8 commit 2837012
Show file tree
Hide file tree
Showing 18 changed files with 388 additions and 304 deletions.
6 changes: 4 additions & 2 deletions lib/errapi.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ def self.default_config
Configuration.new.tap do |config|
config.plugins << Errapi::Plugins::ErrorCodes.new
config.plugins << Errapi::Plugins::Messages.new
config.register_validator :length, Errapi::Validators::Length
config.register_validator :presence, Errapi::Validators::Presence
config.register_validation :length, Errapi::Validations::Length
config.register_validation :presence, Errapi::Validations::Presence
config.register_condition Errapi::Condition::SimpleCheck
config.register_condition Errapi::Condition::ErrorCheck
config.register_location :dotted, Errapi::Locations::Dotted
config.register_location :json, Errapi::Locations::Json
end
end
end
46 changes: 36 additions & 10 deletions lib/errapi/configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,36 +3,62 @@ class Errapi::Configuration

def initialize
@plugins = []
@validators = {}
@conditions = {}
@validation_factories = {}
@condition_factories = {}
@location_factories = {}
end

def new_error options = {}
Errapi::ValidationError.new options
end

def build_error error, context
apply_plugins :build_error, error, context
end

def new_context
Errapi::ValidationContext.new plugins: @plugins
Errapi::ValidationContext.new config: self
end

def register_validation name, factory
@validation_factories[name] = factory
end

def register_validator name, factory
@validators[name] = factory
def validation name, options = {}
raise ArgumentError, "No validation factory registered for name #{name.inspect}" unless @validation_factories.key? name
@validation_factories[name].new options
end

def validator name, options = {}
raise ArgumentError, "No validator factory registered for name #{name.inspect}" unless @validators.key? name
@validators[name].new options
def register_location name, factory
@location_factories[name] = factory
end

def location name, initial_location = nil
raise ArgumentError, "No location factory registered for name #{name.inspect}" unless @location_factories.key? name
@location_factories[name].new initial_location
end

def register_condition factory
factory.conditionals.each do |conditional|
raise ArgumentError, "Conditional #{conditional} should start with 'if' or 'unless'." unless conditional.to_s.match /^(if|unless)/
@conditions[conditional] = factory
@condition_factories[conditional] = factory
end
end

def extract_conditions! source, options = {}
[].tap do |conditions|
@conditions.each_pair do |conditional,factory|
@condition_factories.each_pair do |conditional,factory|
next unless source.key? conditional
conditions << factory.new(conditional, source.delete(conditional), options)
end
end
end

private

def apply_plugins operation, *args
@plugins.each do |plugin|
plugin.send operation, *args if plugin.respond_to? operation
end
end
end
3 changes: 2 additions & 1 deletion lib/errapi/errors.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
module Errapi
class Error < StandardError; end
class ValidationErrorInvalid < Error; end
class ValidationDefinitionInvalid < Error; end

class ValidationFailed < Error
attr_reader :context

def initialize context
super "A validation error occurred."
super "#{context.errors.length} errors were found during validation."
@context = context
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/errapi/validators.rb → lib/errapi/locations.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module Errapi::Validators
module Errapi::Locations
end

Dir[File.join File.dirname(__FILE__), File.basename(__FILE__, '.*'), '*.rb'].each{ |lib| require lib }
29 changes: 29 additions & 0 deletions lib/errapi/locations/dotted.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
module Errapi

class Locations::Dotted

def initialize location = nil
@location = location.to_s.sub /^\./, '' unless location.nil?
end

def relative parts
if @location.nil?
self.class.new parts
else
self.class.new "#{@location}.#{parts.to_s.sub(/^\./, '')}"
end
end

def error_options
@location.nil? ? {} : { location: @location, location_type: :dotted }
end

def serialize
@location.nil? ? nil : @location
end

def to_s
@location.to_s
end
end
end
29 changes: 29 additions & 0 deletions lib/errapi/locations/json.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
module Errapi

class Locations::Json

def initialize location = nil
@location = location.nil? ? '' : location.to_s.sub(/^\//, '').sub(/\/$/, '')
end

def relative parts
if @location.nil?
self.class.new parts
else
self.class.new "#{@location}/#{parts.to_s.sub(/^\./, '').sub(/\/$/, '')}"
end
end

def error_options
{ location: @location, location_type: :json }
end

def serialize
@location
end

def to_s
@location
end
end
end
28 changes: 28 additions & 0 deletions lib/errapi/locations/none.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
require 'singleton'

module Errapi

class Locations::None
include Singleton

def relative parts
self
end

def error_options
{}
end

def serialize
nil
end

def to_s
LOCATION_STRING
end

private

LOCATION_STRING = ''
end
end
11 changes: 6 additions & 5 deletions lib/errapi/model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ def validate *args
context = args.shift
end

validations = self.class.errapi name
validations.validate self, context, options
validator = self.class.errapi name
validator.validate self, context, options
end

def self.included mod
Expand All @@ -20,9 +20,10 @@ def self.included mod

module ClassMethods

def errapi name = nil, &block
@errapi_validations ||= {}
@errapi_validations[name || :default] ||= Errapi::ObjectValidations.new(&block)
def errapi name = :default, &block
@errapi_validators ||= {}
@errapi_validators[name] = Errapi::ObjectValidator.new(&block) if block
@errapi_validators[name]
end
end
end

0 comments on commit 2837012

Please sign in to comment.