xot 0.1.3 → 0.1.4
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/.gitignore +14 -0
- data/Rakefile +4 -19
- data/VERSION +1 -1
- data/ext/xot/extconf.rb +56 -0
- data/ext/xot/tester.cpp +19 -0
- data/include/xot.h +3 -0
- data/include/xot/debug.h +29 -0
- data/include/xot/defs.h +28 -4
- data/include/xot/pimpl.h +67 -0
- data/include/xot/ref.h +184 -0
- data/include/xot/string.h +15 -0
- data/include/xot/util.h +26 -0
- data/lib/xot.rb +7 -0
- data/lib/xot/blockutil.rb +26 -0
- data/lib/xot/hookable.rb +38 -0
- data/lib/xot/module.rb +9 -2
- data/lib/xot/rake.rb +5 -0
- data/lib/xot/rake/helpers.rb +26 -1
- data/lib/xot/rake/task.rb +20 -0
- data/lib/xot/setter.rb +29 -0
- data/src/debug.cpp +36 -0
- data/src/defs.cpp +6 -0
- data/src/util.cpp +22 -0
- data/task/ext.rake +90 -0
- data/task/gem.rake +11 -8
- data/task/git.rake +5 -0
- data/task/lib.rake +39 -25
- data/task/submodule.rake +51 -0
- data/task/test.rake +35 -0
- data/test/helpers.rb +7 -0
- data/test/test_blockutil.rb +42 -0
- data/test/test_hookable.rb +73 -0
- data/test/test_rake_helpers.rb +35 -0
- data/test/test_setter.rb +42 -0
- data/test/test_tester.rb +13 -0
- data/xot.gemspec +18 -30
- metadata +106 -51
data/task/git.rake
CHANGED
data/task/lib.rake
CHANGED
@@ -5,28 +5,36 @@ require 'rbconfig'
|
|
5
5
|
require 'rake/loaders/makefile'
|
6
6
|
|
7
7
|
|
8
|
+
task :lib => 'lib:build'
|
9
|
+
|
10
|
+
%w[clean].each do |t|
|
11
|
+
task t.intern => "lib:#{t}"
|
12
|
+
end
|
13
|
+
|
14
|
+
|
8
15
|
namespace :lib do
|
9
16
|
|
10
17
|
|
11
18
|
rbconf = RbConfig::CONFIG
|
12
19
|
|
13
|
-
mod
|
14
|
-
name
|
15
|
-
incdir
|
16
|
-
srcdir
|
17
|
-
libdir
|
18
|
-
|
19
|
-
ar
|
20
|
-
defs
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
mod = MODULE
|
21
|
+
name = env :NAME, MODULE.name.downcase
|
22
|
+
incdir = env :INCDIR, 'include'
|
23
|
+
srcdir = env :SRCDIR, 'src'
|
24
|
+
libdir = env :LIBDIR, 'lib'
|
25
|
+
cxx = env :CXX, rbconf['CXX'] || 'g++'
|
26
|
+
ar = env :AR, rbconf['AR'] || 'ar'
|
27
|
+
defs = env :DEFS, []
|
28
|
+
debug = env :DEBUG, false
|
29
|
+
incdirs = env :INCDIRS, []
|
30
|
+
cxxflags = env(:CXXFLAGS, rbconf['CXXFLAGS']).dup
|
31
|
+
arflags = env(:ARFLAGS, 'crs').dup
|
24
32
|
|
25
33
|
outname = "lib#{name}.a"
|
26
34
|
out = File.join libdir, outname
|
27
35
|
|
28
|
-
|
29
|
-
erbs = convertions
|
36
|
+
erbs = glob *[incdir, srcdir].map {|s| "#{s}/**/*.erb"}
|
37
|
+
erbs = convertions erbs, {".erb" => ""}
|
30
38
|
headers = glob("include/**/*.h") | erbs.values.grep(/\.h$/)
|
31
39
|
srcs = glob("src/**/*.cpp") | erbs.values.grep(/\.cpp$/)
|
32
40
|
srcs += glob("src/**/*.mm") if cocoa?
|
@@ -42,10 +50,16 @@ namespace :lib do
|
|
42
50
|
]
|
43
51
|
incdirs.uniq!
|
44
52
|
|
45
|
-
defs
|
46
|
-
defs
|
47
|
-
|
48
|
-
|
53
|
+
defs << '_DEBUG' if debug
|
54
|
+
defs << 'NDEBUG' unless debug
|
55
|
+
defs << 'WIN32' if win32?
|
56
|
+
defs << 'COCOA' if cocoa?
|
57
|
+
defs << $~[0].upcase if RUBY_PLATFORM =~ /mswin|ming|cygwin|darwin/i
|
58
|
+
cxxflags << ' ' << rbconf['debugflags'] if debug
|
59
|
+
cxxflags.gsub! /-O\d?/, '' if debug
|
60
|
+
cxxflags << ' --stdlib=libc++' if clang?
|
61
|
+
cxxflags << defs.map{|s| " -D#{s}"}.join
|
62
|
+
cxxflags << incdirs.map{|s| " -I#{s}"}.join
|
49
63
|
|
50
64
|
depend = 'depend.mf'
|
51
65
|
objs = convertions srcs, {".cpp" => ".o", ".mm" => ".o"}
|
@@ -54,20 +68,20 @@ namespace :lib do
|
|
54
68
|
|
55
69
|
task :build => out
|
56
70
|
|
57
|
-
task :compile => objs.values
|
58
|
-
|
59
|
-
task :erb => erbs.values
|
60
|
-
|
61
71
|
task :clean do
|
62
72
|
sh %( rm -rf #{tmps.join " "} #{out} )
|
63
73
|
end
|
64
74
|
|
75
|
+
task :compile => objs.values
|
76
|
+
|
77
|
+
task :erb => erbs.values
|
78
|
+
|
65
79
|
file out => objs.values do
|
66
80
|
sh %( #{ar} #{arflags} #{out} #{objs.values.join " "} )
|
67
81
|
end
|
68
82
|
|
69
83
|
file depend => erbs.values do
|
70
|
-
sh %( #{
|
84
|
+
sh %( #{cxx} -M #{cxxflags} #{srcs.join ' '} > #{depend} )
|
71
85
|
input = open(depend) {|f| f.read}
|
72
86
|
open(depend, 'w') do |output|
|
73
87
|
output << input.gsub(/\w+\.o/, srcdir + '/\0')
|
@@ -78,13 +92,13 @@ namespace :lib do
|
|
78
92
|
|
79
93
|
objs.each do |(src, obj)|
|
80
94
|
file obj => [depend, src] + erbs.values do
|
81
|
-
sh %( #{
|
95
|
+
sh %( #{cxx} -c #{cxxflags} -o #{obj} #{src} )
|
82
96
|
end
|
83
97
|
end
|
84
98
|
|
85
99
|
erbs.each do |(erb, out)|
|
86
|
-
file out =>
|
87
|
-
print "#{erb}: compiling to #{out}..."
|
100
|
+
file out => erb do
|
101
|
+
print "#{erb}: compiling to #{out} ..."
|
88
102
|
compile erb, out
|
89
103
|
puts "ok"
|
90
104
|
end
|
data/task/submodule.rake
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# -*- mode: ruby; coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
SUBMODULE_TASKS = %w[
|
5
|
+
build clean lib ext doc test gem
|
6
|
+
status diff push pull
|
7
|
+
install uninstall upload
|
8
|
+
]
|
9
|
+
|
10
|
+
|
11
|
+
SUBMODULE_TASKS.each do |name|
|
12
|
+
t = task "#{name}-all".intern
|
13
|
+
t.prerequisites.unshift "submodule:#{name}", :header
|
14
|
+
t.prerequisites.push name.intern
|
15
|
+
end if File.exist? '.gitmodules'
|
16
|
+
|
17
|
+
task :submodule => "submodule:init"
|
18
|
+
|
19
|
+
task :header do
|
20
|
+
header MODULE
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
namespace :submodule do
|
25
|
+
|
26
|
+
|
27
|
+
mods = env :SUBMODULES, []
|
28
|
+
git = env :GIT, 'git'
|
29
|
+
|
30
|
+
|
31
|
+
(SUBMODULE_TASKS + [:init]).each do |t|
|
32
|
+
task t.intern => mods.map {|m| "submodule:#{m}:#{t}"}
|
33
|
+
end
|
34
|
+
|
35
|
+
mods.each do |mod|
|
36
|
+
namespace mod.intern do
|
37
|
+
|
38
|
+
empty_task :init
|
39
|
+
|
40
|
+
SUBMODULE_TASKS.each do |t|
|
41
|
+
task t.intern => "submodule:#{mod}:init" do
|
42
|
+
header mod
|
43
|
+
sh %( cd #{mod} && rake #{t} )
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end# mod.intern
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
end# submodule
|
data/task/test.rake
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- mode: ruby; coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
|
7
|
+
task :test => 'test:all'
|
8
|
+
|
9
|
+
empty_task :ext
|
10
|
+
|
11
|
+
|
12
|
+
namespace :test do
|
13
|
+
|
14
|
+
|
15
|
+
alones = env :TESTS_ALONE, []
|
16
|
+
excludes = env :TESTS_EXCLUDE, []
|
17
|
+
ruby = env :RUBY, 'ruby'
|
18
|
+
|
19
|
+
|
20
|
+
task :all => [:ext, :full, :alones]
|
21
|
+
|
22
|
+
Rake::TestTask.new :full do |t|
|
23
|
+
t.libs << 'lib'
|
24
|
+
t.test_files = FileList['test/test_*.rb'] - alones - excludes
|
25
|
+
t.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
task :alones do
|
29
|
+
alones.each do |rb|
|
30
|
+
next if excludes.include? rb
|
31
|
+
sh %( #{ruby} #{rb} )
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end# :test
|
data/test/helpers.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative 'helpers'
|
5
|
+
|
6
|
+
|
7
|
+
class TestBlockUtil < Test::Unit::TestCase
|
8
|
+
|
9
|
+
include Xot::BlockUtil::ClassMethods
|
10
|
+
|
11
|
+
class Temp
|
12
|
+
|
13
|
+
attr_accessor :value
|
14
|
+
|
15
|
+
end# Temp
|
16
|
+
|
17
|
+
def temp (*args)
|
18
|
+
Temp.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_instance_eval_or_block_call ()
|
22
|
+
t = temp
|
23
|
+
t.value = 1
|
24
|
+
|
25
|
+
assert_equal 2, instance_eval_or_block_call(t) {|x| x.value = 2}
|
26
|
+
assert_equal 2, t.value
|
27
|
+
|
28
|
+
assert_equal 3, instance_eval_or_block_call(t) {|x| t.value = 3}
|
29
|
+
assert_equal 3, t.value
|
30
|
+
|
31
|
+
assert_equal 4, instance_eval_or_block_call(t) {self.value = 4}
|
32
|
+
assert_equal 4, t.value
|
33
|
+
|
34
|
+
assert_equal 5, instance_eval_or_block_call(t) {t.value = 5}
|
35
|
+
assert_equal 5, t.value
|
36
|
+
|
37
|
+
assert_raise NoMethodError do
|
38
|
+
instance_eval_or_block_call(t) {|x| self.value = 9}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end# TestBlockUtil
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative 'helpers'
|
5
|
+
|
6
|
+
|
7
|
+
class TestHookable < Test::Unit::TestCase
|
8
|
+
|
9
|
+
class Temp
|
10
|
+
|
11
|
+
include Xot::Hookable
|
12
|
+
|
13
|
+
attr_reader :log
|
14
|
+
|
15
|
+
def initialize ()
|
16
|
+
@log = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def test (val1, val2)
|
20
|
+
@log << val1 << val2
|
21
|
+
end
|
22
|
+
|
23
|
+
def zero ()
|
24
|
+
@log << 0
|
25
|
+
end
|
26
|
+
|
27
|
+
end# Temp
|
28
|
+
|
29
|
+
def temp (*args)
|
30
|
+
Temp.new
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_hook ()
|
34
|
+
o = temp
|
35
|
+
o.hook(:test) do |*args|
|
36
|
+
super -1, 0
|
37
|
+
o.log << args
|
38
|
+
super *args
|
39
|
+
super 8, 9
|
40
|
+
end
|
41
|
+
o.test 1, 2
|
42
|
+
assert_equal [-1, 0, [1, 2], 1, 2, 8, 9], o.log
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_before ()
|
46
|
+
o = temp
|
47
|
+
o.before(:zero) {o.log << 1}
|
48
|
+
o.zero
|
49
|
+
assert_equal [1, 0], o.log
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_after ()
|
53
|
+
o = temp
|
54
|
+
o.after(:zero) {o.log << 1}
|
55
|
+
o.zero
|
56
|
+
assert_equal [0, 1], o.log
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_on ()
|
60
|
+
o = temp
|
61
|
+
o.on(:zero) {o.log << 1}
|
62
|
+
o.zero
|
63
|
+
assert_equal [1], o.log
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_hook_self ()
|
67
|
+
o, id = temp, nil
|
68
|
+
o.hook(:zero) {id = __id__}
|
69
|
+
o.zero
|
70
|
+
assert_equal o.__id__, id
|
71
|
+
end
|
72
|
+
|
73
|
+
end# TestHookable
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative 'helpers'
|
5
|
+
require 'xot/rake'
|
6
|
+
|
7
|
+
include Xot::Rake
|
8
|
+
|
9
|
+
|
10
|
+
Const = 'const'
|
11
|
+
Zero = 0
|
12
|
+
NonZero = 1
|
13
|
+
ZeroStr = '0'
|
14
|
+
NonZeroStr = '1'
|
15
|
+
True = true
|
16
|
+
False = false
|
17
|
+
TrueStr = 'true'
|
18
|
+
FalseStr = 'false'
|
19
|
+
|
20
|
+
|
21
|
+
class TestRakeHelpers < Test::Unit::TestCase
|
22
|
+
|
23
|
+
def test_set ()
|
24
|
+
assert_equal 'const', env(:Const, :dummy)
|
25
|
+
assert_equal 0, env(:Zero, :dummy)
|
26
|
+
assert_equal 1, env(:NonZero, :dummy)
|
27
|
+
assert_equal 0, env(:ZeroStr, :dummy)
|
28
|
+
assert_equal 1, env(:NonZeroStr, :dummy)
|
29
|
+
assert_equal true, env(:True, :dummy)
|
30
|
+
assert_equal false, env(:False, :dummy)
|
31
|
+
assert_equal true, env(:TrueStr, :dummy)
|
32
|
+
assert_equal false, env(:FalseStr, :dummy)
|
33
|
+
end
|
34
|
+
|
35
|
+
end# TestRakeHelpers
|
data/test/test_setter.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative 'helpers'
|
5
|
+
|
6
|
+
|
7
|
+
class TestSetter < Test::Unit::TestCase
|
8
|
+
|
9
|
+
class Temp
|
10
|
+
|
11
|
+
include Xot::Setter
|
12
|
+
|
13
|
+
attr_accessor :x, :y
|
14
|
+
|
15
|
+
end# Temp
|
16
|
+
|
17
|
+
def temp (*args)
|
18
|
+
Temp.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_set ()
|
22
|
+
o = temp
|
23
|
+
o.set :x, 1
|
24
|
+
assert_equal 1, o.x
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_set_by_hash ()
|
28
|
+
o = temp
|
29
|
+
o.set :x => 1, :y => 2
|
30
|
+
assert_equal [1, 2], [o.x, o.y]
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_invalid_name ()
|
34
|
+
assert_raise(NoMethodError) {temp.set :badname, 1}
|
35
|
+
assert_raise(NoMethodError) {temp.set :badname}
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_invalid_value ()
|
39
|
+
assert_raise(ArgumentError) {temp.set :x}
|
40
|
+
end
|
41
|
+
|
42
|
+
end# TestSetter
|
data/test/test_tester.rb
ADDED
data/xot.gemspec
CHANGED
@@ -1,53 +1,41 @@
|
|
1
1
|
# -*- mode: ruby; coding: utf-8 -*-
|
2
2
|
|
3
3
|
|
4
|
-
$: << File.
|
4
|
+
$: << File.expand_path('../lib', __FILE__)
|
5
5
|
|
6
|
-
require 'rake'
|
7
6
|
require 'xot/module'
|
8
7
|
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
FILES = FileList[*%W[
|
15
|
-
README
|
16
|
-
ChangeLog
|
17
|
-
Rakefile
|
18
|
-
#{NAME}.gemspec
|
19
|
-
VERSION
|
20
|
-
task/**/*.rake
|
21
|
-
include/**/*.h
|
22
|
-
lib/**/*.rb
|
23
|
-
src/**/*.h
|
24
|
-
src/**/*.cpp
|
25
|
-
]]
|
26
|
-
|
27
|
-
RDOCS = FileList[*%W[
|
28
|
-
README
|
29
|
-
]]
|
9
|
+
Gem::Specification.new do |s|
|
10
|
+
def glob (*patterns)
|
11
|
+
patterns.map {|pat| Dir.glob(pat).to_a}.flatten
|
12
|
+
end
|
30
13
|
|
14
|
+
mod = Xot
|
15
|
+
name = mod.name.downcase
|
16
|
+
rdocs = glob *%w[README]
|
31
17
|
|
32
|
-
|
33
|
-
s.name = NAME
|
18
|
+
s.name = name
|
34
19
|
s.summary = 'A Utility library for C++ developemt.'
|
35
20
|
s.description = 'This library include some useful utility classes and functions for development with C++.'
|
36
|
-
s.version =
|
21
|
+
s.version = mod.version
|
37
22
|
|
38
23
|
s.authors = %w[snori]
|
39
24
|
s.email = 'snori@xord.org'
|
40
|
-
s.homepage = "http://github.com/xord/#{
|
25
|
+
s.homepage = "http://github.com/xord/#{name}"
|
41
26
|
|
42
|
-
s.platform
|
27
|
+
s.platform = Gem::Platform::RUBY
|
28
|
+
s.required_ruby_version = '>=1.9.0'
|
43
29
|
|
30
|
+
s.add_runtime_dependency 'bundler'
|
44
31
|
s.add_development_dependency 'rake'
|
45
32
|
s.add_development_dependency 'gemcutter'
|
46
33
|
|
47
|
-
s.files
|
48
|
-
|
34
|
+
s.files = `git ls-files`.split $/
|
35
|
+
s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
|
36
|
+
s.test_files = s.files.grep %r{^(test|spec|features)/}
|
37
|
+
s.extra_rdoc_files = rdocs.to_a
|
49
38
|
s.has_rdoc = true
|
50
|
-
s.extra_rdoc_files = RDOCS.to_a
|
51
39
|
|
52
40
|
s.extensions << 'Rakefile'
|
53
41
|
end
|