fixnames 0.4.1 → 0.5.0

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.
@@ -29,76 +29,107 @@ optparse = OptionParser.new do |opts|
29
29
  opts.separator 'DIRECTORIES:'
30
30
 
31
31
  opts.on('-g', '--glob=GLOB_STRING',
32
- "Filename glob to use inside each directory for when
32
+ "Filename glob to use inside each directory for when
33
33
  #{desc_pad}we are left to ourself. Default: #{options.dir_glob}"
34
34
  ) { |val| options.dir_glob = val }
35
35
 
36
36
  opts.on('-R', '--[no-]recursive',
37
- 'Recursively descend into directories'
37
+ 'Recursively descend into directories'
38
38
  ) { |val| options.recursive = val }
39
39
 
40
40
  opts.separator ''
41
41
  opts.separator 'FILTERS:'
42
42
 
43
- opts.on('-A', '--[no-]hack_and',
44
- 'Replace "&" with "_and_"'
43
+ opts.on('-H', '--[no-]hack-and',
44
+ 'Replace "&" with "_and_"'
45
+ ) { |val| options.hack_and = val }
46
+
47
+ opts.on('-A', '--[no-]and-to-dash',
48
+ 'Replace "_and_" with "-"'
45
49
  ) { |val| options.hack_and = val }
46
50
 
47
51
  opts.on('-C', '--[no-]semicolon',
48
- 'Replace ";" with "-"'
52
+ 'Replace ";" with "-"'
49
53
  ) { |val| options.semicolon = val }
50
54
 
51
55
  opts.on('-B', '--[no-]banners',
52
- 'Trims [FOO] style advert prefixs from the beginning'
56
+ 'Trims [FOO] style advert prefixs from the beginning'
53
57
  ) { |val| options.banners = val }
54
58
 
55
- opts.on('-b', '--[no-]brackets',
56
- 'Trims (round) or [square] bracket regions'
57
- ) { |val| options.brackets = val }
58
-
59
59
  opts.on('-k', '--[no-]checksums',
60
- "Trims [0A1B2C3D] CRC32 bracket-wrapped checksums
60
+ "Trims [0A1B2C3D] CRC32 bracket-wrapped checksums
61
61
  #{desc_pad}from names, when wrapped with square brackes []
62
62
  #{desc_pad}or round parens ()"
63
63
  ) { |val| options.checksums = val }
64
64
 
65
65
  opts.on('-d', '--[no-]dots',
66
- 'Trims excessive dots from files
66
+ 'Trims excessive dots from files
67
67
  (before the .extention)'
68
68
  ) { |val| options.fix_dots = val }
69
69
 
70
70
  opts.on('-D', '--[no-]dashes',
71
- 'Trims redundant dashes, and leading/trailing dashes'
71
+ 'Trims redundant dashes, and leading/trailing dashes'
72
72
  ) { |val| options.fix_dashes = val }
73
73
 
74
+ opts.on('-N', '--[no-]numsep',
75
+ 'Fixes the separator afterinitial numbers. That is,
76
+ #{desc_pad}it replaces ^(\d+)_ with ^(\d+)-"'
77
+ ) { |val| options.fix_numsep = val }
78
+
74
79
  opts.on('-c', '--[no-]camelcase',
75
- 'Undo camelCase with underscores. "aB" becomes "a_b"'
80
+ 'Undo camelCase with underscores. "aB" becomes "a_b"'
76
81
  ) { |val| options.camelcase = val }
77
82
 
78
83
  opts.on('-l', '--[no-]lowercase',
79
- 'Forces all letters to lowercase'
84
+ 'Forces all letters to lowercase'
80
85
  ) { |val| options.lowercase = val }
81
86
 
82
87
  opts.separator ''
83
88
  opts.separator 'CHARACTERS:'
84
89
 
90
+ opts.on('-b', '--[no-]brackets',
91
+ "Trims matching bracket, replacing with a \"-\" or
92
+ #{desc_pad}nothing if at the beginning of end of the name;
93
+ #{desc_pad}characters that count as a bracket defined with
94
+ #{desc_pad}the options --bracken-open and --br-close"
95
+ ) { |val| options.brackets = val }
96
+
97
+ opts.on('-O', '--br-open=CHARS',
98
+ "Characters that count as the 'opening' half of a
99
+ #{desc_pad}bracket pair. Much be the same number of chars
100
+ #{desc_pad}as --br-close. The order in BOTH of these
101
+ #{desc_pad}options determines the pairing between open and
102
+ #{desc_pad}close, in a manner very similar tr(1).
103
+ #{desc_pad}Default: #{options.bracket_characters_close}"
104
+ ) { |val| options.bracket_characters_open = val }
105
+
106
+ opts.on('-L', '--br-close=CHARS',
107
+ "Characters that count as the 'opening' half of a
108
+ #{desc_pad}bracket pair. Much be the same number of chars
109
+ #{desc_pad}as --br-close. The order in BOTH of these
110
+ #{desc_pad}options determines the pairing between open and
111
+ #{desc_pad}close, in a manner very similar tr(1).
112
+ #{desc_pad}Default: #{options.bracket_characters_close}"
113
+ ) { |val| options.bracket_characters_close = val }
114
+
85
115
  opts.on('-w', '--whitespace=CHARS',
86
- "Characters to treat as whitespace, to be
116
+ "Characters to treat as whitespace, to be
87
117
  #{desc_pad}replaced with underscores."
88
118
  ) { |val| options.whitespace = val }
89
119
 
90
120
  opts.on('-W', '--no-whitespace',
91
- 'Do not parse any character as whitespace'
121
+ 'Do not parse any character as whitespace'
92
122
  ) { options.whitespace = nil }
93
123
 
94
- opts.on('-s', '--strip=CHARLIST',
95
- "Individual characters to strip from names.
124
+ opts.on('-s', '--[no-]strip=CHARLIST',
125
+ "Individual characters to strip from names.
96
126
  #{desc_pad}Default: #{options.charstrip}"
97
127
  ) { |val| options.charstrip = val }
98
128
 
99
- opts.on('-S', '--no-strip',
100
- 'Do not strip any specific characters'
101
- ) { options.charstrip = nil }
129
+ opts.on('-j', '--[no-]junkwords=WORDLIST',
130
+ "Words to always strip, separated by commas.
131
+ #{desc_pad}Default: #{options.junkwords.join(',')}"
132
+ ) { options.junkwords = nil }
102
133
 
103
134
  opts.separator ''
104
135
  opts.separator 'REGEX-REPLACE:'
@@ -29,76 +29,107 @@ optparse = OptionParser.new do |opts|
29
29
  opts.separator 'DIRECTORIES:'
30
30
 
31
31
  opts.on('-g', '--glob=GLOB_STRING',
32
- "Filename glob to use inside each directory for when
32
+ "Filename glob to use inside each directory for when
33
33
  #{desc_pad}we are left to ourself. Default: #{options.dir_glob}"
34
34
  ) { |val| options.dir_glob = val }
35
35
 
36
36
  opts.on('-R', '--[no-]recursive',
37
- 'Recursively descend into directories'
37
+ 'Recursively descend into directories'
38
38
  ) { |val| options.recursive = val }
39
39
 
40
40
  opts.separator ''
41
41
  opts.separator 'FILTERS:'
42
42
 
43
- opts.on('-A', '--[no-]hack_and',
44
- 'Replace "&" with "_and_"'
43
+ opts.on('-H', '--[no-]hack-and',
44
+ 'Replace "&" with "_and_"'
45
+ ) { |val| options.hack_and = val }
46
+
47
+ opts.on('-A', '--[no-]and-to-dash',
48
+ 'Replace "_and_" with "-"'
45
49
  ) { |val| options.hack_and = val }
46
50
 
47
51
  opts.on('-C', '--[no-]semicolon',
48
- 'Replace ";" with "-"'
52
+ 'Replace ";" with "-"'
49
53
  ) { |val| options.semicolon = val }
50
54
 
51
55
  opts.on('-B', '--[no-]banners',
52
- 'Trims [FOO] style advert prefixs from the beginning'
56
+ 'Trims [FOO] style advert prefixs from the beginning'
53
57
  ) { |val| options.banners = val }
54
58
 
55
- opts.on('-b', '--[no-]brackets',
56
- 'Trims (round) or [square] bracket regions'
57
- ) { |val| options.brackets = val }
58
-
59
59
  opts.on('-k', '--[no-]checksums',
60
- "Trims [0A1B2C3D] CRC32 bracket-wrapped checksums
60
+ "Trims [0A1B2C3D] CRC32 bracket-wrapped checksums
61
61
  #{desc_pad}from names, when wrapped with square brackes []
62
62
  #{desc_pad}or round parens ()"
63
63
  ) { |val| options.checksums = val }
64
64
 
65
65
  opts.on('-d', '--[no-]dots',
66
- 'Trims excessive dots from files
66
+ 'Trims excessive dots from files
67
67
  (before the .extention)'
68
68
  ) { |val| options.fix_dots = val }
69
69
 
70
70
  opts.on('-D', '--[no-]dashes',
71
- 'Trims redundant dashes, and leading/trailing dashes'
71
+ 'Trims redundant dashes, and leading/trailing dashes'
72
72
  ) { |val| options.fix_dashes = val }
73
73
 
74
+ opts.on('-N', '--[no-]numsep',
75
+ 'Fixes the separator afterinitial numbers. That is,
76
+ #{desc_pad}it replaces ^(\d+)_ with ^(\d+)-"'
77
+ ) { |val| options.fix_numsep = val }
78
+
74
79
  opts.on('-c', '--[no-]camelcase',
75
- 'Undo camelCase with underscores. "aB" becomes "a_b"'
80
+ 'Undo camelCase with underscores. "aB" becomes "a_b"'
76
81
  ) { |val| options.camelcase = val }
77
82
 
78
83
  opts.on('-l', '--[no-]lowercase',
79
- 'Forces all letters to lowercase'
84
+ 'Forces all letters to lowercase'
80
85
  ) { |val| options.lowercase = val }
81
86
 
82
87
  opts.separator ''
83
88
  opts.separator 'CHARACTERS:'
84
89
 
90
+ opts.on('-b', '--[no-]brackets',
91
+ "Trims matching bracket, replacing with a \"-\" or
92
+ #{desc_pad}nothing if at the beginning of end of the name;
93
+ #{desc_pad}characters that count as a bracket defined with
94
+ #{desc_pad}the options --bracken-open and --br-close"
95
+ ) { |val| options.brackets = val }
96
+
97
+ opts.on('-O', '--br-open=CHARS',
98
+ "Characters that count as the 'opening' half of a
99
+ #{desc_pad}bracket pair. Much be the same number of chars
100
+ #{desc_pad}as --br-close. The order in BOTH of these
101
+ #{desc_pad}options determines the pairing between open and
102
+ #{desc_pad}close, in a manner very similar tr(1).
103
+ #{desc_pad}Default: #{options.bracket_characters_close}"
104
+ ) { |val| options.bracket_characters_open = val }
105
+
106
+ opts.on('-L', '--br-close=CHARS',
107
+ "Characters that count as the 'opening' half of a
108
+ #{desc_pad}bracket pair. Much be the same number of chars
109
+ #{desc_pad}as --br-close. The order in BOTH of these
110
+ #{desc_pad}options determines the pairing between open and
111
+ #{desc_pad}close, in a manner very similar tr(1).
112
+ #{desc_pad}Default: #{options.bracket_characters_close}"
113
+ ) { |val| options.bracket_characters_close = val }
114
+
85
115
  opts.on('-w', '--whitespace=CHARS',
86
- "Characters to treat as whitespace, to be
116
+ "Characters to treat as whitespace, to be
87
117
  #{desc_pad}replaced with underscores."
88
118
  ) { |val| options.whitespace = val }
89
119
 
90
120
  opts.on('-W', '--no-whitespace',
91
- 'Do not parse any character as whitespace'
121
+ 'Do not parse any character as whitespace'
92
122
  ) { options.whitespace = nil }
93
123
 
94
- opts.on('-s', '--strip=CHARLIST',
95
- "Individual characters to strip from names.
124
+ opts.on('-s', '--[no-]strip=CHARLIST',
125
+ "Individual characters to strip from names.
96
126
  #{desc_pad}Default: #{options.charstrip}"
97
127
  ) { |val| options.charstrip = val }
98
128
 
99
- opts.on('-S', '--no-strip',
100
- 'Do not strip any specific characters'
101
- ) { options.charstrip = nil }
129
+ opts.on('-j', '--[no-]junkwords=WORDLIST',
130
+ "Words to always strip, separated by commas.
131
+ #{desc_pad}Default: #{options.junkwords.join(',')}"
132
+ ) { options.junkwords = nil }
102
133
 
103
134
  opts.separator ''
104
135
  opts.separator 'REGEX-REPLACE:'
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "fixnames"
8
- s.version = "0.4.1"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brent Sanders"]
12
- s.date = "2012-02-26"
12
+ s.date = "2012-11-29"
13
13
  s.description = "Cleans up filenames so they can easily be used\nin scripts, without annoyances such as spaces or other bad characters"
14
14
  s.email = "git@thoughtnoise.net"
15
15
  s.executables = ["fixnames", "fixdirs"]
@@ -36,17 +36,23 @@ Gem::Specification.new do |s|
36
36
  "lib/fixnames/interface.rb",
37
37
  "lib/fixnames/option.rb",
38
38
  "lib/fixnames/version.rb",
39
+ "spec/fixnames/and_to_dash_spec.rb",
40
+ "spec/fixnames/badopt_spec.rb",
39
41
  "spec/fixnames/banners_spec.rb",
40
42
  "spec/fixnames/brackets_spec.rb",
41
43
  "spec/fixnames/camelcase_spec.rb",
42
44
  "spec/fixnames/charstrip_spec.rb",
43
45
  "spec/fixnames/checksums_spec.rb",
46
+ "spec/fixnames/dashes_spec.rb",
47
+ "spec/fixnames/expunge_spec.rb",
44
48
  "spec/fixnames/fixdots_spec.rb",
45
49
  "spec/fixnames/hack_and_spec.rb",
46
50
  "spec/fixnames/lowercase_spec.rb",
51
+ "spec/fixnames/numsep_spec.rb",
47
52
  "spec/fixnames/semicolon_spec.rb",
48
53
  "spec/fixnames/whitespace_spec.rb",
49
54
  "spec/spec_helper.rb",
55
+ "spec/support/option_setting_helpers.rb",
50
56
  "spec/support/should_fix_helpers.rb",
51
57
  "test/helper.rb",
52
58
  "test/test_charstrip.rb",
@@ -58,7 +64,7 @@ Gem::Specification.new do |s|
58
64
  s.homepage = "http://github.com/pdkl95/fixnames"
59
65
  s.licenses = ["MIT"]
60
66
  s.require_paths = ["lib"]
61
- s.rubygems_version = "1.8.11"
67
+ s.rubygems_version = "1.8.23"
62
68
  s.summary = "Filename cleanup for script compatability"
63
69
 
64
70
  if s.respond_to? :specification_version then
@@ -8,6 +8,10 @@ module Fixnames
8
8
  replace '&', '_and_'
9
9
  end
10
10
 
11
+ def and_to_dash
12
+ replace '[-_ ]+and[-_ ]+', '-'
13
+ end
14
+
11
15
  def semicolon
12
16
  translate ';', '-'
13
17
  fixed.squeeze! '-'
@@ -20,7 +24,13 @@ module Fixnames
20
24
  end
21
25
 
22
26
  def brackets
23
- remove wrap_brackets('.+?')
27
+ bop = option.bracket_characters_open.dup
28
+ bcl = option.bracket_characters_close.dup
29
+ while bop.length > 0
30
+ op = "%03o" % bop.slice!(0,1).bytes.first
31
+ cl = "%03o" % bcl.slice!(0,1).bytes.first
32
+ replace "\\#{op}(.+?)\\#{cl}", '-\\1-'
33
+ end
24
34
  end
25
35
 
26
36
  def checksums
@@ -40,8 +50,17 @@ module Fixnames
40
50
 
41
51
  def fix_dashes
42
52
  fixed.squeeze! '-'
43
- remove '^-' while fixed =~ /^-/
44
- remove '-$' while fixed =~ /-$/
53
+ replace_all '--', '-'
54
+
55
+ remove_all '^-'
56
+ remove_all '-$'
57
+
58
+ replace_all '-\.', '.'
59
+ replace_all '\.-', '.'
60
+ end
61
+
62
+ def fix_numsep
63
+ replace '^(\d+)_', '\1-'
45
64
  end
46
65
 
47
66
  def camelcase
@@ -59,11 +78,15 @@ module Fixnames
59
78
 
60
79
  def whitespace(chrlist)
61
80
  replace "[#{Regexp.escape chrlist}]", '_'
62
- replace '[_-]\.', '.' while fixed =~ /[_-]\./
63
- replace '_-', '-' while fixed =~ /_-/
64
- replace '-_', '-' while fixed =~ /-_/
65
- remove '^_' while fixed =~ /^_/
66
- remove '_$' while fixed =~ /_$/
81
+
82
+ remove_all '^_'
83
+ remove_all '_$'
84
+
85
+ replace_all '_-', '-'
86
+ replace_all '-_', '-'
87
+ replace_all '_\.', '.'
88
+ replace_all '\._', '.'
89
+
67
90
  fixed.squeeze! '_'
68
91
  end
69
92
 
@@ -1,5 +1,12 @@
1
1
  module Fixnames
2
2
  module Helpers
3
+ def safeloop(condition, max_tries = option.max_filter_loops, &block)
4
+ max_tries.times do
5
+ return fixed unless fixed =~ Regexp.new(condition)
6
+ block.call
7
+ end
8
+ end
9
+
3
10
  def replace(re, replacement)
4
11
  re_str = bold "/#{re}/"
5
12
  replacement_str = bold "\"#{replacement}\""
@@ -13,6 +20,14 @@ module Fixnames
13
20
  fixed.gsub! Regexp.new(re), ''
14
21
  end
15
22
 
23
+ def replace_all(condition, replacement)
24
+ safeloop(condition) { replace(condition, replacement) }
25
+ end
26
+
27
+ def remove_all(condition)
28
+ safeloop(condition) { remove(condition) }
29
+ end
30
+
16
31
  def translate(src, dst)
17
32
  debug "\t<translate> #{bold src.inspect} -> #{bold dst.inspect}"
18
33
  fixed.tr! src, dst
@@ -2,30 +2,56 @@ require 'abbrev'
2
2
 
3
3
  module Fixnames
4
4
  class Option
5
+ # the maximum number of times we will allow a filter
6
+ # to be applied before giving up and moving on to the next
7
+ MAX_FILTER_LOOPS = 6
8
+
5
9
  # filters that MUST run early
6
- SETUP_FILTERS = [ :expunge ]
10
+ SETUP_FILTERS = [
11
+ :expunge,
12
+ :brackets
13
+ ]
7
14
 
8
15
  # filters that only accept a simple boolean on/off
9
- FLAG_FILTERS = [ :hack_and, :checksums, :banners,
10
- :brackets, :semicolon,
11
- :camelcase, :lowercase,
12
- :fix_dots, :fix_dashes ]
16
+ FLAG_FILTERS = [
17
+ :hack_and,
18
+ :and_to_dash,
19
+ :checksums,
20
+ :banners,
21
+ :semicolon,
22
+ :camelcase,
23
+ :lowercase,
24
+ :fix_dots,
25
+ :fix_dashes,
26
+ :fix_numsep
27
+ ]
13
28
 
14
29
  # filters that accept character ranges
15
- CHAR_FILTERS = [ :junkwords, :charstrip, :whitespace]
30
+ CHAR_FILTERS = [
31
+ :junkwords,
32
+ :charstrip,
33
+ :whitespace
34
+ ]
35
+
36
+ # filters that MUST run after everything else
37
+ LATE_FILTERS = [
38
+ :fix_numsep
39
+ ]
16
40
 
17
41
  # standard order to apply the filters
18
- DEFAULT_FILTER_ORDER = [ SETUP_FILTERS,
19
- FLAG_FILTERS,
20
- CHAR_FILTERS
21
- ].flatten
42
+ DEFAULT_FILTER_ORDER = [
43
+ SETUP_FILTERS,
44
+ FLAG_FILTERS,
45
+ CHAR_FILTERS,
46
+ LATE_FILTERS
47
+ ].flatten
22
48
 
23
49
  DEFAULT_DIR_GLOB = '*'
24
50
  DEFAULT_MENDSTR = ''
25
51
  DEFAULT_WHITESPACE = " \t_"
26
52
  DEFAULT_BRACKET_CHARACTERS_OPEN = '[({<'
27
53
  DEFAULT_BRACKET_CHARACTERS_CLOSE = '])}>'
28
- DEFAULT_CHARSTRIP = "[]{}'\",()+!~@#/\\"
54
+ DEFAULT_CHARSTRIP = "[]{}'\",()+!~@#/\\<>"
29
55
  DEFAULT_JUNKWORDS = [ 'x264', 'hdtv', '2hd', '720p', 'dvdrip']
30
56
  DEFAULT_BANNER_TYPES = [ 'xxx', 'dvdrip', 'dual_audio',
31
57
  'xvid', 'h264', 'divx' ]
@@ -40,6 +66,9 @@ module Fixnames
40
66
  var = "@#{name}"
41
67
 
42
68
  define_method "valid_for_#{name}?" do |value|
69
+ value = nil if value == false
70
+ return true if value.nil?
71
+ return true if value == ''
43
72
  types.map do |type|
44
73
  value.is_a?(type)
45
74
  end.reduce(false) do |t,x|
@@ -53,7 +82,7 @@ module Fixnames
53
82
  end
54
83
  if args.length == 1
55
84
  unless send("valid_for_#{name}?", args[0])
56
- raise "bad type for option"
85
+ raise ArgumentError, "bad type for option"
57
86
  end
58
87
  instance_variable_set(var, args[0])
59
88
  end
@@ -62,7 +91,7 @@ module Fixnames
62
91
 
63
92
  define_method "#{name}=" do |value|
64
93
  unless send("valid_for_#{name}?", value)
65
- raise "bad type for option"
94
+ raise ArgumentError, "bad type for option"
66
95
  end
67
96
  instance_variable_set(var, value)
68
97
  end
@@ -87,6 +116,9 @@ module Fixnames
87
116
  # * `verbose=3` ; all *filters* are output as they run for debugging. Very noisy.
88
117
  mkopt :verbose, Integer, 0
89
118
 
119
+ # @note The maximum number of times a {Fixname::Filters} will be applied before giving and proceeding with the next filter (infinite-loop protextion)
120
+ mkopt :max_filter_loops, Integer, MAX_FILTER_LOOPS
121
+
90
122
  # When {#recursive} is set, use this pattern to glob each
91
123
  # directory for files.
92
124
  mkopt :dir_glob, String, DEFAULT_DIR_GLOB
@@ -104,6 +136,9 @@ module Fixnames
104
136
  # @note Enables {Fixnames::Filters#hack_and}
105
137
  mkopt :hack_and, [TrueClass, FalseClass], false
106
138
 
139
+ # @note Enables {Fixnames::Filters#hack_and}
140
+ mkopt :and_to_dash, [TrueClass, FalseClass], false
141
+
107
142
  # @note Enables {Fixnames::Filters#checksums}
108
143
  mkopt :checksums, [TrueClass, FalseClass], false
109
144
 
@@ -122,6 +157,9 @@ module Fixnames
122
157
  # @note Enables {Fixnames::Filters#fix_dashes}
123
158
  mkopt :fix_dashes, [TrueClass, FalseClass], false
124
159
 
160
+ # @note Enables {Fixnames::Filters#fix_dashes}
161
+ mkopt :fix_numsep, [TrueClass, FalseClass], false
162
+
125
163
  # @note Enables {Fixnames::Filters#camelcase}
126
164
  mkopt :camelcase, [TrueClass, FalseClass], false
127
165
 
@@ -1,8 +1,8 @@
1
1
  class Fixnames
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 4
5
- PATCH = 1
4
+ MINOR = 5
5
+ PATCH = 0
6
6
  BUILD = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Fixnames do
4
+ context "when option[:and_to_dash] is TRUE" do
5
+ before do
6
+ @testopt.and_to_dash = true
7
+ end
8
+
9
+ describe "should replace \"_and_\" with \"-\"" do
10
+ subject { 'a-b' }
11
+ it_should_fix 'a_and_b', 'a and b', 'a-and-b'
12
+ it_should_fix 'a-and_b', 'a_and-b'
13
+ it_should_fix 'a-and b', 'a and-b'
14
+ it_should_fix 'a and_b', 'a_and b'
15
+
16
+ it_should_fix 'a and b'
17
+ it_should_fix 'a- -and- -b'
18
+ it_should_fix 'a- _and_ -b'
19
+ it_should_fix 'a__and__b'
20
+ it_should_fix 'a_-_and_-_b'
21
+ it_should_fix 'a - and - b'
22
+ end
23
+ end
24
+
25
+ context "when option[:and_to_dash] is FALSE" do
26
+ before do
27
+ @testopt.and_to_dash = false
28
+ end
29
+
30
+ describe "should replace ALLOW \"&\"" do
31
+ it_should_not_change 'a_and_b'
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,91 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Fixnames::Option do
4
+ context "when setting new options" do
5
+ describe "should allow bool types" do
6
+ it_should_allow_bool_option 'recursive'
7
+ it_should_allow_bool_option 'hack_and'
8
+ it_should_allow_bool_option 'and_to_dash'
9
+ it_should_allow_bool_option 'checksums'
10
+ it_should_allow_bool_option 'banners'
11
+ it_should_allow_bool_option 'brackets'
12
+ it_should_allow_bool_option 'semicolon'
13
+ it_should_allow_bool_option 'fix_dots'
14
+ it_should_allow_bool_option 'fix_dashes'
15
+ it_should_allow_bool_option 'fix_numsep'
16
+ it_should_allow_bool_option 'camelcase'
17
+ it_should_allow_bool_option 'lowercase'
18
+ it_should_allow_bool_option 'charstrip_allow_brackets'
19
+ it_should_allow_bool_option 'pretend'
20
+ end
21
+
22
+ describe "should allow integer types" do
23
+ it_should_allow_option 'max_filter_loops', 10
24
+ end
25
+
26
+ describe "should allow string types" do
27
+ it_should_allow_option 'dir_glob', '*foo*'
28
+ it_should_allow_option 'expunge', '^(\d\d+)'
29
+ it_should_allow_option 'mendstr', '\1-'
30
+ it_should_allow_option 'charstrip', '!@#$%^&()_+-='
31
+ it_should_allow_option 'whitespace', " \t\n"
32
+ it_should_allow_option 'bracket_characters_open', "`\\"
33
+ it_should_allow_option 'bracket_characters_close', "'/"
34
+ end
35
+
36
+ describe "should allow array types" do
37
+ it_should_allow_option 'junkwords', ['foo','bar','baz']
38
+ it_should_allow_option 'banner_types', ['foo','bar','baz']
39
+ it_should_allow_option 'filter_order', Fixnames::Option::DEFAULT_FILTER_ORDER.sort
40
+ end
41
+
42
+ describe "should reject invalid non-bool types for bool options" do
43
+ [ 'recursive',
44
+ 'hack_and',
45
+ 'and_to_dash',
46
+ 'checksums',
47
+ 'banners',
48
+ 'brackets',
49
+ 'semicolon',
50
+ 'fix_dots',
51
+ 'fix_dashes',
52
+ 'fix_numsep',
53
+ 'camelcase',
54
+ 'lowercase',
55
+ 'charstrip_allow_brackets',
56
+ 'pretend'
57
+ ].each do |opt_name|
58
+ it_should_reject_nonbool_option(opt_name)
59
+ end
60
+ end
61
+
62
+ describe "should reject invalid non-integer types for integer options" do
63
+ [ 'max_filter_loops'
64
+ ].each do |opt_name|
65
+ it_should_reject_noninteger_option(opt_name)
66
+ end
67
+ end
68
+
69
+ describe "should reject invalid non-string types for string options" do
70
+ [ 'dir_glob',
71
+ 'expunge',
72
+ 'mendstr',
73
+ 'charstrip',
74
+ 'whitespace',
75
+ 'bracket_characters_open',
76
+ 'bracket_characters_close'
77
+ ].each do |opt_name|
78
+ it_should_reject_nonstring_option(opt_name)
79
+ end
80
+ end
81
+
82
+ describe "should reject invalid non-array types for array options" do
83
+ [ 'junkwords',
84
+ 'banner_types',
85
+ 'filter_order'
86
+ ].each do |opt_name|
87
+ it_should_reject_nonarray_option(opt_name)
88
+ end
89
+ end
90
+ end
91
+ end
@@ -1,26 +1,102 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe Fixnames do
4
+
5
+ ##########################################################################
4
6
  context "when option[:brackets] is TRUE" do
5
7
  before do
6
8
  @testopt.brackets = true
9
+ @testopt.fix_dashes = true
10
+ end
11
+
12
+ describe "should replace bracket pairs with a dash" do
13
+ subject { 'foo-x-bar' }
14
+ it_should_fix 'foo[x]bar'
15
+ it_should_fix 'foo[ x ]bar'
16
+ it_should_fix 'foo[-x-]bar'
17
+ it_should_fix 'foo[_x_]bar'
18
+ it_should_fix 'foo [x] bar'
19
+ it_should_fix 'foo-[x]-bar'
20
+ it_should_fix 'foo_[x]_bar'
21
+ end
22
+
23
+ describe "should replace multiple bracket pairs" do
24
+ subject { 'foo-bar-baz-quux' }
25
+ it_should_fix 'foo(bar)baz<quux>'
26
+ it_should_fix 'foo(bar)[baz]quux'
27
+ it_should_fix 'foo(-bar-)baz<_quux_>'
28
+ it_should_fix 'foo-(bar)-baz-<quux>'
29
+ it_should_fix 'foo (bar) baz <quux>'
30
+ it_should_fix '{ foo }-( bar )-[ baz ]-< quux >'
31
+ it_should_fix '[ foo ]<->[ bar ]<->[ baz ]<->[ quux ]'
32
+ end
33
+ end
34
+
35
+ ##########################################################################
36
+ context "when option[:brackets] is FALSE and option[:charstrip] strips brackets" do
37
+ before do
38
+ @testopt.brackets = false
39
+ @testopt.charstrip_allow_brackets = false
40
+ end
41
+
42
+ describe "should strip a single bracket pair" do
43
+ subject { 'fooxbar' }
44
+ it_should_fix 'foo[x]bar'
45
+ it_should_fix 'foo(x)bar'
46
+ it_should_fix 'foo<x>bar'
47
+ it_should_fix '[foo]xbar'
48
+ it_should_fix 'fooxba[r]'
49
+ it_should_fix '[fooxbar]'
50
+ end
51
+
52
+ describe "should strip a single bracket pair near dashes" do
53
+ subject { 'foo-x-bar' }
54
+ it_should_fix 'foo[-x-]bar'
55
+ it_should_fix 'foo-[x]-bar'
56
+ it_should_fix '[foo]-x-bar'
57
+ it_should_fix '[foo-x-]bar'
58
+ it_should_fix 'foo-x[-bar]'
59
+ end
60
+
61
+ describe "should strip a single bracket pair near undebars" do
62
+ subject { 'foo_x_bar' }
63
+ it_should_fix 'foo[_x_]bar'
64
+ it_should_fix 'foo_[x]_bar'
65
+ it_should_fix '[foo_]x_bar'
66
+ it_should_fix 'foo[_x_bar]'
67
+ end
68
+
69
+ describe "should strip multiple bracket pairs" do
70
+ subject { 'foobarbazquux' }
71
+ it_should_fix 'foo(bar)baz[quux]'
72
+ it_should_fix '{foo}(bar)<baz>[quux]'
7
73
  end
8
74
 
9
- describe "should remove bracket expressions" do
10
- subject { 'foobar' }
11
- it_should_fix 'foo[x]bar', 'fo(foo)ob<bar>ar'
12
- it_should_fix 'foo[ x ]bar', 'fo(-foo-)ob<_bar_>ar'
75
+ describe "should strip multiple brack pairs with dashes" do
76
+ subject { 'foo-bar-baz-quux' }
77
+ it_should_fix 'foo-bar-baz-quux'
78
+ it_should_fix 'foo-(b)ar-[baz-]quux'
79
+ it_should_fix 'foo<->bar[-]baz(-)quux'
80
+ it_should_fix '[foo]-[bar]-[baz]-[quux]'
13
81
  end
14
82
  end
15
83
 
16
- context "when option[:brackets] is FALSE" do
84
+ ##########################################################################
85
+ context "when option[:brackets] is FALSE and option[:charstrip] sllows brackets" do
17
86
  before do
18
87
  @testopt.brackets = false
19
88
  @testopt.charstrip_allow_brackets = true
20
89
  end
21
90
 
22
91
  describe "should replace ALLOW bracket expressions" do
23
- it_should_not_change 'foo[x]bar', 'fo(foo)ob<bar>ar'
92
+ it_should_not_change 'foo[x]bar'
93
+ it_should_not_change 'foo[-x-]bar'
94
+ it_should_not_change 'foo[_x_]bar'
95
+ it_should_not_change 'foo-[x]-bar'
96
+ it_should_not_change 'foo_[x]_bar'
97
+ it_should_not_change 'fo(foo)ob<bar>ar'
98
+ it_should_not_change 'fo(-foo-)ob<_bar_>ar'
99
+ it_should_not_change 'fo-(foo)-ob-<bar>-ar'
24
100
  end
25
101
  end
26
102
  end
@@ -0,0 +1,33 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Fixnames do
4
+ context "when only option[:dashes] is non-nil" do
5
+ before do
6
+ @testopt.fix_dashes = true
7
+ @testopt.whitespace = nil
8
+ end
9
+
10
+ describe "should preserve single dashes between letters" do
11
+ it_should_not_change 'a-b'
12
+ end
13
+
14
+ describe "should pass single underscores unchanged" do
15
+ it_should_not_change 'a_b'
16
+ end
17
+
18
+ describe "should not duplicate the :whitesapce filter and collapse dashe-underscores pairs to a dash" do
19
+ it_should_not_change 'a-_b', 'a_-b', 'a_-_b'
20
+ end
21
+
22
+ describe "should collapse multiple dashes to a single character" do
23
+ subject { 'a-b' }
24
+ it_should_fix 'a--b', 'a---b', 'a----b'
25
+ end
26
+
27
+ describe "should remove dashes near a dot" do
28
+ subject { 'a.b' }
29
+ it_should_fix 'a-.b', 'a.-b', 'a-.-b'
30
+ it_should_fix 'a--.b', 'a.--b', 'a--.--b'
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,59 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Fixnames do
4
+ context "when option[:expunge] is Regexp-formatted string and option[:replace is nil" do
5
+ before do
6
+ @testopt.mendstr = Fixnames::Option::DEFAULT_MENDSTR
7
+ end
8
+
9
+ describe "should erase matched fragments" do
10
+ subject { 'foo-242-bar-baz.quux' }
11
+ it_should_expunge_and_match '-', 'foo242barbaz.quux'
12
+ it_should_expunge_and_match 'b', 'foo-242-ar-az.quux'
13
+ it_should_expunge_and_match '\d+', 'foo--bar-baz.quux'
14
+ it_should_expunge_and_match '[0-9]+', 'foo--bar-baz.quux'
15
+ it_should_expunge_and_match '-.*-', 'foobaz.quux'
16
+ end
17
+ end
18
+
19
+ context "when options[:expunge] is a Regexp and ootions[:replace] is a string" do
20
+ before do
21
+ @testopt.mendstr = 'X'
22
+ end
23
+
24
+ describe "should replace matched fragments" do
25
+ subject { 'foo-242-bar-baz.quux' }
26
+ it_should_expunge_and_match '-', 'fooX242XbarXbaz.quux'
27
+ it_should_expunge_and_match 'b', 'foo-242-Xar-Xaz.quux'
28
+ it_should_expunge_and_match '\d+', 'foo-X-bar-baz.quux'
29
+ it_should_expunge_and_match '[0-9]+', 'foo-X-bar-baz.quux'
30
+ it_should_expunge_and_match '-.*-', 'fooXbaz.quux'
31
+ end
32
+ end
33
+
34
+ context "when options[:expunge] is a Regexp and ootions[:replace] is a string with a backreference" do
35
+ before do
36
+ @testopt.mendstr = '\1-PLUGH'
37
+ end
38
+
39
+ describe "should replace matched fragments (including backreferences)" do
40
+ subject { 'foo-242-bar-baz.quux' }
41
+ it_should_expunge_and_match 'foo-(\d+)', '242-PLUGH-bar-baz.quux'
42
+ it_should_expunge_and_match '(b\w*)', 'foo-242-bar-PLUGH-baz-PLUGH.quux'
43
+ end
44
+ end
45
+
46
+ context "when options[:expunge] is a Regexp and ootions[:replace] is a string with multiple backreferences" do
47
+ before do
48
+ @testopt.mendstr = '_\1\2\1_'
49
+ end
50
+
51
+ describe "should replace matched fragments (including backreferences)" do
52
+ subject { 'foo-242-bar-baz.quux' }
53
+ it_should_expunge_and_match '(\d+)-(b\w*)', 'foo-242bar242-baz.quux'
54
+ it_should_expunge_and_match '-(\d+)-(b\w*)-', 'foo_242bar242_baz.quux'
55
+ it_should_expunge_and_match '(b)(\w\w)', 'foo-242-barb-bazb.quux'
56
+ it_should_expunge_and_match '-(b)(\w\w)-', 'foo-242_barb_baz.quux'
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,26 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe Fixnames do
4
+ context "when option[:fix_numsep] is TRUE" do
5
+ before do
6
+ @testopt.fix_numsep = true
7
+ end
8
+
9
+ describe "should replace \"_\" with \"-\" after leading digits" do
10
+ subject { '42-foo_bar-3_quux.baz' }
11
+ it_should_fix '42_foo_bar-3_quux.baz'
12
+ it_should_not_change 'prefix-42_foo_bar-3_quux.baz'
13
+ it_should_not_change 'prefix_42_foo_bar-3_quux.baz'
14
+ end
15
+ end
16
+
17
+ context "when option[:fix_numsep] is FALSE" do
18
+ before do
19
+ @testopt.fix_numsep = false
20
+ end
21
+
22
+ describe "should not replace \"_\" with \"-\" after leading digits" do
23
+ it_should_not_change '42_foo_bar-3_quux.baz'
24
+ end
25
+ end
26
+ end
@@ -1,7 +1,12 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe Fixnames do
4
- context "when option[:whitespace] is non-nil" do
4
+ context "when only option[:whitespace] is non-nil" do
5
+ before do
6
+ @testopt.fix_dashes = false
7
+ @testopt.whitespace = Fixnames::Option::DEFAULT_WHITESPACE
8
+ end
9
+
5
10
  describe "should preserve simple names" do
6
11
  it_should_not_change 'abc', 'a-b', 'a.b'
7
12
  end
@@ -25,6 +30,11 @@ describe Fixnames do
25
30
  it_should_fix 'a b', 'a b', 'a b'
26
31
  end
27
32
 
33
+ describe "should collapse dash-underscore pairs to a dash" do
34
+ subject { 'a-b' }
35
+ it_should_fix 'a-_b', 'a_-b', 'a_-_b'
36
+ end
37
+
28
38
  describe "should collapse multiple underscores to a single character" do
29
39
  subject { 'a_b' }
30
40
  it_should_fix 'a__b', 'a___b', 'a____b'
@@ -51,9 +61,9 @@ describe Fixnames do
51
61
 
52
62
  describe "should remove whitespace preceding a dot" do
53
63
  subject { 'a.b' }
54
- it_should_fix 'a .b', 'a_.b', 'a-.b'
55
- it_should_fix 'a .b', 'a _.b', 'a_ .b'
56
- it_should_fix 'a__.b', 'a _ .b', 'a- _.b'
64
+ it_should_fix 'a .b', 'a_.b'
65
+ it_should_fix 'a .b', 'a _.b'
66
+ it_should_fix 'a__.b', 'a _ .b'
57
67
  end
58
68
 
59
69
  describe "should remove whitespace around a single dash" do
@@ -0,0 +1,50 @@
1
+ def it_should_allow_option(opt_name, value)
2
+ specify "new value allowd: option.#{opt_name}(#{value.inspect})" do
3
+ expect do
4
+ @testopt.send(opt_name, value)
5
+ end.not_to raise_error(ArgumentError)
6
+ end
7
+ specify "new value allowd: option.#{opt_name} = #{value.inspect}" do
8
+ expect do
9
+ @testopt.send("#{opt_name}=", value)
10
+ end.not_to raise_error(ArgumentError)
11
+ end
12
+ end
13
+
14
+ def it_should_allow_bool_option(opt_name)
15
+ it_should_allow_option(opt_name, true)
16
+ it_should_allow_option(opt_name, false)
17
+ end
18
+
19
+ def it_should_reject_option(opt_name, *values)
20
+ values.each do |value|
21
+ specify "new value rejected: option.#{opt_name}(#{value.inspect})" do
22
+ expect do
23
+ @testopt.send(opt_name, value)
24
+ end.to raise_error(ArgumentError)
25
+ end
26
+ specify "new value rejected: option.#{opt_name} = #{value.inspect}" do
27
+ expect do
28
+ @testopt.send("#{opt_name}=", value)
29
+ end.to raise_error(ArgumentError)
30
+ end
31
+ end
32
+ end
33
+
34
+
35
+ def it_should_reject_nonbool_option(opt_name)
36
+ it_should_reject_option opt_name, 123, 'foo', ['foo','bar','baz']
37
+ end
38
+
39
+ def it_should_reject_noninteger_option(opt_name)
40
+ it_should_reject_option opt_name, true, 'foo', ['foo','bar','baz']
41
+ end
42
+
43
+ def it_should_reject_nonstring_option(opt_name)
44
+ it_should_reject_option opt_name, true, 123, ['foo','bar','baz']
45
+ end
46
+
47
+ def it_should_reject_nonarray_option(opt_name)
48
+ it_should_reject_option opt_name, true, 123, 'foo'
49
+ end
50
+
@@ -17,3 +17,11 @@ def it_should_fix(*args)
17
17
  end
18
18
  end
19
19
  end
20
+
21
+ def it_should_expunge_and_match(re, result)
22
+ specify "expunges /#{re}/ from #{subject.call.inspect} to produce #{result.inspect}" do
23
+ @testopt.expunge = re
24
+ fixed_for(subject).should eq(result)
25
+ end
26
+ end
27
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fixnames
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,63 +9,88 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-26 00:00:00.000000000 Z
12
+ date: 2012-11-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
+ type: :runtime
15
16
  name: term-ansicolor
16
- requirement: &10551560 !ruby/object:Gem::Requirement
17
+ prerelease: false
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: 1.0.6
24
+ version_requirements: !ruby/object:Gem::Requirement
17
25
  none: false
18
26
  requirements:
19
27
  - - ! '>='
20
28
  - !ruby/object:Gem::Version
21
29
  version: 1.0.6
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: *10551560
25
30
  - !ruby/object:Gem::Dependency
31
+ type: :development
26
32
  name: yard
27
- requirement: &10550940 !ruby/object:Gem::Requirement
33
+ prerelease: false
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: 0.6.0
40
+ version_requirements: !ruby/object:Gem::Requirement
28
41
  none: false
29
42
  requirements:
30
43
  - - ! '>='
31
44
  - !ruby/object:Gem::Version
32
45
  version: 0.6.0
33
- type: :development
34
- prerelease: false
35
- version_requirements: *10550940
36
46
  - !ruby/object:Gem::Dependency
47
+ type: :development
37
48
  name: rspec
38
- requirement: &10532580 !ruby/object:Gem::Requirement
49
+ prerelease: false
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: 2.3.0
56
+ version_requirements: !ruby/object:Gem::Requirement
39
57
  none: false
40
58
  requirements:
41
59
  - - ! '>='
42
60
  - !ruby/object:Gem::Version
43
61
  version: 2.3.0
44
- type: :development
45
- prerelease: false
46
- version_requirements: *10532580
47
62
  - !ruby/object:Gem::Dependency
63
+ type: :development
48
64
  name: jeweler
49
- requirement: &10531940 !ruby/object:Gem::Requirement
65
+ prerelease: false
66
+ requirement: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: 1.6.4
72
+ version_requirements: !ruby/object:Gem::Requirement
50
73
  none: false
51
74
  requirements:
52
75
  - - ! '>='
53
76
  - !ruby/object:Gem::Version
54
77
  version: 1.6.4
55
- type: :development
56
- prerelease: false
57
- version_requirements: *10531940
58
78
  - !ruby/object:Gem::Dependency
79
+ type: :development
59
80
  name: simplecov
60
- requirement: &10531260 !ruby/object:Gem::Requirement
81
+ prerelease: false
82
+ requirement: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ version_requirements: !ruby/object:Gem::Requirement
61
89
  none: false
62
90
  requirements:
63
91
  - - ! '>='
64
92
  - !ruby/object:Gem::Version
65
93
  version: '0'
66
- type: :development
67
- prerelease: false
68
- version_requirements: *10531260
69
94
  description: ! 'Cleans up filenames so they can easily be used
70
95
 
71
96
  in scripts, without annoyances such as spaces or other bad characters'
@@ -96,17 +121,23 @@ files:
96
121
  - lib/fixnames/interface.rb
97
122
  - lib/fixnames/option.rb
98
123
  - lib/fixnames/version.rb
124
+ - spec/fixnames/and_to_dash_spec.rb
125
+ - spec/fixnames/badopt_spec.rb
99
126
  - spec/fixnames/banners_spec.rb
100
127
  - spec/fixnames/brackets_spec.rb
101
128
  - spec/fixnames/camelcase_spec.rb
102
129
  - spec/fixnames/charstrip_spec.rb
103
130
  - spec/fixnames/checksums_spec.rb
131
+ - spec/fixnames/dashes_spec.rb
132
+ - spec/fixnames/expunge_spec.rb
104
133
  - spec/fixnames/fixdots_spec.rb
105
134
  - spec/fixnames/hack_and_spec.rb
106
135
  - spec/fixnames/lowercase_spec.rb
136
+ - spec/fixnames/numsep_spec.rb
107
137
  - spec/fixnames/semicolon_spec.rb
108
138
  - spec/fixnames/whitespace_spec.rb
109
139
  - spec/spec_helper.rb
140
+ - spec/support/option_setting_helpers.rb
110
141
  - spec/support/should_fix_helpers.rb
111
142
  - test/helper.rb
112
143
  - test/test_charstrip.rb
@@ -135,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
166
  version: '0'
136
167
  requirements: []
137
168
  rubyforge_project:
138
- rubygems_version: 1.8.11
169
+ rubygems_version: 1.8.23
139
170
  signing_key:
140
171
  specification_version: 3
141
172
  summary: Filename cleanup for script compatability