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.
Files changed (43) hide show
  1. data/LICENSE +20 -0
  2. data/README.markdown +291 -0
  3. data/Rakefile +45 -0
  4. data/VERSION +1 -0
  5. data/bin/bowline-bundle +59 -0
  6. data/lib/bowline/bundler/bundle.rb +323 -0
  7. data/lib/bowline/bundler/cli.rb +87 -0
  8. data/lib/bowline/bundler/dependency.rb +62 -0
  9. data/lib/bowline/bundler/dsl.rb +182 -0
  10. data/lib/bowline/bundler/environment.rb +87 -0
  11. data/lib/bowline/bundler/finder.rb +51 -0
  12. data/lib/bowline/bundler/gem_bundle.rb +11 -0
  13. data/lib/bowline/bundler/gem_ext.rb +34 -0
  14. data/lib/bowline/bundler/remote_specification.rb +53 -0
  15. data/lib/bowline/bundler/resolver.rb +250 -0
  16. data/lib/bowline/bundler/runtime.rb +2 -0
  17. data/lib/bowline/bundler/source.rb +361 -0
  18. data/lib/bowline/bundler/templates/app_script.erb +3 -0
  19. data/lib/bowline/bundler/templates/environment.erb +156 -0
  20. data/lib/bowline/bundler/templates/environment_picker.erb +4 -0
  21. data/lib/bowline/bundler.rb +35 -0
  22. data/spec/bundler/cli_spec.rb +558 -0
  23. data/spec/bundler/directory_spec.rb +255 -0
  24. data/spec/bundler/dsl_spec.rb +126 -0
  25. data/spec/bundler/fetcher_spec.rb +138 -0
  26. data/spec/bundler/git_spec.rb +266 -0
  27. data/spec/bundler/installer_spec.rb +155 -0
  28. data/spec/bundler/manifest_file_spec.rb +105 -0
  29. data/spec/bundler/manifest_spec.rb +257 -0
  30. data/spec/bundler/runtime_spec.rb +141 -0
  31. data/spec/bundler/system_gems_spec.rb +42 -0
  32. data/spec/quality_spec.rb +57 -0
  33. data/spec/resolver/engine_spec.rb +112 -0
  34. data/spec/resolver/error_spec.rb +50 -0
  35. data/spec/resolver/fake_source_index_spec.rb +43 -0
  36. data/spec/resolver/prerelease_spec.rb +113 -0
  37. data/spec/spec_helper.rb +46 -0
  38. data/spec/support/builders.rb +257 -0
  39. data/spec/support/core_ext.rb +18 -0
  40. data/spec/support/helpers.rb +126 -0
  41. data/spec/support/matchers.rb +201 -0
  42. data/spec/support/path_utils.rb +63 -0
  43. 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