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