eyes_core 3.17.16 → 3.17.21
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 +4 -4
 - data/lib/applitools/appium/android_region_provider.rb +24 -0
 - data/lib/applitools/appium/eyes.rb +16 -6
 - data/lib/applitools/appium/ios_region_provider.rb +25 -0
 - data/lib/applitools/appium/region_provider.rb +35 -10
 - data/lib/applitools/appium/utils.rb +12 -1
 - data/lib/applitools/core/app_output.rb +16 -2
 - data/lib/applitools/core/batch_info.rb +5 -3
 - data/lib/applitools/core/eyes_base.rb +29 -30
 - data/lib/applitools/core/match_window_data.rb +10 -0
 - data/lib/applitools/core/match_window_task.rb +20 -26
 - data/lib/applitools/core/screenshot.rb +9 -0
 - data/lib/applitools/version.rb +1 -1
 - data/lib/eyes_consts.rb +4 -0
 - data/lib/eyes_core.rb +1 -0
 - metadata +5 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 5f5de232cfebace23a11b460e49b9d345bace6aaae97c3348694f7ae55bb94a5
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 95e1815deed07620bcaec68b0de6e2938b7c6d8b87aafb8b5f0e16abfbe247bf
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: e1bc1a7f731af8f0e78164246e039dac0967adc00c66dc343a51c15e3355ca826874b534ab77ba16e1eb6dad159cb026536c7ded50c9405a008c6b499710614a
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 9e848677e2e2a2edda3e6ecd45ff4421a9dc6f0c4706982cd9f103e07efd6f228b66acdbf31a5dbb9fffeef4e9f234b9c7a738a4901c735477006d8db9601c6a
         
     | 
| 
         @@ -0,0 +1,24 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'region_provider'
         
     | 
| 
      
 4 
     | 
    
         
            +
            module Applitools
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Appium
         
     | 
| 
      
 6 
     | 
    
         
            +
                class AndroidRegionProvider < ::Applitools::Appium::RegionProvider
         
     | 
| 
      
 7 
     | 
    
         
            +
                  private
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  def convert_element_coordinates
         
     | 
| 
      
 10 
     | 
    
         
            +
                    Applitools::Region.from_location_size(eye_region.location, eye_region.size)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  def convert_viewport_rect_coordinates
         
     | 
| 
      
 14 
     | 
    
         
            +
                    region  = viewport_rect
         
     | 
| 
      
 15 
     | 
    
         
            +
                    Applitools::Region.new(
         
     | 
| 
      
 16 
     | 
    
         
            +
                        region['left'],
         
     | 
| 
      
 17 
     | 
    
         
            +
                        region['top'],
         
     | 
| 
      
 18 
     | 
    
         
            +
                        region['width'],
         
     | 
| 
      
 19 
     | 
    
         
            +
                        region['height']
         
     | 
| 
      
 20 
     | 
    
         
            +
                    )
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
              end
         
     | 
| 
      
 24 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class Applitools::Appium::Eyes < Applitools::Selenium::SeleniumEyes
         
     | 
| 
       4 
4 
     | 
    
         
             
              attr_accessor :status_bar_height
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
       5 
6 
     | 
    
         
             
              def perform_driver_settings_for_appium_driver
         
     | 
| 
       6 
7 
     | 
    
         
             
                self.region_visibility_strategy = Applitools::Selenium::NopRegionVisibilityStrategy.new
         
     | 
| 
       7 
8 
     | 
    
         
             
                self.force_driver_resolution_as_viewport_size = true
         
     | 
| 
         @@ -51,7 +52,7 @@ class Applitools::Appium::Eyes < Applitools::Selenium::SeleniumEyes 
     | 
|
| 
       51 
52 
     | 
    
         | 
| 
       52 
53 
     | 
    
         
             
                eyes_element = target_to_check.region_to_check.call(driver)
         
     | 
| 
       53 
54 
     | 
    
         
             
                self.eyes_element_to_check = eyes_element
         
     | 
| 
       54 
     | 
    
         
            -
                region_provider =  
     | 
| 
      
 55 
     | 
    
         
            +
                region_provider = region_provider_class.new(driver, eyes_element)
         
     | 
| 
       55 
56 
     | 
    
         
             
                match_data.read_target(target_to_check, driver)
         
     | 
| 
       56 
57 
     | 
    
         | 
| 
       57 
58 
     | 
    
         
             
                check_window_base(
         
     | 
| 
         @@ -119,16 +120,19 @@ class Applitools::Appium::Eyes < Applitools::Selenium::SeleniumEyes 
     | 
|
| 
       119 
120 
     | 
    
         | 
| 
       120 
121 
     | 
    
         
             
              def viewport_screenshot
         
     | 
| 
       121 
122 
     | 
    
         
             
                logger.info 'Viewport screenshot requested...'
         
     | 
| 
       122 
     | 
    
         
            -
             
     | 
| 
       123 
     | 
    
         
            -
                self.screenshot = screenshot_class.new(
         
     | 
| 
       124 
     | 
    
         
            -
                  Applitools::Screenshot.from_datastream(driver.screenshot_as(:png))
         
     | 
| 
       125 
     | 
    
         
            -
                )
         
     | 
| 
      
 123 
     | 
    
         
            +
                obtain_viewport_screenshot
         
     | 
| 
       126 
124 
     | 
    
         
             
              end
         
     | 
| 
       127 
125 
     | 
    
         | 
| 
       128 
126 
     | 
    
         
             
              def element_screenshot
         
     | 
| 
       129 
127 
     | 
    
         
             
                logger.info 'Element screenshot requested...'
         
     | 
| 
      
 128 
     | 
    
         
            +
                obtain_viewport_screenshot
         
     | 
| 
      
 129 
     | 
    
         
            +
              end
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
              def obtain_viewport_screenshot
         
     | 
| 
       130 
132 
     | 
    
         
             
                self.screenshot = screenshot_class.new(
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
      
 133 
     | 
    
         
            +
                    Applitools::Screenshot.from_datastream(driver.screenshot_as(:png)),
         
     | 
| 
      
 134 
     | 
    
         
            +
                    status_bar_height: Applitools::Utils::EyesSeleniumUtils.status_bar_height(driver),
         
     | 
| 
      
 135 
     | 
    
         
            +
                    device_pixel_ratio: Applitools::Utils::EyesSeleniumUtils.device_pixel_ratio(driver)
         
     | 
| 
       132 
136 
     | 
    
         
             
                )
         
     | 
| 
       133 
137 
     | 
    
         
             
              end
         
     | 
| 
       134 
138 
     | 
    
         | 
| 
         @@ -137,4 +141,10 @@ class Applitools::Appium::Eyes < Applitools::Selenium::SeleniumEyes 
     | 
|
| 
       137 
141 
     | 
    
         
             
                return Applitools::Appium::AndroidScreenshot if Applitools::Utils::EyesSeleniumUtils.android?(Applitools::Appium::Driver::AppiumLib)
         
     | 
| 
       138 
142 
     | 
    
         
             
                raise Applitools::EyesError, 'Unknown device type'
         
     | 
| 
       139 
143 
     | 
    
         
             
              end
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
              def region_provider_class
         
     | 
| 
      
 146 
     | 
    
         
            +
                return Applitools::Appium::IosRegionProvider if Applitools::Utils::EyesSeleniumUtils.ios?(Applitools::Appium::Driver::AppiumLib)
         
     | 
| 
      
 147 
     | 
    
         
            +
                return Applitools::Appium::AndroidRegionProvider if Applitools::Utils::EyesSeleniumUtils.android?(Applitools::Appium::Driver::AppiumLib)
         
     | 
| 
      
 148 
     | 
    
         
            +
                raise Applitools::EyesError, 'Unknown device type'
         
     | 
| 
      
 149 
     | 
    
         
            +
              end
         
     | 
| 
       140 
150 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            #
         
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'region_provider'
         
     | 
| 
      
 4 
     | 
    
         
            +
            module Applitools
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Appium
         
     | 
| 
      
 6 
     | 
    
         
            +
                class IosRegionProvider < ::Applitools::Appium::RegionProvider
         
     | 
| 
      
 7 
     | 
    
         
            +
                  private
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  def convert_element_coordinates
         
     | 
| 
      
 10 
     | 
    
         
            +
                    Applitools::Region.from_location_size(eye_region.location, eye_region.size).
         
     | 
| 
      
 11 
     | 
    
         
            +
                        scale_it!(scale_factor)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  def convert_viewport_rect_coordinates
         
     | 
| 
      
 15 
     | 
    
         
            +
                    region  = viewport_rect
         
     | 
| 
      
 16 
     | 
    
         
            +
                    Applitools::Region.new(
         
     | 
| 
      
 17 
     | 
    
         
            +
                      region['left'],
         
     | 
| 
      
 18 
     | 
    
         
            +
                      region['top'],
         
     | 
| 
      
 19 
     | 
    
         
            +
                      region['width'],
         
     | 
| 
      
 20 
     | 
    
         
            +
                      region['height']
         
     | 
| 
      
 21 
     | 
    
         
            +
                    )
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -3,23 +3,48 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module Applitools
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Appium
         
     | 
| 
       5 
5 
     | 
    
         
             
                class RegionProvider
         
     | 
| 
       6 
     | 
    
         
            -
                  attr_accessor :driver, :eye_region, : 
     | 
| 
      
 6 
     | 
    
         
            +
                  attr_accessor :driver, :eye_region, :region_to_check
         
     | 
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
                  def initialize(driver, eye_region)
         
     | 
| 
       9 
9 
     | 
    
         
             
                    self.driver = driver
         
     | 
| 
       10 
10 
     | 
    
         
             
                    self.eye_region = eye_region
         
     | 
| 
      
 11 
     | 
    
         
            +
                    self.region_to_check = Applitools::Region::EMPTY
         
     | 
| 
      
 12 
     | 
    
         
            +
                    convert_region_coordinates
         
     | 
| 
       11 
13 
     | 
    
         
             
                  end
         
     | 
| 
       12 
14 
     | 
    
         | 
| 
       13 
15 
     | 
    
         
             
                  def region
         
     | 
| 
       14 
     | 
    
         
            -
                     
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 16 
     | 
    
         
            +
                    region_to_check
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  def coordinate_type
         
     | 
| 
      
 20 
     | 
    
         
            +
                    nil
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  private
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                  def viewport_rect
         
     | 
| 
      
 26 
     | 
    
         
            +
                    Applitools::Utils::EyesSeleniumUtils.viewport_rect(driver)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  def convert_region_coordinates
         
     | 
| 
      
 30 
     | 
    
         
            +
                    self.region_to_check = case eye_region
         
     | 
| 
      
 31 
     | 
    
         
            +
                                           when ::Selenium::WebDriver::Element, Applitools::Selenium::Element
         
     | 
| 
      
 32 
     | 
    
         
            +
                                              convert_element_coordinates
         
     | 
| 
      
 33 
     | 
    
         
            +
                                           else
         
     | 
| 
      
 34 
     | 
    
         
            +
                                              convert_viewport_rect_coordinates
         
     | 
| 
      
 35 
     | 
    
         
            +
                                           end
         
     | 
| 
      
 36 
     | 
    
         
            +
                  end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  def convert_element_coordinates
         
     | 
| 
      
 39 
     | 
    
         
            +
                    raise Applitools::AbstractMethodCalled.new(:convert_region_coordinates, 'Applitools::Appium::RegionProvider')
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  def convert_viewport_rect_coordinates
         
     | 
| 
      
 43 
     | 
    
         
            +
                    raise Applitools::AbstractMethodCalled.new(:convert_viewport_rect_coordinates, 'Applitools::Appium::RegionProvider')
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                  def scale_factor
         
     | 
| 
      
 47 
     | 
    
         
            +
                    Applitools::Utils::EyesSeleniumUtils.device_pixel_ratio(driver)
         
     | 
| 
       23 
48 
     | 
    
         
             
                  end
         
     | 
| 
       24 
49 
     | 
    
         
             
                end
         
     | 
| 
       25 
50 
     | 
    
         
             
              end
         
     | 
| 
         @@ -28,7 +28,7 @@ module Applitools::Appium 
     | 
|
| 
       28 
28 
     | 
    
         
             
                def device_pixel_ratio(executor)
         
     | 
| 
       29 
29 
     | 
    
         
             
                  session_info = session_capabilities(executor)
         
     | 
| 
       30 
30 
     | 
    
         
             
                  return session_info['pixelRatio'].to_f if session_info['pixelRatio']
         
     | 
| 
       31 
     | 
    
         
            -
                   
     | 
| 
      
 31 
     | 
    
         
            +
                  1
         
     | 
| 
       32 
32 
     | 
    
         
             
                end
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
                def status_bar_height(executor)
         
     | 
| 
         @@ -37,6 +37,17 @@ module Applitools::Appium 
     | 
|
| 
       37 
37 
     | 
    
         
             
                  0
         
     | 
| 
       38 
38 
     | 
    
         
             
                end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
      
 40 
     | 
    
         
            +
                def viewport_rect(executor)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  session_info = session_capabilities(executor)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  return session_info['viewportRect'] if session_info['viewportRect']
         
     | 
| 
      
 43 
     | 
    
         
            +
                  {
         
     | 
| 
      
 44 
     | 
    
         
            +
                    'left' => 0,
         
     | 
| 
      
 45 
     | 
    
         
            +
                    'top' => 0,
         
     | 
| 
      
 46 
     | 
    
         
            +
                    'width' => 0,
         
     | 
| 
      
 47 
     | 
    
         
            +
                    'height' => 0
         
     | 
| 
      
 48 
     | 
    
         
            +
                  }
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
       40 
51 
     | 
    
         
             
                def session_capabilities(executor)
         
     | 
| 
       41 
52 
     | 
    
         
             
                   executor.session_capabilities if executor.respond_to? :session_capabilities
         
     | 
| 
       42 
53 
     | 
    
         
             
                end
         
     | 
| 
         @@ -2,7 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            module Applitools
         
     | 
| 
       4 
4 
     | 
    
         
             
              class AppOutput
         
     | 
| 
       5 
     | 
    
         
            -
                attr_reader :title, :screenshot64, :location
         
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :title, :screenshot64, :location, :screenshot_url_getter, :dom_url_getter
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
                attr_accessor :dom_url, :screenshot_url, :visual_viewport
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
         @@ -10,6 +10,8 @@ module Applitools 
     | 
|
| 
       10 
10 
     | 
    
         
             
                  @title = title
         
     | 
| 
       11 
11 
     | 
    
         
             
                  @screenshot64 = screenshot64
         
     | 
| 
       12 
12 
     | 
    
         
             
                  @location = Applitools::Location::TOP_LEFT
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @screenshot_url_getter = nil
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @dom_url_getter = nil
         
     | 
| 
       13 
15 
     | 
    
         
             
                end
         
     | 
| 
       14 
16 
     | 
    
         | 
| 
       15 
17 
     | 
    
         
             
                def location=(value)
         
     | 
| 
         @@ -17,12 +19,24 @@ module Applitools 
     | 
|
| 
       17 
19 
     | 
    
         
             
                  @location = value
         
     | 
| 
       18 
20 
     | 
    
         
             
                end
         
     | 
| 
       19 
21 
     | 
    
         | 
| 
      
 22 
     | 
    
         
            +
                def on_need_screenshot_url(&block)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  @screenshot_url_getter = block if block_given?
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                def on_need_dom_url(&block)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  @dom_url_getter = block if block_given?
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                def dom_url
         
     | 
| 
      
 31 
     | 
    
         
            +
                  @dom_url ||= (@dom_url_getter && @dom_url_getter.call)
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
       20 
34 
     | 
    
         
             
                def to_hash
         
     | 
| 
       21 
35 
     | 
    
         
             
                  result = {
         
     | 
| 
       22 
36 
     | 
    
         
             
                    Title: title,
         
     | 
| 
       23 
37 
     | 
    
         
             
                    Screenshot64: nil,
         
     | 
| 
       24 
38 
     | 
    
         
             
                    Location: location.to_hash,
         
     | 
| 
       25 
     | 
    
         
            -
                    ScreenshotUrl: screenshot_url
         
     | 
| 
      
 39 
     | 
    
         
            +
                    ScreenshotUrl: screenshot_url || (screenshot_url_getter && screenshot_url_getter.call)
         
     | 
| 
       26 
40 
     | 
    
         
             
                  }
         
     | 
| 
       27 
41 
     | 
    
         
             
                  result[:DomUrl] = dom_url if dom_url
         
     | 
| 
       28 
42 
     | 
    
         
             
                  result[:visualViewport] = visual_viewport if visual_viewport
         
     | 
| 
         @@ -6,17 +6,19 @@ require_relative 'helpers' 
     | 
|
| 
       6 
6 
     | 
    
         
             
            module Applitools
         
     | 
| 
       7 
7 
     | 
    
         
             
              class BatchInfo
         
     | 
| 
       8 
8 
     | 
    
         
             
                extend Helpers
         
     | 
| 
       9 
     | 
    
         
            -
                attr_accessor :started_at, :id
         
     | 
| 
      
 9 
     | 
    
         
            +
                attr_accessor :started_at, :id, :notify_on_completion
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                environment_attribute :name, 'APPLITOOLS_BATCH_NAME'
         
     | 
| 
       12 
12 
     | 
    
         
             
                environment_attribute :id, 'APPLITOOLS_BATCH_ID'
         
     | 
| 
       13 
13 
     | 
    
         
             
                environment_attribute :sequence_name, 'APPLITOOLS_BATCH_SEQUENCE'
         
     | 
| 
       14 
     | 
    
         
            -
                environment_attribute : 
     | 
| 
      
 14 
     | 
    
         
            +
                environment_attribute :env_notify_on_completion, 'APPLITOOLS_BATCH_NOTIFY'
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       15 
16 
     | 
    
         | 
| 
       16 
17 
     | 
    
         
             
                def initialize(name = nil, started_at = Time.now)
         
     | 
| 
       17 
18 
     | 
    
         
             
                  self.name = name if name
         
     | 
| 
       18 
19 
     | 
    
         
             
                  @started_at = started_at
         
     | 
| 
       19 
20 
     | 
    
         
             
                  self.id = SecureRandom.uuid unless id
         
     | 
| 
      
 21 
     | 
    
         
            +
                  self.notify_on_completion = 'true'.casecmp(env_notify_on_completion || '') == 0 ? true : false
         
     | 
| 
       20 
22 
     | 
    
         
             
                end
         
     | 
| 
       21 
23 
     | 
    
         | 
| 
       22 
24 
     | 
    
         
             
                def json_data
         
     | 
| 
         @@ -25,7 +27,7 @@ module Applitools 
     | 
|
| 
       25 
27 
     | 
    
         
             
                      'name' => name,
         
     | 
| 
       26 
28 
     | 
    
         
             
                      'startedAt' => @started_at.iso8601,
         
     | 
| 
       27 
29 
     | 
    
         
             
                      'batchSequenceName' => sequence_name,
         
     | 
| 
       28 
     | 
    
         
            -
                      'notifyOnCompletion' =>  
     | 
| 
      
 30 
     | 
    
         
            +
                      'notifyOnCompletion' => notify_on_completion
         
     | 
| 
       29 
31 
     | 
    
         
             
                  }
         
     | 
| 
       30 
32 
     | 
    
         
             
                end
         
     | 
| 
       31 
33 
     | 
    
         | 
| 
         @@ -280,7 +280,6 @@ module Applitools 
     | 
|
| 
       280 
280 
     | 
    
         
             
                      self.last_screenshot = result.screenshot
         
     | 
| 
       281 
281 
     | 
    
         
             
                    end
         
     | 
| 
       282 
282 
     | 
    
         | 
| 
       283 
     | 
    
         
            -
                    self.should_match_window_run_once_on_timeout = true
         
     | 
| 
       284 
283 
     | 
    
         
             
                    self.failed = true
         
     | 
| 
       285 
284 
     | 
    
         
             
                    logger.info "Mistmatch! #{tag}" unless running_session.new_session?
         
     | 
| 
       286 
285 
     | 
    
         | 
| 
         @@ -614,27 +613,7 @@ module Applitools 
     | 
|
| 
       614 
613 
     | 
    
         
             
                end
         
     | 
| 
       615 
614 
     | 
    
         | 
| 
       616 
615 
     | 
    
         
             
                def get_app_output_with_screenshot(region_provider, _last_screenshot)
         
     | 
| 
       617 
     | 
    
         
            -
                  dom_url = ''
         
     | 
| 
       618 
616 
     | 
    
         
             
                  captured_dom_data = dom_data
         
     | 
| 
       619 
     | 
    
         
            -
                  unless captured_dom_data.empty?
         
     | 
| 
       620 
     | 
    
         
            -
                    begin
         
     | 
| 
       621 
     | 
    
         
            -
                      logger.info 'Processing DOM..'
         
     | 
| 
       622 
     | 
    
         
            -
                      dom_url = server_connector.post_dom_json(captured_dom_data, runner.rendering_info(server_connector)) do |json|
         
     | 
| 
       623 
     | 
    
         
            -
                        io = StringIO.new
         
     | 
| 
       624 
     | 
    
         
            -
                        gz = Zlib::GzipWriter.new(io)
         
     | 
| 
       625 
     | 
    
         
            -
                        gz.write(json.encode('UTF-8'))
         
     | 
| 
       626 
     | 
    
         
            -
                        gz.close
         
     | 
| 
       627 
     | 
    
         
            -
                        result = io.string
         
     | 
| 
       628 
     | 
    
         
            -
                        io.close
         
     | 
| 
       629 
     | 
    
         
            -
                        result
         
     | 
| 
       630 
     | 
    
         
            -
                      end
         
     | 
| 
       631 
     | 
    
         
            -
                      logger.info 'Done'
         
     | 
| 
       632 
     | 
    
         
            -
                      logger.info dom_url
         
     | 
| 
       633 
     | 
    
         
            -
                    rescue Applitools::EyesError => e
         
     | 
| 
       634 
     | 
    
         
            -
                      logger.warn e.message
         
     | 
| 
       635 
     | 
    
         
            -
                      dom_url = nil
         
     | 
| 
       636 
     | 
    
         
            -
                    end
         
     | 
| 
       637 
     | 
    
         
            -
                  end
         
     | 
| 
       638 
617 
     | 
    
         
             
                  logger.info 'Getting screenshot...'
         
     | 
| 
       639 
618 
     | 
    
         
             
                  screenshot = capture_screenshot
         
     | 
| 
       640 
619 
     | 
    
         
             
                  logger.info 'Done getting screenshot!'
         
     | 
| 
         @@ -646,21 +625,41 @@ module Applitools 
     | 
|
| 
       646 
625 
     | 
    
         | 
| 
       647 
626 
     | 
    
         
             
                  screenshot = yield(screenshot) if block_given?
         
     | 
| 
       648 
627 
     | 
    
         | 
| 
       649 
     | 
    
         
            -
                  if screenshot
         
     | 
| 
       650 
     | 
    
         
            -
                    self.screenshot_url = server_connector.put_screenshot(
         
     | 
| 
       651 
     | 
    
         
            -
                      runner.rendering_info(server_connector),
         
     | 
| 
       652 
     | 
    
         
            -
                      screenshot
         
     | 
| 
       653 
     | 
    
         
            -
                    )
         
     | 
| 
       654 
     | 
    
         
            -
                  end
         
     | 
| 
       655 
     | 
    
         
            -
             
     | 
| 
       656 
628 
     | 
    
         
             
                  logger.info 'Getting title...'
         
     | 
| 
       657 
629 
     | 
    
         
             
                  a_title = title
         
     | 
| 
       658 
630 
     | 
    
         
             
                  logger.info 'Done!'
         
     | 
| 
       659 
631 
     | 
    
         
             
                  Applitools::AppOutputWithScreenshot.new(
         
     | 
| 
       660 
632 
     | 
    
         
             
                    Applitools::AppOutput.new(a_title, screenshot).tap do |o|
         
     | 
| 
       661 
633 
     | 
    
         
             
                      o.location = region.location unless region.empty?
         
     | 
| 
       662 
     | 
    
         
            -
                      o. 
     | 
| 
       663 
     | 
    
         
            -
             
     | 
| 
      
 634 
     | 
    
         
            +
                      o.on_need_screenshot_url do
         
     | 
| 
      
 635 
     | 
    
         
            +
                        return unless screenshot
         
     | 
| 
      
 636 
     | 
    
         
            +
                        server_connector.put_screenshot(
         
     | 
| 
      
 637 
     | 
    
         
            +
                          runner.rendering_info(server_connector),
         
     | 
| 
      
 638 
     | 
    
         
            +
                          screenshot
         
     | 
| 
      
 639 
     | 
    
         
            +
                        )
         
     | 
| 
      
 640 
     | 
    
         
            +
                      end
         
     | 
| 
      
 641 
     | 
    
         
            +
                      o.on_need_dom_url do
         
     | 
| 
      
 642 
     | 
    
         
            +
                        unless captured_dom_data.empty?
         
     | 
| 
      
 643 
     | 
    
         
            +
                          begin
         
     | 
| 
      
 644 
     | 
    
         
            +
                            logger.info 'Processing DOM..'
         
     | 
| 
      
 645 
     | 
    
         
            +
                            dom_url = server_connector.post_dom_json(captured_dom_data, runner.rendering_info(server_connector)) do |json|
         
     | 
| 
      
 646 
     | 
    
         
            +
                              io = StringIO.new
         
     | 
| 
      
 647 
     | 
    
         
            +
                              gz = Zlib::GzipWriter.new(io)
         
     | 
| 
      
 648 
     | 
    
         
            +
                              gz.write(json.encode('UTF-8'))
         
     | 
| 
      
 649 
     | 
    
         
            +
                              gz.close
         
     | 
| 
      
 650 
     | 
    
         
            +
                              result = io.string
         
     | 
| 
      
 651 
     | 
    
         
            +
                              io.close
         
     | 
| 
      
 652 
     | 
    
         
            +
                              result
         
     | 
| 
      
 653 
     | 
    
         
            +
                            end
         
     | 
| 
      
 654 
     | 
    
         
            +
                            logger.info 'Done'
         
     | 
| 
      
 655 
     | 
    
         
            +
                            logger.info dom_url
         
     | 
| 
      
 656 
     | 
    
         
            +
                          rescue Applitools::EyesError => e
         
     | 
| 
      
 657 
     | 
    
         
            +
                            logger.warn e.message
         
     | 
| 
      
 658 
     | 
    
         
            +
                            dom_url = nil
         
     | 
| 
      
 659 
     | 
    
         
            +
                          end
         
     | 
| 
      
 660 
     | 
    
         
            +
                          dom_url
         
     | 
| 
      
 661 
     | 
    
         
            +
                        end
         
     | 
| 
      
 662 
     | 
    
         
            +
                      end
         
     | 
| 
       664 
663 
     | 
    
         
             
                    end,
         
     | 
| 
       665 
664 
     | 
    
         
             
                    screenshot,
         
     | 
| 
       666 
665 
     | 
    
         
             
                    allow_empty_screenshot
         
     | 
| 
         @@ -24,6 +24,7 @@ module Applitools 
     | 
|
| 
       24 
24 
     | 
    
         
             
                        'ForceMismatch' => false,
         
     | 
| 
       25 
25 
     | 
    
         
             
                        'IgnoreMatch' => false,
         
     | 
| 
       26 
26 
     | 
    
         
             
                        'IgnoreMismatch' => false,
         
     | 
| 
      
 27 
     | 
    
         
            +
                        'ReplaceLast' => false,
         
     | 
| 
       27 
28 
     | 
    
         
             
                        'Trim' => {
         
     | 
| 
       28 
29 
     | 
    
         
             
                          'Enabled' => false
         
     | 
| 
       29 
30 
     | 
    
         
             
                        },
         
     | 
| 
         @@ -313,6 +314,15 @@ module Applitools 
     | 
|
| 
       313 
314 
     | 
    
         
             
                  current_data['IgnoreMismatch']
         
     | 
| 
       314 
315 
     | 
    
         
             
                end
         
     | 
| 
       315 
316 
     | 
    
         | 
| 
      
 317 
     | 
    
         
            +
                def replace_last
         
     | 
| 
      
 318 
     | 
    
         
            +
                  current_data['Options']['ReplaceLast']
         
     | 
| 
      
 319 
     | 
    
         
            +
                end
         
     | 
| 
      
 320 
     | 
    
         
            +
             
     | 
| 
      
 321 
     | 
    
         
            +
                def replace_last=(value)
         
     | 
| 
      
 322 
     | 
    
         
            +
                  Applitools::ArgumentGuard.one_of?(value, 'value', [TrueClass, FalseClass])
         
     | 
| 
      
 323 
     | 
    
         
            +
                  current_data['Options']['ReplaceLast'] = value
         
     | 
| 
      
 324 
     | 
    
         
            +
                end
         
     | 
| 
      
 325 
     | 
    
         
            +
             
     | 
| 
       316 
326 
     | 
    
         
             
                def tag
         
     | 
| 
       317 
327 
     | 
    
         
             
                  current_data['Tag']
         
     | 
| 
       318 
328 
     | 
    
         
             
                end
         
     | 
| 
         @@ -48,10 +48,11 @@ module Applitools 
     | 
|
| 
       48 
48 
     | 
    
         
             
                    match_window_data.convert_strict_regions_coordinates
         
     | 
| 
       49 
49 
     | 
    
         
             
                    match_window_data.convert_content_regions_coordinates
         
     | 
| 
       50 
50 
     | 
    
         
             
                    match_window_data.convert_accessibility_regions_coordinates
         
     | 
| 
      
 51 
     | 
    
         
            +
                    match_window_data.replace_last = false
         
     | 
| 
       51 
52 
     | 
    
         
             
                    match_result = perform_match(match_window_data)
         
     | 
| 
       52 
53 
     | 
    
         
             
                  else
         
     | 
| 
       53 
     | 
    
         
            -
                    passed_ignore_mismatch = match_window_data.ignore_mismatch
         
     | 
| 
       54 
54 
     | 
    
         
             
                    app_output = app_output_provider.app_output(region_provider, last_screenshot)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    last_image_digest = app_output.screenshot.image.sha256
         
     | 
| 
       55 
56 
     | 
    
         
             
                    match_window_data.app_output = app_output
         
     | 
| 
       56 
57 
     | 
    
         
             
                    match_window_data.convert_ignored_regions_coordinates
         
     | 
| 
       57 
58 
     | 
    
         
             
                    match_window_data.convert_floating_regions_coordinates
         
     | 
| 
         @@ -59,44 +60,37 @@ module Applitools 
     | 
|
| 
       59 
60 
     | 
    
         
             
                    match_window_data.convert_strict_regions_coordinates
         
     | 
| 
       60 
61 
     | 
    
         
             
                    match_window_data.convert_content_regions_coordinates
         
     | 
| 
       61 
62 
     | 
    
         
             
                    match_window_data.convert_accessibility_regions_coordinates
         
     | 
| 
       62 
     | 
    
         
            -
                    match_window_data. 
     | 
| 
       63 
     | 
    
         
            -
                    start = Time.now
         
     | 
| 
      
 63 
     | 
    
         
            +
                    match_window_data.replace_last = false
         
     | 
| 
       64 
64 
     | 
    
         
             
                    match_result = perform_match(match_window_data)
         
     | 
| 
       65 
     | 
    
         
            -
                    retry_time = Time.now - start
         
     | 
| 
       66 
65 
     | 
    
         | 
| 
       67 
66 
     | 
    
         
             
                    block_retry = if block_given?
         
     | 
| 
       68 
67 
     | 
    
         
             
                                    yield(match_result)
         
     | 
| 
       69 
68 
     | 
    
         
             
                                  else
         
     | 
| 
       70 
69 
     | 
    
         
             
                                    false
         
     | 
| 
       71 
70 
     | 
    
         
             
                                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
                    start = Time.now
         
     | 
| 
      
 72 
     | 
    
         
            +
                    retry_time = 0
         
     | 
| 
       72 
73 
     | 
    
         | 
| 
       73 
74 
     | 
    
         
             
                    while retry_time < retry_timeout && !(block_retry || match_result.as_expected?)
         
     | 
| 
       74 
75 
     | 
    
         
             
                      sleep MATCH_INTERVAL
         
     | 
| 
       75 
76 
     | 
    
         
             
                      app_output = app_output_provider.app_output(region_provider, last_screenshot)
         
     | 
| 
       76 
     | 
    
         
            -
                       
     | 
| 
       77 
     | 
    
         
            -
                       
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                       
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
      
 77 
     | 
    
         
            +
                      image_digest = app_output.screenshot.image.sha256
         
     | 
| 
      
 78 
     | 
    
         
            +
                      if image_digest == last_image_digest
         
     | 
| 
      
 79 
     | 
    
         
            +
                        logger.info('Got the same screenshot in retry. Not sending to the server.')
         
     | 
| 
      
 80 
     | 
    
         
            +
                      else
         
     | 
| 
      
 81 
     | 
    
         
            +
                        match_window_data.app_output = app_output
         
     | 
| 
      
 82 
     | 
    
         
            +
                        match_window_data.convert_ignored_regions_coordinates
         
     | 
| 
      
 83 
     | 
    
         
            +
                        match_window_data.convert_floating_regions_coordinates
         
     | 
| 
      
 84 
     | 
    
         
            +
                        match_window_data.convert_layout_regions_coordinates
         
     | 
| 
      
 85 
     | 
    
         
            +
                        match_window_data.convert_strict_regions_coordinates
         
     | 
| 
      
 86 
     | 
    
         
            +
                        match_window_data.convert_content_regions_coordinates
         
     | 
| 
      
 87 
     | 
    
         
            +
                        match_window_data.convert_accessibility_regions_coordinates
         
     | 
| 
      
 88 
     | 
    
         
            +
                        match_window_data.replace_last = true
         
     | 
| 
      
 89 
     | 
    
         
            +
                        match_result = perform_match(match_window_data)
         
     | 
| 
      
 90 
     | 
    
         
            +
                      end
         
     | 
| 
      
 91 
     | 
    
         
            +
                      last_image_digest = image_digest
         
     | 
| 
       85 
92 
     | 
    
         
             
                      retry_time = Time.now - start
         
     | 
| 
       86 
93 
     | 
    
         
             
                    end
         
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
                    unless block_retry || match_result.as_expected?
         
     | 
| 
       89 
     | 
    
         
            -
                      app_output = app_output_provider.app_output(region_provider, last_screenshot)
         
     | 
| 
       90 
     | 
    
         
            -
                      match_window_data.app_output = app_output
         
     | 
| 
       91 
     | 
    
         
            -
                      match_window_data.convert_ignored_regions_coordinates
         
     | 
| 
       92 
     | 
    
         
            -
                      match_window_data.convert_floating_regions_coordinates
         
     | 
| 
       93 
     | 
    
         
            -
                      match_window_data.convert_layout_regions_coordinates
         
     | 
| 
       94 
     | 
    
         
            -
                      match_window_data.convert_strict_regions_coordinates
         
     | 
| 
       95 
     | 
    
         
            -
                      match_window_data.convert_content_regions_coordinates
         
     | 
| 
       96 
     | 
    
         
            -
                      match_window_data.convert_accessibility_regions_coordinates
         
     | 
| 
       97 
     | 
    
         
            -
                      match_window_data.ignore_mismatch = passed_ignore_mismatch
         
     | 
| 
       98 
     | 
    
         
            -
                      match_result = perform_match(match_window_data)
         
     | 
| 
       99 
     | 
    
         
            -
                    end
         
     | 
| 
       100 
94 
     | 
    
         
             
                  end
         
     | 
| 
       101 
95 
     | 
    
         | 
| 
       102 
96 
     | 
    
         
             
                  logger.info "Completed in #{format('%.2f', Time.now - elapsed_time_start)} seconds"
         
     | 
| 
         @@ -1,4 +1,5 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'digest'
         
     | 
| 
       2 
3 
     | 
    
         | 
| 
       3 
4 
     | 
    
         
             
            module Applitools
         
     | 
| 
       4 
5 
     | 
    
         
             
              class Screenshot < Delegator
         
     | 
| 
         @@ -91,6 +92,10 @@ module Applitools 
     | 
|
| 
       91 
92 
     | 
    
         
             
                  def restore
         
     | 
| 
       92 
93 
     | 
    
         
             
                    ::ChunkyPNG::Image.from_datastream @datastream
         
     | 
| 
       93 
94 
     | 
    
         
             
                  end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                  def sha256
         
     | 
| 
      
 97 
     | 
    
         
            +
                    Digest::SHA2.new(256).hexdigest(@datastream.to_s)
         
     | 
| 
      
 98 
     | 
    
         
            +
                  end
         
     | 
| 
       94 
99 
     | 
    
         
             
                end
         
     | 
| 
       95 
100 
     | 
    
         | 
| 
       96 
101 
     | 
    
         
             
                class Image < self
         
     | 
| 
         @@ -115,6 +120,10 @@ module Applitools 
     | 
|
| 
       115 
120 
     | 
    
         
             
                  def __setobj__(obj)
         
     | 
| 
       116 
121 
     | 
    
         
             
                    @image = obj
         
     | 
| 
       117 
122 
     | 
    
         
             
                  end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
                  def sha256
         
     | 
| 
      
 125 
     | 
    
         
            +
                    Digest::SHA2.new(256).hexdigest(@image.to_datastream.to_s)
         
     | 
| 
      
 126 
     | 
    
         
            +
                  end
         
     | 
| 
       118 
127 
     | 
    
         
             
                end
         
     | 
| 
       119 
128 
     | 
    
         
             
              end
         
     | 
| 
       120 
129 
     | 
    
         
             
            end
         
     | 
    
        data/lib/applitools/version.rb
    CHANGED
    
    
    
        data/lib/eyes_consts.rb
    ADDED
    
    
    
        data/lib/eyes_core.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: eyes_core
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 3.17. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 3.17.21
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Applitools Team
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-09-06 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: oily_png
         
     | 
| 
         @@ -260,11 +260,13 @@ files: 
     | 
|
| 
       260 
260 
     | 
    
         
             
            - ext/eyes_core/extconf.rb
         
     | 
| 
       261 
261 
     | 
    
         
             
            - ext/eyes_core/eyes_core.c
         
     | 
| 
       262 
262 
     | 
    
         
             
            - ext/eyes_core/eyes_core.h
         
     | 
| 
      
 263 
     | 
    
         
            +
            - lib/applitools/appium/android_region_provider.rb
         
     | 
| 
       263 
264 
     | 
    
         
             
            - lib/applitools/appium/android_screenshot.rb
         
     | 
| 
       264 
265 
     | 
    
         
             
            - lib/applitools/appium/driver.rb
         
     | 
| 
       265 
266 
     | 
    
         
             
            - lib/applitools/appium/eyes.rb
         
     | 
| 
       266 
267 
     | 
    
         
             
            - lib/applitools/appium/initialize_1.9.rb
         
     | 
| 
       267 
268 
     | 
    
         
             
            - lib/applitools/appium/initialize_2.0.rb
         
     | 
| 
      
 269 
     | 
    
         
            +
            - lib/applitools/appium/ios_region_provider.rb
         
     | 
| 
       268 
270 
     | 
    
         
             
            - lib/applitools/appium/ios_screenshot.rb
         
     | 
| 
       269 
271 
     | 
    
         
             
            - lib/applitools/appium/region_provider.rb
         
     | 
| 
       270 
272 
     | 
    
         
             
            - lib/applitools/appium/screenshot.rb
         
     | 
| 
         @@ -362,6 +364,7 @@ files: 
     | 
|
| 
       362 
364 
     | 
    
         
             
            - lib/applitools/utils/image_utils.rb
         
     | 
| 
       363 
365 
     | 
    
         
             
            - lib/applitools/utils/utils.rb
         
     | 
| 
       364 
366 
     | 
    
         
             
            - lib/applitools/version.rb
         
     | 
| 
      
 367 
     | 
    
         
            +
            - lib/eyes_consts.rb
         
     | 
| 
       365 
368 
     | 
    
         
             
            - lib/eyes_core.rb
         
     | 
| 
       366 
369 
     | 
    
         
             
            - lib/eyes_rspec.rb
         
     | 
| 
       367 
370 
     | 
    
         
             
            - lib/require_utils.rb
         
     |