summaryrefslogtreecommitdiff
path: root/spec/bundler/runtime/gem_tasks_spec.rb
blob: 046300391b26cc7a7406efd4c5f2ef82f468ce2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# frozen_string_literal: true

RSpec.describe "require 'bundler/gem_tasks'" do
  let(:define_local_gem_using_gem_tasks) do
    bundled_app("foo.gemspec").open("w") do |f|
      f.write <<-GEMSPEC
        Gem::Specification.new do |s|
          s.name = "foo"
          s.version = "1.0"
          s.summary = "dummy"
          s.author = "Perry Mason"
        end
      GEMSPEC
    end

    bundled_app("Rakefile").open("w") do |f|
      f.write <<-RAKEFILE
        require "bundler/gem_tasks"
      RAKEFILE
    end

    install_gemfile <<-G
      source "https://gem.repo1"

      gem "rake"
    G
  end

  let(:define_local_gem_with_extensions_using_gem_tasks_and_gemspec_dsl) do
    bundled_app("foo.gemspec").open("w") do |f|
      f.write <<-GEMSPEC
        Gem::Specification.new do |s|
          s.name = "foo"
          s.version = "1.0"
          s.summary = "dummy"
          s.author = "Perry Mason"
          s.extensions = "ext/extconf.rb"
        end
      GEMSPEC
    end

    bundled_app("Rakefile").open("w") do |f|
      f.write <<-RAKEFILE
        require "bundler/gem_tasks"
      RAKEFILE
    end

    Dir.mkdir bundled_app("ext")

    bundled_app("ext/extconf.rb").open("w") do |f|
      f.write <<-EXTCONF
        require "mkmf"
        File.write("Makefile", dummy_makefile($srcdir).join)
      EXTCONF
    end

    install_gemfile <<-G
      source "https://gem.repo1"

      gemspec

      gem "rake"
    G
  end

  it "includes the relevant tasks" do
    define_local_gem_using_gem_tasks

    with_gem_path_as(base_system_gem_path.to_s) do
      sys_exec "#{rake} -T", env: { "GEM_HOME" => system_gem_path.to_s }
    end

    expect(err).to be_empty
    expected_tasks = [
      "rake build",
      "rake clean",
      "rake clobber",
      "rake install",
      "rake release[remote]",
    ]
    tasks = out.lines.to_a.map {|s| s.split("#").first.strip }
    expect(tasks & expected_tasks).to eq(expected_tasks)
  end

  it "defines a working `rake install` task", :ruby_repo do
    define_local_gem_using_gem_tasks

    with_gem_path_as(base_system_gem_path.to_s) do
      sys_exec "#{rake} install", env: { "GEM_HOME" => system_gem_path.to_s }
    end

    expect(err).to be_empty

    bundle "exec rake install"

    expect(err).to be_empty
  end

  it "defines a working `rake install` task for local gems with extensions", :ruby_repo do
    define_local_gem_with_extensions_using_gem_tasks_and_gemspec_dsl

    bundle "exec rake install"

    expect(err).to be_empty
  end

  context "rake build when path has spaces", :ruby_repo do
    before do
      define_local_gem_using_gem_tasks

      spaced_bundled_app = tmp("bundled app")
      FileUtils.cp_r bundled_app, spaced_bundled_app
      bundle "exec rake build", dir: spaced_bundled_app
    end

    it "still runs successfully" do
      expect(err).to be_empty
    end
  end

  context "rake build when path has brackets", :ruby_repo do
    before do
      define_local_gem_using_gem_tasks

      bracketed_bundled_app = tmp("bundled[app")
      FileUtils.cp_r bundled_app, bracketed_bundled_app
      bundle "exec rake build", dir: bracketed_bundled_app
    end

    it "still runs successfully" do
      expect(err).to be_empty
    end
  end

  context "bundle path configured locally" do
    before do
      define_local_gem_using_gem_tasks

      bundle "config set path vendor/bundle"
    end

    it "works", :ruby_repo do
      install_gemfile <<-G
        source "https://gem.repo1"

        gem "rake"
      G

      bundle "exec rake -T"

      expect(err).to be_empty
    end
  end

  it "adds 'pkg' to rake/clean's CLOBBER" do
    define_local_gem_using_gem_tasks

    with_gem_path_as(base_system_gem_path.to_s) do
      sys_exec %(#{rake} -e 'load "Rakefile"; puts CLOBBER.inspect'), env: { "GEM_HOME" => system_gem_path.to_s }
    end
    expect(out).to eq '["pkg"]'
  end
end