rfs 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +7 -0
- data/Rakefile.rb +193 -0
- data/bin/RenameFileSet.rbw +14 -0
- data/bin/rfs.rb +214 -0
- data/bin/rfsd.rb +8 -0
- data/description.txt +24 -0
- data/lib/RenameFileSet.bak.rb +372 -0
- data/lib/errors.rb +15 -0
- data/lib/filters.rb +68 -0
- data/lib/gui.rb +216 -0
- data/lib/innate/array.rb +104 -0
- data/lib/innate/coverage.rb +315 -0
- data/lib/innate/debug.rb +12 -0
- data/lib/innate/debugger.rb +944 -0
- data/lib/innate/file.rb +5 -0
- data/lib/innate/filelines.rb +148 -0
- data/lib/innate/kernel.rb +41 -0
- data/lib/innate/metaid.rb +30 -0
- data/lib/innate/mkdirs.rb +12 -0
- data/lib/innate/regexp.rb +80 -0
- data/lib/innate/reload.rb +11 -0
- data/lib/innate/roman.rb +72 -0
- data/lib/innate/scriptlines.rb +60 -0
- data/lib/innate/string.rb +56 -0
- data/lib/innate/test/all_tests.rb +11 -0
- data/lib/innate/test/files/mkdirs_dummy.file +1 -0
- data/lib/innate/test/files/reloadtarget.rb +5 -0
- data/lib/innate/test/files/reloadtarget1.rb +5 -0
- data/lib/innate/test/files/reloadtarget2.rb +5 -0
- data/lib/innate/test/test_coverage.rb +13 -0
- data/lib/innate/test/testarray.rb +98 -0
- data/lib/innate/test/testfile.rb +15 -0
- data/lib/innate/test/testfilelines.rb +106 -0
- data/lib/innate/test/testkernel.rb +30 -0
- data/lib/innate/test/testmkdirs.rb +19 -0
- data/lib/innate/test/testregexp.rb +86 -0
- data/lib/innate/test/testreload.rb +61 -0
- data/lib/innate/test/testroman.rb +54 -0
- data/lib/innate/test/testscriptlines.rb +39 -0
- data/lib/innate/test/teststring.rb +52 -0
- data/lib/innate/test/testtitlecase.rb +20 -0
- data/lib/innate/titlecase.rb +64 -0
- data/lib/innate/tracerequire.rb +22 -0
- data/lib/namesource.rb +53 -0
- data/lib/options.rb +64 -0
- data/lib/providers.rb +93 -0
- data/lib/regexp.rb +56 -0
- data/lib/rename_functions.rb +142 -0
- data/lib/renamer.rb +210 -0
- data/lib/results.rb +83 -0
- data/lib/test/test_helper.rb +147 -0
- data/tests/dir/file1 +0 -0
- data/tests/dir/file2 +0 -0
- data/tests/dir/file3 +0 -0
- data/tests/test_helper.rb +147 -0
- data/tests/test_rename_functions.rb +605 -0
- metadata +105 -0
data/lib/innate/file.rb
ADDED
@@ -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,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
|
+
|
data/lib/innate/roman.rb
ADDED
@@ -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
|