utilrb 1.1 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/{Changes.txt → History.txt} +11 -0
- data/License.txt +2 -2
- data/Manifest.txt +10 -3
- data/README.txt +10 -13
- data/Rakefile +30 -13
- data/ext/extconf.rb +6 -1
- data/ext/{ruby_internals.h → ruby_internals-1.8.h} +0 -0
- data/ext/ruby_internals-1.9.h +48 -0
- data/ext/swap.cc +5 -1
- data/ext/{faster.cc → utilrb_ext.cc} +29 -2
- data/lib/utilrb/column_formatter.rb +1 -1
- data/lib/utilrb/common.rb +21 -18
- data/lib/utilrb/dir.rb +2 -0
- data/lib/utilrb/dir/empty.rb +3 -0
- data/lib/utilrb/enumerable/uniq.rb +1 -1
- data/lib/utilrb/kernel/options.rb +3 -2
- data/lib/utilrb/kernel/swap.rb +1 -1
- data/lib/utilrb/logger/hierarchy.rb +7 -7
- data/lib/utilrb/module/ancestor_p.rb +2 -2
- data/lib/utilrb/module/define_or_reuse.rb +29 -0
- data/lib/utilrb/module/include.rb +15 -12
- data/lib/utilrb/module/inherited_enumerable.rb +4 -0
- data/lib/utilrb/object/address.rb +3 -3
- data/lib/utilrb/object/attribute.rb +2 -2
- data/lib/utilrb/object/singleton_class.rb +40 -47
- data/lib/utilrb/socket/tcp_server.rb +7 -0
- data/lib/utilrb/socket/tcp_socket.rb +7 -0
- data/lib/utilrb/time/to_hms.rb +31 -16
- data/lib/utilrb/value_set.rb +1 -1
- data/test/test_dir.rb +22 -0
- data/test/test_enumerable.rb +2 -2
- data/test/test_kernel.rb +2 -2
- data/test/test_module.rb +61 -53
- data/test/test_object.rb +25 -4
- data/test/test_pkgconfig.rb +0 -1
- data/test/test_proc.rb +23 -20
- data/test/test_time.rb +15 -2
- metadata +86 -61
data/{Changes.txt → History.txt}
RENAMED
@@ -1,3 +1,14 @@
|
|
1
|
+
=== Version 1.2
|
2
|
+
|
3
|
+
* compatibility with ruby 1.9. Some feature are specific 1.8:
|
4
|
+
IO#clearerr, Proc#line, Proc#file and Proc#same_body?.
|
5
|
+
* misc fixes to Time#to_hms and Time.from_hms
|
6
|
+
* migrate to facets >= 2.4.0
|
7
|
+
* fix Object#address on 64bit architectures
|
8
|
+
* new functionality:
|
9
|
+
- socket-related tools (see Socket)
|
10
|
+
- Dir#empty?
|
11
|
+
|
1
12
|
=== Version 1.1
|
2
13
|
|
3
14
|
* changes and fixes:
|
data/License.txt
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
Copyright (c) 2006-
|
2
|
-
2006-
|
1
|
+
Copyright (c) 2006-2008 LAAS/CNRS <openrobots@laas.fr>
|
2
|
+
2006-2008 Sylvain Joyeux <sylvain.joyeux@laas.fr>
|
3
3
|
All rights reserved.
|
4
4
|
|
5
5
|
Redistribution and use in source and binary forms, with or without
|
data/Manifest.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
History.txt
|
2
2
|
License.txt
|
3
3
|
Manifest.txt
|
4
4
|
README.txt
|
@@ -6,8 +6,9 @@ Rakefile
|
|
6
6
|
bm/allocation.rb
|
7
7
|
bm/speed.rb
|
8
8
|
ext/extconf.rb
|
9
|
-
ext/
|
10
|
-
ext/ruby_internals.h
|
9
|
+
ext/utilrb_ext.cc
|
10
|
+
ext/ruby_internals-1.8.h
|
11
|
+
ext/ruby_internals-1.9.h
|
11
12
|
ext/swap.cc
|
12
13
|
ext/value_set.cc
|
13
14
|
lib/utilrb.rb
|
@@ -15,6 +16,8 @@ lib/utilrb/array.rb
|
|
15
16
|
lib/utilrb/array/to_s.rb
|
16
17
|
lib/utilrb/column_formatter.rb
|
17
18
|
lib/utilrb/common.rb
|
19
|
+
lib/utilrb/dir.rb
|
20
|
+
lib/utilrb/dir/empty.rb
|
18
21
|
lib/utilrb/enumerable.rb
|
19
22
|
lib/utilrb/enumerable/null.rb
|
20
23
|
lib/utilrb/enumerable/random_element.rb
|
@@ -44,6 +47,7 @@ lib/utilrb/module/attr_enumerable.rb
|
|
44
47
|
lib/utilrb/module/attr_predicate.rb
|
45
48
|
lib/utilrb/module/cached_enum.rb
|
46
49
|
lib/utilrb/module/define_method.rb
|
50
|
+
lib/utilrb/module/define_or_reuse.rb
|
47
51
|
lib/utilrb/module/include.rb
|
48
52
|
lib/utilrb/module/inherited_enumerable.rb
|
49
53
|
lib/utilrb/object.rb
|
@@ -54,6 +58,8 @@ lib/utilrb/objectstats.rb
|
|
54
58
|
lib/utilrb/pkgconfig.rb
|
55
59
|
lib/utilrb/set.rb
|
56
60
|
lib/utilrb/set/to_s.rb
|
61
|
+
lib/utilrb/socket/tcp_server.rb
|
62
|
+
lib/utilrb/socket/tcp_socket.rb
|
57
63
|
lib/utilrb/time.rb
|
58
64
|
lib/utilrb/time/to_hms.rb
|
59
65
|
lib/utilrb/unbound_method.rb
|
@@ -62,6 +68,7 @@ lib/utilrb/value_set.rb
|
|
62
68
|
test/data/test_pkgconfig.pc
|
63
69
|
test/test_array.rb
|
64
70
|
test/test_config.rb
|
71
|
+
test/test_dir.rb
|
65
72
|
test/test_enumerable.rb
|
66
73
|
test/test_exception.rb
|
67
74
|
test/test_gc.rb
|
data/README.txt
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Utilrb
|
2
2
|
http://utilrb.rubyforge.org
|
3
|
-
http://www.
|
4
|
-
http://
|
3
|
+
http://www.rubyforge.org/projects/utilrb
|
4
|
+
http://github.com/doudou/util-rb (git repository)
|
5
5
|
|
6
|
-
Copyright (c) 2006
|
6
|
+
Copyright (c) 2006-2008
|
7
7
|
Sylvain Joyeux <sylvain.joyeux@m4x.org>
|
8
8
|
LAAS/CNRS <openrobots@laas.fr>
|
9
9
|
|
@@ -13,6 +13,12 @@ This work is licensed under the BSD license. See License.txt for details
|
|
13
13
|
Utilrb is yet another Ruby toolkit, in the spirit of facets. It includes all
|
14
14
|
the standard class extensions I use in my own projects like Genom.rb.
|
15
15
|
|
16
|
+
== Installation
|
17
|
+
The only dependency Utilrb has is flexmock if you want to run tests. It is
|
18
|
+
available as a gem, so you can run
|
19
|
+
|
20
|
+
gem install flexmock
|
21
|
+
|
16
22
|
== Utilrb's C extension
|
17
23
|
Utilrb includes a C extension in ext/. It is optional, but some of the
|
18
24
|
functionalities will be disabled if it is not present. Trying to require
|
@@ -31,14 +37,5 @@ loading. Set it to +no+ to disable the extension, to +yes+ to force it
|
|
31
37
|
(an error is generated if the extension is not available). If the variable
|
32
38
|
is not set, the extension is loaded if available.
|
33
39
|
|
34
|
-
== TODO
|
35
|
-
* put the +block+ argument in front in Module#define_method_with_block. This
|
36
|
-
would allow to do
|
37
|
-
|
38
|
-
define_method_with_block(:bla) do |block, *args|
|
39
|
-
end
|
40
|
-
|
41
|
-
[DONE 20061101125259-1e605-fef189550540b8e096f0bbe6c219d892bf3e13fc.gz]
|
42
|
-
|
43
40
|
== CHANGES
|
44
|
-
:include:
|
41
|
+
:include: History.txt
|
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/rdoctask'
|
3
|
+
|
3
4
|
# FIX: Hoe always calls rdoc with -d, and diagram generation fails here
|
4
5
|
class Rake::RDocTask
|
5
6
|
alias __option_list__ option_list
|
@@ -10,20 +11,24 @@ class Rake::RDocTask
|
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
|
-
require 'hoe'
|
14
14
|
require './lib/utilrb/common'
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
begin
|
17
|
+
require 'hoe'
|
18
|
+
config = Hoe.new('utilrb', Utilrb::VERSION) do |p|
|
19
|
+
p.developer("Sylvain Joyeux", "sylvain.joyeux@m4x.org")
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
p.summary = 'Yet another Ruby toolkit'
|
22
|
+
p.description = p.paragraphs_of('README.txt', 3..6).join("\n\n")
|
23
|
+
p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
|
24
|
+
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
24
25
|
|
25
|
-
|
26
|
-
|
26
|
+
p.extra_deps << ['facets', '>= 2.4.0'] << 'rake'
|
27
|
+
p.rdoc_pattern = /(ext\/.*cc$|lib)|txt/
|
28
|
+
end
|
29
|
+
config.spec.extensions << 'ext/extconf.rb'
|
30
|
+
rescue LoadError
|
31
|
+
puts "cannot load the Hoe gem, distribution is disabled"
|
27
32
|
end
|
28
33
|
|
29
34
|
desc "builds Utilrb's C extension"
|
@@ -33,13 +38,25 @@ task :setup do
|
|
33
38
|
raise "cannot build the C extension"
|
34
39
|
end
|
35
40
|
end
|
36
|
-
FileUtils.ln_sf "
|
41
|
+
FileUtils.ln_sf "../ext/utilrb_ext.so", "lib/utilrb_ext.so"
|
42
|
+
end
|
43
|
+
|
44
|
+
task :clean do
|
45
|
+
puts "Cleaning extension in ext/"
|
46
|
+
FileUtils.rm_f "lib/utilrb_ext.so"
|
47
|
+
if File.file?(File.join('ext', 'Makefile'))
|
48
|
+
Dir.chdir("ext") do
|
49
|
+
system("make clean")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
FileUtils.rm_f "ext/Makefile"
|
53
|
+
FileUtils.rm_f "lib/utilrb_ext.so"
|
37
54
|
end
|
38
55
|
|
39
56
|
task :full_test do
|
40
|
-
ENV['
|
57
|
+
ENV['UTILRB_EXT_MODE'] = 'no'
|
41
58
|
system("testrb test/")
|
42
|
-
ENV['
|
59
|
+
ENV['UTILRB_EXT_MODE'] = 'yes'
|
43
60
|
system("testrb test/")
|
44
61
|
end
|
45
62
|
|
data/ext/extconf.rb
CHANGED
File without changes
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#ifndef __RUBY_INTERNALS_HH__
|
2
|
+
#define __RUBY_INTERNALS_HH__
|
3
|
+
|
4
|
+
/* WARNING: this file contains copies of internal Ruby structures. They are not supposed to be copied (I think ;-)), but I had to nonetheless.
|
5
|
+
* The following methods depend on these:
|
6
|
+
*
|
7
|
+
* Kernel.swap!
|
8
|
+
* Proc#same_body?
|
9
|
+
* Proc#file
|
10
|
+
* Proc#line
|
11
|
+
*/
|
12
|
+
|
13
|
+
#include <ruby.h>
|
14
|
+
#include <ruby/intern.h>
|
15
|
+
#include <ruby/node.h>
|
16
|
+
#include <ruby/re.h>
|
17
|
+
|
18
|
+
typedef struct RVALUE {
|
19
|
+
union {
|
20
|
+
struct {
|
21
|
+
VALUE flags; /* always 0 for freed obj */
|
22
|
+
struct RVALUE *next;
|
23
|
+
} free;
|
24
|
+
struct RBasic basic;
|
25
|
+
struct RObject object;
|
26
|
+
struct RClass klass;
|
27
|
+
struct RFloat flonum;
|
28
|
+
struct RString string;
|
29
|
+
struct RArray array;
|
30
|
+
struct RRegexp regexp;
|
31
|
+
struct RHash hash;
|
32
|
+
struct RData data;
|
33
|
+
struct RStruct rstruct;
|
34
|
+
struct RBignum bignum;
|
35
|
+
struct RFile file;
|
36
|
+
struct RNode node;
|
37
|
+
struct RMatch match;
|
38
|
+
} as;
|
39
|
+
#ifdef GC_DEBUG
|
40
|
+
char *file;
|
41
|
+
int line;
|
42
|
+
#endif
|
43
|
+
} RVALUE;
|
44
|
+
|
45
|
+
static const size_t SLOT_SIZE = sizeof(RVALUE);
|
46
|
+
|
47
|
+
#endif
|
48
|
+
|
data/ext/swap.cc
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
#include <ruby.h>
|
2
2
|
#include <set>
|
3
|
-
|
3
|
+
|
4
|
+
#ifdef RUBY_IS_19
|
5
|
+
#include "ruby_internals-1.9.h"
|
6
|
+
#else
|
7
|
+
#include <rubyio.h>
|
8
|
+
#include "ruby_internals-1.8.h"
|
9
|
+
#endif
|
4
10
|
|
5
11
|
using namespace std;
|
6
12
|
|
@@ -26,6 +32,21 @@ static VALUE enumerable_each_uniq(VALUE self)
|
|
26
32
|
return self;
|
27
33
|
}
|
28
34
|
|
35
|
+
#ifndef RUBY_IS_19
|
36
|
+
/* call-seq:
|
37
|
+
* io.clearerr => nil
|
38
|
+
*
|
39
|
+
* Clear all error flags on the IO
|
40
|
+
*/
|
41
|
+
static VALUE io_clearerr(VALUE self)
|
42
|
+
{
|
43
|
+
OpenFile* file;
|
44
|
+
file = RFILE(self)->fptr;
|
45
|
+
clearerr(file->f);
|
46
|
+
return Qnil;
|
47
|
+
}
|
48
|
+
#endif
|
49
|
+
|
29
50
|
/* call-seq:
|
30
51
|
* Kernel.is_singleton?(object)
|
31
52
|
*
|
@@ -39,6 +60,7 @@ static VALUE kernel_is_singleton_p(VALUE self)
|
|
39
60
|
return Qfalse;
|
40
61
|
}
|
41
62
|
|
63
|
+
#ifndef RUBY_IS_19
|
42
64
|
|
43
65
|
/* call-seq:
|
44
66
|
* proc.same_body?(other) => true or false
|
@@ -92,16 +114,21 @@ static VALUE proc_line(VALUE self)
|
|
92
114
|
return Qnil;
|
93
115
|
}
|
94
116
|
|
117
|
+
#endif
|
118
|
+
|
95
119
|
extern "C" void Init_value_set();
|
96
120
|
extern "C" void Init_swap();
|
97
121
|
|
98
|
-
extern "C" void
|
122
|
+
extern "C" void Init_utilrb_ext()
|
99
123
|
{
|
100
124
|
rb_define_method(rb_mEnumerable, "each_uniq", RUBY_METHOD_FUNC(enumerable_each_uniq), 0);
|
101
125
|
rb_define_method(rb_mKernel, "is_singleton?", RUBY_METHOD_FUNC(kernel_is_singleton_p), 0);
|
126
|
+
#ifndef RUBY_IS_19
|
102
127
|
rb_define_method(rb_cProc, "same_body?", RUBY_METHOD_FUNC(proc_same_body_p), 1);
|
103
128
|
rb_define_method(rb_cProc, "file", RUBY_METHOD_FUNC(proc_file), 0);
|
104
129
|
rb_define_method(rb_cProc, "line", RUBY_METHOD_FUNC(proc_line), 0);
|
130
|
+
rb_define_method(rb_cIO, "clearerr", RUBY_METHOD_FUNC(io_clearerr), 0);
|
131
|
+
#endif
|
105
132
|
|
106
133
|
Init_value_set();
|
107
134
|
Init_swap();
|
data/lib/utilrb/common.rb
CHANGED
@@ -1,46 +1,49 @@
|
|
1
1
|
module Utilrb
|
2
|
-
|
2
|
+
unless defined? Utilrb::VERSION
|
3
|
+
VERSION = "1.2"
|
4
|
+
RUBY_IS_19 = (RUBY_VERSION >= "1.9")
|
5
|
+
end
|
3
6
|
|
4
|
-
unless defined?
|
5
|
-
if ENV['
|
6
|
-
|
7
|
+
unless defined? UTILRB_EXT_MODE
|
8
|
+
if ENV['UTILRB_EXT_MODE'] == 'no'
|
9
|
+
UTILRB_EXT_MODE = nil
|
7
10
|
STDERR.puts "Utilrb: not loading the C extension"
|
8
11
|
else
|
9
12
|
begin
|
10
|
-
require '
|
11
|
-
|
12
|
-
STDERR.puts "Utilrb: loaded C extension" if ENV['
|
13
|
+
require 'utilrb_ext'
|
14
|
+
UTILRB_EXT_MODE = true
|
15
|
+
STDERR.puts "Utilrb: loaded C extension" if ENV['UTILRB_EXT_MODE']
|
13
16
|
rescue LoadError => e
|
14
17
|
raise unless e.message =~ /no such file to load/
|
15
|
-
if ENV['
|
18
|
+
if ENV['UTILRB_EXT_MODE'] == 'yes'
|
16
19
|
raise LoadError, "unable to load Util.rb C extension: #{e.message}"
|
17
20
|
else
|
18
|
-
|
21
|
+
UTILRB_EXT_MODE = nil
|
19
22
|
end
|
20
23
|
end
|
21
24
|
end
|
22
25
|
end
|
23
26
|
|
24
|
-
# Yields if the
|
27
|
+
# Yields if the extension is not present
|
25
28
|
# This is used by Utilrb libraries to provide a
|
26
29
|
# Ruby version if the C extension is not loaded
|
27
|
-
def self.
|
28
|
-
unless
|
30
|
+
def self.unless_ext # :yield:
|
31
|
+
unless UTILRB_EXT_MODE
|
29
32
|
return yield if block_given?
|
30
33
|
end
|
31
34
|
end
|
32
35
|
|
33
|
-
# Yields if the
|
36
|
+
# Yields if the extension is present. This is used for Ruby code
|
34
37
|
# which depends on methods in the C extension
|
35
|
-
def self.
|
36
|
-
|
38
|
+
def self.if_ext(&block)
|
39
|
+
require_ext(nil, &block)
|
37
40
|
end
|
38
41
|
|
39
|
-
# Yields if the
|
42
|
+
# Yields if the extension is present, and
|
40
43
|
# issue a warning otherwise. This is used for Ruby
|
41
44
|
# code which depends on methods in the C extension
|
42
|
-
def self.
|
43
|
-
if
|
45
|
+
def self.require_ext(name)
|
46
|
+
if UTILRB_EXT_MODE
|
44
47
|
yield if block_given?
|
45
48
|
elsif name
|
46
49
|
STDERR.puts "Utilrb: not loading #{name} since the C extension is not available"
|
data/lib/utilrb/dir.rb
ADDED
@@ -17,7 +17,7 @@ module Kernel
|
|
17
17
|
# filter_options(nil, known_options) -> default_options, {}
|
18
18
|
#
|
19
19
|
def filter_options(options, option_spec)
|
20
|
-
options = (options || Hash.new).to_sym_keys
|
20
|
+
options = (options.to_hash || Hash.new).to_sym_keys
|
21
21
|
# cannot use #to_sym_keys as option_spec can be an array
|
22
22
|
option_spec = option_spec.inject({}) { |h, (k, v)| h[k.to_sym] = v; h }
|
23
23
|
|
@@ -44,7 +44,8 @@ module Kernel
|
|
44
44
|
# as an empty option hash, all keys are converted into symbols.
|
45
45
|
#
|
46
46
|
def validate_options(options, known_options)
|
47
|
-
|
47
|
+
options ||= Hash.new
|
48
|
+
opt, unknown = Kernel.filter_options(options.to_hash, known_options)
|
48
49
|
unless unknown.empty?
|
49
50
|
not_valid = unknown.keys.map { |m| "'#{m}'" }.join(" ")
|
50
51
|
raise ArgumentError, "unknown options #{not_valid}", caller(1)
|