rfs 0.1

Sign up to get free protection for your applications and to get access to all the features.
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