rmtools 1.2.0 → 1.2.2b

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rmtools
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
5
- prerelease:
4
+ hash: 35
5
+ prerelease: 5
6
6
  segments:
7
7
  - 1
8
8
  - 2
9
- - 0
10
- version: 1.2.0
9
+ - 2
10
+ - b
11
+ version: 1.2.2b
11
12
  platform: ruby
12
13
  authors:
13
14
  - Shinku
@@ -15,7 +16,7 @@ autorequire:
15
16
  bindir: bin
16
17
  cert_chain: []
17
18
 
18
- date: 2011-05-16 00:00:00 +04:00
19
+ date: 2011-11-16 00:00:00 +03:00
19
20
  default_executable:
20
21
  dependencies:
21
22
  - !ruby/object:Gem::Dependency
@@ -97,8 +98,8 @@ files:
97
98
  - lib/rmtools/dev/logging.rb
98
99
  - lib/rmtools/dev/trace_format.rb
99
100
  - lib/rmtools/dev/highlight.rb
101
+ - lib/rmtools/dev/code_reading.rb
100
102
  - lib/rmtools/dev/timer.rb
101
- - lib/rmtools/dev/code_reader.rb
102
103
  - lib/rmtools/xml/xpath.rb
103
104
  - lib/rmtools/xml/string.rb
104
105
  - lib/rmtools/xml/libxml.rb
@@ -113,6 +114,7 @@ files:
113
114
  - lib/rmtools/core/kernel.rb
114
115
  - lib/rmtools/core/boolean.rb
115
116
  - lib/rmtools/core/aliases.rb
117
+ - lib/rmtools/core/threadify.rb
116
118
  - lib/rmtools/core/module.rb
117
119
  - lib/rmtools/core/object.rb
118
120
  - lib/rmtools/core/deprecation.rb
@@ -146,7 +148,6 @@ files:
146
148
  - lib/rmtools/ip.rb
147
149
  - lib/rmtools/lang.rb
148
150
  - lib/rmtools/functional.rb
149
- - lib/rmtools/load.rb
150
151
  - lib/rmtools/install.rb
151
152
  - lib/rmtools/functional/decorate.rb
152
153
  - lib/rmtools/functional/fold.rb
@@ -168,6 +169,7 @@ files:
168
169
  - lib/rmtools/conversions/enum.rb
169
170
  - lib/rmtools/conversions/int.rb
170
171
  - lib/rmtools/enumerable.rb
172
+ - lib/rmtools/init.rb
171
173
  - lib/rmtools/dev_min.rb
172
174
  - lib/rmtools_dev.rb
173
175
  - ./Rakefile
@@ -196,12 +198,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
196
198
  required_rubygems_version: !ruby/object:Gem::Requirement
197
199
  none: false
198
200
  requirements:
199
- - - ">="
201
+ - - ">"
200
202
  - !ruby/object:Gem::Version
201
- hash: 3
203
+ hash: 25
202
204
  segments:
203
- - 0
204
- version: "0"
205
+ - 1
206
+ - 3
207
+ - 1
208
+ version: 1.3.1
205
209
  requirements: []
206
210
 
207
211
  rubyforge_project: rmtools
@@ -1,431 +0,0 @@
1
- RMTools::require 'text/string_scanner'
2
-
3
- module RMTools
4
- class CodeReader
5
-
6
- module RE
7
- leftop = '\[{(<=>~+\-*,;?:^&\|'
8
- rightop = '\])}?!'
9
- sname = '\w<=>~+\-*/\]\[\^%!?@&\|'
10
- compname = "([\\.:#{sname}]+)"
11
- name = "([#{sname}]+)"
12
- mname = '([:\w]+)'
13
- call_ = '(\{s*\||([\w?!)]|\.((\[\]|[<=>])?=[=~]?|[<>*\-+/%^&\|]+))[ \t]*\{)'
14
- space = '[ \t]+'
15
- space_ = '[ \t]*'
16
- kw = 'if|elsif|else|unless|while|until|case|begin|rescue|when|then|or|and|not'
17
- heredoc_handle = %q{<<(-)?(\w+|`[^`]+`|'[^']+'|"[^"]+")}
18
- heredoc = %{([\\s#{leftop}]|[#{leftop}\\w!][ \t])\\s*#{heredoc_handle}}
19
- re_sugar = %{(^|[#{leftop}\\n;]|\W!|\\b(#{kw})[ \t]|[\\w#{rightop}]/)\\s*/}
20
- percent = '%([xwqrQW])?([\\/<({\[!\|])'
21
- simple = [re_sugar, percent, '[#\'"`]']*'|'
22
- mod_def = "module#{space+mname}"
23
- class_def = "class(?:#{space_}(<<)#{space_}|#{space})([$@:\\w]+)(?:#{space_}<#{space_+mname})?"
24
- method_def = "def#{space+compname}"
25
- alias_def = "alias#{space}:?#{name+space}:?#{name}"
26
-
27
- StringParseRE = /#{heredoc}|#{simple}|[{}]|[^\w#{rightop}'"`\/\\]\?\\?\S/m
28
- HeredocParseRE = /\n|#{heredoc}|#{simple}/
29
- StringRE = /(^['"`]$)|^#{percent}$/
30
- RERE = %r{(?:^|[#{leftop}\\w!\\s/])\\s*(/)}
31
- HeredocRE = heredoc_handle.to_re
32
- Symbol = /^:#{name}$/
33
- Attrs = /\s(c)?(?:attr_(reader|writer|accessor))#{space}((?::\w+#{space_},\s*)*:\w+)/
34
- Include = /\s(include|extend)#{space+mname}/
35
- AliasMethod = /\salias_method :#{name+space_},#{space_}:#{name}/
36
- Beginners = /(([#{leftop}\n]?#{space_})(if|unless|while|until))#{
37
- }|(.)?(?:(do|for)|begin|case)/
38
- EOF = /($0\s*==\s*__FILE__\s*|__FILE__\s*==\s*\$0\s*)?\n/
39
- BlockStart = /(?:^\{\s*\||.\{)$/
40
- Ord = /^.\?\\?\S$/
41
-
42
- MainParseRE = /#{simple
43
- }|#{call_}|[{}]#{
44
- }|(^|\n)=begin\b#{
45
- }|^#{space_}[;\(]?#{space_}(#{mod_def}|#{method_def})#{
46
- }|:#{name}#{
47
- }|[^\w#{rightop}'"`\/\\]\?\\?\S#{
48
- }|#{heredoc
49
- }|(^|[#{leftop}\n])#{space_}((if|unless)\b|#{
50
- }[;\(]?#{space_+class_def})#{
51
- }|(^|[\n;])#{space_}(while|until)\b#{
52
- }|(^|[#{leftop}\s])(do|case|begin|for)\b#{
53
- }|\sc?(attr_(reader|writer|accessor))#{space}(:\w+#{space_},\s*)*:\w+?[\n;]#{
54
- }|\salias_method :#{name+space_},#{space_}:#{name
55
- }|\s(include|extend)#{space+mname
56
- }|(^|[;\s])(#{alias_def}|end|__END__)\b/m
57
-
58
- ModDef = mod_def.to_re
59
- ClassDef = class_def.to_re
60
- MethodDef = method_def.to_re
61
- AliasDef = alias_def.to_re
62
-
63
- Closers = {'<' => '>', '{' => '}', '[' => ']', '(' => ')'}
64
- end
65
-
66
-
67
- def initialize
68
- @MethodCache = {'Object' => {}}
69
- @ReadPaths = {}
70
- end
71
-
72
- def string(s, m)
73
- return if m[1] and s.- == '$'
74
- opener = m[1] || m[3] || m[5]
75
- if opener == m[5]
76
- closer = opener = m[5].tr('`\'"', '')
77
- quote_re = /\\|\n#{'\s*' if m[4]}#{closer}/
78
- else
79
- closer = RE::Closers[opener] || opener
80
- quote_re = /\\|#{Regexp.escape closer}/
81
- end
82
- openers_cnt = 1
83
- curls_cnt = 0
84
- backslash = false
85
- quote_re |= /#\{/ if (m[5] and m[5].ord != ?') or closer =~ /[\/"`]/ or (m[2] =~ /[xrQW]/ or m[3])
86
- instructions = [
87
- [RE::Ord],
88
- [/\s*#{Regexp.escape closer}$/, lambda {|s, m|
89
- if backslash
90
- backslash = false
91
- break if s.- == '\\' and m[0] == closer
92
- end
93
- if (openers_cnt -= 1) == 0
94
- throw :EOS
95
- end
96
- }],
97
- [/\\/, lambda {|s, m|
98
- prev = s.-
99
- backslash = true
100
- if prev == '\\'
101
- i = 2
102
- while prev == '\\'
103
- prev = s.prev_in i
104
- i += 1
105
- backslash = !backslash
106
- end
107
- end
108
- }],
109
- [/\#\{/, lambda {|s, m|
110
- if backslash
111
- backslash = false
112
- break if s.- == '\\'
113
- end
114
- curls_cnt += 1
115
- catch(:inner_out) {s.each(RE::StringParseRE, [
116
- [/^\#$/, lambda {|s, m| s.scan_until(/\n/)}],
117
- [/^\{$/, lambda {|s, m| curls_cnt += 1}],
118
- [/^\}$/, lambda {|s, m| throw :inner_out if (curls_cnt -= 1) == 0}],
119
- [RE::HeredocRE, method(:heredoc)],
120
- [RE::StringRE, method(:string)],
121
- [RE::RERE, method(:string)]
122
- ])}
123
- }]
124
- ]
125
- if closer != opener
126
- quote_re |= /#{Regexp.escape opener}/
127
- instructions << [/#{Regexp.escape opener}$/, lambda {|s, m|
128
- if backslash
129
- backslash = false
130
- break if s.- == '\\'
131
- end
132
- openers_cnt += 1
133
- }]
134
- end
135
-
136
- catch(:EOS) {s.each(quote_re, instructions)}
137
- end
138
-
139
- def heredoc(s, m)
140
- heredoc_list = [m[1..2]]
141
- catch(:EOL) {s.each(RE::HeredocParseRE, [
142
- [/[#\n]/, lambda {|s, m|
143
- s.scan_until(/\n/) if m[0] == '#'
144
- heredoc_list.each {|opener| string(s, [nil]*4+opener)}
145
- throw :EOL
146
- }],
147
- [RE::HeredocRE, lambda {|s, m| heredoc_list << m[1..2]}],
148
- [RE::StringRE, method(:string)],
149
- [RE::RERE, method(:string)]
150
- ])}
151
- end
152
-
153
- def parse_file(path)
154
- @stack = []
155
-
156
- if path.inline
157
- return if @ReadPaths[path]
158
- lines = get_lines(path)[0]
159
- @ReadPaths[path] = true
160
- else
161
- lines = path.sharp_split(/\n/)
162
- end
163
- ss = StringScanner lines.join
164
-
165
- curls_cnt = 0
166
- catch(:EOF) {ss.each(RE::MainParseRE, [
167
- [/^\#/, lambda {|s, m| s.scan_until(/\n/)}],
168
-
169
- [RE::StringRE, method(:string)],
170
-
171
- [/^\{$/, lambda {|s, m| curls_cnt += 1}],
172
-
173
- [/^\}$/, lambda {|s, m|
174
- if curls_cnt == 0
175
- @stack.pop
176
- else
177
- curls_cnt -= 1
178
- end
179
- }],
180
-
181
- [RE::Ord],
182
-
183
- [RE::BlockStart, lambda {|s, m| @stack << [:block]}],
184
-
185
- [RE::ModDef, lambda {|s, m|
186
- @stack << [:mod, m[1]]
187
- @MethodCache[clean_stack.lasts*'::'] = {}
188
- }],
189
-
190
- [RE::ClassDef, lambda {|s, m|
191
- _stack = clean_stack
192
- if _stack[-1] == [:block]
193
- @stack << [:beginner]
194
- break
195
- elsif m[1]
196
- if m[2] =~ /^[@$]/
197
- @stack << [:beginner]
198
- elsif _stack.any? and _stack[-1][0] == :def
199
- @stack << [:beginner]
200
- else
201
- slf = _stack.lasts*'::'
202
- name = m[2].sub 'self.', ''
203
- name.sub! 'self', slf
204
- name = fix_module_name slf, name
205
- @stack << [:singleton, name]
206
- end
207
- else
208
- new = clean_stack.lasts*'::'
209
- @stack << [:class, m[2]]
210
- name = fix_module_name new, m[3] if m[3]
211
- new << '::' if new.b
212
- new << m[2]
213
- @MethodCache[new] ||= {}
214
- inherit! new, name if m[3]
215
- end
216
- }],
217
-
218
- [RE::MethodDef, lambda {|s, m|
219
- _stack = clean_stack(true)
220
- if _stack[-1] == [:block]
221
- @stack << [:beginner]
222
- break
223
- end
224
- start = s.pos - s.matched[/[^\n]+$/].size
225
- name = m[1].sub(/::([^:.]+)$/, '.\1')
226
- name.sub!(/#{_stack.last[1]}\./, 'self.') if _stack.any?
227
- if name[/^self\.(.+)/]
228
- @stack << [:def, "#{_stack.lasts*'::'}.#$1", start]
229
- elsif name['.'] and name =~ /^[A-Z]/
230
- mod, name = name/'.'
231
- fix_module_name(_stack.lasts*'::', mod) >> '.' >> name
232
- @stack << [:def, name, start]
233
- else
234
- prefix = (_stack.any? && _stack[-1][0] == :singleton) ? _stack[-1][1]+'.' : _stack.lasts*'::'+'#'
235
- @stack << [:def, prefix+name, start]
236
- end
237
- }],
238
-
239
- [RE::AliasDef, lambda {|s, m|
240
- _stack = clean_stack
241
- case _stack.any? && _stack[-1][0]
242
- when false, :def, :block
243
- break
244
- when :singleton
245
- prefix = _stack[-1][1]
246
- new, old = '.'+m[1], '.'+m[2]
247
- else
248
- prefix = _stack.lasts*'::'
249
- new, old = '#'+m[1], '#'+m[2]
250
- end
251
- @MethodCache[prefix][new] = @MethodCache[prefix][old] || "def #{new}(*args)\n #{old}(*args)\nend"
252
- }],
253
-
254
- [RE::Symbol],
255
-
256
- [RE::RERE, method(:string)],
257
-
258
- [RE::HeredocRE, method(:heredoc)],
259
-
260
- [/(^|\n)=begin/, lambda {|s, m| s.scan_until(/\n=end\s*\n/)}],
261
-
262
- [RE::Attrs, lambda {|s, m|
263
- _stack = clean_stack
264
- if _stack[-1][0] == :class
265
- prefix = _stack.lasts*'::'
266
- attrs = (m[3]/',').map {|attr| (m[1] ? '.' : '#')+attr.strip[1..-1]}
267
- if m[2].in %w(reader accessor)
268
- attrs.each {|attr| (@MethodCache[prefix][attr] ||= []) << "def #{'self.' if m[1]}#{attr}\n #{'@' if m[1]}@#{attr}\nend"}
269
- end
270
- if m[2].in %w(writer accessor)
271
- attrs.each {|attr| (@MethodCache[prefix][attr] ||= []) << "def #{'self.' if m[1]}#{attr}=value\n #{'@' if m[1]}@#{attr} = value\nend"}
272
- end
273
- end
274
- }],
275
-
276
- [RE::Include, lambda {|s, m|
277
- _stack = clean_stack
278
- if _stack.empty?
279
- if m[1] == 'include'
280
- inherit! 'Object', m[2]
281
- else
282
- inherit_singletons! 'Object', m[2]
283
- end
284
- elsif !_stack[-1][0].in([:def, :block]) and m[2] =~ /^[A-Z]/
285
- if m[1] == 'include'
286
- inherit! _stack.lasts*'::', m[2]
287
- else
288
- inherit_singletons! _stack.lasts*'::', m[2]
289
- end
290
- end
291
- }],
292
-
293
- [RE::AliasMethod, lambda {|s, m|
294
- _stack = clean_stack
295
- if _stack[-1][0] == :class
296
- new, old = m[1..2]
297
- prefix = _stack.lasts*'::'
298
- @MethodCache[prefix][new] = @MethodCache[prefix][old] || "def #{new}(*args)\n #{old}(*args)\nend"
299
- end
300
- }],
301
-
302
- [RE::Beginners, lambda {|s, m|
303
- if (m[2] and s.last != 0 and m[2].tr(' \t', '').empty? and !(s.string[s.last-1,1].to_s)[/[\n;]/])
304
- else
305
- if m[3] == 'if' and @stack.empty? and s.check_until(RE::EOF) and s.matched != "\n"
306
- throw :EOF
307
- end
308
- @stack << [m[5] ? :block : :beginner]
309
- end
310
- }],
311
-
312
- [/(^|[\s;])end/, lambda {|s, m|
313
- exit = @stack.pop
314
- case exit[0]
315
- when :def
316
- prefix, name = exit[1].sharp_split(/[.@#]/, 2)
317
- if !name
318
- prefix, name = 'Object', prefix
319
- end
320
- if @MethodCache[prefix]
321
- (@MethodCache[prefix][name] ||= []) << (path.inline ? [path, exit[2]...s.pos] : s.string[exit[2]...s.pos])
322
- end
323
- end
324
- }],
325
-
326
- [/(^|[\s;])__END__/, lambda {|s, m| throw :EOF}]
327
- ])}
328
- ss
329
- end
330
-
331
- def clean_stack(no_def=false)
332
- @stack.select {|e| e[0] != :beginner and !no_def || e[0] != :def}
333
- end
334
-
335
- def inherit!(descendant, ancestor)
336
- @MethodCache[descendant].reverse_merge((
337
- @MethodCache[fix_module_name(descendant, ancestor)] ||= {}
338
- ).map_values {|defs| defs.dup})
339
- end
340
-
341
- def inherit_singletons!(descendant, ancestor)
342
- (@MethodCache[fix_module_name(descendant, ancestor)] ||= {}).each {|name, defs|
343
- @MethodCache[descendant][name.sub('#', '.')] = defs.dup if name.ord == ?#
344
- }
345
- end
346
-
347
- def fix_module_name(current, name)
348
- if name =~ /^::/ or current == ''
349
- current+name
350
- elsif name == current or name == 'self'
351
- current
352
- elsif name !~ /^[A-Z]/
353
- current+'#'+name
354
- else
355
- path = current+'::'+name
356
- if @MethodCache[path]
357
- path
358
- else
359
- @MethodCache[name] ||= {}
360
- name
361
- end
362
- end
363
- end
364
-
365
- def get_lines(path)
366
- SCRIPT_LINES__.select {|d, f| d[path]}.lasts
367
- end
368
-
369
- def print_lines(prefix, name, all)
370
- map = lambda {|lines|
371
- if lines.is Array
372
- lines = SCRIPT_LINES__[lines[0]].join[lines[1]]
373
- end
374
- lines }
375
- methods = all ? @MethodCache[prefix][name].map(&map) : map.call(@MethodCache[prefix][name].last)
376
- puts methods
377
- end
378
-
379
- def code_of(path, name=nil, all=false)
380
- if name.in [true, :all]
381
- all = true
382
- end
383
- if path.is String
384
- prefix, name = path.sharp_split(/[.#]/, 2)
385
- elsif Class === path
386
- prefix = path.name
387
- name = ".#{name}"
388
- else
389
- prefix = path.class.name
390
- name = "##{name}"
391
- end
392
- if !(@MethodCache[prefix]||{})[name]
393
- puts "looking up script lines, please wait..."
394
- SCRIPT_LINES__.each_key {|k| parse_file k
395
- break if (@MethodCache[prefix]||{})[name]
396
- }
397
- end
398
- if !(@MethodCache[prefix]||{})[name]
399
- print "nothing was found for #{prefix}#{name}"
400
- name = name.tr('#.', '.#')
401
- if (@MethodCache[prefix]||{})[name]
402
- puts ", but found for #{name}:"
403
- print_lines prefix, name, all
404
- else
405
- return puts ''
406
- end
407
- end
408
- puts "code for #{prefix}#{name}:"
409
- print_lines prefix, name, all
410
- end
411
-
412
- end
413
-
414
- Reader = CodeReader.new
415
- end
416
-
417
- module Kernel
418
-
419
- def code_of(*args)
420
- RMTools::Reader.code_of(*args)
421
- end
422
-
423
- end
424
-
425
- class Method
426
-
427
- def code(all=false)
428
- RMTools::Reader.code_of(receiver, name, all)
429
- end
430
-
431
- end