rsl-stringex 0.9.3 → 0.9.4

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/README.rdoc CHANGED
@@ -13,6 +13,8 @@ which will populate the <tt>url</tt> attribute on the object with the converted
13
13
  <tt>:url_attribute</tt>:: The name of the attribute to use for storing the generated url string.
14
14
  Default is <tt>:url</tt>
15
15
  <tt>:scope</tt>:: The name of model attribute to scope unique urls to. There is no default here.
16
+ <tt>:only_when_blank</tt>:: If true, the url generation will only happen when <tt>:url_attribute</tt> is
17
+ blank. Default is false (meaning url generation will happen always)
16
18
  <tt>:sync_url</tt>:: If set to true, the url field will be updated when changes are made to the
17
19
  attribute it is based on. Default is false.
18
20
 
data/Rakefile CHANGED
@@ -2,10 +2,224 @@ require 'rake'
2
2
  require 'rake/testtask'
3
3
  require 'rake/rdoctask'
4
4
 
5
+ begin
6
+ require 'jeweler'
7
+ Jeweler::Tasks.new do |gem|
8
+ gem.name = "stringex"
9
+ gem.authors = ["Russell Norris"]
10
+ gem.email = "rsl@luckysneaks.com"
11
+ gem.homepage = "http://github.com/rsl/stringex"
12
+ gem.summary = "Some [hopefully] useful extensions to Ruby’s String class"
13
+ gem.description = "Some [hopefully] useful extensions to Ruby’s String class. Stringex is made up of three libraries: ActsAsUrl [permalink solution with better character translation], Unidecoder [Unicode to Ascii transliteration], and StringExtensions [miscellaneous helper methods for the String class]."
14
+ gem.has_rdoc = true
15
+ gem.files = %w{
16
+ init.rb
17
+ MIT-LICENSE
18
+ Rakefile
19
+ README.rdoc
20
+ stringex.gemspec
21
+ lib/stringex.rb
22
+ lib/lucky_sneaks/acts_as_url.rb
23
+ lib/lucky_sneaks/string_extensions.rb
24
+ lib/lucky_sneaks/unidecoder.rb
25
+ lib/lucky_sneaks/unidecoder_data/x00.yml
26
+ lib/lucky_sneaks/unidecoder_data/x01.yml
27
+ lib/lucky_sneaks/unidecoder_data/x02.yml
28
+ lib/lucky_sneaks/unidecoder_data/x03.yml
29
+ lib/lucky_sneaks/unidecoder_data/x04.yml
30
+ lib/lucky_sneaks/unidecoder_data/x05.yml
31
+ lib/lucky_sneaks/unidecoder_data/x06.yml
32
+ lib/lucky_sneaks/unidecoder_data/x07.yml
33
+ lib/lucky_sneaks/unidecoder_data/x09.yml
34
+ lib/lucky_sneaks/unidecoder_data/x0a.yml
35
+ lib/lucky_sneaks/unidecoder_data/x0b.yml
36
+ lib/lucky_sneaks/unidecoder_data/x0c.yml
37
+ lib/lucky_sneaks/unidecoder_data/x0d.yml
38
+ lib/lucky_sneaks/unidecoder_data/x0e.yml
39
+ lib/lucky_sneaks/unidecoder_data/x0f.yml
40
+ lib/lucky_sneaks/unidecoder_data/x10.yml
41
+ lib/lucky_sneaks/unidecoder_data/x11.yml
42
+ lib/lucky_sneaks/unidecoder_data/x12.yml
43
+ lib/lucky_sneaks/unidecoder_data/x13.yml
44
+ lib/lucky_sneaks/unidecoder_data/x14.yml
45
+ lib/lucky_sneaks/unidecoder_data/x15.yml
46
+ lib/lucky_sneaks/unidecoder_data/x16.yml
47
+ lib/lucky_sneaks/unidecoder_data/x17.yml
48
+ lib/lucky_sneaks/unidecoder_data/x18.yml
49
+ lib/lucky_sneaks/unidecoder_data/x1e.yml
50
+ lib/lucky_sneaks/unidecoder_data/x1f.yml
51
+ lib/lucky_sneaks/unidecoder_data/x20.yml
52
+ lib/lucky_sneaks/unidecoder_data/x21.yml
53
+ lib/lucky_sneaks/unidecoder_data/x22.yml
54
+ lib/lucky_sneaks/unidecoder_data/x23.yml
55
+ lib/lucky_sneaks/unidecoder_data/x24.yml
56
+ lib/lucky_sneaks/unidecoder_data/x25.yml
57
+ lib/lucky_sneaks/unidecoder_data/x26.yml
58
+ lib/lucky_sneaks/unidecoder_data/x27.yml
59
+ lib/lucky_sneaks/unidecoder_data/x28.yml
60
+ lib/lucky_sneaks/unidecoder_data/x2e.yml
61
+ lib/lucky_sneaks/unidecoder_data/x2f.yml
62
+ lib/lucky_sneaks/unidecoder_data/x30.yml
63
+ lib/lucky_sneaks/unidecoder_data/x31.yml
64
+ lib/lucky_sneaks/unidecoder_data/x32.yml
65
+ lib/lucky_sneaks/unidecoder_data/x33.yml
66
+ lib/lucky_sneaks/unidecoder_data/x4d.yml
67
+ lib/lucky_sneaks/unidecoder_data/x4e.yml
68
+ lib/lucky_sneaks/unidecoder_data/x4f.yml
69
+ lib/lucky_sneaks/unidecoder_data/x50.yml
70
+ lib/lucky_sneaks/unidecoder_data/x51.yml
71
+ lib/lucky_sneaks/unidecoder_data/x52.yml
72
+ lib/lucky_sneaks/unidecoder_data/x53.yml
73
+ lib/lucky_sneaks/unidecoder_data/x54.yml
74
+ lib/lucky_sneaks/unidecoder_data/x55.yml
75
+ lib/lucky_sneaks/unidecoder_data/x56.yml
76
+ lib/lucky_sneaks/unidecoder_data/x57.yml
77
+ lib/lucky_sneaks/unidecoder_data/x58.yml
78
+ lib/lucky_sneaks/unidecoder_data/x59.yml
79
+ lib/lucky_sneaks/unidecoder_data/x5a.yml
80
+ lib/lucky_sneaks/unidecoder_data/x5b.yml
81
+ lib/lucky_sneaks/unidecoder_data/x5c.yml
82
+ lib/lucky_sneaks/unidecoder_data/x5d.yml
83
+ lib/lucky_sneaks/unidecoder_data/x5e.yml
84
+ lib/lucky_sneaks/unidecoder_data/x5f.yml
85
+ lib/lucky_sneaks/unidecoder_data/x60.yml
86
+ lib/lucky_sneaks/unidecoder_data/x61.yml
87
+ lib/lucky_sneaks/unidecoder_data/x62.yml
88
+ lib/lucky_sneaks/unidecoder_data/x63.yml
89
+ lib/lucky_sneaks/unidecoder_data/x64.yml
90
+ lib/lucky_sneaks/unidecoder_data/x65.yml
91
+ lib/lucky_sneaks/unidecoder_data/x66.yml
92
+ lib/lucky_sneaks/unidecoder_data/x67.yml
93
+ lib/lucky_sneaks/unidecoder_data/x68.yml
94
+ lib/lucky_sneaks/unidecoder_data/x69.yml
95
+ lib/lucky_sneaks/unidecoder_data/x6a.yml
96
+ lib/lucky_sneaks/unidecoder_data/x6b.yml
97
+ lib/lucky_sneaks/unidecoder_data/x6c.yml
98
+ lib/lucky_sneaks/unidecoder_data/x6d.yml
99
+ lib/lucky_sneaks/unidecoder_data/x6e.yml
100
+ lib/lucky_sneaks/unidecoder_data/x6f.yml
101
+ lib/lucky_sneaks/unidecoder_data/x70.yml
102
+ lib/lucky_sneaks/unidecoder_data/x71.yml
103
+ lib/lucky_sneaks/unidecoder_data/x72.yml
104
+ lib/lucky_sneaks/unidecoder_data/x73.yml
105
+ lib/lucky_sneaks/unidecoder_data/x74.yml
106
+ lib/lucky_sneaks/unidecoder_data/x75.yml
107
+ lib/lucky_sneaks/unidecoder_data/x76.yml
108
+ lib/lucky_sneaks/unidecoder_data/x77.yml
109
+ lib/lucky_sneaks/unidecoder_data/x78.yml
110
+ lib/lucky_sneaks/unidecoder_data/x79.yml
111
+ lib/lucky_sneaks/unidecoder_data/x7a.yml
112
+ lib/lucky_sneaks/unidecoder_data/x7b.yml
113
+ lib/lucky_sneaks/unidecoder_data/x7c.yml
114
+ lib/lucky_sneaks/unidecoder_data/x7d.yml
115
+ lib/lucky_sneaks/unidecoder_data/x7e.yml
116
+ lib/lucky_sneaks/unidecoder_data/x7f.yml
117
+ lib/lucky_sneaks/unidecoder_data/x80.yml
118
+ lib/lucky_sneaks/unidecoder_data/x81.yml
119
+ lib/lucky_sneaks/unidecoder_data/x82.yml
120
+ lib/lucky_sneaks/unidecoder_data/x83.yml
121
+ lib/lucky_sneaks/unidecoder_data/x84.yml
122
+ lib/lucky_sneaks/unidecoder_data/x85.yml
123
+ lib/lucky_sneaks/unidecoder_data/x86.yml
124
+ lib/lucky_sneaks/unidecoder_data/x87.yml
125
+ lib/lucky_sneaks/unidecoder_data/x88.yml
126
+ lib/lucky_sneaks/unidecoder_data/x89.yml
127
+ lib/lucky_sneaks/unidecoder_data/x8a.yml
128
+ lib/lucky_sneaks/unidecoder_data/x8b.yml
129
+ lib/lucky_sneaks/unidecoder_data/x8c.yml
130
+ lib/lucky_sneaks/unidecoder_data/x8d.yml
131
+ lib/lucky_sneaks/unidecoder_data/x8e.yml
132
+ lib/lucky_sneaks/unidecoder_data/x8f.yml
133
+ lib/lucky_sneaks/unidecoder_data/x90.yml
134
+ lib/lucky_sneaks/unidecoder_data/x91.yml
135
+ lib/lucky_sneaks/unidecoder_data/x92.yml
136
+ lib/lucky_sneaks/unidecoder_data/x93.yml
137
+ lib/lucky_sneaks/unidecoder_data/x94.yml
138
+ lib/lucky_sneaks/unidecoder_data/x95.yml
139
+ lib/lucky_sneaks/unidecoder_data/x96.yml
140
+ lib/lucky_sneaks/unidecoder_data/x97.yml
141
+ lib/lucky_sneaks/unidecoder_data/x98.yml
142
+ lib/lucky_sneaks/unidecoder_data/x99.yml
143
+ lib/lucky_sneaks/unidecoder_data/x9a.yml
144
+ lib/lucky_sneaks/unidecoder_data/x9b.yml
145
+ lib/lucky_sneaks/unidecoder_data/x9c.yml
146
+ lib/lucky_sneaks/unidecoder_data/x9d.yml
147
+ lib/lucky_sneaks/unidecoder_data/x9e.yml
148
+ lib/lucky_sneaks/unidecoder_data/x9f.yml
149
+ lib/lucky_sneaks/unidecoder_data/xa0.yml
150
+ lib/lucky_sneaks/unidecoder_data/xa1.yml
151
+ lib/lucky_sneaks/unidecoder_data/xa2.yml
152
+ lib/lucky_sneaks/unidecoder_data/xa3.yml
153
+ lib/lucky_sneaks/unidecoder_data/xa4.yml
154
+ lib/lucky_sneaks/unidecoder_data/xac.yml
155
+ lib/lucky_sneaks/unidecoder_data/xad.yml
156
+ lib/lucky_sneaks/unidecoder_data/xae.yml
157
+ lib/lucky_sneaks/unidecoder_data/xaf.yml
158
+ lib/lucky_sneaks/unidecoder_data/xb0.yml
159
+ lib/lucky_sneaks/unidecoder_data/xb1.yml
160
+ lib/lucky_sneaks/unidecoder_data/xb2.yml
161
+ lib/lucky_sneaks/unidecoder_data/xb3.yml
162
+ lib/lucky_sneaks/unidecoder_data/xb4.yml
163
+ lib/lucky_sneaks/unidecoder_data/xb5.yml
164
+ lib/lucky_sneaks/unidecoder_data/xb6.yml
165
+ lib/lucky_sneaks/unidecoder_data/xb7.yml
166
+ lib/lucky_sneaks/unidecoder_data/xb8.yml
167
+ lib/lucky_sneaks/unidecoder_data/xb9.yml
168
+ lib/lucky_sneaks/unidecoder_data/xba.yml
169
+ lib/lucky_sneaks/unidecoder_data/xbb.yml
170
+ lib/lucky_sneaks/unidecoder_data/xbc.yml
171
+ lib/lucky_sneaks/unidecoder_data/xbd.yml
172
+ lib/lucky_sneaks/unidecoder_data/xbe.yml
173
+ lib/lucky_sneaks/unidecoder_data/xbf.yml
174
+ lib/lucky_sneaks/unidecoder_data/xc0.yml
175
+ lib/lucky_sneaks/unidecoder_data/xc1.yml
176
+ lib/lucky_sneaks/unidecoder_data/xc2.yml
177
+ lib/lucky_sneaks/unidecoder_data/xc3.yml
178
+ lib/lucky_sneaks/unidecoder_data/xc4.yml
179
+ lib/lucky_sneaks/unidecoder_data/xc5.yml
180
+ lib/lucky_sneaks/unidecoder_data/xc6.yml
181
+ lib/lucky_sneaks/unidecoder_data/xc7.yml
182
+ lib/lucky_sneaks/unidecoder_data/xc8.yml
183
+ lib/lucky_sneaks/unidecoder_data/xc9.yml
184
+ lib/lucky_sneaks/unidecoder_data/xca.yml
185
+ lib/lucky_sneaks/unidecoder_data/xcb.yml
186
+ lib/lucky_sneaks/unidecoder_data/xcc.yml
187
+ lib/lucky_sneaks/unidecoder_data/xcd.yml
188
+ lib/lucky_sneaks/unidecoder_data/xce.yml
189
+ lib/lucky_sneaks/unidecoder_data/xcf.yml
190
+ lib/lucky_sneaks/unidecoder_data/xd0.yml
191
+ lib/lucky_sneaks/unidecoder_data/xd1.yml
192
+ lib/lucky_sneaks/unidecoder_data/xd2.yml
193
+ lib/lucky_sneaks/unidecoder_data/xd3.yml
194
+ lib/lucky_sneaks/unidecoder_data/xd4.yml
195
+ lib/lucky_sneaks/unidecoder_data/xd5.yml
196
+ lib/lucky_sneaks/unidecoder_data/xd6.yml
197
+ lib/lucky_sneaks/unidecoder_data/xd7.yml
198
+ lib/lucky_sneaks/unidecoder_data/xf9.yml
199
+ lib/lucky_sneaks/unidecoder_data/xfa.yml
200
+ lib/lucky_sneaks/unidecoder_data/xfb.yml
201
+ lib/lucky_sneaks/unidecoder_data/xfc.yml
202
+ lib/lucky_sneaks/unidecoder_data/xfd.yml
203
+ lib/lucky_sneaks/unidecoder_data/xfe.yml
204
+ lib/lucky_sneaks/unidecoder_data/xff.yml
205
+ }
206
+ gem.test_files = %w{
207
+ test/acts_as_url_test.rb
208
+ test/string_extensions_test.rb
209
+ test/unidecoder_test.rb
210
+ }
211
+ gem.rdoc_options = %w{--main README.rdoc --charset utf-8 --line-numbers}
212
+ gem.extra_rdoc_files = %w{MIT-LICENSE README.rdoc}
213
+ end
214
+
215
+ rescue LoadError
216
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
217
+ end
218
+
5
219
  desc 'Default: run unit tests.'
6
220
  task :default => [:refresh_db, :test]
7
221
 
8
- desc 'Remove old sqlite file'
222
+ desc 'Remove old sqlite file.'
9
223
  task :refresh_db do
10
224
  `rm -f #{File.dirname(__FILE__)}/test/acts_as_url.sqlite3`
11
225
  end
@@ -19,8 +233,15 @@ end
19
233
 
20
234
  desc 'Generate documentation for the stringex plugin.'
21
235
  Rake::RDocTask.new(:rdoc) do |rdoc|
236
+ if File.exist?('VERSION.yml')
237
+ config = YAML.load(File.read('VERSION.yml'))
238
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
239
+ else
240
+ version = ""
241
+ end
242
+
22
243
  rdoc.rdoc_dir = 'doc'
23
- rdoc.title = 'Stringex: A String Extension Pack'
244
+ rdoc.title = 'Stringex: A String Extension Pack [#{version}]'
24
245
  rdoc.options << '--line-numbers' << '--inline-source'
25
246
  rdoc.options << '--charset' << 'utf-8'
26
247
  rdoc.rdoc_files.include('README.rdoc')
@@ -21,12 +21,15 @@ module LuckySneaks
21
21
  # <tt>:url_attribute</tt>:: The name of the attribute to use for storing the generated url string.
22
22
  # Default is <tt>:url</tt>
23
23
  # <tt>:scope</tt>:: The name of model attribute to scope unique urls to. There is no default here.
24
+ # <tt>:only_when_blank</tt>:: If true, the url generation will only happen when <tt>:url_attribute</tt> is
25
+ # blank. Default is false (meaning url generation will happen always)
24
26
  # <tt>:sync_url</tt>:: If set to true, the url field will be updated when changes are made to the
25
27
  # attribute it is based on. Default is false.
26
28
  def acts_as_url(attribute, options = {})
27
29
  cattr_accessor :attribute_to_urlify
28
30
  cattr_accessor :scope_for_url
29
31
  cattr_accessor :url_attribute # The attribute on the DB
32
+ cattr_accessor :only_when_blank
30
33
 
31
34
  if options[:sync_url]
32
35
  before_validation :ensure_unique_url
@@ -37,6 +40,7 @@ module LuckySneaks
37
40
  self.attribute_to_urlify = attribute
38
41
  self.scope_for_url = options[:scope]
39
42
  self.url_attribute = options[:url_attribute] || "url"
43
+ self.only_when_blank = options[:only_when_blank] || false
40
44
  end
41
45
 
42
46
  # Initialize the url fields for the records that need it. Designed for people who add
@@ -57,7 +61,8 @@ module LuckySneaks
57
61
  private
58
62
  def ensure_unique_url
59
63
  url_attribute = self.class.url_attribute
60
- base_url = self.send(self.class.attribute_to_urlify).to_s.to_url
64
+ base_url = self.send(url_attribute)
65
+ base_url = self.send(self.class.attribute_to_urlify).to_s.to_url if base_url.blank? || !self.only_when_blank
61
66
  conditions = ["#{url_attribute} LIKE ?", base_url+'%']
62
67
  unless new_record?
63
68
  conditions.first << " and id != ?"
@@ -69,6 +74,7 @@ module LuckySneaks
69
74
  end
70
75
  url_owners = self.class.find(:all, :conditions => conditions)
71
76
  if url_owners.size > 0
77
+ return unless url_owners.map { |o| o.send(url_attribute) }.include?(base_url)
72
78
  n = 1
73
79
  while url_owners.detect{|u| u.send(url_attribute) == "#{base_url}-#{n}"}
74
80
  n = n.succ
@@ -5,8 +5,8 @@ module LuckySneaks
5
5
  base.extend(ClassMethods)
6
6
  end
7
7
 
8
- # Returns the string converted (via Textile/RedCloth) to HTML format or
9
- # self if Redcloth is not available.
8
+ # Returns the string converted (via Textile/RedCloth) to HTML format
9
+ # or self [with a friendly warning] if Redcloth is not available.
10
10
  #
11
11
  # Using <tt>:lite</tt> argument will cause RedCloth to not wrap the HTML in a container
12
12
  # P element, which is useful behavior for generating header element text, etc.
@@ -25,6 +25,7 @@ module LuckySneaks
25
25
  end
26
26
  end
27
27
  else
28
+ warn "String#to_html was called without RedCloth being successfully required"
28
29
  self
29
30
  end
30
31
  end
@@ -39,7 +40,7 @@ module LuckySneaks
39
40
  # Performs multiple text manipulations. Essentially a shortcut for typing them all. View source
40
41
  # below to see which methods are run.
41
42
  def remove_formatting
42
- to_ascii.strip_html_tags.convert_accented_entities.convert_misc_entities.convert_misc_characters.collapse
43
+ strip_html_tags.convert_accented_entities.convert_misc_entities.convert_misc_characters.to_ascii.collapse
43
44
  end
44
45
 
45
46
  # Removes HTML tags from text. This code is simplified from Tobias Luettke's regular expression
@@ -116,12 +117,23 @@ module LuckySneaks
116
117
  # before running this method.
117
118
  def convert_misc_characters
118
119
  dummy = dup.gsub(/\.{3,}/, " dot dot dot ") # Catch ellipses before single dot rule!
120
+ # Special rules for money
121
+ {
122
+ /(\s|^)\$(\d+)\.(\d+)(\s|$)/ => '\2 dollars \3 cents',
123
+ /(\s|^)£(\d+)\.(\d+)(\s|$)/u => '\2 pounds \3 pence',
124
+ }.each do |found, replaced|
125
+ replaced = " #{replaced} " unless replaced =~ /\\1/
126
+ dummy.gsub!(found, replaced)
127
+ end
128
+ # Back to normal rules
119
129
  {
120
130
  /\s*&\s*/ => "and",
121
131
  /\s*#/ => "number",
122
132
  /\s*@\s*/ => "at",
123
133
  /(\S|^)\.(\S)/ => '\1 dot \2',
124
134
  /(\s|^)\$(\d*)(\s|$)/ => '\2 dollars',
135
+ /(\s|^)£(\d*)(\s|$)/u => '\2 pounds',
136
+ /(\s|^)¥(\d*)(\s|$)/u => '\2 yen',
125
137
  /\s*\*\s*/ => "star",
126
138
  /\s*%\s*/ => "percent",
127
139
  /\s*(\\|\/)\s*/ => "slash",
@@ -13,24 +13,37 @@ module LuckySneaks
13
13
  # You're probably better off just using the added String#to_ascii
14
14
  def decode(string)
15
15
  string.gsub(/[^\x00-\x7f]/u) do |codepoint|
16
+ unpacked = codepoint.unpack("U")[0]
16
17
  begin
17
- CODEPOINTS[code_group(codepoint)][grouped_point(codepoint)]
18
+ CODEPOINTS[code_group(unpacked)][grouped_point(unpacked)]
18
19
  rescue
19
20
  # Hopefully this won't come up much
20
21
  "?"
21
22
  end
22
23
  end
23
24
  end
25
+
26
+ # Returns character for the given Unicode codepoint
27
+ def encode(codepoint)
28
+ ["0x#{codepoint}".to_i(16)].pack("U")
29
+ end
30
+
31
+ # Returns string indicating which file (and line) contains the
32
+ # transliteration value for the character
33
+ def in_yaml_file(character)
34
+ unpacked = character.unpack("U")[0]
35
+ "#{code_group(unpacked)}.yml (line #{grouped_point(unpacked) + 2})"
36
+ end
24
37
 
25
38
  private
26
39
  # Returns the Unicode codepoint grouping for the given character
27
- def code_group(character)
28
- "x%02x" % (character.unpack("U")[0] >> 8)
40
+ def code_group(unpacked_character)
41
+ "x%02x" % (unpacked_character >> 8)
29
42
  end
30
43
 
31
44
  # Returns the index of the given character in the YAML file for its codepoint group
32
- def grouped_point(character)
33
- character.unpack("U")[0] & 255
45
+ def grouped_point(unpacked_character)
46
+ unpacked_character & 255
34
47
  end
35
48
  end
36
49
  end
@@ -42,7 +55,7 @@ module LuckySneaks
42
55
  #
43
56
  # "⠋⠗⠁⠝⠉⠑".to_ascii #=> "braille"
44
57
  def to_ascii
45
- LuckySneaks::Unidecoder::decode(self)
58
+ LuckySneaks::Unidecoder.decode(self)
46
59
  end
47
60
  end
48
61
  end
@@ -126,7 +126,7 @@
126
126
  - '|'
127
127
  - '}'
128
128
  - '~'
129
- - 
129
+ - ''
130
130
  - ''
131
131
  - ''
132
132
  - ''
@@ -160,7 +160,7 @@
160
160
  - ''
161
161
  - ''
162
162
  - ' '
163
- - '!'
163
+ - ''
164
164
  - C/
165
165
  - PS
166
166
  - $?
@@ -190,7 +190,7 @@
190
190
  - 1/4
191
191
  - 1/2
192
192
  - 3/4
193
- - '?'
193
+ - ''
194
194
  - A
195
195
  - A
196
196
  - A
@@ -186,7 +186,7 @@
186
186
  - y
187
187
  - "'"
188
188
  - '"'
189
- - '`'
189
+ - `
190
190
  - "'"
191
191
  - '`'
192
192
  - '`'
@@ -202,7 +202,7 @@
202
202
  - "'"
203
203
  - -
204
204
  - /
205
- - \
205
+ - '`'
206
206
  - ','
207
207
  - _
208
208
  - \
@@ -191,7 +191,7 @@
191
191
  - ch
192
192
  - Ch'
193
193
  - ch'
194
- - '`'
194
+ - I
195
195
  - Zh
196
196
  - zh
197
197
  - K'
@@ -10,15 +10,15 @@
10
10
  - ' '
11
11
  - ' '
12
12
  - ' '
13
- - ' '
14
13
  - ''
15
14
  - ''
16
15
  - ''
17
16
  - ''
18
- - -
19
- - -
20
- - -
21
- - -
17
+ - ''
18
+ - '-'
19
+ - '-'
20
+ - '-'
21
+ - '-'
22
22
  - --
23
23
  - --
24
24
  - '||'
@@ -50,7 +50,7 @@
50
50
  - '%0'
51
51
  - '%00'
52
52
  - "'"
53
- - "''"
53
+ - '"'
54
54
  - "'''"
55
55
  - '`'
56
56
  - '``'
@@ -60,7 +60,7 @@
60
60
  - '>'
61
61
  - '*'
62
62
  - '!!'
63
- - '!?'
63
+ - '?!'
64
64
  - -
65
65
  - _
66
66
  - -
@@ -77,9 +77,12 @@
77
77
  - PP
78
78
  - '(]'
79
79
  - '[)'
80
+ - '*'
81
+ - ';'
80
82
  - '[?]'
81
83
  - '[?]'
82
84
  - '[?]'
85
+ - '~'
83
86
  - '[?]'
84
87
  - '[?]'
85
88
  - '[?]'
@@ -92,10 +95,7 @@
92
95
  - '[?]'
93
96
  - '[?]'
94
97
  - '[?]'
95
- - '[?]'
96
- - '[?]'
97
- - '[?]'
98
- - '[?]'
98
+ - ''
99
99
  - '[?]'
100
100
  - '[?]'
101
101
  - '[?]'
@@ -1,56 +1,56 @@
1
1
  ---
2
2
  - ''
3
3
  - ''
4
+ - C
4
5
  - ''
5
6
  - ''
6
7
  - ''
7
8
  - ''
9
+ - E
8
10
  - ''
9
11
  - ''
10
12
  - ''
13
+ - H
14
+ - H
15
+ - H
11
16
  - ''
12
17
  - ''
18
+ - I
19
+ - I
20
+ - L
13
21
  - ''
14
22
  - ''
23
+ - N
15
24
  - ''
16
25
  - ''
17
26
  - ''
27
+ - P
28
+ - Q
29
+ - R
30
+ - R
31
+ - R
18
32
  - ''
19
33
  - ''
20
34
  - ''
21
35
  - ''
22
36
  - ''
23
37
  - ''
38
+ - Z
24
39
  - ''
25
40
  - ''
26
41
  - ''
42
+ - Z
27
43
  - ''
44
+ - K
28
45
  - ''
46
+ - B
47
+ - C
29
48
  - ''
30
49
  - ''
50
+ - E
51
+ - F
31
52
  - ''
32
- - ''
33
- - ''
34
- - ''
35
- - ''
36
- - ''
37
- - ''
38
- - ''
39
- - ''
40
- - ''
41
- - ''
42
- - ''
43
- - ''
44
- - ''
45
- - ''
46
- - ''
47
- - ''
48
- - ''
49
- - ''
50
- - ''
51
- - ''
52
- - ''
53
- - ''
53
+ - M
54
54
  - ''
55
55
  - ''
56
56
  - ''
@@ -17,8 +17,12 @@
17
17
  - '[?]'
18
18
  - '[?]'
19
19
  - '[?]'
20
+ - '-'
20
21
  - '[?]'
21
22
  - '[?]'
23
+ - '/'
24
+ - '\'
25
+ - *
22
26
  - '[?]'
23
27
  - '[?]'
24
28
  - '[?]'
@@ -30,6 +34,7 @@
30
34
  - '[?]'
31
35
  - '[?]'
32
36
  - '[?]'
37
+ - '|'
33
38
  - '[?]'
34
39
  - '[?]'
35
40
  - '[?]'
@@ -48,18 +53,13 @@
48
53
  - '[?]'
49
54
  - '[?]'
50
55
  - '[?]'
56
+ - ':'
51
57
  - '[?]'
52
58
  - '[?]'
53
59
  - '[?]'
54
60
  - '[?]'
55
61
  - '[?]'
56
- - '[?]'
57
- - '[?]'
58
- - '[?]'
59
- - '[?]'
60
- - '[?]'
61
- - '[?]'
62
- - '[?]'
62
+ - '~'
63
63
  - '[?]'
64
64
  - '[?]'
65
65
  - '[?]'
@@ -2,6 +2,7 @@
2
2
  - '[?]'
3
3
  - '[?]'
4
4
  - '[?]'
5
+ - '^'
5
6
  - '[?]'
6
7
  - '[?]'
7
8
  - '[?]'
@@ -39,9 +40,8 @@
39
40
  - '[?]'
40
41
  - '[?]'
41
42
  - '[?]'
42
- - '[?]'
43
- - '[?]'
44
- - '[?]'
43
+ - '<'
44
+ - '>'
45
45
  - '[?]'
46
46
  - '[?]'
47
47
  - '[?]'
@@ -184,7 +184,7 @@
184
184
  - '[?]'
185
185
  - '[?]'
186
186
  - '[?]'
187
- - '[?]'
187
+ - '*'
188
188
  - '[?]'
189
189
  - '[?]'
190
190
  - '[?]'
@@ -48,6 +48,7 @@
48
48
  - ''
49
49
  - ''
50
50
  - ''
51
+ - '*'
51
52
  - ''
52
53
  - ''
53
54
  - ''
@@ -86,8 +87,7 @@
86
87
  - ''
87
88
  - ''
88
89
  - ''
89
- - ''
90
- - ''
90
+ - '|'
91
91
  - ''
92
92
  - ''
93
93
  - ''
@@ -97,7 +97,7 @@
97
97
  - '[?]'
98
98
  - '[?]'
99
99
  - ''
100
- - ''
100
+ - '!'
101
101
  - ''
102
102
  - ''
103
103
  - ''
@@ -231,8 +231,8 @@
231
231
  - '[?]'
232
232
  - '[?]'
233
233
  - '[?]'
234
- - '[?]'
235
- - '[?]'
234
+ - '<'
235
+ - '>'
236
236
  - '[?]'
237
237
  - '[?]'
238
238
  - '[?]'
@@ -8,7 +8,7 @@
8
8
  - /
9
9
  - 0
10
10
  - <
11
- - '> '
11
+ - '>'
12
12
  - <<
13
13
  - '>> '
14
14
  - '['
data/lib/stringex.rb CHANGED
@@ -1,9 +1,9 @@
1
- require 'lucky_sneaks/acts_as_url'
2
1
  require 'lucky_sneaks/string_extensions'
3
2
  require 'lucky_sneaks/unidecoder'
4
3
 
5
4
  String.send :include, LuckySneaks::StringExtensions
6
5
 
7
6
  if defined?(ActiveRecord)
7
+ require 'lucky_sneaks/acts_as_url'
8
8
  ActiveRecord::Base.send :include, LuckySneaks::ActsAsUrl
9
9
  end
@@ -8,6 +8,7 @@ rescue LoadError
8
8
  require 'active_record'
9
9
 
10
10
  RAILS_ROOT = File.dirname(__FILE__)
11
+ $: << File.join(File.dirname(__FILE__), '../lib')
11
12
  end
12
13
 
13
14
  require File.join(File.dirname(__FILE__), '../init')
@@ -19,7 +20,11 @@ ActiveRecord::Schema.define(:version => 1) do
19
20
  create_table :documents, :force => true do |t|
20
21
  t.string :title, :url, :other
21
22
  end
22
-
23
+
24
+ create_table :updateuments, :force => true do |t|
25
+ t.string :title, :url, :other
26
+ end
27
+
23
28
  create_table :mocuments, :force => true do |t|
24
29
  t.string :title, :url, :other
25
30
  end
@@ -27,10 +32,14 @@ ActiveRecord::Schema.define(:version => 1) do
27
32
  create_table :permuments, :force => true do |t|
28
33
  t.string :title, :permalink, :other
29
34
  end
30
-
35
+
31
36
  create_table :procuments, :force => true do |t|
32
37
  t.string :title, :url, :other
33
38
  end
39
+
40
+ create_table :blankuments, :force => true do |t|
41
+ t.string :title, :url, :other
42
+ end
34
43
  end
35
44
  ActiveRecord::Migration.verbose = true
36
45
 
@@ -38,6 +47,10 @@ class Document < ActiveRecord::Base
38
47
  acts_as_url :title
39
48
  end
40
49
 
50
+ class Updateument < ActiveRecord::Base
51
+ acts_as_url :title, :sync_url => true
52
+ end
53
+
41
54
  class Mocument < ActiveRecord::Base
42
55
  acts_as_url :title, :scope => :other, :sync_url => true
43
56
  end
@@ -54,6 +67,10 @@ class Procument < ActiveRecord::Base
54
67
  end
55
68
  end
56
69
 
70
+ class Blankument < ActiveRecord::Base
71
+ acts_as_url :title, :only_when_blank => true
72
+ end
73
+
57
74
  class ActsAsUrlTest < Test::Unit::TestCase
58
75
  def test_should_create_url
59
76
  @doc = Document.create(:title => "Let's Make a Test Title, <em>Okay</em>?")
@@ -65,7 +82,7 @@ class ActsAsUrlTest < Test::Unit::TestCase
65
82
  @other_doc = Document.create!(:title => "Unique")
66
83
  assert_equal "unique-1", @other_doc.url
67
84
  end
68
-
85
+
69
86
  def test_should_not_succ_on_repeated_saves
70
87
  @doc = Document.new(:title => "Continuous or Constant")
71
88
  5.times do
@@ -73,6 +90,24 @@ class ActsAsUrlTest < Test::Unit::TestCase
73
90
  assert_equal "continuous-or-constant", @doc.url
74
91
  end
75
92
  end
93
+
94
+ def test_should_create_unique_url_and_not_clobber_if_another_exists
95
+ @doc = Updateument.create!(:title => "Unique")
96
+ @other_doc = Updateument.create!(:title => "Unique")
97
+ @doc.update_attributes :other => "foo"
98
+
99
+ @doc2 = Document.create!(:title => "twonique")
100
+ @other_doc2 = Document.create!(:title => "twonique")
101
+ @doc2.update_attributes(:other => "foo")
102
+
103
+ assert_equal "unique", @doc.url
104
+ assert_equal "foo", @doc.other
105
+ assert_equal "unique-1", @other_doc.url
106
+
107
+ assert_equal "twonique", @doc2.url
108
+ assert_equal "foo", @doc2.other
109
+ assert_equal "twonique-1", @other_doc2.url
110
+ end
76
111
 
77
112
  def test_should_scope_uniqueness
78
113
  @moc = Mocument.create!(:title => "Mocumentary", :other => "I dunno why but I don't care if I'm unique")
@@ -105,6 +140,14 @@ class ActsAsUrlTest < Test::Unit::TestCase
105
140
  assert_not_equal @original_url, @moc.url
106
141
  end
107
142
 
143
+ def test_should_update_url_only_when_blank_if_asked
144
+ @original_url = 'the-url-of-concrete'
145
+ @blank = Blankument.create!(:title => "Stable as Stone", :url => @original_url)
146
+ assert_equal @original_url, @blank.url
147
+ @blank = Blankument.create!(:title => "Stable as Stone")
148
+ assert_equal 'stable-as-stone', @blank.url
149
+ end
150
+
108
151
  def test_should_mass_initialize_urls
109
152
  @doc_1 = Document.create!(:title => "Initial")
110
153
  @doc_2 = Document.create!(:title => "Subsequent")
@@ -1,5 +1,6 @@
1
1
  require "test/unit"
2
2
 
3
+ $: << File.join(File.dirname(__FILE__), '../lib')
3
4
  require File.join(File.dirname(__FILE__), "../init")
4
5
 
5
6
  class StringExtensionsTest < Test::Unit::TestCase
@@ -15,7 +16,7 @@ class StringExtensionsTest < Test::Unit::TestCase
15
16
  }.each do |plain, html|
16
17
  assert_equal html, plain.to_html
17
18
  end
18
- rescue MissingSourceFile
19
+ rescue LoadError
19
20
  puts "\n>> Could not load RedCloth. String#to_html was not tested.\n>> Please gem install RedCloth if you'd like to use this functionality."
20
21
  end
21
22
 
@@ -28,7 +29,7 @@ class StringExtensionsTest < Test::Unit::TestCase
28
29
  }.each do |plain, html|
29
30
  assert_equal html, plain.to_html(:lite)
30
31
  end
31
- rescue MissingSourceFile
32
+ rescue LoadError
32
33
  puts "\n>> Could not load RedCloth. String#to_html (with :lite argument) was not tested.\n>> Please gem install RedCloth if you'd like to use this functionality."
33
34
  end
34
35
 
@@ -107,7 +108,10 @@ class StringExtensionsTest < Test::Unit::TestCase
107
108
  "Foo & bar make foobar" => "Foo and bar make foobar",
108
109
  "Breakdown #9" => "Breakdown number 9",
109
110
  "foo@bar.com" => "foo at bar dot com",
110
- "100% of yr love" => "100 percent of yr love"
111
+ "100% of yr love" => "100 percent of yr love",
112
+ "Kisses are $3.25 each" => "Kisses are 3 dollars 25 cents each",
113
+ "That CD is £3.25 plus tax" => "That CD is 3 pounds 25 pence plus tax",
114
+ "This CD is ¥1000 instead" => "This CD is 1000 yen instead"
111
115
  }.each do |misc, plain|
112
116
  assert_equal plain, misc.convert_misc_characters
113
117
  end
@@ -1,5 +1,6 @@
1
1
  require "test/unit"
2
2
 
3
+ $: << File.join(File.dirname(__FILE__), '../lib')
3
4
  require File.join(File.dirname(__FILE__), "../init")
4
5
 
5
6
  class UnidecoderTest < Test::Unit::TestCase
@@ -45,15 +46,15 @@ class UnidecoderTest < Test::Unit::TestCase
45
46
  "我能吞下玻璃而不伤身体。" => # Chinese
46
47
  "Wo Neng Tun Xia Bo Li Er Bu Shang Shen Ti . ",
47
48
  "私はガラスを食べられます。それは私を傷つけません。" => # Japanese
48
- "Si hagarasuwoShi beraremasu. sorehaSi woShang tukemasen. ",
49
+ "Si hagarasuwoShi beraremasu. sorehaSi woShang tukemasen. "
49
50
  }
50
51
 
51
- def test_unicode_decode
52
+ def test_unidecoder_decode
52
53
  DONT_CONVERT.each do |ascii|
53
- assert_equal ascii, LuckySneaks::Unidecoder::decode(ascii)
54
+ assert_equal ascii, LuckySneaks::Unidecoder.decode(ascii)
54
55
  end
55
56
  CONVERT_PAIRS.each do |unicode, ascii|
56
- assert_equal ascii, LuckySneaks::Unidecoder::decode(unicode)
57
+ assert_equal ascii, LuckySneaks::Unidecoder.decode(unicode)
57
58
  end
58
59
  end
59
60
 
@@ -65,4 +66,25 @@ class UnidecoderTest < Test::Unit::TestCase
65
66
  assert_equal ascii, unicode.to_ascii
66
67
  end
67
68
  end
69
+
70
+ def test_unidecoder_encode
71
+ {
72
+ # Strings
73
+ "0041" => "A",
74
+ "00e6" => "æ",
75
+ "042f" => "Я"
76
+ }.each do |codepoint, unicode|
77
+ assert_equal unicode, LuckySneaks::Unidecoder.encode(codepoint)
78
+ end
79
+ end
80
+
81
+ def test_unidecoder_in_yaml_file
82
+ {
83
+ "A" => "x00.yml (line 67)",
84
+ "π" => "x03.yml (line 194)",
85
+ "Я" => "x04.yml (line 49)"
86
+ }.each do |character, output|
87
+ assert_equal output, LuckySneaks::Unidecoder.in_yaml_file(character)
88
+ end
89
+ end
68
90
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsl-stringex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Russell Norris
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-10 00:00:00 -07:00
12
+ date: 2009-07-20 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -23,12 +23,10 @@ extra_rdoc_files:
23
23
  - MIT-LICENSE
24
24
  - README.rdoc
25
25
  files:
26
- - init.rb
27
26
  - MIT-LICENSE
28
- - Rakefile
29
27
  - README.rdoc
30
- - stringex.gemspec
31
- - lib/stringex.rb
28
+ - Rakefile
29
+ - init.rb
32
30
  - lib/lucky_sneaks/acts_as_url.rb
33
31
  - lib/lucky_sneaks/string_extensions.rb
34
32
  - lib/lucky_sneaks/unidecoder.rb
@@ -212,6 +210,7 @@ files:
212
210
  - lib/lucky_sneaks/unidecoder_data/xfd.yml
213
211
  - lib/lucky_sneaks/unidecoder_data/xfe.yml
214
212
  - lib/lucky_sneaks/unidecoder_data/xff.yml
213
+ - lib/stringex.rb
215
214
  has_rdoc: true
216
215
  homepage: http://github.com/rsl/stringex
217
216
  post_install_message:
@@ -240,7 +239,7 @@ requirements: []
240
239
  rubyforge_project:
241
240
  rubygems_version: 1.2.0
242
241
  signing_key:
243
- specification_version: 2
242
+ specification_version: 3
244
243
  summary: "Some [hopefully] useful extensions to Ruby\xE2\x80\x99s String class"
245
244
  test_files:
246
245
  - test/acts_as_url_test.rb
data/stringex.gemspec DELETED
@@ -1,209 +0,0 @@
1
- Gem::Specification.new do |s|
2
- s.name = "stringex"
3
- s.version = "0.9.3"
4
- s.date = "2008-10-10"
5
- s.summary = "Some [hopefully] useful extensions to Ruby’s String class"
6
- s.email = "rsl@luckysneaks.com"
7
- s.homepage = "http://github.com/rsl/stringex"
8
- s.description = "Some [hopefully] useful extensions to Ruby’s String class. Stringex is made up of three libraries: ActsAsUrl [permalink solution with better character translation], Unidecoder [Unicode to Ascii transliteration], and StringExtensions [miscellaneous helper methods for the String class]."
9
- s.has_rdoc = true
10
- s.authors = "Russell Norris"
11
- s.files = %w{
12
- init.rb
13
- MIT-LICENSE
14
- Rakefile
15
- README.rdoc
16
- stringex.gemspec
17
- lib/stringex.rb
18
- lib/lucky_sneaks/acts_as_url.rb
19
- lib/lucky_sneaks/string_extensions.rb
20
- lib/lucky_sneaks/unidecoder.rb
21
- lib/lucky_sneaks/unidecoder_data/x00.yml
22
- lib/lucky_sneaks/unidecoder_data/x01.yml
23
- lib/lucky_sneaks/unidecoder_data/x02.yml
24
- lib/lucky_sneaks/unidecoder_data/x03.yml
25
- lib/lucky_sneaks/unidecoder_data/x04.yml
26
- lib/lucky_sneaks/unidecoder_data/x05.yml
27
- lib/lucky_sneaks/unidecoder_data/x06.yml
28
- lib/lucky_sneaks/unidecoder_data/x07.yml
29
- lib/lucky_sneaks/unidecoder_data/x09.yml
30
- lib/lucky_sneaks/unidecoder_data/x0a.yml
31
- lib/lucky_sneaks/unidecoder_data/x0b.yml
32
- lib/lucky_sneaks/unidecoder_data/x0c.yml
33
- lib/lucky_sneaks/unidecoder_data/x0d.yml
34
- lib/lucky_sneaks/unidecoder_data/x0e.yml
35
- lib/lucky_sneaks/unidecoder_data/x0f.yml
36
- lib/lucky_sneaks/unidecoder_data/x10.yml
37
- lib/lucky_sneaks/unidecoder_data/x11.yml
38
- lib/lucky_sneaks/unidecoder_data/x12.yml
39
- lib/lucky_sneaks/unidecoder_data/x13.yml
40
- lib/lucky_sneaks/unidecoder_data/x14.yml
41
- lib/lucky_sneaks/unidecoder_data/x15.yml
42
- lib/lucky_sneaks/unidecoder_data/x16.yml
43
- lib/lucky_sneaks/unidecoder_data/x17.yml
44
- lib/lucky_sneaks/unidecoder_data/x18.yml
45
- lib/lucky_sneaks/unidecoder_data/x1e.yml
46
- lib/lucky_sneaks/unidecoder_data/x1f.yml
47
- lib/lucky_sneaks/unidecoder_data/x20.yml
48
- lib/lucky_sneaks/unidecoder_data/x21.yml
49
- lib/lucky_sneaks/unidecoder_data/x22.yml
50
- lib/lucky_sneaks/unidecoder_data/x23.yml
51
- lib/lucky_sneaks/unidecoder_data/x24.yml
52
- lib/lucky_sneaks/unidecoder_data/x25.yml
53
- lib/lucky_sneaks/unidecoder_data/x26.yml
54
- lib/lucky_sneaks/unidecoder_data/x27.yml
55
- lib/lucky_sneaks/unidecoder_data/x28.yml
56
- lib/lucky_sneaks/unidecoder_data/x2e.yml
57
- lib/lucky_sneaks/unidecoder_data/x2f.yml
58
- lib/lucky_sneaks/unidecoder_data/x30.yml
59
- lib/lucky_sneaks/unidecoder_data/x31.yml
60
- lib/lucky_sneaks/unidecoder_data/x32.yml
61
- lib/lucky_sneaks/unidecoder_data/x33.yml
62
- lib/lucky_sneaks/unidecoder_data/x4d.yml
63
- lib/lucky_sneaks/unidecoder_data/x4e.yml
64
- lib/lucky_sneaks/unidecoder_data/x4f.yml
65
- lib/lucky_sneaks/unidecoder_data/x50.yml
66
- lib/lucky_sneaks/unidecoder_data/x51.yml
67
- lib/lucky_sneaks/unidecoder_data/x52.yml
68
- lib/lucky_sneaks/unidecoder_data/x53.yml
69
- lib/lucky_sneaks/unidecoder_data/x54.yml
70
- lib/lucky_sneaks/unidecoder_data/x55.yml
71
- lib/lucky_sneaks/unidecoder_data/x56.yml
72
- lib/lucky_sneaks/unidecoder_data/x57.yml
73
- lib/lucky_sneaks/unidecoder_data/x58.yml
74
- lib/lucky_sneaks/unidecoder_data/x59.yml
75
- lib/lucky_sneaks/unidecoder_data/x5a.yml
76
- lib/lucky_sneaks/unidecoder_data/x5b.yml
77
- lib/lucky_sneaks/unidecoder_data/x5c.yml
78
- lib/lucky_sneaks/unidecoder_data/x5d.yml
79
- lib/lucky_sneaks/unidecoder_data/x5e.yml
80
- lib/lucky_sneaks/unidecoder_data/x5f.yml
81
- lib/lucky_sneaks/unidecoder_data/x60.yml
82
- lib/lucky_sneaks/unidecoder_data/x61.yml
83
- lib/lucky_sneaks/unidecoder_data/x62.yml
84
- lib/lucky_sneaks/unidecoder_data/x63.yml
85
- lib/lucky_sneaks/unidecoder_data/x64.yml
86
- lib/lucky_sneaks/unidecoder_data/x65.yml
87
- lib/lucky_sneaks/unidecoder_data/x66.yml
88
- lib/lucky_sneaks/unidecoder_data/x67.yml
89
- lib/lucky_sneaks/unidecoder_data/x68.yml
90
- lib/lucky_sneaks/unidecoder_data/x69.yml
91
- lib/lucky_sneaks/unidecoder_data/x6a.yml
92
- lib/lucky_sneaks/unidecoder_data/x6b.yml
93
- lib/lucky_sneaks/unidecoder_data/x6c.yml
94
- lib/lucky_sneaks/unidecoder_data/x6d.yml
95
- lib/lucky_sneaks/unidecoder_data/x6e.yml
96
- lib/lucky_sneaks/unidecoder_data/x6f.yml
97
- lib/lucky_sneaks/unidecoder_data/x70.yml
98
- lib/lucky_sneaks/unidecoder_data/x71.yml
99
- lib/lucky_sneaks/unidecoder_data/x72.yml
100
- lib/lucky_sneaks/unidecoder_data/x73.yml
101
- lib/lucky_sneaks/unidecoder_data/x74.yml
102
- lib/lucky_sneaks/unidecoder_data/x75.yml
103
- lib/lucky_sneaks/unidecoder_data/x76.yml
104
- lib/lucky_sneaks/unidecoder_data/x77.yml
105
- lib/lucky_sneaks/unidecoder_data/x78.yml
106
- lib/lucky_sneaks/unidecoder_data/x79.yml
107
- lib/lucky_sneaks/unidecoder_data/x7a.yml
108
- lib/lucky_sneaks/unidecoder_data/x7b.yml
109
- lib/lucky_sneaks/unidecoder_data/x7c.yml
110
- lib/lucky_sneaks/unidecoder_data/x7d.yml
111
- lib/lucky_sneaks/unidecoder_data/x7e.yml
112
- lib/lucky_sneaks/unidecoder_data/x7f.yml
113
- lib/lucky_sneaks/unidecoder_data/x80.yml
114
- lib/lucky_sneaks/unidecoder_data/x81.yml
115
- lib/lucky_sneaks/unidecoder_data/x82.yml
116
- lib/lucky_sneaks/unidecoder_data/x83.yml
117
- lib/lucky_sneaks/unidecoder_data/x84.yml
118
- lib/lucky_sneaks/unidecoder_data/x85.yml
119
- lib/lucky_sneaks/unidecoder_data/x86.yml
120
- lib/lucky_sneaks/unidecoder_data/x87.yml
121
- lib/lucky_sneaks/unidecoder_data/x88.yml
122
- lib/lucky_sneaks/unidecoder_data/x89.yml
123
- lib/lucky_sneaks/unidecoder_data/x8a.yml
124
- lib/lucky_sneaks/unidecoder_data/x8b.yml
125
- lib/lucky_sneaks/unidecoder_data/x8c.yml
126
- lib/lucky_sneaks/unidecoder_data/x8d.yml
127
- lib/lucky_sneaks/unidecoder_data/x8e.yml
128
- lib/lucky_sneaks/unidecoder_data/x8f.yml
129
- lib/lucky_sneaks/unidecoder_data/x90.yml
130
- lib/lucky_sneaks/unidecoder_data/x91.yml
131
- lib/lucky_sneaks/unidecoder_data/x92.yml
132
- lib/lucky_sneaks/unidecoder_data/x93.yml
133
- lib/lucky_sneaks/unidecoder_data/x94.yml
134
- lib/lucky_sneaks/unidecoder_data/x95.yml
135
- lib/lucky_sneaks/unidecoder_data/x96.yml
136
- lib/lucky_sneaks/unidecoder_data/x97.yml
137
- lib/lucky_sneaks/unidecoder_data/x98.yml
138
- lib/lucky_sneaks/unidecoder_data/x99.yml
139
- lib/lucky_sneaks/unidecoder_data/x9a.yml
140
- lib/lucky_sneaks/unidecoder_data/x9b.yml
141
- lib/lucky_sneaks/unidecoder_data/x9c.yml
142
- lib/lucky_sneaks/unidecoder_data/x9d.yml
143
- lib/lucky_sneaks/unidecoder_data/x9e.yml
144
- lib/lucky_sneaks/unidecoder_data/x9f.yml
145
- lib/lucky_sneaks/unidecoder_data/xa0.yml
146
- lib/lucky_sneaks/unidecoder_data/xa1.yml
147
- lib/lucky_sneaks/unidecoder_data/xa2.yml
148
- lib/lucky_sneaks/unidecoder_data/xa3.yml
149
- lib/lucky_sneaks/unidecoder_data/xa4.yml
150
- lib/lucky_sneaks/unidecoder_data/xac.yml
151
- lib/lucky_sneaks/unidecoder_data/xad.yml
152
- lib/lucky_sneaks/unidecoder_data/xae.yml
153
- lib/lucky_sneaks/unidecoder_data/xaf.yml
154
- lib/lucky_sneaks/unidecoder_data/xb0.yml
155
- lib/lucky_sneaks/unidecoder_data/xb1.yml
156
- lib/lucky_sneaks/unidecoder_data/xb2.yml
157
- lib/lucky_sneaks/unidecoder_data/xb3.yml
158
- lib/lucky_sneaks/unidecoder_data/xb4.yml
159
- lib/lucky_sneaks/unidecoder_data/xb5.yml
160
- lib/lucky_sneaks/unidecoder_data/xb6.yml
161
- lib/lucky_sneaks/unidecoder_data/xb7.yml
162
- lib/lucky_sneaks/unidecoder_data/xb8.yml
163
- lib/lucky_sneaks/unidecoder_data/xb9.yml
164
- lib/lucky_sneaks/unidecoder_data/xba.yml
165
- lib/lucky_sneaks/unidecoder_data/xbb.yml
166
- lib/lucky_sneaks/unidecoder_data/xbc.yml
167
- lib/lucky_sneaks/unidecoder_data/xbd.yml
168
- lib/lucky_sneaks/unidecoder_data/xbe.yml
169
- lib/lucky_sneaks/unidecoder_data/xbf.yml
170
- lib/lucky_sneaks/unidecoder_data/xc0.yml
171
- lib/lucky_sneaks/unidecoder_data/xc1.yml
172
- lib/lucky_sneaks/unidecoder_data/xc2.yml
173
- lib/lucky_sneaks/unidecoder_data/xc3.yml
174
- lib/lucky_sneaks/unidecoder_data/xc4.yml
175
- lib/lucky_sneaks/unidecoder_data/xc5.yml
176
- lib/lucky_sneaks/unidecoder_data/xc6.yml
177
- lib/lucky_sneaks/unidecoder_data/xc7.yml
178
- lib/lucky_sneaks/unidecoder_data/xc8.yml
179
- lib/lucky_sneaks/unidecoder_data/xc9.yml
180
- lib/lucky_sneaks/unidecoder_data/xca.yml
181
- lib/lucky_sneaks/unidecoder_data/xcb.yml
182
- lib/lucky_sneaks/unidecoder_data/xcc.yml
183
- lib/lucky_sneaks/unidecoder_data/xcd.yml
184
- lib/lucky_sneaks/unidecoder_data/xce.yml
185
- lib/lucky_sneaks/unidecoder_data/xcf.yml
186
- lib/lucky_sneaks/unidecoder_data/xd0.yml
187
- lib/lucky_sneaks/unidecoder_data/xd1.yml
188
- lib/lucky_sneaks/unidecoder_data/xd2.yml
189
- lib/lucky_sneaks/unidecoder_data/xd3.yml
190
- lib/lucky_sneaks/unidecoder_data/xd4.yml
191
- lib/lucky_sneaks/unidecoder_data/xd5.yml
192
- lib/lucky_sneaks/unidecoder_data/xd6.yml
193
- lib/lucky_sneaks/unidecoder_data/xd7.yml
194
- lib/lucky_sneaks/unidecoder_data/xf9.yml
195
- lib/lucky_sneaks/unidecoder_data/xfa.yml
196
- lib/lucky_sneaks/unidecoder_data/xfb.yml
197
- lib/lucky_sneaks/unidecoder_data/xfc.yml
198
- lib/lucky_sneaks/unidecoder_data/xfd.yml
199
- lib/lucky_sneaks/unidecoder_data/xfe.yml
200
- lib/lucky_sneaks/unidecoder_data/xff.yml
201
- }
202
- s.test_files = %w{
203
- test/acts_as_url_test.rb
204
- test/string_extensions_test.rb
205
- test/unidecoder_test.rb
206
- }
207
- s.rdoc_options = %w{--main README.rdoc --charset utf-8 --line-numbers}
208
- s.extra_rdoc_files = %w{MIT-LICENSE README.rdoc}
209
- end