bundler_ext 0.3.2 → 0.4.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.
@@ -0,0 +1,191 @@
1
+ require 'spec_helper'
2
+ require 'bundler_ext/gemfile'
3
+
4
+ module BundlerExt
5
+ describe Gemfile do
6
+ describe "#setup_env" do
7
+ around(:each) do |spec|
8
+ orig = ENV['BUNDLE_GEMFILE']
9
+ spec.run
10
+ ENV['BUNDLE_GEMFILE'] = orig
11
+ end
12
+
13
+ it "sets BUNDLE_GEMFILE env varialbe" do
14
+ described_class.setup_env('Gemfile.custom')
15
+ ENV['BUNDLE_GEMFILE'].should == 'Gemfile.custom'
16
+ end
17
+ end
18
+
19
+ describe "#parse_env" do
20
+ around(:each) do |spec|
21
+ beg1 = ENV['BUNDLER_EXT_GROUPS']
22
+ beg2 = ENV['BEXT_GROUPS']
23
+ spec.run
24
+ ENV['BUNDLER_EXT_GROUPS'] = beg1
25
+ ENV['BEXT_GROUPS'] = beg2
26
+ end
27
+
28
+ it "converts specified groups to symbols" do
29
+ described_class.parse_env(['development', 'test'])[:groups].should == [:development, :test]
30
+ end
31
+
32
+ it "retrieves extra groups from BUNDLER_EXT_GROUPS env variable" do
33
+ ENV['BUNDLER_EXT_GROUPS'] = 'development test'
34
+ env = described_class.parse_env([])
35
+ env[:groups].should == [:development, :test]
36
+ env[:extra_groups].should == 'development test'
37
+ end
38
+
39
+ it "retrieves extra groups from BEXT_GROUPS env variable" do
40
+ ENV['BEXT_GROUPS'] = 'development test'
41
+ env = described_class.parse_env([])
42
+ env[:groups].should == [:development, :test]
43
+ env[:extra_groups].should == 'development test'
44
+ end
45
+
46
+ context "groups == [:all] and no extra groups specified" do
47
+ it "sets all_groups true" do
48
+ described_class.parse_env([:all])[:all_groups].should be_true
49
+ end
50
+ end
51
+
52
+ context "groups != [:all]" do
53
+ it "sets all_groups false" do
54
+ described_class.parse_env([:dev])[:all_groups].should be_false
55
+ end
56
+ end
57
+
58
+ context "extra groups specified" do
59
+ it "sets all_groups false" do
60
+ ENV['BEXT_GROUPS'] = 'development'
61
+ described_class.parse_env([:all])[:all_groups].should be_false
62
+ end
63
+ end
64
+ end
65
+
66
+ describe "#dependency_in_env?" do
67
+ before(:each) do
68
+ @dep = Bundler::Dependency.new 'rake', '1.0.0', 'group' => [:test]
69
+ @env = {:groups => []}
70
+ end
71
+
72
+ context "dep.current_platform? is false" do
73
+ it "returns false" do
74
+ @env[:all_groups] = true
75
+ @dep.should_receive(:current_platform?).and_return(false)
76
+ described_class.dependency_in_env?(@dep, @env).should be_false
77
+ end
78
+ end
79
+
80
+ context ":all_groups is false and depenency _not_ in env groups" do
81
+ it "returns false" do
82
+ @env[:all_groups] = false
83
+ @env[:groups] << :dev
84
+ described_class.dependency_in_env?(@dep, @env).should be_false
85
+ end
86
+ end
87
+
88
+ context ":all_groups and dep.current_platform? are true" do
89
+ it "returns true" do
90
+ @env[:all_groups] = true
91
+ @dep.should_receive(:current_platform?).and_return(true)
92
+ described_class.dependency_in_env?(@dep, @env).should be_true
93
+ end
94
+ end
95
+
96
+ context "dep is in a group and dep.current_platform? is true" do
97
+ it "returns true" do
98
+ @env[:groups] << :dev
99
+ @dep.groups << :dev
100
+ @dep.should_receive(:current_platform?).and_return(true)
101
+ described_class.dependency_in_env?(@dep, @env).should be_true
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "#files_for_dependency" do
107
+ context "dependency in env" do
108
+ it "returns dependency autorequires" do
109
+ dep = Bundler::Dependency.new 'rake', '1.0.0', 'require' => [:foo]
110
+ described_class.should_receive(:dependency_in_env?).and_return(true)
111
+ described_class.files_for_dependency(dep, {}).should == [:foo]
112
+ end
113
+
114
+ context "autorequires is nil" do
115
+ it("returns depenency name") do
116
+ dep = Bundler::Dependency.new 'rake', '1.0.0'
117
+ described_class.should_receive(:dependency_in_env?).and_return(true)
118
+ described_class.files_for_dependency(dep, {}).should == ['rake']
119
+ end
120
+ end
121
+ end
122
+
123
+ context "dependency not in env" do
124
+ it "returns empty array" do
125
+ dep = Bundler::Dependency.new 'rake', '1.0.0'
126
+ described_class.should_receive(:dependency_in_env?).and_return(false)
127
+ described_class.files_for_dependency(dep, {}).should == []
128
+ end
129
+ end
130
+ end
131
+
132
+ describe "#process" do
133
+ before(:each) do
134
+ ENV['BUNDLE_GEMFILE'] = 'spec/fixtures/Gemfile.in'
135
+ @dep = Bundler::Dependency.new 'rake', '1.0.0'
136
+ @gemfile = Bundler::Dsl.evaluate 'spec/fixtures/Gemfile.in', nil, true
137
+ @gemfile.should_receive(:dependencies).and_return([@dep])
138
+ end
139
+
140
+ after(:each) do
141
+ ENV.delete('BUNDLE_GEMFILE')
142
+ end
143
+
144
+ it "returns gemfile dependencies with files" do
145
+ described_class.should_receive(:files_for_dependency).and_return([:files])
146
+ described_class.process(@gemfile, {}).should ==
147
+ {'rake' => {:dep => @dep, :files => [:files]}}
148
+ end
149
+
150
+ it "does not return gemfile dependencies without files" do
151
+ described_class.should_receive(:files_for_dependency).and_return([])
152
+ described_class.process(@gemfile, {}).should == {}
153
+ end
154
+ end
155
+
156
+ describe "#parse" do
157
+ before(:each) do
158
+ @gemfile = 'spec/fixtures/Gemfile.in'
159
+ ENV['BUNDLE_GEMFILE'] = @gemfile
160
+ end
161
+
162
+ after(:each) do
163
+ ENV.delete('BUNDLE_GEMFILE')
164
+ end
165
+
166
+ it "sets up env for gemfile" do
167
+ described_class.should_receive(:setup_env).with(@gemfile)
168
+ described_class.parse(@gemfile)
169
+ end
170
+
171
+ it "retrieves env configured by gemfile" do
172
+ described_class.should_receive(:parse_env).with([:test]).and_call_original
173
+ described_class.parse(@gemfile, :test)
174
+ end
175
+
176
+ it "evaluates gemfile with bundler dsl" do
177
+ Bundler::Dsl.should_receive(:evaluate).with(@gemfile, nil, true).and_call_original
178
+ described_class.parse(@gemfile, :test)
179
+ end
180
+
181
+ it "processes gemfile / returns results" do
182
+ env = Object.new
183
+ gemfile = Object.new
184
+ described_class.should_receive(:parse_env).and_return(env)
185
+ Bundler::Dsl.should_receive(:evaluate).and_return(gemfile)
186
+ described_class.should_receive(:process).with(gemfile, env)
187
+ described_class.parse(@gemfile, :test)
188
+ end
189
+ end
190
+ end # describe Gemfile
191
+ end # module BundlerExt
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+
3
+ # skip system specs unless we can load linux_admin
4
+ skip_system = false
5
+ begin
6
+ require 'linux_admin'
7
+ rescue LoadError
8
+ skip_system = true
9
+ end
10
+
11
+ describe BundlerExt do
12
+ before(:each) do
13
+ @gemfile = 'spec/fixtures/Gemfile.in'
14
+ end
15
+ after(:each) do
16
+ ENV['BUNDLER_PKG_PREFIX'] = nil
17
+ ENV['BEXT_ACTIVATE_VERSIONS'] = nil
18
+ ENV['BEXT_PKG_PREFIX'] = nil
19
+ ENV['BEXT_NOSTRICT'] = nil
20
+ ENV['BEXT_GROUPS'] = nil
21
+ end
22
+
23
+ describe "#parse_from_gemfile" do
24
+ describe "with no group passed in" do
25
+ it "should return nothing to require" do
26
+ libs = BundlerExt::Gemfile.parse(@gemfile)
27
+ libs.should be_an(Hash)
28
+ libs.keys.should_not include('deltacloud-client')
29
+ libs.keys.should_not include('vcr')
30
+ end
31
+ end
32
+ describe "with :all passed in" do
33
+ it "should return the list of system libraries in all groups to require" do
34
+ libs = BundlerExt::Gemfile.parse(@gemfile, :all)
35
+ libs.should be_an(Hash)
36
+ libs.keys.should include('deltacloud-client')
37
+ libs['deltacloud-client'][:files].should == ['deltacloud']
38
+ libs.keys.should include('vcr')
39
+ end
40
+ end
41
+ describe "with group passed in" do
42
+ it "should not return any deps that are not in the 'development' group" do
43
+ libs = BundlerExt::Gemfile.parse(@gemfile,'development')
44
+ libs.should be_an(Hash)
45
+ libs.keys.should_not include('deltacloud-client')
46
+ end
47
+ it "should return only deps that are in the :test group" do
48
+ libs = BundlerExt::Gemfile.parse(@gemfile, :test)
49
+ libs.should be_an(Hash)
50
+ libs.keys.should_not include('deltacloud-client')
51
+ libs.keys.should include('vcr')
52
+ end
53
+ it "should return deps from both the :default and :test groups" do
54
+ libs = BundlerExt::Gemfile.parse(@gemfile, :default, :test)
55
+ libs.should be_an(Hash)
56
+ libs.keys.should include('deltacloud-client')
57
+ libs.keys.should include('vcr')
58
+ end
59
+ end
60
+ it "should only return deps for the current platform" do
61
+ libs = BundlerExt::Gemfile.parse(@gemfile)
62
+ libs.should be_an(Hash)
63
+ if RUBY_VERSION < "1.9"
64
+ libs.keys.should_not include('cinch')
65
+ else
66
+ libs.keys.should_not include('fastercsv')
67
+ end
68
+ end
69
+ end
70
+ describe "#system_require" do
71
+ it "strict mode should fail loading non existing gem" do
72
+ expect { BundlerExt.system_require(@gemfile, :fail) }.to raise_error
73
+ end
74
+
75
+ it "non-strict mode should load the libraries in the gemfile" do
76
+ ENV['BEXT_NOSTRICT'] = 'true'
77
+ BundlerExt.system_require(@gemfile)
78
+ defined?(Gem).should be_true
79
+ end
80
+
81
+ it "non-strict mode should load the libraries in the gemfile" do
82
+ ENV['BUNDLER_EXT_NOSTRICT'] = 'true'
83
+ BundlerExt.system_require(@gemfile)
84
+ defined?(Gem).should be_true
85
+ end
86
+
87
+ it "non-strict mode should load the libraries in the gemfile" do
88
+ ENV['BEXT_NOSTRICT'] = 'true'
89
+ BundlerExt.system_require(@gemfile, :fail)
90
+ defined?(Gem).should be_true
91
+ end
92
+
93
+ it "non-strict mode should load the libraries in the gemfile" do
94
+ ENV['BUNDLER_EXT_NOSTRICT'] = 'true'
95
+ BundlerExt.system_require(@gemfile, :fail)
96
+ defined?(Gem).should be_true
97
+ end
98
+ it "non-strict mode should load the libraries using env var list" do
99
+ ENV['BEXT_GROUPS'] = 'test development blah'
100
+ ENV['BEXT_NOSTRICT'] = 'true'
101
+ BundlerExt.system_require(@gemfile)
102
+ defined?(Gem::Command).should be_true
103
+ end
104
+
105
+ it "non-strict mode should load the libraries using env var list" do
106
+ ENV['BUNLDER_EXT_GROUPS'] = 'test development blah'
107
+ ENV['BEXT_NOSTRICT'] = 'true'
108
+ BundlerExt.system_require(@gemfile)
109
+ defined?(Gem::Command).should be_true
110
+ end
111
+
112
+ unless skip_system
113
+ context "ENV['BEXT_ACTIVATE_VERSIONS'] is true" do
114
+ before(:each) do
115
+ ENV['BUNDLER_EXT_NOSTRICT'] = 'true'
116
+ ENV['BEXT_ACTIVATE_VERSIONS'] = 'true'
117
+ end
118
+
119
+ it "activates the version of the system installed package" do
120
+ gems = BundlerExt::Gemfile.parse(@gemfile, :all)
121
+ gems.each { |gem,gdep|
122
+ version = rand(100)
123
+ BundlerExt::System.should_receive(:system_name_for).with(gem).
124
+ and_return(gem)
125
+ BundlerExt::System.should_receive(:system_version_for).with(gem).
126
+ and_return(version)
127
+ BundlerExt::System.should_receive(:gem).with(gem, "=#{version}")
128
+ }
129
+ BundlerExt.system_require(@gemfile, :all)
130
+ end
131
+
132
+ context "ENV['BEXT_PKG_PREFIX'] is specified" do
133
+ it "prepends bundler pkg prefix onto system package name to load" do
134
+ ENV['BEXT_PKG_PREFIX'] = 'rubygem-'
135
+ gems = BundlerExt::Gemfile.parse(@gemfile, :all)
136
+ gems.each { |gem,gdep|
137
+ BundlerExt::System.should_receive(:system_version_for).with("rubygem-#{gem}").
138
+ and_return('0')
139
+ }
140
+ BundlerExt.system_require(@gemfile, :all)
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,178 @@
1
+ require 'spec_helper'
2
+ require 'bundler_ext/runtime'
3
+
4
+ module BundlerExt
5
+ describe Runtime do
6
+ describe "#gemfile" do
7
+ it "gets/sets bext_gemfile" do
8
+ runtime = described_class.new
9
+ runtime.gemfile('Gemfile.in').should == 'Gemfile.in'
10
+ runtime.gemfile.should == 'Gemfile.in'
11
+ end
12
+
13
+ it "defaults to Bundler.default_gemfile" do
14
+ Bundler.should_receive(:default_gemfile).and_return('DefaultGemfile')
15
+ runtime = described_class.new
16
+ runtime.gemfile.should == 'DefaultGemfile'
17
+ end
18
+ end
19
+
20
+ describe "#root" do
21
+ it "returns directory name of gemfile" do
22
+ runtime = described_class.new
23
+ runtime.gemfile(Pathname.new('spec/fixtures/Gemfile.in'))
24
+ runtime.root.to_s.should == File.expand_path('spec/fixtures')
25
+ end
26
+ end
27
+
28
+ describe "#bundler" do
29
+ it "returns handle to bundler runtime" do
30
+ runtime = described_class.new
31
+ runtime.gemfile(Pathname.new('spec/fixtures/Gemfile.in'))
32
+ bundler = runtime.bundler
33
+ bundler.should be_an_instance_of(Bundler::Runtime)
34
+ bundler.root.to_s.should == File.expand_path('spec/fixtures')
35
+ runtime.bundler.should == bundler
36
+ end
37
+ end
38
+
39
+ describe "#rubygems" do
40
+ it "returns handle to bundler rubygems integration" do
41
+ runtime = described_class.new
42
+ rubygems = runtime.rubygems
43
+ rubygems.should be_an_instance_of(Bundler::RubygemsIntegration)
44
+ runtime.rubygems.should == rubygems
45
+ end
46
+ end
47
+
48
+ describe "#setup_env" do
49
+ around(:each) do |spec|
50
+ orig = ENV
51
+ spec.run
52
+ ENV = orig
53
+ end
54
+
55
+ it "assigns env home variable to BEXT_HOME" do
56
+ ENV['BEXT_HOME'] = '/home/foo'
57
+ described_class.new.setup_env
58
+ ENV['HOME'].should == '/home/foo'
59
+ end
60
+
61
+ it "assigns env home variable to BUNDLER_EXT_HOME" do
62
+ ENV['BUNDLER_EXT_HOME'] = '/home/foo'
63
+ described_class.new.setup_env
64
+ ENV['HOME'].should == '/home/foo'
65
+ end
66
+ end
67
+
68
+ describe "::namespaced_file" do
69
+ context "file does not include '-'" do
70
+ it "returns nil" do
71
+ described_class.namespaced_file('foobar').should be_nil
72
+ end
73
+ end
74
+
75
+ context "file responds to :name" do
76
+ it "returns file name in path format" do
77
+ file = Pathname.new 'foo-bar'
78
+ file.should_receive(:name).and_return('foo-bar')
79
+ described_class.namespaced_file(file).should == 'foo/bar'
80
+ end
81
+ end
82
+
83
+ it "returns file in path format" do
84
+ described_class.namespaced_file("foo-bar").should == 'foo/bar'
85
+ end
86
+ end
87
+
88
+ describe "#system_require" do
89
+ it "requires files" do
90
+ runtime = described_class.new
91
+ runtime.should_receive(:require).with('file1')
92
+ runtime.system_require(['file1'])
93
+ end
94
+
95
+ context "LoadError when requiring file" do
96
+ it "requires namespaced file" do
97
+ described_class.should_receive(:namespaced_file).with('file1').
98
+ and_return('namespaced_file1')
99
+ runtime = described_class.new
100
+ runtime.should_receive(:require).with('file1').and_call_original
101
+ runtime.should_receive(:require).with('namespaced_file1')
102
+ runtime.system_require(['file1'])
103
+ end
104
+
105
+ context "LoadError when requiring namespaced file" do
106
+ it "outputs strict error" do
107
+ expected = 'Gem loading error: cannot load such file -- namespaced_file1'
108
+ Output.should_receive(:strict_err).with(expected)
109
+
110
+ described_class.should_receive(:namespaced_file).with('file1').
111
+ and_return('namespaced_file1')
112
+ runtime = described_class.new
113
+ runtime.should_receive(:require).with('file1').and_call_original
114
+ runtime.should_receive(:require).with('namespaced_file1').and_call_original
115
+ runtime.system_require(['file1'])
116
+ end
117
+ end
118
+
119
+ context "namespaced file is nil" do
120
+ it "outputs strict error" do
121
+ expected = 'Gem loading error: cannot load such file -- file1'
122
+ Output.should_receive(:strict_err).with(expected)
123
+
124
+ described_class.should_receive(:namespaced_file).with('file1').
125
+ and_return(nil)
126
+ runtime = described_class.new
127
+ runtime.should_receive(:require).with('file1').and_call_original
128
+ runtime.system_require(['file1'])
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ describe "clear" do
135
+ it "cleans bundler load path" do
136
+ runtime = described_class.new
137
+ runtime.bundler.should_receive(:clean_load_path)
138
+ runtime.clear
139
+ end
140
+ end
141
+
142
+ describe "add_spec" do
143
+ around(:each) do |spec|
144
+ orig = $LOAD_PATH
145
+ spec.run
146
+
147
+ # XXX need to restore this way else we'll get an err:
148
+ # "$LOAD_PATH is a read-only variable"
149
+ $LOAD_PATH.clear
150
+ orig.each { |o| $LOAD_PATH << o }
151
+ end
152
+
153
+ it "marks spec as loaded" do
154
+ spec = Gem::Specification.new
155
+ runtime = described_class.new
156
+ runtime.rubygems.should_receive(:mark_loaded).with(spec)
157
+ runtime.add_spec(spec)
158
+ end
159
+
160
+ it "adds spec load paths not already on LOAD_PATH to it" do
161
+ $LOAD_PATH.clear
162
+ spec = Gem::Specification.new :load_paths => ['foo']
163
+ runtime = described_class.new
164
+ runtime.add_spec(spec)
165
+ $LOAD_PATH.should include(*spec.load_paths)
166
+ end
167
+
168
+ it "skips paths already on the $LOAD_PATH" do
169
+ spec = Gem::Specification.new :load_paths => ['foo']
170
+ $LOAD_PATH.clear
171
+ $LOAD_PATH << spec.load_paths.first
172
+ runtime = described_class.new
173
+ runtime.add_spec(spec)
174
+ $LOAD_PATH.size.should == 1
175
+ end
176
+ end
177
+ end # describe Runtime
178
+ end # module BundlerExt