bitclust-dev 0.5.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/lib/bitclust.rb +9 -0
- data/tools/bc-ancestors.rb +153 -0
- data/tools/bc-checkparams.rb +246 -0
- data/tools/bc-classes.rb +80 -0
- data/tools/bc-convert.rb +165 -0
- data/tools/bc-list.rb +63 -0
- data/tools/bc-methods.rb +171 -0
- data/tools/bc-preproc.rb +42 -0
- data/tools/bc-rdoc.rb +343 -0
- data/tools/bc-tochm.rb +301 -0
- data/tools/bc-tohtml.rb +125 -0
- data/tools/bc-tohtmlpackage.rb +241 -0
- data/tools/check-signature.rb +19 -0
- data/tools/forall-ruby.rb +20 -0
- data/tools/gencatalog.rb +69 -0
- data/tools/statrefm.rb +98 -0
- data/tools/stattodo.rb +150 -0
- data/tools/update-database.rb +146 -0
- metadata +118 -0
data/lib/bitclust.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'bitclust/requesthandler'
|
2
|
+
require 'bitclust/screen'
|
3
|
+
require 'bitclust/server'
|
4
|
+
require 'bitclust/searcher'
|
5
|
+
require 'bitclust/methoddatabase'
|
6
|
+
require 'bitclust/functiondatabase'
|
7
|
+
require 'bitclust/rrdparser'
|
8
|
+
require 'bitclust/exception'
|
9
|
+
require 'bitclust/version'
|
@@ -0,0 +1,153 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
bindir = Pathname.new(__FILE__).realpath.dirname
|
6
|
+
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
7
|
+
|
8
|
+
require 'bitclust'
|
9
|
+
require 'bitclust/crossrubyutils'
|
10
|
+
require 'optparse'
|
11
|
+
require 'set'
|
12
|
+
|
13
|
+
include BitClust::CrossRubyUtils
|
14
|
+
|
15
|
+
def main
|
16
|
+
prefix = nil
|
17
|
+
requires = []
|
18
|
+
ver = RUBY_VERSION
|
19
|
+
@verbose = false
|
20
|
+
all = false
|
21
|
+
parser = OptionParser.new
|
22
|
+
parser.banner =<<BANNER
|
23
|
+
Usage: #{File.basename($0, '.*')} [-r<lib>] [--ruby=<VER>] --db=PATH <classname>
|
24
|
+
#{File.basename($0, '.*')} [-r<lib>] [--ruby=<VER>] --db=PATH --all
|
25
|
+
NG Sample:
|
26
|
+
$ #{File.basename($0, '.*')} -rfoo --ruby=1.9.1 --db=./db Foo
|
27
|
+
NG : Foo
|
28
|
+
+ FooModule (The Ruby have this class/module in ancestors of the class)
|
29
|
+
- BarModule (The Database have this class/module in ancestors of the class)
|
30
|
+
Options:
|
31
|
+
BANNER
|
32
|
+
parser.on('-d', '--database=PATH', 'Database prefix.') {|path|
|
33
|
+
prefix = path
|
34
|
+
}
|
35
|
+
parser.on('-r LIB', 'Requires library LIB') {|lib|
|
36
|
+
requires.push lib
|
37
|
+
}
|
38
|
+
parser.on('--ruby=[VER]', "The version of Ruby interpreter"){|ver|
|
39
|
+
ver = ver
|
40
|
+
}
|
41
|
+
parser.on('-v', '--verbose', 'Show differences'){
|
42
|
+
@verbose = true
|
43
|
+
}
|
44
|
+
parser.on('--all', 'Check anccestors for all classes'){
|
45
|
+
all = true
|
46
|
+
}
|
47
|
+
parser.on('--help', 'Prints this message and quit.') {
|
48
|
+
puts parser.help
|
49
|
+
exit 0
|
50
|
+
}
|
51
|
+
begin
|
52
|
+
parser.parse!
|
53
|
+
rescue OptionParser::ParseError => err
|
54
|
+
$stderr.puts err.message
|
55
|
+
$stderr.puts parser.help
|
56
|
+
exit 1
|
57
|
+
end
|
58
|
+
unless ARGV.size == 1 || all
|
59
|
+
$stderr.puts "wrong number of arguments"
|
60
|
+
$stderr.puts parser.help
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
classname = ARGV[0]
|
64
|
+
db = BitClust::MethodDatabase.new(prefix)
|
65
|
+
ruby = get_ruby(ver)
|
66
|
+
if classname && !all
|
67
|
+
check_ancestors(db, ruby, requires, classname)
|
68
|
+
else
|
69
|
+
$stderr.puts 'check all...'
|
70
|
+
check_all_ancestors(db, ruby, requires)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def ancestors(ruby, requires, classname)
|
75
|
+
req = requires.map{|lib|
|
76
|
+
unless '_builtin' == lib
|
77
|
+
"-r#{lib}"
|
78
|
+
else
|
79
|
+
''
|
80
|
+
end
|
81
|
+
}.join(" ")
|
82
|
+
script =<<-SRC
|
83
|
+
c = #{classname}
|
84
|
+
puts c.ancestors.join("\n")
|
85
|
+
SRC
|
86
|
+
`#{ruby} #{req} -e '#{script}'`.split
|
87
|
+
end
|
88
|
+
|
89
|
+
def check_ancestors(db, ruby, requires, classname)
|
90
|
+
a = ancestors(ruby, requires, classname)
|
91
|
+
begin
|
92
|
+
b = db.fetch_class(classname).ancestors.map(&:name)
|
93
|
+
rescue BitClust::ClassNotFound => ex
|
94
|
+
$stderr.puts "class not found in database : #{classname}"
|
95
|
+
b = []
|
96
|
+
end
|
97
|
+
unless a.to_set == b.to_set
|
98
|
+
puts "NG : #{classname}"
|
99
|
+
puts (a-b).map{|c| "+ #{c}" }.join("\n")
|
100
|
+
puts (b-a).map{|c| "- #{c}" }.join("\n")
|
101
|
+
else
|
102
|
+
puts "OK : #{classname}" if @verbose
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def check_all_ancestors(db, ruby, requires)
|
107
|
+
classnames = []
|
108
|
+
requires.each do |lib|
|
109
|
+
classnames.push(*defined_classes(ruby, lib, []))
|
110
|
+
end
|
111
|
+
classnames.each do |classname|
|
112
|
+
check_ancestors(db, ruby, requires, classname)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def defined_classes(ruby, lib, rejects)
|
117
|
+
output = `#{ruby} -e '
|
118
|
+
def class_extent
|
119
|
+
result = []
|
120
|
+
ObjectSpace.each_object(Module) do |c|
|
121
|
+
result.push c
|
122
|
+
end
|
123
|
+
result
|
124
|
+
end
|
125
|
+
|
126
|
+
%w(#{rejects.join(" ")}).each do |lib|
|
127
|
+
begin
|
128
|
+
require lib
|
129
|
+
rescue LoadError
|
130
|
+
end
|
131
|
+
end
|
132
|
+
if "#{lib}" == "_builtin"
|
133
|
+
class_extent().each do |c|
|
134
|
+
puts c
|
135
|
+
end
|
136
|
+
else
|
137
|
+
before = class_extent()
|
138
|
+
begin
|
139
|
+
require "#{lib}"
|
140
|
+
rescue LoadError
|
141
|
+
$stderr.puts "\#{RUBY_VERSION} (\#{RUBY_RELEASE_DATE}): library not exist: #{lib}"
|
142
|
+
exit
|
143
|
+
end
|
144
|
+
after = class_extent()
|
145
|
+
(after - before).each do |c|
|
146
|
+
puts c
|
147
|
+
end
|
148
|
+
end
|
149
|
+
'`
|
150
|
+
output.split
|
151
|
+
end
|
152
|
+
|
153
|
+
main
|
@@ -0,0 +1,246 @@
|
|
1
|
+
#! /usr/bin/ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'pathname'
|
5
|
+
|
6
|
+
bindir = Pathname.new(__FILE__).realpath.dirname
|
7
|
+
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
8
|
+
|
9
|
+
require 'bitclust/preprocessor'
|
10
|
+
require 'bitclust/lineinput'
|
11
|
+
require 'bitclust/parseutils'
|
12
|
+
require 'bitclust/methodsignature'
|
13
|
+
|
14
|
+
def main
|
15
|
+
option = OptionParser.new
|
16
|
+
version = '1.9.1'
|
17
|
+
option.banner = "Usage: #{File.basename($0, '.*')} <filename>"
|
18
|
+
option.on('--ruby=[VER]', "The version of Ruby interpreter"){|ver|
|
19
|
+
version = ver
|
20
|
+
}
|
21
|
+
option.on('--help', 'Prints this message and quit.') {
|
22
|
+
puts option.help
|
23
|
+
exit 0
|
24
|
+
}
|
25
|
+
begin
|
26
|
+
option.parse!(ARGV)
|
27
|
+
rescue OptionParser::ParseError => ex
|
28
|
+
$stderr.puts err.message
|
29
|
+
exit 1
|
30
|
+
end
|
31
|
+
unless ARGV.size == 1
|
32
|
+
$stderr.puts "wrong number of arguments"
|
33
|
+
$stderr.puts option.help
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
filename = ARGV[0]
|
37
|
+
path = Pathname.new(filename)
|
38
|
+
|
39
|
+
params = { "version" => version }
|
40
|
+
parser = BitClust::RDParser.new(BitClust::Preprocessor.read(path, params))
|
41
|
+
parser.parse
|
42
|
+
end
|
43
|
+
|
44
|
+
module BitClust
|
45
|
+
class RDParser
|
46
|
+
def initialize(src)
|
47
|
+
@f = LineInput.new(StringIO.new(src))
|
48
|
+
@option = { :force => true }
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse
|
52
|
+
while @f.next?
|
53
|
+
case @f.peek
|
54
|
+
when /\A---/
|
55
|
+
method_entry_chunk
|
56
|
+
else
|
57
|
+
@f.gets
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def method_entry_chunk
|
63
|
+
@f.while_match(/\A---/) do |line|
|
64
|
+
method_signature line
|
65
|
+
end
|
66
|
+
props = {}
|
67
|
+
@f.while_match(/\A:/) do |line|
|
68
|
+
k, v = line.sub(/\A:/, '').split(':', 2)
|
69
|
+
props[k.strip] = v.strip
|
70
|
+
end
|
71
|
+
while @f.next?
|
72
|
+
case @f.peek
|
73
|
+
when /\A===+/
|
74
|
+
@f.gets
|
75
|
+
when /\A==?/
|
76
|
+
if @option[:force]
|
77
|
+
break
|
78
|
+
else
|
79
|
+
raise "method entry includes headline: #{@f.peek.inspect}"
|
80
|
+
end
|
81
|
+
when /\A---/
|
82
|
+
break
|
83
|
+
when /\A\s+\*\s/
|
84
|
+
ulist
|
85
|
+
when /\A\s+\(\d+\)\s/
|
86
|
+
olist
|
87
|
+
when /\A:\s/
|
88
|
+
dlist
|
89
|
+
when %r<\A//emlist\{>
|
90
|
+
emlist
|
91
|
+
when /\A\s+\S/
|
92
|
+
list
|
93
|
+
when /@see/
|
94
|
+
see
|
95
|
+
when /\A@[a-z]/
|
96
|
+
method_info
|
97
|
+
else
|
98
|
+
if @f.peek.strip.empty?
|
99
|
+
@f.gets
|
100
|
+
else
|
101
|
+
method_entry_paragraph
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def headline(line)
|
108
|
+
# nop
|
109
|
+
end
|
110
|
+
|
111
|
+
def ulist
|
112
|
+
@f.while_match(/\A\s+\*\s/) do |line|
|
113
|
+
@f.while_match(/\A\s+[^\*\s]/) do |cont|
|
114
|
+
# nop
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def olist
|
120
|
+
@f.while_match(/\A\s+\(\d+\)/) do |line|
|
121
|
+
@f.while_match(/\A\s+(?!\(\d+\))\S/) do |cont|
|
122
|
+
# nop
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def dlist
|
128
|
+
while @f.next? and /\A:/ =~ @f.peek
|
129
|
+
@f.while_match(/\A:/) do |line|
|
130
|
+
# nop
|
131
|
+
end
|
132
|
+
dd_with_p
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# empty lines separate paragraphs.
|
137
|
+
def dd_with_p
|
138
|
+
while /\A(?:\s|\z)/ =~ @f.peek or %r!\A//emlist\{! =~ @f.peek
|
139
|
+
case @f.peek
|
140
|
+
when /\A$/
|
141
|
+
@f.gets
|
142
|
+
when /\A[ \t\z]/
|
143
|
+
@f.while_match(/\A[ \t\z]/) do |line|
|
144
|
+
# nop
|
145
|
+
end
|
146
|
+
when %r!\A//emlist\{!
|
147
|
+
emlist
|
148
|
+
else
|
149
|
+
raise 'must not happen'
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# empty lines do not separate paragraphs.
|
155
|
+
def dd_without_p
|
156
|
+
while /\A[ \t]/ =~ @f.peek or %r!\A//emlist\{! =~ @f.peek
|
157
|
+
case @f.peek
|
158
|
+
when /\A[ \t\z]/
|
159
|
+
@f.while_match(/\A[ \t\z]/) do |line|
|
160
|
+
# nop
|
161
|
+
end
|
162
|
+
when %r!\A//emlist\{!
|
163
|
+
emlist
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def emlist
|
169
|
+
@f.gets # discard "//emlist{"
|
170
|
+
@f.until_terminator(%r<\A//\}>) do |line|
|
171
|
+
# nop
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def list
|
176
|
+
@f.break(/\A\S/)
|
177
|
+
end
|
178
|
+
|
179
|
+
def see
|
180
|
+
@f.gets
|
181
|
+
@f.span(/\A\s+\S/)
|
182
|
+
end
|
183
|
+
|
184
|
+
def paragraph
|
185
|
+
read_paragraph(@f).each do |line|
|
186
|
+
# nop
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def read_paragraph(f)
|
191
|
+
f.span(%r<\A(?!---|=|//emlist\{)\S>)
|
192
|
+
end
|
193
|
+
|
194
|
+
def method_info
|
195
|
+
params = []
|
196
|
+
while @f.next? and /\A\@(?!see)\w+|\A$/ =~ @f.peek
|
197
|
+
header = @f.gets
|
198
|
+
next if /\A$/ =~ header
|
199
|
+
cmd = header.slice!(/\A\@\w+/)
|
200
|
+
@f.ungets(header)
|
201
|
+
case cmd
|
202
|
+
when '@param', '@arg'
|
203
|
+
name = header.slice!(/\A\s*\w+/n) || '?'
|
204
|
+
params << name
|
205
|
+
when '@raise'
|
206
|
+
# nop
|
207
|
+
when '@return'
|
208
|
+
# nop
|
209
|
+
else
|
210
|
+
$stderr.puts "[UNKNOWN_META_INFO] #{cmd}"
|
211
|
+
end
|
212
|
+
dd_without_p
|
213
|
+
end
|
214
|
+
# check parameters
|
215
|
+
params.map(&:strip).each{|param|
|
216
|
+
unless @sig.params.split(',').map(&:strip).any?{|v|
|
217
|
+
param == v.tr('*', '').gsub(/\s*=\s*.+/, '')
|
218
|
+
}
|
219
|
+
$stderr.puts "#{@f.lineno}: #{@sig.friendly_string}"
|
220
|
+
$stderr.puts params.inspect
|
221
|
+
$stderr.puts @sig.params.inspect
|
222
|
+
end
|
223
|
+
}
|
224
|
+
rescue
|
225
|
+
$stderr.puts "#{@f.lineno}: #{@sig.friendly_string}"
|
226
|
+
$stderr.puts params.inspect
|
227
|
+
$stderr.puts @sig.params.inspect
|
228
|
+
end
|
229
|
+
|
230
|
+
def method_entry_paragraph
|
231
|
+
read_method_entry_paragraph(@f).each do |line|
|
232
|
+
# nop
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def read_method_entry_paragraph(f)
|
237
|
+
f.span(%r<\A(?!---|=|//emlist\{|@[a-z])\S>)
|
238
|
+
end
|
239
|
+
|
240
|
+
def method_signature(sig_line)
|
241
|
+
@sig = MethodSignature.parse(sig_line)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
main
|
data/tools/bc-classes.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
bindir = Pathname.new(__FILE__).realpath.dirname
|
6
|
+
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
7
|
+
|
8
|
+
require 'bitclust/crossrubyutils'
|
9
|
+
require 'optparse'
|
10
|
+
|
11
|
+
include BitClust::CrossRubyUtils
|
12
|
+
|
13
|
+
def main
|
14
|
+
rejects = []
|
15
|
+
@verbose = false
|
16
|
+
opts = OptionParser.new
|
17
|
+
opts.banner = "Usage: #{File.basename($0, '.*')} [-r<lib>] <lib>"
|
18
|
+
opts.on('-r', '--reject=LIB', 'Reject library LIB') {|lib|
|
19
|
+
rejects.concat lib.split(',')
|
20
|
+
}
|
21
|
+
opts.on('-v', '--verbose', 'Show all ruby version.') {
|
22
|
+
@verbose = true
|
23
|
+
}
|
24
|
+
opts.on('--help', 'Prints this message and quit.') {
|
25
|
+
puts opts.help
|
26
|
+
exit 0
|
27
|
+
}
|
28
|
+
begin
|
29
|
+
opts.parse!(ARGV)
|
30
|
+
rescue OptionParser::ParseError => err
|
31
|
+
$stderr.puts err.message
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
unless ARGV.size == 1
|
35
|
+
$stderr.puts 'wrong number of arguments'
|
36
|
+
$stderr.puts opts.help
|
37
|
+
exit 1
|
38
|
+
end
|
39
|
+
lib = ARGV[0]
|
40
|
+
print_crossruby_table {|ruby| defined_classes(ruby, lib, rejects) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def defined_classes(ruby, lib, rejects)
|
44
|
+
output = `#{ruby} -e '
|
45
|
+
def class_extent
|
46
|
+
result = []
|
47
|
+
ObjectSpace.each_object(Module) do |c|
|
48
|
+
result.push c
|
49
|
+
end
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
53
|
+
%w(#{rejects.join(" ")}).each do |lib|
|
54
|
+
begin
|
55
|
+
require lib
|
56
|
+
rescue LoadError
|
57
|
+
end
|
58
|
+
end
|
59
|
+
if "#{lib}" == "_builtin"
|
60
|
+
class_extent().each do |c|
|
61
|
+
puts c
|
62
|
+
end
|
63
|
+
else
|
64
|
+
before = class_extent()
|
65
|
+
begin
|
66
|
+
require "#{lib}"
|
67
|
+
rescue LoadError
|
68
|
+
$stderr.puts "\#{RUBY_VERSION} (\#{RUBY_RELEASE_DATE}): library not exist: #{lib}"
|
69
|
+
exit
|
70
|
+
end
|
71
|
+
after = class_extent()
|
72
|
+
(after - before).each do |c|
|
73
|
+
puts c
|
74
|
+
end
|
75
|
+
end
|
76
|
+
'`
|
77
|
+
output.split
|
78
|
+
end
|
79
|
+
|
80
|
+
main
|