ludy 0.1.10 → 0.1.11
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 +7 -0
- data/Manifest.txt +4 -0
- data/README +1 -1
- data/Rakefile +2 -2
- data/TODO +2 -0
- data/lib/ludy.rb +3 -2
- data/lib/ludy/array/choice.rb +3 -1
- data/lib/ludy/array/combine.rb +1 -1
- data/lib/ludy/array/combos.rb +4 -2
- data/lib/ludy/array/count.rb +3 -1
- data/lib/ludy/array/product.rb +3 -1
- data/lib/ludy/kernel/id.rb +3 -1
- data/lib/ludy/kernel/public_send.rb +3 -1
- data/lib/ludy/kernel/singleton_method.rb +3 -1
- data/lib/ludy/kernel/tap.rb +3 -1
- data/lib/ludy/message_dispatcher.rb +1 -3
- data/lib/ludy/namespace.rb +71 -0
- data/lib/ludy/paginator.rb +3 -2
- data/lib/ludy/proc/curry.rb +31 -28
- data/lib/ludy/symbol/to_proc.rb +3 -1
- data/lib/ludy/tasks/preprocess_cpp.rb +1 -1
- data/lib/ludy/tasks/preprocess_cpp/attr_builder.rb +2 -2
- data/lib/ludy/tasks/preprocess_cpp/debug_hook.rb +3 -2
- data/lib/ludy/tasks/preprocess_cpp/header_guard.rb +2 -2
- data/lib/ludy/tasks/preprocess_cpp/template_forward_parameters.rb +2 -2
- data/lib/ludy/variable.rb +1 -1
- data/lib/ludy/version.rb +9 -0
- data/lib/puzzle_generator/chained_map.rb +1 -1
- data/lib/puzzle_generator/map.rb +2 -2
- data/tasks/ann.rake +76 -0
- data/tasks/annotations.rake +6 -14
- data/tasks/bones.rake +40 -0
- data/tasks/doc.rake +1 -2
- data/tasks/gem.rake +29 -2
- data/tasks/manifest.rake +15 -21
- data/tasks/post_load.rake +22 -8
- data/tasks/setup.rb +52 -14
- data/tasks/spec.rake +13 -0
- data/tasks/test.rake +4 -6
- metadata +8 -2
data/CHANGES
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
= ludy changes history
|
2
2
|
|
3
|
+
== ludy 0.1.11, 2008-03-25
|
4
|
+
|
5
|
+
* fixed tasks function into private method of Kernel.
|
6
|
+
* fixed version comparison.
|
7
|
+
* fixed encoding using # -*- coding: utf-8 -*- instead of $KCODE
|
8
|
+
* updated tasks/preprocess_cpp/debug_hook from std::cerr to std::clog.
|
9
|
+
|
3
10
|
== ludy 0.1.10, 2008.02.07
|
4
11
|
|
5
12
|
* fixed an offset bug in paginator. if the offset was equal to the count,
|
data/Manifest.txt
CHANGED
@@ -51,6 +51,7 @@ lib/ludy/kernel/tap.rb
|
|
51
51
|
lib/ludy/lazy.rb
|
52
52
|
lib/ludy/list.rb
|
53
53
|
lib/ludy/message_dispatcher.rb
|
54
|
+
lib/ludy/namespace.rb
|
54
55
|
lib/ludy/paginator.rb
|
55
56
|
lib/ludy/pattern_matcher.rb
|
56
57
|
lib/ludy/proc.rb
|
@@ -71,6 +72,7 @@ lib/ludy/tasks/preprocess_cpp/header_guard.rb
|
|
71
72
|
lib/ludy/tasks/preprocess_cpp/template_forward_parameters.rb
|
72
73
|
lib/ludy/timer.rb
|
73
74
|
lib/ludy/variable.rb
|
75
|
+
lib/ludy/version.rb
|
74
76
|
lib/ludy/y_combinator.rb
|
75
77
|
lib/ludy/z_combinator.rb
|
76
78
|
lib/puzzle_generator.rb
|
@@ -82,7 +84,9 @@ lib/puzzle_generator/misc.rb
|
|
82
84
|
lib/puzzle_generator/puzzle.rb
|
83
85
|
spec/ludy_spec.rb
|
84
86
|
spec/spec_helper.rb
|
87
|
+
tasks/ann.rake
|
85
88
|
tasks/annotations.rake
|
89
|
+
tasks/bones.rake
|
86
90
|
tasks/doc.rake
|
87
91
|
tasks/gem.rake
|
88
92
|
tasks/manifest.rake
|
data/README
CHANGED
data/Rakefile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
# Look in the tasks/setup.rb file for the various options that can be
|
2
3
|
# configured in this Rakefile. The .rake files in the tasks directory
|
3
4
|
# are where the options are used.
|
4
|
-
|
5
5
|
load 'tasks/setup.rb'
|
6
6
|
|
7
7
|
ensure_in_path 'lib'
|
@@ -16,7 +16,7 @@ task :default do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
PROJ.name = 'ludy'
|
19
|
-
PROJ.authors =
|
19
|
+
PROJ.authors = 'Lin Jen-Shin (a.k.a. godfat 真常)'
|
20
20
|
PROJ.email = 'strip any number: 18god29fat7029 (at] godfat32 -dooot- 20org'
|
21
21
|
PROJ.url = 'http://ludy.rubyforge.org/'
|
22
22
|
PROJ.description = PROJ.summary = paragraphs_of('README', 'description').join("\n\n")
|
data/TODO
CHANGED
data/lib/ludy.rb
CHANGED
@@ -3,13 +3,14 @@
|
|
3
3
|
# Equivalent to a header guard in C/C++
|
4
4
|
# Used to prevent the class/module from being loaded more than once
|
5
5
|
unless defined? LudyHeaderGuard
|
6
|
+
|
6
7
|
module LudyHeaderGuard # :nodoc:
|
7
8
|
end
|
8
9
|
|
9
10
|
module Ludy
|
10
11
|
|
11
12
|
# :stopdoc:
|
12
|
-
VERSION = '0.1.
|
13
|
+
VERSION = '0.1.11'
|
13
14
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
14
15
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
15
16
|
$LOAD_PATH << LIBPATH
|
@@ -53,7 +54,7 @@ module Ludy
|
|
53
54
|
# require all files in the dir, only work for ludy.
|
54
55
|
# i.e., Ludy.require_all_in 'proc' => require 'ludy/proc/*.rb'
|
55
56
|
def self.require_all_in dir
|
56
|
-
require 'rubygems'
|
57
|
+
require 'rubygems'
|
57
58
|
require 'rake'
|
58
59
|
Dir.glob("#{LIBPATH}ludy/#{dir}/*.rb").each{ |i|
|
59
60
|
require(if dir == '.'
|
data/lib/ludy/array/choice.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
|
2
|
+
require 'ludy/version'
|
3
|
+
|
2
4
|
class Array
|
3
5
|
# it would be defined if RUBY_VERSION < '1.9.0', see rdoc in ruby 1.9
|
4
6
|
def choice
|
5
7
|
self[rand(size)]
|
6
|
-
end if
|
8
|
+
end if Ludy::ruby_before '1.9.0'
|
7
9
|
# the choosen element would be deleted. return the choosen
|
8
10
|
def choice!
|
9
11
|
i = rand size
|
data/lib/ludy/array/combine.rb
CHANGED
data/lib/ludy/array/combos.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
|
2
|
+
require 'ludy/version'
|
3
|
+
|
2
4
|
class Array
|
3
|
-
if
|
5
|
+
if Ludy::ruby_before '1.9.0'
|
4
6
|
require 'ludy/array/foldr'
|
5
|
-
require 'ludy/symbol/to_proc' if
|
7
|
+
require 'ludy/symbol/to_proc' if Ludy::ruby_before '1.9.0'
|
6
8
|
# for each combos
|
7
9
|
# [[0,1],[2,3]].combos
|
8
10
|
# => [[0,2],[0,3],[1,2],[1,3]]
|
data/lib/ludy/array/count.rb
CHANGED
data/lib/ludy/array/product.rb
CHANGED
data/lib/ludy/kernel/id.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
|
2
|
+
require 'ludy/version'
|
3
|
+
|
2
4
|
module Kernel
|
3
|
-
if
|
5
|
+
if Ludy::ruby_before '1.9.0'
|
4
6
|
# it would be defined if RUBY_VERSION < '1.9.0', see rdoc in ruby 1.9
|
5
7
|
def define_singleton_method msg, &block
|
6
8
|
self.class.__send__ :define_method, msg, &block
|
data/lib/ludy/kernel/tap.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
# module Ludy
|
3
|
+
# def use_module mod
|
4
|
+
# user = self.class
|
5
|
+
# mod.constants.each{ |const|
|
6
|
+
# target = mod.const_get const
|
7
|
+
# if user.const_defined? const
|
8
|
+
# origin = user.const_get const
|
9
|
+
# if origin.kind_of? Class and target.kind_of? Class
|
10
|
+
# # TODO: don't just override it!
|
11
|
+
# target.instance_methods.sort.each{ |method|
|
12
|
+
# origin.class.module_eval do
|
13
|
+
# # define_method method, target.instance_method(method)
|
14
|
+
# end
|
15
|
+
# }
|
16
|
+
# else
|
17
|
+
# # TODO: don't just override it!
|
18
|
+
# user.__send__ :remove_const, const
|
19
|
+
# user.const_set const, target
|
20
|
+
# end
|
21
|
+
# else
|
22
|
+
# user.const_set const, target
|
23
|
+
# end
|
24
|
+
# }
|
25
|
+
# end
|
26
|
+
# def unuse_module mod
|
27
|
+
# mod.constants.each{ |const|
|
28
|
+
# self.class.__send__ :remove_const, const
|
29
|
+
# }
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# module Std
|
34
|
+
# N = 29
|
35
|
+
# class Array
|
36
|
+
# def orz
|
37
|
+
# puts 'orz'
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# # module M
|
43
|
+
# # Ludy::using_module Std
|
44
|
+
# # end
|
45
|
+
#
|
46
|
+
# require 'test/unit'
|
47
|
+
# class ContantsTest < Test::Unit::TestCase
|
48
|
+
# include Ludy
|
49
|
+
# def test_a_global
|
50
|
+
# assert_raise NameError do
|
51
|
+
# N
|
52
|
+
# end
|
53
|
+
# end
|
54
|
+
# def test_b_std
|
55
|
+
# assert_equal 29, Std::N
|
56
|
+
# end
|
57
|
+
# def test_c_using_std
|
58
|
+
# use_module Std
|
59
|
+
# assert_equal 29, N
|
60
|
+
# assert [].respond_to?(:orz)
|
61
|
+
# end
|
62
|
+
# def test_d_using_nil
|
63
|
+
# unuse_module Std
|
64
|
+
# assert 29, Std::N
|
65
|
+
# end
|
66
|
+
# def test_e_global
|
67
|
+
# assert_raise NameError do
|
68
|
+
# N
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
# end
|
data/lib/ludy/paginator.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
|
2
|
-
require 'ludy/
|
2
|
+
require 'ludy/version'
|
3
|
+
require 'ludy/kernel/public_send'
|
3
4
|
|
4
5
|
module Ludy
|
5
6
|
# which was produced by Paginator#page / Paginator#[],
|
@@ -9,7 +10,7 @@ module Ludy
|
|
9
10
|
# was fetched, it won't fetch again. it you need refetch,
|
10
11
|
# call Page#fetch
|
11
12
|
class Page
|
12
|
-
undef_method :to_a if
|
13
|
+
undef_method :to_a if Ludy::ruby_before '1.9.0'
|
13
14
|
# pager to get the original pager; page to get the number of this page
|
14
15
|
attr_reader :pager, :page
|
15
16
|
# don't create a page instance yourself unless you have to
|
data/lib/ludy/proc/curry.rb
CHANGED
@@ -1,39 +1,42 @@
|
|
1
1
|
|
2
|
-
require 'ludy/
|
2
|
+
require 'ludy/version'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
if Ludy::ruby_before '1.9.0'
|
5
|
+
require 'ludy/kernel/public_send'
|
6
|
+
class Proc
|
7
|
+
def __curry__ *pre # :nodoc:
|
8
|
+
lambda{ |*post| self[*(pre + post)] }
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
11
|
+
# make the caller be a curried function
|
12
|
+
# lambda{|a,b,c| [a,b,c]}.curry[1][2][3]
|
13
|
+
# => [1,2,3]
|
14
|
+
def curry
|
15
|
+
class << self
|
16
|
+
alias_method :__call__, :call
|
17
|
+
def call *args, &block # :nodoc:
|
18
|
+
if self.arity == -1
|
19
|
+
begin # let's try if arguments are ready
|
20
|
+
# is there any better way to determine this?
|
21
|
+
# it's hard to detect correct arity value when
|
22
|
+
# Symbol#to_proc happened
|
23
|
+
# e.g., :message_that_you_never_know.to_proc.arity => ?
|
24
|
+
# i'd tried put hacks in Symbol#to_proc, but it's
|
25
|
+
# difficult to implement in correct way
|
26
|
+
# i would try it again in other day
|
27
|
+
self.public_send :__call__, *args, &block
|
28
|
+
rescue ArgumentError # oops, let's curry it
|
29
|
+
method(:call).to_proc.public_send :__curry__, *args
|
30
|
+
end
|
31
|
+
elsif args.size == self.arity
|
25
32
|
self.public_send :__call__, *args, &block
|
26
|
-
|
33
|
+
else
|
27
34
|
method(:call).to_proc.public_send :__curry__, *args
|
28
35
|
end
|
29
|
-
elsif args.size == self.arity
|
30
|
-
self.public_send :__call__, *args, &block
|
31
|
-
else
|
32
|
-
method(:call).to_proc.public_send :__curry__, *args
|
33
36
|
end
|
37
|
+
alias_method :[], :call
|
34
38
|
end
|
35
|
-
|
39
|
+
self
|
36
40
|
end
|
37
|
-
self
|
38
41
|
end
|
39
42
|
end
|
data/lib/ludy/symbol/to_proc.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
|
2
2
|
module Kernel
|
3
|
-
|
3
|
+
private
|
4
4
|
# just like attr_accessor for c++
|
5
5
|
def accessor type, *pros
|
6
6
|
(reader_only type, *pros) +
|
@@ -46,4 +46,4 @@ def member_only type, *pros
|
|
46
46
|
result << "#{@prefix}#{@indent}#{type} #{pros.map{|p|"#{p}_"}.join(", ")};\n"
|
47
47
|
end
|
48
48
|
|
49
|
-
end # of
|
49
|
+
end # of Kernel
|
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'ludy/tasks/common'
|
3
3
|
|
4
4
|
module Kernel
|
5
|
+
private
|
5
6
|
# it simply output:
|
6
7
|
# #ifndef NDEBUG
|
7
8
|
# #include <iostream>
|
@@ -28,8 +29,8 @@ module Kernel
|
|
28
29
|
block.call
|
29
30
|
Ludy::erbout "
|
30
31
|
#ifndef NDEBUG
|
31
|
-
std::
|
32
|
+
std::clog << \"method #{name} called, for \" << this << \" at #{@file}: #{eval '__LINE__', block.binding}\\n\";
|
32
33
|
#endif
|
33
34
|
", block.binding
|
34
35
|
end
|
35
|
-
end
|
36
|
+
end # of Kernel
|
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'ludy/tasks/common'
|
3
3
|
|
4
4
|
module Kernel
|
5
|
-
|
5
|
+
private
|
6
6
|
# C/C++ header guard generator, you shold provide the final #endif yourself,
|
7
7
|
# and you should provide PROJ name for header guard prefix
|
8
8
|
def header_guard random_suffix = nil, &block
|
@@ -14,4 +14,4 @@ def header_guard random_suffix = nil, &block
|
|
14
14
|
Ludy::erbout '#endif', block.binding
|
15
15
|
end
|
16
16
|
|
17
|
-
end # of
|
17
|
+
end # of Kernel
|
@@ -4,7 +4,7 @@ require 'ludy/array/map_with_index'
|
|
4
4
|
require 'ludy/array/tail'
|
5
5
|
|
6
6
|
module Kernel
|
7
|
-
|
7
|
+
private
|
8
8
|
# forward template functions' generator
|
9
9
|
def for_template_parameters_within range, modifiers = ['volatile', 'const volatile']
|
10
10
|
modifiers = ['', 'const'] + modifiers
|
@@ -42,4 +42,4 @@ def arguments args_list
|
|
42
42
|
}.join(', ')
|
43
43
|
end
|
44
44
|
|
45
|
-
end # of
|
45
|
+
end # of Kernel
|
data/lib/ludy/variable.rb
CHANGED
data/lib/ludy/version.rb
ADDED
data/lib/puzzle_generator/map.rb
CHANGED
@@ -3,8 +3,8 @@ require 'puzzle_generator/misc'
|
|
3
3
|
require 'puzzle_generator/chain'
|
4
4
|
|
5
5
|
require 'ludy/kernel/maybe'
|
6
|
-
require 'ludy/array/count'
|
7
|
-
require 'ludy/array/product'
|
6
|
+
require 'ludy/array/count'
|
7
|
+
require 'ludy/array/product'
|
8
8
|
|
9
9
|
module PuzzleGenerator
|
10
10
|
|
data/tasks/ann.rake
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bones/smtp_tls'
|
5
|
+
rescue LoadError
|
6
|
+
require 'net/smtp'
|
7
|
+
end
|
8
|
+
require 'time'
|
9
|
+
|
10
|
+
namespace :ann do
|
11
|
+
|
12
|
+
file PROJ.ann_file do
|
13
|
+
puts "Generating #{PROJ.ann_file}"
|
14
|
+
File.open(PROJ.ann_file,'w') do |fd|
|
15
|
+
fd.puts("#{PROJ.name} version #{PROJ.version}")
|
16
|
+
fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
|
17
|
+
fd.puts(" #{PROJ.url}") if PROJ.url
|
18
|
+
fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
|
19
|
+
fd.puts
|
20
|
+
fd.puts("== DESCRIPTION")
|
21
|
+
fd.puts
|
22
|
+
fd.puts(PROJ.description)
|
23
|
+
fd.puts
|
24
|
+
fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
|
25
|
+
fd.puts
|
26
|
+
PROJ.ann_paragraphs.each do |p|
|
27
|
+
fd.puts "== #{p.upcase}"
|
28
|
+
fd.puts
|
29
|
+
fd.puts paragraphs_of(PROJ.readme_file, p).join("\n\n")
|
30
|
+
fd.puts
|
31
|
+
end
|
32
|
+
fd.puts PROJ.ann_text if PROJ.ann_text
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Create an announcement file"
|
37
|
+
task :announcement => PROJ.ann_file
|
38
|
+
|
39
|
+
desc "Send an email announcement"
|
40
|
+
task :email => PROJ.ann_file do
|
41
|
+
from = PROJ.ann_email[:from] || PROJ.email
|
42
|
+
to = Array(PROJ.ann_email[:to])
|
43
|
+
|
44
|
+
### build a mail header for RFC 822
|
45
|
+
rfc822msg = "From: #{from}\n"
|
46
|
+
rfc822msg << "To: #{to.join(',')}\n"
|
47
|
+
rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
|
48
|
+
rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
|
49
|
+
rfc822msg << "\n"
|
50
|
+
rfc822msg << "Date: #{Time.new.rfc822}\n"
|
51
|
+
rfc822msg << "Message-Id: "
|
52
|
+
rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{PROJ.ann_email[:domain]}>\n\n"
|
53
|
+
rfc822msg << File.read(PROJ.ann_file)
|
54
|
+
|
55
|
+
params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
|
56
|
+
PROJ.ann_email[key]
|
57
|
+
end
|
58
|
+
|
59
|
+
params[3] = PROJ.email if params[3].nil?
|
60
|
+
|
61
|
+
if params[4].nil?
|
62
|
+
STDOUT.write "Please enter your e-mail password (#{params[3]}): "
|
63
|
+
params[4] = STDIN.gets.chomp
|
64
|
+
end
|
65
|
+
|
66
|
+
### send email
|
67
|
+
Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
|
68
|
+
end
|
69
|
+
end # namespace :ann
|
70
|
+
|
71
|
+
desc 'Alias to ann:announcement'
|
72
|
+
task :ann => 'ann:announcement'
|
73
|
+
|
74
|
+
CLOBBER << PROJ.ann_file
|
75
|
+
|
76
|
+
# EOF
|
data/tasks/annotations.rake
CHANGED
@@ -5,23 +5,15 @@ if HAVE_BONES
|
|
5
5
|
desc "Enumerate all annotations"
|
6
6
|
task :notes do
|
7
7
|
Bones::AnnotationExtractor.enumerate(
|
8
|
-
PROJ,
|
8
|
+
PROJ, PROJ.annotation_tags.join('|'), :tag => true)
|
9
9
|
end
|
10
10
|
|
11
11
|
namespace :notes do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
desc "Enumerate all FIXME annotations"
|
18
|
-
task :fixme do
|
19
|
-
Bones::AnnotationExtractor.enumerate(PROJ, "FIXME")
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "Enumerate all TODO annotations"
|
23
|
-
task :todo do
|
24
|
-
Bones::AnnotationExtractor.enumerate(PROJ, "TODO")
|
12
|
+
PROJ.annotation_tags.each do |tag|
|
13
|
+
desc "Enumerate all #{tag} annotations"
|
14
|
+
task tag.downcase.to_sym do
|
15
|
+
Bones::AnnotationExtractor.enumerate(PROJ, tag)
|
16
|
+
end
|
25
17
|
end
|
26
18
|
end
|
27
19
|
|
data/tasks/bones.rake
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
require 'pp'
|
4
|
+
require 'stringio'
|
5
|
+
|
6
|
+
namespace :bones do
|
7
|
+
|
8
|
+
desc 'Show the PROJ open struct'
|
9
|
+
task :debug do |t|
|
10
|
+
atr = if ARGV.length == 2
|
11
|
+
t.application.top_level_tasks.pop
|
12
|
+
end
|
13
|
+
sio = StringIO.new
|
14
|
+
sep = "\n" + ' '*27
|
15
|
+
fmt = "%23s => %s"
|
16
|
+
|
17
|
+
if atr
|
18
|
+
PP.pp(PROJ.send(atr.to_sym), sio, 49)
|
19
|
+
sio.seek 0
|
20
|
+
val = sio.read
|
21
|
+
val = val.split("\n").join(sep)
|
22
|
+
|
23
|
+
puts fmt % [atr, val]
|
24
|
+
else
|
25
|
+
h = PROJ.instance_variable_get(:@table)
|
26
|
+
h.keys.map {|k| k.to_s}.sort.each do |k|
|
27
|
+
sio.truncate 0
|
28
|
+
PP.pp(h[k.to_sym], sio, 49)
|
29
|
+
sio.seek 0
|
30
|
+
val = sio.read
|
31
|
+
val = val.split("\n").join(sep)
|
32
|
+
|
33
|
+
puts fmt % [k, val]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end # namespace :bones
|
39
|
+
|
40
|
+
# EOF
|
data/tasks/doc.rake
CHANGED
@@ -31,7 +31,6 @@ namespace :doc do
|
|
31
31
|
sh "#{RDOC} --ri -o ri ."
|
32
32
|
end
|
33
33
|
|
34
|
-
desc 'Remove ri products'
|
35
34
|
task :clobber_ri do
|
36
35
|
rm_r 'ri' rescue nil
|
37
36
|
end
|
@@ -44,6 +43,6 @@ task :doc => 'doc:rdoc'
|
|
44
43
|
desc 'Remove all build products'
|
45
44
|
task :clobber => %w(doc:clobber_rdoc doc:clobber_ri)
|
46
45
|
|
47
|
-
remove_desc_for_task %w(doc:clobber_rdoc
|
46
|
+
remove_desc_for_task %w(doc:clobber_rdoc)
|
48
47
|
|
49
48
|
# EOF
|
data/tasks/gem.rake
CHANGED
@@ -12,6 +12,7 @@ namespace :gem do
|
|
12
12
|
s.email = PROJ.email
|
13
13
|
s.homepage = Array(PROJ.url).first
|
14
14
|
s.rubyforge_project = PROJ.rubyforge_name
|
15
|
+
s.post_install_message = PROJ.post_install_message
|
15
16
|
|
16
17
|
s.description = PROJ.description
|
17
18
|
|
@@ -62,9 +63,29 @@ namespace :gem do
|
|
62
63
|
puts PROJ.spec.to_ruby
|
63
64
|
end
|
64
65
|
|
65
|
-
Rake::
|
66
|
+
pkg = Rake::PackageTask.new(PROJ.name, PROJ.version) do |pkg|
|
66
67
|
pkg.need_tar = PROJ.need_tar
|
67
68
|
pkg.need_zip = PROJ.need_zip
|
69
|
+
pkg.package_files += PROJ.spec.files
|
70
|
+
end
|
71
|
+
Rake::Task['gem:package'].instance_variable_set(:@full_comment, nil)
|
72
|
+
|
73
|
+
gem_file = if PROJ.spec.platform == Gem::Platform::RUBY
|
74
|
+
"#{pkg.package_name}.gem"
|
75
|
+
else
|
76
|
+
"#{pkg.package_name}-#{PROJ.spec.platform}.gem"
|
77
|
+
end
|
78
|
+
|
79
|
+
desc "Build the gem file #{gem_file}"
|
80
|
+
task :package => "#{pkg.package_dir}/#{gem_file}"
|
81
|
+
|
82
|
+
file "#{pkg.package_dir}/#{gem_file}" => [pkg.package_dir] + PROJ.spec.files do
|
83
|
+
when_writing("Creating GEM") {
|
84
|
+
Gem::Builder.new(PROJ.spec).build
|
85
|
+
verbose(true) {
|
86
|
+
mv gem_file, "#{pkg.package_dir}/#{gem_file}"
|
87
|
+
}
|
88
|
+
}
|
68
89
|
end
|
69
90
|
|
70
91
|
desc 'Install the gem'
|
@@ -74,9 +95,15 @@ namespace :gem do
|
|
74
95
|
|
75
96
|
desc 'Uninstall the gem'
|
76
97
|
task :uninstall do
|
77
|
-
|
98
|
+
installed_list = Gem.source_index.find_name(PROJ.name)
|
99
|
+
if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
|
100
|
+
sh "#{SUDO} #{GEM} uninstall -v '#{PROJ.version}' -i -x #{PROJ.name}"
|
101
|
+
end
|
78
102
|
end
|
79
103
|
|
104
|
+
desc 'Reinstall the gem'
|
105
|
+
task :reinstall => [:uninstall, :install]
|
106
|
+
|
80
107
|
end # namespace :gem
|
81
108
|
|
82
109
|
desc 'Alias to gem:package'
|
data/tasks/manifest.rake
CHANGED
@@ -6,18 +6,11 @@ namespace :manifest do
|
|
6
6
|
|
7
7
|
desc 'Verify the manifest'
|
8
8
|
task :check do
|
9
|
-
fn = '
|
10
|
-
files =
|
11
|
-
exclude = Regexp.new(PROJ.exclude.join('|'))
|
12
|
-
Find.find '.' do |path|
|
13
|
-
path.sub! %r/^(\.\/|\/)/o, ''
|
14
|
-
next unless test ?f, path
|
15
|
-
next if path =~ exclude
|
16
|
-
files << path
|
17
|
-
end
|
9
|
+
fn = PROJ.manifest_file + '.tmp'
|
10
|
+
files = manifest_files
|
18
11
|
|
19
|
-
File.open(fn, 'w') {|fp| fp.puts files
|
20
|
-
lines = %x(#{DIFF} -du
|
12
|
+
File.open(fn, 'w') {|fp| fp.puts files}
|
13
|
+
lines = %x(#{DIFF} -du #{PROJ.manifest_file} #{fn}).split("\n")
|
21
14
|
if HAVE_FACETS_ANSICODE and ENV.has_key?('TERM')
|
22
15
|
lines.map! do |line|
|
23
16
|
case line
|
@@ -34,19 +27,20 @@ namespace :manifest do
|
|
34
27
|
|
35
28
|
desc 'Create a new manifest'
|
36
29
|
task :create do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
path.sub! %r/^(\.\/|\/)/o, ''
|
42
|
-
next unless test ?f, path
|
43
|
-
next if path =~ exclude
|
44
|
-
files << path
|
30
|
+
files = manifest_files
|
31
|
+
unless test(?f, PROJ.manifest_file)
|
32
|
+
files << PROJ.manifest_file
|
33
|
+
files.sort!
|
45
34
|
end
|
35
|
+
File.open(PROJ.manifest_file, 'w') {|fp| fp.puts files}
|
36
|
+
end
|
46
37
|
|
47
|
-
|
48
|
-
|
38
|
+
task :assert do
|
39
|
+
files = manifest_files
|
40
|
+
manifest = File.read(PROJ.manifest_file).split($/)
|
41
|
+
raise "ERROR: #{PROJ.manifest_file} is out of date" unless files == manifest
|
49
42
|
end
|
43
|
+
|
50
44
|
end # namespace :manifest
|
51
45
|
|
52
46
|
desc 'Alias to manifest:check'
|
data/tasks/post_load.rake
CHANGED
@@ -3,16 +3,30 @@
|
|
3
3
|
# This file does not define any rake tasks. It is used to load some project
|
4
4
|
# settings if they are not defined by the user.
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
end
|
6
|
+
PROJ.rdoc_exclude << "^#{Regexp.escape(PROJ.manifest_file)}$"
|
7
|
+
PROJ.exclude << "^#{Regexp.escape(PROJ.ann_file)}$"
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
PROJ.instance_variable_get(:@table).each do |key,val|
|
10
|
+
next unless val.instance_of? Array
|
11
|
+
next if key == :dependencies
|
12
|
+
val.flatten!
|
12
13
|
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
PROJ.changes ||= paragraphs_of(PROJ.history_file, 0..1).join("\n\n")
|
16
|
+
|
17
|
+
PROJ.description ||= paragraphs_of(PROJ.readme_file, 'description').join("\n\n")
|
18
|
+
|
19
|
+
PROJ.summary ||= PROJ.description.split('.').first
|
20
|
+
|
21
|
+
PROJ.files ||=
|
22
|
+
if test(?f, PROJ.manifest_file)
|
23
|
+
files = File.readlines(PROJ.manifest_file).map {|fn| fn.chomp.strip}
|
24
|
+
files.delete ''
|
25
|
+
files
|
26
|
+
else [] end
|
27
|
+
|
28
|
+
PROJ.executables ||= PROJ.files.find_all {|fn| fn =~ %r/^bin/}
|
29
|
+
|
30
|
+
PROJ.rdoc_main ||= PROJ.readme_file
|
17
31
|
|
18
32
|
# EOF
|
data/tasks/setup.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'rake'
|
5
|
+
require 'rake/clean'
|
5
6
|
require 'fileutils'
|
6
7
|
require 'ostruct'
|
7
8
|
|
@@ -17,6 +18,10 @@ PROJ.url = nil
|
|
17
18
|
PROJ.version = ENV['VERSION'] || '0.0.0'
|
18
19
|
PROJ.rubyforge_name = nil
|
19
20
|
PROJ.exclude = %w(tmp$ bak$ ~$ CVS .svn/ ^pkg/ ^doc/)
|
21
|
+
PROJ.release_name = ENV['RELEASE']
|
22
|
+
PROJ.history_file = 'History.txt'
|
23
|
+
PROJ.manifest_file = 'Manifest.txt'
|
24
|
+
PROJ.readme_file = 'README.txt'
|
20
25
|
|
21
26
|
# Rspec
|
22
27
|
PROJ.specs = FileList['spec/**/*_spec.rb']
|
@@ -28,13 +33,16 @@ PROJ.test_file = 'test/all.rb'
|
|
28
33
|
PROJ.test_opts = []
|
29
34
|
|
30
35
|
# Rcov
|
31
|
-
PROJ.
|
36
|
+
PROJ.rcov_dir = 'coverage'
|
37
|
+
PROJ.rcov_opts = %w[--sort coverage -T]
|
38
|
+
PROJ.rcov_threshold = 90.0
|
39
|
+
PROJ.rcov_threshold_exact = false
|
32
40
|
|
33
41
|
# Rdoc
|
34
42
|
PROJ.rdoc_opts = []
|
35
43
|
PROJ.rdoc_include = %w(^lib/ ^bin/ ^ext/ .txt$)
|
36
|
-
PROJ.rdoc_exclude = %w(extconf.rb$
|
37
|
-
PROJ.rdoc_main =
|
44
|
+
PROJ.rdoc_exclude = %w(extconf.rb$)
|
45
|
+
PROJ.rdoc_main = nil
|
38
46
|
PROJ.rdoc_dir = 'doc'
|
39
47
|
PROJ.rdoc_remote_dir = nil
|
40
48
|
|
@@ -45,20 +53,17 @@ PROJ.libs = []
|
|
45
53
|
%w(lib ext).each {|dir| PROJ.libs << dir if test ?d, dir}
|
46
54
|
|
47
55
|
# Gem Packaging
|
48
|
-
PROJ.files =
|
49
|
-
|
50
|
-
files = File.readlines('Manifest.txt').map {|fn| fn.chomp.strip}
|
51
|
-
files.delete ''
|
52
|
-
files
|
53
|
-
else [] end
|
54
|
-
PROJ.executables = PROJ.files.find_all {|fn| fn =~ %r/^bin/}
|
56
|
+
PROJ.files = nil
|
57
|
+
PROJ.executables = nil
|
55
58
|
PROJ.dependencies = []
|
56
59
|
PROJ.need_tar = true
|
57
60
|
PROJ.need_zip = false
|
61
|
+
PROJ.post_install_message = nil
|
58
62
|
|
59
63
|
# File Annotations
|
60
|
-
PROJ.annotation_exclude =
|
64
|
+
PROJ.annotation_exclude = %w(^tasks/setup.rb$)
|
61
65
|
PROJ.annotation_extensions = %w(.txt .rb .erb) << ''
|
66
|
+
PROJ.annotation_tags = %w(FIXME OPTIMIZE TODO)
|
62
67
|
|
63
68
|
# Subversion Repository
|
64
69
|
PROJ.svn = false
|
@@ -67,6 +72,21 @@ PROJ.svn_trunk = 'trunk'
|
|
67
72
|
PROJ.svn_tags = 'tags'
|
68
73
|
PROJ.svn_branches = 'branches'
|
69
74
|
|
75
|
+
# Announce
|
76
|
+
PROJ.ann_file = 'announcement.txt'
|
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
|
+
|
70
90
|
# Load the other rake files in the tasks folder
|
71
91
|
rakefiles = Dir.glob('tasks/*.rake').sort
|
72
92
|
rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
|
@@ -99,8 +119,8 @@ SUDO = if WIN32 then ''
|
|
99
119
|
else '' end
|
100
120
|
end
|
101
121
|
|
102
|
-
RCOV = WIN32 ? 'rcov.
|
103
|
-
GEM = WIN32 ? 'gem.
|
122
|
+
RCOV = WIN32 ? 'rcov.bat' : 'rcov'
|
123
|
+
GEM = WIN32 ? 'gem.bat' : 'gem'
|
104
124
|
|
105
125
|
%w(rcov spec/rake/spectask rubyforge bones facets/ansicode).each do |lib|
|
106
126
|
begin
|
@@ -149,7 +169,10 @@ def depend_on( name, version = nil )
|
|
149
169
|
spec = Gem.source_index.find_name(name).last
|
150
170
|
version = spec.version.to_s if version.nil? and !spec.nil?
|
151
171
|
|
152
|
-
PROJ.dependencies <<
|
172
|
+
PROJ.dependencies << case version
|
173
|
+
when nil; [name]
|
174
|
+
when %r/^\d/; [name, ">= #{version}"]
|
175
|
+
else [name, version] end
|
153
176
|
end
|
154
177
|
|
155
178
|
# Adds the given arguments to the include path if they are not already there
|
@@ -186,4 +209,19 @@ def in_directory( dir, &block )
|
|
186
209
|
end
|
187
210
|
end
|
188
211
|
|
212
|
+
# Scans the current working directory and creates a list of files that are
|
213
|
+
# candidates to be in the manifest.
|
214
|
+
#
|
215
|
+
def manifest_files
|
216
|
+
files = []
|
217
|
+
exclude = Regexp.new(PROJ.exclude.join('|'))
|
218
|
+
Find.find '.' do |path|
|
219
|
+
path.sub! %r/^(\.\/|\/)/o, ''
|
220
|
+
next unless test ?f, path
|
221
|
+
next if path =~ exclude
|
222
|
+
files << path
|
223
|
+
end
|
224
|
+
files.sort!
|
225
|
+
end
|
226
|
+
|
189
227
|
# EOF
|
data/tasks/spec.rake
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# $Id$
|
2
2
|
|
3
3
|
if HAVE_SPEC_RAKE_SPECTASK
|
4
|
+
require 'spec/rake/verify_rcov'
|
4
5
|
|
5
6
|
namespace :spec do
|
6
7
|
|
7
8
|
desc 'Run all specs with basic output'
|
8
9
|
Spec::Rake::SpecTask.new(:run) do |t|
|
10
|
+
t.ruby_opts = PROJ.ruby_opts
|
9
11
|
t.spec_opts = PROJ.spec_opts
|
10
12
|
t.spec_files = PROJ.specs
|
11
13
|
t.libs += PROJ.libs
|
@@ -13,6 +15,7 @@ namespace :spec do
|
|
13
15
|
|
14
16
|
desc 'Run all specs with text output'
|
15
17
|
Spec::Rake::SpecTask.new(:specdoc) do |t|
|
18
|
+
t.ruby_opts = PROJ.ruby_opts
|
16
19
|
t.spec_opts = PROJ.spec_opts + ['--format', 'specdoc']
|
17
20
|
t.spec_files = PROJ.specs
|
18
21
|
t.libs += PROJ.libs
|
@@ -21,12 +24,22 @@ namespace :spec do
|
|
21
24
|
if HAVE_RCOV
|
22
25
|
desc 'Run all specs with RCov'
|
23
26
|
Spec::Rake::SpecTask.new(:rcov) do |t|
|
27
|
+
t.ruby_opts = PROJ.ruby_opts
|
24
28
|
t.spec_opts = PROJ.spec_opts
|
25
29
|
t.spec_files = PROJ.specs
|
26
30
|
t.libs += PROJ.libs
|
27
31
|
t.rcov = true
|
32
|
+
t.rcov_dir = PROJ.rcov_dir
|
28
33
|
t.rcov_opts = PROJ.rcov_opts + ['--exclude', 'spec']
|
29
34
|
end
|
35
|
+
|
36
|
+
RCov::VerifyTask.new(:verify) do |t|
|
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
|
+
end
|
41
|
+
|
42
|
+
task :verify => :rcov
|
30
43
|
end
|
31
44
|
|
32
45
|
end # namespace :spec
|
data/tasks/test.rake
CHANGED
@@ -6,7 +6,7 @@ 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
|
9
|
+
t.test_files = if test(?f, PROJ.test_file) then [PROJ.test_file]
|
10
10
|
else PROJ.tests end
|
11
11
|
t.ruby_opts += PROJ.ruby_opts
|
12
12
|
t.ruby_opts += PROJ.test_opts
|
@@ -15,14 +15,14 @@ namespace :test do
|
|
15
15
|
if HAVE_RCOV
|
16
16
|
desc 'Run rcov on the unit tests'
|
17
17
|
task :rcov => :clobber_rcov do
|
18
|
-
opts = PROJ.rcov_opts.
|
19
|
-
|
18
|
+
opts = PROJ.rcov_opts.dup << '-o' << PROJ.rcov_dir
|
19
|
+
opts = opts.join(' ')
|
20
|
+
files = if test(?f, PROJ.test_file) then [PROJ.test_file]
|
20
21
|
else PROJ.tests end
|
21
22
|
files = files.join(' ')
|
22
23
|
sh "#{RCOV} #{files} #{opts}"
|
23
24
|
end
|
24
25
|
|
25
|
-
desc 'Remove rcov products'
|
26
26
|
task :clobber_rcov do
|
27
27
|
rm_r 'coverage' rescue nil
|
28
28
|
end
|
@@ -35,6 +35,4 @@ task :test => 'test:run'
|
|
35
35
|
|
36
36
|
task :clobber => 'test:clobber_rcov' if HAVE_RCOV
|
37
37
|
|
38
|
-
remove_desc_for_task %w(test:clobber_rcov)
|
39
|
-
|
40
38
|
# EOF
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ludy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Lin Jen-Shin (a.k.a. godfat \xE7\x9C\x9F\xE5\xB8\xB8)"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-03-25 00:00:00 +08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -26,7 +26,9 @@ extra_rdoc_files:
|
|
26
26
|
- README
|
27
27
|
- TODO
|
28
28
|
- bin/ludy
|
29
|
+
- tasks/ann.rake
|
29
30
|
- tasks/annotations.rake
|
31
|
+
- tasks/bones.rake
|
30
32
|
- tasks/doc.rake
|
31
33
|
- tasks/gem.rake
|
32
34
|
- tasks/manifest.rake
|
@@ -90,6 +92,7 @@ files:
|
|
90
92
|
- lib/ludy/lazy.rb
|
91
93
|
- lib/ludy/list.rb
|
92
94
|
- lib/ludy/message_dispatcher.rb
|
95
|
+
- lib/ludy/namespace.rb
|
93
96
|
- lib/ludy/paginator.rb
|
94
97
|
- lib/ludy/pattern_matcher.rb
|
95
98
|
- lib/ludy/proc.rb
|
@@ -110,6 +113,7 @@ files:
|
|
110
113
|
- lib/ludy/tasks/preprocess_cpp/template_forward_parameters.rb
|
111
114
|
- lib/ludy/timer.rb
|
112
115
|
- lib/ludy/variable.rb
|
116
|
+
- lib/ludy/version.rb
|
113
117
|
- lib/ludy/y_combinator.rb
|
114
118
|
- lib/ludy/z_combinator.rb
|
115
119
|
- lib/puzzle_generator.rb
|
@@ -121,7 +125,9 @@ files:
|
|
121
125
|
- lib/puzzle_generator/puzzle.rb
|
122
126
|
- spec/ludy_spec.rb
|
123
127
|
- spec/spec_helper.rb
|
128
|
+
- tasks/ann.rake
|
124
129
|
- tasks/annotations.rake
|
130
|
+
- tasks/bones.rake
|
125
131
|
- tasks/doc.rake
|
126
132
|
- tasks/gem.rake
|
127
133
|
- tasks/manifest.rake
|