spitball 0.4.3 → 0.4.4

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/bin/spitball CHANGED
@@ -30,6 +30,10 @@ opts = OptionParser.new do |opts|
30
30
  args[:without] = without
31
31
  end
32
32
 
33
+ opts.on('-g', '--generate-only', "Only generate, don't download") do
34
+ args[:generate] = true
35
+ end
36
+
33
37
  opts.separator ""
34
38
  opts.separator "environment variables:"
35
39
  opts.separator "\tSPITBALL_CACHE\t\t Specifies the cache dir. Defaults to /tmp/spitball"
@@ -53,4 +57,5 @@ ball = args[:host] ?
53
57
  Spitball::Remote.new(gemfile, gemfile_lock, :host => args[:host], :port => (args[:port] || 8080).to_i, :without => args[:without]) :
54
58
  Spitball.new(gemfile, gemfile_lock, :without => args[:without])
55
59
 
56
- ball.copy_to args[:destination]
60
+ args[:generate] ? ball.cache! : ball.copy_to(args[:destination])
61
+
@@ -3,6 +3,7 @@ module Bundler
3
3
 
4
4
  def initialize(file)
5
5
  @groups = Hash.new{|h, k| h[k] = []}
6
+ @gem_names = []
6
7
  instance_eval(file)
7
8
  end
8
9
 
@@ -10,6 +11,10 @@ module Bundler
10
11
  @groups
11
12
  end
12
13
 
14
+ def __gem_names
15
+ @gem_names
16
+ end
17
+
13
18
  def group(name, &blk)
14
19
  @current_group = name.to_sym
15
20
  instance_eval(&blk)
@@ -18,6 +23,7 @@ module Bundler
18
23
  alias_method :groups, :group
19
24
 
20
25
  def gem(*args)
26
+ @gem_names << args.first
21
27
  @groups[@current_group] << args.first
22
28
  end
23
29
 
data/lib/spitball.rb CHANGED
@@ -25,10 +25,14 @@ class Spitball
25
25
  attr_reader :gemfile, :gemfile_lock, :without, :options
26
26
 
27
27
  def initialize(gemfile, gemfile_lock, options = {})
28
+ Spitball::Repo.make_cache_dirs
28
29
  @gemfile = gemfile
29
30
  @gemfile_lock = gemfile_lock
30
31
  @options = options
31
32
  @without = (options[:without] || []).map{|w| w.to_sym}
33
+ @parsed_lockfile, @dsl = Bundler::FakeLockfileParser.new(gemfile_lock), Bundler::FakeDsl.new(gemfile)
34
+ raise "You need to run bundle install before you can use spitball" unless (@parsed_lockfile.dependencies.map{|d| d.name}.uniq.sort == @dsl.__gem_names.uniq.sort)
35
+ @groups_to_install = @dsl.__groups.keys - @without
32
36
  end
33
37
 
34
38
  def cached?
@@ -36,18 +40,16 @@ class Spitball
36
40
  end
37
41
 
38
42
  def cache!(sync = true)
39
- Spitball::Repo.make_cache_dirs
40
- unless cached?
41
- lock = Spitball::FileLock.new(bundle_path('lock'))
42
- if lock.acquire_lock
43
- begin
44
- create_bundle
45
- ensure
46
- lock.release_lock
47
- end
48
- elsif sync
49
- sleep 0.1 until cached?
43
+ return if cached?
44
+ lock = Spitball::FileLock.new(bundle_path('lock'))
45
+ if lock.acquire_lock
46
+ begin
47
+ create_bundle
48
+ ensure
49
+ lock.release_lock
50
50
  end
51
+ elsif sync
52
+ sleep 0.1 until cached?
51
53
  end
52
54
  end
53
55
 
@@ -59,7 +61,6 @@ class Spitball
59
61
  end
60
62
 
61
63
  def create_bundle
62
- ENV['BUNDLE_GEMFILE'] = gemfile_path # make bundler happy! :) *cry*
63
64
  Spitball::Repo.make_cache_dirs
64
65
  FileUtils.mkdir_p bundle_path
65
66
 
@@ -67,11 +68,9 @@ class Spitball
67
68
  File.open(gemfile_path, 'w') {|f| f.write gemfile }
68
69
  File.open(gemfile_lock_path, 'w') {|f| f.write gemfile_lock }
69
70
 
70
- parsed_lockfile, dsl = Bundler::FakeLockfileParser.new(gemfile_lock), Bundler::FakeDsl.new(gemfile)
71
-
72
71
  Dir.chdir(Repo.gemcache_path) do
73
- parsed_lockfile.specs.each do |spec|
74
- install_gem(spec, parsed_lockfile.sources) unless without.any?{|w| dsl.__groups[w].include?(spec.name)}
72
+ @dsl.__gem_names.each do |spec_name|
73
+ install_gem(@parsed_lockfile.specs.find {|spec| spec.name == spec_name})
75
74
  end
76
75
  end
77
76
 
@@ -89,12 +88,27 @@ class Spitball
89
88
  FileUtils.rm_rf bundle_path
90
89
  end
91
90
 
92
- def install_gem(spec, sources)
93
- cache_dir = File.join(Repo.gemcache_path, "#{spec.name}-#{::Digest::MD5.hexdigest([spec.name, spec.version, sources_opt(sources)].join('/'))}")
91
+ def install_gem(spec)
92
+ if @groups_to_install.any?{|group| @dsl.__groups[group].include?(spec.name)}
93
+ install_and_copy_spec(spec)
94
+ spec.dependencies.each do |dep|
95
+ install_gem(@parsed_lockfile.specs.find {|spec| spec.name == dep.name})
96
+ end
97
+ end
98
+
99
+ end
100
+
101
+ def install_and_copy_spec(spec)
102
+ cache_dir = File.join(Repo.gemcache_path, "#{spec.name}-#{::Digest::MD5.hexdigest([spec.name, spec.version, sources_opt(@parsed_lockfile.sources)].join('/'))}")
94
103
  unless File.exist?(cache_dir)
95
104
  FileUtils.mkdir_p(cache_dir)
96
- out = `gem install #{spec.name} -v'#{spec.version}' --no-rdoc --no-ri --ignore-dependencies -i#{cache_dir} #{sources_opt(sources)} 2>&1`
97
- $? == 0 ? (puts out) : (raise BundleCreationFailure, out)
105
+ out = `gem install #{spec.name} -v'#{spec.version}' --no-rdoc --no-ri --ignore-dependencies -i#{cache_dir} #{sources_opt(@parsed_lockfile.sources)} 2>&1`
106
+ if $? == 0
107
+ puts out
108
+ else
109
+ FileUtils.rm_rf(cache_dir)
110
+ raise BundleCreationFailure, out
111
+ end
98
112
  else
99
113
  puts "Using cached version of #{spec.name} (#{spec.version})"
100
114
  end
@@ -128,4 +142,4 @@ class Spitball
128
142
  def tarball_path
129
143
  Repo.bundle_path(digest, 'tgz')
130
144
  end
131
- end
145
+ end
@@ -9,9 +9,7 @@ class Spitball::FileLock
9
9
  end
10
10
 
11
11
  def acquire_lock
12
-
13
12
  File.open(pre_lock_path, 'w') {|f| f.write Process.pid }
14
-
15
13
  system "ln #{pre_lock_path} #{path} > /dev/null 2>&1"
16
14
  File.read(path).to_i == Process.pid
17
15
  ensure
@@ -7,12 +7,11 @@ class Spitball::Remote
7
7
  include Spitball::ClientCommon
8
8
 
9
9
  def initialize(gemfile, gemfile_lock, opts = {})
10
- @gemfile = gemfile
11
- @gemfile_lock = gemfile_lock
12
- @host = opts[:host]
13
- @port = opts[:port]
14
- @without = (opts[:without] || []).map{|w| w.to_sym}
15
- @cache_dir = '/tmp/spitball/client'
10
+ @gemfile, @gemfile_lock = gemfile, gemfile_lock
11
+ @host = opts[:host]
12
+ @port = opts[:port]
13
+ @without = (opts[:without] || []).map{|w| w.to_sym}
14
+ @cache_dir = File.join(ENV['SPITBALL_CACHE'] || '/tmp/spitball', 'client')
16
15
  FileUtils.mkdir_p(@cache_dir)
17
16
  use_cache_file
18
17
  end
@@ -1,3 +1,3 @@
1
1
  class Spitball
2
- VERSION = '0.4.3'
2
+ VERSION = '0.4.4'
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -12,7 +12,7 @@ require 'rubygems'
12
12
  require 'fileutils'
13
13
  require 'spec'
14
14
  require 'spitball'
15
-
15
+ require 'phocus'
16
16
 
17
17
  Spec::Runner.configure do |config|
18
18
  config.mock_with :rr
@@ -28,7 +28,7 @@ describe Spitball do
28
28
  describe "cached?" do
29
29
  it "returns true if the tarball has already been cached" do
30
30
  @spitball.should_not be_cached
31
- mock(@spitball).install_gem(anything, anything).times(any_times)
31
+ mock(@spitball).install_gem(anything).times(any_times)
32
32
  @spitball.cache!
33
33
  @spitball.should be_cached
34
34
  end
@@ -82,7 +82,7 @@ describe Spitball do
82
82
 
83
83
  describe "create_bundle" do
84
84
  it "generates a bundle at the bundle_path" do
85
- mock(@spitball).install_gem(anything, anything).times(any_times)
85
+ mock(@spitball).install_gem(anything).times(any_times)
86
86
  capture_stdout { @spitball.send :create_bundle }
87
87
  File.exist?(@spitball.send(:tarball_path)).should == true
88
88
  end
@@ -127,10 +127,10 @@ describe Spitball do
127
127
 
128
128
  it "should use without" do
129
129
  @spitball = Spitball.new(@gemfile, @lockfile)
130
- mock(@spitball).install_gem(anything, anything).times(7)
130
+ mock(@spitball).install_and_copy_spec(anything).times(1)
131
131
  @spitball.send :create_bundle
132
132
  @spitball = Spitball.new(@gemfile, @lockfile, :without => 'development')
133
- mock(@spitball).install_gem(anything, anything).times(6)
133
+ mock(@spitball).install_and_copy_spec(anything).times(0)
134
134
  @spitball.send :create_bundle
135
135
  end
136
136
  end
@@ -255,3 +255,37 @@ describe Spitball::Digest do
255
255
  spitball.hash.should == spitball.digest.hash
256
256
  end
257
257
  end
258
+
259
+ describe Spitball do
260
+ context "mismatched" do
261
+ before do
262
+ use_success_bundler
263
+
264
+ @gemfile = <<-end_gemfile
265
+ source :rubygems
266
+ gem "json_pure"
267
+ gem "somethingelse"
268
+ end_gemfile
269
+
270
+ @lockfile = <<-end_lockfile.strip.gsub(/\n[ ]{6}/m, "\n")
271
+ GEM
272
+ remote: http://rubygems.org/
273
+ specs:
274
+ json_pure (1.4.6)
275
+
276
+ PLATFORMS
277
+ ruby
278
+
279
+ DEPENDENCIES
280
+ json_pure
281
+ end_lockfile
282
+
283
+ end
284
+
285
+ describe "create_bundle failure" do
286
+ it "should raise on create_bundle" do
287
+ proc { Spitball.new(@gemfile, @lockfile) }.should raise_error
288
+ end
289
+ end
290
+ end
291
+ end
data/spitball.gemspec CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.add_development_dependency 'rspec', "~> 1.3.0"
19
19
  s.add_development_dependency 'rr'
20
20
  s.add_development_dependency 'rake'
21
+ s.add_development_dependency 'phocus'
21
22
 
22
23
  s.files = `git ls-files`.split("\n")
23
24
  s.test_files = `git ls-files -- spec/*`.split("\n")
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spitball
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 3
10
- version: 0.4.3
9
+ - 4
10
+ version: 0.4.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Freels
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2010-11-16 00:00:00 -08:00
20
+ date: 2011-01-06 00:00:00 -08:00
21
21
  default_executable:
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
@@ -79,6 +79,20 @@ dependencies:
79
79
  version: "0"
80
80
  type: :development
81
81
  version_requirements: *id004
82
+ - !ruby/object:Gem::Dependency
83
+ name: phocus
84
+ prerelease: false
85
+ requirement: &id005 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ hash: 3
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ type: :development
95
+ version_requirements: *id005
82
96
  description: Use bundler to generate gem tarball packages.
83
97
  email: freels@twitter.com
84
98
  executables: