spitball 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -21,7 +21,7 @@ begin
21
21
  gem.summary = "get a bundle"
22
22
  gem.description = "Use bundler to generate gem tarball packages."
23
23
  gem.email = "freels@twitter.com"
24
- gem.homepage = "http://twitter.com"
24
+ gem.homepage = "http://github.com/freels/spitball"
25
25
  gem.authors = ["Matt Freels", "Brandon Mitchell"]
26
26
 
27
27
  gem.add_dependency 'bundler', '>= 0.9.5'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'spitball'
4
+ require 'optparse'
5
+
6
+ args = {}
7
+
8
+ opts = OptionParser.new do |opts|
9
+ opts.banner = "Usage: spitball-cache-cleanup [options]"
10
+ opts.separator ""
11
+ opts.separator "options:"
12
+
13
+ opts.on('-w', '--access-window SECONDS', 'Access window within which tarballs are kept. Default 30 days') do |access_window|
14
+ args[:access_window] = access_window
15
+ end
16
+ end
17
+
18
+ opts.permute!(ARGV)
19
+
20
+ args[:access_window] ||= 2592000
21
+
22
+ Spitball::Repo.clean_up_unused(args[:access_window].to_i)
data/bin/spitball-server CHANGED
@@ -25,7 +25,7 @@ mime_type :tgz, 'application/x-compressed'
25
25
  # return json array of cached SHAs
26
26
  get '/list' do
27
27
  content_type :json
28
- JSON.dump Spitball::Repo.list_cached
28
+ JSON.dump Spitball::Repo.cached_digests
29
29
  end
30
30
 
31
31
  # return tgz or gemfile of cached SHA or 404
@@ -3,7 +3,7 @@ require 'uri'
3
3
 
4
4
  class Spitball::Remote
5
5
 
6
- WAIT_SECONDS = 30
6
+ WAIT_SECONDS = 240
7
7
 
8
8
  def initialize(gemfile, host, port)
9
9
  @gemfile = gemfile
data/lib/spitball/repo.rb CHANGED
@@ -9,14 +9,18 @@ module Spitball::Repo
9
9
  end
10
10
 
11
11
  def exist?(digest)
12
- File.exist? path(digest, 'tgz')
12
+ File.exist? tarball(digest)
13
+ end
14
+
15
+ def tarball(digest)
16
+ path(digest, 'tgz')
13
17
  end
14
18
 
15
19
  def gemfile(digest)
16
- File.read path(digest, 'gemfile')
20
+ path(digest, 'gemfile')
17
21
  end
18
22
 
19
- def list_cached
23
+ def cached_digests
20
24
  Dir[File.join(WORKING_DIR, 'bundle_*.tgz')].map do |path|
21
25
  path.match(/bundle_(.*?)\.tgz$/)[1]
22
26
  end.compact.uniq.sort
@@ -25,4 +29,18 @@ module Spitball::Repo
25
29
  def make_cache_dir
26
30
  FileUtils.mkdir_p WORKING_DIR
27
31
  end
32
+
33
+ def clean_up_unused(access_window)
34
+ cutoff_time = Time.now - access_window
35
+
36
+ cached_digests.each do |digest|
37
+ stat = File.stat(tarball(digest))
38
+ access_time = [stat.atime, stat.mtime].max
39
+
40
+ if access_time < cutoff_time
41
+ File.unlink(tarball(digest)) if File.exist? tarball(digest)
42
+ File.unlink(gemfile(digest)) if File.exist? gemfile(digest)
43
+ end
44
+ end
45
+ end
28
46
  end
@@ -148,27 +148,49 @@ describe Spitball::Repo do
148
148
  end
149
149
 
150
150
  describe "exist?" do
151
- it "returns true if tarball for a digest has been exists" do
151
+ it "returns true if tarball for a digest exists" do
152
152
  Spitball::Repo.exist?('digest').should_not == true
153
153
  File.open(Spitball::Repo.path('digest', 'tgz'), 'w') {|f| f.write 'tarball!' }
154
154
  Spitball::Repo.exist?('digest').should == true
155
155
  end
156
156
  end
157
157
 
158
+ describe "tarball" do
159
+ it "returns the path of the cached tarball for a digest" do
160
+ Spitball::Repo.tarball('digest').should == Spitball::Repo.path('digest', 'tgz')
161
+ end
162
+ end
163
+
158
164
  describe "gemfile" do
159
- it "returns the contents of the cached gemfile for a digest" do
160
- gemfile = 'gem :memcached'
161
- File.open(Spitball::Repo.path('digest', 'gemfile'), 'w') {|f| f.write gemfile }
162
- Spitball::Repo.gemfile('digest').should == gemfile
165
+ it "returns the path of the cached gemfile for a digest" do
166
+ Spitball::Repo.gemfile('digest').should == Spitball::Repo.path('digest', 'gemfile')
163
167
  end
164
168
  end
165
169
 
166
- describe "list_cached" do
170
+ describe "cached_digests" do
167
171
  it "returns a list of cached bundles" do
168
- File.open(Spitball::Repo.path('digest', 'tgz'), 'w') {|f| f.write 'tarball!' }
169
- File.open(Spitball::Repo.path('digest2', 'tgz'), 'w') {|f| f.write 'tarball2!' }
172
+ File.open(Spitball::Repo.tarball('digest'), 'w') {|f| f.write 'tarball!' }
173
+ File.open(Spitball::Repo.tarball('digest2'), 'w') {|f| f.write 'tarball2!' }
174
+
175
+ Spitball::Repo.cached_digests.should == ['digest', 'digest2']
176
+ end
177
+ end
178
+
179
+ describe "clean_up_unused" do
180
+ it "removes cached tarballs and gemfiles that haven't been accessed within a certain period" do
181
+ File.open(Spitball::Repo.tarball('digest'), 'w') {|f| f.write 'tarball!' }
182
+ File.open(Spitball::Repo.gemfile('digest'), 'w') {|f| f.write 'gemfile!' }
183
+
184
+ sleep 2
185
+ File.open(Spitball::Repo.tarball('digest2'), 'w') {|f| f.write 'tarball2!' }
186
+ File.open(Spitball::Repo.gemfile('digest2'), 'w') {|f| f.write 'gemfile2!' }
187
+
188
+ Spitball::Repo.clean_up_unused(1)
170
189
 
171
- Spitball::Repo.list_cached.should == ['digest', 'digest2']
190
+ File.exist?(Spitball::Repo.tarball('digest')).should_not == true
191
+ File.exist?(Spitball::Repo.gemfile('digest')).should_not == true
192
+ File.exist?(Spitball::Repo.tarball('digest2')).should == true
193
+ File.exist?(Spitball::Repo.gemfile('digest2')).should == true
172
194
  end
173
195
  end
174
196
  end
data/spitball.gemspec CHANGED
@@ -5,14 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{spitball}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Matt Freels", "Brandon Mitchell"]
12
- s.date = %q{2010-08-05}
12
+ s.date = %q{2010-08-23}
13
13
  s.description = %q{Use bundler to generate gem tarball packages.}
14
14
  s.email = %q{freels@twitter.com}
15
- s.executables = ["spitball", "spitball-server"]
15
+ s.executables = ["spitball", "spitball-cache-cleanup", "spitball-server"]
16
16
  s.extra_rdoc_files = [
17
17
  "README.md"
18
18
  ]
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
23
23
  "Rakefile",
24
24
  "VERSION",
25
25
  "bin/spitball",
26
+ "bin/spitball-cache-cleanup",
26
27
  "bin/spitball-server",
27
28
  "lib/spitball.rb",
28
29
  "lib/spitball/digest.rb",
@@ -34,7 +35,7 @@ Gem::Specification.new do |s|
34
35
  "spec/spitball_spec.rb",
35
36
  "spitball.gemspec"
36
37
  ]
37
- s.homepage = %q{http://twitter.com}
38
+ s.homepage = %q{http://github.com/freels/spitball}
38
39
  s.rdoc_options = ["--charset=UTF-8"]
39
40
  s.require_paths = ["lib"]
40
41
  s.rubygems_version = %q{1.3.7}
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: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Freels
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-08-05 00:00:00 -07:00
19
+ date: 2010-08-23 00:00:00 -07:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -82,6 +82,7 @@ description: Use bundler to generate gem tarball packages.
82
82
  email: freels@twitter.com
83
83
  executables:
84
84
  - spitball
85
+ - spitball-cache-cleanup
85
86
  - spitball-server
86
87
  extensions: []
87
88
 
@@ -94,6 +95,7 @@ files:
94
95
  - Rakefile
95
96
  - VERSION
96
97
  - bin/spitball
98
+ - bin/spitball-cache-cleanup
97
99
  - bin/spitball-server
98
100
  - lib/spitball.rb
99
101
  - lib/spitball/digest.rb
@@ -105,7 +107,7 @@ files:
105
107
  - spec/spitball_spec.rb
106
108
  - spitball.gemspec
107
109
  has_rdoc: true
108
- homepage: http://twitter.com
110
+ homepage: http://github.com/freels/spitball
109
111
  licenses: []
110
112
 
111
113
  post_install_message: