bowline-bundler 0.0.1
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.
- data/LICENSE +20 -0
- data/README.markdown +291 -0
- data/Rakefile +45 -0
- data/VERSION +1 -0
- data/bin/bowline-bundle +59 -0
- data/lib/bowline/bundler/bundle.rb +323 -0
- data/lib/bowline/bundler/cli.rb +87 -0
- data/lib/bowline/bundler/dependency.rb +62 -0
- data/lib/bowline/bundler/dsl.rb +182 -0
- data/lib/bowline/bundler/environment.rb +87 -0
- data/lib/bowline/bundler/finder.rb +51 -0
- data/lib/bowline/bundler/gem_bundle.rb +11 -0
- data/lib/bowline/bundler/gem_ext.rb +34 -0
- data/lib/bowline/bundler/remote_specification.rb +53 -0
- data/lib/bowline/bundler/resolver.rb +250 -0
- data/lib/bowline/bundler/runtime.rb +2 -0
- data/lib/bowline/bundler/source.rb +361 -0
- data/lib/bowline/bundler/templates/app_script.erb +3 -0
- data/lib/bowline/bundler/templates/environment.erb +156 -0
- data/lib/bowline/bundler/templates/environment_picker.erb +4 -0
- data/lib/bowline/bundler.rb +35 -0
- data/spec/bundler/cli_spec.rb +558 -0
- data/spec/bundler/directory_spec.rb +255 -0
- data/spec/bundler/dsl_spec.rb +126 -0
- data/spec/bundler/fetcher_spec.rb +138 -0
- data/spec/bundler/git_spec.rb +266 -0
- data/spec/bundler/installer_spec.rb +155 -0
- data/spec/bundler/manifest_file_spec.rb +105 -0
- data/spec/bundler/manifest_spec.rb +257 -0
- data/spec/bundler/runtime_spec.rb +141 -0
- data/spec/bundler/system_gems_spec.rb +42 -0
- data/spec/quality_spec.rb +57 -0
- data/spec/resolver/engine_spec.rb +112 -0
- data/spec/resolver/error_spec.rb +50 -0
- data/spec/resolver/fake_source_index_spec.rb +43 -0
- data/spec/resolver/prerelease_spec.rb +113 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/builders.rb +257 -0
- data/spec/support/core_ext.rb +18 -0
- data/spec/support/helpers.rb +126 -0
- data/spec/support/matchers.rb +201 -0
- data/spec/support/path_utils.rb +63 -0
- metadata +126 -0
@@ -0,0 +1,201 @@
|
|
1
|
+
module Spec
|
2
|
+
module Matchers
|
3
|
+
def change
|
4
|
+
simple_matcher("should change") do |given, matcher|
|
5
|
+
matcher.failure_message = "Expected the block to change, but it didn't"
|
6
|
+
matcher.negative_failure_message = "Expected the block not to change, but it did"
|
7
|
+
retval = yield
|
8
|
+
given.call
|
9
|
+
retval != yield
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def be_cached_at(dir)
|
14
|
+
simple_matcher("the bundle should be cached") do |given|
|
15
|
+
given.each do |spec|
|
16
|
+
Dir[File.join(dir, 'cache', "#{spec.name}*.gem")].should have(1).item
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def only_have_specs(*names)
|
22
|
+
simple_matcher("only have spec") do |given, matcher|
|
23
|
+
given_names = given.map{ |s| s.full_name }
|
24
|
+
matcher.failure_message = "expected specs to only contain #{names.inspect} but got: #{given_names.inspect}"
|
25
|
+
names.sort == given_names.sort
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
alias only_have_spec only_have_specs
|
30
|
+
|
31
|
+
def have_load_paths(root, gem_load_paths)
|
32
|
+
flattened_paths = []
|
33
|
+
|
34
|
+
if gem_load_paths.is_a?(Hash)
|
35
|
+
gem_load_paths.each do |gem_name, paths|
|
36
|
+
paths.each { |path| flattened_paths << File.join(root, "gems", gem_name, path) }
|
37
|
+
end
|
38
|
+
else
|
39
|
+
gem_load_paths.each do |path|
|
40
|
+
flattened_paths << File.join(root, path)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
simple_matcher("have load paths") do |given, matcher|
|
45
|
+
actual = run_in_context("puts $:").split("\n")
|
46
|
+
|
47
|
+
flattened_paths.all? do |path|
|
48
|
+
matcher.failure_message = "expected environment load paths to contain '#{path}', but it was:\n #{actual.join("\n ")}"
|
49
|
+
actual.include?(path)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
alias have_load_path have_load_paths
|
55
|
+
|
56
|
+
def include_cached_gems(*gems)
|
57
|
+
simple_matcher("include cached gems") do |given, matcher|
|
58
|
+
matcher.negative_failure_message = "Gems #{gems.join(", ")} were all cached"
|
59
|
+
missing = []
|
60
|
+
gems.each do |name|
|
61
|
+
missing << name unless given.join("cache", "#{name}.gem").file?
|
62
|
+
end
|
63
|
+
cached = Dir["#{given}/cache/*.gem"].map { |name| " #{File.basename(name, '.gem')}" }.join("\n")
|
64
|
+
matcher.failure_message = "Gems #{missing.join(', ')} were not cached\n Cached:\n#{cached}"
|
65
|
+
missing.empty?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
alias include_cached_gem include_cached_gems
|
70
|
+
|
71
|
+
def include_installed_gems(*gems)
|
72
|
+
simple_matcher("include installed gems") do |given, matcher|
|
73
|
+
matcher.negative_failure_message = "Gems #{gems.join(", ")} were all installed"
|
74
|
+
missing = []
|
75
|
+
gems.each do |name|
|
76
|
+
unless given.join("specifications", "#{name}.gemspec").file? && given.join("gems", name).directory?
|
77
|
+
missing << name
|
78
|
+
end
|
79
|
+
end
|
80
|
+
matcher.failure_message = "Gems #{missing.join(', ')} were not installed"
|
81
|
+
missing.empty?
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
alias include_installed_gem include_installed_gems
|
86
|
+
|
87
|
+
def include_vendored_dirs(*dirs)
|
88
|
+
simple_matcher("include vendored dirs") do |given, matcher|
|
89
|
+
matcher.negative_failure_message = "Dirs #{dirs.join(", ")} were all vendored"
|
90
|
+
missing = []
|
91
|
+
dirs.each do |name|
|
92
|
+
missing << name unless given.join("dirs", name).directory?
|
93
|
+
end
|
94
|
+
matcher.failure_message = "Dirs #{missing.join(', ')} were not vendored"
|
95
|
+
missing.empty?
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
alias include_vendored_dir include_vendored_dirs
|
100
|
+
|
101
|
+
def have_cached_gems(*gems)
|
102
|
+
simple_matcher("have cached gems") do |given, matcher|
|
103
|
+
gems = gems.sort
|
104
|
+
cache_dir = Dir["#{given}/cache/*.gem"].map { |f| File.basename(f, ".gem") }.sort
|
105
|
+
|
106
|
+
unless cache_dir == gems
|
107
|
+
gem_fail = "The gem cache did not match:\n"
|
108
|
+
gem_fail << " Extra: #{(cache_dir - gems).join(', ')}\n" if (cache_dir - gems).any?
|
109
|
+
gem_fail << " Missing: #{(gems - cache_dir).join(', ')}\n" if (gems - cache_dir).any?
|
110
|
+
end
|
111
|
+
|
112
|
+
matcher.failure_message = gem_fail
|
113
|
+
!gem_fail
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
alias have_cached_gem have_cached_gems
|
118
|
+
|
119
|
+
def have_installed_gems(*gems)
|
120
|
+
simple_matcher("have installed gems") do |given, matcher|
|
121
|
+
gems = gems.sort
|
122
|
+
gem_dir = Dir["#{given}/gems/*"].map { |f| File.basename(f) }.sort
|
123
|
+
spec_dir = Dir["#{given}/specifications/*.gemspec"].map { |f| File.basename(f, ".gemspec") }.sort
|
124
|
+
|
125
|
+
unless gem_dir == gems
|
126
|
+
gem_fail = "The gem directory did not match:\n"
|
127
|
+
gem_fail << " Extra: #{(gem_dir - gems).join(', ')}\n" if (gem_dir - gems).any?
|
128
|
+
gem_fail << " Missing: #{(gems - gem_dir).join(', ')}\n" if (gems - gem_dir).any?
|
129
|
+
end
|
130
|
+
|
131
|
+
unless spec_dir == gems
|
132
|
+
spec_fail = "The spec directory did not match:\n"
|
133
|
+
spec_fail << " Extra: #{(spec_dir - gems).join(', ')}\n" if (spec_dir - gems).any?
|
134
|
+
spec_fail << " Missing: #{(gems - spec_dir).join(', ')}\n" if (gems - spec_dir).any?
|
135
|
+
end
|
136
|
+
|
137
|
+
matcher.failure_message = [gem_fail, spec_fail].compact.join("\n")
|
138
|
+
!gem_fail && !spec_fail
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
alias have_installed_gem have_installed_gems
|
143
|
+
|
144
|
+
def have_log_message(message)
|
145
|
+
simple_matcher("have log message") do |given, matcher|
|
146
|
+
given.rewind
|
147
|
+
log = given.read
|
148
|
+
matcher.failure_message = "Expected logger to contain:\n #{message}\n\nBut it was:\n #{log.gsub("\n", "\n ")}"
|
149
|
+
message = /^#{Regexp.escape(message)}$/m unless message.is_a?(Regexp)
|
150
|
+
log =~ message
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def have_const(const)
|
155
|
+
simple_matcher "have const" do |given, matcher|
|
156
|
+
matcher.failure_message = "Could not find constant '#{const}' in environment: '#{given}'"
|
157
|
+
out = run_in_context "Bundler.require_env #{given.inspect} ; p !!defined?(#{const})"
|
158
|
+
out == "true"
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
Spec::Matchers.define :match_gems do |expected|
|
165
|
+
match do |actual|
|
166
|
+
@_messages = []
|
167
|
+
@dump = {}
|
168
|
+
|
169
|
+
if actual.nil?
|
170
|
+
@_messages << "The result is nil"
|
171
|
+
next
|
172
|
+
end
|
173
|
+
|
174
|
+
actual.each do |spec|
|
175
|
+
unless spec.is_a?(Gem::Specification)
|
176
|
+
@_messages << "#{gem_resolver_inspect(spec)} was expected to be a Gem::Specification, but got #{spec.class}"
|
177
|
+
next
|
178
|
+
end
|
179
|
+
@dump[spec.name.to_s] ||= []
|
180
|
+
@dump[spec.name.to_s] << spec.version.to_s
|
181
|
+
end
|
182
|
+
|
183
|
+
if @_messages.any?
|
184
|
+
@_messages.unshift "The gems #{gem_resolver_inspect(actual)} were not structured as expected"
|
185
|
+
next false
|
186
|
+
end
|
187
|
+
|
188
|
+
unless @dump == expected
|
189
|
+
@_messages << "The source index was expected to have the gems:"
|
190
|
+
@_messages << expected.to_a.sort.pretty_inspect
|
191
|
+
@_messages << "but got:"
|
192
|
+
@_messages << @dump.to_a.sort.pretty_inspect
|
193
|
+
next false
|
194
|
+
end
|
195
|
+
true
|
196
|
+
end
|
197
|
+
|
198
|
+
failure_message_for_should do |actual, matcher|
|
199
|
+
@_messages.join("\n")
|
200
|
+
end
|
201
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Spec
|
2
|
+
module PathUtils
|
3
|
+
def root
|
4
|
+
@root ||= Pathname.new(__FILE__).dirname.join('..', '..').expand_path
|
5
|
+
end
|
6
|
+
|
7
|
+
def tmp_path(*path)
|
8
|
+
root.join("tmp", *path).expand_path
|
9
|
+
end
|
10
|
+
|
11
|
+
alias fixture_dir tmp_path
|
12
|
+
|
13
|
+
def bundled_app(*path)
|
14
|
+
tmp_path.join("bundled_app").join(*path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def bundled_path
|
18
|
+
@bundled_path ||= bundled_app("vendor/gems/#{Gem.ruby_engine}/#{Gem::ConfigMap[:ruby_version]}")
|
19
|
+
end
|
20
|
+
|
21
|
+
def tmp_gem_path(*path)
|
22
|
+
bundled_path.join(*path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def tmp_bindir(*path)
|
26
|
+
bundled_app("bin").join(*path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def cache_path(*path)
|
30
|
+
bundled_app.join("cache", *path)
|
31
|
+
end
|
32
|
+
|
33
|
+
def cached(gem_name)
|
34
|
+
cache_path.join("#{gem_name}.gem")
|
35
|
+
end
|
36
|
+
|
37
|
+
def gem_repo1(*path)
|
38
|
+
tmp_path("repos/1")
|
39
|
+
end
|
40
|
+
|
41
|
+
def gem_repo2(*path)
|
42
|
+
tmp_path("repos/2")
|
43
|
+
end
|
44
|
+
|
45
|
+
def gem_repo2(*path)
|
46
|
+
tmp_path("repos/3")
|
47
|
+
end
|
48
|
+
|
49
|
+
def system_gem_path(*path)
|
50
|
+
tmp_path('system_gems', *path)
|
51
|
+
end
|
52
|
+
|
53
|
+
def copy(gem_name)
|
54
|
+
FileUtils.cp(fixture(gem_name), File.join(tmp_dir, 'cache'))
|
55
|
+
end
|
56
|
+
|
57
|
+
def app_root
|
58
|
+
Dir.chdir bundled_app do
|
59
|
+
yield
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bowline-bundler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Alex MacCaw
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-27 00:00:00 -04:00
|
18
|
+
default_executable: bowline-bundle
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description:
|
22
|
+
email: alex@leadthinking.com
|
23
|
+
executables:
|
24
|
+
- bowline-bundle
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- LICENSE
|
29
|
+
- README.markdown
|
30
|
+
files:
|
31
|
+
- LICENSE
|
32
|
+
- README.markdown
|
33
|
+
- Rakefile
|
34
|
+
- VERSION
|
35
|
+
- bin/bowline-bundle
|
36
|
+
- lib/bowline/bundler.rb
|
37
|
+
- lib/bowline/bundler/bundle.rb
|
38
|
+
- lib/bowline/bundler/cli.rb
|
39
|
+
- lib/bowline/bundler/dependency.rb
|
40
|
+
- lib/bowline/bundler/dsl.rb
|
41
|
+
- lib/bowline/bundler/environment.rb
|
42
|
+
- lib/bowline/bundler/finder.rb
|
43
|
+
- lib/bowline/bundler/gem_bundle.rb
|
44
|
+
- lib/bowline/bundler/gem_ext.rb
|
45
|
+
- lib/bowline/bundler/remote_specification.rb
|
46
|
+
- lib/bowline/bundler/resolver.rb
|
47
|
+
- lib/bowline/bundler/runtime.rb
|
48
|
+
- lib/bowline/bundler/source.rb
|
49
|
+
- lib/bowline/bundler/templates/app_script.erb
|
50
|
+
- lib/bowline/bundler/templates/environment.erb
|
51
|
+
- lib/bowline/bundler/templates/environment_picker.erb
|
52
|
+
- spec/bundler/cli_spec.rb
|
53
|
+
- spec/bundler/directory_spec.rb
|
54
|
+
- spec/bundler/dsl_spec.rb
|
55
|
+
- spec/bundler/fetcher_spec.rb
|
56
|
+
- spec/bundler/git_spec.rb
|
57
|
+
- spec/bundler/installer_spec.rb
|
58
|
+
- spec/bundler/manifest_file_spec.rb
|
59
|
+
- spec/bundler/manifest_spec.rb
|
60
|
+
- spec/bundler/runtime_spec.rb
|
61
|
+
- spec/bundler/system_gems_spec.rb
|
62
|
+
- spec/quality_spec.rb
|
63
|
+
- spec/resolver/engine_spec.rb
|
64
|
+
- spec/resolver/error_spec.rb
|
65
|
+
- spec/resolver/fake_source_index_spec.rb
|
66
|
+
- spec/resolver/prerelease_spec.rb
|
67
|
+
- spec/spec_helper.rb
|
68
|
+
- spec/support/builders.rb
|
69
|
+
- spec/support/core_ext.rb
|
70
|
+
- spec/support/helpers.rb
|
71
|
+
- spec/support/matchers.rb
|
72
|
+
- spec/support/path_utils.rb
|
73
|
+
has_rdoc: true
|
74
|
+
homepage: http://github.com/maccman/bowline-bundler
|
75
|
+
licenses: []
|
76
|
+
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options:
|
79
|
+
- --charset=UTF-8
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
segments:
|
94
|
+
- 1
|
95
|
+
- 3
|
96
|
+
- 5
|
97
|
+
version: 1.3.5
|
98
|
+
requirements: []
|
99
|
+
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 1.3.6
|
102
|
+
signing_key:
|
103
|
+
specification_version: 3
|
104
|
+
summary: An easy way to vendor gem dependencies for Bowline apps
|
105
|
+
test_files:
|
106
|
+
- spec/bundler/cli_spec.rb
|
107
|
+
- spec/bundler/directory_spec.rb
|
108
|
+
- spec/bundler/dsl_spec.rb
|
109
|
+
- spec/bundler/fetcher_spec.rb
|
110
|
+
- spec/bundler/git_spec.rb
|
111
|
+
- spec/bundler/installer_spec.rb
|
112
|
+
- spec/bundler/manifest_file_spec.rb
|
113
|
+
- spec/bundler/manifest_spec.rb
|
114
|
+
- spec/bundler/runtime_spec.rb
|
115
|
+
- spec/bundler/system_gems_spec.rb
|
116
|
+
- spec/quality_spec.rb
|
117
|
+
- spec/resolver/engine_spec.rb
|
118
|
+
- spec/resolver/error_spec.rb
|
119
|
+
- spec/resolver/fake_source_index_spec.rb
|
120
|
+
- spec/resolver/prerelease_spec.rb
|
121
|
+
- spec/spec_helper.rb
|
122
|
+
- spec/support/builders.rb
|
123
|
+
- spec/support/core_ext.rb
|
124
|
+
- spec/support/helpers.rb
|
125
|
+
- spec/support/matchers.rb
|
126
|
+
- spec/support/path_utils.rb
|