rfs 0.1

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.
Files changed (57) hide show
  1. data/MIT-LICENSE +7 -0
  2. data/Rakefile.rb +193 -0
  3. data/bin/RenameFileSet.rbw +14 -0
  4. data/bin/rfs.rb +214 -0
  5. data/bin/rfsd.rb +8 -0
  6. data/description.txt +24 -0
  7. data/lib/RenameFileSet.bak.rb +372 -0
  8. data/lib/errors.rb +15 -0
  9. data/lib/filters.rb +68 -0
  10. data/lib/gui.rb +216 -0
  11. data/lib/innate/array.rb +104 -0
  12. data/lib/innate/coverage.rb +315 -0
  13. data/lib/innate/debug.rb +12 -0
  14. data/lib/innate/debugger.rb +944 -0
  15. data/lib/innate/file.rb +5 -0
  16. data/lib/innate/filelines.rb +148 -0
  17. data/lib/innate/kernel.rb +41 -0
  18. data/lib/innate/metaid.rb +30 -0
  19. data/lib/innate/mkdirs.rb +12 -0
  20. data/lib/innate/regexp.rb +80 -0
  21. data/lib/innate/reload.rb +11 -0
  22. data/lib/innate/roman.rb +72 -0
  23. data/lib/innate/scriptlines.rb +60 -0
  24. data/lib/innate/string.rb +56 -0
  25. data/lib/innate/test/all_tests.rb +11 -0
  26. data/lib/innate/test/files/mkdirs_dummy.file +1 -0
  27. data/lib/innate/test/files/reloadtarget.rb +5 -0
  28. data/lib/innate/test/files/reloadtarget1.rb +5 -0
  29. data/lib/innate/test/files/reloadtarget2.rb +5 -0
  30. data/lib/innate/test/test_coverage.rb +13 -0
  31. data/lib/innate/test/testarray.rb +98 -0
  32. data/lib/innate/test/testfile.rb +15 -0
  33. data/lib/innate/test/testfilelines.rb +106 -0
  34. data/lib/innate/test/testkernel.rb +30 -0
  35. data/lib/innate/test/testmkdirs.rb +19 -0
  36. data/lib/innate/test/testregexp.rb +86 -0
  37. data/lib/innate/test/testreload.rb +61 -0
  38. data/lib/innate/test/testroman.rb +54 -0
  39. data/lib/innate/test/testscriptlines.rb +39 -0
  40. data/lib/innate/test/teststring.rb +52 -0
  41. data/lib/innate/test/testtitlecase.rb +20 -0
  42. data/lib/innate/titlecase.rb +64 -0
  43. data/lib/innate/tracerequire.rb +22 -0
  44. data/lib/namesource.rb +53 -0
  45. data/lib/options.rb +64 -0
  46. data/lib/providers.rb +93 -0
  47. data/lib/regexp.rb +56 -0
  48. data/lib/rename_functions.rb +142 -0
  49. data/lib/renamer.rb +210 -0
  50. data/lib/results.rb +83 -0
  51. data/lib/test/test_helper.rb +147 -0
  52. data/tests/dir/file1 +0 -0
  53. data/tests/dir/file2 +0 -0
  54. data/tests/dir/file3 +0 -0
  55. data/tests/test_helper.rb +147 -0
  56. data/tests/test_rename_functions.rb +605 -0
  57. metadata +105 -0
@@ -0,0 +1,5 @@
1
+ class File
2
+ def self.absolute_path? name
3
+ name if /^(\.|[A-Za-z]:|\/)/ =~ name
4
+ end
5
+ end
@@ -0,0 +1,148 @@
1
+
2
+ # load is not currently thread safe.
3
+ class FileLines < Array
4
+ def initialize(fn)
5
+ @fn = fn
6
+ @init = false
7
+ @loaded_all = false
8
+ end
9
+
10
+ alias_method :at_before_file_lines, :[]
11
+
12
+ def at(i)
13
+ load i
14
+ super
15
+ end
16
+
17
+ def [](r)
18
+ load r
19
+ super
20
+ end
21
+
22
+ def []=(i, v)
23
+ super
24
+ end
25
+
26
+ def length
27
+ init
28
+ super
29
+ end
30
+
31
+ def size
32
+ init
33
+ super
34
+ end
35
+
36
+ def values_at(*a)
37
+ load(*a)
38
+ super
39
+ end
40
+
41
+ def each
42
+ load_all
43
+ super
44
+ end
45
+
46
+ def first
47
+ at 0
48
+ end
49
+
50
+ def last
51
+ at length - 1
52
+ end
53
+
54
+ def collect
55
+ load_all
56
+ super
57
+ end
58
+
59
+ private
60
+ def init
61
+ return if @init
62
+ @init = true
63
+ if @fn
64
+ begin
65
+ File.open @fn do |f|
66
+ p = 1
67
+ pos = 0
68
+ crlf = 0
69
+ self[0] = 0
70
+ f.each_line do |l|
71
+ if p == 2
72
+ f.seek pos, IO::SEEK_SET
73
+ if f.readline == l
74
+ crlf = 1
75
+ else
76
+ crlf = 0
77
+ end
78
+ break
79
+ end
80
+ p += 1
81
+ pos += l.length + 1
82
+ end
83
+ p = 1
84
+ pos = 0
85
+ f.rewind
86
+ f.each_line do |l|
87
+ self[p] = pos += l.length + crlf
88
+ p += 1
89
+ end
90
+ end
91
+ pop
92
+ rescue
93
+ end
94
+ end
95
+ end
96
+
97
+ def load_all
98
+ return if @loaded_all
99
+ load 0...length
100
+ @loaded_all = true
101
+ end
102
+
103
+ def load(*v)
104
+ return if @loading or !@fn
105
+ begin
106
+ @loading = true
107
+ init
108
+ range = nil
109
+ return if @loaded_all
110
+ begin
111
+ File.open @fn do |f|
112
+ v.each do |i|
113
+ range = make_range i
114
+
115
+ # could add support for neg. indexes...
116
+ # but don't need it now.
117
+ range.each do |line_num|
118
+ val = at line_num
119
+ if val.is_a? Fixnum
120
+ f.seek val, IO::SEEK_SET
121
+ self[line_num] = f.readline
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ rescue
128
+ v.collect do |i|
129
+ make_range(i).collect {nil}
130
+ end.flatten
131
+ end
132
+ ensure
133
+ @loading = false
134
+ end
135
+
136
+ def make_range i
137
+ if i.is_a? Range
138
+ if i.last < 0
139
+ Range.new i.first, length + i.last, i.exclude_end?
140
+ else
141
+ i
142
+ end
143
+ else
144
+ i..i
145
+ end
146
+ end
147
+ end
148
+
@@ -0,0 +1,41 @@
1
+ require 'innate/file'
2
+
3
+ def find_in_path f
4
+ (['.'] + $:).each do |p|
5
+ ['', '.rb', '.rbw'].each do |ext|
6
+ fn = File.expand_path File.join(p, f + ext)
7
+ if File.exists? fn and !File.directory? fn
8
+ return fn
9
+ end
10
+ end
11
+ end
12
+ nil
13
+ end
14
+
15
+ def each_loaded_file
16
+ ($").each do |f|
17
+ if File.exists? f
18
+ yield f
19
+ else
20
+ fn = File.absolute_path?(f) ? f : find_in_path(f)
21
+ if fn
22
+ yield fn
23
+ else
24
+ raise "file not found: #{f}" unless found
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ def each_caller
31
+ caller.each do |c|
32
+ m = /^(.+):(\d+)(:in `(.*)')?$/.match c
33
+ yield m[1].gsub('\\', '/'), m[2] ? m[2].to_i : 0, m[4]
34
+ end
35
+ end
36
+
37
+ def each_lfoc
38
+ each_loaded_file {|fn| yield fn}
39
+ each_caller {|fn, l, f| yield fn}
40
+ end
41
+
@@ -0,0 +1,30 @@
1
+
2
+ # From http://www.whytheluckystiff.net/articles/seeingMetaclassesClearly.html
3
+
4
+ class Object
5
+
6
+ # The hidden singleton lurks behind everyone
7
+ def metaclass
8
+ class << self
9
+ self
10
+ end
11
+ end
12
+
13
+ def meta_eval &blk
14
+ metaclass.instance_eval(&blk)
15
+ end
16
+
17
+ # Adds methods to a metaclass
18
+ def meta_def name, &blk
19
+ meta_eval { define_method name, &blk }
20
+ end
21
+
22
+ # Defines an instance method within a class
23
+ def class_def name, &blk
24
+ class_eval { define_method name, &blk }
25
+ end
26
+
27
+ def class_undef name
28
+ class_eval { undef_method name }
29
+ end
30
+ end
@@ -0,0 +1,12 @@
1
+ class File
2
+ def self.mkdirs(d)
3
+ return true if File.directory? d
4
+ return false if File.exist? d
5
+ p = File.split d
6
+ return false if p[1] == '\\'
7
+ Dir.mkdir(d) if mkdirs p[0]
8
+ true
9
+ end
10
+ end
11
+
12
+
@@ -0,0 +1,80 @@
1
+ class Regexp
2
+ def interpolate replace, new_pattern
3
+ r = /^\(\?([imx]*)(-[imx]+)?:(.*?)#{Regexp.escape replace}(.*)\)$/
4
+ m = r.match self.to_s
5
+ if m
6
+ s = "#{m[3]}#{new_pattern}#{m[4]}"
7
+ o = m[1] || ''
8
+ self.class.new(s,
9
+ (o.include?(?i) ? Regexp::IGNORECASE : 0) |
10
+ (o.include?(?m) ? Regexp::MULTILINE : 0) |
11
+ (o.include?(?x) ? Regexp::EXTENDED : 0))
12
+ else
13
+ self
14
+ end
15
+ end
16
+ end
17
+
18
+ class MatchData
19
+ def replace_capture(c, s)
20
+ string[0, offset(c)[0]] + (s || '') + string[offset(c)[1]..-1]
21
+ end
22
+
23
+ def display(first = 0, last = nil, open = '(', close = ')')
24
+ s = pre_match
25
+ p = s.length
26
+ e = []
27
+ (first...(last || length)).each do |o|
28
+ next if offset(o) == [nil, nil]
29
+ while e.last and e.last <= offset(o).first
30
+ s << string[p...e.last] + close
31
+ p = e.pop
32
+ end
33
+ s << string[p...offset(o).first] + open
34
+ p = offset(o).first
35
+ e << offset(o).last
36
+ end
37
+ while e.last
38
+ s << string[p...e.last] + close
39
+ p = e.pop
40
+ end
41
+ s << string[p..-1]
42
+ return s
43
+ end
44
+
45
+ def breakdown
46
+ s = []
47
+ length.times do |o|
48
+ if offset(o) == [nil, nil]
49
+ s << ''
50
+ else
51
+ s << (' ' * offset(o).first) + self[o] + (' ' * (string.length - offset(o).last))
52
+ end
53
+ end
54
+ s
55
+ end
56
+
57
+ def display_breakdown
58
+ r = "S: |#{string}|"
59
+ breakdown.each_with_index do |s, i|
60
+ r += "\n#{i}: |#{s}|"
61
+ end
62
+ r
63
+ end
64
+
65
+ # Replace the matching part of the string with match interpolation.
66
+ #
67
+ # If there are any captures, replaces the first one,
68
+ # otherwise replaces the whole match.
69
+ #
70
+ # Interpolates %n to the corresponding capture.
71
+ def sub(repl, capture_num = 1)
72
+ cn = capture_num || 1
73
+ t = repl.clone
74
+ to_a[1..-1].each_with_index do |m, i|
75
+ t.gsub!("%#{i + 1}", m ? m : '')
76
+ end
77
+ replace_capture self[cn] ? cn : 0, t
78
+ end
79
+ end
80
+
@@ -0,0 +1,11 @@
1
+ def reload s
2
+ unless $".delete s
3
+ if /\.rb$/ =~ s
4
+ require s
5
+ else
6
+ reload s + '.rb'
7
+ end
8
+ else
9
+ require s
10
+ end
11
+ end
@@ -0,0 +1,72 @@
1
+ require 'innate/regexp'
2
+
3
+ class Regexp
4
+ # All groups are non-capturing!
5
+ def self.ROMAN_PATTERN
6
+ '(?:M{0,4})(?:C[DM]|D?C{0,3})(?:X[LC]|L?X{0,3})(?:I[VX]|V?I{0,3})'
7
+ end
8
+
9
+ def self.ROMAN
10
+ Regexp.new("^#{self.ROMAN_PATTERN}$", 'i')
11
+ end
12
+
13
+ def interpolate_roman
14
+ # r = /\?([imx]*-[imx]*:[^(]\()roman(\).*)/
15
+ interpolate '(roman)', "(#{Regexp.ROMAN_PATTERN})"
16
+ end
17
+ end
18
+
19
+
20
+
21
+ class String
22
+ def roman_numeral?
23
+ self =~ Regexp.ROMAN ? self : nil
24
+ end
25
+
26
+ def toggle_roman
27
+ if Regexp.ROMAN =~ self
28
+ roman_to_i.to_s
29
+ else
30
+ to_i.roman
31
+ end
32
+ end
33
+
34
+ def roman_to_i
35
+ raise "#{self} is not a valid roman numeral." unless roman_numeral?
36
+ s = upcase
37
+ values = { ?M => 1000, ?D => 500, ?C => 100, ?L => 50, ?X => 10, ?V => 5, ?I => 1 }
38
+ value = result = 0
39
+ upcase.each_byte do |b|
40
+ result -= value *2 if values[b] > value
41
+ result += (value = values[b])
42
+ end
43
+ result
44
+ end
45
+ end
46
+
47
+
48
+ class Fixnum
49
+ def roman
50
+ raise 'There is no Roman representation for numbers below 1.' if self < 1
51
+ raise 'There is no Roman representation for numbers above 4999.' if self > 4999
52
+ elements = {1000 => 'M',500 => 'D',100 => 'C',50 => 'L',10 => 'X',5 => 'V',1 => 'I'}
53
+ values = [1000, 500, 100, 50, 10, 5, 1]
54
+ r = ''
55
+ int = self
56
+ values.each do |v|
57
+ while int >= v
58
+ r += elements[v]
59
+ int -= v
60
+ end
61
+ if v > 1
62
+ v.to_s[0,1] == '5' ? t = v / 5 : t = v / 10
63
+ if int >= v - t
64
+ r += elements[t] + elements[v]
65
+ int -= v - t
66
+ end
67
+ end
68
+ end
69
+ return r
70
+ end
71
+ end
72
+
@@ -0,0 +1,60 @@
1
+ SCRIPT_LINES__ = {} unless defined? SCRIPT_LINES__
2
+
3
+ require 'innate/filelines'
4
+ require 'innate/kernel'
5
+
6
+ module ScriptLines
7
+ def handle_odd_paths
8
+ SCRIPT_LINES__.select {|k,v| v.is_a? Array}.each do |k, v|
9
+ x = SCRIPT_LINES__[File.expand_path(k)]
10
+ unless x and x.is_a? FileLines
11
+ x = FileLines.new(k)
12
+ end
13
+ SCRIPT_LINES__[k] = x
14
+ end
15
+ end
16
+ module_function :handle_odd_paths
17
+
18
+ def display
19
+ SCRIPT_LINES__.collect.sort.each {|k,v| puts "#{v.class} #{k}"}
20
+ SCRIPT_LINES__.length
21
+ end
22
+ module_function :display
23
+ end
24
+
25
+ each_lfoc do |fn|
26
+ unless SCRIPT_LINES__[fn].is_a? FileLines
27
+ if fn =~ /\.rbw?/
28
+ SCRIPT_LINES__[fn] = FileLines.new fn
29
+ end
30
+ end
31
+ end
32
+ ScriptLines.handle_odd_paths
33
+
34
+ class Object
35
+ alias :require_before_laziness :require unless respond_to? :require_before_laziness
36
+ def require *files
37
+ r = require_before_laziness(*files)
38
+ if r
39
+ files.each do |f|
40
+ fn = find_in_path f
41
+ if fn
42
+ fl = FileLines.new fn
43
+ SCRIPT_LINES__[fn] = fl
44
+ SCRIPT_LINES__[f] = fl if f[0] == ?.
45
+ end
46
+ end
47
+ ScriptLines.handle_odd_paths
48
+ end
49
+ return r
50
+ end
51
+
52
+ #alias :require_gem_before_laziness :require_gem unless respond_to? :require_gem_before_laziness if
53
+ #def require_gem *files
54
+ #r = require_gem_before_laziness(*files)
55
+ #if r
56
+ #ScriptLines.handle_odd_paths
57
+ #end
58
+ #r
59
+ #end
60
+ end