ludy 0.1.11 → 0.1.13
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/CHANGES +9 -0
- data/README +3 -1
- data/Rakefile +28 -10
- data/TODO +1 -1
- data/lib/ludy/paginator.rb +17 -0
- data/lib/ludy.rb +1 -1
- data/ludy.gemspec +25 -0
- data/spec/spec_helper.rb +1 -1
- data/tasks/ann.rake +19 -14
- data/tasks/bones.rake +6 -25
- data/tasks/gem.rake +46 -36
- data/tasks/git.rake +41 -0
- data/tasks/notes.rake +28 -0
- data/tasks/post_load.rake +18 -11
- data/tasks/{doc.rake → rdoc.rake} +10 -7
- data/tasks/rubyforge.rake +12 -12
- data/tasks/setup.rb +121 -80
- data/tasks/spec.rake +12 -13
- data/tasks/svn.rake +15 -11
- data/tasks/test.rake +6 -6
- data/test/ludy/test_paginator.rb +11 -1
- metadata +69 -26
- data/Manifest.txt +0 -121
- data/tasks/annotations.rake +0 -22
data/tasks/rubyforge.rake
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
# $Id$
|
2
2
|
|
3
|
-
if PROJ.
|
3
|
+
if PROJ.rubyforge.name.valid? && HAVE_RUBYFORGE
|
4
4
|
|
5
5
|
require 'rubyforge'
|
6
6
|
require 'rake/contrib/sshpublisher'
|
7
7
|
|
8
8
|
namespace :gem do
|
9
9
|
desc 'Package and upload to RubyForge'
|
10
|
-
task :release => [:clobber, :package] do |t|
|
10
|
+
task :release => [:clobber, 'gem:package'] do |t|
|
11
11
|
v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
|
12
12
|
abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
|
13
|
-
pkg = "pkg/#{PROJ.
|
13
|
+
pkg = "pkg/#{PROJ.gem._spec.full_name}"
|
14
14
|
|
15
15
|
if $DEBUG then
|
16
|
-
puts "release_id = rf.add_release #{PROJ.
|
17
|
-
puts "rf.add_file #{PROJ.
|
16
|
+
puts "release_id = rf.add_release #{PROJ.rubyforge.name.inspect}, #{PROJ.name.inspect}, #{PROJ.version.inspect}, \"#{pkg}.tgz\""
|
17
|
+
puts "rf.add_file #{PROJ.rubyforge.name.inspect}, #{PROJ.name.inspect}, release_id, \"#{pkg}.gem\""
|
18
18
|
end
|
19
19
|
|
20
|
-
rf = RubyForge.new
|
20
|
+
rf = RubyForge.new.configure
|
21
21
|
puts 'Logging in'
|
22
22
|
rf.login
|
23
23
|
|
@@ -26,12 +26,12 @@ namespace :gem do
|
|
26
26
|
c['release_changes'] = PROJ.changes if PROJ.changes
|
27
27
|
c['preformatted'] = true
|
28
28
|
|
29
|
-
files = [(PROJ.need_tar ? "#{pkg}.tgz" : nil),
|
30
|
-
(PROJ.need_zip ? "#{pkg}.zip" : nil),
|
29
|
+
files = [(PROJ.gem.need_tar ? "#{pkg}.tgz" : nil),
|
30
|
+
(PROJ.gem.need_zip ? "#{pkg}.zip" : nil),
|
31
31
|
"#{pkg}.gem"].compact
|
32
32
|
|
33
33
|
puts "Releasing #{PROJ.name} v. #{PROJ.version}"
|
34
|
-
rf.add_release PROJ.
|
34
|
+
rf.add_release PROJ.rubyforge.name, PROJ.name, PROJ.version, *files
|
35
35
|
end
|
36
36
|
end # namespace :gem
|
37
37
|
|
@@ -44,9 +44,9 @@ namespace :doc do
|
|
44
44
|
)
|
45
45
|
|
46
46
|
host = "#{config['username']}@rubyforge.org"
|
47
|
-
remote_dir = "/var/www/gforge-projects/#{PROJ.
|
48
|
-
remote_dir << PROJ.
|
49
|
-
local_dir = PROJ.
|
47
|
+
remote_dir = "/var/www/gforge-projects/#{PROJ.rubyforge.name}/"
|
48
|
+
remote_dir << PROJ.rdoc.remote_dir if PROJ.rdoc.remote_dir
|
49
|
+
local_dir = PROJ.rdoc.dir
|
50
50
|
|
51
51
|
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
52
52
|
end
|
data/tasks/setup.rb
CHANGED
@@ -6,92 +6,117 @@ require 'rake/clean'
|
|
6
6
|
require 'fileutils'
|
7
7
|
require 'ostruct'
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
PROJ
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
9
|
+
class OpenStruct; undef :gem; end
|
10
|
+
|
11
|
+
PROJ = OpenStruct.new(
|
12
|
+
# Project Defaults
|
13
|
+
:name => nil,
|
14
|
+
:summary => nil,
|
15
|
+
:description => nil,
|
16
|
+
:changes => nil,
|
17
|
+
:authors => nil,
|
18
|
+
:email => nil,
|
19
|
+
:url => "\000",
|
20
|
+
:version => ENV['VERSION'] || '0.0.0',
|
21
|
+
:exclude => %w(tmp$ bak$ ~$ CVS \.svn/ \.git/ ^pkg/),
|
22
|
+
:release_name => ENV['RELEASE'],
|
23
|
+
|
24
|
+
# System Defaults
|
25
|
+
:ruby_opts => %w(-w),
|
26
|
+
:libs => [],
|
27
|
+
:history_file => 'History.txt',
|
28
|
+
:manifest_file => 'Manifest.txt',
|
29
|
+
:readme_file => 'README.txt',
|
30
|
+
|
31
|
+
# Announce
|
32
|
+
:ann => OpenStruct.new(
|
33
|
+
:file => 'announcement.txt',
|
34
|
+
:text => nil,
|
35
|
+
:paragraphs => [],
|
36
|
+
:email => {
|
37
|
+
:from => nil,
|
38
|
+
:to => %w(ruby-talk@ruby-lang.org),
|
39
|
+
:server => 'localhost',
|
40
|
+
:port => 25,
|
41
|
+
:domain => ENV['HOSTNAME'],
|
42
|
+
:acct => nil,
|
43
|
+
:passwd => nil,
|
44
|
+
:authtype => :plain
|
45
|
+
}
|
46
|
+
),
|
47
|
+
|
48
|
+
# Gem Packaging
|
49
|
+
:gem => OpenStruct.new(
|
50
|
+
:dependencies => [],
|
51
|
+
:executables => nil,
|
52
|
+
:extensions => FileList['ext/**/extconf.rb'],
|
53
|
+
:files => nil,
|
54
|
+
:need_tar => true,
|
55
|
+
:need_zip => false,
|
56
|
+
:extras => {}
|
57
|
+
),
|
58
|
+
|
59
|
+
# File Annotations
|
60
|
+
:notes => OpenStruct.new(
|
61
|
+
:exclude => %w(^tasks/setup\.rb$),
|
62
|
+
:extensions => %w(.txt .rb .erb) << '',
|
63
|
+
:tags => %w(FIXME OPTIMIZE TODO)
|
64
|
+
),
|
65
|
+
|
66
|
+
# Rcov
|
67
|
+
:rcov => OpenStruct.new(
|
68
|
+
:dir => 'coverage',
|
69
|
+
:opts => %w[--sort coverage -T],
|
70
|
+
:threshold => 90.0,
|
71
|
+
:threshold_exact => false
|
72
|
+
),
|
73
|
+
|
74
|
+
# Rdoc
|
75
|
+
:rdoc => OpenStruct.new(
|
76
|
+
:opts => [],
|
77
|
+
:include => %w(^lib/ ^bin/ ^ext/ \.txt$),
|
78
|
+
:exclude => %w(extconf\.rb$),
|
79
|
+
:main => nil,
|
80
|
+
:dir => 'doc',
|
81
|
+
:remote_dir => nil
|
82
|
+
),
|
83
|
+
|
84
|
+
# Rubyforge
|
85
|
+
:rubyforge => OpenStruct.new(
|
86
|
+
:name => "\000"
|
87
|
+
),
|
54
88
|
|
55
|
-
#
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
PROJ.ann_text = nil
|
78
|
-
PROJ.ann_paragraphs = []
|
79
|
-
PROJ.ann_email = {
|
80
|
-
:from => nil,
|
81
|
-
:to => %w(ruby-talk@ruby-lang.org),
|
82
|
-
:server => 'localhost',
|
83
|
-
:port => 25,
|
84
|
-
:domain => ENV['HOSTNAME'],
|
85
|
-
:acct => nil,
|
86
|
-
:passwd => nil,
|
87
|
-
:authtype => :plain
|
88
|
-
}
|
89
|
+
# Rspec
|
90
|
+
:spec => OpenStruct.new(
|
91
|
+
:files => FileList['spec/**/*_spec.rb'],
|
92
|
+
:opts => []
|
93
|
+
),
|
94
|
+
|
95
|
+
# Subversion Repository
|
96
|
+
:svn => OpenStruct.new(
|
97
|
+
:root => nil,
|
98
|
+
:path => '',
|
99
|
+
:trunk => 'trunk',
|
100
|
+
:tags => 'tags',
|
101
|
+
:branches => 'branches'
|
102
|
+
),
|
103
|
+
|
104
|
+
# Test::Unit
|
105
|
+
:test => OpenStruct.new(
|
106
|
+
:files => FileList['test/**/test_*.rb'],
|
107
|
+
:file => 'test/all.rb',
|
108
|
+
:opts => []
|
109
|
+
)
|
110
|
+
)
|
89
111
|
|
90
112
|
# Load the other rake files in the tasks folder
|
91
113
|
rakefiles = Dir.glob('tasks/*.rake').sort
|
92
114
|
rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
|
93
115
|
import(*rakefiles)
|
94
116
|
|
117
|
+
# Setup the project libraries
|
118
|
+
%w(lib ext).each {|dir| PROJ.libs << dir if test ?d, dir}
|
119
|
+
|
95
120
|
# Setup some constants
|
96
121
|
WIN32 = %r/djgpp|(cyg|ms|bcc)win|mingw/ =~ RUBY_PLATFORM unless defined? WIN32
|
97
122
|
|
@@ -105,6 +130,7 @@ def quiet( &block )
|
|
105
130
|
ensure
|
106
131
|
STDOUT.reopen io.first
|
107
132
|
STDERR.reopen io.last
|
133
|
+
$stdout, $stderr = STDOUT, STDERR
|
108
134
|
end
|
109
135
|
|
110
136
|
DIFF = if WIN32 then 'diff.exe'
|
@@ -120,6 +146,7 @@ SUDO = if WIN32 then ''
|
|
120
146
|
end
|
121
147
|
|
122
148
|
RCOV = WIN32 ? 'rcov.bat' : 'rcov'
|
149
|
+
RDOC = WIN32 ? 'rdoc.bat' : 'rdoc'
|
123
150
|
GEM = WIN32 ? 'gem.bat' : 'gem'
|
124
151
|
|
125
152
|
%w(rcov spec/rake/spectask rubyforge bones facets/ansicode).each do |lib|
|
@@ -130,6 +157,10 @@ GEM = WIN32 ? 'gem.bat' : 'gem'
|
|
130
157
|
Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", false}
|
131
158
|
end
|
132
159
|
end
|
160
|
+
HAVE_SVN = (Dir.entries(Dir.pwd).include?('.svn') and
|
161
|
+
system("svn --version 2>&1 > #{DEV_NULL}"))
|
162
|
+
HAVE_GIT = (Dir.entries(Dir.pwd).include?('.git') and
|
163
|
+
system("git --version 2>&1 > #{DEV_NULL}"))
|
133
164
|
|
134
165
|
# Reads a file at +path+ and spits out an array of the +paragraphs+
|
135
166
|
# specified.
|
@@ -169,7 +200,7 @@ def depend_on( name, version = nil )
|
|
169
200
|
spec = Gem.source_index.find_name(name).last
|
170
201
|
version = spec.version.to_s if version.nil? and !spec.nil?
|
171
202
|
|
172
|
-
PROJ.dependencies << case version
|
203
|
+
PROJ.gem.dependencies << case version
|
173
204
|
when nil; [name]
|
174
205
|
when %r/^\d/; [name, ">= #{version}"]
|
175
206
|
else [name, version] end
|
@@ -224,4 +255,14 @@ def manifest_files
|
|
224
255
|
files.sort!
|
225
256
|
end
|
226
257
|
|
258
|
+
# We need a "valid" method thtat determines if a string is suitable for use
|
259
|
+
# in the gem specification.
|
260
|
+
#
|
261
|
+
class Object
|
262
|
+
def valid?
|
263
|
+
return !(self.empty? or self == "\000") if self.respond_to?(:to_str)
|
264
|
+
return false
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
227
268
|
# EOF
|
data/tasks/spec.rake
CHANGED
@@ -8,16 +8,16 @@ namespace :spec do
|
|
8
8
|
desc 'Run all specs with basic output'
|
9
9
|
Spec::Rake::SpecTask.new(:run) do |t|
|
10
10
|
t.ruby_opts = PROJ.ruby_opts
|
11
|
-
t.spec_opts = PROJ.
|
12
|
-
t.spec_files = PROJ.
|
11
|
+
t.spec_opts = PROJ.spec.opts
|
12
|
+
t.spec_files = PROJ.spec.files
|
13
13
|
t.libs += PROJ.libs
|
14
14
|
end
|
15
15
|
|
16
16
|
desc 'Run all specs with text output'
|
17
17
|
Spec::Rake::SpecTask.new(:specdoc) do |t|
|
18
18
|
t.ruby_opts = PROJ.ruby_opts
|
19
|
-
t.spec_opts = PROJ.
|
20
|
-
t.spec_files = PROJ.
|
19
|
+
t.spec_opts = PROJ.spec.opts + ['--format', 'specdoc']
|
20
|
+
t.spec_files = PROJ.spec.files
|
21
21
|
t.libs += PROJ.libs
|
22
22
|
end
|
23
23
|
|
@@ -25,21 +25,22 @@ namespace :spec do
|
|
25
25
|
desc 'Run all specs with RCov'
|
26
26
|
Spec::Rake::SpecTask.new(:rcov) do |t|
|
27
27
|
t.ruby_opts = PROJ.ruby_opts
|
28
|
-
t.spec_opts = PROJ.
|
29
|
-
t.spec_files = PROJ.
|
28
|
+
t.spec_opts = PROJ.spec.opts
|
29
|
+
t.spec_files = PROJ.spec.files
|
30
30
|
t.libs += PROJ.libs
|
31
31
|
t.rcov = true
|
32
|
-
t.rcov_dir = PROJ.
|
33
|
-
t.rcov_opts = PROJ.
|
32
|
+
t.rcov_dir = PROJ.rcov.dir
|
33
|
+
t.rcov_opts = PROJ.rcov.opts + ['--exclude', 'spec']
|
34
34
|
end
|
35
35
|
|
36
36
|
RCov::VerifyTask.new(:verify) do |t|
|
37
|
-
t.threshold = PROJ.
|
38
|
-
t.index_html = File.join(PROJ.
|
39
|
-
t.require_exact_threshold = PROJ.
|
37
|
+
t.threshold = PROJ.rcov.threshold
|
38
|
+
t.index_html = File.join(PROJ.rcov.dir, 'index.html')
|
39
|
+
t.require_exact_threshold = PROJ.rcov.threshold_exact
|
40
40
|
end
|
41
41
|
|
42
42
|
task :verify => :rcov
|
43
|
+
remove_desc_for_task %w(spec:clobber_rcov)
|
43
44
|
end
|
44
45
|
|
45
46
|
end # namespace :spec
|
@@ -49,8 +50,6 @@ task :spec => 'spec:run'
|
|
49
50
|
|
50
51
|
task :clobber => 'spec:clobber_rcov' if HAVE_RCOV
|
51
52
|
|
52
|
-
remove_desc_for_task %w(spec:clobber_rcov)
|
53
|
-
|
54
53
|
end # if HAVE_SPEC_RAKE_SPECTASK
|
55
54
|
|
56
55
|
# EOF
|
data/tasks/svn.rake
CHANGED
@@ -1,32 +1,36 @@
|
|
1
1
|
# $Id$
|
2
2
|
|
3
|
+
if HAVE_SVN
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
unless PROJ.svn_root
|
5
|
+
unless PROJ.svn.root
|
7
6
|
info = %x/svn info ./
|
8
7
|
m = %r/^Repository Root:\s+(.*)$/.match(info)
|
9
|
-
PROJ.
|
8
|
+
PROJ.svn.root = (m.nil? ? '' : m[1])
|
10
9
|
end
|
11
|
-
PROJ.
|
10
|
+
PROJ.svn.root = File.join(PROJ.svn.root, PROJ.svn.path) unless PROJ.svn.path.empty?
|
12
11
|
|
13
12
|
namespace :svn do
|
14
13
|
|
14
|
+
# A prerequisites task that all other tasks depend upon
|
15
|
+
task :prereqs
|
16
|
+
|
15
17
|
desc 'Show tags from the SVN repository'
|
16
|
-
task :show_tags do |t|
|
17
|
-
tags = %x/svn list #{File.join(PROJ.
|
18
|
+
task :show_tags => 'svn:prereqs' do |t|
|
19
|
+
tags = %x/svn list #{File.join(PROJ.svn.root, PROJ.svn.tags)}/
|
18
20
|
tags.gsub!(%r/\/$/, '')
|
21
|
+
tags = tags.split("\n").sort {|a,b| b <=> a}
|
19
22
|
puts tags
|
20
23
|
end
|
21
24
|
|
22
25
|
desc 'Create a new tag in the SVN repository'
|
23
|
-
task :create_tag do |t|
|
26
|
+
task :create_tag => 'svn:prereqs' do |t|
|
24
27
|
v = ENV['VERSION'] or abort 'Must supply VERSION=x.y.z'
|
25
28
|
abort "Versions don't match #{v} vs #{PROJ.version}" if v != PROJ.version
|
26
29
|
|
27
|
-
|
30
|
+
svn = PROJ.svn
|
31
|
+
trunk = File.join(svn.root, svn.trunk)
|
28
32
|
tag = "%s-%s" % [PROJ.name, PROJ.version]
|
29
|
-
tag = File.join(
|
33
|
+
tag = File.join(svn.root, svn.tags, tag)
|
30
34
|
msg = "Creating tag for #{PROJ.name} version #{PROJ.version}"
|
31
35
|
|
32
36
|
puts "Creating SVN tag '#{tag}'"
|
@@ -39,6 +43,6 @@ end # namespace :svn
|
|
39
43
|
|
40
44
|
task 'gem:release' => 'svn:create_tag'
|
41
45
|
|
42
|
-
end # if PROJ.svn
|
46
|
+
end # if PROJ.svn.path
|
43
47
|
|
44
48
|
# EOF
|
data/tasks/test.rake
CHANGED
@@ -6,19 +6,19 @@ namespace :test do
|
|
6
6
|
|
7
7
|
Rake::TestTask.new(:run) do |t|
|
8
8
|
t.libs = PROJ.libs
|
9
|
-
t.test_files = if test(?f, PROJ.
|
10
|
-
else PROJ.
|
9
|
+
t.test_files = if test(?f, PROJ.test.file) then [PROJ.test.file]
|
10
|
+
else PROJ.test.files end
|
11
11
|
t.ruby_opts += PROJ.ruby_opts
|
12
|
-
t.ruby_opts += PROJ.
|
12
|
+
t.ruby_opts += PROJ.test.opts
|
13
13
|
end
|
14
14
|
|
15
15
|
if HAVE_RCOV
|
16
16
|
desc 'Run rcov on the unit tests'
|
17
17
|
task :rcov => :clobber_rcov do
|
18
|
-
opts = PROJ.
|
18
|
+
opts = PROJ.rcov.opts.dup << '-o' << PROJ.rcov.dir
|
19
19
|
opts = opts.join(' ')
|
20
|
-
files = if test(?f, PROJ.
|
21
|
-
else PROJ.
|
20
|
+
files = if test(?f, PROJ.test.file) then [PROJ.test.file]
|
21
|
+
else PROJ.test.files end
|
22
22
|
files = files.join(' ')
|
23
23
|
sh "#{RCOV} #{files} #{opts}"
|
24
24
|
end
|
data/test/ludy/test_paginator.rb
CHANGED
@@ -49,7 +49,7 @@ class TestPaginator < Test::Unit::TestCase
|
|
49
49
|
end
|
50
50
|
def test_offset_bug
|
51
51
|
a = (0..9).to_a
|
52
|
-
pager = ArrayPaginator.new a
|
52
|
+
pager = Ludy::ArrayPaginator.new a
|
53
53
|
pager.per_page = 5
|
54
54
|
assert_equal 5, pager[1].size
|
55
55
|
assert_equal 5, pager[2].size
|
@@ -71,4 +71,14 @@ class TestPaginator < Test::Unit::TestCase
|
|
71
71
|
def test_for_array
|
72
72
|
for_pager Ludy::ArrayPaginator.new(TestPaginator.data)
|
73
73
|
end
|
74
|
+
def test_null_paginator
|
75
|
+
nullpage = Ludy::NullPage.instance
|
76
|
+
assert_equal 0, nullpage.page
|
77
|
+
assert_nil nullpage.next
|
78
|
+
assert_equal 0, nullpage.size
|
79
|
+
assert_equal [], nullpage.data
|
80
|
+
assert_equal nullpage.object_id, nullpage.pager.page(0).object_id
|
81
|
+
assert_nil Ludy::Paginator.null.page(1)
|
82
|
+
assert_equal nullpage.object_id, Ludy::Page.null.object_id
|
83
|
+
end
|
74
84
|
end
|