rmtools 1.2.0 → 1.2.2b

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.
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