automation_object 0.0.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/lib/automation_object.rb +14 -72
  3. data/lib/automation_object/blue_print.rb +37 -100
  4. data/lib/automation_object/blue_print/composite/automatic_onload_modal.rb +28 -0
  5. data/lib/automation_object/blue_print/composite/base.rb +18 -0
  6. data/lib/automation_object/blue_print/composite/custom_method.rb +23 -0
  7. data/lib/automation_object/blue_print/composite/element.rb +20 -0
  8. data/lib/automation_object/blue_print/composite/element_array.rb +21 -0
  9. data/lib/automation_object/blue_print/composite/element_hash.rb +26 -0
  10. data/lib/automation_object/blue_print/composite/helpers/element_helper.rb +33 -0
  11. data/lib/automation_object/blue_print/composite/helpers/multiple_elements_helper.rb +18 -0
  12. data/lib/automation_object/blue_print/composite/hook.rb +31 -0
  13. data/lib/automation_object/blue_print/composite/hook_action.rb +84 -0
  14. data/lib/automation_object/blue_print/composite/hook_element_requirements.rb +39 -0
  15. data/lib/automation_object/blue_print/composite/modal.rb +56 -0
  16. data/lib/automation_object/blue_print/composite/screen.rb +61 -0
  17. data/lib/automation_object/blue_print/composite/top.rb +51 -0
  18. data/lib/automation_object/blue_print/composite/view.rb +48 -0
  19. data/lib/automation_object/blue_print/hash_adapter.rb +17 -0
  20. data/lib/automation_object/blue_print/hash_adapter/automatic_onload_modal.rb +35 -0
  21. data/lib/automation_object/blue_print/hash_adapter/composite.rb +93 -0
  22. data/lib/automation_object/blue_print/hash_adapter/custom_method.rb +30 -0
  23. data/lib/automation_object/blue_print/hash_adapter/element.rb +34 -0
  24. data/lib/automation_object/blue_print/hash_adapter/element_array.rb +36 -0
  25. data/lib/automation_object/blue_print/hash_adapter/element_hash.rb +43 -0
  26. data/lib/automation_object/blue_print/hash_adapter/helpers/element_helper.rb +59 -0
  27. data/lib/automation_object/blue_print/hash_adapter/helpers/multiple_elements_helper.rb +35 -0
  28. data/lib/automation_object/blue_print/hash_adapter/helpers/validation_error.rb +26 -0
  29. data/lib/automation_object/blue_print/hash_adapter/helpers/validation_helper.rb +99 -0
  30. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate.rb +23 -0
  31. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_allowed_keys.rb +31 -0
  32. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_element_presence_of.rb +55 -0
  33. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_instance_of.rb +39 -0
  34. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_modal_presence_of.rb +54 -0
  35. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_presence_of.rb +36 -0
  36. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_screen_presence_of.rb +55 -0
  37. data/lib/automation_object/blue_print/hash_adapter/helpers/validators/validate_view_presence_of.rb +52 -0
  38. data/lib/automation_object/blue_print/hash_adapter/hook.rb +35 -0
  39. data/lib/automation_object/blue_print/hash_adapter/hook_action.rb +134 -0
  40. data/lib/automation_object/blue_print/hash_adapter/hook_element_requirements.rb +64 -0
  41. data/lib/automation_object/blue_print/hash_adapter/modal.rb +52 -0
  42. data/lib/automation_object/blue_print/hash_adapter/screen.rb +91 -0
  43. data/lib/automation_object/blue_print/hash_adapter/top.rb +63 -0
  44. data/lib/automation_object/blue_print/hash_adapter/view.rb +29 -0
  45. data/lib/automation_object/blue_print/helpers/file_helper.rb +38 -0
  46. data/lib/automation_object/blue_print/yaml_adapter.rb +50 -0
  47. data/lib/automation_object/driver.rb +44 -0
  48. data/lib/automation_object/driver/appium_adapter/driver.rb +150 -0
  49. data/lib/automation_object/driver/appium_adapter/element.rb +118 -0
  50. data/lib/automation_object/driver/base.rb +11 -0
  51. data/lib/automation_object/driver/driver.rb +69 -245
  52. data/lib/automation_object/driver/element.rb +51 -210
  53. data/lib/automation_object/driver/helpers/selenium_driver_helper.rb +41 -0
  54. data/lib/automation_object/driver/helpers/selenium_element_helper.rb +138 -0
  55. data/lib/automation_object/driver/nokogiri_adapter/backup/driver.rb +83 -0
  56. data/lib/automation_object/driver/nokogiri_adapter/backup/element.rb +66 -0
  57. data/lib/automation_object/driver/nokogiri_adapter/backup/form.rb +29 -0
  58. data/lib/automation_object/driver/nokogiri_adapter/backup/helpers/driver_element_helper.rb +52 -0
  59. data/lib/automation_object/driver/nokogiri_adapter/backup/session.rb +115 -0
  60. data/lib/automation_object/driver/nokogiri_adapter/driver.rb +104 -0
  61. data/lib/automation_object/driver/nokogiri_adapter/element.rb +85 -0
  62. data/lib/automation_object/driver/nokogiri_adapter/error.rb +17 -0
  63. data/lib/automation_object/driver/selenium_adapter/driver.rb +143 -0
  64. data/lib/automation_object/driver/selenium_adapter/element.rb +116 -0
  65. data/lib/automation_object/dsl.rb +33 -0
  66. data/lib/automation_object/dsl/blue_print_adapter.rb +16 -0
  67. data/lib/automation_object/dsl/blue_print_adapter/composite.rb +54 -0
  68. data/lib/automation_object/dsl/blue_print_adapter/element.rb +14 -0
  69. data/lib/automation_object/dsl/blue_print_adapter/element_array.rb +14 -0
  70. data/lib/automation_object/dsl/blue_print_adapter/element_hash.rb +14 -0
  71. data/lib/automation_object/dsl/blue_print_adapter/modal.rb +23 -0
  72. data/lib/automation_object/dsl/blue_print_adapter/screen.rb +26 -0
  73. data/lib/automation_object/dsl/blue_print_adapter/top.rb +19 -0
  74. data/lib/automation_object/dsl/models.rb +18 -0
  75. data/lib/automation_object/dsl/proxies/element.rb +16 -0
  76. data/lib/automation_object/dsl/proxies/element_array.rb +16 -0
  77. data/lib/automation_object/dsl/proxies/element_hash.rb +16 -0
  78. data/lib/automation_object/dsl/proxies/helpers/composite_helper.rb +74 -0
  79. data/lib/automation_object/dsl/proxies/modal.rb +17 -0
  80. data/lib/automation_object/dsl/proxies/screen.rb +17 -0
  81. data/lib/automation_object/dsl/proxies/top.rb +17 -0
  82. data/lib/automation_object/framework.rb +79 -386
  83. data/lib/automation_object/helpers/composite.rb +95 -0
  84. data/lib/automation_object/helpers/composite_hook.rb +46 -0
  85. data/lib/automation_object/helpers/hash.rb +15 -0
  86. data/lib/automation_object/helpers/reflection_helper.rb +28 -0
  87. data/lib/automation_object/helpers/string.rb +27 -0
  88. data/lib/automation_object/proxies/mutex_proxy.rb +63 -0
  89. data/lib/automation_object/proxies/proxy.rb +20 -0
  90. data/lib/automation_object/proxies/throttle_proxy.rb +57 -0
  91. data/lib/automation_object/state.rb +37 -0
  92. data/lib/automation_object/state/blue_print_adapter.rb +16 -0
  93. data/lib/automation_object/state/blue_print_adapter/composite.rb +65 -0
  94. data/lib/automation_object/state/blue_print_adapter/element.rb +20 -0
  95. data/lib/automation_object/state/blue_print_adapter/element_array.rb +25 -0
  96. data/lib/automation_object/state/blue_print_adapter/element_hash.rb +31 -0
  97. data/lib/automation_object/state/blue_print_adapter/element_proxy.rb +28 -0
  98. data/lib/automation_object/state/blue_print_adapter/helpers/element_helper.rb +31 -0
  99. data/lib/automation_object/state/blue_print_adapter/helpers/screen_manager.rb +137 -0
  100. data/lib/automation_object/state/blue_print_adapter/helpers/window.rb +39 -0
  101. data/lib/automation_object/state/blue_print_adapter/hook.rb +56 -0
  102. data/lib/automation_object/state/blue_print_adapter/hook_action.rb +33 -0
  103. data/lib/automation_object/state/blue_print_adapter/hook_actions/action_loop.rb +35 -0
  104. data/lib/automation_object/state/blue_print_adapter/hook_actions/change_screen.rb +26 -0
  105. data/lib/automation_object/state/blue_print_adapter/hook_actions/change_to_previous_screen.rb +21 -0
  106. data/lib/automation_object/state/blue_print_adapter/hook_actions/close_modal.rb +31 -0
  107. data/lib/automation_object/state/blue_print_adapter/hook_actions/close_screen.rb +19 -0
  108. data/lib/automation_object/state/blue_print_adapter/hook_actions/element_requirement.rb +34 -0
  109. data/lib/automation_object/state/blue_print_adapter/hook_actions/new_screen.rb +37 -0
  110. data/lib/automation_object/state/blue_print_adapter/hook_actions/possible_screen_changes.rb +21 -0
  111. data/lib/automation_object/state/blue_print_adapter/hook_actions/reset_screen.rb +18 -0
  112. data/lib/automation_object/state/blue_print_adapter/hook_actions/show_modal.rb +26 -0
  113. data/lib/automation_object/state/blue_print_adapter/hook_actions/sleep.rb +18 -0
  114. data/lib/automation_object/state/blue_print_adapter/hook_actions/wait_for_elements.rb +20 -0
  115. data/lib/automation_object/state/blue_print_adapter/modal.rb +26 -0
  116. data/lib/automation_object/state/blue_print_adapter/screen.rb +32 -0
  117. data/lib/automation_object/state/blue_print_adapter/top.rb +45 -0
  118. data/lib/automation_object/state/error.rb +24 -0
  119. data/lib/automation_object/state/session.rb +38 -0
  120. data/lib/automation_object/step_definitions.rb +14 -0
  121. data/lib/automation_object/step_definitions/action.rb +21 -0
  122. data/lib/automation_object/step_definitions/cache.rb +23 -0
  123. data/lib/automation_object/step_definitions/element/actions.rb +87 -0
  124. data/lib/automation_object/step_definitions/element/regex.rb +24 -0
  125. data/lib/automation_object/step_definitions/element/steps.rb +67 -0
  126. data/lib/automation_object/step_definitions/parse.rb +39 -0
  127. data/lib/automation_object/version.rb +1 -1
  128. metadata +194 -110
  129. data/lib/automation_object/blue_print_validation/base_validation.rb +0 -44
  130. data/lib/automation_object/blue_print_validation/common_methods.rb +0 -106
  131. data/lib/automation_object/blue_print_validation/element_validation.rb +0 -198
  132. data/lib/automation_object/blue_print_validation/formatted_errors.rb +0 -41
  133. data/lib/automation_object/blue_print_validation/hook_validation.rb +0 -393
  134. data/lib/automation_object/blue_print_validation/key_value_constants.rb +0 -75
  135. data/lib/automation_object/blue_print_validation/modal_validation.rb +0 -37
  136. data/lib/automation_object/blue_print_validation/screen_modal_common_methods.rb +0 -119
  137. data/lib/automation_object/blue_print_validation/screen_validation.rb +0 -21
  138. data/lib/automation_object/blue_print_validation/validation_object.rb +0 -32
  139. data/lib/automation_object/driver/anonymous.rb +0 -27
  140. data/lib/automation_object/element/element.rb +0 -145
  141. data/lib/automation_object/element/element_array.rb +0 -12
  142. data/lib/automation_object/element/element_cell.rb +0 -126
  143. data/lib/automation_object/element/element_group.rb +0 -33
  144. data/lib/automation_object/element/element_hash.rb +0 -25
  145. data/lib/automation_object/element/element_helpers.rb +0 -29
  146. data/lib/automation_object/element/element_methods.rb +0 -134
  147. data/lib/automation_object/element/elements_helpers.rb +0 -204
  148. data/lib/automation_object/framework/events.rb +0 -8
  149. data/lib/automation_object/framework/helpers.rb +0 -101
  150. data/lib/automation_object/framework/print_objects.rb +0 -67
  151. data/lib/automation_object/framework/screen_monitor.rb +0 -55
  152. data/lib/automation_object/framework/screen_routing.rb +0 -310
  153. data/lib/automation_object/framework/window_helpers.rb +0 -181
  154. data/lib/automation_object/hash.rb +0 -6
  155. data/lib/automation_object/hook_helpers.rb +0 -27
  156. data/lib/automation_object/logger.rb +0 -179
  157. data/lib/automation_object/object.rb +0 -22
  158. data/lib/automation_object/screen/modal.rb +0 -8
  159. data/lib/automation_object/screen/screen.rb +0 -209
  160. data/lib/automation_object/screen/screen_hook_helpers.rb +0 -319
  161. data/lib/automation_object/screen/screen_modal_helpers.rb +0 -101
  162. data/lib/automation_object/screen/screen_prompt_helpers.rb +0 -21
  163. data/lib/automation_object/screen/screen_window_helpers.rb +0 -149
@@ -0,0 +1,30 @@
1
+ #Require parent class
2
+ require_relative 'composite'
3
+
4
+ module AutomationObject
5
+ module BluePrint
6
+ module HashAdapter
7
+ #Custom method composite
8
+ class CustomMethod < Composite
9
+ #Validations
10
+ validates :element_method, instance_of: [String, Symbol], presence_of: true
11
+ validates :evaluate, instance_of: [String], presence_of: true
12
+
13
+ def element_method
14
+ element_method = self.hash[:element_method]
15
+
16
+ case element_method
17
+ when Symbol, String
18
+ return element_method.to_sym
19
+ else
20
+ return nil
21
+ end
22
+ end
23
+
24
+ def evaluate
25
+ return self.hash[:evaluate] ||= nil
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,34 @@
1
+ #Require parent class
2
+ require_relative 'composite'
3
+
4
+ #Require child classes
5
+ require_relative 'hook'
6
+ require_relative 'custom_method'
7
+
8
+ #Require helpers
9
+ require_relative 'helpers/element_helper'
10
+
11
+ module AutomationObject
12
+ module BluePrint
13
+ module HashAdapter
14
+ #Element composite
15
+ class Element < Composite
16
+ include ElementHelper
17
+
18
+ before_create :method_hooks
19
+
20
+ #Relationships
21
+ has_one :load, interface: Hook
22
+ has_many :custom_methods, interface: CustomMethod
23
+
24
+ #Validations
25
+ validates :load, instance_of: Hash
26
+ validates :custom_methods, instance_of: Hash
27
+
28
+ validates :in_iframe, instance_of: String, element_presence_of: true
29
+ validates :css, instance_of: String, presence_of: {:unless_presence_of => :xpath}
30
+ validates :xpath, instance_of: String, presence_of: {:unless_presence_of => :css}
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,36 @@
1
+ #Require parent class
2
+ require_relative 'composite'
3
+
4
+ #Require child classes
5
+ require_relative 'hook'
6
+ require_relative 'custom_method'
7
+
8
+ #Require helpers
9
+ require_relative 'helpers/element_helper'
10
+ require_relative 'helpers/multiple_elements_helper'
11
+
12
+ module AutomationObject
13
+ module BluePrint
14
+ module HashAdapter
15
+ #Element array composite
16
+ class ElementArray < Composite
17
+ include ElementHelper
18
+ include MultipleElementsHelper
19
+
20
+ before_create :method_hooks
21
+
22
+ #Relationships
23
+ has_one :load, interface: Hook
24
+ has_many :custom_methods, interface: CustomMethod
25
+
26
+ #Validations
27
+ validates :load, instance_of: Hash
28
+ validates :custom_range, instance_of: [Hash, String]
29
+ validates :in_iframe, instance_of: String, element_presence_of: true
30
+ validates :custom_methods, instance_of: Hash
31
+ validates :css, instance_of: String, presence_of: {:unless_presence_of => :xpath}
32
+ validates :xpath, instance_of: String, presence_of: {:unless_presence_of => :css}
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,43 @@
1
+ #Require parent class
2
+ require_relative 'composite'
3
+
4
+ #Require child classes
5
+ require_relative 'hook'
6
+ require_relative 'custom_method'
7
+
8
+ #Require helpers
9
+ require_relative 'helpers/element_helper'
10
+ require_relative 'helpers/multiple_elements_helper'
11
+
12
+ module AutomationObject
13
+ module BluePrint
14
+ module HashAdapter
15
+ #Element hash composite
16
+ class ElementHash < Composite
17
+ include ElementHelper
18
+ include MultipleElementsHelper
19
+
20
+ before_create :method_hooks
21
+
22
+ #Relationships
23
+ has_one :load, interface: Hook
24
+ has_many :custom_methods, interface: CustomMethod
25
+
26
+ #Validations
27
+ validates :load, instance_of: Hash
28
+
29
+ validates :define_elements_by, instance_of: [String, Symbol], presence_of: true
30
+ validates :custom_range, instance_of: [Hash, String]
31
+ validates :in_iframe, instance_of: String, element_presence_of: true
32
+ validates :custom_methods, instance_of: Hash
33
+ validates :css, instance_of: String, presence_of: {:unless_presence_of => :xpath}
34
+ validates :xpath, instance_of: String, presence_of: {:unless_presence_of => :css}
35
+
36
+ # @return [Symbol] element method to define element keys by
37
+ def define_elements_by
38
+ return self.hash[:define_elements_by].to_sym
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,59 @@
1
+ module AutomationObject
2
+ module BluePrint
3
+ module HashAdapter
4
+ #Helper module for Element composite classes
5
+ module ElementHelper
6
+ # @return [Array<Symbol, String>, nil] params as an array for driver find_element args
7
+ def selector_params
8
+ case
9
+ when self.hash[:xpath].is_a?(String)
10
+ [:xpath, self.hash[:xpath]]
11
+ when self.hash[:css].is_a?(String)
12
+ [:css, self.hash[:css]]
13
+ else
14
+ nil
15
+ end
16
+ end
17
+
18
+ # @return [Symbol, nil] element name of iframe element is in or nil if not
19
+ def in_iframe
20
+ case self.hash[:in_iframe]
21
+ when Symbol, String
22
+ self.hash[:in_iframe].to_sym
23
+ else
24
+ nil
25
+ end
26
+ end
27
+
28
+ # @return [Boolean] whether or not element is in iframe
29
+ def in_iframe?
30
+ (self.in_iframe) ? true : false
31
+ end
32
+
33
+ def method_hook?(name)
34
+ return self.method_hooks.has_key?(name)
35
+ end
36
+
37
+ # @return [Hash<Hook>] array of Hook that are defined under the element
38
+ def method_hooks
39
+ return @method_hooks if @method_hooks
40
+
41
+ children = {}
42
+ self.hash.each { |key, value|
43
+ #Skip possible keys that elements can have
44
+ #Otherwise should be a method hook
45
+ next if [:load, :custom_methods, :in_iframe, :css, :xpath, :define_elements_by, :custom_range].include?(key)
46
+ children[key] = value
47
+ }
48
+
49
+ @method_hooks = self.create_hash_children(children,
50
+ {interface: Hook,
51
+ location: self.location + '[hook]'})
52
+
53
+ return @method_hooks
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,35 @@
1
+ module AutomationObject
2
+ module BluePrint
3
+ module HashAdapter
4
+ #Helper module for multiple element composite classes
5
+ module MultipleElementsHelper
6
+ # @return [Range, nil] gives range for limiting multiple elements or nil
7
+ def custom_range
8
+ custom_range = self.hash[:custom_range]
9
+
10
+ case custom_range
11
+ when String
12
+ integer_array = custom_range.split('..').map { |number| Integer(number) }
13
+ return integer_array[0]..integer_array[1]
14
+ when Hash
15
+ return custom_range[:start].to_i..custom_range[:end].to_i
16
+ end
17
+
18
+ return nil
19
+ end
20
+
21
+ # @return [Symbol, nil] gives element method to remove duplicates on or nil
22
+ def remove_duplicates
23
+ remove_duplicates = self.hash[:remove_duplicates]
24
+
25
+ case remove_duplicates
26
+ when Symbol, String
27
+ return remove_duplicates.to_sym
28
+ else
29
+ return nil
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,26 @@
1
+ module AutomationObject
2
+ module BluePrint
3
+ module HashAdapter
4
+ #ValidatorError exception class
5
+ #Allows for multiple errors at one time to allow for better debugging
6
+ class ValidationError < Exception
7
+ attr_accessor :errors
8
+
9
+ # @param errors [Array, String] pass validation error(s) in, class can handle singular or multiple
10
+ def initialize(errors)
11
+ @errors = (errors.is_a?(Array)) ? errors : [errors]
12
+ end
13
+
14
+ # @return [String] returns full error message
15
+ def message
16
+ message = "\nBluePrint::HashAdapter composite validation failed for the following errors:\n"
17
+ @errors.each { |error|
18
+ message << " - #{error}\n"
19
+ }
20
+
21
+ return message + "\n"
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,99 @@
1
+ #Require all the validators
2
+ require_relative 'validators/validate_instance_of'
3
+ require_relative 'validators/validate_allowed_keys'
4
+ require_relative 'validators/validate_screen_presence_of'
5
+ require_relative 'validators/validate_modal_presence_of'
6
+ require_relative 'validators/validate_view_presence_of'
7
+ require_relative 'validators/validate_element_presence_of'
8
+ require_relative 'validators/validate_presence_of'
9
+
10
+ require_relative '../../../helpers/string'
11
+
12
+ module AutomationObject
13
+ module BluePrint
14
+ module HashAdapter
15
+ #Validation helper for the composite structure, will allow Rails style validations on the composite
16
+ module ValidationHelper
17
+ attr_accessor :errors
18
+
19
+ # Give errors a default empty Array
20
+ # @return [Array<String>] errors messages
21
+ def errors
22
+ @errors ||= Array.new
23
+ end
24
+
25
+ # Give errors a default empty Array
26
+ # @params [Array<String>] error messages
27
+ # @return [Array<String>] error messages
28
+ def add_errors(errors)
29
+ self.errors += errors
30
+ end
31
+
32
+ # @return [Boolean] composite valid?
33
+ def valid?
34
+ return true if self.class.skip_validations
35
+
36
+ # ap self.class
37
+ #ap self.class.name
38
+ self.class.validations.collect do |validation|
39
+ # ap validation.class.name
40
+ end
41
+
42
+ self.class.validations.collect do |validation|
43
+ validation.validate(self)
44
+ unless validation.valid?
45
+ self.add_errors(validation.error_messages)
46
+ end
47
+ end
48
+
49
+ return self.errors.empty?
50
+ end
51
+
52
+ def self.included(base)
53
+ base.extend(ClassMethods)
54
+ end
55
+
56
+ #Class level methods
57
+ module ClassMethods
58
+ def skip_validations=(boolean)
59
+ @skip_validations = boolean
60
+ end
61
+
62
+ def skip_validations
63
+ @skip_validations ||= false
64
+ end
65
+
66
+ # @param key [Symbol] hash key to test
67
+ # @param args [Hash] arguments for validation
68
+ # @return [nil]
69
+ def validates(key, args = {})
70
+ # ap self
71
+ # ap self.class.name
72
+ # ap key
73
+ # ap args
74
+
75
+
76
+ args.each { |validator_name, validation_args|
77
+ validator_name = 'Validate' + validator_name.to_s.pascalize
78
+ validator = Validators.const_get(validator_name)
79
+
80
+ self.validations.push(validator.new({:key => key, :args => validation_args}))
81
+ }
82
+ end
83
+
84
+ # @param args [Hash] arguments for validation
85
+ # @return [nil]
86
+ def validates_keys(args = {})
87
+ self.validations.push(Validators::ValidateAllowedKeys.new(args))
88
+ end
89
+
90
+ # @return [Array] list of Validators, default to empty list
91
+ def validations
92
+ @validations = [] unless @validations
93
+ return @validations
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,23 @@
1
+ module AutomationObject
2
+ module BluePrint
3
+ module HashAdapter
4
+ module Validators
5
+ #Super-class for validators, contains base functionality
6
+ #Sub-classes must implement validate for the composite
7
+ class Validate
8
+ attr_accessor :error_messages
9
+
10
+ # @return [Array<String>] array of error messages, default empty array
11
+ def error_messages
12
+ @error_messages ||= Array.new
13
+ end
14
+
15
+ # @return [Boolean] whether or not validation passed or failed
16
+ def valid?
17
+ return (self.error_messages.length == 0) ? true : false
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,31 @@
1
+ require_relative 'validate'
2
+
3
+ module AutomationObject
4
+ module BluePrint
5
+ module HashAdapter
6
+ module Validators
7
+ #Validator that tests the composite hash for bad keys
8
+ class ValidateAllowedKeys < Validate
9
+ # @param args [Hash] arguments for the validation class
10
+ def initialize(args)
11
+ @allowed_keys = args.fetch :allowed_keys
12
+ end
13
+
14
+ # Validates the composite object and throws errors on failure
15
+ # @param composite_object [Object] Composite object to be tested.
16
+ # @return [nil] no return on exceptions on failure
17
+ def validate(composite_object)
18
+ #Get the hash from the composite object
19
+ target_hash = composite_object.hash
20
+
21
+ target_hash.each_key { |key|
22
+ unless @allowed_keys.include?(key)
23
+ self.error_messages.push("Invalid Key: #{key}, at: #{composite_object.location}. Allowed keys: #{@allowed_keys}.")
24
+ end
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ require_relative 'validate'
2
+
3
+ module AutomationObject
4
+ module BluePrint
5
+ module HashAdapter
6
+ module Validators
7
+ #Validator that tests that a element is defined when it is called elsewhere through a hook
8
+ class ValidateElementPresenceOf < Validate
9
+ # @param args [Hash] arguments for the validation class
10
+ def initialize(args)
11
+ @key = args.fetch :key
12
+ end
13
+
14
+ # Validates the composite object and throws errors on failure
15
+ # @param composite_object [Object] Composite object to be tested.
16
+ # @return [nil] no return on exceptions on failure
17
+ def validate(composite_object)
18
+ #Get the hash value from the composite object
19
+ target_value = composite_object.hash[@key]
20
+
21
+ return unless target_value
22
+
23
+ target_values = (target_value.is_a?(Array)) ? target_value : [target_value]
24
+
25
+ valid_elements = self.find_elements(composite_object)
26
+
27
+ target_values.each { |element|
28
+ element = element.to_sym
29
+ next if valid_elements.include?(element)
30
+
31
+ error_message = "Invalid Element: #{element}, at: #{composite_object.location}[#{@key}]."
32
+ error_message << " Valid Elements(s): #{valid_elements}"
33
+ self.error_messages.push(error_message)
34
+ }
35
+ end
36
+
37
+ #Traverses up a composite tree to find :elements in a hash
38
+ # @param composite_object [Object] composite object to traverse up
39
+ # @return [Array<Symbol>] array of element names
40
+ def find_elements(composite_object)
41
+ #Using the hash instead of the method because lower nodes will get validated
42
+ #before composite is finished building
43
+ if composite_object.hash[:elements].is_a?(Hash)
44
+ return composite_object.hash[:elements].keys #Should be Hash with element names as the keys
45
+ elsif composite_object.parent
46
+ return self.find_elements(composite_object.parent)
47
+ end
48
+
49
+ return []
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end