datamapper 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. data/example.rb +5 -5
  2. data/lib/data_mapper/adapters/abstract_adapter.rb +2 -2
  3. data/lib/data_mapper/adapters/data_object_adapter.rb +141 -147
  4. data/lib/data_mapper/adapters/mysql_adapter.rb +14 -1
  5. data/lib/data_mapper/adapters/postgresql_adapter.rb +123 -18
  6. data/lib/data_mapper/adapters/sql/coersion.rb +21 -9
  7. data/lib/data_mapper/adapters/sql/commands/load_command.rb +36 -19
  8. data/lib/data_mapper/adapters/sql/mappings/column.rb +111 -17
  9. data/lib/data_mapper/adapters/sql/mappings/schema.rb +27 -0
  10. data/lib/data_mapper/adapters/sql/mappings/table.rb +256 -29
  11. data/lib/data_mapper/adapters/sqlite3_adapter.rb +93 -8
  12. data/lib/data_mapper/associations/belongs_to_association.rb +53 -54
  13. data/lib/data_mapper/associations/has_and_belongs_to_many_association.rb +157 -25
  14. data/lib/data_mapper/associations/has_many_association.rb +45 -15
  15. data/lib/data_mapper/associations/has_n_association.rb +79 -20
  16. data/lib/data_mapper/associations/has_one_association.rb +2 -2
  17. data/lib/data_mapper/associations/reference.rb +1 -1
  18. data/lib/data_mapper/auto_migrations.rb +40 -0
  19. data/lib/data_mapper/base.rb +201 -98
  20. data/lib/data_mapper/context.rb +16 -10
  21. data/lib/data_mapper/database.rb +22 -11
  22. data/lib/data_mapper/dependency_queue.rb +28 -0
  23. data/lib/data_mapper/embedded_value.rb +61 -17
  24. data/lib/data_mapper/property.rb +4 -0
  25. data/lib/data_mapper/support/active_record_impersonation.rb +13 -5
  26. data/lib/data_mapper/support/errors.rb +5 -0
  27. data/lib/data_mapper/support/serialization.rb +8 -4
  28. data/lib/data_mapper/validatable_extensions/errors.rb +12 -0
  29. data/lib/data_mapper/validatable_extensions/macros.rb +7 -0
  30. data/lib/data_mapper/validatable_extensions/validatable_instance_methods.rb +62 -0
  31. data/lib/data_mapper/validatable_extensions/validation_base.rb +18 -0
  32. data/lib/data_mapper/validatable_extensions/validations/formats/email.rb +43 -0
  33. data/lib/data_mapper/validatable_extensions/validations/validates_acceptance_of.rb +7 -0
  34. data/lib/data_mapper/validatable_extensions/validations/validates_confirmation_of.rb +7 -0
  35. data/lib/data_mapper/validatable_extensions/validations/validates_each.rb +7 -0
  36. data/lib/data_mapper/validatable_extensions/validations/validates_format_of.rb +28 -0
  37. data/lib/data_mapper/validatable_extensions/validations/validates_length_of.rb +15 -0
  38. data/lib/data_mapper/validatable_extensions/validations/validates_numericality_of.rb +7 -0
  39. data/lib/data_mapper/validatable_extensions/validations/validates_presence_of.rb +7 -0
  40. data/lib/data_mapper/validatable_extensions/validations/validates_true_for.rb +7 -0
  41. data/lib/data_mapper/validatable_extensions/validations/validates_uniqueness_of.rb +33 -0
  42. data/lib/data_mapper/validations.rb +20 -0
  43. data/lib/data_mapper.rb +39 -34
  44. data/performance.rb +24 -18
  45. data/plugins/dataobjects/do_rb +0 -0
  46. data/rakefile.rb +12 -2
  47. data/spec/active_record_impersonation_spec.rb +133 -0
  48. data/spec/acts_as_tree_spec.rb +25 -9
  49. data/spec/associations_spec.rb +124 -4
  50. data/spec/attributes_spec.rb +13 -0
  51. data/spec/auto_migrations_spec.rb +44 -0
  52. data/spec/base_spec.rb +189 -1
  53. data/spec/column_spec.rb +85 -7
  54. data/spec/conditions_spec.rb +2 -2
  55. data/spec/dependency_spec.rb +25 -0
  56. data/spec/embedded_value_spec.rb +123 -3
  57. data/spec/fixtures/animals.yaml +1 -0
  58. data/spec/fixtures/careers.yaml +5 -0
  59. data/spec/fixtures/comments.yaml +1 -0
  60. data/spec/fixtures/people.yaml +14 -9
  61. data/spec/fixtures/projects.yaml +4 -0
  62. data/spec/fixtures/sections.yaml +5 -0
  63. data/spec/fixtures/serializers.yaml +6 -0
  64. data/spec/fixtures/users.yaml +1 -0
  65. data/spec/load_command_spec.rb +5 -4
  66. data/spec/mock_adapter.rb +2 -2
  67. data/spec/models/animal.rb +2 -1
  68. data/spec/models/animals_exhibit.rb +2 -2
  69. data/spec/models/career.rb +6 -0
  70. data/spec/models/comment.rb +4 -0
  71. data/spec/models/exhibit.rb +4 -0
  72. data/spec/models/person.rb +3 -13
  73. data/spec/models/project.rb +1 -1
  74. data/spec/models/serializer.rb +3 -0
  75. data/spec/models/user.rb +4 -0
  76. data/spec/models/zoo.rb +8 -1
  77. data/spec/natural_key_spec.rb +36 -0
  78. data/spec/paranoia_spec.rb +36 -0
  79. data/spec/property_spec.rb +70 -0
  80. data/spec/schema_spec.rb +10 -2
  81. data/spec/serialization_spec.rb +6 -3
  82. data/spec/serialize_spec.rb +19 -0
  83. data/spec/single_table_inheritance_spec.rb +7 -1
  84. data/spec/spec_helper.rb +26 -8
  85. data/spec/table_spec.rb +33 -0
  86. data/spec/validates_confirmation_of_spec.rb +20 -4
  87. data/spec/validates_format_of_spec.rb +22 -8
  88. data/spec/validates_length_of_spec.rb +26 -13
  89. data/spec/validates_uniqueness_of_spec.rb +18 -5
  90. data/spec/validations_spec.rb +55 -10
  91. data/tasks/fixtures.rb +13 -7
  92. metadata +189 -153
  93. data/lib/data_mapper/validations/confirmation_validator.rb +0 -53
  94. data/lib/data_mapper/validations/contextual_validations.rb +0 -50
  95. data/lib/data_mapper/validations/format_validator.rb +0 -85
  96. data/lib/data_mapper/validations/formats/email.rb +0 -78
  97. data/lib/data_mapper/validations/generic_validator.rb +0 -22
  98. data/lib/data_mapper/validations/length_validator.rb +0 -76
  99. data/lib/data_mapper/validations/required_field_validator.rb +0 -41
  100. data/lib/data_mapper/validations/unique_validator.rb +0 -56
  101. data/lib/data_mapper/validations/validation_errors.rb +0 -37
  102. data/lib/data_mapper/validations/validation_helper.rb +0 -77
  103. data/plugins/dataobjects/REVISION +0 -1
  104. data/plugins/dataobjects/Rakefile +0 -9
  105. data/plugins/dataobjects/do.rb +0 -348
  106. data/plugins/dataobjects/do_mysql.rb +0 -212
  107. data/plugins/dataobjects/do_postgres.rb +0 -196
  108. data/plugins/dataobjects/do_sqlite3.rb +0 -157
  109. data/plugins/dataobjects/spec/do_spec.rb +0 -150
  110. data/plugins/dataobjects/spec/spec_helper.rb +0 -81
  111. data/plugins/dataobjects/swig_mysql/extconf.rb +0 -45
  112. data/plugins/dataobjects/swig_mysql/mysql_c.c +0 -16602
  113. data/plugins/dataobjects/swig_mysql/mysql_c.i +0 -67
  114. data/plugins/dataobjects/swig_mysql/mysql_supp.i +0 -46
  115. data/plugins/dataobjects/swig_postgres/extconf.rb +0 -29
  116. data/plugins/dataobjects/swig_postgres/postgres_c.c +0 -8185
  117. data/plugins/dataobjects/swig_postgres/postgres_c.i +0 -73
  118. data/plugins/dataobjects/swig_sqlite/extconf.rb +0 -9
  119. data/plugins/dataobjects/swig_sqlite/sqlite3_c.c +0 -4725
  120. data/plugins/dataobjects/swig_sqlite/sqlite_c.i +0 -168
  121. data/tasks/drivers.rb +0 -20
@@ -1,50 +0,0 @@
1
- module DataMapper
2
-
3
- class ContextualValidations
4
-
5
- # This will be raised when you try to access
6
- # a context that's not a member of the DEFAULT_CONTEXTS array.
7
- class UnknownContextError < StandardError
8
- end
9
-
10
- # Add your custom contexts here.
11
- DEFAULT_CONTEXTS = [
12
- :general, :create, :save, :update
13
- ]
14
-
15
- def initialize
16
- @contexts = Hash.new { |h,k| h[k.to_sym] = [] }
17
- end
18
-
19
- # Retrieves a context by symbol.
20
- # Raises an exception if the symbol isn't a member of DEFAULT_CONTEXTS.
21
- # This isn't to keep you from adding your own contexts, it's just to
22
- # prevent errors due to typos. When adding your own contexts just
23
- # remember to add it to DEFAULT_CONTEXTS first.
24
- def context(name)
25
- raise UnknownContextError.new(name) unless DEFAULT_CONTEXTS.include?(name)
26
- @contexts[name]
27
- end
28
-
29
- # Clear out all the currently defined validators.
30
- # This makes testing easier.
31
- def clear!
32
- @contexts.clear
33
- end
34
-
35
- # Execute all validations against an instance for a specified context,
36
- # including the "always-on" :general context.
37
- def execute(context_name, target)
38
- target.errors.clear!
39
-
40
- validations = context(context_name)
41
- validations += context(:general) unless context_name == :general
42
-
43
- validations.inject(true) do |result, validator|
44
- result & validator.call(target)
45
- end
46
- end
47
-
48
- end
49
-
50
- end
@@ -1,85 +0,0 @@
1
- require File.dirname(__FILE__) + '/formats/email'
2
-
3
- module DataMapper
4
- module Validations
5
-
6
- class FormatValidator < GenericValidator
7
-
8
- # Seems to me that all this email garbage belongs somewhere else... Where's the best
9
- # place to stick it?
10
- include DataMapper::Validations::Helpers::Email
11
-
12
- FORMATS = {
13
- :email_address => [lambda { |email_address| email_address =~ DataMapper::Validations::Helpers::Email::RFC2822::EmailAddress }, :invalid_email]
14
- }
15
-
16
- def initialize(field_name, options = {}, &b)
17
- @field_name, @options = field_name, options
18
- end
19
-
20
- def call(target)
21
- field_value = target.instance_variable_get("@#{@field_name}")
22
- return true if @options[:allow_nil] && field_value.nil?
23
-
24
- validation = (@options[:as] || @options[:with])
25
- message_key = :invalid
26
-
27
- # Figure out what to use as the actual validator. If a symbol is passed to :as, look up
28
- # the canned validation in FORMATS.
29
- validator = if validation.is_a? Symbol
30
- if FORMATS[validation].is_a? Array
31
- message_key = FORMATS[validation][1] || :invalid
32
- FORMATS[validation][0]
33
- else
34
- FORMATS[validation] || validation
35
- end
36
- else
37
- validation
38
- end
39
-
40
- valid = case validator
41
- when Proc then validator.call(field_value)
42
- when Regexp then validator =~ field_value
43
- else raise UnknownValidationFormat, "Can't determine how to validate #{target.class}##{@field_name} with #{validator.inspect}"
44
- end
45
-
46
- unless valid
47
- field = Inflector.humanize(@field_name)
48
- value = target.instance_variable_get("@#{@field_name}")
49
-
50
- error_message = if message_key == :invalid
51
- '%s is invalid'.t(field)
52
- else
53
- '%s is not a valid email address'.t(value)
54
- end
55
-
56
- add_error(target, error_message , @field_name)
57
- end
58
-
59
- return valid
60
- end
61
-
62
- class UnknownValidationFormat < StandardError
63
- end
64
-
65
- end
66
-
67
- module ValidatesFormatOf
68
- def self.included(base)
69
- base.extend(ClassMethods)
70
- end
71
-
72
- module ClassMethods
73
- # No bueno?
74
- DEFAULT_OPTIONS = { :on => :save }
75
-
76
- def validates_format_of(field, options = {})
77
- opts = retrieve_options_from_arguments_for_validators([options], DEFAULT_OPTIONS)
78
- validations.context(opts[:context]) << Validations::FormatValidator.new(field, opts)
79
- end
80
-
81
- end
82
- end
83
-
84
- end
85
- end
@@ -1,78 +0,0 @@
1
- # http://www.faqs.org/rfcs/rfc2822.html
2
- module DataMapper
3
- module Validations
4
- module Helpers
5
- module Email
6
-
7
- module RFC2822
8
- EmailAddress = begin
9
- alpha = "a-zA-Z"
10
- digit = "0-9"
11
- atext = "[#{alpha}#{digit}\!\#\$\%\&\'\*+\/\=\?\^\_\`\{\|\}\~\-]"
12
- dot_atom_text = "#{atext}+([.]#{atext}*)*"
13
- dot_atom = "#{dot_atom_text}"
14
- qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
15
- text = "[\\x01-\\x09\\x11\\x12\\x14-\\x7f]"
16
- quoted_pair = "(\\x5c#{text})"
17
- qcontent = "(?:#{qtext}|#{quoted_pair})"
18
- quoted_string = "[\"]#{qcontent}+[\"]"
19
- atom = "#{atext}+"
20
- word = "(?:#{atom}|#{quoted_string})"
21
- obs_local_part = "#{word}([.]#{word})*"
22
- local_part = "(?:#{dot_atom}|#{quoted_string}|#{obs_local_part})"
23
- no_ws_ctl = "\\x01-\\x08\\x11\\x12\\x14-\\x1f\\x7f"
24
- dtext = "[#{no_ws_ctl}\\x21-\\x5a\\x5e-\\x7e]"
25
- dcontent = "(?:#{dtext}|#{quoted_pair})"
26
- domain_literal = "\\[#{dcontent}+\\]"
27
- obs_domain = "#{atom}([.]#{atom})*"
28
- domain = "(?:#{dot_atom}|#{domain_literal}|#{obs_domain})"
29
- addr_spec = "#{local_part}\@#{domain}"
30
- pattern = /^#{addr_spec}$/
31
- end
32
- end
33
-
34
- end
35
- end
36
- end
37
- end
38
-
39
- =begin
40
- addresses = [
41
- '-- dave --@example.com', # (spaces are invalid unless enclosed in quotation marks)
42
- '[dave]@example.com', # (square brackets are invalid, unless contained within quotation marks)
43
- '.dave@example.com', # (the local part of a domain name cannot start with a period)
44
- 'Max@Job 3:14',
45
- 'Job@Book of Job',
46
- 'J. P. \'s-Gravezande, a.k.a. The Hacker!@example.com',
47
- ]
48
- addresses.each do |address|
49
- if address =~ RFC2822::EmailAddress
50
- puts "#{address} deveria ter sido rejeitado, ERRO"
51
- else
52
- puts "#{address} rejeitado, OK"
53
- end
54
- end
55
-
56
-
57
- addresses = [
58
- '+1~1+@example.com',
59
- '{_dave_}@example.com',
60
- '"[[ dave ]]"@example.com',
61
- 'dave."dave"@example.com',
62
- 'test@localhost',
63
- 'test@example.com',
64
- 'test@example.co.uk',
65
- 'test@example.com.br',
66
- '"J. P. \'s-Gravezande, a.k.a. The Hacker!"@example.com',
67
- 'me@[187.223.45.119]',
68
- 'someone@123.com',
69
- 'simon&garfunkel@songs.com'
70
- ]
71
- addresses.each do |address|
72
- if address =~ RFC2822::EmailAddress
73
- puts "#{address} aceito, OK"
74
- else
75
- puts "#{address} deveria ser aceito, ERRO"
76
- end
77
- end
78
- =end
@@ -1,22 +0,0 @@
1
- module DataMapper
2
- module Validations
3
-
4
- # All Validators should inherit from the GenericValidator.
5
- class GenericValidator
6
-
7
- # Adds an error message to the target class.
8
- def add_error(target, message, attribute = :base)
9
- target.errors.add(attribute, message)
10
- end
11
-
12
- # Call the validator. We use "call" so the operation
13
- # is BoundMethod and Block compatible.
14
- # The result should always be TRUE or FALSE.
15
- def call(target)
16
- raise 'You must overwrite this method'
17
- end
18
-
19
- end
20
-
21
- end
22
- end
@@ -1,76 +0,0 @@
1
- module DataMapper
2
- module Validations
3
-
4
- class LengthValidator < GenericValidator
5
-
6
- def initialize(field_name, options)
7
- @field_name = field_name
8
- @options = options
9
-
10
- @min = options[:minimum] || options[:min]
11
- @max = options[:maximum] || options[:max]
12
- @equal = options[:is] || options[:equals]
13
- @range = options[:within] || options[:in]
14
-
15
- @validation_method ||= :range if @range
16
- @validation_method ||= :min if @min && @max.nil?
17
- @validation_method ||= :max if @max && @min.nil?
18
- @validation_method ||= :equals unless @equal.nil?
19
- end
20
-
21
- def call(target)
22
- field_value = target.instance_variable_get("@#{@field_name}").to_s
23
- return true if @options[:allow_nil] && field_value.nil?
24
-
25
- # HACK seems hacky to do this on every validation, probably should do this elsewhere?
26
- field = Inflector.humanize(@field_name)
27
- min = @range ? @range.min : @min
28
- max = @range ? @range.max : @max
29
- equal = @equal
30
-
31
- error_message = nil
32
-
33
- case @validation_method
34
- when :range then
35
- unless valid = @range.include?(field_value.size)
36
- error_message = '%s must be between %s and %s characters long'.t(field, min, max)
37
- end
38
- when :min then
39
- unless valid = field_value.size >= min
40
- error_message = '%s must be more than %s characters long'.t(field, min)
41
- end
42
- when :max then
43
- unless valid = field_value.size <= max
44
- error_message = '%s must be less than %s characters long'.t(field, max)
45
- end
46
- when :equals then
47
- unless valid = field_value.size == equal
48
- error_message = '%s must be %s characters long'.t(field, equal)
49
- end
50
- end
51
-
52
- add_error(target, error_message, @field_name) unless valid
53
-
54
- return valid
55
- end
56
-
57
- end
58
-
59
- module ValidatesLengthOf
60
- def self.included(base)
61
- base.extend(ClassMethods)
62
- end
63
-
64
- module ClassMethods
65
- DEFAULT_VALIDATES_LENGTH_OF_OPTIONS = { :on => :save }
66
-
67
- def validates_length_of(field, options = {})
68
- opts = retrieve_options_from_arguments_for_validators([options], DEFAULT_VALIDATES_LENGTH_OF_OPTIONS)
69
- validations.context(opts[:context]) << Validations::LengthValidator.new(field, opts)
70
- end
71
-
72
- end
73
- end
74
-
75
- end
76
- end
@@ -1,41 +0,0 @@
1
- module DataMapper
2
- module Validations
3
-
4
- class RequiredFieldValidator < GenericValidator
5
-
6
- def initialize(field_name)
7
- @field_name = field_name
8
- end
9
-
10
- def call(target)
11
- field_value = !target.instance_variable_get("@#{@field_name}").nil?
12
- return true if field_value
13
-
14
- error_message = "%s must not be blank".t(Inflector.humanize(@field_name))
15
- add_error(target, error_message , @field_name)
16
-
17
- return false
18
- end
19
-
20
- end
21
-
22
- module ValidatesPresenceOf
23
- def self.included(base)
24
- base.extend(ClassMethods)
25
- end
26
-
27
- module ClassMethods
28
-
29
- def validates_presence_of(*fields)
30
- options = retrieve_options_from_arguments_for_validators(fields)
31
-
32
- fields.each do |field|
33
- validations.context(options[:context]) << Validations::RequiredFieldValidator.new(field)
34
- end
35
- end
36
-
37
- end
38
- end
39
-
40
- end
41
- end
@@ -1,56 +0,0 @@
1
- module DataMapper
2
- module Validations
3
-
4
- class UniqueValidator < GenericValidator
5
-
6
- def initialize(field_name, options = {})
7
- @options = options
8
- @field_name = field_name.to_sym
9
- end
10
-
11
- def call(target)
12
- unless valid?(target)
13
- error_message = '%s has already been taken'.t(Inflector.humanize(@field_name))
14
- add_error(target, error_message , @field_name)
15
- return false
16
- end
17
-
18
- return true
19
- end
20
-
21
- def valid?(target)
22
- field_value = target.instance_variable_get("@#{@field_name}")
23
- return true if @options[:allow_nil] && field_value.nil?
24
-
25
- finder_options = { @field_name => field_value }
26
-
27
- if @options[:scope]
28
- scope_value = target.instance_variable_get("@#{@options[:scope]}")
29
- finder_options.merge! @options[:scope] => scope_value
30
- end
31
-
32
- finder_options.merge!({ target.session.table(target.class).key.name.not => target.key }) unless target.new_record?
33
- target.session.first(target.class, finder_options).nil?
34
- end
35
-
36
- end
37
-
38
- module ValidatesUniquenessOf
39
- def self.included(base)
40
- base.extend(ClassMethods)
41
- end
42
-
43
- module ClassMethods
44
- # No bueno?
45
- DEFAULT_OPTIONS = { :on => :save }
46
-
47
- def validates_uniqueness_of(field, options = {})
48
- opts = retrieve_options_from_arguments_for_validators([options], DEFAULT_OPTIONS)
49
- validations.context(opts[:context]) << Validations::UniqueValidator.new(field, opts)
50
- end
51
-
52
- end
53
- end
54
-
55
- end
56
- end
@@ -1,37 +0,0 @@
1
- module DataMapper
2
-
3
- class ValidationErrors
4
-
5
- def initialize
6
- @errors = Hash.new { |h,k| h[k.to_sym] = [] }
7
- end
8
-
9
- # Clear existing validation errors.
10
- def clear!
11
- @errors.clear
12
- end
13
-
14
- # Add a validation error. Use the attribute :general if
15
- # the error doesn't apply to a specific attribute.
16
- def add(attribute, message)
17
- @errors[attribute] << message
18
- end
19
-
20
- # Collect all errors into a single list.
21
- def full_messages
22
- @errors.inject([]) do |list,pair|
23
- list += pair.last
24
- end
25
- end
26
-
27
- def on(attribute)
28
- @errors[attribute]
29
- end
30
-
31
- def method_missing(meth, *args)
32
- @errors.send(meth, *args)
33
- end
34
-
35
- end
36
-
37
- end
@@ -1,77 +0,0 @@
1
- dirname = File.dirname(__FILE__)
2
-
3
- require dirname + '/validation_errors'
4
- require dirname + '/contextual_validations'
5
- require dirname + '/generic_validator'
6
-
7
- Dir[dirname + '/*_validator.rb'].reject do |path|
8
- path =~ /\/generic_validator/
9
- end.each do |validator|
10
- load validator
11
- end
12
-
13
- module DataMapper
14
- module Validations
15
-
16
- module ValidationHelper
17
-
18
- def self.included(base)
19
- base.extend(ClassMethods)
20
- base.class_eval do
21
- include DataMapper::Validations::ValidatesPresenceOf
22
- include DataMapper::Validations::ValidatesLengthOf
23
- include DataMapper::Validations::ValidatesConfirmationOf
24
- include DataMapper::Validations::ValidatesUniquenessOf
25
- include DataMapper::Validations::ValidatesFormatOf
26
- end
27
- end
28
-
29
- def errors
30
- @errors ||= ValidationErrors.new
31
- end
32
-
33
- def valid?(context = :general)
34
- validate_excluding_association(nil, context)
35
- end
36
-
37
- def validate_excluding_association(associated, context = :general)
38
- return false unless self.class.callbacks.execute(:before_validation, self)
39
- return false unless self.class.validations.execute(context, self)
40
- if self.respond_to?(:loaded_associations)
41
- return false unless self.loaded_associations.all? do |association|
42
- if association != associated && association.respond_to?(:validate_excluding_association)
43
- association.validate_excluding_association(self, context)
44
- else
45
- true
46
- end
47
- end
48
- end
49
-
50
- return false unless self.class.callbacks.execute(:after_validation, self)
51
- return true
52
- end
53
-
54
- module ClassMethods
55
-
56
- def validations
57
- @validations ||= ContextualValidations.new
58
- end
59
-
60
- def retrieve_options_from_arguments_for_validators(args, defaults = nil)
61
- options = args.last.kind_of?(Hash) ? args.pop : {}
62
-
63
- context = :general
64
- context = options[:context] if options.has_key?(:context)
65
- context = options.delete(:on) if options.has_key?(:on)
66
- options[:context] = context
67
-
68
- options.merge!(defaults) unless defaults.nil?
69
- return options
70
- end
71
-
72
- end
73
-
74
- end
75
-
76
- end
77
- end
@@ -1 +0,0 @@
1
- 18
@@ -1,9 +0,0 @@
1
- require 'spec/rake/spectask'
2
-
3
- task :default => 'specs'
4
-
5
- desc "Run all specs"
6
- Spec::Rake::SpecTask.new('specs') do |t|
7
- t.spec_opts = ["--format", "specdoc", "--colour"]
8
- t.spec_files = Dir['spec/*_spec.rb'].sort
9
- end