rutl 0.5.0 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f2590f32dfe005e1508e0e88f3faa3a840173da6bf67313f0e951642c13e611
4
- data.tar.gz: 500cbd32f70149497bd3a1decdccb21678f2e516d3b97e96aeaa4a2d5abfc72b
3
+ metadata.gz: 21fa6d406b33dee3134e1cf6da770e4f51434664d55d109b19858290ec5f0776
4
+ data.tar.gz: ab14d6f097caa9bbdc888ca8409c711fed65da87129bbcb03f96fa265aa5df34
5
5
  SHA512:
6
- metadata.gz: f312505641be60572b85da6fbe890a49be75af82f5c61c5f484b39e11596706f3c3b04c699a3759da8774227d1f86c1c18502ed8d765fe389a04c9c7c7a88505
7
- data.tar.gz: f0dd36b84da17dc6a4db7d61ae973f024a8f940ef408a27be3d79422e5a11a7989b178ce549bc6a3e4052fc5fd1971c93522c0ebb6479776fa75b8e8644ad19e
6
+ metadata.gz: 5c81506c59bc5224d50928351455241d83123cfb7d2ff3a8383b0aad7e0914ede6f20128e5dbe34d87743c0575ac33972b517a2506f51292a32dad64b29abc03
7
+ data.tar.gz: 2e99c3d93ae8cd9af232ffc26d214866f649cd2d295a553818e835e6e7b0ee3abd4f805741fefbfd85a910251451358309435fe3c6bd4bdc4419868cc667203c
@@ -40,7 +40,7 @@ Style/BracesAroundHashParameters:
40
40
  # And BasePage does @@loaded_pages.
41
41
  Style/ClassVars:
42
42
  Exclude:
43
- - 'lib/rutl/driver/null_driver_page_element.rb'
43
+ - 'lib/rutl/null_driver/null_element.rb'
44
44
  - 'lib/rutl/base_page.rb'
45
45
 
46
46
  # Rubocop flags lots of things as useless assignment when they're actually
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2018-06-07 12:55:41 -0700 using RuboCop version 0.56.0.
3
+ # on 2018-06-07 20:55:18 -0700 using RuboCop version 0.56.0.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -11,19 +11,26 @@
11
11
  Metrics/MethodLength:
12
12
  Max: 11
13
13
 
14
+ # Offense count: 2
15
+ Style/ClassVars:
16
+ Exclude:
17
+ - 'lib/rutl/driver/null_driver_page_element.rb'
18
+ - 'lib/rutl/base_page.rb'
19
+ - 'lib/rutl/null_driver/null_element.rb'
20
+
14
21
  # Offense count: 4
15
22
  # Configuration parameters: AllowedVariables.
16
23
  Style/GlobalVars:
17
24
  Exclude:
18
25
  - 'lib/rutl/browser.rb'
19
- - 'lib/rutl/interface/elements/element.rb'
20
- - 'lib/rutl/interface/elements/element_context.rb'
21
- - 'lib/rutl/interface/null_interface.rb'
26
+ - 'lib/rutl/element/element.rb'
27
+ - 'lib/rutl/element/element_context.rb'
28
+ - 'lib/rutl/interface/null.rb'
22
29
 
23
30
  # Offense count: 4
24
31
  Style/MethodMissingSuper:
25
32
  Exclude:
26
33
  - 'lib/rutl/browser.rb'
27
- - 'lib/rutl/interface/base_interface.rb'
28
- - 'lib/rutl/interface/elements/element.rb'
34
+ - 'lib/rutl/element/element.rb'
35
+ - 'lib/rutl/interface/base.rb'
29
36
  - 'lib/rutl/page.rb'
@@ -38,8 +38,8 @@ module RUTL
38
38
  private
39
39
 
40
40
  def load_interface(type)
41
- require "rutl/interface/#{type}_interface"
42
- klass = "RUTL::#{type.to_s.capitalize}Interface"
41
+ require "rutl/interface/#{type}"
42
+ klass = "RUTL::Interface::#{type.to_s.capitalize}"
43
43
  Object.const_get(klass).new
44
44
  end
45
45
 
@@ -20,7 +20,7 @@ module RUTL
20
20
  @counter = 0
21
21
  @driver = driver
22
22
  return if guard
23
- @base_name = base_name.sub('RUTL::', '')
23
+ @base_name = base_name.sub('::', '')
24
24
  @dir = File.join(RUTL::SCREENSHOTS, @base_name)
25
25
  FileUtils.mkdir_p @dir
26
26
  end
@@ -13,8 +13,8 @@ module RUTL
13
13
  # passed in isn't the same as the browser's interface.
14
14
  # This only happens with click test cases, before the click, and
15
15
  # only if that case isn't run first.
16
- # The context we're passed is also an instance from as ChromeInterface,
17
- # but a different instance.
16
+ # The context we're passed is also an instance from as
17
+ # RUTL::Interface::Chrome, but a different instance.
18
18
  #
19
19
  # Here's the kludge workaround line:
20
20
  @context.interface = $browser.interface
@@ -1,38 +1,40 @@
1
1
  module RUTL
2
2
  module Element
3
- #
4
- # The context passed around to all elements.
5
- # What they need to know outside of themselves to function.
6
- #
7
- class ElementContext
8
- # Nil. Or an Array. One would hope an Array of states. But I'm not checking.
9
- attr_accessor :destinations
10
- # Nil. Or a RUTL::BaseInterface.
11
- attr_accessor :interface
12
- # An Arrray, maybe empty and maybe an array of selectors.
13
- # TODO: This should be a hash.
14
- attr_accessor :selectors
3
+ #
4
+ # The context passed around to all elements.
5
+ # What they need to know outside of themselves to function.
6
+ #
7
+ class ElementContext
8
+ # Nil. Or an Array. One would hope an Array of states.
9
+ # But I'm not checking.
10
+ attr_accessor :destinations
11
+ # Nil. Or a RUTL::Interface::Base.
12
+ attr_accessor :interface
13
+ # An Arrray, maybe empty and maybe an array of selectors.
14
+ # TODO: This should be a hash.
15
+ attr_accessor :selectors
15
16
 
16
- def initialize(destinations: nil, interface: nil, selectors: [])
17
- unless destinations.nil? || destinations.class == Array
18
- # Should check each destination to make sure it's a
19
- # Page or a _____, too.
20
- raise 'destination must be an Array of destinations or nil.'
17
+ def initialize(destinations: nil, interface: nil, selectors: [])
18
+ unless destinations.nil? || destinations.class == Array
19
+ # Should check each destination to make sure it's a
20
+ # Page or a _____, too.
21
+ raise 'destination must be an Array of destinations or nil.'
22
+ end
23
+ @destinations = destinations || []
24
+ unless interface.nil? || interface.is_a?(RUTL::Interface::Base)
25
+ raise "#{interface.class}: #{interface} " \
26
+ 'must be an Interface::* class.'
27
+ end
28
+ @interface = interface
29
+ @selectors = selectors
21
30
  end
22
- @destinations = destinations || []
23
- unless interface.nil? || interface.is_a?(RUTL::BaseInterface)
24
- raise "#{interface.class}: #{interface} must be a *Interface class."
25
- end
26
- @interface = interface
27
- @selectors = selectors
28
- end
29
31
 
30
- def find_element(type)
31
- # @interface.driver.find_element(type, @selectors[type])
32
- # Should be this, but apparently @interface.driver is being overwritten
33
- # (or not written to) and it doesn't work. Using $browser does. :-(
34
- $browser.interface.driver.find_element(type, @selectors[type])
32
+ def find_element(type)
33
+ # @interface.driver.find_element(type, @selectors[type])
34
+ # Should be this, but apparently @interface.driver is being overwritten
35
+ # (or not written to) and it doesn't work. Using $browser does. :-(
36
+ $browser.interface.driver.find_element(type, @selectors[type])
37
+ end
35
38
  end
36
39
  end
37
40
  end
38
- end
@@ -0,0 +1,93 @@
1
+ require 'utilities'
2
+ require 'rutl/camera'
3
+
4
+ module RUTL
5
+ module Interface
6
+ #
7
+ # I might need to consider renaming these.
8
+ # The *interface classes lie between Browser
9
+ # and the webdriver-level classes.
10
+ #
11
+ class Base
12
+ include Utilities
13
+
14
+ # RUTL::Driver
15
+ attr_accessor :driver
16
+
17
+ # RUTL::Camera
18
+ attr_accessor :camera
19
+
20
+ # Array of all RUTL::Page classes
21
+ attr_accessor :pages
22
+
23
+ def initialize
24
+ raise 'Child interface class must set @driver.' if @driver.nil?
25
+ # base_name avoids collisions when unning the same tests with
26
+ # different browsers.
27
+ name = self.class.to_s.sub('RUTL::Interface', '')
28
+ @camera = Camera.new(@driver, base_name: name)
29
+ end
30
+
31
+ # Attempts to navigate to the page.
32
+ # Takes screenshot if successful.
33
+ def goto(page)
34
+ raise 'expect Page class' unless page?(page)
35
+ find_page(page).go_to_here
36
+ @camera.screenshot
37
+ end
38
+
39
+ # Should define in children; raises here.
40
+ # Should return the current page class.
41
+ def current_page
42
+ raise 'define in child classes'
43
+ end
44
+
45
+ def method_missing(method, *args, &block)
46
+ if args.empty?
47
+ current_page.send(method)
48
+ else
49
+ current_page.send(method, *args, &block)
50
+ end
51
+ end
52
+
53
+ # TODO: Is this needed? I not only find the page but also make sure the
54
+ # urls match. Even though that's what finding pages means?
55
+ def find_state(target_states)
56
+ target_states.each do |state|
57
+ next unless state.url == current_page.url
58
+ page = find_page(state)
59
+ return page if page.loaded?
60
+ end
61
+ false
62
+ end
63
+
64
+ # Attempts to find page by class or url.
65
+ def find_page(page)
66
+ @pages.each do |p|
67
+ return p if page?(page) && p.class == page
68
+ return p if String == page.class && page == p.url
69
+ end
70
+ raise "Page \"#{page}\" not found in pages #{@pages}"
71
+ end
72
+
73
+ # Calls the polling utility mathod await() with a lambda trying to
74
+ # find the next state, probably a Page class.
75
+ def wait_for_transition(target_states)
76
+ #
77
+ # TODO: Should also see if there are other things to wait for.
78
+ # I don't think this is doing page load time.
79
+ #
80
+ await -> { find_state target_states }
81
+ end
82
+
83
+ def respond_to_missing?(*args)
84
+ # This can't be right. Figure it out later.
85
+ current_page.respond_to?(*args)
86
+ end
87
+
88
+ def quit
89
+ @driver.quit
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,36 @@
1
+ require 'selenium-webdriver'
2
+ require 'rutl/interface/base'
3
+
4
+ module RUTL
5
+ module Interface
6
+ #
7
+ # Small interface for Chrome browser.
8
+ #
9
+ class Chrome < Base
10
+ # rubocop:disable Metrics/MethodLength
11
+ def initialize
12
+ @logged_in = true
13
+ options = Selenium::WebDriver::Chrome::Options.new
14
+ options.add_argument('--ignore-certificate-errors')
15
+ options.add_argument('--disable-popup-blocking')
16
+ options.add_argument('--disable-translate')
17
+ # Run headless on TravisCI
18
+ if ENV['TRAVIS'] == 'true'
19
+ options.add_argument('--disable-gpu')
20
+ options.add_argument('--headless ')
21
+ options.add_argument('--no-sandbox')
22
+ end
23
+ @driver = Selenium::WebDriver.for :chrome, options: options
24
+ super
25
+ end
26
+ # rubocop:enable Metrics/MethodLength
27
+
28
+ def current_page
29
+ url = @driver.current_url
30
+ page = find_page(url)
31
+ raise "PAGE NOT FOUND: #{url}, PAGES: #{@pages}" unless page
32
+ page
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ require 'selenium-webdriver'
2
+ require 'rutl/interface/base'
3
+
4
+ module RUTL
5
+ module Interface
6
+ #
7
+ # Small interface for Chrome browser.
8
+ #
9
+ class Firefox < Base
10
+ def initialize
11
+ @logged_in = true
12
+ options = Selenium::WebDriver::Firefox::Options.new
13
+ options.add_argument('--ignore-certificate-errors')
14
+ options.add_argument('--disable-popup-blocking')
15
+ options.add_argument('--disable-translate')
16
+ options.add_argument('--headless') if ENV['TRAVIS'] == 'true'
17
+ @driver = Selenium::WebDriver.for :firefox, options: options
18
+ super
19
+ end
20
+
21
+ def current_page
22
+ url = @driver.current_url
23
+ page = find_page(url)
24
+ raise "PAGE NOT FOUND: #{url}, PAGES: #{@pages}" unless page
25
+ page
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ require 'rutl/interface/base'
2
+
3
+ module RUTL
4
+ module Interface
5
+ #
6
+ # Interface-level code for fake browser.
7
+ #
8
+ class Null < Base
9
+ def initialize
10
+ context = RUTL::Element::ElementContext.new(destinations: nil,
11
+ interface: self,
12
+ selectors: [])
13
+ @driver = NullDriver.new(context)
14
+ super
15
+ end
16
+
17
+ # The null driver needs to talk to the null interface.
18
+ # Other driver/interface relations are not like this.
19
+ attr_writer :current_page
20
+
21
+ def current_page
22
+ # Default to @pages.first if not set?
23
+ # A browser can always check its current URL but the null driver can't.
24
+ @current_page ||= @pages.first
25
+ end
26
+
27
+ def wait_for_transition(destinations)
28
+ # TODO: Setting @current page didn't do it beacause that set
29
+ # context.interface.current_page and we wanted this in the browser.
30
+ @current_page = destinations.first.new(self)
31
+ $browser.current_page = @current_page
32
+ end
33
+ end
34
+ end
35
+ end
@@ -49,8 +49,7 @@ module RUTL
49
49
  # Placeholder - NOP
50
50
  # Called by RUTL::Element::ClickToChangeStateMixin like
51
51
  # Selenium driver.click
52
- def click
53
- end
52
+ def click; end
54
53
  end
55
54
  end
56
55
  end
@@ -84,8 +84,8 @@ module RUTL
84
84
  def method_missing(element, *args, &_block)
85
85
  name, selectors, rest = args
86
86
  context = RUTL::Element::ElementContext.new(destinations: rest,
87
- interface: @interface,
88
- selectors: selectors)
87
+ interface: @interface,
88
+ selectors: selectors)
89
89
  case element
90
90
  when /button/, /checkbox/, /element/, /link/
91
91
  add_method(name: name, context: context, klass: element)
@@ -1,3 +1,3 @@
1
1
  module RUTL
2
- VERSION = '0.5.0'.freeze
2
+ VERSION = '0.6.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rutl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Drew Cooper
@@ -198,10 +198,10 @@ files:
198
198
  - lib/rutl/element/link.rb
199
199
  - lib/rutl/element/string_reader_writer_mixin.rb
200
200
  - lib/rutl/element/text.rb
201
- - lib/rutl/interface/base_interface.rb
202
- - lib/rutl/interface/chrome_interface.rb
203
- - lib/rutl/interface/firefox_interface.rb
204
- - lib/rutl/interface/null_interface.rb
201
+ - lib/rutl/interface/base.rb
202
+ - lib/rutl/interface/chrome.rb
203
+ - lib/rutl/interface/firefox.rb
204
+ - lib/rutl/interface/null.rb
205
205
  - lib/rutl/null_driver/null_driver.rb
206
206
  - lib/rutl/null_driver/null_element.rb
207
207
  - lib/rutl/page.rb
@@ -1,90 +0,0 @@
1
- require 'utilities'
2
- require 'rutl/camera'
3
-
4
- module RUTL
5
- #
6
- # I might need to consider renaming these.
7
- # The *interface classes lie between Browser and the webdriver-level classes.
8
- #
9
- class BaseInterface
10
- include Utilities
11
-
12
- # RUTL::Driver
13
- attr_accessor :driver
14
-
15
- # RUTL::Camera
16
- attr_accessor :camera
17
-
18
- # Array of all RUTL::Page classes
19
- attr_accessor :pages
20
-
21
- def initialize
22
- raise 'Child interface class must set @driver.' if @driver.nil?
23
- # base_name avoids collisions when unning the same tests with
24
- # different browsers.
25
- name = self.class.to_s.sub('RUTL::Interface', '')
26
- @camera = Camera.new(@driver, base_name: name)
27
- end
28
-
29
- # Attempts to navigate to the page.
30
- # Takes screenshot if successful.
31
- def goto(page)
32
- raise 'expect Page class' unless page?(page)
33
- find_page(page).go_to_here
34
- @camera.screenshot
35
- end
36
-
37
- # Should define in children; raises here.
38
- # Should return the current page class.
39
- def current_page
40
- raise 'define in child classes'
41
- end
42
-
43
- def method_missing(method, *args, &block)
44
- if args.empty?
45
- current_page.send(method)
46
- else
47
- current_page.send(method, *args, &block)
48
- end
49
- end
50
-
51
- # TODO: Is this needed? I not only find the page but also make sure the
52
- # urls match. Even though that's what finding pages means?
53
- def find_state(target_states)
54
- target_states.each do |state|
55
- next unless state.url == current_page.url
56
- page = find_page(state)
57
- return page if page.loaded?
58
- end
59
- false
60
- end
61
-
62
- # Attempts to find page by class or url.
63
- def find_page(page)
64
- @pages.each do |p|
65
- return p if page?(page) && p.class == page
66
- return p if String == page.class && page == p.url
67
- end
68
- raise "Page \"#{page}\" not found in pages #{@pages}"
69
- end
70
-
71
- # Calls the polling utility mathod await() with a lambda trying to
72
- # find the next state, probably a Page class.
73
- def wait_for_transition(target_states)
74
- #
75
- # TODO: Should also see if there are other things to wait for.
76
- # I don't think this is doing page load time.
77
- #
78
- await -> { find_state target_states }
79
- end
80
-
81
- def respond_to_missing?(*args)
82
- # This can't be right. Figure it out later.
83
- current_page.respond_to?(*args)
84
- end
85
-
86
- def quit
87
- @driver.quit
88
- end
89
- end
90
- end
@@ -1,34 +0,0 @@
1
- require 'selenium-webdriver'
2
- require 'rutl/interface/base_interface'
3
-
4
- module RUTL
5
- #
6
- # Small interface for Chrome browser.
7
- #
8
- class ChromeInterface < BaseInterface
9
- # rubocop:disable Metrics/MethodLength
10
- def initialize
11
- @logged_in = true
12
- options = Selenium::WebDriver::Chrome::Options.new
13
- options.add_argument('--ignore-certificate-errors')
14
- options.add_argument('--disable-popup-blocking')
15
- options.add_argument('--disable-translate')
16
- # Run headless on TravisCI
17
- if ENV['TRAVIS'] == 'true'
18
- options.add_argument('--disable-gpu')
19
- options.add_argument('--headless ')
20
- options.add_argument('--no-sandbox')
21
- end
22
- @driver = Selenium::WebDriver.for :chrome, options: options
23
- super
24
- end
25
- # rubocop:enable Metrics/MethodLength
26
-
27
- def current_page
28
- url = @driver.current_url
29
- page = find_page(url)
30
- raise "PAGE NOT FOUND: #{url}, PAGES: #{@pages}" unless page
31
- page
32
- end
33
- end
34
- end
@@ -1,27 +0,0 @@
1
- require 'selenium-webdriver'
2
- require 'rutl/interface/base_interface'
3
-
4
- module RUTL
5
- #
6
- # Small interface for Chrome browser.
7
- #
8
- class FirefoxInterface < BaseInterface
9
- def initialize
10
- @logged_in = true
11
- options = Selenium::WebDriver::Firefox::Options.new
12
- options.add_argument('--ignore-certificate-errors')
13
- options.add_argument('--disable-popup-blocking')
14
- options.add_argument('--disable-translate')
15
- options.add_argument('--headless') if ENV['TRAVIS'] == 'true'
16
- @driver = Selenium::WebDriver.for :firefox, options: options
17
- super
18
- end
19
-
20
- def current_page
21
- url = @driver.current_url
22
- page = find_page(url)
23
- raise "PAGE NOT FOUND: #{url}, PAGES: #{@pages}" unless page
24
- page
25
- end
26
- end
27
- end
@@ -1,33 +0,0 @@
1
- require 'rutl/interface/base_interface'
2
-
3
- module RUTL
4
- #
5
- # Interface-level code for fake browser.
6
- #
7
- class NullInterface < BaseInterface
8
- def initialize
9
- context = RUTL::Element::ElementContext.new(destinations: nil,
10
- interface: self,
11
- selectors: [])
12
- @driver = NullDriver.new(context)
13
- super
14
- end
15
-
16
- # The null driver needs to talk to the null interface.
17
- # Other driver/interface relations are not like this.
18
- attr_writer :current_page
19
-
20
- def current_page
21
- # Default to @pages.first if not set?
22
- # A browser can always check its current URL but the null driver can't.
23
- @current_page ||= @pages.first
24
- end
25
-
26
- def wait_for_transition(destinations)
27
- # TODO: Setting @current page didn't do it beacause that set
28
- # context.interface.current_page and we wanted this in the browser.
29
- @current_page = destinations.first.new(self)
30
- $browser.current_page = @current_page
31
- end
32
- end
33
- end