stickler 2.3.0 → 2.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.
Files changed (80) hide show
  1. checksums.yaml +15 -0
  2. data/CONTRIBUTING.md +5 -4
  3. data/HISTORY.md +16 -9
  4. data/LICENSE +1 -1
  5. data/Manifest.txt +34 -20
  6. data/README.md +128 -0
  7. data/Rakefile +10 -9
  8. data/bin/stickler +9 -6
  9. data/bin/stickler-passenger-config +8 -8
  10. data/bin/stickler-server +12 -12
  11. data/examples/as_middleware.ru +14 -0
  12. data/examples/auth_repo.ru +1 -1
  13. data/examples/gemcutter_repo.ru +1 -1
  14. data/examples/local_repo.ru +1 -1
  15. data/lib/stickler.rb +3 -1
  16. data/lib/stickler/client.rb +2 -1
  17. data/lib/stickler/client/delete.rb +1 -1
  18. data/lib/stickler/client/latest-version.rb +40 -0
  19. data/lib/stickler/client/mirror.rb +47 -15
  20. data/lib/stickler/client/push.rb +1 -1
  21. data/lib/stickler/client/unyank.rb +1 -1
  22. data/lib/stickler/client/yank.rb +1 -1
  23. data/lib/stickler/gem_container.rb +40 -0
  24. data/lib/stickler/gemfile_lock_parser.rb +47 -0
  25. data/lib/stickler/middleware.rb +1 -0
  26. data/lib/stickler/middleware/server.rb +37 -0
  27. data/lib/stickler/repository/api.rb +16 -0
  28. data/lib/stickler/repository/index.rb +0 -3
  29. data/lib/stickler/repository/local.rb +6 -8
  30. data/lib/stickler/repository/remote.rb +29 -7
  31. data/lib/stickler/server.rb +2 -6
  32. data/man/stickler-passenger-config.1 +2 -22
  33. data/man/stickler-server.1 +9 -99
  34. data/man/stickler.1 +15 -173
  35. data/man/stickler.1.ronn +6 -0
  36. data/tasks/default.rake +16 -18
  37. data/tasks/man.rake +7 -0
  38. data/tasks/this.rb +5 -5
  39. data/test/data/Gemfile.lock.example +56 -0
  40. data/{spec → test}/data/gemcutter/gems/foo-1.0.0.gem +0 -0
  41. data/{spec → test}/data/gems/bar-1.0.0.gem +0 -0
  42. data/{spec → test}/data/gems/baz-3.1.4-java.gem +0 -0
  43. data/{spec → test}/data/gems/baz-3.1.4.gem +0 -0
  44. data/{spec → test}/data/gems/foo-1.0.0.gem +0 -0
  45. data/{spec → test}/data/gems/foo-2.0.0a.gem +0 -0
  46. data/test/data/specifications/bar-1.0.0.gemspec +31 -0
  47. data/test/data/specifications/baz-3.1.4-java.gemspec +32 -0
  48. data/test/data/specifications/baz-3.1.4.gemspec +31 -0
  49. data/test/data/specifications/foo-1.0.0.gemspec +31 -0
  50. data/test/data/specifications/foo-2.0.0a.gemspec +32 -0
  51. data/test/index_test_helpers.rb +75 -0
  52. data/test/middleware/test_local.rb +75 -0
  53. data/test/middleware/test_not_found.rb +26 -0
  54. data/test/repository/test_api.rb +49 -0
  55. data/test/repository/test_api_behavior.rb +208 -0
  56. data/test/repository/test_index.rb +48 -0
  57. data/test/repository/test_local.rb +59 -0
  58. data/test/repository/test_null.rb +15 -0
  59. data/test/repository/test_remote.rb +26 -0
  60. data/test/repository/test_remote_authenticated.rb +39 -0
  61. data/test/stickler_test_server.rb +35 -0
  62. data/test/test_gemfile_lock_parser.rb +28 -0
  63. data/test/test_paths.rb +22 -0
  64. data/test/test_spec_lite.rb +90 -0
  65. data/test/test_stickler.rb +49 -0
  66. metadata +58 -85
  67. data/README.rdoc +0 -156
  68. data/spec/index_spec_helpers.rb +0 -73
  69. data/spec/middleware/local_spec.rb +0 -72
  70. data/spec/middleware/not_found_spec.rb +0 -25
  71. data/spec/paths_spec.rb +0 -11
  72. data/spec/repository/api_behavior.rb +0 -192
  73. data/spec/repository/api_spec.rb +0 -37
  74. data/spec/repository/index_spec.rb +0 -46
  75. data/spec/repository/local_spec.rb +0 -49
  76. data/spec/repository/null_spec.rb +0 -14
  77. data/spec/repository/remote_spec.rb +0 -86
  78. data/spec/spec.opts +0 -2
  79. data/spec/spec_helper.rb +0 -24
  80. data/spec/spec_lite_spec.rb +0 -96
@@ -45,6 +45,12 @@ COMMANDS
45
45
  Put a gem that was _yanked_ back into the gemserver index. This reverses a
46
46
  `yank`.
47
47
 
48
+ *latest-version*:
49
+ Prints the latest version of a gem
50
+
51
+ *delete*:
52
+ Completely remove a gem from the gem server's index.
53
+
48
54
  OPTIONS
49
55
  -------
50
56
  These are the options for all commands. Not all options apply to all commands.
@@ -1,5 +1,6 @@
1
1
  # vim: syntax=ruby
2
2
  require 'rake/clean'
3
+ require 'digest'
3
4
  #------------------------------------------------------------------------------
4
5
  # If you want to Develop on this project just run 'rake develop' and you'll
5
6
  # have all you need to get going. If you want to use bundler for development,
@@ -30,7 +31,7 @@ namespace :develop do
30
31
  # Create a Gemfile that just references the gemspec
31
32
  file 'Gemfile' => :gemspec do
32
33
  File.open( "Gemfile", "w+" ) do |f|
33
- f.puts 'source :rubygems'
34
+ f.puts 'source "https://rubygems.org/"'
34
35
  f.puts 'gemspec'
35
36
  end
36
37
  end
@@ -50,14 +51,16 @@ task :develop => "develop:default"
50
51
  # Minitest - standard TestTask
51
52
  #------------------------------------------------------------------------------
52
53
  begin
53
- require 'rspec/core/rake_task'
54
- RSpec::Core::RakeTask.new( :test ) do |t|
55
- t.ruby_opts = %w[ -w ]
56
- t.rspec_opts = %w[ --color --format documentation ]
54
+ require 'rake/testtask'
55
+ Rake::TestTask.new( :test ) do |t|
56
+ t.ruby_opts = %w[ -w -rubygems ]
57
+ t.libs = %w[ lib spec test ]
58
+ t.pattern = "{test,spec}/**/{test_*,*_spec}.rb"
57
59
  end
58
- task :default => :test
60
+
59
61
  task :test_requirements
60
62
  task :test => :test_requirements
63
+ task :default => :test
61
64
  rescue LoadError
62
65
  This.task_warning( 'test' )
63
66
  end
@@ -72,11 +75,12 @@ begin
72
75
  RDoc::Task.new do |t|
73
76
  t.markup = 'tomdoc'
74
77
  t.rdoc_dir = 'doc'
75
- t.main = 'README.rdoc'
78
+ t.main = 'README.md'
76
79
  t.title = "#{This.name} #{This.version}"
77
- t.rdoc_files.include( '*.rdoc', 'lib/**/*.rb' )
80
+ t.rdoc_files.include( FileList['*.{rdoc,md,txt}'], FileList['ext/**/*.c'],
81
+ FileList['lib/**/*.rb'] )
78
82
  end
79
- rescue LoadError => le
83
+ rescue StandardError, LoadError
80
84
  This.task_warning( 'rdoc' )
81
85
  end
82
86
 
@@ -226,21 +230,15 @@ end
226
230
  # the gemspec is also a dev artifact and should not be kept around.
227
231
  CLOBBER << This.gemspec_file.to_s
228
232
 
233
+ # .rbc files from ruby 2.0
234
+ CLOBBER << FileList["**/*.rbc"]
235
+
229
236
  # The standard gem packaging task, everyone has it.
230
237
  require 'rubygems/package_task'
231
238
  Gem::PackageTask.new( This.platform_gemspec ) do
232
239
  # nothing
233
240
  end
234
241
 
235
-
236
- #------------------------------------------------------------------------------
237
- # man pages
238
- #------------------------------------------------------------------------------
239
- desc "Create the man pages"
240
- task :man do
241
- sh "ronn --roff #{FileList["man/*.ronn"]}"
242
- end
243
-
244
242
  #------------------------------------------------------------------------------
245
243
  # Release - the steps we go through to do a final release, this is pulled from
246
244
  # a compbination of mojombo's rakegem, hoe and hoe-git
@@ -0,0 +1,7 @@
1
+ #------------------------------------------------------------------------------
2
+ # man pages
3
+ #------------------------------------------------------------------------------
4
+ desc "Create the man pages"
5
+ task :man do
6
+ sh "ronn --roff #{FileList["man/*.ronn"]}"
7
+ end
@@ -25,7 +25,7 @@ class ThisProject
25
25
  #
26
26
  # Yields self
27
27
  def initialize(&block)
28
- @exclude_from_manifest = %r/\.(git|DS_Store)|^(doc|coverage|pkg|tmp)|Gemfile*|\.(gemspec|swp|jar|bundle|so|rvmrc)$|~$/
28
+ @exclude_from_manifest = %r/\.(git|DS_Store)|^(doc|coverage|pkg|tmp|Gemfile(\.lock)?)|^[^\/]+\.gemspec|\.(swp|jar|bundle|so|rvmrc)$|~$/
29
29
  @gemspecs = Hash.new
30
30
  yield self if block_given?
31
31
  end
@@ -54,7 +54,7 @@ class ThisProject
54
54
  #
55
55
  # Retuns the text of the section as an array of paragrphs.
56
56
  def section_of( file, section_name )
57
- re = /^=+ (.*)$/
57
+ re = /^[=#]+ (.*)$/
58
58
  sectional = project_path( file )
59
59
  parts = sectional.read.split( re )[1..-1]
60
60
  parts.map! { |p| p.strip }
@@ -137,8 +137,8 @@ class ThisProject
137
137
  spec.executables = spec.files.grep(/^bin/) { |f| File.basename(f) }
138
138
  spec.test_files = spec.files.grep(/^spec/)
139
139
 
140
- spec.extra_rdoc_files += spec.files.grep(/(txt|rdoc)$/)
141
- spec.rdoc_options = [ "--main" , 'README.rdoc',
140
+ spec.extra_rdoc_files += spec.files.grep(/(txt|rdoc|md)$/)
141
+ spec.rdoc_options = [ "--main" , 'README.md',
142
142
  "--markup", "tomdoc" ]
143
143
  end
144
144
  end
@@ -187,7 +187,7 @@ class ThisProject
187
187
 
188
188
  # Internal: Return the DESCRIPTION section of the README.rdoc file
189
189
  def description_section
190
- section_of( 'README.rdoc', 'DESCRIPTION')
190
+ section_of( 'README.md', 'DESCRIPTION')
191
191
  end
192
192
 
193
193
  # Internal: Return the summary text from the README
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ stickler (2.3.0)
5
+ addressable (~> 2.3)
6
+ excon (~> 0.27.3)
7
+ logging (~> 1.8.1)
8
+ sinatra (~> 1.4)
9
+ trollop (~> 2.0)
10
+
11
+ GEM
12
+ remote: http://rubygems.org/
13
+ specs:
14
+ addressable (2.3.5)
15
+ builder (3.2.2)
16
+ excon (0.27.6)
17
+ hpricot (0.8.6)
18
+ json (1.8.0)
19
+ little-plugger (1.1.3)
20
+ logging (1.8.1)
21
+ little-plugger (>= 1.1.3)
22
+ multi_json (>= 1.3.6)
23
+ minitest (5.0.8)
24
+ multi_json (1.8.2)
25
+ mustache (0.99.4)
26
+ rack (1.5.2)
27
+ rack-protection (1.5.0)
28
+ rack
29
+ rack-test (0.6.2)
30
+ rack (>= 1.0)
31
+ rake (10.1.0)
32
+ rdiscount (2.1.7)
33
+ rdoc (4.0.1)
34
+ json (~> 1.4)
35
+ ronn (0.7.3)
36
+ hpricot (>= 0.8.2)
37
+ mustache (>= 0.7.0)
38
+ rdiscount (>= 1.5.8)
39
+ sinatra (1.4.3)
40
+ rack (~> 1.4)
41
+ rack-protection (~> 1.4)
42
+ tilt (~> 1.3, >= 1.3.4)
43
+ tilt (1.4.1)
44
+ trollop (2.0)
45
+
46
+ PLATFORMS
47
+ ruby
48
+
49
+ DEPENDENCIES
50
+ builder (~> 3.2)
51
+ minitest (~> 5.0)
52
+ rack-test (~> 0.6.2)
53
+ rake (~> 10.1)
54
+ rdoc (~> 4.0)
55
+ ronn (~> 0.7.3)
56
+ stickler!
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{bar}
5
+ s.version = "1.0.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Jeremy Hinegardner"]
9
+ s.date = %q{2010-06-23}
10
+ s.description = %q{bar gem}
11
+ s.email = %q{jeremy@hinegardner.org}
12
+ s.files = ["README.rdoc", "lib/bar.rb", "bin/bar", "Rakefile", "bar.gemspec"]
13
+ s.homepage = %q{http://github.com/copiousfreetime/stickler}
14
+ s.require_paths = ["lib"]
15
+ s.rubygems_version = %q{1.3.5}
16
+ s.summary = %q{bar gem}
17
+
18
+ if s.respond_to? :specification_version then
19
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
20
+ s.specification_version = 3
21
+
22
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
23
+ s.add_runtime_dependency(%q<rake>, [">= 0"])
24
+ else
25
+ s.add_dependency(%q<rake>, [">= 0"])
26
+ end
27
+ else
28
+ s.add_dependency(%q<rake>, [">= 0"])
29
+ end
30
+ end
31
+
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{baz}
5
+ s.version = "3.1.4"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Jeremy Hinegardner"]
9
+ s.date = %q{2012-12-13}
10
+ s.description = %q{baz gem}
11
+ s.email = %q{jeremy@hinegardner.org}
12
+ s.files = ["README.rdoc", "lib/baz.rb", "bin/baz", "Rakefile", "baz-3.1.4.gemspec"]
13
+ s.homepage = %q{http://github.com/copiousfreetime/stickler}
14
+ s.require_paths = ["lib"]
15
+ s.rubygems_version = %q{1.3.5}
16
+ s.summary = %q{baz gem}
17
+ s.platform = 'java'
18
+
19
+ if s.respond_to? :specification_version then
20
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
21
+ s.specification_version = 3
22
+
23
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
24
+ s.add_runtime_dependency(%q<rake>, [">= 0"])
25
+ else
26
+ s.add_dependency(%q<rake>, [">= 0"])
27
+ end
28
+ else
29
+ s.add_dependency(%q<rake>, [">= 0"])
30
+ end
31
+ end
32
+
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{baz}
5
+ s.version = "3.1.4"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Jeremy Hinegardner"]
9
+ s.date = %q{2012-12-13}
10
+ s.description = %q{baz gem}
11
+ s.email = %q{jeremy@hinegardner.org}
12
+ s.files = ["README.rdoc", "lib/baz.rb", "bin/baz", "Rakefile", "baz-3.1.4.gemspec"]
13
+ s.homepage = %q{http://github.com/copiousfreetime/stickler}
14
+ s.require_paths = ["lib"]
15
+ s.rubygems_version = %q{1.3.5}
16
+ s.summary = %q{baz gem}
17
+
18
+ if s.respond_to? :specification_version then
19
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
20
+ s.specification_version = 3
21
+
22
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
23
+ s.add_runtime_dependency(%q<rake>, [">= 0"])
24
+ else
25
+ s.add_dependency(%q<rake>, [">= 0"])
26
+ end
27
+ else
28
+ s.add_dependency(%q<rake>, [">= 0"])
29
+ end
30
+ end
31
+
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{foo}
5
+ s.version = "1.0.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Jeremy Hinegardner"]
9
+ s.date = %q{2010-06-23}
10
+ s.description = %q{foo gem}
11
+ s.email = %q{jeremy@hinegardner.org}
12
+ s.files = ["README.rdoc", "lib/foo.rb", "bin/foo", "Rakefile", "foo.gemspec"]
13
+ s.homepage = %q{http://github.com/copiousfreetime/stickler}
14
+ s.require_paths = ["lib"]
15
+ s.rubygems_version = %q{1.3.5}
16
+ s.summary = %q{foo gem}
17
+
18
+ if s.respond_to? :specification_version then
19
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
20
+ s.specification_version = 3
21
+
22
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
23
+ s.add_runtime_dependency(%q<rake>, [">= 0"])
24
+ else
25
+ s.add_dependency(%q<rake>, [">= 0"])
26
+ end
27
+ else
28
+ s.add_dependency(%q<rake>, [">= 0"])
29
+ end
30
+ end
31
+
@@ -0,0 +1,32 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{foo}
5
+ s.version = "2.0.0a"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Jeremy Hinegardner"]
9
+ s.date = %q{2010-06-23}
10
+ s.description = %q{foo gem prerelease}
11
+ s.email = %q{jeremy@hinegardner.org}
12
+ s.files = ["README.rdoc", "lib/foo.rb", "bin/foo", "Rakefile", "foo.gemspec"]
13
+ s.has_rdoc = false
14
+ s.homepage = %q{http://github.com/copiousfreetime/stickler}
15
+ s.require_paths = ["lib"]
16
+ s.rubygems_version = %q{1.3.7}
17
+ s.summary = %q{foo gem prerelease}
18
+
19
+ if s.respond_to? :specification_version then
20
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
21
+ s.specification_version = 3
22
+
23
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
24
+ s.add_runtime_dependency(%q<rake>, [">= 0"])
25
+ else
26
+ s.add_dependency(%q<rake>, [">= 0"])
27
+ end
28
+ else
29
+ s.add_dependency(%q<rake>, [">= 0"])
30
+ end
31
+ end
32
+
@@ -0,0 +1,75 @@
1
+ require 'rack/test'
2
+ require 'rubygems/user_interaction'
3
+ require 'rubygems/indexer'
4
+
5
+ module Stickler
6
+ module IndexTestHelpers
7
+ include Rack::Test::Methods
8
+
9
+ def define_directories
10
+ # pristine spec data location
11
+ @idx_test_dir = File.expand_path( File.dirname( __FILE__ ) )
12
+ @idx_test_datadir = File.join( @idx_test_dir, "data" )
13
+
14
+ # scratch location
15
+ @scratch_dir = File.join( @idx_test_dir, "scratch" )
16
+ @scratch_datadir = File.join( @scratch_dir, 'data' )
17
+ @scratch_specdir = File.join( @scratch_datadir, "specifications" )
18
+ @scratch_gemsdir = File.join( @scratch_datadir, "gems" )
19
+ end
20
+
21
+ # put in the before clause for setup
22
+ def mirror_spec_gemdir
23
+ define_directories
24
+ FileUtils.mkdir_p( @scratch_dir )
25
+ FileUtils.cp_r( @idx_test_datadir, @scratch_dir )
26
+ end
27
+
28
+ # Do a legacy index of the scratch location
29
+ def make_legacy_index
30
+ indexer = Gem::Indexer.new( @scratch_datadir, :build_legacy => true, :build_modern => false )
31
+ quiet_indexing( indexer )
32
+ end
33
+
34
+ # Do a modern index of the scratch location
35
+ def make_modern_index
36
+ indexer = Gem::Indexer.new( @scratch_datadir, :build_legacy => false, :build_modern => true )
37
+ quiet_indexing( indexer )
38
+ end
39
+
40
+ # put in the after clause for cleanup
41
+ def destroy_scratch_dir
42
+ FileUtils.rm_rf( @scratch_dir )
43
+ end
44
+
45
+
46
+ def quiet_indexing( indexer )
47
+ indexer.use_ui( Gem::SilentUI.new ) do
48
+ indexer.generate_index
49
+ end
50
+ end
51
+
52
+ def validate_contents( got, expected, content_type)
53
+ case content_type
54
+ when 'application/x-gzip'
55
+ response_un = Gem.gunzip( got )
56
+ expected_un = Gem.gunzip( expected )
57
+ when 'application/x-deflate'
58
+ response_un = Gem.inflate( got )
59
+ expected_un = Gem.inflate( expected )
60
+ when 'application/octet-stream'
61
+ response_un = got
62
+ expected_un = expected
63
+ else
64
+ assert false, "Unkonwn content type #{content_type} with data #{got}"
65
+ end
66
+
67
+ got = Marshal.load( response_un )
68
+ got.sort! if got.kind_of?( Array )
69
+
70
+ need = Marshal.load( expected_un )
71
+ need.sort! if need.kind_of?( Array )
72
+ return need, got
73
+ end
74
+ end
75
+ end