appraisal 2.1.0 → 2.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/.travis.yml +9 -8
- data/Gemfile +5 -4
- data/Gemfile-1.8 +5 -0
- data/Gemfile-2.1 +3 -0
- data/README.md +39 -15
- data/lib/appraisal/appraisal.rb +35 -21
- data/lib/appraisal/{file.rb → appraisal_file.rb} +2 -2
- data/lib/appraisal/bundler_dsl.rb +43 -25
- data/lib/appraisal/cli.rb +16 -9
- data/lib/appraisal/command.rb +6 -3
- data/lib/appraisal/gemfile.rb +4 -3
- data/lib/appraisal/{git_source.rb → git.rb} +1 -1
- data/lib/appraisal/{path_source.rb → path.rb} +1 -1
- data/lib/appraisal/task.rb +2 -2
- data/lib/appraisal/travis_ci_helper.rb +4 -4
- data/lib/appraisal/utils.rb +20 -2
- data/lib/appraisal/version.rb +1 -1
- data/spec/acceptance/appraisals_file_bundler_dsl_compatibility_spec.rb +8 -1
- data/spec/acceptance/bundle_with_custom_path_spec.rb +3 -2
- data/spec/acceptance/bundle_without_spec.rb +51 -0
- data/spec/acceptance/cli/update_spec.rb +2 -1
- data/spec/acceptance/gemspec_spec.rb +1 -0
- data/spec/appraisal/{file_spec.rb → appraisal_file_spec.rb} +4 -4
- data/spec/appraisal/appraisal_spec.rb +13 -2
- data/spec/appraisal/gemfile_spec.rb +14 -0
- data/spec/appraisal/utils_spec.rb +31 -6
- data/spec/support/acceptance_test_helpers.rb +11 -4
- data/spec/support/dependency_helpers.rb +4 -0
- metadata +12 -8
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 398a456edb84cd58cc28ce0e4f1f48fa71fba9ec
         | 
| 4 | 
            +
              data.tar.gz: f345bc81392798434127f0809c9038f73901822c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 5828d0980b60a878098edb125dcb09582d5328315c0724e50522489e9d3bdd63f7c68b353d372d8442521e98d4dbc84fc2373f32aedf7dafabc5a88a81ecf625
         | 
| 7 | 
            +
              data.tar.gz: a6fc78e3735ed05b871ac0ddb7f1f7dc64b0734985ace8992b0a7198a28eeb2f9dd1910b925a2fe9c2ca3f50cbe46bea4d28d93db5712a9366c2eb9e52a3a207
         | 
    
        data/.travis.yml
    CHANGED
    
    | @@ -3,12 +3,13 @@ sudo: false | |
| 3 3 | 
             
            before_install: gem install bundler
         | 
| 4 4 |  | 
| 5 5 | 
             
            rvm:
         | 
| 6 | 
            -
              - 1.8
         | 
| 7 | 
            -
              - 1.9
         | 
| 8 | 
            -
              - 2.0
         | 
| 9 | 
            -
              - 2.1
         | 
| 10 | 
            -
              - 2.2
         | 
| 11 | 
            -
              -  | 
| 6 | 
            +
              - 1.8.7-head
         | 
| 7 | 
            +
              - 1.9.3-p551
         | 
| 8 | 
            +
              - 2.0.0-p648
         | 
| 9 | 
            +
              - 2.1.10
         | 
| 10 | 
            +
              - 2.2.6
         | 
| 11 | 
            +
              - 2.3.3
         | 
| 12 | 
            +
              - 2.4.0-preview3
         | 
| 12 13 | 
             
              - jruby-19mode
         | 
| 13 14 | 
             
              - ruby-head
         | 
| 14 15 | 
             
              - jruby-head
         | 
| @@ -16,7 +17,7 @@ rvm: | |
| 16 17 | 
             
            matrix:
         | 
| 17 18 | 
             
              fast_finish: true
         | 
| 18 19 | 
             
              allow_failures:
         | 
| 19 | 
            -
                - rvm: rbx-2
         | 
| 20 20 | 
             
                - rvm: jruby-19mode
         | 
| 21 | 
            -
                - rvm: ruby-head
         | 
| 22 21 | 
             
                - rvm: jruby-head
         | 
| 22 | 
            +
                - rvm: ruby-head
         | 
| 23 | 
            +
                - rvm: 2.4.0-preview3
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -1,11 +1,12 @@ | |
| 1 | 
            -
            source  | 
| 1 | 
            +
            source "https://rubygems.org"
         | 
| 2 2 |  | 
| 3 3 | 
             
            gemspec
         | 
| 4 4 |  | 
| 5 5 | 
             
            # This here to make sure appraisal works with Rails 3.0.0.
         | 
| 6 | 
            -
            gem  | 
| 6 | 
            +
            gem "thor", "~> 0.14.0"
         | 
| 7 7 |  | 
| 8 8 | 
             
            if RUBY_VERSION < "1.9"
         | 
| 9 | 
            -
               | 
| 10 | 
            -
             | 
| 9 | 
            +
              eval File.read("Gemfile-1.8")
         | 
| 10 | 
            +
            elsif RUBY_VERSION < "2.2"
         | 
| 11 | 
            +
              eval File.read("Gemfile-2.1")
         | 
| 11 12 | 
             
            end
         | 
    
        data/Gemfile-1.8
    ADDED
    
    
    
        data/Gemfile-2.1
    ADDED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -5,7 +5,7 @@ Appraisal | |
| 5 5 |  | 
| 6 6 | 
             
            Find out what your Ruby gems are worth.
         | 
| 7 7 |  | 
| 8 | 
            -
            [Build Status Image]: https://secure.travis-ci.org/thoughtbot/appraisal. | 
| 8 | 
            +
            [Build Status Image]: https://secure.travis-ci.org/thoughtbot/appraisal.svg?branch=master
         | 
| 9 9 | 
             
            [Build Status]: http://travis-ci.org/thoughtbot/appraisal
         | 
| 10 10 |  | 
| 11 11 | 
             
            Synopsis
         | 
| @@ -23,18 +23,19 @@ In your Gemfile: | |
| 23 23 |  | 
| 24 24 | 
             
                gem "appraisal"
         | 
| 25 25 |  | 
| 26 | 
            -
            Note that gems must be bundled in the global namespace. Bundling gems to a | 
| 27 | 
            -
            location or vendoring plugins is not supported. If you do not want to | 
| 28 | 
            -
            global namespace, one alternative is | 
| 26 | 
            +
            Note that gems must be bundled in the global namespace. Bundling gems to a
         | 
| 27 | 
            +
            local location or vendoring plugins is not supported. If you do not want to
         | 
| 28 | 
            +
            pollute the global namespace, one alternative is
         | 
| 29 | 
            +
            [RVM's Gemsets](http://rvm.io/gemsets).
         | 
| 29 30 |  | 
| 30 31 | 
             
            Setup
         | 
| 31 32 | 
             
            -----
         | 
| 32 33 |  | 
| 33 | 
            -
            Setting up appraisal requires an Appraisals file (similar to a Gemfile) in | 
| 34 | 
            -
            project root, named "Appraisals" (note the case), and some slight changes | 
| 35 | 
            -
            your project's Rakefile | 
| 34 | 
            +
            Setting up appraisal requires an `Appraisals` file (similar to a `Gemfile`) in
         | 
| 35 | 
            +
            your project root, named "Appraisals" (note the case), and some slight changes
         | 
| 36 | 
            +
            to your project's `Rakefile`.
         | 
| 36 37 |  | 
| 37 | 
            -
            An Appraisals file consists of several appraisal definitions. An appraisal
         | 
| 38 | 
            +
            An `Appraisals` file consists of several appraisal definitions. An appraisal
         | 
| 38 39 | 
             
            definition is simply a list of gem dependencies. For example, to test with a
         | 
| 39 40 | 
             
            few versions of Rails:
         | 
| 40 41 |  | 
| @@ -46,8 +47,8 @@ few versions of Rails: | |
| 46 47 | 
             
                  gem "rails", "4.0.0"
         | 
| 47 48 | 
             
                end
         | 
| 48 49 |  | 
| 49 | 
            -
            The dependencies in your Appraisals file are combined with dependencies in | 
| 50 | 
            -
            Gemfile | 
| 50 | 
            +
            The dependencies in your `Appraisals` file are combined with dependencies in
         | 
| 51 | 
            +
            your `Gemfile`, so you don't need to repeat anything that's the same for each
         | 
| 51 52 | 
             
            appraisal. If something is specified in both the Gemfile and an appraisal, the
         | 
| 52 53 | 
             
            version from the appraisal takes precedence.
         | 
| 53 54 |  | 
| @@ -63,18 +64,18 @@ Usage | |
| 63 64 | 
             
            Once you've configured the appraisals you want to use, you need to install the
         | 
| 64 65 | 
             
            dependencies for each appraisal:
         | 
| 65 66 |  | 
| 66 | 
            -
                appraisal install
         | 
| 67 | 
            +
                $ appraisal install
         | 
| 67 68 |  | 
| 68 69 | 
             
            This will resolve, install, and lock the dependencies for that appraisal using
         | 
| 69 70 | 
             
            bundler. Once you have your dependencies set up, you can run any command in a
         | 
| 70 71 | 
             
            single appraisal:
         | 
| 71 72 |  | 
| 72 | 
            -
                appraisal rails-3 rake test
         | 
| 73 | 
            +
                $ appraisal rails-3 rake test
         | 
| 73 74 |  | 
| 74 75 | 
             
            This will run `rake test` using the dependencies configured for Rails 3. You can
         | 
| 75 76 | 
             
            also run each appraisal in turn:
         | 
| 76 77 |  | 
| 77 | 
            -
                appraisal rake test
         | 
| 78 | 
            +
                $ appraisal rake test
         | 
| 78 79 |  | 
| 79 80 | 
             
            If you want to use only the dependencies from your Gemfile, just run `rake
         | 
| 80 81 | 
             
            test` as normal. This allows you to keep running with the latest versions of
         | 
| @@ -139,15 +140,38 @@ all versions of its dependency, you might have to set a `script` setting: | |
| 139 140 | 
             
            That will make sure that each of the test sub-job are not getting run more than
         | 
| 140 141 | 
             
            one time.
         | 
| 141 142 |  | 
| 142 | 
            -
            You can also  | 
| 143 | 
            +
            You can also run your tests against multiple versions of Ruby locally, just
         | 
| 143 144 | 
             
            like running on Travis CI, by using [WWTD].
         | 
| 144 145 |  | 
| 145 146 | 
             
            [WWTD]: https://github.com/grosser/wwtd
         | 
| 146 147 |  | 
| 148 | 
            +
            Circle CI Integration
         | 
| 149 | 
            +
            ---------------------
         | 
| 150 | 
            +
             | 
| 151 | 
            +
            In Circle CI you can override the default testing behaviour to customize your
         | 
| 152 | 
            +
            testing. Using this feature you can configure appraisal to execute your tests.
         | 
| 153 | 
            +
             | 
| 154 | 
            +
            In order to this you can put the following configuration in your circle.yml file:
         | 
| 155 | 
            +
             | 
| 156 | 
            +
            ```yml
         | 
| 157 | 
            +
            dependencies:
         | 
| 158 | 
            +
              post:
         | 
| 159 | 
            +
                - bundle exec appraisal install
         | 
| 160 | 
            +
            test:
         | 
| 161 | 
            +
              pre:
         | 
| 162 | 
            +
                - bundle exec appraisal rake db:create
         | 
| 163 | 
            +
                - bundle exec appraisal rake db:migrate
         | 
| 164 | 
            +
              override:
         | 
| 165 | 
            +
                - bundle exec appraisal rspec
         | 
| 166 | 
            +
            ```
         | 
| 167 | 
            +
             | 
| 168 | 
            +
            Notice that we are running an rspec suite. You can customize your testing
         | 
| 169 | 
            +
            command in the `override` section and use your favourite one.
         | 
| 170 | 
            +
             | 
| 147 171 | 
             
            Credits
         | 
| 148 172 | 
             
            -------
         | 
| 149 173 |  | 
| 150 | 
            -
            
         | 
| 151 175 |  | 
| 152 176 | 
             
            Appraisal is maintained and funded by [thoughtbot, inc][thoughtbot]
         | 
| 153 177 |  | 
    
        data/lib/appraisal/appraisal.rb
    CHANGED
    
    | @@ -7,6 +7,8 @@ require 'pathname' | |
| 7 7 | 
             
            module Appraisal
         | 
| 8 8 | 
             
              # Represents one appraisal and its dependencies
         | 
| 9 9 | 
             
              class Appraisal
         | 
| 10 | 
            +
                DEFAULT_INSTALL_OPTIONS = { "jobs" => 1 }.freeze
         | 
| 11 | 
            +
             | 
| 10 12 | 
             
                attr_reader :name, :gemfile
         | 
| 11 13 |  | 
| 12 14 | 
             
                def initialize(name, source_gemfile)
         | 
| @@ -46,19 +48,25 @@ module Appraisal | |
| 46 48 | 
             
                  gemfile.gemspec(options)
         | 
| 47 49 | 
             
                end
         | 
| 48 50 |  | 
| 51 | 
            +
                def git_source(*args, &block)
         | 
| 52 | 
            +
                  gemfile.git_source(*args, &block)
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 49 55 | 
             
                def write_gemfile
         | 
| 50 | 
            -
                   | 
| 56 | 
            +
                  File.open(gemfile_path, "w") do |file|
         | 
| 51 57 | 
             
                    signature = "# This file was generated by Appraisal"
         | 
| 52 58 | 
             
                    file.puts([signature, gemfile.to_s].join("\n\n"))
         | 
| 53 59 | 
             
                  end
         | 
| 54 60 | 
             
                end
         | 
| 55 61 |  | 
| 56 | 
            -
                def install( | 
| 57 | 
            -
                   | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
                     | 
| 61 | 
            -
                   | 
| 62 | 
            +
                def install(options = {})
         | 
| 63 | 
            +
                  commands = [install_command(options).join(" ")]
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  if options["without"].nil? || options["without"].empty?
         | 
| 66 | 
            +
                    commands.unshift(check_command.join(" "))
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  command = commands.join(" || ")
         | 
| 62 70 |  | 
| 63 71 | 
             
                  if Bundler.settings[:path]
         | 
| 64 72 | 
             
                    env = { 'BUNDLE_DISABLE_SHARED_GEMS' => '1' }
         | 
| @@ -69,8 +77,7 @@ module Appraisal | |
| 69 77 | 
             
                end
         | 
| 70 78 |  | 
| 71 79 | 
             
                def update(gems = [])
         | 
| 72 | 
            -
                   | 
| 73 | 
            -
                  Command.new(command, :env => env).run
         | 
| 80 | 
            +
                  Command.new(update_command(gems), :gemfile => gemfile_path).run
         | 
| 74 81 | 
             
                end
         | 
| 75 82 |  | 
| 76 83 | 
             
                def gemfile_path
         | 
| @@ -82,15 +89,15 @@ module Appraisal | |
| 82 89 | 
             
                end
         | 
| 83 90 |  | 
| 84 91 | 
             
                def relative_gemfile_path
         | 
| 85 | 
            -
                   | 
| 92 | 
            +
                  File.join("gemfiles", gemfile_name)
         | 
| 86 93 | 
             
                end
         | 
| 87 94 |  | 
| 88 95 | 
             
                def relativize
         | 
| 89 96 | 
             
                  current_directory = Pathname.new(Dir.pwd)
         | 
| 90 97 | 
             
                  relative_path = current_directory.relative_path_from(gemfile_root).cleanpath
         | 
| 91 | 
            -
                  lockfile_content =  | 
| 98 | 
            +
                  lockfile_content = File.read(lockfile_path)
         | 
| 92 99 |  | 
| 93 | 
            -
                   | 
| 100 | 
            +
                  File.open(lockfile_path, 'w') do |file|
         | 
| 94 101 | 
             
                    file.write lockfile_content.gsub(/#{current_directory}/, relative_path.to_s)
         | 
| 95 102 | 
             
                  end
         | 
| 96 103 | 
             
                end
         | 
| @@ -102,19 +109,17 @@ module Appraisal | |
| 102 109 | 
             
                  ['bundle', 'check', gemfile_option]
         | 
| 103 110 | 
             
                end
         | 
| 104 111 |  | 
| 105 | 
            -
                def install_command( | 
| 112 | 
            +
                def install_command(options = {})
         | 
| 106 113 | 
             
                  gemfile_option = "--gemfile='#{gemfile_path}'"
         | 
| 107 | 
            -
                  ['bundle', 'install', gemfile_option,  | 
| 114 | 
            +
                  ['bundle', 'install', gemfile_option, bundle_options(options)].compact
         | 
| 108 115 | 
             
                end
         | 
| 109 116 |  | 
| 110 117 | 
             
                def update_command(gems)
         | 
| 111 | 
            -
                   | 
| 112 | 
            -
                  command = ['bundle', 'update', *gems].compact
         | 
| 113 | 
            -
                  [command, env]
         | 
| 118 | 
            +
                  ['bundle', 'update', *gems].compact
         | 
| 114 119 | 
             
                end
         | 
| 115 120 |  | 
| 116 121 | 
             
                def gemfile_root
         | 
| 117 | 
            -
                  Pathname.new( | 
| 122 | 
            +
                  Pathname.new(File.join(Dir.pwd, "gemfiles"))
         | 
| 118 123 | 
             
                end
         | 
| 119 124 |  | 
| 120 125 | 
             
                def gemfile_name
         | 
| @@ -129,15 +134,24 @@ module Appraisal | |
| 129 134 | 
             
                  name.gsub(/[^\w\.]/, '_')
         | 
| 130 135 | 
             
                end
         | 
| 131 136 |  | 
| 132 | 
            -
                def  | 
| 133 | 
            -
                   | 
| 137 | 
            +
                def bundle_options(options)
         | 
| 138 | 
            +
                  full_options = DEFAULT_INSTALL_OPTIONS.dup.merge(options)
         | 
| 139 | 
            +
                  options_strings = []
         | 
| 140 | 
            +
                  jobs = full_options.delete("jobs")
         | 
| 141 | 
            +
                  if jobs > 1
         | 
| 134 142 | 
             
                    if Utils.support_parallel_installation?
         | 
| 135 | 
            -
                      "--jobs=#{ | 
| 143 | 
            +
                      options_strings << "--jobs=#{jobs}"
         | 
| 136 144 | 
             
                    else
         | 
| 137 145 | 
             
                      warn 'Your current version of Bundler does not support parallel installation. Please ' +
         | 
| 138 146 | 
             
                        'upgrade Bundler to version >= 1.4.0, or invoke `appraisal` without `--jobs` option.'
         | 
| 139 147 | 
             
                    end
         | 
| 140 148 | 
             
                  end
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                  full_options.each do |flag, val|
         | 
| 151 | 
            +
                    options_strings << "--#{flag} #{val}"
         | 
| 152 | 
            +
                  end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                  options_strings.join(" ") if options_strings != []
         | 
| 141 155 | 
             
                end
         | 
| 142 156 | 
             
              end
         | 
| 143 157 | 
             
            end
         | 
| @@ -4,7 +4,7 @@ require 'appraisal/gemfile' | |
| 4 4 |  | 
| 5 5 | 
             
            module Appraisal
         | 
| 6 6 | 
             
              # Loads and parses Appraisals file
         | 
| 7 | 
            -
              class  | 
| 7 | 
            +
              class AppraisalFile
         | 
| 8 8 | 
             
                attr_reader :appraisals, :gemfile
         | 
| 9 9 |  | 
| 10 10 | 
             
                def self.each(&block)
         | 
| @@ -16,7 +16,7 @@ module Appraisal | |
| 16 16 | 
             
                  @gemfile = Gemfile.new
         | 
| 17 17 | 
             
                  @gemfile.load(ENV['BUNDLE_GEMFILE'] || 'Gemfile')
         | 
| 18 18 |  | 
| 19 | 
            -
                  if  | 
| 19 | 
            +
                  if File.exist? path
         | 
| 20 20 | 
             
                    run IO.read(path)
         | 
| 21 21 | 
             
                  else
         | 
| 22 22 | 
             
                    raise AppraisalsNotFound
         | 
| @@ -5,19 +5,20 @@ module Appraisal | |
| 5 5 | 
             
              class BundlerDSL
         | 
| 6 6 | 
             
                attr_reader :dependencies
         | 
| 7 7 |  | 
| 8 | 
            -
                PARTS = %w(source ruby_version  | 
| 8 | 
            +
                PARTS = %w(source ruby_version gits paths dependencies groups
         | 
| 9 9 | 
             
                  platforms source_blocks gemspec)
         | 
| 10 10 |  | 
| 11 11 | 
             
                def initialize
         | 
| 12 12 | 
             
                  @sources = []
         | 
| 13 13 | 
             
                  @ruby_version = nil
         | 
| 14 14 | 
             
                  @dependencies = DependencyList.new
         | 
| 15 | 
            -
                  @ | 
| 15 | 
            +
                  @gemspecs = []
         | 
| 16 16 | 
             
                  @groups = OrderedHash.new
         | 
| 17 17 | 
             
                  @platforms = OrderedHash.new
         | 
| 18 | 
            -
                  @ | 
| 19 | 
            -
                  @ | 
| 18 | 
            +
                  @gits = OrderedHash.new
         | 
| 19 | 
            +
                  @paths = OrderedHash.new
         | 
| 20 20 | 
             
                  @source_blocks = OrderedHash.new
         | 
| 21 | 
            +
                  @git_sources = {}
         | 
| 21 22 | 
             
                end
         | 
| 22 23 |  | 
| 23 24 | 
             
                def run(&block)
         | 
| @@ -25,7 +26,7 @@ module Appraisal | |
| 25 26 | 
             
                end
         | 
| 26 27 |  | 
| 27 28 | 
             
                def gem(name, *requirements)
         | 
| 28 | 
            -
                  @dependencies.add(name, requirements)
         | 
| 29 | 
            +
                  @dependencies.add(name, substitute_git_source(requirements))
         | 
| 29 30 | 
             
                end
         | 
| 30 31 |  | 
| 31 32 | 
             
                def group(*names, &block)
         | 
| @@ -54,13 +55,13 @@ module Appraisal | |
| 54 55 | 
             
                end
         | 
| 55 56 |  | 
| 56 57 | 
             
                def git(source, options = {}, &block)
         | 
| 57 | 
            -
                  @ | 
| 58 | 
            -
                  @ | 
| 58 | 
            +
                  @gits[source] ||= Git.new(source, options)
         | 
| 59 | 
            +
                  @gits[source].run(&block)
         | 
| 59 60 | 
             
                end
         | 
| 60 61 |  | 
| 61 62 | 
             
                def path(source, options = {}, &block)
         | 
| 62 | 
            -
                  @ | 
| 63 | 
            -
                  @ | 
| 63 | 
            +
                  @paths[source] ||= Path.new(source, options)
         | 
| 64 | 
            +
                  @paths[source].run(&block)
         | 
| 64 65 | 
             
                end
         | 
| 65 66 |  | 
| 66 67 | 
             
                def to_s
         | 
| @@ -72,9 +73,17 @@ module Appraisal | |
| 72 73 | 
             
                end
         | 
| 73 74 |  | 
| 74 75 | 
             
                def gemspec(options = {})
         | 
| 75 | 
            -
                  @ | 
| 76 | 
            +
                  @gemspecs << Gemspec.new(options)
         | 
| 76 77 | 
             
                end
         | 
| 77 78 |  | 
| 79 | 
            +
                def git_source(source, &block)
         | 
| 80 | 
            +
                  @git_sources[source] = block
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                protected
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                attr_writer :git_sources
         | 
| 86 | 
            +
             | 
| 78 87 | 
             
                private
         | 
| 79 88 |  | 
| 80 89 | 
             
                def source_entry
         | 
| @@ -91,25 +100,23 @@ module Appraisal | |
| 91 100 |  | 
| 92 101 | 
             
                alias_method :ruby_version_entry_for_dup, :ruby_version_entry
         | 
| 93 102 |  | 
| 94 | 
            -
                 | 
| 95 | 
            -
                   | 
| 96 | 
            -
             | 
| 103 | 
            +
                def gemspec_entry
         | 
| 104 | 
            +
                  @gemspecs.map(&:to_s).join("\n")
         | 
| 105 | 
            +
                end
         | 
| 97 106 |  | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
                      end
         | 
| 102 | 
            -
                    end
         | 
| 107 | 
            +
                def gemspec_entry_for_dup
         | 
| 108 | 
            +
                  @gemspecs.map(&:for_dup).join("\n")
         | 
| 109 | 
            +
                end
         | 
| 103 110 |  | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 109 | 
            -
                   | 
| 111 | 
            +
                def dependencies_entry
         | 
| 112 | 
            +
                  @dependencies.to_s
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                def dependencies_entry_for_dup
         | 
| 116 | 
            +
                  @dependencies.for_dup
         | 
| 110 117 | 
             
                end
         | 
| 111 118 |  | 
| 112 | 
            -
                [: | 
| 119 | 
            +
                [:gits, :paths, :platforms, :groups, :source_blocks].
         | 
| 113 120 | 
             
                  each do |method_name|
         | 
| 114 121 | 
             
                  class_eval <<-METHODS, __FILE__, __LINE__
         | 
| 115 122 | 
             
                    private
         | 
| @@ -127,5 +134,16 @@ module Appraisal | |
| 127 134 | 
             
                def indent(string)
         | 
| 128 135 | 
             
                  string.strip.gsub(/^(.+)$/, '  \1')
         | 
| 129 136 | 
             
                end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                def substitute_git_source(requirements)
         | 
| 139 | 
            +
                  requirements.each do |requirement|
         | 
| 140 | 
            +
                    if requirement.is_a?(Hash)
         | 
| 141 | 
            +
                      (requirement.keys & @git_sources.keys).each do |matching_source|
         | 
| 142 | 
            +
                        value = requirement.delete(matching_source)
         | 
| 143 | 
            +
                        requirement[:git] = @git_sources[matching_source].call(value)
         | 
| 144 | 
            +
                      end
         | 
| 145 | 
            +
                    end
         | 
| 146 | 
            +
                  end
         | 
| 147 | 
            +
                end
         | 
| 130 148 | 
             
              end
         | 
| 131 149 | 
             
            end
         | 
    
        data/lib/appraisal/cli.rb
    CHANGED
    
    | @@ -19,11 +19,11 @@ module Appraisal | |
| 19 19 | 
             
                      appraisal, otherwise it runs the EXTERNAL_COMMAND against all appraisals.
         | 
| 20 20 | 
             
                  help
         | 
| 21 21 |  | 
| 22 | 
            -
                  if  | 
| 22 | 
            +
                  if File.exist?('Appraisals')
         | 
| 23 23 | 
             
                    shell.say
         | 
| 24 24 | 
             
                    shell.say 'Available Appraisal(s):'
         | 
| 25 25 |  | 
| 26 | 
            -
                     | 
| 26 | 
            +
                    AppraisalFile.each do |appraisal|
         | 
| 27 27 | 
             
                      shell.say "  - #{appraisal.name}"
         | 
| 28 28 | 
             
                    end
         | 
| 29 29 | 
             
                  end
         | 
| @@ -41,11 +41,16 @@ module Appraisal | |
| 41 41 | 
             
                method_option 'jobs', :aliases => 'j', :type => :numeric, :default => 1,
         | 
| 42 42 | 
             
                  :banner => 'SIZE',
         | 
| 43 43 | 
             
                  :desc => 'Install gems in parallel using the given number of workers.'
         | 
| 44 | 
            +
                method_option 'retry', :type => :numeric, :default => 1,
         | 
| 45 | 
            +
                  :desc => 'Retry network and git requests that have failed'
         | 
| 46 | 
            +
                method_option "without", :banner => "GROUP_NAMES",
         | 
| 47 | 
            +
                  :desc => "A space-separated list of groups referencing gems to skip " +
         | 
| 48 | 
            +
                    "during installation. Bundler will remember this option."
         | 
| 44 49 | 
             
                def install
         | 
| 45 50 | 
             
                  invoke :generate, [], {}
         | 
| 46 51 |  | 
| 47 | 
            -
                   | 
| 48 | 
            -
                    appraisal.install(options | 
| 52 | 
            +
                  AppraisalFile.each do |appraisal|
         | 
| 53 | 
            +
                    appraisal.install(options)
         | 
| 49 54 | 
             
                    appraisal.relativize
         | 
| 50 55 | 
             
                  end
         | 
| 51 56 | 
             
                end
         | 
| @@ -53,7 +58,7 @@ module Appraisal | |
| 53 58 | 
             
                desc 'generate', 'Generate a gemfile for each appraisal'
         | 
| 54 59 | 
             
                method_option "travis", :type => :boolean, :default => false
         | 
| 55 60 | 
             
                def generate
         | 
| 56 | 
            -
                   | 
| 61 | 
            +
                  AppraisalFile.each do |appraisal|
         | 
| 57 62 | 
             
                    appraisal.write_gemfile
         | 
| 58 63 | 
             
                  end
         | 
| 59 64 |  | 
| @@ -73,14 +78,14 @@ module Appraisal | |
| 73 78 | 
             
                def update(*gems)
         | 
| 74 79 | 
             
                  invoke :generate, []
         | 
| 75 80 |  | 
| 76 | 
            -
                   | 
| 81 | 
            +
                  AppraisalFile.each do |appraisal|
         | 
| 77 82 | 
             
                    appraisal.update(gems)
         | 
| 78 83 | 
             
                  end
         | 
| 79 84 | 
             
                end
         | 
| 80 85 |  | 
| 81 86 | 
             
                desc 'list', 'List the names of the defined appraisals'
         | 
| 82 87 | 
             
                def list
         | 
| 83 | 
            -
                   | 
| 88 | 
            +
                  AppraisalFile.new.appraisals.each { |appraisal| puts appraisal.name }
         | 
| 84 89 | 
             
                end
         | 
| 85 90 |  | 
| 86 91 | 
             
                desc "version", "Display the version and exit"
         | 
| @@ -91,12 +96,14 @@ module Appraisal | |
| 91 96 | 
             
                private
         | 
| 92 97 |  | 
| 93 98 | 
             
                def method_missing(name, *args, &block)
         | 
| 94 | 
            -
                  matching_appraisal =  | 
| 99 | 
            +
                  matching_appraisal = AppraisalFile.new.appraisals.detect do |appraisal|
         | 
| 100 | 
            +
                    appraisal.name == name.to_s
         | 
| 101 | 
            +
                  end
         | 
| 95 102 |  | 
| 96 103 | 
             
                  if matching_appraisal
         | 
| 97 104 | 
             
                    Command.new(args, :gemfile => matching_appraisal.gemfile_path).run
         | 
| 98 105 | 
             
                  else
         | 
| 99 | 
            -
                     | 
| 106 | 
            +
                    AppraisalFile.each do |appraisal|
         | 
| 100 107 | 
             
                      Command.new(ARGV, :gemfile => appraisal.gemfile_path).run
         | 
| 101 108 | 
             
                    end
         | 
| 102 109 | 
             
                  end
         | 
    
        data/lib/appraisal/command.rb
    CHANGED
    
    | @@ -43,12 +43,15 @@ module Appraisal | |
| 43 43 | 
             
                def ensure_bundler_is_available
         | 
| 44 44 | 
             
                  unless system %(gem list -q "^bundler$" | grep -q bundler)
         | 
| 45 45 | 
             
                    puts ">> Reinstall Bundler into #{ENV["GEM_HOME"]}"
         | 
| 46 | 
            +
                    version = Utils.bundler_version
         | 
| 46 47 |  | 
| 47 | 
            -
                    unless system "gem install bundler"
         | 
| 48 | 
            +
                    unless system "gem install bundler --version #{version}"
         | 
| 48 49 | 
             
                      puts
         | 
| 49 50 | 
             
                      puts <<-ERROR.strip.gsub(/\s+/, " ")
         | 
| 50 | 
            -
                        Bundler installation failed. | 
| 51 | 
            -
                         | 
| 51 | 
            +
                        Bundler installation failed.
         | 
| 52 | 
            +
                        Please try running:
         | 
| 53 | 
            +
                          `GEM_HOME="#{ENV["GEM_HOME"]}" gem install bundler --version #{version}`
         | 
| 54 | 
            +
                        manually.
         | 
| 52 55 | 
             
                      ERROR
         | 
| 53 56 | 
             
                      exit(1)
         | 
| 54 57 | 
             
                    end
         | 
    
        data/lib/appraisal/gemfile.rb
    CHANGED
    
    | @@ -2,16 +2,16 @@ require "appraisal/bundler_dsl" | |
| 2 2 |  | 
| 3 3 | 
             
            module Appraisal
         | 
| 4 4 | 
             
              autoload :Gemspec, "appraisal/gemspec"
         | 
| 5 | 
            -
              autoload : | 
| 5 | 
            +
              autoload :Git, "appraisal/git"
         | 
| 6 6 | 
             
              autoload :Group, "appraisal/group"
         | 
| 7 | 
            -
              autoload : | 
| 7 | 
            +
              autoload :Path, "appraisal/path"
         | 
| 8 8 | 
             
              autoload :Platform, "appraisal/platform"
         | 
| 9 9 | 
             
              autoload :Source, "appraisal/source"
         | 
| 10 10 |  | 
| 11 11 | 
             
              # Load bundler Gemfiles and merge dependencies
         | 
| 12 12 | 
             
              class Gemfile < BundlerDSL
         | 
| 13 13 | 
             
                def load(path)
         | 
| 14 | 
            -
                  if  | 
| 14 | 
            +
                  if File.exist?(path)
         | 
| 15 15 | 
             
                    run(IO.read(path))
         | 
| 16 16 | 
             
                  end
         | 
| 17 17 | 
             
                end
         | 
| @@ -22,6 +22,7 @@ module Appraisal | |
| 22 22 |  | 
| 23 23 | 
             
                def dup
         | 
| 24 24 | 
             
                  Gemfile.new.tap do |gemfile|
         | 
| 25 | 
            +
                    gemfile.git_sources = @git_sources
         | 
| 25 26 | 
             
                    gemfile.run(for_dup)
         | 
| 26 27 | 
             
                  end
         | 
| 27 28 | 
             
                end
         | 
    
        data/lib/appraisal/task.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require 'appraisal/ | 
| 1 | 
            +
            require 'appraisal/appraisal_file'
         | 
| 2 2 | 
             
            require 'rake/tasklib'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module Appraisal
         | 
| @@ -29,7 +29,7 @@ module Appraisal | |
| 29 29 | 
             
                    end
         | 
| 30 30 |  | 
| 31 31 | 
             
                    begin
         | 
| 32 | 
            -
                       | 
| 32 | 
            +
                      AppraisalFile.each do |appraisal|
         | 
| 33 33 | 
             
                        desc "DEPRECATED: Run the given task for appraisal #{appraisal.name}"
         | 
| 34 34 | 
             
                        task appraisal.name do
         | 
| 35 35 | 
             
                          ARGV.shift
         | 
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            require "appraisal/ | 
| 1 | 
            +
            require "appraisal/appraisal_file"
         | 
| 2 2 | 
             
            require "yaml"
         | 
| 3 3 |  | 
| 4 4 | 
             
            module Appraisal
         | 
| @@ -20,7 +20,7 @@ module Appraisal | |
| 20 20 | 
             
                  puts "# Put this in your .travis.yml"
         | 
| 21 21 | 
             
                  puts "#{GEMFILES_CONFIGURATION_KEY}:"
         | 
| 22 22 |  | 
| 23 | 
            -
                   | 
| 23 | 
            +
                  AppraisalFile.each do |appraisal|
         | 
| 24 24 | 
             
                    puts "  - #{appraisal.relative_gemfile_path}"
         | 
| 25 25 | 
             
                  end
         | 
| 26 26 | 
             
                end
         | 
| @@ -45,7 +45,7 @@ module Appraisal | |
| 45 45 | 
             
                  private
         | 
| 46 46 |  | 
| 47 47 | 
             
                  def has_configuration_file?
         | 
| 48 | 
            -
                     | 
| 48 | 
            +
                    File.exist?(CONFIGURATION_FILE)
         | 
| 49 49 | 
             
                  end
         | 
| 50 50 |  | 
| 51 51 | 
             
                  def has_no_gemfiles_configuration?
         | 
| @@ -55,7 +55,7 @@ module Appraisal | |
| 55 55 | 
             
                  def has_invalid_gemfiles_configuration?
         | 
| 56 56 | 
             
                    if configuration && configuration[GEMFILES_CONFIGURATION_KEY]
         | 
| 57 57 | 
             
                      appraisal_paths =
         | 
| 58 | 
            -
                         | 
| 58 | 
            +
                        AppraisalFile.new.appraisals.map(&:relative_gemfile_path).sort
         | 
| 59 59 | 
             
                      travis_gemfile_paths = configuration[GEMFILES_CONFIGURATION_KEY].sort
         | 
| 60 60 | 
             
                      appraisal_paths != travis_gemfile_paths
         | 
| 61 61 | 
             
                    end
         | 
    
        data/lib/appraisal/utils.rb
    CHANGED
    
    | @@ -9,7 +9,7 @@ module Appraisal | |
| 9 9 | 
             
                  case object
         | 
| 10 10 | 
             
                  when Hash
         | 
| 11 11 | 
             
                    items = object.map do |key, value|
         | 
| 12 | 
            -
                       | 
| 12 | 
            +
                      format_hash_value(key, value)
         | 
| 13 13 | 
             
                    end
         | 
| 14 14 |  | 
| 15 15 | 
             
                    if enclosing_object
         | 
| @@ -22,6 +22,17 @@ module Appraisal | |
| 22 22 | 
             
                  end
         | 
| 23 23 | 
             
                end
         | 
| 24 24 |  | 
| 25 | 
            +
                def self.format_hash_value(key, value)
         | 
| 26 | 
            +
                  key = format_string(key, true)
         | 
| 27 | 
            +
                  value = format_string(value, true)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  if RUBY_VERSION >= "1.9" && key.start_with?(":")
         | 
| 30 | 
            +
                    "#{key.sub(/^:/, "")}: #{value}"
         | 
| 31 | 
            +
                  else
         | 
| 32 | 
            +
                    "#{key} => #{value}"
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 25 36 | 
             
                def self.format_arguments(arguments)
         | 
| 26 37 | 
             
                  unless arguments.empty?
         | 
| 27 38 | 
             
                    arguments.map { |object| format_string(object, false) }.join(', ')
         | 
| @@ -35,10 +46,17 @@ module Appraisal | |
| 35 46 | 
             
                def self.prefix_path(path)
         | 
| 36 47 | 
             
                  if path !~ /^(?:\/|\S:)/ && path !~ /^\S+:\/\// && path !~ /^\S+@\S+:/
         | 
| 37 48 | 
             
                    cleaned_path = path.gsub(/(^|\/)\.(?:\/|$)/, "\\1")
         | 
| 38 | 
            -
                     | 
| 49 | 
            +
                    File.join("..", cleaned_path)
         | 
| 39 50 | 
             
                  else
         | 
| 40 51 | 
             
                    path
         | 
| 41 52 | 
             
                  end
         | 
| 42 53 | 
             
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def self.bundler_version
         | 
| 56 | 
            +
                  Gem::Specification.
         | 
| 57 | 
            +
                    detect { |spec| spec.name == "bundler" }.
         | 
| 58 | 
            +
                    version.
         | 
| 59 | 
            +
                    to_s
         | 
| 60 | 
            +
                end
         | 
| 43 61 | 
             
              end
         | 
| 44 62 | 
             
            end
         | 
    
        data/lib/appraisal/version.rb
    CHANGED
    
    
| @@ -3,13 +3,15 @@ require 'spec_helper' | |
| 3 3 | 
             
            describe 'Appraisals file Bundler DSL compatibility' do
         | 
| 4 4 | 
             
              it 'supports all Bundler DSL in Appraisals file' do
         | 
| 5 5 | 
             
                build_gems %w(bagel orange_juice milk waffle coffee ham sausage pancake)
         | 
| 6 | 
            -
                 | 
| 6 | 
            +
                build_git_gems %w(egg croissant pain_au_chocolat)
         | 
| 7 7 |  | 
| 8 8 | 
             
                build_gemfile <<-Gemfile
         | 
| 9 9 | 
             
                  source 'https://rubygems.org'
         | 
| 10 | 
            +
                  git_source(:custom_git_source) { |repo| "../gems/\#{repo}" }
         | 
| 10 11 | 
             
                  ruby RUBY_VERSION
         | 
| 11 12 |  | 
| 12 13 | 
             
                  gem 'bagel'
         | 
| 14 | 
            +
                  gem "croissant", :custom_git_source => "croissant"
         | 
| 13 15 |  | 
| 14 16 | 
             
                  git '../gems/egg' do
         | 
| 15 17 | 
             
                    gem 'egg'
         | 
| @@ -44,6 +46,7 @@ describe 'Appraisals file Bundler DSL compatibility' do | |
| 44 46 | 
             
                    ruby "1.8.7"
         | 
| 45 47 |  | 
| 46 48 | 
             
                    gem 'bread'
         | 
| 49 | 
            +
                    gem "pain_au_chocolat", :custom_git_source => "pain_au_chocolat"
         | 
| 47 50 |  | 
| 48 51 | 
             
                    git '../gems/egg' do
         | 
| 49 52 | 
             
                      gem 'porched_egg'
         | 
| @@ -70,6 +73,7 @@ describe 'Appraisals file Bundler DSL compatibility' do | |
| 70 73 | 
             
                    end
         | 
| 71 74 |  | 
| 72 75 | 
             
                    gemspec
         | 
| 76 | 
            +
                    gemspec :path => "sitepress"
         | 
| 73 77 | 
             
                  end
         | 
| 74 78 | 
             
                Appraisals
         | 
| 75 79 |  | 
| @@ -95,8 +99,10 @@ describe 'Appraisals file Bundler DSL compatibility' do | |
| 95 99 | 
             
                  end
         | 
| 96 100 |  | 
| 97 101 | 
             
                  gem "bagel"
         | 
| 102 | 
            +
                  gem "croissant", :git => "../../gems/croissant"
         | 
| 98 103 | 
             
                  gem "appraisal", :path => #{PROJECT_ROOT.inspect}
         | 
| 99 104 | 
             
                  gem "bread"
         | 
| 105 | 
            +
                  gem "pain_au_chocolat", :git => "../../gems/pain_au_chocolat"
         | 
| 100 106 |  | 
| 101 107 | 
             
                  group :breakfast do
         | 
| 102 108 | 
             
                    gem "orange_juice"
         | 
| @@ -122,6 +128,7 @@ describe 'Appraisals file Bundler DSL compatibility' do | |
| 122 128 | 
             
                  end
         | 
| 123 129 |  | 
| 124 130 | 
             
                  gemspec :path => "../"
         | 
| 131 | 
            +
                  gemspec :path => "../sitepress"
         | 
| 125 132 | 
             
                Gemfile
         | 
| 126 133 | 
             
              end
         | 
| 127 134 | 
             
            end
         | 
| @@ -41,8 +41,9 @@ describe "Bundle with custom path" do | |
| 41 41 | 
             
                    gem 'appraisal', :path => #{PROJECT_ROOT.inspect}
         | 
| 42 42 |  | 
| 43 43 | 
             
                    if RUBY_VERSION < "1.9"
         | 
| 44 | 
            -
                       | 
| 45 | 
            -
             | 
| 44 | 
            +
                      #{File.read(File.join(PROJECT_ROOT, "Gemfile-1.8"))}
         | 
| 45 | 
            +
                    elsif RUBY_VERSION < "2.2"
         | 
| 46 | 
            +
                      #{File.read(File.join(PROJECT_ROOT, "Gemfile-2.1"))}
         | 
| 46 47 | 
             
                    end
         | 
| 47 48 | 
             
                  Gemfile
         | 
| 48 49 |  | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            require "spec_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe "Bundler without flag" do
         | 
| 4 | 
            +
              it "passes --without flag to Bundler on install" do
         | 
| 5 | 
            +
                build_gems %w(pancake orange_juice waffle coffee sausage soda)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                build_gemfile <<-Gemfile
         | 
| 8 | 
            +
                  source "https://rubygems.org"
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  gem "pancake"
         | 
| 11 | 
            +
                  gem "rake", "~> 10.5", :platform => :ruby_18
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  group :drinks do
         | 
| 14 | 
            +
                    gem "orange_juice"
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  gem "appraisal", :path => #{PROJECT_ROOT.inspect}
         | 
| 18 | 
            +
                Gemfile
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                build_appraisal_file <<-Appraisals
         | 
| 21 | 
            +
                  appraise "breakfast" do
         | 
| 22 | 
            +
                    gem "waffle"
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    group :drinks do
         | 
| 25 | 
            +
                      gem "coffee"
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  appraise "lunch" do
         | 
| 30 | 
            +
                    gem "sausage"
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    group :drinks do
         | 
| 33 | 
            +
                      gem "soda"
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                Appraisals
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                run "bundle install --local"
         | 
| 39 | 
            +
                output = run "appraisal install --without drinks"
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                expect(output).to include("Bundle complete")
         | 
| 42 | 
            +
                expect(output).to include("Gems in the group drinks were not installed.")
         | 
| 43 | 
            +
                expect(output).not_to include("orange_juice")
         | 
| 44 | 
            +
                expect(output).not_to include("coffee")
         | 
| 45 | 
            +
                expect(output).not_to include("soda")
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                output = run "appraisal install"
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                expect(output).to include("The Gemfile's dependencies are satisfied")
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
            end
         | 
| @@ -25,8 +25,9 @@ describe 'CLI', 'appraisal update' do | |
| 25 25 |  | 
| 26 26 | 
             
              context 'with no arguments' do
         | 
| 27 27 | 
             
                it 'updates all the gems' do
         | 
| 28 | 
            -
                  run 'appraisal update'
         | 
| 28 | 
            +
                  output = run 'appraisal update'
         | 
| 29 29 |  | 
| 30 | 
            +
                  expect(output).to include("gemfiles/dummy.gemfile bundle update")
         | 
| 30 31 | 
             
                  expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy (1.0.1)'
         | 
| 31 32 | 
             
                  expect(content_of 'gemfiles/dummy.gemfile.lock').to include 'dummy2 (1.0.1)'
         | 
| 32 33 | 
             
                end
         | 
| @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 | 
            -
            require 'appraisal/ | 
| 2 | 
            +
            require 'appraisal/appraisal_file'
         | 
| 3 3 |  | 
| 4 4 | 
             
            # Requiring this to make the test pass on Rubinius 2.2.5
         | 
| 5 5 | 
             
            # https://github.com/rubinius/rubinius/issues/2934
         | 
| 6 6 | 
             
            require 'rspec/matchers/built_in/raise_error'
         | 
| 7 7 |  | 
| 8 | 
            -
            describe Appraisal:: | 
| 8 | 
            +
            describe Appraisal::AppraisalFile do
         | 
| 9 9 | 
             
              it "complains when no Appraisals file is found" do
         | 
| 10 | 
            -
                allow( | 
| 11 | 
            -
                allow( | 
| 10 | 
            +
                allow(File).to receive(:exist?).with(/Gemfile/).and_return(true)
         | 
| 11 | 
            +
                allow(File).to receive(:exist?).with("Appraisals").and_return(false)
         | 
| 12 12 | 
             
                expect { described_class.new }.to raise_error(Appraisal::AppraisalsNotFound)
         | 
| 13 13 | 
             
              end
         | 
| 14 14 | 
             
            end
         | 
| @@ -41,7 +41,7 @@ describe Appraisal::Appraisal do | |
| 41 41 | 
             
                  stub_const('Bundler::VERSION', '1.3.0')
         | 
| 42 42 |  | 
| 43 43 | 
             
                  warning = capture(:stderr) do
         | 
| 44 | 
            -
                    @appraisal.install(42)
         | 
| 44 | 
            +
                    @appraisal.install("jobs" => 42)
         | 
| 45 45 | 
             
                  end
         | 
| 46 46 |  | 
| 47 47 | 
             
                  expect(Appraisal::Command).to have_received(:new).
         | 
| @@ -52,12 +52,19 @@ describe Appraisal::Appraisal do | |
| 52 52 | 
             
                it 'runs parallel install command on Bundler >= 1.4.0' do
         | 
| 53 53 | 
             
                  stub_const('Bundler::VERSION', '1.4.0')
         | 
| 54 54 |  | 
| 55 | 
            -
                  @appraisal.install(42)
         | 
| 55 | 
            +
                  @appraisal.install("jobs" => 42)
         | 
| 56 56 |  | 
| 57 57 | 
             
                  expect(Appraisal::Command).to have_received(:new).
         | 
| 58 58 | 
             
                    with("#{bundle_check_command} || #{bundle_parallel_install_command}")
         | 
| 59 59 | 
             
                end
         | 
| 60 60 |  | 
| 61 | 
            +
                it 'runs install command with retries on Bundler' do
         | 
| 62 | 
            +
                  @appraisal.install("retry" => 3)
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  expect(Appraisal::Command).to have_received(:new).
         | 
| 65 | 
            +
                    with("#{bundle_check_command} || #{bundle_install_command_with_retries}")
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 61 68 | 
             
                def bundle_check_command
         | 
| 62 69 | 
             
                  "bundle check --gemfile='/home/test/test directory'"
         | 
| 63 70 | 
             
                end
         | 
| @@ -69,5 +76,9 @@ describe Appraisal::Appraisal do | |
| 69 76 | 
             
                def bundle_parallel_install_command
         | 
| 70 77 | 
             
                  "bundle install --gemfile='/home/test/test directory' --jobs=42"
         | 
| 71 78 | 
             
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                def bundle_install_command_with_retries
         | 
| 81 | 
            +
                  "bundle install --gemfile='/home/test/test directory' --retry 3"
         | 
| 82 | 
            +
                end
         | 
| 72 83 | 
             
              end
         | 
| 73 84 | 
             
            end
         | 
| @@ -251,6 +251,8 @@ describe Appraisal::Gemfile do | |
| 251 251 | 
             
              end
         | 
| 252 252 |  | 
| 253 253 | 
             
              context "relative path handling" do
         | 
| 254 | 
            +
                before { stub_const('RUBY_VERSION', '1.8.7') }
         | 
| 255 | 
            +
             | 
| 254 256 | 
             
                context "in :path option" do
         | 
| 255 257 | 
             
                  it "handles dot path" do
         | 
| 256 258 | 
             
                    gemfile = Appraisal::Gemfile.new
         | 
| @@ -416,4 +418,16 @@ describe Appraisal::Gemfile do | |
| 416 418 | 
             
                  end
         | 
| 417 419 | 
             
                end
         | 
| 418 420 | 
             
              end
         | 
| 421 | 
            +
             | 
| 422 | 
            +
              context "git_source support" do
         | 
| 423 | 
            +
                before { stub_const('RUBY_VERSION', '1.8.7') }
         | 
| 424 | 
            +
             | 
| 425 | 
            +
                it "stores git_source declaration and apply it as git option" do
         | 
| 426 | 
            +
                  gemfile = Appraisal::Gemfile.new
         | 
| 427 | 
            +
                  gemfile.git_source(:custom_source) { |repo| "path/#{repo}" }
         | 
| 428 | 
            +
                  gemfile.gem "bacon", :custom_source => "bacon_pancake"
         | 
| 429 | 
            +
             | 
| 430 | 
            +
                  expect(gemfile.to_s).to eq %(gem "bacon", :git => "../path/bacon_pancake")
         | 
| 431 | 
            +
                end
         | 
| 432 | 
            +
              end
         | 
| 419 433 | 
             
            end
         | 
| @@ -3,17 +3,30 @@ require 'appraisal/utils' | |
| 3 3 |  | 
| 4 4 | 
             
            describe Appraisal::Utils do
         | 
| 5 5 | 
             
              describe '.format_string' do
         | 
| 6 | 
            -
                 | 
| 7 | 
            -
                  hash  | 
| 8 | 
            -
             | 
| 6 | 
            +
                if RUBY_VERSION > "1.9"
         | 
| 7 | 
            +
                  it "prints out a nice looking hash without brackets with new syntax" do
         | 
| 8 | 
            +
                    hash = { :foo => 'bar' }
         | 
| 9 | 
            +
                    expect(Appraisal::Utils.format_string(hash)).to eq('foo: "bar"')
         | 
| 9 10 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 11 | 
            +
                    hash = { 'baz' => { :ball => 'boo' }}
         | 
| 12 | 
            +
                    expect(Appraisal::Utils.format_string(hash)).
         | 
| 13 | 
            +
                      to eq('"baz" => { ball: "boo" }')
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                else
         | 
| 16 | 
            +
                  it "prints out a nice looking hash without brackets with old syntax" do
         | 
| 17 | 
            +
                    hash = { :foo => 'bar' }
         | 
| 18 | 
            +
                    expect(Appraisal::Utils.format_string(hash)).to eq(':foo => "bar"')
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    hash = { 'baz' => { :ball => 'boo' }}
         | 
| 21 | 
            +
                    expect(Appraisal::Utils.format_string(hash)).
         | 
| 22 | 
            +
                      to eq('"baz" => { :ball => "boo" }')
         | 
| 23 | 
            +
                  end
         | 
| 13 24 | 
             
                end
         | 
| 14 25 | 
             
              end
         | 
| 15 26 |  | 
| 16 27 | 
             
              describe '.format_arguments' do
         | 
| 28 | 
            +
                before { stub_const('RUBY_VERSION', '1.8.7') }
         | 
| 29 | 
            +
             | 
| 17 30 | 
             
                it 'prints out arguments without enclosing square brackets' do
         | 
| 18 31 | 
             
                  arguments = [:foo, { :bar => { :baz => 'ball' }}]
         | 
| 19 32 |  | 
| @@ -58,4 +71,16 @@ describe Appraisal::Utils do | |
| 58 71 | 
             
                  ).to eq("https://github.com/bacon/bacon.git")
         | 
| 59 72 | 
             
                end
         | 
| 60 73 | 
             
              end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
              describe ".bundler_version" do
         | 
| 76 | 
            +
                it "returns the bundler version" do
         | 
| 77 | 
            +
                  bundler = double("Bundler", :name => "bundler", :version => "a.b.c")
         | 
| 78 | 
            +
                  allow(Gem::Specification).to receive(:detect).and_return(bundler)
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  version = Appraisal::Utils.bundler_version
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  expect(version).to eq "a.b.c"
         | 
| 83 | 
            +
                  expect(Gem::Specification).to have_received(:detect)
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
              end
         | 
| 61 86 | 
             
            end
         | 
| @@ -80,12 +80,17 @@ module AcceptanceTestHelpers | |
| 80 80 | 
             
                    s.name = 'stage'
         | 
| 81 81 | 
             
                    s.version = '0.1'
         | 
| 82 82 | 
             
                    s.summary = 'Awesome Gem!'
         | 
| 83 | 
            +
                    s.authors = "Appraisal"
         | 
| 83 84 | 
             
                  end
         | 
| 84 85 | 
             
                gemspec
         | 
| 85 86 | 
             
              end
         | 
| 86 87 |  | 
| 87 88 | 
             
              def content_of(path)
         | 
| 88 | 
            -
                file(path).read
         | 
| 89 | 
            +
                file(path).read.tap do |content|
         | 
| 90 | 
            +
                  if RUBY_VERSION >= "1.9"
         | 
| 91 | 
            +
                    content.gsub!(/(\S+): /, ":\\1 => ")
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
                end
         | 
| 89 94 | 
             
              end
         | 
| 90 95 |  | 
| 91 96 | 
             
              def file(path)
         | 
| @@ -125,8 +130,9 @@ module AcceptanceTestHelpers | |
| 125 130 | 
             
                    Reinstall Bundler to #{TMP_GEM_ROOT} as `BUNDLE_DISABLE_SHARED_GEMS`
         | 
| 126 131 | 
             
                    is enabled.
         | 
| 127 132 | 
             
                  WARNING
         | 
| 133 | 
            +
                  version = Utils.bundler_version
         | 
| 128 134 |  | 
| 129 | 
            -
                  run "gem install bundler --install-dir '#{TMP_GEM_ROOT}'"
         | 
| 135 | 
            +
                  run "gem install bundler --version #{version} --install-dir '#{TMP_GEM_ROOT}'"
         | 
| 130 136 | 
             
                end
         | 
| 131 137 | 
             
              end
         | 
| 132 138 |  | 
| @@ -137,8 +143,9 @@ module AcceptanceTestHelpers | |
| 137 143 | 
             
                  gem 'appraisal', :path => '#{PROJECT_ROOT}'
         | 
| 138 144 |  | 
| 139 145 | 
             
                  if RUBY_VERSION < "1.9"
         | 
| 140 | 
            -
                     | 
| 141 | 
            -
             | 
| 146 | 
            +
                    #{File.read(File.join(PROJECT_ROOT, "Gemfile-1.8"))}
         | 
| 147 | 
            +
                  elsif RUBY_VERSION < "2.2"
         | 
| 148 | 
            +
                    #{File.read(File.join(PROJECT_ROOT, "Gemfile-2.1"))}
         | 
| 142 149 | 
             
                  end
         | 
| 143 150 | 
             
                Gemfile
         | 
| 144 151 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: appraisal
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Joe Ferris
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2017-04-19 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rake
         | 
| @@ -96,6 +96,8 @@ files: | |
| 96 96 | 
             
            - ".travis.yml"
         | 
| 97 97 | 
             
            - CONTRIBUTING.md
         | 
| 98 98 | 
             
            - Gemfile
         | 
| 99 | 
            +
            - Gemfile-1.8
         | 
| 100 | 
            +
            - Gemfile-2.1
         | 
| 99 101 | 
             
            - MIT-LICENSE
         | 
| 100 102 | 
             
            - README.md
         | 
| 101 103 | 
             
            - Rakefile
         | 
| @@ -103,19 +105,19 @@ files: | |
| 103 105 | 
             
            - bin/appraisal
         | 
| 104 106 | 
             
            - lib/appraisal.rb
         | 
| 105 107 | 
             
            - lib/appraisal/appraisal.rb
         | 
| 108 | 
            +
            - lib/appraisal/appraisal_file.rb
         | 
| 106 109 | 
             
            - lib/appraisal/bundler_dsl.rb
         | 
| 107 110 | 
             
            - lib/appraisal/cli.rb
         | 
| 108 111 | 
             
            - lib/appraisal/command.rb
         | 
| 109 112 | 
             
            - lib/appraisal/dependency.rb
         | 
| 110 113 | 
             
            - lib/appraisal/dependency_list.rb
         | 
| 111 114 | 
             
            - lib/appraisal/errors.rb
         | 
| 112 | 
            -
            - lib/appraisal/file.rb
         | 
| 113 115 | 
             
            - lib/appraisal/gemfile.rb
         | 
| 114 116 | 
             
            - lib/appraisal/gemspec.rb
         | 
| 115 | 
            -
            - lib/appraisal/ | 
| 117 | 
            +
            - lib/appraisal/git.rb
         | 
| 116 118 | 
             
            - lib/appraisal/group.rb
         | 
| 117 119 | 
             
            - lib/appraisal/ordered_hash.rb
         | 
| 118 | 
            -
            - lib/appraisal/ | 
| 120 | 
            +
            - lib/appraisal/path.rb
         | 
| 119 121 | 
             
            - lib/appraisal/platform.rb
         | 
| 120 122 | 
             
            - lib/appraisal/source.rb
         | 
| 121 123 | 
             
            - lib/appraisal/task.rb
         | 
| @@ -124,6 +126,7 @@ files: | |
| 124 126 | 
             
            - lib/appraisal/version.rb
         | 
| 125 127 | 
             
            - spec/acceptance/appraisals_file_bundler_dsl_compatibility_spec.rb
         | 
| 126 128 | 
             
            - spec/acceptance/bundle_with_custom_path_spec.rb
         | 
| 129 | 
            +
            - spec/acceptance/bundle_without_spec.rb
         | 
| 127 130 | 
             
            - spec/acceptance/cli/clean_spec.rb
         | 
| 128 131 | 
             
            - spec/acceptance/cli/generate_spec.rb
         | 
| 129 132 | 
             
            - spec/acceptance/cli/help_spec.rb
         | 
| @@ -136,9 +139,9 @@ files: | |
| 136 139 | 
             
            - spec/acceptance/gemfile_dsl_compatibility_spec.rb
         | 
| 137 140 | 
             
            - spec/acceptance/gemspec_spec.rb
         | 
| 138 141 | 
             
            - spec/acceptance/travis_ci_integration_spec.rb
         | 
| 142 | 
            +
            - spec/appraisal/appraisal_file_spec.rb
         | 
| 139 143 | 
             
            - spec/appraisal/appraisal_spec.rb
         | 
| 140 144 | 
             
            - spec/appraisal/dependency_list_spec.rb
         | 
| 141 | 
            -
            - spec/appraisal/file_spec.rb
         | 
| 142 145 | 
             
            - spec/appraisal/gemfile_spec.rb
         | 
| 143 146 | 
             
            - spec/appraisal/utils_spec.rb
         | 
| 144 147 | 
             
            - spec/spec_helper.rb
         | 
| @@ -165,13 +168,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 165 168 | 
             
                  version: '0'
         | 
| 166 169 | 
             
            requirements: []
         | 
| 167 170 | 
             
            rubyforge_project: 
         | 
| 168 | 
            -
            rubygems_version: 2. | 
| 171 | 
            +
            rubygems_version: 2.6.8
         | 
| 169 172 | 
             
            signing_key: 
         | 
| 170 173 | 
             
            specification_version: 4
         | 
| 171 174 | 
             
            summary: Find out what your Ruby gems are worth
         | 
| 172 175 | 
             
            test_files:
         | 
| 173 176 | 
             
            - spec/acceptance/appraisals_file_bundler_dsl_compatibility_spec.rb
         | 
| 174 177 | 
             
            - spec/acceptance/bundle_with_custom_path_spec.rb
         | 
| 178 | 
            +
            - spec/acceptance/bundle_without_spec.rb
         | 
| 175 179 | 
             
            - spec/acceptance/cli/clean_spec.rb
         | 
| 176 180 | 
             
            - spec/acceptance/cli/generate_spec.rb
         | 
| 177 181 | 
             
            - spec/acceptance/cli/help_spec.rb
         | 
| @@ -184,9 +188,9 @@ test_files: | |
| 184 188 | 
             
            - spec/acceptance/gemfile_dsl_compatibility_spec.rb
         | 
| 185 189 | 
             
            - spec/acceptance/gemspec_spec.rb
         | 
| 186 190 | 
             
            - spec/acceptance/travis_ci_integration_spec.rb
         | 
| 191 | 
            +
            - spec/appraisal/appraisal_file_spec.rb
         | 
| 187 192 | 
             
            - spec/appraisal/appraisal_spec.rb
         | 
| 188 193 | 
             
            - spec/appraisal/dependency_list_spec.rb
         | 
| 189 | 
            -
            - spec/appraisal/file_spec.rb
         | 
| 190 194 | 
             
            - spec/appraisal/gemfile_spec.rb
         | 
| 191 195 | 
             
            - spec/appraisal/utils_spec.rb
         | 
| 192 196 | 
             
            - spec/spec_helper.rb
         |