stickler 0.1.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/COPYING +339 -0
- data/HISTORY +4 -0
- data/LICENSE +54 -0
- data/README +86 -0
- data/bin/stickler +58 -0
- data/data/stickler.yml +14 -0
- data/gemspec.rb +62 -0
- data/lib/stickler.rb +19 -0
- data/lib/stickler/cli.rb +302 -0
- data/lib/stickler/configuration.rb +74 -0
- data/lib/stickler/console.rb +72 -0
- data/lib/stickler/paths.rb +62 -0
- data/lib/stickler/repository.rb +502 -0
- data/lib/stickler/source.rb +76 -0
- data/lib/stickler/source_group.rb +365 -0
- data/lib/stickler/spec_lite.rb +48 -0
- data/lib/stickler/version.rb +36 -0
- data/spec/configuration_spec.rb +68 -0
- data/spec/paths_spec.rb +25 -0
- data/spec/repository_spec.rb +55 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/version_spec.rb +17 -0
- data/tasks/announce.rake +39 -0
- data/tasks/config.rb +107 -0
- data/tasks/distribution.rake +38 -0
- data/tasks/documentation.rake +31 -0
- data/tasks/rspec.rake +29 -0
- data/tasks/rubyforge.rake +51 -0
- data/tasks/utils.rb +80 -0
- metadata +156 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008 Jeremy Hinegardner
|
3
|
+
# All rights reserved. Licensed under the same terms as Ruby. No warranty is
|
4
|
+
# provided. See LICENSE and COPYING for details.
|
5
|
+
#++
|
6
|
+
#
|
7
|
+
module Stickler
|
8
|
+
|
9
|
+
# Version access in every possibly way that people might want to get it.
|
10
|
+
#
|
11
|
+
module Version
|
12
|
+
|
13
|
+
MAJOR = 0
|
14
|
+
MINOR = 1
|
15
|
+
BUILD = 0
|
16
|
+
|
17
|
+
def self.to_ary
|
18
|
+
[ MAJOR, MINOR, BUILD ]
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.to_s
|
22
|
+
self.to_ary.join(".")
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.to_hash
|
26
|
+
{ :major => MAJOR, :minor => MINOR, :build => BUILD }
|
27
|
+
end
|
28
|
+
|
29
|
+
# Version string constant
|
30
|
+
STRING = Version.to_s.freeze
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
# Version string constant
|
35
|
+
VERSION = Version.to_s.freeze
|
36
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__),"spec_helper.rb"))
|
2
|
+
require 'stickler'
|
3
|
+
|
4
|
+
describe Stickler::Configuration do
|
5
|
+
before( :each ) do
|
6
|
+
@config_file_name = "/tmp/stickler.#{Process.pid}.yml"
|
7
|
+
FileUtils.cp Stickler::Paths.data_path( "stickler.yml"), @config_file_name
|
8
|
+
@config = Stickler::Configuration.new( @config_file_name )
|
9
|
+
end
|
10
|
+
|
11
|
+
after( :each ) do
|
12
|
+
FileUtils.rm_f @config_file_name
|
13
|
+
end
|
14
|
+
|
15
|
+
%w[ downstream_source sources ].each do |key|
|
16
|
+
it "has a value for #{key}" do
|
17
|
+
@config.send( key ).should_not == nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has an array of sources" do
|
22
|
+
@config.sources.should be_instance_of( Array )
|
23
|
+
end
|
24
|
+
|
25
|
+
it "can assign an arbitrary key/value pair like a hash" do
|
26
|
+
@config[:foo] = 'bar'
|
27
|
+
@config['foo'].should == 'bar'
|
28
|
+
end
|
29
|
+
|
30
|
+
it "lists its keys" do
|
31
|
+
@config.keys.size.should > 0
|
32
|
+
end
|
33
|
+
|
34
|
+
it "can have gems added to it and reloaded" do
|
35
|
+
d = ::Gem::Dependency.new( 'rake', ">= 0.8.0" )
|
36
|
+
@config.gem_dependencies << d
|
37
|
+
@config.write
|
38
|
+
|
39
|
+
@config = Stickler::Configuration.new( @config_file_name )
|
40
|
+
@config.gem_dependencies.size.should == 1
|
41
|
+
|
42
|
+
@config.gem_dependencies.should be_include d
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
it "can have multiple requirements for each gem" do
|
47
|
+
d1 = ::Gem::Dependency.new( 'rake', ">= 0.8.0" )
|
48
|
+
@config.gem_dependencies << d1
|
49
|
+
d2 = ::Gem::Dependency.new( 'rake', ">= 0.8.0" )
|
50
|
+
@config.gem_dependencies << d2
|
51
|
+
@config.write
|
52
|
+
|
53
|
+
@config = Stickler::Configuration.new( @config_file_name )
|
54
|
+
@config.gem_dependencies.size.should == 2
|
55
|
+
@config.gem_dependencies.should be_include( d1 )
|
56
|
+
@config.gem_dependencies.should be_include( d2 )
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
it "can write the configuration back out to a file" do
|
61
|
+
@config.sources << "http://gems.github.com"
|
62
|
+
@config.write
|
63
|
+
@config = Stickler::Configuration.new( @config_file_name )
|
64
|
+
@config.sources.size.should == 2
|
65
|
+
@config.sources.should be_include( "http://gems.github.com/" )
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
data/spec/paths_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path( File.join( File.dirname( __FILE__ ), "spec_helper.rb" ) )
|
2
|
+
|
3
|
+
describe Stickler::Paths do
|
4
|
+
before(:each) do
|
5
|
+
@root_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
6
|
+
@root_dir += "/"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "root dir should be correct" do
|
10
|
+
Stickler::Paths.root_dir.should == @root_dir
|
11
|
+
end
|
12
|
+
|
13
|
+
it "config_path should be correct" do
|
14
|
+
Stickler::Paths.config_path.should == File.join(@root_dir, "config/")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "data path should be correct" do
|
18
|
+
Stickler::Paths.data_path.should == File.join(@root_dir, "data/")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "lib path should be correct" do
|
22
|
+
Stickler::Paths.lib_path.should == File.join(@root_dir, "lib/")
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__),"spec_helper.rb"))
|
2
|
+
require 'stickler'
|
3
|
+
|
4
|
+
describe Stickler::Repository do
|
5
|
+
|
6
|
+
before( :each ) do
|
7
|
+
@top_dir = File.join( "/tmp/stickler" )
|
8
|
+
@repo = Stickler::Repository.new( 'directory' => @top_dir )
|
9
|
+
Stickler::Console.silent { @repo.setup }
|
10
|
+
end
|
11
|
+
|
12
|
+
after( :each ) do
|
13
|
+
FileUtils.rm_rf( @top_dir )
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
describe "#setup" do
|
18
|
+
%w[ gems log specifications dist cache].each do |sub_dir|
|
19
|
+
it "creates #{sub_dir} directory" do
|
20
|
+
new_dir = File.join( @top_dir , sub_dir )
|
21
|
+
File.directory?( new_dir ).should == true
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "setup creates a default stickler.yml file" do
|
26
|
+
s_yml = File.join( @top_dir, 'stickler.yml' )
|
27
|
+
s = YAML.load_file( s_yml )
|
28
|
+
s['sources'].size.should == 1
|
29
|
+
s['sources'].first.should == "http://gems.rubyforge.org"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "validity checks" do
|
34
|
+
%w[ gems log specifications dist cache].each do |sub_dir|
|
35
|
+
it "raises error if #{sub_dir} is missing" do
|
36
|
+
FileUtils.rmdir( File.join( @top_dir, sub_dir ) )
|
37
|
+
lambda { Stickler::Console.silent { @repo.valid! } }.should raise_error( Stickler::Repository::Error )
|
38
|
+
end
|
39
|
+
|
40
|
+
it "return false if #{sub_dir} is missing" do
|
41
|
+
FileUtils.rmdir( File.join( @top_dir, sub_dir ) )
|
42
|
+
Stickler::Console.silent{ @repo.should_not be_valid }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it "can create a valid directory system" do
|
47
|
+
@repo.should be_valid
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "creates a configuration" do
|
52
|
+
@repo.configuration['sources'].size.should == 1
|
53
|
+
@repo.configuration['sources'].first.should == "http://gems.rubyforge.org/"
|
54
|
+
end
|
55
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__),"spec_helper.rb"))
|
2
|
+
require 'stickler/version'
|
3
|
+
|
4
|
+
describe "Stickler::Version" do
|
5
|
+
it "should have a version string" do
|
6
|
+
Stickler::Version.to_s.should =~ /\d+\.\d+\.\d+/
|
7
|
+
Stickler::VERSION.should =~ /\d+\.\d+\.\d+/
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "has the version accessible as a hash" do
|
11
|
+
[ :major, :minor, :build ].each do |part|
|
12
|
+
it "#{part}" do
|
13
|
+
Stickler::Version.to_hash[ part ].to_s.should =~ /\d+/
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/tasks/announce.rake
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'tasks/config'
|
2
|
+
#-------------------------------------------------------------------------------
|
3
|
+
# announcement methods
|
4
|
+
#-------------------------------------------------------------------------------
|
5
|
+
|
6
|
+
proj_config = Configuration.for('project')
|
7
|
+
namespace :announce do
|
8
|
+
desc "create email for ruby-talk"
|
9
|
+
task :email do
|
10
|
+
info = Utils.announcement
|
11
|
+
|
12
|
+
File.open("email.txt", "w") do |mail|
|
13
|
+
mail.puts "From: #{proj_config.author} <#{proj_config.email}>"
|
14
|
+
mail.puts "To: ruby-talk@ruby-lang.org"
|
15
|
+
mail.puts "Date: #{Time.now.rfc2822}"
|
16
|
+
mail.puts "Subject: [ANN] #{info[:subject]}"
|
17
|
+
mail.puts
|
18
|
+
mail.puts info[:title]
|
19
|
+
mail.puts
|
20
|
+
mail.puts " gem install #{Stickler::GEM_SPEC.name}"
|
21
|
+
mail.puts
|
22
|
+
mail.puts info[:urls]
|
23
|
+
mail.puts
|
24
|
+
mail.puts info[:description]
|
25
|
+
mail.puts
|
26
|
+
mail.puts "{{ Release notes for Version #{Stickler::VERSION} }}"
|
27
|
+
mail.puts
|
28
|
+
mail.puts info[:release_notes]
|
29
|
+
mail.puts
|
30
|
+
end
|
31
|
+
puts "Created the following as email.txt:"
|
32
|
+
puts "-" * 72
|
33
|
+
puts File.read("email.txt")
|
34
|
+
puts "-" * 72
|
35
|
+
end
|
36
|
+
|
37
|
+
CLOBBER << "email.txt"
|
38
|
+
end
|
39
|
+
|
data/tasks/config.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'configuration'
|
2
|
+
|
3
|
+
require 'rake'
|
4
|
+
require 'tasks/utils'
|
5
|
+
|
6
|
+
#-----------------------------------------------------------------------
|
7
|
+
# General project configuration
|
8
|
+
#-----------------------------------------------------------------------
|
9
|
+
Configuration.for('project') {
|
10
|
+
name "stickler"
|
11
|
+
version Stickler::Version.to_s
|
12
|
+
author "Jeremy Hinegardner"
|
13
|
+
email "jeremy at copiousfreetime dot org"
|
14
|
+
homepage "http://copiousfreetime.rubyforge.org/stickler"
|
15
|
+
description Utils.section_of("README", "description")
|
16
|
+
summary description.split(".").first
|
17
|
+
history "HISTORY"
|
18
|
+
license FileList["LICENSE", "COPYING"]
|
19
|
+
readme "README"
|
20
|
+
}
|
21
|
+
|
22
|
+
#-----------------------------------------------------------------------
|
23
|
+
# Packaging
|
24
|
+
#-----------------------------------------------------------------------
|
25
|
+
Configuration.for('packaging') {
|
26
|
+
# files in the project
|
27
|
+
proj_conf = Configuration.for('project')
|
28
|
+
files {
|
29
|
+
bin FileList["bin/*"]
|
30
|
+
ext FileList["ext/*.{c,h,rb}"]
|
31
|
+
lib FileList["lib/**/*.rb"]
|
32
|
+
test FileList["spec/**/*.rb", "test/**/*.rb"]
|
33
|
+
data FileList["data/**/*"]
|
34
|
+
tasks FileList["tasks/**/*.r{ake,b}"]
|
35
|
+
rdoc FileList[proj_conf.readme, proj_conf.history,
|
36
|
+
proj_conf.license] + lib
|
37
|
+
all bin + ext + lib + test + data + rdoc + tasks
|
38
|
+
}
|
39
|
+
|
40
|
+
# ways to package the results
|
41
|
+
formats {
|
42
|
+
tgz true
|
43
|
+
zip true
|
44
|
+
gem Configuration::Table.has_key?('gem')
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
#-----------------------------------------------------------------------
|
49
|
+
# Gem packaging
|
50
|
+
#-----------------------------------------------------------------------
|
51
|
+
Configuration.for("gem") {
|
52
|
+
spec "gemspec.rb"
|
53
|
+
Configuration.for('packaging').files.all << spec
|
54
|
+
}
|
55
|
+
|
56
|
+
#-----------------------------------------------------------------------
|
57
|
+
# Testing
|
58
|
+
# - change mode to 'testunit' to use unit testing
|
59
|
+
#-----------------------------------------------------------------------
|
60
|
+
Configuration.for('test') {
|
61
|
+
mode "spec"
|
62
|
+
files Configuration.for("packaging").files.test
|
63
|
+
options %w[ --format specdoc --color ]
|
64
|
+
ruby_opts %w[ ]
|
65
|
+
}
|
66
|
+
|
67
|
+
#-----------------------------------------------------------------------
|
68
|
+
# Rcov
|
69
|
+
#-----------------------------------------------------------------------
|
70
|
+
Configuration.for('rcov') {
|
71
|
+
output_dir "coverage"
|
72
|
+
libs %w[ lib ]
|
73
|
+
rcov_opts %w[ --html ]
|
74
|
+
ruby_opts %w[ ]
|
75
|
+
test_files Configuration.for('packaging').files.test
|
76
|
+
}
|
77
|
+
|
78
|
+
#-----------------------------------------------------------------------
|
79
|
+
# Rdoc
|
80
|
+
#-----------------------------------------------------------------------
|
81
|
+
Configuration.for('rdoc') {
|
82
|
+
files Configuration.for('packaging').files.rdoc
|
83
|
+
main_page files.first
|
84
|
+
title Configuration.for('project').name
|
85
|
+
options %w[ --line-numbers --inline-source ]
|
86
|
+
output_dir "doc"
|
87
|
+
}
|
88
|
+
|
89
|
+
#-----------------------------------------------------------------------
|
90
|
+
# Extensions
|
91
|
+
#-----------------------------------------------------------------------
|
92
|
+
Configuration.for('extension') {
|
93
|
+
configs Configuration.for('packaging').files.ext.find_all { |x|
|
94
|
+
%w[ mkrf_conf.rb extconf.rb ].include?( File.basename(x) )
|
95
|
+
}
|
96
|
+
}
|
97
|
+
#-----------------------------------------------------------------------
|
98
|
+
# Rubyforge
|
99
|
+
#-----------------------------------------------------------------------
|
100
|
+
Configuration.for('rubyforge') {
|
101
|
+
project "copiousfreetime"
|
102
|
+
user "jjh"
|
103
|
+
host "rubyforge.org"
|
104
|
+
rdoc_location "#{user}@#{host}:/var/www/gforge-projects/#{project}/stickler"
|
105
|
+
}
|
106
|
+
|
107
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'tasks/config'
|
2
|
+
|
3
|
+
#-------------------------------------------------------------------------------
|
4
|
+
# Distribution and Packaging
|
5
|
+
#-------------------------------------------------------------------------------
|
6
|
+
if pkg_config = Configuration.for_if_exist?("packaging") then
|
7
|
+
|
8
|
+
require 'gemspec'
|
9
|
+
require 'rake/gempackagetask'
|
10
|
+
require 'rake/contrib/sshpublisher'
|
11
|
+
|
12
|
+
namespace :dist do
|
13
|
+
|
14
|
+
Rake::GemPackageTask.new(Stickler::GEM_SPEC) do |pkg|
|
15
|
+
pkg.need_tar = pkg_config.formats.tgz
|
16
|
+
pkg.need_zip = pkg_config.formats.zip
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Install as a gem"
|
20
|
+
task :install => [:clobber, :package] do
|
21
|
+
sh "sudo gem install pkg/#{Stickler::GEM_SPEC.full_name}.gem"
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Uninstall gem"
|
25
|
+
task :uninstall do
|
26
|
+
sh "sudo gem uninstall -x #{Stickler::GEM_SPEC.name}"
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "dump gemspec"
|
30
|
+
task :gemspec do
|
31
|
+
puts Stickler::GEM_SPEC.to_ruby
|
32
|
+
end
|
33
|
+
|
34
|
+
desc "reinstall gem"
|
35
|
+
task :reinstall => [:uninstall, :repackage, :install]
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'tasks/config'
|
2
|
+
|
3
|
+
#-----------------------------------------------------------------------
|
4
|
+
# Documentation
|
5
|
+
#-----------------------------------------------------------------------
|
6
|
+
|
7
|
+
if rdoc_config = Configuration.for_if_exist?('rdoc') then
|
8
|
+
|
9
|
+
namespace :doc do
|
10
|
+
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
|
13
|
+
# generating documentation locally
|
14
|
+
Rake::RDocTask.new do |rdoc|
|
15
|
+
rdoc.rdoc_dir = rdoc_config.output_dir
|
16
|
+
rdoc.options = rdoc_config.options
|
17
|
+
rdoc.rdoc_files = rdoc_config.files
|
18
|
+
rdoc.title = rdoc_config.title
|
19
|
+
rdoc.main = rdoc_config.main_page
|
20
|
+
end
|
21
|
+
|
22
|
+
if rubyforge_config = Configuration.for_if_exist?('rubyforge') then
|
23
|
+
desc "Deploy the RDoc documentation to #{rubyforge_config.rdoc_location}"
|
24
|
+
task :deploy => :rerdoc do
|
25
|
+
sh "rsync -zav --delete #{rdoc_config.output_dir}/ #{rubyforge_config.rdoc_location}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
data/tasks/rspec.rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
require 'tasks/config'
|
3
|
+
|
4
|
+
#--------------------------------------------------------------------------------
|
5
|
+
# configuration for running rspec. This shows up as the test:default task
|
6
|
+
#--------------------------------------------------------------------------------
|
7
|
+
if spec_config = Configuration.for_if_exist?("test") then
|
8
|
+
if spec_config.mode == "spec" then
|
9
|
+
namespace :test do
|
10
|
+
|
11
|
+
task :default => :spec
|
12
|
+
|
13
|
+
require 'spec/rake/spectask'
|
14
|
+
Spec::Rake::SpecTask.new do |r|
|
15
|
+
r.ruby_opts = spec_config.ruby_opts
|
16
|
+
r.libs = [ Stickler::Paths.lib_path,
|
17
|
+
Stickler::Paths.root_dir ]
|
18
|
+
r.spec_files = spec_config.files
|
19
|
+
r.spec_opts = spec_config.options
|
20
|
+
|
21
|
+
if rcov_config = Configuration.for_if_exist?('rcov') then
|
22
|
+
r.rcov = true
|
23
|
+
r.rcov_dir = rcov_config.output_dir
|
24
|
+
r.rcov_opts = rcov_config.rcov_opts
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|