appium_lib 8.1.0 → 8.2.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 +4 -4
- data/Rakefile +14 -8
- data/android_tests/lib/android/specs/common/device.rb +21 -0
- data/android_tests/lib/android/specs/driver.rb +3 -3
- data/android_tests/lib/run.rb +3 -3
- data/contributing.md +3 -1
- data/docs/android_docs.md +14 -2375
- data/docs/migration.md +23 -0
- data/ios_tests/lib/ios/specs/driver.rb +3 -3
- data/lib/appium_lib/common/version.rb +2 -2
- data/lib/appium_lib/device/device.rb +98 -0
- data/lib/appium_lib/driver.rb +40 -36
- data/release_notes.md +9 -2
- metadata +2 -2
    
        data/docs/migration.md
    CHANGED
    
    | @@ -1,3 +1,26 @@ | |
| 1 | 
            +
            ### Breaking Changes in 8.2.0
         | 
| 2 | 
            +
            change `Appium.load_appium_txt` to `Appium.load_settings`.
         | 
| 3 | 
            +
             | 
| 4 | 
            +
                       Old | New
         | 
| 5 | 
            +
                        :--|:--
         | 
| 6 | 
            +
            `Appium.load_appium_txt` | `Appium.load_settings`
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            - after
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            ```
         | 
| 11 | 
            +
            dir        = File.expand_path(File.join(Dir.pwd, 'lib'))
         | 
| 12 | 
            +
            appium_txt = File.join(Dir.pwd, 'appium.txt')
         | 
| 13 | 
            +
            caps       = Appium.load_settings file: appium_txt, verbose: true
         | 
| 14 | 
            +
            ```
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            - before
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            ```
         | 
| 19 | 
            +
            appium_txt = File.expand_path(File.join(Dir.pwd, 'lib'))
         | 
| 20 | 
            +
            dir        = appium_txt
         | 
| 21 | 
            +
            caps       = Appium.load_appium_txt file: appium_txt, verbose: true
         | 
| 22 | 
            +
            ```
         | 
| 23 | 
            +
             | 
| 1 24 | 
             
            ### Breaking Changes in 7.0
         | 
| 2 25 |  | 
| 3 26 | 
             
            Requires appium 1.4.0-beta or newer for iOS helper methods. appium_lib no longer automatically promotes methods on minispec. To restore the old behavior use: `Appium.promote_appium_methods ::Minitest::Spec`
         | 
| @@ -17,12 +17,12 @@ describe 'driver' do | |
| 17 17 | 
             
                data.strip.must_equal 174.chr('UTF-8')
         | 
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 | 
            -
              t ' | 
| 20 | 
            +
              t 'load_settings' do
         | 
| 21 21 | 
             
                # skip this test if we're using Sauce
         | 
| 22 22 | 
             
                # the storage API doesn't have an on disk file
         | 
| 23 23 | 
             
                skip if sauce?
         | 
| 24 | 
            -
                appium_txt = File. | 
| 25 | 
            -
                opts       = Appium. | 
| 24 | 
            +
                appium_txt = File.join(Dir.pwd, 'appium.txt')
         | 
| 25 | 
            +
                opts       = Appium.load_settings file: appium_txt, verbose: true
         | 
| 26 26 |  | 
| 27 27 | 
             
                actual   = ''
         | 
| 28 28 | 
             
                actual   = File.basename opts[:caps][:app] if opts && opts[:caps]
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            module Appium
         | 
| 2 2 | 
             
              # Version and Date are defined on the 'Appium' module, not 'Appium::Common'
         | 
| 3 | 
            -
              VERSION = '8. | 
| 4 | 
            -
              DATE    = '2016-11- | 
| 3 | 
            +
              VERSION = '8.2.0' unless defined? ::Appium::VERSION
         | 
| 4 | 
            +
              DATE    = '2016-11-26' unless defined? ::Appium::DATE
         | 
| 5 5 | 
             
            end
         | 
| @@ -309,6 +309,7 @@ module Appium | |
| 309 309 | 
             
                    end
         | 
| 310 310 |  | 
| 311 311 | 
             
                    add_touch_actions
         | 
| 312 | 
            +
                    add_ime_actions
         | 
| 312 313 | 
             
                    extend_search_contexts
         | 
| 313 314 | 
             
                  end
         | 
| 314 315 |  | 
| @@ -359,6 +360,29 @@ module Appium | |
| 359 360 | 
             
                    end
         | 
| 360 361 | 
             
                  end
         | 
| 361 362 |  | 
| 363 | 
            +
                  # @private
         | 
| 364 | 
            +
                  def add_bridge_method(method)
         | 
| 365 | 
            +
                    if block_given?
         | 
| 366 | 
            +
                      create_bridge method, &Proc.new
         | 
| 367 | 
            +
                    else
         | 
| 368 | 
            +
                      create_bridge method
         | 
| 369 | 
            +
                    end
         | 
| 370 | 
            +
             | 
| 371 | 
            +
                    delegate_driver_method method
         | 
| 372 | 
            +
                    delegate_from_appium_driver method
         | 
| 373 | 
            +
                  end
         | 
| 374 | 
            +
             | 
| 375 | 
            +
                  # @private
         | 
| 376 | 
            +
                  def create_bridge(method)
         | 
| 377 | 
            +
                    Selenium::WebDriver::Remote::Bridge.class_eval do
         | 
| 378 | 
            +
                      if block_given?
         | 
| 379 | 
            +
                        class_eval(&Proc.new)
         | 
| 380 | 
            +
                      else
         | 
| 381 | 
            +
                        define_method(method) { execute method }
         | 
| 382 | 
            +
                      end
         | 
| 383 | 
            +
                    end
         | 
| 384 | 
            +
                  end
         | 
| 385 | 
            +
             | 
| 362 386 | 
             
                  # @!method find_element
         | 
| 363 387 | 
             
                  # @!method find_elements
         | 
| 364 388 | 
             
                  #
         | 
| @@ -395,6 +419,80 @@ module Appium | |
| 395 419 | 
             
                    delegate_from_appium_driver(:pinch, Appium::MultiTouch)
         | 
| 396 420 | 
             
                    delegate_from_appium_driver(:zoom, Appium::MultiTouch)
         | 
| 397 421 | 
             
                  end
         | 
| 422 | 
            +
             | 
| 423 | 
            +
                  def add_ime_actions
         | 
| 424 | 
            +
                    # Commands for IME are defined in the following commands.rb, but the driver have no bridge.
         | 
| 425 | 
            +
                    # So, appium_lib define just bridge here.
         | 
| 426 | 
            +
                    # https://github.com/SeleniumHQ/selenium/blob/selenium-3.0.1/rb/lib/selenium/webdriver/remote/commands.rb#L184-L192
         | 
| 427 | 
            +
             | 
| 428 | 
            +
                    # @!method ime_activate
         | 
| 429 | 
            +
                    #   Make an engine that is available active.
         | 
| 430 | 
            +
                    #
         | 
| 431 | 
            +
                    #   Android only.
         | 
| 432 | 
            +
                    #   @param [String] The IME owning the activity [required]
         | 
| 433 | 
            +
                    #
         | 
| 434 | 
            +
                    #   ```ruby
         | 
| 435 | 
            +
                    #   ime_activate engine: 'com.android.inputmethod.latin/.LatinIME'
         | 
| 436 | 
            +
                    #   ```
         | 
| 437 | 
            +
                    add_bridge_method(:ime_activate) do
         | 
| 438 | 
            +
                      def ime_activate(ime_name)
         | 
| 439 | 
            +
                        execute :imeActivateEngine, {}, engine: ime_name
         | 
| 440 | 
            +
                      end
         | 
| 441 | 
            +
                    end
         | 
| 442 | 
            +
             | 
| 443 | 
            +
                    # @!method ime_available_engines
         | 
| 444 | 
            +
                    #   List all available input engines on the machine.
         | 
| 445 | 
            +
                    #   Android only.
         | 
| 446 | 
            +
                    #
         | 
| 447 | 
            +
                    #   ```ruby
         | 
| 448 | 
            +
                    #   ime_available_engines #=> Get the list of IME installed in the target device
         | 
| 449 | 
            +
                    #   ```
         | 
| 450 | 
            +
                    add_bridge_method(:ime_available_engines) do
         | 
| 451 | 
            +
                      def ime_available_engines
         | 
| 452 | 
            +
                        execute :imeGetAvailableEngines
         | 
| 453 | 
            +
                      end
         | 
| 454 | 
            +
                    end
         | 
| 455 | 
            +
             | 
| 456 | 
            +
                    # @!method ime_active_engine
         | 
| 457 | 
            +
                    #   Get the name of the active IME engine.
         | 
| 458 | 
            +
                    #   Android only.
         | 
| 459 | 
            +
                    #
         | 
| 460 | 
            +
                    #   ```ruby
         | 
| 461 | 
            +
                    #   ime_active_engine #=> Get the current active IME such as 'com.android.inputmethod.latin/.LatinIME'
         | 
| 462 | 
            +
                    #   ```
         | 
| 463 | 
            +
                    add_bridge_method(:ime_active_engine) do
         | 
| 464 | 
            +
                      def ime_active_engine
         | 
| 465 | 
            +
                        execute :imeGetActiveEngine
         | 
| 466 | 
            +
                      end
         | 
| 467 | 
            +
                    end
         | 
| 468 | 
            +
             | 
| 469 | 
            +
                    # @!method ime_activated
         | 
| 470 | 
            +
                    #   Indicates whether IME input is active at the moment (not if it is available).
         | 
| 471 | 
            +
                    #   Android only.
         | 
| 472 | 
            +
                    #
         | 
| 473 | 
            +
                    #   ```ruby
         | 
| 474 | 
            +
                    #   ime_activated #=> True if IME is activated
         | 
| 475 | 
            +
                    #   ```
         | 
| 476 | 
            +
                    add_bridge_method(:ime_activated) do
         | 
| 477 | 
            +
                      def ime_activated
         | 
| 478 | 
            +
                        execute :imeIsActivated
         | 
| 479 | 
            +
                      end
         | 
| 480 | 
            +
                    end
         | 
| 481 | 
            +
             | 
| 482 | 
            +
                    # @!method ime_deactivate
         | 
| 483 | 
            +
                    #   De-activates the currently-active IME engine.
         | 
| 484 | 
            +
                    #
         | 
| 485 | 
            +
                    #   Android only.
         | 
| 486 | 
            +
                    #
         | 
| 487 | 
            +
                    #   ```ruby
         | 
| 488 | 
            +
                    #   ime_deactivate #=> Deactivate current IME engine
         | 
| 489 | 
            +
                    #   ```
         | 
| 490 | 
            +
                    add_bridge_method(:ime_deactivate) do
         | 
| 491 | 
            +
                      def ime_deactivate
         | 
| 492 | 
            +
                        execute :imeDeactivate, {}
         | 
| 493 | 
            +
                      end
         | 
| 494 | 
            +
                    end
         | 
| 495 | 
            +
                  end
         | 
| 398 496 | 
             
                end # class << self
         | 
| 399 497 |  | 
| 400 498 | 
             
                # @!method set_context
         | 
    
        data/lib/appium_lib/driver.rb
    CHANGED
    
    | @@ -51,7 +51,6 @@ end | |
| 51 51 |  | 
| 52 52 | 
             
            module Appium
         | 
| 53 53 | 
             
              # Load appium.txt (toml format)
         | 
| 54 | 
            -
              # the basedir of this file + appium.txt is what's used
         | 
| 55 54 | 
             
              #
         | 
| 56 55 | 
             
              # ```
         | 
| 57 56 | 
             
              # [caps]
         | 
| @@ -67,17 +66,15 @@ module Appium | |
| 67 66 | 
             
              #
         | 
| 68 67 | 
             
              # @param opts [Hash] file: '/path/to/appium.txt', verbose: true
         | 
| 69 68 | 
             
              # @return [hash] the symbolized hash with updated :app and :require keys
         | 
| 70 | 
            -
              def self. | 
| 69 | 
            +
              def self.load_settings(opts = {})
         | 
| 71 70 | 
             
                fail 'opts must be a hash' unless opts.is_a? Hash
         | 
| 72 71 | 
             
                fail 'opts must not be empty' if opts.empty?
         | 
| 73 72 |  | 
| 74 | 
            -
                 | 
| 75 | 
            -
                fail 'Must pass file' unless  | 
| 73 | 
            +
                toml = opts[:file]
         | 
| 74 | 
            +
                fail 'Must pass file' unless toml
         | 
| 76 75 | 
             
                verbose = opts.fetch :verbose, false
         | 
| 77 76 |  | 
| 78 | 
            -
                 | 
| 79 | 
            -
                toml       = File.expand_path File.join parent_dir, 'appium.txt'
         | 
| 80 | 
            -
                Appium::Logger.info "appium.txt path: #{toml}" if verbose
         | 
| 77 | 
            +
                Appium::Logger.info "appium settings path: #{toml}" if verbose
         | 
| 81 78 |  | 
| 82 79 | 
             
                toml_exists = File.exist? toml
         | 
| 83 80 | 
             
                Appium::Logger.info "Exists? #{toml_exists}" if verbose
         | 
| @@ -93,40 +90,47 @@ module Appium | |
| 93 90 | 
             
                  data[:caps][:app] = Appium::Driver.absolute_app_path data
         | 
| 94 91 | 
             
                end
         | 
| 95 92 |  | 
| 96 | 
            -
                # return list of require files as an array
         | 
| 97 | 
            -
                # nil if require doesn't exist
         | 
| 98 93 | 
             
                if data && data[:appium_lib] && data[:appium_lib][:require]
         | 
| 99 | 
            -
                   | 
| 100 | 
            -
                   | 
| 101 | 
            -
             | 
| 102 | 
            -
                  r.map! do |f|
         | 
| 103 | 
            -
                    file = File.exist?(f) ? f : File.join(parent_dir, f)
         | 
| 104 | 
            -
                    file = File.expand_path file
         | 
| 105 | 
            -
             | 
| 106 | 
            -
                    File.exist?(file) ? file : nil
         | 
| 107 | 
            -
                  end
         | 
| 108 | 
            -
                  r.compact! # remove nils
         | 
| 94 | 
            +
                  parent_dir = File.dirname toml
         | 
| 95 | 
            +
                  data[:appium_lib][:require] = expand_required_files(parent_dir, data[:appium_lib][:require])
         | 
| 96 | 
            +
                end
         | 
| 109 97 |  | 
| 110 | 
            -
             | 
| 98 | 
            +
                data
         | 
| 99 | 
            +
              end
         | 
| 111 100 |  | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
                      # save file
         | 
| 116 | 
            -
                      files << item
         | 
| 117 | 
            -
                      next # only look inside folders
         | 
| 118 | 
            -
                    end
         | 
| 119 | 
            -
                    Dir.glob(File.expand_path(File.join(item, '**', '*.rb'))) do |f|
         | 
| 120 | 
            -
                      # do not add folders to the file list
         | 
| 121 | 
            -
                      files << File.expand_path(f) unless File.directory? f
         | 
| 122 | 
            -
                    end
         | 
| 123 | 
            -
                  end
         | 
| 101 | 
            +
              class << self
         | 
| 102 | 
            +
                alias_method :load_appium_txt, :load_settings
         | 
| 103 | 
            +
              end
         | 
| 124 104 |  | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 105 | 
            +
              # @param base_dir [String] parent directory of loaded appium.txt (toml)
         | 
| 106 | 
            +
              # @param file_paths
         | 
| 107 | 
            +
              # @return list of require files as an array, nil if require doesn't exist
         | 
| 108 | 
            +
              def self.expand_required_files(base_dir, file_paths)
         | 
| 109 | 
            +
                # ensure files are absolute
         | 
| 110 | 
            +
                Array(file_paths).map! do |f|
         | 
| 111 | 
            +
                  file = File.exist?(f) ? f : File.join(base_dir, f)
         | 
| 112 | 
            +
                  file = File.expand_path file
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                  File.exist?(file) ? file : nil
         | 
| 127 115 | 
             
                end
         | 
| 116 | 
            +
                r.compact! # remove nils
         | 
| 128 117 |  | 
| 129 | 
            -
                 | 
| 118 | 
            +
                files = []
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                # now expand dirs
         | 
| 121 | 
            +
                file_paths.each do |item|
         | 
| 122 | 
            +
                  unless File.directory? item
         | 
| 123 | 
            +
                    # save file
         | 
| 124 | 
            +
                    files << item
         | 
| 125 | 
            +
                    next # only look inside folders
         | 
| 126 | 
            +
                  end
         | 
| 127 | 
            +
                  Dir.glob(File.expand_path(File.join(item, '**', '*.rb'))) do |f|
         | 
| 128 | 
            +
                    # do not add folders to the file list
         | 
| 129 | 
            +
                    files << File.expand_path(f) unless File.directory? f
         | 
| 130 | 
            +
                  end
         | 
| 131 | 
            +
                end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                files
         | 
| 130 134 | 
             
              end
         | 
| 131 135 |  | 
| 132 136 | 
             
              # convert all keys (including nested) to symbols
         | 
| @@ -430,7 +434,7 @@ module Appium | |
| 430 434 | 
             
                  return app_path unless app_path.match(/[\/\\]/)
         | 
| 431 435 |  | 
| 432 436 | 
             
                  # relative path that must be expanded.
         | 
| 433 | 
            -
                  # absolute_app_path is called from  | 
| 437 | 
            +
                  # absolute_app_path is called from load_settings
         | 
| 434 438 | 
             
                  # and the txt file path is the base of the app path in that case.
         | 
| 435 439 | 
             
                  app_path = File.expand_path app_path
         | 
| 436 440 | 
             
                  fail "App doesn't exist #{app_path}" unless File.exist? app_path
         | 
    
        data/release_notes.md
    CHANGED
    
    | @@ -1,6 +1,13 @@ | |
| 1 | 
            +
            #### v8.2.0 2016-11-26
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            - [4535ec9](https://github.com/appium/ruby_lib/commit/4535ec91f435255ae31b4c4fea9d96e5405d79f5) Release 8.2.0
         | 
| 4 | 
            +
            - [8a08021](https://github.com/appium/ruby_lib/commit/8a080213dbe4843f50b6acfbe80628209bfd143d) add endpoint for handling IME in remote bridge (#400)
         | 
| 5 | 
            +
            - [222cd47](https://github.com/appium/ruby_lib/commit/222cd47f69ba24b82a122734b0a136e5d6aed330) Allow to name toml files differently than appium.txt, fixes #280 (#397)
         | 
| 6 | 
            +
            - [d3a9235](https://github.com/appium/ruby_lib/commit/d3a9235767d6ba770246afac0e62ac58da0eb4b0) update release note and documentation (#396)
         | 
| 7 | 
            +
             | 
| 1 8 | 
             
            #### v8.1.0 2016-11-18
         | 
| 2 9 |  | 
| 3 | 
            -
            - [ | 
| 10 | 
            +
            - [95d3a65](https://github.com/appium/ruby_lib/commit/95d3a6535472559590c4d043e887d15acc445a1a) Release 8.1.0
         | 
| 4 11 | 
             
            - [6c38ca5](https://github.com/appium/ruby_lib/commit/6c38ca5276342ade6168eb9080424a03608a1b3e) replace end_ to delta_ because end_ is deprecated in #380 (#392)
         | 
| 5 12 | 
             
            - [09654ab](https://github.com/appium/ruby_lib/commit/09654ab9dbc69a31eff7e7bd426db985da09e3b8) Add EventListener to Driver (#389)
         | 
| 6 13 | 
             
            - [2d8fc5f](https://github.com/appium/ruby_lib/commit/2d8fc5ff7acce9417847e66772b59fc691c1dbaa) Added touch id endpoint (#384)
         | 
| @@ -1272,4 +1279,4 @@ | |
| 1272 1279 |  | 
| 1273 1280 | 
             
            - [01f2d15](https://github.com/appium/ruby_lib/commit/01f2d150ae3d8e88970b361a8330c6ccc174097d) Release 0.0.19
         | 
| 1274 1281 | 
             
            - [10eec2f](https://github.com/appium/ruby_lib/commit/10eec2f197899395978b73de049aed08ceda55cc) AppLib => AppiumLib
         | 
| 1275 | 
            -
            - [c1e3b4f](https://github.com/appium/ruby_lib/commit/c1e3b4f0a08be3a0aef65218220f09f4198683bf) AppLib => AppiumLib
         | 
| 1282 | 
            +
            - [c1e3b4f](https://github.com/appium/ruby_lib/commit/c1e3b4f0a08be3a0aef65218220f09f4198683bf) AppLib => AppiumLib
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: appium_lib
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 8. | 
| 4 | 
            +
              version: 8.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - code@bootstraponline.com
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016-11- | 
| 11 | 
            +
            date: 2016-11-26 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: selenium-webdriver
         |