dm-validations 0.9.11 → 0.10.0

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 (159) hide show
  1. data/{History.txt → History.rdoc} +10 -3
  2. data/LICENSE +1 -0
  3. data/Manifest.txt +103 -33
  4. data/README.rdoc +172 -0
  5. data/Rakefile +4 -5
  6. data/lib/dm-validations.rb +73 -75
  7. data/lib/dm-validations/auto_validate.rb +98 -56
  8. data/lib/dm-validations/contextual_validators.rb +37 -14
  9. data/lib/dm-validations/exceptions.rb +3 -0
  10. data/lib/dm-validations/formats/url.rb +3 -1
  11. data/lib/dm-validations/support/context.rb +54 -0
  12. data/lib/dm-validations/validation_errors.rb +51 -27
  13. data/lib/dm-validations/{absent_field_validator.rb → validators/absent_field_validator.rb} +2 -8
  14. data/lib/dm-validations/{acceptance_validator.rb → validators/acceptance_validator.rb} +7 -7
  15. data/lib/dm-validations/{block_validator.rb → validators/block_validator.rb} +0 -0
  16. data/lib/dm-validations/{confirmation_validator.rb → validators/confirmation_validator.rb} +7 -7
  17. data/lib/dm-validations/{format_validator.rb → validators/format_validator.rb} +10 -16
  18. data/lib/dm-validations/{generic_validator.rb → validators/generic_validator.rb} +28 -6
  19. data/lib/dm-validations/validators/length_validator.rb +214 -0
  20. data/lib/dm-validations/validators/method_validator.rb +68 -0
  21. data/lib/dm-validations/validators/numeric_validator.rb +171 -0
  22. data/lib/dm-validations/{primitive_validator.rb → validators/primitive_validator.rb} +2 -7
  23. data/lib/dm-validations/{required_field_validator.rb → validators/required_field_validator.rb} +0 -6
  24. data/lib/dm-validations/{uniqueness_validator.rb → validators/uniqueness_validator.rb} +9 -20
  25. data/lib/dm-validations/{within_validator.rb → validators/within_validator.rb} +4 -4
  26. data/lib/dm-validations/version.rb +1 -1
  27. data/spec/fixtures/barcode.rb +32 -0
  28. data/spec/fixtures/basketball_court.rb +58 -0
  29. data/spec/fixtures/basketball_player.rb +37 -0
  30. data/spec/fixtures/beta_tester_account.rb +33 -0
  31. data/spec/fixtures/bill_of_landing.rb +42 -0
  32. data/spec/fixtures/boat_dock.rb +26 -0
  33. data/spec/fixtures/city.rb +25 -0
  34. data/spec/fixtures/company.rb +95 -0
  35. data/spec/fixtures/corporate_world.rb +47 -0
  36. data/spec/fixtures/country.rb +25 -0
  37. data/spec/fixtures/currency.rb +42 -0
  38. data/spec/fixtures/ethernet_frame.rb +56 -0
  39. data/spec/fixtures/event.rb +44 -0
  40. data/spec/fixtures/g3_concert.rb +57 -0
  41. data/spec/fixtures/jabberwock.rb +27 -0
  42. data/spec/fixtures/kayak.rb +28 -0
  43. data/spec/fixtures/lernean_hydra.rb +39 -0
  44. data/spec/fixtures/mathematical_function.rb +34 -0
  45. data/spec/fixtures/memory_object.rb +30 -0
  46. data/spec/fixtures/mittelschnauzer.rb +35 -0
  47. data/spec/fixtures/motor_launch.rb +21 -0
  48. data/spec/fixtures/page.rb +32 -0
  49. data/spec/fixtures/phone_number.rb +28 -0
  50. data/spec/fixtures/pirogue.rb +28 -0
  51. data/spec/fixtures/programming_language.rb +83 -0
  52. data/spec/fixtures/reservation.rb +38 -0
  53. data/spec/fixtures/scm_operation.rb +67 -0
  54. data/spec/fixtures/sms_message.rb +22 -0
  55. data/spec/fixtures/udp_packet.rb +49 -0
  56. data/spec/integration/absent_field_validator/absent_field_validator_spec.rb +86 -0
  57. data/spec/integration/absent_field_validator/spec_helper.rb +7 -0
  58. data/spec/integration/acceptance_validator/acceptance_validator_spec.rb +196 -0
  59. data/spec/integration/acceptance_validator/spec_helper.rb +7 -0
  60. data/spec/integration/automatic_validation/custom_messages_for_inferred_validation_spec.rb +47 -0
  61. data/spec/integration/automatic_validation/disabling_inferred_validation_spec.rb +41 -0
  62. data/spec/integration/automatic_validation/inferred_boolean_properties_validation_spec.rb +104 -0
  63. data/spec/integration/automatic_validation/inferred_float_property_validation_spec.rb +35 -0
  64. data/spec/integration/automatic_validation/inferred_format_validation_spec.rb +33 -0
  65. data/spec/integration/automatic_validation/inferred_integer_properties_validation_spec.rb +73 -0
  66. data/spec/integration/automatic_validation/inferred_length_validation_spec.rb +121 -0
  67. data/spec/integration/automatic_validation/inferred_presence_validation_spec.rb +41 -0
  68. data/spec/integration/automatic_validation/inferred_primitive_validation_spec.rb +20 -0
  69. data/spec/integration/automatic_validation/inferred_within_validation_spec.rb +33 -0
  70. data/spec/integration/automatic_validation/spec_helper.rb +74 -0
  71. data/spec/integration/block_validator/block_validator_spec.rb +32 -0
  72. data/spec/integration/block_validator/spec_helper.rb +5 -0
  73. data/spec/integration/conditional_validation/if_condition_spec.rb +61 -0
  74. data/spec/integration/conditional_validation/spec_helper.rb +5 -0
  75. data/spec/integration/confirmation_validator/confirmation_validator_spec.rb +74 -0
  76. data/spec/integration/confirmation_validator/spec_helper.rb +5 -0
  77. data/spec/integration/datamapper_models/association_validation_spec.rb +23 -0
  78. data/spec/integration/datamapper_models/inheritance_spec.rb +78 -0
  79. data/spec/integration/duplicated_validations/duplicated_validations_spec.rb +22 -0
  80. data/spec/integration/duplicated_validations/spec_helper.rb +5 -0
  81. data/spec/integration/format_validator/email_format_validator_spec.rb +113 -0
  82. data/spec/integration/format_validator/format_validator_spec.rb +60 -0
  83. data/spec/integration/format_validator/regexp_validator_spec.rb +29 -0
  84. data/spec/integration/format_validator/spec_helper.rb +5 -0
  85. data/spec/integration/format_validator/url_format_validator_spec.rb +63 -0
  86. data/spec/integration/length_validator/default_value_spec.rb +12 -0
  87. data/spec/integration/length_validator/equality_spec.rb +79 -0
  88. data/spec/integration/length_validator/error_message_spec.rb +15 -18
  89. data/spec/integration/length_validator/maximum_spec.rb +40 -24
  90. data/spec/integration/length_validator/minimum_spec.rb +32 -21
  91. data/spec/integration/length_validator/range_spec.rb +50 -60
  92. data/spec/integration/length_validator/spec_helper.rb +7 -12
  93. data/spec/integration/method_validator/method_validator_spec.rb +239 -0
  94. data/spec/integration/method_validator/spec_helper.rb +5 -0
  95. data/spec/integration/numeric_validator/equality_with_float_type_spec.rb +61 -0
  96. data/spec/integration/numeric_validator/equality_with_integer_type_spec.rb +37 -0
  97. data/spec/integration/numeric_validator/float_type_spec.rb +42 -56
  98. data/spec/integration/numeric_validator/gt_with_float_type_spec.rb +35 -0
  99. data/spec/integration/numeric_validator/gte_with_float_type_spec.rb +35 -0
  100. data/spec/integration/numeric_validator/integer_only_true_spec.rb +3 -6
  101. data/spec/integration/numeric_validator/integer_type_spec.rb +8 -24
  102. data/spec/integration/numeric_validator/lt_with_float_type_spec.rb +35 -0
  103. data/spec/integration/numeric_validator/lte_with_float_type_spec.rb +35 -0
  104. data/spec/integration/numeric_validator/spec_helper.rb +5 -77
  105. data/spec/integration/primitive_validator/primitive_validator_spec.rb +90 -0
  106. data/spec/integration/primitive_validator/spec_helper.rb +5 -0
  107. data/spec/integration/pure_ruby_objects/plain_old_ruby_object_validation_spec.rb +118 -0
  108. data/spec/integration/required_field_validator/association_spec.rb +5 -8
  109. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +4 -7
  110. data/spec/integration/required_field_validator/date_type_value_spec.rb +3 -6
  111. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +3 -6
  112. data/spec/integration/required_field_validator/float_type_value_spec.rb +3 -6
  113. data/spec/integration/required_field_validator/integer_type_value_spec.rb +2 -5
  114. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +5 -8
  115. data/spec/integration/required_field_validator/shared_examples.rb +1 -1
  116. data/spec/integration/required_field_validator/spec_helper.rb +6 -67
  117. data/spec/integration/required_field_validator/string_type_value_spec.rb +2 -5
  118. data/spec/integration/required_field_validator/text_type_value_spec.rb +2 -5
  119. data/spec/integration/shared/default_validation_context.rb +13 -0
  120. data/spec/integration/shared/valid_and_invalid_model.rb +27 -0
  121. data/spec/integration/uniqueness_validator/spec_helper.rb +5 -0
  122. data/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +114 -0
  123. data/spec/integration/within_validator/spec_helper.rb +5 -0
  124. data/spec/integration/within_validator/within_validator_spec.rb +164 -0
  125. data/spec/public/resource_spec.rb +68 -0
  126. data/spec/spec.opts +1 -0
  127. data/spec/spec_helper.rb +12 -4
  128. data/spec/unit/contextual_validators/emptiness_spec.rb +50 -0
  129. data/spec/unit/contextual_validators/execution_spec.rb +55 -0
  130. data/spec/unit/contextual_validators/spec_helper.rb +37 -0
  131. data/spec/unit/generic_validator/equality_operator_spec.rb +26 -0
  132. data/spec/unit/validation_errors/adding_spec.rb +54 -0
  133. data/spec/unit/validation_errors/emptiness_spec.rb +38 -0
  134. data/spec/unit/validation_errors/enumerable_spec.rb +32 -0
  135. data/tasks/install.rb +1 -1
  136. data/tasks/spec.rb +4 -4
  137. metadata +118 -55
  138. data/README.txt +0 -72
  139. data/lib/dm-validations/custom_validator.rb +0 -72
  140. data/lib/dm-validations/length_validator.rb +0 -113
  141. data/lib/dm-validations/method_validator.rb +0 -68
  142. data/lib/dm-validations/numeric_validator.rb +0 -83
  143. data/spec/integration/absent_field_validator_spec.rb +0 -36
  144. data/spec/integration/acceptance_validator_spec.rb +0 -87
  145. data/spec/integration/auto_validate_spec.rb +0 -342
  146. data/spec/integration/block_validator_spec.rb +0 -30
  147. data/spec/integration/confirmation_validator_spec.rb +0 -105
  148. data/spec/integration/contextual_validators_spec.rb +0 -27
  149. data/spec/integration/custom_validator_spec.rb +0 -9
  150. data/spec/integration/format_validator_spec.rb +0 -193
  151. data/spec/integration/generic_validator_spec.rb +0 -17
  152. data/spec/integration/length_validator/valid_objects_spec.rb +0 -13
  153. data/spec/integration/method_validator_spec.rb +0 -58
  154. data/spec/integration/numeric_validator_spec.rb +0 -253
  155. data/spec/integration/primitive_validator_spec.rb +0 -30
  156. data/spec/integration/uniqueness_validator_spec.rb +0 -97
  157. data/spec/integration/validation_errors_spec.rb +0 -18
  158. data/spec/integration/validation_spec.rb +0 -404
  159. data/spec/integration/within_validator_spec.rb +0 -79
@@ -0,0 +1,27 @@
1
+ module DataMapper
2
+ module Validate
3
+ module Fixtures
4
+
5
+ class Jabberwock
6
+ #
7
+ # Behaviors
8
+ #
9
+
10
+ include DataMapper::Resource
11
+
12
+ #
13
+ # Properties
14
+ #
15
+
16
+ property :id, Serial
17
+ property :snickersnack, String
18
+
19
+ #
20
+ # Validations
21
+ #
22
+
23
+ validates_length :snickersnack, :within => 3..40, :message => "worble warble"
24
+ end # Jabberwock
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+ class Kayak
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include ::DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+ property :salesman, String, :auto_validation => false
19
+
20
+ #
21
+ # Validations
22
+ #
23
+
24
+ validates_absent :salesman, :on => :sale
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+ class LerneanHydra
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+
19
+ without_auto_validations do
20
+ property :head_count, Float
21
+ end
22
+
23
+ #
24
+ # Validations
25
+ #
26
+
27
+ validates_is_number :head_count, :eq => 9, :message => "Lernean hydra is said to have exactly 9 heads"
28
+
29
+ def self.valid_instance(overrides = {})
30
+ defaults = {
31
+ :head_count => 9
32
+ }
33
+
34
+ new(defaults.merge(overrides))
35
+ end
36
+ end
37
+ end # Fixtures
38
+ end # Validate
39
+ end # DataMapper
@@ -0,0 +1,34 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+ class MathematicalFunction
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include ::DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+ property :input, Float, :auto_validation => false
19
+ property :output, Float, :auto_validation => false
20
+
21
+ #
22
+ # Validations
23
+ #
24
+
25
+ # function domain
26
+ # don't ask me what function that is
27
+ validates_within :input, :set => (1..n)
28
+
29
+ # function range
30
+ validates_within :output, :set => (-n..0), :message => "Negative values or zero only, please"
31
+ end # MathematicalFunction
32
+ end # Fixtures
33
+ end # Validate
34
+ end # DataMapper
@@ -0,0 +1,30 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+ class MemoryObject
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include ::DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+ property :marked, Boolean, :auto_validation => false
19
+ property :color, String, :auto_validation => false
20
+
21
+ #
22
+ # Validations
23
+ #
24
+
25
+ validates_is_primitive :marked
26
+ validates_is_primitive :color
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ module DataMapper
2
+ module Validate
3
+ module Fixtures
4
+ class Mittelschnauzer
5
+
6
+ #
7
+ # Behaviors
8
+ #
9
+
10
+ include DataMapper::Resource
11
+
12
+ #
13
+ # Properties
14
+ #
15
+
16
+ without_auto_validations do
17
+ property :name, String, :key => true
18
+ property :height, Float
19
+ end
20
+
21
+ #
22
+ # Validations
23
+ #
24
+
25
+ validates_length :name, :min => 2, :allow_nil => false
26
+
27
+ validates_is_number :height, :lt => 55.2
28
+
29
+ def self.valid_instance
30
+ new(:name => "Roudolf Wilde", :height => 50.4)
31
+ end
32
+ end # Mittelschnauzer
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ module DataMapper
2
+ module Validate
3
+ module Fixtures
4
+
5
+ class MotorLaunch
6
+ #
7
+ # Behaviors
8
+ #
9
+
10
+ include DataMapper::Resource
11
+
12
+ #
13
+ # Properties
14
+ #
15
+
16
+ property :id, Serial
17
+ property :name, String, :auto_validation => false
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+
7
+ # see http://datamapper.lighthouseapp.com/projects/20609/tickets/671
8
+ class Page
9
+ #
10
+ # Behaviors
11
+ #
12
+
13
+ include DataMapper::Resource
14
+
15
+ #
16
+ # Properties
17
+ #
18
+
19
+ property :id, Serial, :key => true
20
+ property :body, Text, :nullable => false
21
+
22
+ #
23
+ # Validations
24
+ #
25
+
26
+ # duplicates inferred validation for body (caused by
27
+ # :nullable => false)
28
+ validates_present :body
29
+ end
30
+ end # Fixtures
31
+ end # Validate
32
+ end # DataMapper
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+ class PhoneNumber
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include ::DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+ property :type_of_number, String, :auto_validation => false
19
+
20
+ #
21
+ # Validations
22
+ #
23
+
24
+ validates_within :type_of_number, :set => %w(home work cell), :message => "Should be one of: home, cell or work"
25
+ end # PhoneNumber
26
+ end # Fixtures
27
+ end # Validate
28
+ end # DataMapper
@@ -0,0 +1,28 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+ class Pirogue
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include DataMapper::Resource
12
+
13
+ #
14
+ # Properties
15
+ #
16
+
17
+ property :id, Serial
18
+ property :salesman, String, :default => 'Layfayette'
19
+
20
+ #
21
+ # Validations
22
+ #
23
+
24
+ validates_absent :salesman, :on => :sale
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,83 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+ # If you think that this particular fixture class
7
+ # and assumptions made below are full of bullshit
8
+ # and author is a moron, you are 100% right. I am,
9
+ # but it's me who rewrites poor dm-validations
10
+ # spec suite this time, so unless someone smart
11
+ # steps up to do it, we have to roll on with
12
+ # this crappy example of method validation. — MK
13
+ class ProgrammingLanguage
14
+ #
15
+ # Behaviors
16
+ #
17
+
18
+ include ::DataMapper::Validate
19
+
20
+ #
21
+ # Attributes
22
+ #
23
+
24
+ attr_accessor :name, :allows_system_calls, :allows_manual_memory_management, :allows_optional_parentheses,
25
+ :allows_operator_overload, :approved_by_linus, :compiler_excels_at_utilizing_cpu_cache,
26
+ :is_very_high_level, :does_not_require_explicit_return_keyword, :standard_library_support_parallel_programming_out_of_the_box
27
+
28
+ #
29
+ # Validations
30
+ #
31
+
32
+ validates_with_method :ensure_appropriate_for_system_programming, :when => [:doing_system_programming, :hacking_on_the_kernel, :implementing_a_game_engine]
33
+ validates_with_method :ensure_appropriate_for_dsls, :when => [:implementing_a_dsl]
34
+ validates_with_method :ensure_appropriate_for_cpu_intensive_tasks, :when => [:implementing_a_game_engine_core]
35
+ validates_with_method :ensure_approved_by_linus_himself, :when => [:hacking_on_the_kernel]
36
+
37
+ #
38
+ # API
39
+ #
40
+
41
+ def initialize(args = {})
42
+ args.each do |key, value|
43
+ self.send("#{key}=", value)
44
+ end
45
+ end
46
+
47
+ def ensure_appropriate_for_system_programming
48
+ if allows_manual_memory_management && allows_system_calls
49
+ true
50
+ else
51
+ [false, "try something that is closer to the metal"]
52
+ end
53
+ end
54
+
55
+ def ensure_appropriate_for_dsls
56
+ if allows_optional_parentheses && allows_operator_overload && is_very_high_level && does_not_require_explicit_return_keyword
57
+ true
58
+ else
59
+ [false, "may not be so good for domain specific languages"]
60
+ end
61
+ end
62
+
63
+ def ensure_appropriate_for_cpu_intensive_tasks
64
+ if compiler_excels_at_utilizing_cpu_cache && allows_manual_memory_management
65
+ true
66
+ else
67
+ [false, "may not be so good for CPU intensive tasks"]
68
+ end
69
+ end
70
+
71
+ def ensure_approved_by_linus_himself
72
+ if name.downcase == "c++"
73
+ [false, "Quite frankly, even if the choice of C were to do *nothing*
74
+ but keep the C++ programmers out, that in itself would be
75
+ a huge reason to use C."]
76
+ else
77
+ true
78
+ end
79
+ end
80
+ end # ProgrammingLanguage
81
+ end # Fixtures
82
+ end # Validate
83
+ end # DataMapper
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module DataMapper
4
+ module Validate
5
+ module Fixtures
6
+ class Reservation
7
+ #
8
+ # Behaviors
9
+ #
10
+
11
+ include ::DataMapper::Resource
12
+
13
+ #
14
+ # Attributes
15
+ #
16
+
17
+ attr_accessor :person_name_confirmation, :seats_confirmation
18
+
19
+ #
20
+ # Properties
21
+ #
22
+
23
+ property :id, Serial
24
+ property :person_name, String, :auto_validation => false
25
+ property :number_of_seats, Integer, :auto_validation => false
26
+
27
+ #
28
+ # Validations
29
+ #
30
+
31
+ validates_is_confirmed :person_name, :allow_nil => false
32
+ validates_is_confirmed :number_of_seats, :confirm => :seats_confirmation, :message => Proc.new { |resource, property|
33
+ '%s requires confirmation for %s' % [Extlib::Inflection.demodulize(resource.model.name), property.name]
34
+ }
35
+ end # Reservation
36
+ end # Fixtures
37
+ end # Validate
38
+ end # DataMapper
@@ -0,0 +1,67 @@
1
+ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
2
+
3
+ #
4
+ # SCMs
5
+ #
6
+ # This example may look stupid (I am sure it is),
7
+ # but it is way better than foobars and easier to read/add cases
8
+ # compared to gardening examples because every software engineer has idea
9
+ # about SCMs and not every software engineer does gardening often.
10
+ #
11
+
12
+ class ScmOperation
13
+ include DataMapper::Resource
14
+
15
+ #
16
+ # Property
17
+ #
18
+
19
+ property :id, Serial
20
+
21
+ # operation name
22
+ property :name, String, :auto_validation => false
23
+
24
+ property :committer_name, String, :auto_validation => false, :default => "Just another Ruby hacker"
25
+ property :author_name, String, :auto_validation => false, :default => "Just another Ruby hacker"
26
+ property :network_connection, Boolean, :auto_validation => false
27
+ property :message, Text, :auto_validation => false
28
+ property :clean_working_copy, Boolean, :auto_validation => false
29
+
30
+ #
31
+ # Validations
32
+ #
33
+
34
+ validates_present :name
35
+ end
36
+ ScmOperation.auto_migrate!
37
+
38
+
39
+ class SubversionOperation < ScmOperation
40
+ #
41
+ # Validations
42
+ #
43
+
44
+ validates_present :network_connection, :when => [:committing, :log_viewing]
45
+ end
46
+
47
+ SubversionOperation.auto_migrate!
48
+
49
+
50
+ class GitOperation < ScmOperation
51
+ #
52
+ # Validations
53
+ #
54
+
55
+ validates_present :author_name, :committer_name, :when => :committing
56
+
57
+ validates_present :message, :when => :committing
58
+ validates_present :network_connection, :when => [:pushing, :pulling], :message => {
59
+ :pushing => "though git is advanced, it cannot push without network connectivity",
60
+ :pulling => "you must have network connectivity to pull from others"
61
+ }
62
+ validates_present :clean_working_copy, :when => :pulling
63
+ end
64
+
65
+
66
+ GitOperation.auto_migrate!
67
+ end