stickler 2.2.4 → 2.3.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.
- data/CONTRIBUTING.md +48 -0
- data/{HISTORY.asciidoc → HISTORY.md} +8 -2
- data/Manifest.txt +86 -0
- data/{README.asciidoc → README.rdoc} +18 -20
- data/Rakefile +25 -59
- data/bin/stickler +10 -3
- data/examples/gemcutter_repo.ru +1 -2
- data/lib/stickler.rb +6 -2
- data/lib/stickler/client.rb +5 -4
- data/lib/stickler/client/delete.rb +50 -0
- data/lib/stickler/client/unyank.rb +50 -0
- data/lib/stickler/middleware.rb +7 -0
- data/lib/stickler/middleware/compression.rb +0 -2
- data/lib/stickler/middleware/gemcutter.rb +16 -7
- data/lib/stickler/middleware/helpers.rb +1 -3
- data/lib/stickler/middleware/index.rb +0 -8
- data/lib/stickler/middleware/local.rb +1 -5
- data/lib/stickler/middleware/mirror.rb +0 -4
- data/lib/stickler/middleware/not_found.rb +0 -1
- data/lib/stickler/repository.rb +9 -5
- data/lib/stickler/repository/index.rb +0 -1
- data/lib/stickler/repository/local.rb +12 -4
- data/lib/stickler/repository/null.rb +0 -1
- data/lib/stickler/repository/remote.rb +40 -20
- data/lib/stickler/repository/remote_mirror.rb +1 -1
- data/lib/stickler/server.rb +1 -9
- data/lib/stickler/server/public/css/blueprint/ie.css +35 -0
- data/lib/stickler/server/public/css/blueprint/screen.css +266 -0
- data/lib/stickler/server/public/css/style.css +19 -0
- data/man/stickler-passenger-config.1 +83 -0
- data/man/stickler-passenger-config.1.ronn +70 -0
- data/man/stickler-server.1 +168 -0
- data/man/stickler-server.1.ronn +84 -0
- data/man/stickler.1 +321 -0
- data/man/stickler.1.ronn +144 -0
- data/spec/data/gemcutter/gems/foo-1.0.0.gem +0 -0
- data/spec/middleware/local_spec.rb +1 -4
- data/spec/middleware/not_found_spec.rb +1 -2
- data/spec/paths_spec.rb +1 -3
- data/spec/repository/api_behavior.rb +34 -4
- data/spec/repository/api_spec.rb +2 -3
- data/spec/repository/index_spec.rb +10 -11
- data/spec/repository/local_spec.rb +10 -12
- data/spec/repository/null_spec.rb +2 -5
- data/spec/repository/remote_spec.rb +3 -5
- data/spec/spec_helper.rb +7 -2
- data/spec/spec_lite_spec.rb +1 -3
- data/tasks/default.rake +274 -0
- data/tasks/this.rb +209 -0
- metadata +142 -85
- data/.bnsignore +0 -14
- data/.gitignore +0 -23
- data/TODO.asciidoc +0 -6
- data/lib/stickler/version.rb +0 -36
- data/man/asciidoc.conf +0 -25
- data/man/stickler-passenger-config.asciidoc +0 -74
- data/man/stickler-server.asciidoc +0 -87
- data/man/stickler.asciidoc +0 -150
- data/tasks/asciidoc.rake +0 -32
- data/tasks/bundler.rake +0 -13
- data/tasks/contribute.rake +0 -36
- data/tasks/man.rake +0 -19
data/man/stickler.1.ronn
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
STICKLER(1)
|
2
|
+
===========
|
3
|
+
|
4
|
+
NAME
|
5
|
+
----
|
6
|
+
stickler - command line program to interact with a stickler-server
|
7
|
+
|
8
|
+
|
9
|
+
SYNOPSIS
|
10
|
+
--------
|
11
|
+
*stickler* [--help] [COMMAND] [COMMAND_OPTIONS] [gemfile(s)]
|
12
|
+
|
13
|
+
|
14
|
+
DESCRIPTION
|
15
|
+
-----------
|
16
|
+
Stickler is a tool to organize and maintain an internal gem repository of
|
17
|
+
proprietary gems and/or a mirror of third party gems.
|
18
|
+
|
19
|
+
The stickler(1) command interacts with an instance of
|
20
|
+
stickler-server(1) to control the publishing and mirroring of ruby
|
21
|
+
gems.
|
22
|
+
|
23
|
+
|
24
|
+
COMMANDS
|
25
|
+
--------
|
26
|
+
*push*:
|
27
|
+
Push one or more gems to a gemserver. This works the same as `gem push`
|
28
|
+
although there is no authorization mechanism.
|
29
|
+
|
30
|
+
*yank*:
|
31
|
+
Remove a gem from the gemserver's index. It will still be available from
|
32
|
+
direct download. This works the same as `gem yank`.
|
33
|
+
|
34
|
+
*mirror*:
|
35
|
+
Pull a specific version of a gem from an upstream gem server and
|
36
|
+
store it in a stickler-server(1).
|
37
|
+
|
38
|
+
*config*:
|
39
|
+
Access or update the stickler client configuration.
|
40
|
+
|
41
|
+
*list*:
|
42
|
+
List all the gems in the remote repository.
|
43
|
+
|
44
|
+
*unyank*:
|
45
|
+
Put a gem that was _yanked_ back into the gemserver index. This reverses a
|
46
|
+
`yank`.
|
47
|
+
|
48
|
+
OPTIONS
|
49
|
+
-------
|
50
|
+
These are the options for all commands. Not all options apply to all commands.
|
51
|
+
|
52
|
+
*-a, --add*:
|
53
|
+
Add the `--server` or `--upstream` items to the config file when using the
|
54
|
+
`config` command.
|
55
|
+
|
56
|
+
*-d, --debug*:
|
57
|
+
Output debug information
|
58
|
+
|
59
|
+
*-g, --gem-version*='VERSION':
|
60
|
+
The version of the gem to yank from `--server` or to mirror from
|
61
|
+
`--upstream`.
|
62
|
+
|
63
|
+
*-h, --help*:
|
64
|
+
Show the help message
|
65
|
+
|
66
|
+
*-l, --list*:
|
67
|
+
Display the current configuration when using the `config` command.
|
68
|
+
|
69
|
+
*-p, --platform*='PLATFORM':
|
70
|
+
The platform of the gem to yank from `--server` or to mirror from
|
71
|
+
`--upstream` (e.g. ruby, java, mswin32)
|
72
|
+
|
73
|
+
*-s, --server*='SERVER':
|
74
|
+
The gem server or stickler-server(1) URL. This is used by all the commands.
|
75
|
+
|
76
|
+
*-u, --upstream*='SERVER':
|
77
|
+
The upstream server from which to mirror a gem when using the `mirror`
|
78
|
+
command.
|
79
|
+
|
80
|
+
*-v, --version*:
|
81
|
+
Output the version.
|
82
|
+
|
83
|
+
|
84
|
+
CONFIGURATION
|
85
|
+
-------------
|
86
|
+
Stickler uses the `.gem/stickler` file to hold its configuration. It is a yaml
|
87
|
+
file and Currently there are two options. These are altered using the `stickler
|
88
|
+
config` command.
|
89
|
+
|
90
|
+
*upstream*: The default upstream server from which to mirror gems.
|
91
|
+
*server*: The default linkstick:stickler-server[1] to interact with.
|
92
|
+
|
93
|
+
An example config file
|
94
|
+
|
95
|
+
---
|
96
|
+
:server: http://stickler.example.com
|
97
|
+
:upstream: https://rubygems.org
|
98
|
+
|
99
|
+
|
100
|
+
EXAMPLES
|
101
|
+
--------
|
102
|
+
Push the local `my_gem-1.0.0.gem` file to the stickler-server(1) at
|
103
|
+
*stickler.example.com*
|
104
|
+
|
105
|
+
stickler push ./my_gem-1.0.0.gem --server http://stickler.example.com/
|
106
|
+
|
107
|
+
Push all the gems in the `pkg` directory to the stickler-server(1) at
|
108
|
+
*stickler.example.com*
|
109
|
+
|
110
|
+
stickler push --server http://stickler.example.com/ ./pkg/*.gem
|
111
|
+
|
112
|
+
Yank vesion 1.0.0 of my_gem from the gem index on sticker.example.com
|
113
|
+
|
114
|
+
stickler yank my_gem --version 1.0.0 --server http://stickler.example.com/
|
115
|
+
|
116
|
+
Take the +third_party+ gem, version +1.4.2+ that is on *rubygems.org* and mirror
|
117
|
+
it on *stickler.example.com*
|
118
|
+
|
119
|
+
stickler mirror third_party_gem --gem-version 0.4.2 --upstream http://rubygems.org/ --server http://stickler.example.com/
|
120
|
+
stickler mirror --help
|
121
|
+
|
122
|
+
Set the `server` and `upstream` configration values in the `.gem/stickler` file.
|
123
|
+
|
124
|
+
stickler config --add --server http://stickler.example.com --upstream http://rubygems.org/
|
125
|
+
|
126
|
+
|
127
|
+
SEE ALSO
|
128
|
+
--------
|
129
|
+
stickler-server(1), stickler-passenger-config(1)
|
130
|
+
|
131
|
+
|
132
|
+
AUTHOR
|
133
|
+
------
|
134
|
+
Written by Jeremy Hinegardner <jeremy@copiousfreetime.org>
|
135
|
+
|
136
|
+
|
137
|
+
RESOURCES
|
138
|
+
---------
|
139
|
+
[GitHub project](https://www.github.com/copiousfreetime/stickler)
|
140
|
+
|
141
|
+
|
142
|
+
BUGS
|
143
|
+
----
|
144
|
+
Please report bugs to the [github issue tracker](https://github.com/copiousfreetime/stickler/issues)
|
Binary file
|
data/spec/paths_spec.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'stickler/repository/api'
|
2
|
-
|
3
1
|
shared_examples_for "includes Repository::Api" do
|
4
2
|
describe "responds to all the api methods" do
|
5
3
|
Stickler::Repository::Api.api_methods.each do |method|
|
@@ -62,8 +60,8 @@ shared_examples_for "implements Repository::Api" do
|
|
62
60
|
it "deletes a gem from the repo" do
|
63
61
|
@repo.search_for( @foo_spec ).should be_empty
|
64
62
|
@repo.push( @foo_gem_local_path )
|
65
|
-
@repo.search_for( @foo_spec ).size.should
|
66
|
-
@repo.delete( @foo_spec ).should
|
63
|
+
@repo.search_for( @foo_spec ).size.should eq 1
|
64
|
+
@repo.delete( @foo_spec ).should eq true
|
67
65
|
@repo.search_for( @foo_spec ).should be_empty
|
68
66
|
end
|
69
67
|
|
@@ -104,6 +102,38 @@ shared_examples_for "implements Repository::Api" do
|
|
104
102
|
|
105
103
|
end
|
106
104
|
|
105
|
+
describe "#unyank" do
|
106
|
+
before( :each ) do
|
107
|
+
@repo.search_for( @foo_spec ).should be_empty
|
108
|
+
@repo.push( @foo_gem_local_path )
|
109
|
+
end
|
110
|
+
|
111
|
+
it "returns nil if the gem to unyank does not exist" do
|
112
|
+
non_existing_gem = @missing_spec
|
113
|
+
@repo.unyank( non_existing_gem ).should be_nil
|
114
|
+
end
|
115
|
+
|
116
|
+
#Do we even care about this?
|
117
|
+
xit "returns nil if the gem to unyank has not been yanked" do
|
118
|
+
@repo.unyank( @foo_spec ).should be_nil
|
119
|
+
end
|
120
|
+
|
121
|
+
context " when file has been yanked" do
|
122
|
+
before :each do
|
123
|
+
@repo.yank( @foo_spec )
|
124
|
+
end
|
125
|
+
|
126
|
+
it "return true if the gem is successfully unyanked" do
|
127
|
+
@repo.unyank( @foo_spec ).should be_true
|
128
|
+
end
|
129
|
+
|
130
|
+
it "finds the gem in a search" do
|
131
|
+
@repo.unyank( @foo_spec )
|
132
|
+
@repo.search_for( @foo_spec ).should_not be_empty
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
107
137
|
describe "#search_for" do
|
108
138
|
it "returns specs for items that are found" do
|
109
139
|
@repo.push( @foo_gem_local_path )
|
data/spec/repository/api_spec.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'repository/api_behavior'
|
3
3
|
|
4
|
-
require 'stickler/repository/api'
|
5
4
|
module Stickler::Repository
|
6
5
|
class Stub
|
7
6
|
include Stickler::Repository::Api
|
@@ -1,5 +1,4 @@
|
|
1
|
-
require
|
2
|
-
require 'stickler/repository/index'
|
1
|
+
require 'spec_helper'
|
3
2
|
|
4
3
|
describe ::Stickler::Repository::Index do
|
5
4
|
|
@@ -20,28 +19,28 @@ describe ::Stickler::Repository::Index do
|
|
20
19
|
end
|
21
20
|
|
22
21
|
it "indexes all the .gemspec files in the directory" do
|
23
|
-
@index.specs.size.should
|
22
|
+
@index.specs.size.should eq @specifications.size
|
24
23
|
end
|
25
24
|
|
26
25
|
it "is able to notice changes in the index" do
|
27
|
-
@index.specs.size.should
|
26
|
+
@index.specs.size.should eq @specifications.size
|
28
27
|
FileUtils.rm( File.join( @index_me, "foo-1.0.0.gemspec" ) )
|
29
|
-
@index.specs.size.should
|
28
|
+
@index.specs.size.should eq( @specifications.size - 1 )
|
30
29
|
end
|
31
30
|
|
32
31
|
it "knows just the latest specs" do
|
33
|
-
@index.latest_specs.size.should
|
34
|
-
@index.latest_specs.collect { |s| s.full_name }.sort.should
|
32
|
+
@index.latest_specs.size.should eq(@specifications.size - 1)
|
33
|
+
@index.latest_specs.collect { |s| s.full_name }.sort.should eq(%w[ bar-1.0.0 baz-3.1.4 baz-3.1.4-java foo-1.0.0 ])
|
35
34
|
end
|
36
35
|
|
37
36
|
it "knows the pre-release specs" do
|
38
|
-
@index.prerelease_specs.size.should
|
39
|
-
@index.prerelease_specs.first.full_name.should
|
37
|
+
@index.prerelease_specs.size.should eq 1
|
38
|
+
@index.prerelease_specs.first.full_name.should eq "foo-2.0.0a"
|
40
39
|
end
|
41
40
|
|
42
41
|
it "knows the released specs" do
|
43
|
-
@index.released_specs.size.should
|
44
|
-
@index.released_specs.collect { |s| s.full_name }.sort.should
|
42
|
+
@index.released_specs.size.should eq 4
|
43
|
+
@index.released_specs.collect { |s| s.full_name }.sort.should eq(%w[ bar-1.0.0 baz-3.1.4 baz-3.1.4-java foo-1.0.0 ])
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
@@ -1,7 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
require 'stickler/repository/local'
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'repository/api_behavior'
|
5
3
|
|
6
4
|
describe ::Stickler::Repository::Local do
|
7
5
|
|
@@ -19,8 +17,8 @@ describe ::Stickler::Repository::Local do
|
|
19
17
|
%w[ gems specifications ].each do |sub_dir|
|
20
18
|
it "creates #{sub_dir} directory" do
|
21
19
|
new_dir = File.join( @repo_dir , sub_dir ) + File::SEPARATOR
|
22
|
-
File.directory?( new_dir ).should
|
23
|
-
@repo.send( "#{sub_dir}_dir" ).should
|
20
|
+
File.directory?( new_dir ).should eq true
|
21
|
+
@repo.send( "#{sub_dir}_dir" ).should eq new_dir
|
24
22
|
end
|
25
23
|
|
26
24
|
end
|
@@ -29,20 +27,20 @@ describe ::Stickler::Repository::Local do
|
|
29
27
|
Dir.glob( File.join( @gems_dir, "*.gem" ) ).each do |gem|
|
30
28
|
@repo.push( gem )
|
31
29
|
end
|
32
|
-
@repo.specs.size.should
|
30
|
+
@repo.specs.size.should eq 5
|
33
31
|
end
|
34
32
|
|
35
33
|
it "two instances with the same repo dir are the same object" do
|
36
34
|
repo2 = ::Stickler::Repository::Local.new( File.join(@repos_dir, '1') )
|
37
|
-
repo2.object_id.should
|
38
|
-
::Stickler::Repository::Local.repos.size.should
|
35
|
+
repo2.object_id.should eq @repo.object_id
|
36
|
+
::Stickler::Repository::Local.repos.size.should eq 1
|
39
37
|
end
|
40
38
|
|
41
39
|
|
42
40
|
it "keeps track of all the repository instances" do
|
43
|
-
|
44
|
-
|
45
|
-
::Stickler::Repository::Local.repos.size.should
|
41
|
+
::Stickler::Repository::Local.new( File.join(@repos_dir, "2" ) )
|
42
|
+
::Stickler::Repository::Local.new( File.join(@repos_dir, "3" ) )
|
43
|
+
::Stickler::Repository::Local.repos.size.should eq 3
|
46
44
|
end
|
47
45
|
|
48
46
|
it_should_behave_like 'includes Repository::Api'
|
@@ -1,8 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
require 'stickler/repository/null'
|
5
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'repository/api_behavior'
|
6
3
|
describe ::Stickler::Repository::Null do
|
7
4
|
|
8
5
|
before do
|
@@ -1,7 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
require 'stickler/repository/remote'
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'repository/api_behavior'
|
5
3
|
|
6
4
|
class SticklerTestServer
|
7
5
|
def initialize( spec_dir, ru_file )
|
@@ -23,7 +21,7 @@ class SticklerTestServer
|
|
23
21
|
Excon.get( @repo_uri + "specs.#{Gem.marshal_version}.gz" )
|
24
22
|
#puts "rackup started with pid #{IO.read( @pid_file )}"
|
25
23
|
break
|
26
|
-
rescue
|
24
|
+
rescue
|
27
25
|
tries += 1
|
28
26
|
sleep tries * 0.1
|
29
27
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
-
|
1
|
+
if RUBY_VERSION >= '1.9.2' then
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start if ENV['COVERAGE']
|
4
|
+
end
|
5
|
+
|
6
|
+
require "rspec/autorun"
|
7
|
+
require 'stickler'
|
2
8
|
require 'index_spec_helpers'
|
3
9
|
|
4
|
-
require 'stickler/repository/local'
|
5
10
|
|
6
11
|
RSpec.configure do |config|
|
7
12
|
|
data/spec/spec_lite_spec.rb
CHANGED
data/tasks/default.rake
ADDED
@@ -0,0 +1,274 @@
|
|
1
|
+
# vim: syntax=ruby
|
2
|
+
require 'rake/clean'
|
3
|
+
#------------------------------------------------------------------------------
|
4
|
+
# If you want to Develop on this project just run 'rake develop' and you'll
|
5
|
+
# have all you need to get going. If you want to use bundler for development,
|
6
|
+
# then run 'rake develop:using_bundler'
|
7
|
+
#------------------------------------------------------------------------------
|
8
|
+
namespace :develop do
|
9
|
+
|
10
|
+
# Install all the development and runtime dependencies of this gem using the
|
11
|
+
# gemspec.
|
12
|
+
task :default do
|
13
|
+
require 'rubygems/dependency_installer'
|
14
|
+
installer = Gem::DependencyInstaller.new
|
15
|
+
|
16
|
+
This.set_coverage_gem
|
17
|
+
|
18
|
+
puts "Installing gem depedencies needed for development"
|
19
|
+
This.platform_gemspec.dependencies.each do |dep|
|
20
|
+
if dep.matching_specs.empty? then
|
21
|
+
puts "Installing : #{dep}"
|
22
|
+
installer.install dep
|
23
|
+
else
|
24
|
+
puts "Skipping : #{dep} -> already installed #{dep.matching_specs.first.full_name}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
puts "\n\nNow run 'rake test'"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Create a Gemfile that just references the gemspec
|
31
|
+
file 'Gemfile' => :gemspec do
|
32
|
+
File.open( "Gemfile", "w+" ) do |f|
|
33
|
+
f.puts 'source :rubygems'
|
34
|
+
f.puts 'gemspec'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Create a bundler Gemfile"
|
39
|
+
task :using_bundler => 'Gemfile' do
|
40
|
+
puts "Now you can 'bundle'"
|
41
|
+
end
|
42
|
+
|
43
|
+
# Gemfiles are build artifacts
|
44
|
+
CLOBBER << FileList['Gemfile*']
|
45
|
+
end
|
46
|
+
desc "Boostrap development"
|
47
|
+
task :develop => "develop:default"
|
48
|
+
|
49
|
+
#------------------------------------------------------------------------------
|
50
|
+
# Minitest - standard TestTask
|
51
|
+
#------------------------------------------------------------------------------
|
52
|
+
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 ]
|
57
|
+
end
|
58
|
+
task :default => :test
|
59
|
+
task :test_requirements
|
60
|
+
task :test => :test_requirements
|
61
|
+
rescue LoadError
|
62
|
+
This.task_warning( 'test' )
|
63
|
+
end
|
64
|
+
|
65
|
+
#------------------------------------------------------------------------------
|
66
|
+
# RDoc - standard rdoc rake task, although we must make sure to use a more
|
67
|
+
# recent version of rdoc since it is the one that has 'tomdoc' markup
|
68
|
+
#------------------------------------------------------------------------------
|
69
|
+
begin
|
70
|
+
gem 'rdoc' # otherwise we get the wrong task from stdlib
|
71
|
+
require 'rdoc/task'
|
72
|
+
RDoc::Task.new do |t|
|
73
|
+
t.markup = 'tomdoc'
|
74
|
+
t.rdoc_dir = 'doc'
|
75
|
+
t.main = 'README.rdoc'
|
76
|
+
t.title = "#{This.name} #{This.version}"
|
77
|
+
t.rdoc_files.include( '*.rdoc', 'lib/**/*.rb' )
|
78
|
+
end
|
79
|
+
rescue LoadError => le
|
80
|
+
This.task_warning( 'rdoc' )
|
81
|
+
end
|
82
|
+
|
83
|
+
#------------------------------------------------------------------------------
|
84
|
+
# Coverage - optional code coverage, rcov for 1.8 and simplecov for 1.9, so
|
85
|
+
# for the moment only rcov is listed.
|
86
|
+
#------------------------------------------------------------------------------
|
87
|
+
if RUBY_VERSION < "1.9.0"
|
88
|
+
begin
|
89
|
+
require 'rcov/rcovtask'
|
90
|
+
Rcov::RcovTask.new( 'coverage' ) do |t|
|
91
|
+
t.libs << 'spec'
|
92
|
+
t.pattern = 'spec/**/*_spec.rb'
|
93
|
+
t.verbose = true
|
94
|
+
t.rcov_opts << "-x ^/" # remove all the global files
|
95
|
+
t.rcov_opts << "--sort coverage" # so we see the worst files at the top
|
96
|
+
end
|
97
|
+
rescue LoadError
|
98
|
+
This.task_warning( 'rcov' )
|
99
|
+
end
|
100
|
+
else
|
101
|
+
begin
|
102
|
+
require 'simplecov'
|
103
|
+
desc 'Run tests with code coverage'
|
104
|
+
task :coverage do
|
105
|
+
ENV['COVERAGE'] = 'true'
|
106
|
+
Rake::Task[:test].execute
|
107
|
+
end
|
108
|
+
CLOBBER << FileList["coverage"]
|
109
|
+
rescue LoadError
|
110
|
+
This.task_warning( 'simplecov' )
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
#------------------------------------------------------------------------------
|
115
|
+
# Manifest - We want an explicit list of thos files that are to be packaged in
|
116
|
+
# the gem. Most of this is from Hoe.
|
117
|
+
#------------------------------------------------------------------------------
|
118
|
+
namespace 'manifest' do
|
119
|
+
desc "Check the manifest"
|
120
|
+
task :check => :clean do
|
121
|
+
files = FileList["**/*", ".*"].exclude( This.exclude_from_manifest ).to_a.sort
|
122
|
+
files = files.select{ |f| File.file?( f ) }
|
123
|
+
|
124
|
+
tmp = "Manifest.tmp"
|
125
|
+
File.open( tmp, 'w' ) do |f|
|
126
|
+
f.puts files.join("\n")
|
127
|
+
end
|
128
|
+
|
129
|
+
begin
|
130
|
+
sh "diff -du Manifest.txt #{tmp}"
|
131
|
+
ensure
|
132
|
+
rm tmp
|
133
|
+
end
|
134
|
+
puts "Manifest looks good"
|
135
|
+
end
|
136
|
+
|
137
|
+
desc "Generate the manifest"
|
138
|
+
task :generate => :clean do
|
139
|
+
files = %x[ git ls-files ].split("\n").sort
|
140
|
+
files.reject! { |f| f =~ This.exclude_from_manifest }
|
141
|
+
File.open( "Manifest.txt", "w" ) do |f|
|
142
|
+
f.puts files.join("\n")
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
#------------------------------------------------------------------------------
|
148
|
+
# Fixme - look for fixmes and report them
|
149
|
+
#------------------------------------------------------------------------------
|
150
|
+
namespace :fixme do
|
151
|
+
task :default => 'manifest:check' do
|
152
|
+
This.manifest.each do |file|
|
153
|
+
next if file == __FILE__
|
154
|
+
next unless file =~ %r/(txt|rb|md|rdoc|css|html|xml|css)\Z/
|
155
|
+
puts "FIXME: Rename #{file}" if file =~ /fixme/i
|
156
|
+
IO.readlines( file ).each_with_index do |line, idx|
|
157
|
+
prefix = "FIXME: #{file}:#{idx+1}".ljust(42)
|
158
|
+
puts "#{prefix} => #{line.strip}" if line =~ /fixme/i
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def fixme_project_root
|
164
|
+
This.project_path( '../fixme' )
|
165
|
+
end
|
166
|
+
|
167
|
+
def fixme_project_path( subtree )
|
168
|
+
fixme_project_root.join( subtree )
|
169
|
+
end
|
170
|
+
|
171
|
+
def local_fixme_files
|
172
|
+
This.manifest.select { |p| p =~ %r|^tasks/| }
|
173
|
+
end
|
174
|
+
|
175
|
+
def outdated_fixme_files
|
176
|
+
local_fixme_files.reject do |local|
|
177
|
+
upstream = fixme_project_path( local )
|
178
|
+
Digest::SHA256.file( local ) == Digest::SHA256.file( upstream )
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def fixme_up_to_date?
|
183
|
+
outdated_fixme_files.empty?
|
184
|
+
end
|
185
|
+
|
186
|
+
desc "See if the fixme tools are outdated"
|
187
|
+
task :outdated => :release_check do
|
188
|
+
if fixme_up_to_date? then
|
189
|
+
puts "Fixme files are up to date."
|
190
|
+
else
|
191
|
+
outdated_fixme_files.each do |f|
|
192
|
+
puts "#{f} is outdated"
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
desc "Update outdated fixme files"
|
198
|
+
task :update => :release_check do
|
199
|
+
if fixme_up_to_date? then
|
200
|
+
puts "Fixme files are already up to date."
|
201
|
+
else
|
202
|
+
puts "Updating fixme files:"
|
203
|
+
outdated_fixme_files.each do |local|
|
204
|
+
upstream = fixme_project_path( local )
|
205
|
+
puts " * #{local}"
|
206
|
+
FileUtils.cp( upstream, local )
|
207
|
+
end
|
208
|
+
puts "Use your git commands as appropriate."
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
desc "Look for fixmes and report them"
|
213
|
+
task :fixme => "fixme:default"
|
214
|
+
|
215
|
+
#------------------------------------------------------------------------------
|
216
|
+
# Gem Specification
|
217
|
+
#------------------------------------------------------------------------------
|
218
|
+
# Really this is only here to support those who use bundler
|
219
|
+
desc "Build the #{This.name}.gemspec file"
|
220
|
+
task :gemspec do
|
221
|
+
File.open( This.gemspec_file, "wb+" ) do |f|
|
222
|
+
f.write This.platform_gemspec.to_ruby
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
# the gemspec is also a dev artifact and should not be kept around.
|
227
|
+
CLOBBER << This.gemspec_file.to_s
|
228
|
+
|
229
|
+
# The standard gem packaging task, everyone has it.
|
230
|
+
require 'rubygems/package_task'
|
231
|
+
Gem::PackageTask.new( This.platform_gemspec ) do
|
232
|
+
# nothing
|
233
|
+
end
|
234
|
+
|
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
|
+
#------------------------------------------------------------------------------
|
245
|
+
# Release - the steps we go through to do a final release, this is pulled from
|
246
|
+
# a compbination of mojombo's rakegem, hoe and hoe-git
|
247
|
+
#
|
248
|
+
# 1) make sure we are on the master branch
|
249
|
+
# 2) make sure there are no uncommitted items
|
250
|
+
# 3) check the manifest and make sure all looks good
|
251
|
+
# 4) build the gem
|
252
|
+
# 5) do an empty commit to have the commit message of the version
|
253
|
+
# 6) tag that commit as the version
|
254
|
+
# 7) push master
|
255
|
+
# 8) push the tag
|
256
|
+
# 7) pus the gem
|
257
|
+
#------------------------------------------------------------------------------
|
258
|
+
task :release_check do
|
259
|
+
unless `git branch` =~ /^\* master$/
|
260
|
+
abort "You must be on the master branch to release!"
|
261
|
+
end
|
262
|
+
unless `git status` =~ /^nothing to commit/m
|
263
|
+
abort "Nope, sorry, you have unfinished business"
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
desc "Create tag v#{This.version}, build and push #{This.platform_gemspec.full_name} to rubygems.org"
|
268
|
+
task :release => [ :release_check, 'manifest:check', :gem ] do
|
269
|
+
sh "git commit --allow-empty -a -m 'Release #{This.version}'"
|
270
|
+
sh "git tag -a -m 'v#{This.version}' v#{This.version}"
|
271
|
+
sh "git push origin master"
|
272
|
+
sh "git push origin v#{This.version}"
|
273
|
+
sh "gem push pkg/#{This.platform_gemspec.full_name}.gem"
|
274
|
+
end
|