appraisal 2.4.1 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f28af4a3f925fd52ded81f375ed865a56a844fe20d4bdaf09a4a6fc8c7ad644
4
- data.tar.gz: 3016386d58c9a22889d2e3e137cec003040f28e75040cc5349fa7d8ef2081c52
3
+ metadata.gz: 3574be66377d3aae65b37b349e4f345a2c3902e4e5ec6030401b6b1b30a2992f
4
+ data.tar.gz: 745cb04bc9266861ff9097ce5ff1c1bc84a5a0fd7b7877e66aaa568ca84aa80e
5
5
  SHA512:
6
- metadata.gz: 8f610b40f4e7282377c0d98eb36ee735ca6ecc24daac98995029affb811f2d86e41189628e1667464000ab706392b3ea418411760847bd8a61aea08629e1d461
7
- data.tar.gz: 709cc7583d98cdaa1ead29f3804f9f02ebf1a7f089af2a751433dc4860748438e6f2f3974eb14fe58ae67dcd1f406b7a00ddf5be6228112258698c67d13595c8
6
+ metadata.gz: 1f7d36071e02f1a31ebea13cf350733708ab799507dc315c97667d50aec24d7a4f51d0e13a88dc4225c65d13599020ff0bc7d5ed62bf64d1ceca24f0b0c1c081
7
+ data.tar.gz: 31d3c863906955c139632f6ddd957a6ba73d95012b1fb09b5ffa64112f1b2dc3606b9e5d337d3ef6019e2eec27fd8f745a7bd79eadacd66dfe2f16376000e5a7
data/README.md CHANGED
@@ -1,13 +1,8 @@
1
1
  Appraisal
2
2
  =========
3
3
 
4
- [![Build Status][Build Status Image]][Build Status]
5
-
6
4
  Find out what your Ruby gems are worth.
7
5
 
8
- [Build Status Image]: https://secure.travis-ci.org/thoughtbot/appraisal.svg?branch=master
9
- [Build Status]: http://travis-ci.org/thoughtbot/appraisal
10
-
11
6
  Synopsis
12
7
  --------
13
8
 
@@ -89,7 +84,7 @@ your real default task, which usually is your `test` task.)
89
84
 
90
85
  Note that this may conflict with your CI setup if you decide to split the test
91
86
  into multiple processes by Appraisal and you are using `rake` to run tests by
92
- default. Please see **Travis CI Integration** for more detail.
87
+ default.
93
88
 
94
89
  ### Commands
95
90
 
@@ -155,41 +150,53 @@ group :test do
155
150
  end
156
151
  ```
157
152
 
158
- Version Control
159
- ---------------
160
-
161
- When using Appraisal, we recommend you check in the Gemfiles that Appraisal
162
- generates within the gemfiles directory, but exclude the lockfiles there
163
- (`*.gemfile.lock`.) The Gemfiles are useful when running your tests against a
164
- continuous integration server such as [Travis CI][Travis CI].
153
+ Customization
154
+ -------------
165
155
 
166
- [Travis CI]: https://travis-ci.org
156
+ It is possible to customize the generated Gemfiles by adding a `customize_gemfiles` block to
157
+ your `Appraisals` file. The block must contain a hash of key/value pairs. Currently supported
158
+ customizations include:
159
+ - heading: a string that by default adds "# This file was generated by Appraisal" to the top of each Gemfile, (the string will be commented for you)
160
+ - single_quotes: a boolean that controls if strings are single quoted in each Gemfile, defaults to false
167
161
 
168
- Travis CI integration
169
- ---------------------
162
+ ### Example Usage
170
163
 
171
- If you're using Appraisal and using Travis CI, we're recommending you to setup
172
- Travis to run the test against multiple generated Gemfiles. This can be done
173
- by using `gemfile` setting:
164
+ **Appraisals**
165
+ ```ruby
166
+ customize_gemfiles do
167
+ {
168
+ single_quotes: true,
169
+ heading: <<~HEADING
170
+ frozen_string_literal: true
171
+
172
+ File has been generated by Appraisal, do NOT modify it directly!
173
+ See the conventions at https://example.com/
174
+ HEADING
175
+ }
176
+ end
174
177
 
175
- # In .travis.yml
176
- gemfile:
177
- - gemfiles/3.0.gemfile
178
- - gemfiles/3.1.gemfile
179
- - gemfiles/3.2.gemfile
178
+ appraise "rails-3" do
179
+ gem "rails", "3.2.14"
180
+ end
181
+ ```
180
182
 
181
- Please note that if you've set your default rake task to run the test against
182
- all versions of its dependency, you might have to set a `script` setting:
183
+ Using the `Appraisals` file defined above, this is what the resulting `Gemfile` will look like:
184
+ ```ruby
185
+ # frozen_string_literal: true
183
186
 
184
- script: "bundle exec rake test"
187
+ # File has been generated by Appraisal, do NOT modify it directly!
188
+ # See the conventions at https://example.com/
185
189
 
186
- That will make sure that each of the test sub-job are not getting run more than
187
- one time.
190
+ gem 'rails', '3.2.14'
191
+ ```
188
192
 
189
- You can also run your tests against multiple versions of Ruby locally, just
190
- like running on Travis CI, by using [WWTD].
193
+ Version Control
194
+ ---------------
191
195
 
192
- [WWTD]: https://github.com/grosser/wwtd
196
+ When using Appraisal, we recommend you check in the Gemfiles that Appraisal
197
+ generates within the gemfiles directory, but exclude the lockfiles there
198
+ (`*.gemfile.lock`.) The Gemfiles are useful when running your tests against a
199
+ continuous integration server.
193
200
 
194
201
  Circle CI Integration
195
202
  ---------------------
@@ -217,7 +224,7 @@ command in the `override` section and use your favourite one.
217
224
  Credits
218
225
  -------
219
226
 
220
- ![thoughtbot](http://presskit.thoughtbot.com/images/thoughtbot-logo-for-readmes.svg)
227
+ ![thoughtbot](https://thoughtbot.com/thoughtbot-logo-for-readmes.svg)
221
228
 
222
229
  Appraisal is maintained and funded by [thoughtbot, inc][thoughtbot]
223
230
 
@@ -1,5 +1,6 @@
1
1
  require 'appraisal/gemfile'
2
2
  require 'appraisal/command'
3
+ require "appraisal/customize"
3
4
  require 'appraisal/utils'
4
5
  require 'fileutils'
5
6
  require 'pathname'
@@ -44,6 +45,10 @@ module Appraisal
44
45
  gemfile.group(*args, &block)
45
46
  end
46
47
 
48
+ def install_if(*args, &block)
49
+ gemfile.install_if(*args, &block)
50
+ end
51
+
47
52
  def platforms(*args, &block)
48
53
  gemfile.platforms(*args, &block)
49
54
  end
@@ -58,8 +63,8 @@ module Appraisal
58
63
 
59
64
  def write_gemfile
60
65
  File.open(gemfile_path, "w") do |file|
61
- signature = "# This file was generated by Appraisal"
62
- file.puts([signature, gemfile.to_s].join("\n\n"))
66
+ signature = Customize.heading || "This file was generated by Appraisal"
67
+ file.puts([comment_lines(signature), quoted_gemfile].join("\n\n"))
63
68
  end
64
69
  end
65
70
 
@@ -102,7 +107,10 @@ module Appraisal
102
107
  lockfile_content = File.read(lockfile_path)
103
108
 
104
109
  File.open(lockfile_path, 'w') do |file|
105
- file.write lockfile_content.gsub(/#{current_directory}/, relative_path.to_s)
110
+ file.write lockfile_content.gsub(
111
+ / #{current_directory}/,
112
+ " #{relative_path}",
113
+ )
106
114
  end
107
115
  end
108
116
 
@@ -167,5 +175,21 @@ module Appraisal
167
175
 
168
176
  options_strings.join(" ") if options_strings != []
169
177
  end
178
+
179
+ def comment_lines(heading)
180
+ heading.lines.map do |line|
181
+ if line.lstrip.empty?
182
+ line
183
+ else
184
+ "# #{line}"
185
+ end
186
+ end.join
187
+ end
188
+
189
+ def quoted_gemfile
190
+ return gemfile.to_s unless Customize.single_quotes
191
+
192
+ gemfile.to_s.tr('"', "'")
193
+ end
170
194
  end
171
195
  end
@@ -1,4 +1,5 @@
1
1
  require 'appraisal/appraisal'
2
+ require "appraisal/customize"
2
3
  require 'appraisal/errors'
3
4
  require 'appraisal/gemfile'
4
5
 
@@ -33,6 +34,10 @@ module Appraisal
33
34
  @appraisals << appraisal
34
35
  end
35
36
 
37
+ def customize_gemfiles(&_block)
38
+ Customize.new(yield)
39
+ end
40
+
36
41
  private
37
42
 
38
43
  def run(definitions)
@@ -5,7 +5,7 @@ module Appraisal
5
5
  attr_reader :dependencies
6
6
 
7
7
  PARTS = %w(source ruby_version gits paths dependencies groups
8
- platforms source_blocks gemspec)
8
+ platforms source_blocks install_if gemspec)
9
9
 
10
10
  def initialize
11
11
  @sources = []
@@ -18,6 +18,7 @@ module Appraisal
18
18
  @paths = Hash.new
19
19
  @source_blocks = Hash.new
20
20
  @git_sources = {}
21
+ @install_if = {}
21
22
  end
22
23
 
23
24
  def run(&block)
@@ -38,6 +39,12 @@ module Appraisal
38
39
  @groups[names].run(&block)
39
40
  end
40
41
 
42
+ def install_if(condition, &block)
43
+ @install_if[condition] ||=
44
+ Conditional.new(condition).tap { |g| g.git_sources = @git_sources.dup }
45
+ @install_if[condition].run(&block)
46
+ end
47
+
41
48
  def platforms(*names, &block)
42
49
  @platforms[names] ||=
43
50
  Platform.new(names).tap { |g| g.git_sources = @git_sources.dup }
@@ -124,7 +131,7 @@ module Appraisal
124
131
  @dependencies.for_dup
125
132
  end
126
133
 
127
- [:gits, :paths, :platforms, :groups, :source_blocks].
134
+ %i[gits paths platforms groups source_blocks install_if].
128
135
  each do |method_name|
129
136
  class_eval <<-METHODS, __FILE__, __LINE__
130
137
  private
data/lib/appraisal/cli.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'thor'
2
2
  require 'fileutils'
3
- require "appraisal/travis_ci_helper"
4
3
 
5
4
  module Appraisal
6
5
  class CLI < Thor
@@ -63,17 +62,10 @@ module Appraisal
63
62
  end
64
63
 
65
64
  desc 'generate', 'Generate a gemfile for each appraisal'
66
- method_option "travis", :type => :boolean, :default => false
67
65
  def generate
68
66
  AppraisalFile.each do |appraisal|
69
67
  appraisal.write_gemfile
70
68
  end
71
-
72
- if options[:travis]
73
- TravisCIHelper.display_instruction
74
- else
75
- TravisCIHelper.validate_configuration_file
76
- end
77
69
  end
78
70
 
79
71
  desc 'clean', 'Remove all generated gemfiles and lockfiles from gemfiles folder'
@@ -3,23 +3,24 @@ require "shellwords"
3
3
  module Appraisal
4
4
  # Executes commands with a clean environment
5
5
  class Command
6
- BUNDLER_ENV_VARS = %w(RUBYOPT BUNDLE_PATH BUNDLE_BIN_PATH BUNDLE_GEMFILE).freeze
7
-
8
- attr_reader :command, :env, :gemfile, :original_env
6
+ attr_reader :command, :env, :gemfile
9
7
 
10
8
  def initialize(command, options = {})
11
9
  @gemfile = options[:gemfile]
12
10
  @env = options.fetch(:env, {})
13
11
  @command = command_starting_with_bundle(command)
14
- @original_env = {}
15
12
  end
16
13
 
17
14
  def run
18
- with_clean_env { ensure_bundler_is_available }
19
- announce
15
+ run_env = test_environment.merge(env)
16
+
17
+ Bundler.with_original_env do
18
+ ensure_bundler_is_available
19
+ announce
20
20
 
21
- with_clean_env do
22
- env.each_pair do |key, value|
21
+ ENV["BUNDLE_GEMFILE"] = gemfile
22
+ ENV["APPRAISAL_INITIALIZED"] = "1"
23
+ run_env.each_pair do |key, value|
23
24
  ENV[key] = value
24
25
  end
25
26
 
@@ -31,15 +32,6 @@ module Appraisal
31
32
 
32
33
  private
33
34
 
34
- def with_clean_env
35
- unset_bundler_env_vars
36
- ENV['BUNDLE_GEMFILE'] = gemfile
37
- ENV['APPRAISAL_INITIALIZED'] = '1'
38
- yield
39
- ensure
40
- restore_env
41
- end
42
-
43
35
  def ensure_bundler_is_available
44
36
  version = Utils.bundler_version
45
37
  unless system %(gem list --silent -i bundler -v #{version})
@@ -66,17 +58,6 @@ module Appraisal
66
58
  end
67
59
  end
68
60
 
69
- def unset_bundler_env_vars
70
- BUNDLER_ENV_VARS.each do |key|
71
- original_env[key] = ENV[key]
72
- ENV[key] = nil
73
- end
74
- end
75
-
76
- def restore_env
77
- original_env.each { |key, value| ENV[key] = value }
78
- end
79
-
80
61
  def command_starts_with_bundle?(original_command)
81
62
  if original_command.is_a?(Array)
82
63
  original_command.first =~ /^bundle/
@@ -100,5 +81,14 @@ module Appraisal
100
81
  command
101
82
  end
102
83
  end
84
+
85
+ def test_environment
86
+ return {} unless ENV["APPRAISAL_UNDER_TEST"] == "1"
87
+
88
+ {
89
+ "GEM_HOME" => ENV["GEM_HOME"],
90
+ "GEM_PATH" => "",
91
+ }
92
+ end
103
93
  end
104
94
  end
@@ -0,0 +1,20 @@
1
+ require "appraisal/bundler_dsl"
2
+ require "appraisal/utils"
3
+
4
+ module Appraisal
5
+ class Conditional < BundlerDSL
6
+ def initialize(condition)
7
+ super()
8
+ @condition = condition
9
+ end
10
+
11
+ def to_s
12
+ "install_if #{@condition} do\n#{indent(super)}\nend"
13
+ end
14
+
15
+ # :nodoc:
16
+ def for_dup
17
+ "install_if #{@condition} do\n#{indent(super)}\nend"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ module Appraisal
2
+ class Customize
3
+ def initialize(heading: nil, single_quotes: false)
4
+ @@heading = heading
5
+ @@single_quotes = single_quotes
6
+ end
7
+
8
+ def self.heading
9
+ @@heading ||= nil
10
+ end
11
+
12
+ def self.single_quotes
13
+ @@single_quotes ||= false
14
+ end
15
+ end
16
+ end
@@ -7,23 +7,22 @@ module Appraisal
7
7
  autoload :Path, "appraisal/path"
8
8
  autoload :Platform, "appraisal/platform"
9
9
  autoload :Source, "appraisal/source"
10
+ autoload :Conditional, "appraisal/conditional"
10
11
 
11
12
  # Load bundler Gemfiles and merge dependencies
12
13
  class Gemfile < BundlerDSL
13
14
  def load(path)
14
- if File.exist?(path)
15
- run(IO.read(path))
16
- end
15
+ run(IO.read(path), path) if File.exist?(path)
17
16
  end
18
17
 
19
- def run(definitions)
20
- instance_eval(definitions, __FILE__, __LINE__) if definitions
18
+ def run(definitions, path, line = 1)
19
+ instance_eval(definitions, path, line) if definitions
21
20
  end
22
21
 
23
22
  def dup
24
23
  Gemfile.new.tap do |gemfile|
25
24
  gemfile.git_sources = @git_sources
26
- gemfile.run(for_dup)
25
+ gemfile.run(for_dup, __FILE__, __LINE__)
27
26
  end
28
27
  end
29
28
  end
@@ -1,3 +1,3 @@
1
1
  module Appraisal
2
- VERSION = "2.4.1".freeze
2
+ VERSION = "2.5.0".freeze
3
3
  end
@@ -3,7 +3,7 @@ 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
6
- sausage pancake rotten_egg)
6
+ sausage pancake rotten_egg mayonnaise)
7
7
  build_git_gems %w(egg croissant pain_au_chocolat omelette)
8
8
 
9
9
  build_gemfile <<-Gemfile
@@ -40,6 +40,10 @@ describe 'Appraisals file Bundler DSL compatibility' do
40
40
  gem "sausage"
41
41
  end
42
42
 
43
+ install_if '"-> { true }"' do
44
+ gem 'mayonnaise'
45
+ end
46
+
43
47
  gem 'appraisal', :path => #{PROJECT_ROOT.inspect}
44
48
  Gemfile
45
49
 
@@ -76,6 +80,10 @@ describe 'Appraisals file Bundler DSL compatibility' do
76
80
  gem "pancake"
77
81
  end
78
82
 
83
+ install_if "-> { true }" do
84
+ gem 'ketchup'
85
+ end
86
+
79
87
  gemspec
80
88
  gemspec :path => "sitepress"
81
89
  end
@@ -132,6 +140,11 @@ describe 'Appraisals file Bundler DSL compatibility' do
132
140
  gem "pancake"
133
141
  end
134
142
 
143
+ install_if -> { true } do
144
+ gem "mayonnaise"
145
+ gem "ketchup"
146
+ end
147
+
135
148
  gemspec :path => "../"
136
149
  gemspec :path => "../sitepress"
137
150
  Gemfile
@@ -39,7 +39,9 @@ describe "Bundler without flag" do
39
39
  output = run "appraisal install --without drinks"
40
40
 
41
41
  expect(output).to include("Bundle complete")
42
- expect(output).to include("Gems in the group drinks were not installed.")
42
+ expect(output).to(
43
+ match(/Gems in the group ['"]?drinks['"]? were not installed/),
44
+ )
43
45
  expect(output).not_to include("orange_juice")
44
46
  expect(output).not_to include("coffee")
45
47
  expect(output).not_to include("soda")
@@ -40,6 +40,26 @@ describe 'CLI', 'appraisal install' do
40
40
  not_to include(current_directory)
41
41
  end
42
42
 
43
+ it "does not relativize directory of uris in gemfile.lock" do
44
+ build_gemspec
45
+ add_gemspec_to_gemfile
46
+
47
+ build_git_gem("uri_dummy")
48
+ uri_dummy_path = "#{current_directory}/uri_dummy"
49
+ FileUtils.symlink(File.absolute_path("tmp/gems/uri_dummy"), uri_dummy_path)
50
+
51
+ build_appraisal_file <<-APPRAISAL
52
+ appraise '1.0.0' do
53
+ gem 'uri_dummy', git: 'file://#{uri_dummy_path}'
54
+ end
55
+ APPRAISAL
56
+
57
+ run "appraisal install"
58
+
59
+ expect(content_of("gemfiles/1.0.0.gemfile.lock")).
60
+ to include("file://#{uri_dummy_path}")
61
+ end
62
+
43
63
  context 'with job size', :parallel => true do
44
64
  before do
45
65
  build_appraisal_file <<-Appraisal
@@ -111,6 +111,8 @@ describe 'Gemfile DSL compatibility' do
111
111
  build_gem "bacon", "1.2.0"
112
112
 
113
113
  build_gemfile <<-Gemfile
114
+ source "https://rubygems.org"
115
+
114
116
  gem "appraisal", :path => #{PROJECT_ROOT.inspect}
115
117
  gem "bacon", "1.2.0"
116
118
  Gemfile
@@ -142,6 +144,8 @@ describe 'Gemfile DSL compatibility' do
142
144
  build_gemspec
143
145
 
144
146
  build_gemfile <<-Gemfile
147
+ source "https://rubygems.org"
148
+
145
149
  gem "appraisal", :path => #{PROJECT_ROOT.inspect}
146
150
 
147
151
  group :plugin do
@@ -161,6 +165,8 @@ describe 'Gemfile DSL compatibility' do
161
165
  expect(content_of "gemfiles/1.0.0.gemfile").to eq <<-gemfile.strip_heredoc
162
166
  # This file was generated by Appraisal
163
167
 
168
+ source "https://rubygems.org"
169
+
164
170
  gem "appraisal", :path => #{PROJECT_ROOT.inspect}
165
171
  gem "bacon", "1.0.0"
166
172
 
@@ -10,6 +10,8 @@ describe 'Gemspec' do
10
10
  build_gemspec
11
11
 
12
12
  write_file 'Gemfile', <<-Gemfile
13
+ source "https://rubygems.org"
14
+
13
15
  gem 'appraisal', :path => #{PROJECT_ROOT.inspect}
14
16
 
15
17
  gemspec
@@ -26,6 +28,8 @@ describe 'Gemspec' do
26
28
  build_gemspec 'specdir'
27
29
 
28
30
  write_file 'Gemfile', <<-Gemfile
31
+ source "https://rubygems.org"
32
+
29
33
  gem 'appraisal', :path => #{PROJECT_ROOT.inspect}
30
34
 
31
35
  gemspec :path => './specdir'
@@ -28,6 +28,63 @@ describe Appraisal::Appraisal do
28
28
  expect(output_file.read).to match(/[^\n]*\n\z/m)
29
29
  end
30
30
 
31
+ context "gemfile customization" do
32
+ it "generates a gemfile with a custom heading" do
33
+ heading = "This file was generated with a custom heading!"
34
+ Appraisal::Customize.new(heading: heading)
35
+ output_file = Tempfile.new("gemfile")
36
+ appraisal = Appraisal::Appraisal.new("custom", "Gemfile")
37
+ allow(appraisal).to receive(:gemfile_path).and_return(output_file.path)
38
+
39
+ appraisal.write_gemfile
40
+
41
+ expected_output = "# #{heading}"
42
+ expect(output_file.read).to start_with(expected_output)
43
+ end
44
+
45
+ it "generates a gemfile with multiple lines of custom heading" do
46
+ heading = <<~HEADING
47
+ frozen_string_literal: true\n
48
+ This file was generated with a custom heading!
49
+ HEADING
50
+ Appraisal::Customize.new(heading: heading)
51
+ output_file = Tempfile.new("gemfile")
52
+ appraisal = Appraisal::Appraisal.new("custom", "Gemfile")
53
+ allow(appraisal).to receive(:gemfile_path).and_return(output_file.path)
54
+
55
+ appraisal.write_gemfile
56
+
57
+ expected_output = <<~HEADING
58
+ # frozen_string_literal: true\n
59
+ # This file was generated with a custom heading!
60
+ HEADING
61
+ expect(output_file.read).to start_with(expected_output)
62
+ end
63
+
64
+ it "generates a gemfile with single quotes rather than doubles" do
65
+ Appraisal::Customize.new(single_quotes: true)
66
+ output_file = Tempfile.new("gemfile")
67
+ appraisal = Appraisal::Appraisal.new("quotes", 'gem "foo"')
68
+ allow(appraisal).to receive(:gemfile_path).and_return(output_file.path)
69
+
70
+ appraisal.write_gemfile
71
+
72
+ expect(output_file.read).to match(/gem 'foo'/)
73
+ end
74
+
75
+ it "does not customize anything by default" do
76
+ Appraisal::Customize.new
77
+ output_file = Tempfile.new("gemfile")
78
+ appraisal = Appraisal::Appraisal.new("fake", 'gem "foo"')
79
+ allow(appraisal).to receive(:gemfile_path).and_return(output_file.path)
80
+
81
+ appraisal.write_gemfile
82
+
83
+ expected_file = %(# This file was generated by Appraisal\n\ngem "foo"\n)
84
+ expect(output_file.read).to eq(expected_file)
85
+ end
86
+ end
87
+
31
88
  context 'parallel installation' do
32
89
  include StreamHelpers
33
90
 
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+ require "appraisal/customize"
3
+
4
+ describe Appraisal::Customize do
5
+ it "has defaults" do
6
+ expect(described_class.heading).to eq nil
7
+ expect(described_class.single_quotes).to eq false
8
+ expect { described_class.new }.to_not(change do
9
+ [described_class.heading, described_class.single_quotes]
10
+ end)
11
+ end
12
+
13
+ it "can override defaults" do
14
+ described_class.new(single_quotes: true, heading: "foo")
15
+ expect(described_class.heading).to eq "foo"
16
+ expect(described_class.single_quotes).to eq true
17
+ end
18
+ end
@@ -430,4 +430,13 @@ describe Appraisal::Gemfile do
430
430
  expect(gemfile.to_s).to eq %(gem "bacon", git: "../path/bacon_pancake")
431
431
  end
432
432
  end
433
+
434
+ it "preserves the Gemfile's __FILE__" do
435
+ gemfile = Appraisal::Gemfile.new
436
+ Tempfile.open do |tmpfile|
437
+ tmpfile.write "__FILE__"
438
+ tmpfile.rewind
439
+ expect(gemfile.load(tmpfile.path)).to include(File.dirname(tmpfile.path))
440
+ end
441
+ end
433
442
  end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,7 @@ require "./spec/support/stream_helpers"
5
5
 
6
6
  PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')).freeze
7
7
  TMP_GEM_ROOT = File.join(PROJECT_ROOT, "tmp", "gems")
8
+ ENV["APPRAISAL_UNDER_TEST"] = "1"
8
9
 
9
10
  RSpec.configure do |config|
10
11
  config.raise_errors_for_deprecations!
@@ -141,7 +141,8 @@ module AcceptanceTestHelpers
141
141
  gem 'appraisal', :path => '#{PROJECT_ROOT}'
142
142
  Gemfile
143
143
 
144
- run "bundle install --binstubs --local"
144
+ run "bundle install --local"
145
+ run "bundle binstubs --all"
145
146
  end
146
147
 
147
148
  def in_test_directory(&block)
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.1
4
+ version: 2.5.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: 2021-07-28 00:00:00.000000000 Z
12
+ date: 2023-07-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -93,7 +93,6 @@ extra_rdoc_files: []
93
93
  files:
94
94
  - ".gitignore"
95
95
  - ".rspec"
96
- - ".travis.yml"
97
96
  - CONTRIBUTING.md
98
97
  - Gemfile
99
98
  - MIT-LICENSE
@@ -107,6 +106,8 @@ files:
107
106
  - lib/appraisal/bundler_dsl.rb
108
107
  - lib/appraisal/cli.rb
109
108
  - lib/appraisal/command.rb
109
+ - lib/appraisal/conditional.rb
110
+ - lib/appraisal/customize.rb
110
111
  - lib/appraisal/dependency.rb
111
112
  - lib/appraisal/dependency_list.rb
112
113
  - lib/appraisal/errors.rb
@@ -118,7 +119,6 @@ files:
118
119
  - lib/appraisal/platform.rb
119
120
  - lib/appraisal/source.rb
120
121
  - lib/appraisal/task.rb
121
- - lib/appraisal/travis_ci_helper.rb
122
122
  - lib/appraisal/utils.rb
123
123
  - lib/appraisal/version.rb
124
124
  - spec/acceptance/appraisals_file_bundler_dsl_compatibility_spec.rb
@@ -135,9 +135,9 @@ files:
135
135
  - spec/acceptance/cli/with_no_arguments_spec.rb
136
136
  - spec/acceptance/gemfile_dsl_compatibility_spec.rb
137
137
  - spec/acceptance/gemspec_spec.rb
138
- - spec/acceptance/travis_ci_integration_spec.rb
139
138
  - spec/appraisal/appraisal_file_spec.rb
140
139
  - spec/appraisal/appraisal_spec.rb
140
+ - spec/appraisal/customize_spec.rb
141
141
  - spec/appraisal/dependency_list_spec.rb
142
142
  - spec/appraisal/gemfile_spec.rb
143
143
  - spec/appraisal/utils_spec.rb
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
164
  - !ruby/object:Gem::Version
165
165
  version: '0'
166
166
  requirements: []
167
- rubygems_version: 3.2.3
167
+ rubygems_version: 3.2.22
168
168
  signing_key:
169
169
  specification_version: 4
170
170
  summary: Find out what your Ruby gems are worth
@@ -183,9 +183,9 @@ test_files:
183
183
  - spec/acceptance/cli/with_no_arguments_spec.rb
184
184
  - spec/acceptance/gemfile_dsl_compatibility_spec.rb
185
185
  - spec/acceptance/gemspec_spec.rb
186
- - spec/acceptance/travis_ci_integration_spec.rb
187
186
  - spec/appraisal/appraisal_file_spec.rb
188
187
  - spec/appraisal/appraisal_spec.rb
188
+ - spec/appraisal/customize_spec.rb
189
189
  - spec/appraisal/dependency_list_spec.rb
190
190
  - spec/appraisal/gemfile_spec.rb
191
191
  - spec/appraisal/utils_spec.rb
data/.travis.yml DELETED
@@ -1,18 +0,0 @@
1
- ---
2
- before_install: gem install bundler:2.1.4
3
-
4
- rvm:
5
- - 2.3
6
- - 2.4
7
- - 2.5
8
- - 2.6
9
- - 2.7
10
- - jruby-9.2.9.0
11
- - ruby-head
12
- - jruby-head
13
-
14
- matrix:
15
- fast_finish: true
16
- allow_failures:
17
- - rvm: ruby-head
18
- - rvm: jruby-head
@@ -1,69 +0,0 @@
1
- require "appraisal/appraisal_file"
2
- require "yaml"
3
-
4
- module Appraisal
5
- class TravisCIHelper
6
- NO_CONFIGURATION_WARNING = <<-WARNING.strip.gsub(/\s+/, " ")
7
- Note: Run `appraisal generate --travis` to generate Travis CI
8
- configuration.
9
- WARNING
10
-
11
- INVALID_CONFIGURATION_WARNING = <<-WARNING.strip.gsub(/\s+/, " ")
12
- Warning: Your gemfiles directive in .travis.yml is incorrect. Run
13
- `appraisal generate --travis` to get the correct configuration.
14
- WARNING
15
-
16
- # @see http://docs.travis-ci.com/user/languages/ruby/
17
- GEMFILES_CONFIGURATION_KEY = "gemfile".freeze
18
-
19
- def self.display_instruction
20
- puts "# Put this in your .travis.yml"
21
- puts "#{GEMFILES_CONFIGURATION_KEY}:"
22
-
23
- AppraisalFile.each do |appraisal|
24
- puts " - #{appraisal.relative_gemfile_path}"
25
- end
26
- end
27
-
28
- def self.validate_configuration_file
29
- ConfigurationValidator.new.validate
30
- end
31
-
32
- class ConfigurationValidator
33
- CONFIGURATION_FILE = ".travis.yml"
34
-
35
- def validate
36
- if has_configuration_file?
37
- if has_no_gemfiles_configuration?
38
- $stderr.puts(NO_CONFIGURATION_WARNING)
39
- elsif has_invalid_gemfiles_configuration?
40
- $stderr.puts(INVALID_CONFIGURATION_WARNING)
41
- end
42
- end
43
- end
44
-
45
- private
46
-
47
- def has_configuration_file?
48
- File.exist?(CONFIGURATION_FILE)
49
- end
50
-
51
- def has_no_gemfiles_configuration?
52
- !(configuration && configuration.has_key?(GEMFILES_CONFIGURATION_KEY))
53
- end
54
-
55
- def has_invalid_gemfiles_configuration?
56
- if configuration && configuration[GEMFILES_CONFIGURATION_KEY]
57
- appraisal_paths =
58
- AppraisalFile.new.appraisals.map(&:relative_gemfile_path).sort
59
- travis_gemfile_paths = configuration[GEMFILES_CONFIGURATION_KEY].sort
60
- appraisal_paths != travis_gemfile_paths
61
- end
62
- end
63
-
64
- def configuration
65
- YAML.load_file(CONFIGURATION_FILE) rescue nil
66
- end
67
- end
68
- end
69
- end
@@ -1,94 +0,0 @@
1
- require "spec_helper"
2
- require "active_support/core_ext/kernel/reporting"
3
- require "appraisal/travis_ci_helper"
4
-
5
- describe "Travis CI integration" do
6
- before do
7
- build_appraisal_file <<-Appraisals.strip_heredoc
8
- appraise "1.0.0" do
9
- gem "dummy", "1.0.0"
10
- end
11
-
12
- appraise "1.1.0" do
13
- gem "dummy", "1.1.0"
14
- end
15
- Appraisals
16
- end
17
-
18
- context "when user runs `appraisal generate --travis`" do
19
- it "displays a correct Gemfile directive" do
20
- output = run("appraisal generate --travis")
21
-
22
- expect(output).to include <<-stdout.strip_heredoc
23
- # Put this in your .travis.yml
24
- gemfile:
25
- - gemfiles/1.0.0.gemfile
26
- - gemfiles/1.1.0.gemfile
27
- stdout
28
- end
29
- end
30
-
31
- context "When user has .travis.yml" do
32
- context "with no gemfiles directive" do
33
- before do
34
- write_file ".travis.yml", ""
35
- end
36
-
37
- it "displays a warning message when run `appraisal generate`" do
38
- warning = run "appraisal generate 2>&1"
39
-
40
- expect(warning).to include no_configuration_warning
41
- end
42
- end
43
-
44
- context "with incorrect gemfiles directive" do
45
- before do
46
- write_file ".travis.yml", <<-travis_yml
47
- gemfile:
48
- - gemfiles/1.0.0.gemfile
49
- - gemfiles/1.0.1.gemfile
50
- travis_yml
51
- end
52
-
53
- it "displays a warning message when run `appraisal generate`" do
54
- warning = run "appraisal generate 2>&1"
55
-
56
- expect(warning).to include invalid_configuration_warning
57
- end
58
- end
59
-
60
- context "with correct gemfiles directive" do
61
- before do
62
- write_file ".travis.yml", <<-travis_yml
63
- gemfile:
64
- - gemfiles/1.0.0.gemfile
65
- - gemfiles/1.1.0.gemfile
66
- travis_yml
67
- end
68
-
69
- it "does not display any warning when run `appraisal generate`" do
70
- warning = run "appraisal generate 2>&1"
71
-
72
- expect(warning).not_to include no_configuration_warning
73
- expect(warning).not_to include invalid_configuration_warning
74
- end
75
- end
76
- end
77
-
78
- context "when user does not have .travis.yml" do
79
- it "does not display any warning when run `appraisal generate`" do
80
- warning = run "appraisal generate 2>&1"
81
-
82
- expect(warning).not_to include no_configuration_warning
83
- expect(warning).not_to include invalid_configuration_warning
84
- end
85
- end
86
-
87
- def no_configuration_warning
88
- Appraisal::TravisCIHelper::NO_CONFIGURATION_WARNING
89
- end
90
-
91
- def invalid_configuration_warning
92
- Appraisal::TravisCIHelper::INVALID_CONFIGURATION_WARNING
93
- end
94
- end