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,85 @@
1
+ module AutomationObject
2
+ module Driver
3
+ module NokogiriAdapter
4
+ #Element for nokogiri
5
+ #Conforms to Element interface for an XML source using Nokogiri
6
+ class Element
7
+ # Set or Get attribute
8
+ # @param key [String] key of element
9
+ # @param value [String, nil] set value or leave blank
10
+ # @return [String, nil]
11
+ def attribute(key, value = nil)
12
+ self.adapter.attribute(key, value)
13
+ end
14
+
15
+ # @return [String] id of element
16
+ def id
17
+ self.adapter.id
18
+ end
19
+
20
+ # @return [String] href of element
21
+ def href
22
+ self.adapter.href
23
+ end
24
+
25
+ # Text of element
26
+ # @return [String, nil]
27
+ def text
28
+ self.adapter.text
29
+ end
30
+
31
+ # Type into an element
32
+ # @return [void]
33
+ def send_keys(string)
34
+ self.adapter.send_keys(string)
35
+ end
36
+
37
+ # Clear the element field
38
+ # @return [void]
39
+ def clear
40
+ self.adapter.clear
41
+ end
42
+
43
+ # @return [Boolean]
44
+ def visible?
45
+ self.adapter.visible?
46
+ end
47
+
48
+ # @return [Boolean]
49
+ def invisible?
50
+ self.adapter.invisible?
51
+ end
52
+
53
+ # Get the location
54
+ # @return [Point]
55
+ def location
56
+ self.adapter.location
57
+ end
58
+
59
+ # Get the size of an element
60
+ # @return [Dimension]
61
+ def size
62
+ self.adapter.size
63
+ end
64
+
65
+ # Perform a submit action on an element
66
+ # @return [void]
67
+ def submit
68
+ self.adapter.submit
69
+ end
70
+
71
+ # Scroll the element into view
72
+ # @return [void]
73
+ def scroll_into_view
74
+ self.adapter.scroll_into_view
75
+ end
76
+
77
+ # Perform a click action on the element
78
+ # @return [void]
79
+ def click
80
+ self.adapter.click
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,17 @@
1
+ module AutomationObject
2
+ module Driver
3
+ #Emulate Selenium errors
4
+ #http://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Error
5
+ module NokogiriAdapter
6
+ #
7
+ class WebDriverError < StandardError;
8
+ end
9
+ class NoSuchElementError < WebDriverError;
10
+ end
11
+ class NoSuchWindowError < WebDriverError;
12
+ end
13
+ class NoSuchDocumentError < WebDriverError;
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,143 @@
1
+ require_relative '../../proxies/proxy'
2
+ require_relative '../helpers/selenium_driver_helper'
3
+
4
+ require_relative '../element'
5
+ require_relative 'element'
6
+
7
+ module AutomationObject
8
+ module Driver
9
+ module SeleniumAdapter
10
+ #Driver proxy for Selenium
11
+ #Conform Selenium driver interface to what's expected of the Driver Port
12
+ class Driver < AutomationObject::Proxies::Proxy
13
+ DOC_COMPLETE_SLEEP = 1
14
+
15
+ include AutomationObject::Driver::SeleniumDriverHelper
16
+
17
+ # @param driver [Selenium::WebDriver::Driver] Selenium Web Driver
18
+ def initialize(driver)
19
+ @subject = driver
20
+ end
21
+
22
+ # Navigates current window to a given url
23
+ # @param url [String] navigate to the following url
24
+ # @return [void]
25
+ def get(url)
26
+ @subject.navigate.to(url)
27
+ end
28
+
29
+ # Set timeout wait
30
+ # @param timeout [Integer] the timeout in seconds
31
+ # @return [void]
32
+ def set_wait(timeout = nil)
33
+ timeout = 0 unless timeout
34
+ @subject.manage.timeouts.implicit_wait = timeout
35
+ end
36
+
37
+ # @param selector_type [Symbol] selector type (:css, :xpath, etc...)
38
+ # @param selector_path [String] path to element
39
+ # @return [Boolean] exists or not
40
+ def exists?(selector_type, selector_path)
41
+ exists = false
42
+
43
+ begin
44
+ original_timeout = @subject.manage.timeouts.implicit_wait
45
+ @subject.manage.timeouts.implicit_wait = 0
46
+ element_objects = @subject.find_elements(selector_type, selector_path)
47
+ @subject.manage.timeouts.implicit_wait = original_timeout
48
+ if element_objects.length > 0
49
+ exists = true
50
+ end
51
+ rescue Exception => e
52
+ end
53
+
54
+ return exists
55
+ end
56
+
57
+ # @param selector_type [Symbol] selector type, :css, :xpath, etc...
58
+ # @param selector_path [String] path to element
59
+ # @return [Object] element
60
+ def find_element(selector_type, selector_path)
61
+ element = @subject.find_element(selector_type, selector_path)
62
+ #Wrap in adapter interface
63
+ return AutomationObject::Driver::Element.new(Element.new(driver: self, element: element))
64
+ end
65
+
66
+ # @param selector_type [Symbol] selector type, :css, :xpath, etc...
67
+ # @param selector_path [String] path to element
68
+ # @return [Object] element
69
+ def find_elements(selector_type, selector_path)
70
+ elements = @subject.find_elements(selector_type, selector_path)
71
+
72
+ elements.map { |element|
73
+ AutomationObject::Driver::Element.new(Element.new(driver: self, element: element))
74
+ }
75
+ end
76
+
77
+ #Accept prompt either in browser or mobile
78
+ def accept_prompt
79
+ alert = @subject.switch_to.alert
80
+ alert.accept
81
+ @subject.switch_to.default_content
82
+ end
83
+
84
+ #Dismiss the prompt
85
+ def dismiss_prompt
86
+ alert = @subject.switch_to.alert
87
+ alert.dismiss
88
+ @subject.switch_to.default_content
89
+ end
90
+
91
+ # Check if browser, more useful for Appium but can be generic here
92
+ # @return [Boolean] whether or not browser is being used
93
+ def is_browser?
94
+ true
95
+ end
96
+
97
+ #Window Handles
98
+ # @return [Array<String>] array of window handle ids
99
+ def window_handles
100
+ @subject.window_handles
101
+ end
102
+
103
+ #Current window handle
104
+ # @return [String] handle id
105
+ def window_handle
106
+ @subject.window_handle
107
+ end
108
+
109
+ #Set current window handle to, will switch windows
110
+ # @param handle_value [String] window handle value
111
+ def window_handle=(handle_value)
112
+ @subject.switch_to.window(handle_value)
113
+ end
114
+
115
+ # Run script in browser to check if document in JS is complete
116
+ # @return [Boolean] document is complete
117
+ def document_complete?
118
+ return @subject.execute_script('return document.readyState;') == 'complete'
119
+ end
120
+
121
+ # Wait till the document is complete
122
+ # @return [void]
123
+ def document_complete_wait
124
+ 30.times do
125
+ sleep(DOC_COMPLETE_SLEEP)
126
+ break if self.document_complete?
127
+ end
128
+ end
129
+
130
+ # @param script [String] JS to run
131
+ # @return [Object, nil]
132
+ def execute_script(script)
133
+ @subject.execute_script(script)
134
+ end
135
+
136
+ # Destroy the driver
137
+ def quit
138
+ @subject.quit
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,116 @@
1
+ require_relative '../helpers/selenium_element_helper'
2
+
3
+ module AutomationObject
4
+ module Driver
5
+ module SeleniumAdapter
6
+ #Element proxy for Selenium
7
+ #Conform Selenium element interface to what's expected of the Driver Port
8
+ class Element < AutomationObject::Proxies::Proxy
9
+ include AutomationObject::Driver::SeleniumElementHelper
10
+
11
+ def initialize(args)
12
+ @driver = args.fetch :driver
13
+ @subject = args.fetch :element
14
+ end
15
+
16
+ # Set or Get attribute
17
+ # @param key [String] key of element
18
+ # @param value [String, nil] set value or leave blank
19
+ # @return [String, nil]
20
+ def attribute(key, value = nil)
21
+ @subject.attribute(key, value)
22
+ end
23
+
24
+ # @return [String] id of element
25
+ def id
26
+ @subject.id
27
+ end
28
+
29
+ # @return [String] href of element
30
+ def href
31
+ @subject.attribute('href')
32
+ end
33
+
34
+ # Text of element
35
+ # @return [String, nil]
36
+ def text
37
+ @subject.text
38
+ end
39
+
40
+ # Type into an element
41
+ # @return [void]
42
+ def send_keys(string)
43
+ @subject.send_keys(string)
44
+ end
45
+
46
+ # Clear the element field
47
+ # @return [void]
48
+ def clear
49
+ @subject.clear
50
+ end
51
+
52
+ # @return [Boolean]
53
+ def visible?
54
+ @subject.displayed?
55
+ end
56
+
57
+ # @return [Boolean]
58
+ def invisible?
59
+ !@subject.displayed?
60
+ end
61
+
62
+ # Get the location
63
+ # @return [Point]
64
+ def location
65
+ @subject.location
66
+ end
67
+
68
+ # Get the size of an element
69
+ # @return [Dimension]
70
+ def size
71
+ @subject.size
72
+ end
73
+
74
+ # Perform a submit action on an element
75
+ # @return [void]
76
+ def submit
77
+ @subject.submit
78
+ end
79
+
80
+ # Scroll the element into view
81
+ # @return [void]
82
+ def scroll_into_view
83
+ @subject.location_once_scrolled_into_view
84
+
85
+ element_location = self.location
86
+ scroll_position = @driver.scroll_position
87
+
88
+ middle_y_bounds = scroll_position[:y] + @driver.inner_window_height/2
89
+
90
+ if middle_y_bounds > element_location.y
91
+ #Add
92
+ y_difference = middle_y_bounds - element_location.y
93
+ scroll_y_position = scroll_position[:y] - y_difference
94
+ else
95
+ #Subtract
96
+ y_difference = element_location.y - middle_y_bounds
97
+ scroll_y_position = scroll_position[:y] + y_difference
98
+ end
99
+
100
+ #Get the element to halfway
101
+ scroll_x_position = element_location.x.to_f
102
+
103
+ javascript_string = "return window.scroll(#{scroll_x_position}, #{scroll_y_position});"
104
+ @driver.execute_script(javascript_string)
105
+ end
106
+
107
+ # Perform a click action on the element
108
+ # @return [void]
109
+ def click
110
+ self.scroll_into_view
111
+ @subject.click
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,33 @@
1
+ module AutomationObject
2
+ #Dsl Port
3
+ module Dsl
4
+ extend self
5
+
6
+ # @return [AutomationObject::Dsl::Module]
7
+ def adapter
8
+ return @adapter if @adapter
9
+ self.adapter = :blue_print
10
+ @adapter
11
+ end
12
+
13
+ # Sets adapter const will append _adapter if needed
14
+ # @param adapter_name [String] name of adapter wanted for composite creation
15
+ def adapter=(adapter_name)
16
+ adapter_name = adapter_name.to_s
17
+ adapter_name << '_adapter' unless adapter_name.match(/_adapter$/)
18
+ adapter_const = adapter_name.pascalize
19
+
20
+ require_relative "dsl/#{adapter_name}"
21
+ @adapter = AutomationObject::Dsl.const_get("#{adapter_const}")
22
+ end
23
+
24
+ # Creates/returns composite and attaches the State to the composite
25
+ # @return [AutomationObject::Dsl::Models::Top]
26
+ def new(args={})
27
+ composite = self.adapter.build(args)
28
+ composite.state = args.fetch(:state)
29
+
30
+ return composite
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'blue_print_adapter/top'
2
+
3
+ module AutomationObject
4
+ module Dsl
5
+ #BluePrint adapter for building DSL framework
6
+ #Follows similar pattern to BluePrint::HashAdapter composite
7
+ module BluePrintAdapter
8
+ # @param args [Hash] expects :blue_prints, :state
9
+ # @return [AutomationObject::Dsl::Models::Top]
10
+ def self.build(args={})
11
+ blue_print_adapter = Top.new(blue_prints: args.fetch(:blue_prints))
12
+ return blue_print_adapter.build
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,54 @@
1
+ module AutomationObject
2
+ module Dsl
3
+ module BluePrintAdapter
4
+ #Base class for the DSL BluePrint adapter composite
5
+ #BluePrintAdapter uses the BluePrint composite to create the proxy/model composite in the DSL
6
+ class Composite
7
+ class << self;
8
+ attr_accessor :implemented_proxy
9
+ end
10
+
11
+ # @param args [Hash] arguments, expects :blue_prints
12
+ def initialize(args={})
13
+ @blue_prints = args.fetch :blue_prints
14
+ end
15
+
16
+ # Build and return the DSL composite
17
+ # @return [Object] composite for the given level
18
+ def build
19
+ proxy = self.class.implemented_proxy.new
20
+
21
+ self.class.has_many_relationships.each { |name, composite_class|
22
+ @blue_prints.send(name).each { |child_key, child_blue_prints|
23
+ child_composite = composite_class.new(blue_prints: child_blue_prints)
24
+ child_proxy = child_composite.build
25
+
26
+ type = name.to_s.gsub(/e?s$/, '').to_sym #Unpluralize
27
+ proxy.add(name: child_key, type: type, object: child_proxy)
28
+ }
29
+ }
30
+
31
+ return proxy
32
+ end
33
+
34
+ #Declare which proxy is being used by the given BluePrint::Adapter composite class
35
+ # @param proxy_class [Class] proxy class used by the given composite
36
+ def self.implements_proxy(proxy_class)
37
+ self.implemented_proxy = proxy_class
38
+ end
39
+
40
+ #Has many children relationship for the composite
41
+ # @param children_name [Symbol] name of the children, should be a BluePrint method
42
+ # @param args [Hash] additional arguments, expects interface
43
+ def self.has_many(children_name, args)
44
+ self.has_many_relationships[children_name] = args.fetch(:interface)
45
+ end
46
+
47
+ # @return [Hash] relationships for the composite
48
+ def self.has_many_relationships
49
+ @has_many_relationships ||= Hash.new
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end