stringex 2.6.1 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +4 -2
- data/VERSION +1 -1
- data/lib/stringex/acts_as_url.rb +5 -0
- data/lib/stringex/acts_as_url/adapter/base.rb +16 -3
- data/lib/stringex/acts_as_url/adapter/data_mapper.rb +3 -3
- data/lib/stringex/acts_as_url/adapter/mongoid.rb +2 -2
- data/lib/stringex/configuration/acts_as_url.rb +10 -10
- data/lib/stringex/configuration/string_extensions.rb +7 -7
- data/lib/stringex/localization.rb +1 -1
- data/lib/stringex/localization/backend/i18n.rb +3 -2
- data/lib/stringex/localization/conversion_expressions.rb +58 -58
- data/lib/stringex/localization/default_conversions.rb +56 -56
- data/lib/stringex/string_extensions.rb +1 -1
- data/stringex.gemspec +3 -3
- data/test/unit/acts_as_url/adapter/activerecord.rb +3 -3
- data/test/unit/acts_as_url/adapter/datamapper.rb +2 -2
- data/test/unit/acts_as_url/adapter/mongoid.rb +9 -9
- data/test/unit/acts_as_url_configuration_test.rb +2 -2
- data/test/unit/acts_as_url_integration_test.rb +119 -86
- data/test/unit/localization_test.rb +8 -8
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14a1e9e04c5e4e2afcd9dfafbdeac75e4d3c5555
|
4
|
+
data.tar.gz: 6c161b8ad91a99fc8762c433e0a487e8854bf99e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8561c1e15f08e85444491d99169a2c4ef78c8be7dff5dfd49122a661cbdf362809590ab9c6aa4d6cdcc4575a812c97262dfd49f1322f4a0058d7f44763896ec
|
7
|
+
data.tar.gz: 5f8a82933cab72a549f614702c57703cf20f98397fd2e52a49b8f708f022923f1bca2ce9c5ed5ca3a43b1802ab2b89bb7af259ce3fb09d29a68706de48f1e2e0
|
data/Rakefile
CHANGED
@@ -30,14 +30,16 @@ end
|
|
30
30
|
Rake::TestTask.new do |t|
|
31
31
|
t.libs << 'lib' << 'test'
|
32
32
|
t.pattern = 'test/unit/**/*_test.rb'
|
33
|
-
t.verbose =
|
33
|
+
t.verbose = false
|
34
|
+
t.warning = false
|
34
35
|
end
|
35
36
|
|
36
37
|
namespace :test do
|
37
38
|
Rake::TestTask.new(:performance) do |t|
|
38
39
|
t.libs << 'lib' << 'test'
|
39
40
|
t.pattern = 'test/performance/**/*_test.rb'
|
40
|
-
t.verbose =
|
41
|
+
t.verbose = false
|
42
|
+
t.warning = false
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.7.0
|
data/lib/stringex/acts_as_url.rb
CHANGED
@@ -33,6 +33,11 @@ module Stringex
|
|
33
33
|
# differentiate between urls. Default is false[y]. See note on <tt>:scope</tt>.
|
34
34
|
# <tt>:duplicate_count_separator</tt>:: String to use when forcing unique urls from non-unique strings.
|
35
35
|
# Default is "-".
|
36
|
+
# <tt>:duplicate_sequence</tt>:: Supply an enumerator to generate the values used to generate
|
37
|
+
# unique urls (when <tt>:allow_duplicates</tt> is false).
|
38
|
+
# By default, generates positive integers in sequence from 1.
|
39
|
+
# <strong>Note:</strong> The sequence is restarted for each record
|
40
|
+
# (by calling <tt>#rewind</tt>).
|
36
41
|
# <tt>:force_downcase</tt>:: If false, allows generated url to contain uppercased letters. Default is false.
|
37
42
|
# <tt>:exclude_list</tt>:: List of complete strings that should not be transformed by <tt>acts_as_url</tt>.
|
38
43
|
# Default is empty.
|
@@ -120,13 +120,26 @@ module Stringex
|
|
120
120
|
|
121
121
|
def handle_duplicate_url!
|
122
122
|
return if !url_taken?(base_url)
|
123
|
-
n =
|
124
|
-
|
125
|
-
|
123
|
+
n = nil
|
124
|
+
sequence = duplicate_url_sequence.tap(&:rewind)
|
125
|
+
loop do
|
126
|
+
n = sequence.next
|
127
|
+
break unless url_taken?(duplicate_for_base_url(n))
|
126
128
|
end
|
127
129
|
write_url_attribute duplicate_for_base_url(n)
|
128
130
|
end
|
129
131
|
|
132
|
+
def duplicate_url_sequence
|
133
|
+
settings.duplicate_sequence ||
|
134
|
+
Enumerator.new do |enum|
|
135
|
+
n = 1
|
136
|
+
loop do
|
137
|
+
enum.yield n
|
138
|
+
n += 1
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
130
143
|
def url_taken?(url)
|
131
144
|
if settings.url_taken_method
|
132
145
|
instance.send(settings.url_taken_method, url)
|
@@ -33,7 +33,7 @@ module Stringex
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def klass_previous_instances(&block)
|
36
|
-
klass.all(:
|
36
|
+
klass.all(conditions: {settings.url_attribute => [nil]}).each(&block)
|
37
37
|
end
|
38
38
|
|
39
39
|
def primary_key
|
@@ -45,7 +45,7 @@ module Stringex
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def url_owners
|
48
|
-
@url_owners ||= url_owners_class.all(:
|
48
|
+
@url_owners ||= url_owners_class.all(conditions: url_owner_conditions)
|
49
49
|
end
|
50
50
|
|
51
51
|
def read_attribute(instance, name)
|
@@ -62,4 +62,4 @@ module Stringex
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
end
|
65
|
-
end
|
65
|
+
end
|
@@ -11,7 +11,7 @@ module Stringex
|
|
11
11
|
|
12
12
|
def add_new_record_url_owner_conditions
|
13
13
|
return if instance.new_record?
|
14
|
-
@url_owner_conditions.merge! :
|
14
|
+
@url_owner_conditions.merge! id: {'$ne' => instance.id}
|
15
15
|
end
|
16
16
|
|
17
17
|
def add_scoped_url_owner_conditions
|
@@ -34,4 +34,4 @@ module Stringex
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
37
|
-
end
|
37
|
+
end
|
@@ -31,16 +31,16 @@ module Stringex
|
|
31
31
|
|
32
32
|
def self.default_settings
|
33
33
|
@default_settings ||= {
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
34
|
+
allow_duplicates: false,
|
35
|
+
callback_method: :before_validation,
|
36
|
+
duplicate_count_separator: "-",
|
37
|
+
enforce_uniqueness_on_sti_base_class: false,
|
38
|
+
only_when_blank: false,
|
39
|
+
scope_for_url: nil,
|
40
|
+
sync_url: false,
|
41
|
+
url_attribute: "url",
|
42
|
+
blacklist: %w[new],
|
43
|
+
blacklist_policy: lambda { |instance, url|
|
44
44
|
"#{url}-#{instance.class.to_s.downcase}"
|
45
45
|
}
|
46
46
|
}.merge(Stringex::Configuration::StringExtensions.new.default_settings)
|
@@ -7,14 +7,14 @@ module Stringex
|
|
7
7
|
|
8
8
|
def self.default_settings
|
9
9
|
@default_settings ||= {
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
10
|
+
allow_slash: false,
|
11
|
+
exclude: [],
|
12
|
+
force_downcase: true,
|
13
|
+
limit: nil,
|
14
|
+
replace_whitespace_with: "-",
|
15
|
+
truncate_words: true
|
16
16
|
}
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
-
end
|
20
|
+
end
|
@@ -45,7 +45,7 @@ module Stringex
|
|
45
45
|
return translation unless translation.nil?
|
46
46
|
|
47
47
|
if locale != default_locale
|
48
|
-
translate scope, key, options.merge(:
|
48
|
+
translate scope, key, options.merge(locale: default_locale)
|
49
49
|
else
|
50
50
|
default_conversion(scope, key) || options[:default]
|
51
51
|
end
|
@@ -7,6 +7,7 @@ module Stringex
|
|
7
7
|
class << self
|
8
8
|
def reset!
|
9
9
|
super
|
10
|
+
@locale = nil
|
10
11
|
::I18n.reload! if defined?(::I18n) && ::I18n.respond_to?(:reload!)
|
11
12
|
end
|
12
13
|
|
@@ -31,7 +32,7 @@ module Stringex
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def store_translations(locale, scope, data)
|
34
|
-
::I18n.backend.store_translations(locale, {
|
35
|
+
::I18n.backend.store_translations(locale, {stringex: {scope => data}})
|
35
36
|
reset_translations_cache
|
36
37
|
end
|
37
38
|
|
@@ -54,7 +55,7 @@ module Stringex
|
|
54
55
|
|
55
56
|
def i18n_translations_for(locale)
|
56
57
|
ensure_locales_enforced_or_not
|
57
|
-
::I18n.translate("stringex", :
|
58
|
+
::I18n.translate("stringex", locale: locale, default: {})
|
58
59
|
end
|
59
60
|
|
60
61
|
def reset_translations_cache
|
@@ -10,18 +10,18 @@ module Stringex
|
|
10
10
|
APOSTROPHE = /(^|[[:alpha:]])'|`([[:alpha:]]|$)/
|
11
11
|
|
12
12
|
CHARACTERS = {
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
13
|
+
and: /\s*&\s*/,
|
14
|
+
at: /\s*@\s*/,
|
15
|
+
degrees: /\s*°\s*/,
|
16
|
+
divide: /\s*÷\s*/,
|
17
|
+
dot: /(\S|^)\.(\S)/,
|
18
|
+
ellipsis: /\s*\.{3,}\s*/,
|
19
|
+
equals: /\s*=\s*/,
|
20
|
+
number: /\s*#/,
|
21
|
+
percent: /\s*%\s*/,
|
22
|
+
plus: /\s*\+\s*/,
|
23
|
+
slash: /\s*(\\|\/|/)\s*/,
|
24
|
+
star: /\s*\*\s*/,
|
25
25
|
}
|
26
26
|
|
27
27
|
# Things that just get converted to spaces
|
@@ -29,18 +29,18 @@ module Stringex
|
|
29
29
|
CLEANUP_HTML_ENTITIES = /&[^;]+;/
|
30
30
|
|
31
31
|
CURRENCIES_SUPPORTED_SIMPLE = {
|
32
|
-
:
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
:
|
32
|
+
generic: /¤/,
|
33
|
+
dollars: /\$/,
|
34
|
+
euros: /€/,
|
35
|
+
pounds: /£/,
|
36
|
+
yen: /¥/,
|
37
|
+
reais: /R\$/
|
38
38
|
}
|
39
39
|
CURRENCIES_SUPPORTED_COMPLEX = {
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
40
|
+
dollars: :dollars_cents,
|
41
|
+
euros: :euros_cents,
|
42
|
+
pounds: :pounds_pence,
|
43
|
+
reais: :reais_cents
|
44
44
|
}
|
45
45
|
CURRENCIES_SUPPORTED = Regexp.new(CURRENCIES_SUPPORTED_SIMPLE.values.join('|'))
|
46
46
|
CURRENCIES_SIMPLE = CURRENCIES_SUPPORTED_SIMPLE.inject({}) do |hash, content|
|
@@ -61,27 +61,27 @@ module Stringex
|
|
61
61
|
|
62
62
|
HTML_ENTITIES = Proc.new(){
|
63
63
|
base = {
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
75
|
-
:
|
76
|
-
:
|
77
|
-
:
|
78
|
-
:
|
79
|
-
:
|
80
|
-
:
|
81
|
-
:
|
82
|
-
:
|
83
|
-
:
|
84
|
-
:
|
64
|
+
amp: %w{#38 amp},
|
65
|
+
cent: %w{#162 cent},
|
66
|
+
copy: %w{#169 copy},
|
67
|
+
deg: %w{#176 deg},
|
68
|
+
divide: %w{#247 divide},
|
69
|
+
double_quote: %w{#34 #822[012] quot ldquo rdquo dbquo},
|
70
|
+
ellipsis: %w{#8230 hellip},
|
71
|
+
en_dash: %w{#8211 ndash},
|
72
|
+
em_dash: %w{#8212 mdash},
|
73
|
+
frac14: %w{#188 frac14},
|
74
|
+
frac12: %w{#189 frac12},
|
75
|
+
frac34: %w{#190 frac34},
|
76
|
+
gt: %w{#62 gt},
|
77
|
+
lt: %w{#60 lt},
|
78
|
+
nbsp: %w{#160 nbsp},
|
79
|
+
pound: %w{#163 pound},
|
80
|
+
reg: %w{#174 reg},
|
81
|
+
single_quote: %w{#39 #821[678] apos lsquo rsquo sbquo},
|
82
|
+
times: %w{#215 times},
|
83
|
+
trade: %w{#8482 trade},
|
84
|
+
yen: %w{#165 yen},
|
85
85
|
}
|
86
86
|
base.inject({}) do |hash, content|
|
87
87
|
key, expression = content
|
@@ -107,21 +107,21 @@ module Stringex
|
|
107
107
|
|
108
108
|
# Ordered by denominator then numerator of the value
|
109
109
|
VULGAR_FRACTIONS = {
|
110
|
-
:
|
111
|
-
:
|
112
|
-
:
|
113
|
-
:
|
114
|
-
:
|
115
|
-
:
|
116
|
-
:
|
117
|
-
:
|
118
|
-
:
|
119
|
-
:
|
120
|
-
:
|
121
|
-
:
|
122
|
-
:
|
123
|
-
:
|
124
|
-
:
|
110
|
+
half: /(½|½|½)/,
|
111
|
+
one_third: /(⅓|⅓)/,
|
112
|
+
two_thirds: /(⅔|⅔)/,
|
113
|
+
one_fourth: /(¼|¼|¼)/,
|
114
|
+
three_fourths: /(¾|¾|¾)/,
|
115
|
+
one_fifth: /(⅕|⅕)/,
|
116
|
+
two_fifths: /(⅖|⅖)/,
|
117
|
+
three_fifths: /(⅗|⅗)/,
|
118
|
+
four_fifths: /(⅘|⅘)/,
|
119
|
+
one_sixth: /(⅙|⅙)/,
|
120
|
+
five_sixths: /(⅚|⅚)/,
|
121
|
+
one_eighth: /(⅛|⅛)/,
|
122
|
+
three_eighths: /(⅜|⅜)/,
|
123
|
+
five_eighths: /(⅝|⅝)/,
|
124
|
+
seven_eighths: /(⅞|⅞)/,
|
125
125
|
}
|
126
126
|
|
127
127
|
WHITESPACE = /\s+/
|
@@ -4,77 +4,77 @@ module Stringex
|
|
4
4
|
module Localization
|
5
5
|
module DefaultConversions
|
6
6
|
CHARACTERS = {
|
7
|
-
:
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
7
|
+
and: "and",
|
8
|
+
at: "at",
|
9
|
+
degrees: "degrees",
|
10
|
+
divide: "divided by",
|
11
|
+
dot: '\1 dot \2',
|
12
|
+
ellipsis: "dot dot dot",
|
13
|
+
equals: "equals",
|
14
|
+
number: "number",
|
15
|
+
percent: "percent",
|
16
|
+
plus: "plus",
|
17
|
+
slash: "slash",
|
18
|
+
star: "star",
|
19
19
|
}
|
20
20
|
|
21
21
|
CURRENCIES_SIMPLE = {
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
22
|
+
generic: '\1 dollars',
|
23
|
+
dollars: '\1 dollars',
|
24
|
+
euros: '\1 euros',
|
25
|
+
pounds: '\1 pounds',
|
26
|
+
yen: '\1 yen',
|
27
27
|
}
|
28
28
|
CURRENCIES_COMPLEX = {
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
29
|
+
dollars_cents: '\1 dollars \2 cents',
|
30
|
+
euros_cents: '\1 euros \2 cents',
|
31
|
+
pounds_pence: '\1 pounds \2 pence',
|
32
32
|
}
|
33
33
|
CURRENCIES = CURRENCIES_SIMPLE.merge(CURRENCIES_COMPLEX)
|
34
34
|
|
35
35
|
HTML_ENTITIES = {
|
36
|
-
:
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
44
|
-
:
|
45
|
-
:
|
46
|
-
:
|
47
|
-
:
|
48
|
-
:
|
49
|
-
:
|
50
|
-
:
|
51
|
-
:
|
52
|
-
:
|
53
|
-
:
|
54
|
-
:
|
55
|
-
:
|
56
|
-
:
|
36
|
+
amp: "and",
|
37
|
+
cent: " cents",
|
38
|
+
copy: "(c)",
|
39
|
+
deg: " degrees ",
|
40
|
+
divide: " divided by ",
|
41
|
+
double_quote: '"',
|
42
|
+
ellipsis: "...",
|
43
|
+
en_dash: "-",
|
44
|
+
em_dash: "--",
|
45
|
+
frac14: "one fourth",
|
46
|
+
frac12: "half",
|
47
|
+
frac34: "three fourths",
|
48
|
+
gt: ">",
|
49
|
+
lt: "<",
|
50
|
+
nbsp: " ",
|
51
|
+
pound: " pounds ",
|
52
|
+
reg: "(r)",
|
53
|
+
single_quote: "'",
|
54
|
+
times: "x",
|
55
|
+
trade: "(tm)",
|
56
|
+
yen: " yen "
|
57
57
|
}
|
58
58
|
|
59
59
|
TRANSLITERATIONS = {}
|
60
60
|
|
61
61
|
# Ordered by denominator then numerator of the value
|
62
62
|
VULGAR_FRACTIONS = {
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
75
|
-
:
|
76
|
-
:
|
77
|
-
:
|
63
|
+
half: "half",
|
64
|
+
one_third: "one third",
|
65
|
+
two_thirds: "two thirds",
|
66
|
+
one_fourth: "one fourth",
|
67
|
+
three_fourths: "three fourths",
|
68
|
+
one_fifth: "one fifth",
|
69
|
+
two_fifths: "two fifths",
|
70
|
+
three_fifths: "three fifths",
|
71
|
+
four_fifths: "four fifths",
|
72
|
+
one_sixth: "one sixth",
|
73
|
+
five_sixths: "five sixths",
|
74
|
+
one_eighth: "one eighth",
|
75
|
+
three_eighths: "three eighths",
|
76
|
+
five_eighths: "five eighths",
|
77
|
+
seven_eighths: "seven eighths",
|
78
78
|
}
|
79
79
|
|
80
80
|
class << self
|
@@ -52,7 +52,7 @@ module Stringex
|
|
52
52
|
# It allows localization of conversions so you can use it to convert characters into your own language.
|
53
53
|
# Example:
|
54
54
|
#
|
55
|
-
# I18n.backend.store_translations :de, { :
|
55
|
+
# I18n.backend.store_translations :de, { stringex: { characters: { and: "und" } } }
|
56
56
|
# I18n.locale = :de
|
57
57
|
# "ich & dich".convert_misc_characters # => "ich und dich"
|
58
58
|
#
|
data/stringex.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: stringex 2.
|
5
|
+
# stub: stringex 2.7.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "stringex"
|
9
|
-
s.version = "2.
|
9
|
+
s.version = "2.7.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Russell Norris"]
|
14
|
-
s.date = "
|
14
|
+
s.date = "2017-01-18"
|
15
15
|
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]."
|
16
16
|
s.email = "rsl@luckysneaks.com"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -8,15 +8,15 @@ puts "-------------------------------------------------"
|
|
8
8
|
puts "Running ActsAsUrl tests with ActiveRecord adapter"
|
9
9
|
puts "-------------------------------------------------"
|
10
10
|
|
11
|
-
ActiveRecord::Base.establish_connection :
|
11
|
+
ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
|
12
12
|
|
13
13
|
ActiveRecord::Migration.verbose = false
|
14
14
|
ActiveRecord::Schema.define do
|
15
|
-
create_table :documents, :
|
15
|
+
create_table :documents, force: true do |t|
|
16
16
|
t.string :title, :other, :another, :url
|
17
17
|
end
|
18
18
|
|
19
|
-
create_table :sti_base_documents, :
|
19
|
+
create_table :sti_base_documents, force: true do |t|
|
20
20
|
t.string :title, :other, :another, :url, :type
|
21
21
|
end
|
22
22
|
end
|
@@ -25,7 +25,7 @@ DefineTestClasses = proc do
|
|
25
25
|
property :title, String
|
26
26
|
property :other, String
|
27
27
|
property :another, String
|
28
|
-
property :url, String, :
|
28
|
+
property :url, String, lazy: false
|
29
29
|
|
30
30
|
acts_as_url :title
|
31
31
|
end
|
@@ -36,7 +36,7 @@ DefineTestClasses = proc do
|
|
36
36
|
property :title, String
|
37
37
|
property :other, String
|
38
38
|
property :another, String
|
39
|
-
property :url, String, :
|
39
|
+
property :url, String, lazy: false
|
40
40
|
property :type, String
|
41
41
|
|
42
42
|
# This gets redefined in the only test that uses it but I want to be uniform
|
@@ -14,10 +14,10 @@ end
|
|
14
14
|
|
15
15
|
class Document
|
16
16
|
include Mongoid::Document
|
17
|
-
field :title, :
|
18
|
-
field :other, :
|
19
|
-
field :another, :
|
20
|
-
field :url, :
|
17
|
+
field :title, type: String
|
18
|
+
field :other, type: String
|
19
|
+
field :another, type: String
|
20
|
+
field :url, type: String
|
21
21
|
|
22
22
|
acts_as_url :title
|
23
23
|
end
|
@@ -32,11 +32,11 @@ end
|
|
32
32
|
|
33
33
|
class STIBaseDocument
|
34
34
|
include Mongoid::Document
|
35
|
-
field :title, :
|
36
|
-
field :other, :
|
37
|
-
field :another, :
|
38
|
-
field :url, :
|
39
|
-
field :type, :
|
35
|
+
field :title, type: String
|
36
|
+
field :other, type: String
|
37
|
+
field :another, type: String
|
38
|
+
field :url, type: String
|
39
|
+
field :type, type: String
|
40
40
|
|
41
41
|
# This gets redefined in the only test that uses it but I want to be uniform
|
42
42
|
# in setting configuration details in the tests themselves
|
@@ -9,7 +9,7 @@ class ActsAsUrlConfigurationTest < Test::Unit::TestCase
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_can_set_base_settings
|
12
|
-
default_configuration = Stringex::Configuration::ActsAsUrl.new(:
|
12
|
+
default_configuration = Stringex::Configuration::ActsAsUrl.new(url_attribute: "original")
|
13
13
|
assert_equal "original", default_configuration.settings.url_attribute
|
14
14
|
|
15
15
|
Stringex::ActsAsUrl.configure do |c|
|
@@ -26,7 +26,7 @@ class ActsAsUrlConfigurationTest < Test::Unit::TestCase
|
|
26
26
|
system_configuration = Stringex::Configuration::ActsAsUrl.new
|
27
27
|
assert_equal "special", system_configuration.settings.url_attribute
|
28
28
|
|
29
|
-
local_configuration = Stringex::Configuration::ActsAsUrl.new(:
|
29
|
+
local_configuration = Stringex::Configuration::ActsAsUrl.new(url_attribute: "local")
|
30
30
|
assert_equal "local", local_configuration.settings.url_attribute
|
31
31
|
end
|
32
32
|
|
@@ -9,20 +9,53 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
9
9
|
include AdapterSpecificTestBehaviors
|
10
10
|
|
11
11
|
def test_should_create_url
|
12
|
-
@doc = Document.create(:
|
12
|
+
@doc = Document.create(title: "Let's Make a Test Title, <em>Okay</em>?")
|
13
13
|
assert_equal "lets-make-a-test-title-okay", @doc.url
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_should_create_unique_url
|
17
|
-
@doc = Document.create(:
|
18
|
-
@other_doc = Document.create(:
|
17
|
+
@doc = Document.create(title: "Unique")
|
18
|
+
@other_doc = Document.create(title: "Unique")
|
19
19
|
assert_equal "unique", @doc.url
|
20
20
|
assert_equal "unique-1", @other_doc.url
|
21
21
|
end
|
22
22
|
|
23
|
+
def test_should_allow_custom_duplicates
|
24
|
+
sequence = Enumerator.new { |enum| loop { enum.yield 12345 } }
|
25
|
+
Document.class_eval do
|
26
|
+
acts_as_url :title, duplicate_sequence: sequence
|
27
|
+
end
|
28
|
+
|
29
|
+
@doc = Document.create(title: "New")
|
30
|
+
@other_doc = Document.create(title: "New")
|
31
|
+
assert_equal "new-document", @doc.url
|
32
|
+
assert_equal "new-document-12345", @other_doc.url
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_should_restart_duplicate_sequence_each_time
|
36
|
+
sequence = Enumerator.new do |enum|
|
37
|
+
n = 1
|
38
|
+
loop do
|
39
|
+
enum.yield n
|
40
|
+
n += 1
|
41
|
+
end
|
42
|
+
end
|
43
|
+
Document.class_eval do
|
44
|
+
acts_as_url :title, duplicate_sequence: sequence
|
45
|
+
end
|
46
|
+
@doc = Document.create(title: "Unique")
|
47
|
+
@other_doc = Document.create(title: "Unique")
|
48
|
+
@third_doc = Document.create(title: "Another")
|
49
|
+
@fourth_doc = Document.create(title: "Another")
|
50
|
+
assert_equal "unique", @doc.url
|
51
|
+
assert_equal "unique-1", @other_doc.url
|
52
|
+
assert_equal "another", @third_doc.url
|
53
|
+
assert_equal "another-1", @fourth_doc.url
|
54
|
+
end
|
55
|
+
|
23
56
|
def test_should_avoid_blacklist
|
24
|
-
@doc = Document.create(:
|
25
|
-
@other_doc = Document.create(:
|
57
|
+
@doc = Document.create(title: "New")
|
58
|
+
@other_doc = Document.create(title: "new")
|
26
59
|
assert_equal "new-document", @doc.url
|
27
60
|
assert_equal "new-document-1", @other_doc.url
|
28
61
|
end
|
@@ -30,60 +63,60 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
30
63
|
def test_should_allow_customizing_blacklist
|
31
64
|
Document.class_eval do
|
32
65
|
# Un-blacklisting 'new' isn't advisable
|
33
|
-
acts_as_url :title, :
|
66
|
+
acts_as_url :title, blacklist: %w{special}
|
34
67
|
end
|
35
68
|
|
36
|
-
@doc = Document.create(:
|
37
|
-
@other_doc = Document.create(:
|
69
|
+
@doc = Document.create(title: "New")
|
70
|
+
@other_doc = Document.create(title: "Special")
|
38
71
|
assert_equal 'new', @doc.url
|
39
72
|
assert_equal 'special-document', @other_doc.url
|
40
73
|
end
|
41
74
|
|
42
75
|
def test_should_allow_customizing_blacklist_policy
|
43
76
|
Document.class_eval do
|
44
|
-
acts_as_url :title, :
|
77
|
+
acts_as_url :title, blacklist_policy: Proc.new(){|instance, url|
|
45
78
|
"#{url}-customized"
|
46
79
|
}
|
47
80
|
end
|
48
81
|
|
49
|
-
@doc = Document.create(:
|
50
|
-
@other_doc = Document.create(:
|
82
|
+
@doc = Document.create(title: "New")
|
83
|
+
@other_doc = Document.create(title: "New")
|
51
84
|
assert_equal 'new-customized', @doc.url
|
52
85
|
assert_equal 'new-customized-1', @other_doc.url
|
53
86
|
end
|
54
87
|
|
55
88
|
def test_should_create_unique_url_when_partial_url_already_exists
|
56
|
-
@doc = Document.create(:
|
57
|
-
@other_doc = Document.create(:
|
89
|
+
@doc = Document.create(title: "House Farms")
|
90
|
+
@other_doc = Document.create(title: "House Farm")
|
58
91
|
|
59
92
|
assert_equal "house-farms", @doc.url
|
60
93
|
assert_equal "house-farm", @other_doc.url
|
61
94
|
end
|
62
95
|
|
63
96
|
def test_should_not_sync_url_by_default
|
64
|
-
@doc = Document.create(:
|
97
|
+
@doc = Document.create(title: "Stable as Stone")
|
65
98
|
@original_url = @doc.url
|
66
|
-
adapter_specific_update @doc, :
|
99
|
+
adapter_specific_update @doc, title: "New Unstable Madness"
|
67
100
|
assert_equal @original_url, @doc.url
|
68
101
|
end
|
69
102
|
|
70
103
|
def test_should_allow_syncing_url
|
71
104
|
Document.class_eval do
|
72
|
-
acts_as_url :title, :
|
105
|
+
acts_as_url :title, sync_url: true
|
73
106
|
end
|
74
107
|
|
75
|
-
@doc = Document.create(:
|
108
|
+
@doc = Document.create(title: "Original")
|
76
109
|
@original_url = @doc.url
|
77
|
-
adapter_specific_update @doc, :
|
110
|
+
adapter_specific_update @doc, title: "New and Improved"
|
78
111
|
assert_not_equal @original_url, @doc.url
|
79
112
|
end
|
80
113
|
|
81
114
|
def test_should_not_increment_count_on_repeated_saves
|
82
115
|
Document.class_eval do
|
83
|
-
acts_as_url :title, :
|
116
|
+
acts_as_url :title, sync_url: true
|
84
117
|
end
|
85
118
|
|
86
|
-
@doc = Document.create(:
|
119
|
+
@doc = Document.create(title: "Continuous or Constant")
|
87
120
|
assert_equal "continuous-or-constant", @doc.url
|
88
121
|
5.times do |n|
|
89
122
|
@doc.save!
|
@@ -93,54 +126,54 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
93
126
|
|
94
127
|
def test_should_allow_allowing_duplicate_url
|
95
128
|
Document.class_eval do
|
96
|
-
acts_as_url :title, :
|
129
|
+
acts_as_url :title, allow_duplicates: true
|
97
130
|
end
|
98
131
|
|
99
|
-
@doc = Document.create(:
|
100
|
-
@other_doc = Document.create(:
|
132
|
+
@doc = Document.create(title: "I am not a clone")
|
133
|
+
@other_doc = Document.create(title: "I am not a clone")
|
101
134
|
assert_equal @doc.url, @other_doc.url
|
102
135
|
end
|
103
136
|
|
104
137
|
def test_should_allow_scoping_url_uniqueness
|
105
138
|
Document.class_eval do
|
106
|
-
acts_as_url :title, :
|
139
|
+
acts_as_url :title, scope: :other
|
107
140
|
end
|
108
141
|
|
109
|
-
@doc = Document.create(:
|
110
|
-
@other_doc = Document.create(:
|
142
|
+
@doc = Document.create(title: "Mocumentary", other: "I don't care if I'm unique for some reason")
|
143
|
+
@other_doc = Document.create(title: "Mocumentary", other: "Me either")
|
111
144
|
assert_equal @doc.url, @other_doc.url
|
112
145
|
end
|
113
146
|
|
114
147
|
def test_should_still_create_unique_urls_if_scoped_attribute_is_the_same
|
115
148
|
Document.class_eval do
|
116
|
-
acts_as_url :title, :
|
149
|
+
acts_as_url :title, scope: :other
|
117
150
|
end
|
118
151
|
|
119
|
-
@doc = Document.create(:
|
120
|
-
@other_doc = Document.create(:
|
152
|
+
@doc = Document.create(title: "Mocumentary", other: "Suddenly, I care if I'm unique")
|
153
|
+
@other_doc = Document.create(title: "Mocumentary", other: "Suddenly, I care if I'm unique")
|
121
154
|
assert_not_equal @doc.url, @other_doc.url
|
122
155
|
end
|
123
156
|
|
124
157
|
def test_should_allow_multiple_scopes
|
125
158
|
Document.class_eval do
|
126
|
-
acts_as_url :title, :
|
159
|
+
acts_as_url :title, scope: [:other, :another]
|
127
160
|
end
|
128
161
|
|
129
|
-
@doc = Document.create(:
|
130
|
-
:
|
131
|
-
@other_doc = Document.create(:
|
162
|
+
@doc = Document.create(title: "Mocumentary", other: "I don't care if I'm unique for some reason",
|
163
|
+
another: "Whatever")
|
164
|
+
@other_doc = Document.create(title: "Mocumentary", other: "Me either", another: "Whatever")
|
132
165
|
assert_equal @doc.url, @other_doc.url
|
133
166
|
end
|
134
167
|
|
135
168
|
def test_should_only_create_unique_urls_for_multiple_scopes_if_both_attributes_are_same
|
136
169
|
Document.class_eval do
|
137
|
-
acts_as_url :title, :
|
170
|
+
acts_as_url :title, scope: [:other, :another]
|
138
171
|
end
|
139
172
|
|
140
|
-
@doc = Document.create(:
|
141
|
-
:
|
142
|
-
@other_doc = Document.create(:
|
143
|
-
:
|
173
|
+
@doc = Document.create(title: "Mocumentary", other: "Suddenly, I care if I'm unique",
|
174
|
+
another: "Whatever")
|
175
|
+
@other_doc = Document.create(title: "Mocumentary", other: "Suddenly, I care if I'm unique",
|
176
|
+
another: "Whatever")
|
144
177
|
assert_not_equal @doc.url, @other_doc.url
|
145
178
|
end
|
146
179
|
|
@@ -149,10 +182,10 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
149
182
|
# Manually undefining the url method on Document which, in a real class not reused for tests,
|
150
183
|
# would never have been defined to begin with.
|
151
184
|
remove_method :url
|
152
|
-
acts_as_url :title, :
|
185
|
+
acts_as_url :title, url_attribute: :other
|
153
186
|
end
|
154
187
|
|
155
|
-
@doc = Document.create(:
|
188
|
+
@doc = Document.create(title: "Anything at This Point")
|
156
189
|
assert_equal "anything-at-this-point", @doc.other
|
157
190
|
assert_nil @doc.url
|
158
191
|
ensure
|
@@ -164,21 +197,21 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
164
197
|
|
165
198
|
def test_should_allow_updating_url_only_when_blank
|
166
199
|
Document.class_eval do
|
167
|
-
acts_as_url :title, :
|
200
|
+
acts_as_url :title, only_when_blank: true
|
168
201
|
end
|
169
202
|
|
170
203
|
@string = 'the-url-of-concrete'
|
171
|
-
@doc = Document.create(:
|
204
|
+
@doc = Document.create(title: "Stable as Stone", url: @string)
|
172
205
|
assert_equal @string, @doc.url
|
173
|
-
@other_doc = Document.create(:
|
206
|
+
@other_doc = Document.create(title: "Stable as Stone")
|
174
207
|
assert_equal 'stable-as-stone', @other_doc.url
|
175
208
|
end
|
176
209
|
|
177
210
|
def test_should_mass_initialize_urls
|
178
|
-
@doc = Document.create(:
|
179
|
-
@other_doc = Document.create(:
|
180
|
-
adapter_specific_update @doc, :
|
181
|
-
adapter_specific_update @other_doc, :
|
211
|
+
@doc = Document.create(title: "Initial")
|
212
|
+
@other_doc = Document.create(title: "Subsequent")
|
213
|
+
adapter_specific_update @doc, url: nil
|
214
|
+
adapter_specific_update @other_doc, url: nil
|
182
215
|
# Just making sure this got unset before the real test
|
183
216
|
assert_nil @doc.url
|
184
217
|
assert_nil @other_doc.url
|
@@ -196,13 +229,13 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
196
229
|
# Manually undefining the url method on Document which, in a real class not reused for tests,
|
197
230
|
# would never have been defined to begin with.
|
198
231
|
remove_method :url
|
199
|
-
acts_as_url :title, :
|
232
|
+
acts_as_url :title, url_attribute: :other
|
200
233
|
end
|
201
234
|
|
202
|
-
@doc = Document.create(:
|
203
|
-
@other_doc = Document.create(:
|
204
|
-
adapter_specific_update @doc, :
|
205
|
-
adapter_specific_update @other_doc, :
|
235
|
+
@doc = Document.create(title: "Initial")
|
236
|
+
@other_doc = Document.create(title: "Subsequent")
|
237
|
+
adapter_specific_update @doc, other: nil
|
238
|
+
adapter_specific_update @other_doc, other: nil
|
206
239
|
# Just making sure this got unset before the real test
|
207
240
|
assert_nil @doc.other
|
208
241
|
assert_nil @other_doc.other
|
@@ -221,10 +254,10 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
221
254
|
end
|
222
255
|
|
223
256
|
def test_should_mass_initialize_empty_string_urls
|
224
|
-
@doc = Document.create(:
|
225
|
-
@other_doc = Document.create(:
|
226
|
-
adapter_specific_update @doc, :
|
227
|
-
adapter_specific_update @other_doc, :
|
257
|
+
@doc = Document.create(title: "Initial")
|
258
|
+
@other_doc = Document.create(title: "Subsequent")
|
259
|
+
adapter_specific_update @doc, url: ''
|
260
|
+
adapter_specific_update @other_doc, url: ''
|
228
261
|
# Just making sure this got unset before the real test
|
229
262
|
assert_equal '', @doc.url
|
230
263
|
assert_equal '', @other_doc.url
|
@@ -246,7 +279,7 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
246
279
|
end
|
247
280
|
end
|
248
281
|
|
249
|
-
@doc = Document.create(:
|
282
|
+
@doc = Document.create(title: "Title String")
|
250
283
|
assert_equal "title-string-got-massaged", @doc.url
|
251
284
|
ensure
|
252
285
|
Document.class_eval do
|
@@ -257,22 +290,22 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
257
290
|
|
258
291
|
def test_should_allow_customizing_duplicate_count_separator
|
259
292
|
Document.class_eval do
|
260
|
-
acts_as_url :title, :
|
293
|
+
acts_as_url :title, duplicate_count_separator: "---"
|
261
294
|
end
|
262
295
|
|
263
|
-
@doc = Document.create(:
|
264
|
-
@other_doc = Document.create(:
|
296
|
+
@doc = Document.create(title: "Unique")
|
297
|
+
@other_doc = Document.create(title: "Unique")
|
265
298
|
assert_equal "unique", @doc.url
|
266
299
|
assert_equal "unique---1", @other_doc.url
|
267
300
|
end
|
268
301
|
|
269
302
|
def test_should_only_update_url_if_url_attribute_is_valid
|
270
303
|
Document.class_eval do
|
271
|
-
acts_as_url :title, :
|
304
|
+
acts_as_url :title, sync_url: true
|
272
305
|
end
|
273
306
|
add_validation_on_document_title
|
274
307
|
|
275
|
-
@doc = Document.create(:
|
308
|
+
@doc = Document.create(title: "Valid Record", other: "Present")
|
276
309
|
assert_equal "valid-record", @doc.url
|
277
310
|
@doc.title = nil
|
278
311
|
assert_equal false, @doc.valid?
|
@@ -283,61 +316,61 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
283
316
|
|
284
317
|
def test_should_allow_customizing_url_limit
|
285
318
|
Document.class_eval do
|
286
|
-
acts_as_url :title, :
|
319
|
+
acts_as_url :title, limit: 13
|
287
320
|
end
|
288
321
|
|
289
|
-
@doc = Document.create(:
|
322
|
+
@doc = Document.create(title: "I am much too long")
|
290
323
|
assert_equal "i-am-much-too", @doc.url
|
291
324
|
end
|
292
325
|
|
293
326
|
def test_handling_duplicate_urls_with_limits
|
294
327
|
Document.class_eval do
|
295
|
-
acts_as_url :title, :
|
328
|
+
acts_as_url :title, limit: 13
|
296
329
|
end
|
297
330
|
|
298
|
-
@doc = Document.create(:
|
331
|
+
@doc = Document.create(title: "I am much too long and also duplicated")
|
299
332
|
assert_equal "i-am-much-too", @doc.url
|
300
|
-
@other_doc = Document.create(:
|
333
|
+
@other_doc = Document.create(title: "I am much too long and also duplicated")
|
301
334
|
assert_equal "i-am-much-too-1", @other_doc.url
|
302
335
|
end
|
303
336
|
|
304
337
|
def test_should_allow_excluding_specific_values_from_being_run_through_to_url
|
305
338
|
Document.class_eval do
|
306
|
-
acts_as_url :title, :
|
339
|
+
acts_as_url :title, exclude: ["_So_Fucking_Special"]
|
307
340
|
end
|
308
341
|
|
309
|
-
@doc = Document.create(:
|
342
|
+
@doc = Document.create(title: "_So_Fucking_Special")
|
310
343
|
assert_equal "_So_Fucking_Special", @doc.url
|
311
|
-
@doc_2 = Document.create(:
|
344
|
+
@doc_2 = Document.create(title: "But I'm a creep")
|
312
345
|
assert_equal "but-im-a-creep", @doc_2.url
|
313
346
|
end
|
314
347
|
|
315
348
|
def test_should_allow_not_forcing_downcasing
|
316
349
|
Document.class_eval do
|
317
|
-
acts_as_url :title, :
|
350
|
+
acts_as_url :title, force_downcase: false
|
318
351
|
end
|
319
352
|
|
320
|
-
@doc = Document.create(:
|
353
|
+
@doc = Document.create(title: "I have CAPS!")
|
321
354
|
assert_equal "I-have-CAPS", @doc.url
|
322
355
|
end
|
323
356
|
|
324
357
|
def test_should_allow_alternate_whitespace_replacements
|
325
358
|
Document.class_eval do
|
326
|
-
acts_as_url :title, :
|
359
|
+
acts_as_url :title, replace_whitespace_with: "~"
|
327
360
|
end
|
328
361
|
|
329
|
-
@doc = Document.create(:
|
362
|
+
@doc = Document.create(title: "now with tildes")
|
330
363
|
assert_equal "now~with~tildes", @doc.url
|
331
364
|
end
|
332
365
|
|
333
366
|
def test_should_allow_enforcing_uniqueness_on_sti_base_class
|
334
367
|
STIBaseDocument.class_eval do
|
335
|
-
acts_as_url :title, :
|
368
|
+
acts_as_url :title, enforce_uniqueness_on_sti_base_class: true
|
336
369
|
end
|
337
370
|
|
338
|
-
@doc = STIChildDocument.create(:
|
371
|
+
@doc = STIChildDocument.create(title: "Unique")
|
339
372
|
assert_equal "unique", @doc.url
|
340
|
-
@doc_2 = AnotherSTIChildDocument.create(:
|
373
|
+
@doc_2 = AnotherSTIChildDocument.create(title: "Unique")
|
341
374
|
assert_equal "unique-1", @doc_2.url
|
342
375
|
end
|
343
376
|
|
@@ -346,47 +379,47 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
|
|
346
379
|
acts_as_url :title
|
347
380
|
end
|
348
381
|
|
349
|
-
@doc = Document.create(:
|
382
|
+
@doc = Document.create(title: "a b/c d")
|
350
383
|
assert_equal "a-b-slash-c-d", @doc.url
|
351
384
|
end
|
352
385
|
|
353
386
|
def test_should_allow_slashes_to_be_allowed
|
354
387
|
Document.class_eval do
|
355
|
-
acts_as_url :title, :
|
388
|
+
acts_as_url :title, allow_slash: true
|
356
389
|
end
|
357
390
|
|
358
|
-
@doc = Document.create(:
|
391
|
+
@doc = Document.create(title: "a b/c d")
|
359
392
|
assert_equal "a-b/c-d", @doc.url
|
360
393
|
end
|
361
394
|
|
362
395
|
def test_should_truncate_words_by_default
|
363
396
|
Document.class_eval do
|
364
|
-
acts_as_url :title, :
|
397
|
+
acts_as_url :title, limit: 20
|
365
398
|
end
|
366
399
|
|
367
|
-
@doc = Document.create(:
|
400
|
+
@doc = Document.create(title: "title with many whole words")
|
368
401
|
assert_equal 'title-with-many-whol', @doc.url
|
369
402
|
end
|
370
403
|
|
371
404
|
def test_should_not_truncate_words
|
372
405
|
Document.class_eval do
|
373
|
-
acts_as_url :title, :
|
406
|
+
acts_as_url :title, limit: 20, truncate_words: false
|
374
407
|
end
|
375
408
|
|
376
|
-
@doc = Document.create(:
|
409
|
+
@doc = Document.create(title: "title with many whole words")
|
377
410
|
assert_equal 'title-with-many', @doc.url
|
378
411
|
end
|
379
412
|
|
380
413
|
def test_should_allow_overriding_url_taken_method
|
381
414
|
Document.class_eval do
|
382
|
-
acts_as_url :title, :
|
415
|
+
acts_as_url :title, url_taken_method: :url_taken?
|
383
416
|
|
384
417
|
def url_taken?(url)
|
385
418
|
["unique", "unique-1", "unique-2"].include?(url)
|
386
419
|
end
|
387
420
|
end
|
388
421
|
|
389
|
-
@doc = Document.create(:
|
422
|
+
@doc = Document.create(title: "unique")
|
390
423
|
assert_equal "unique-3", @doc.url
|
391
424
|
end
|
392
425
|
end
|
@@ -11,7 +11,7 @@ class LocalizationTest < Test::Unit::TestCase
|
|
11
11
|
def test_stores_translations
|
12
12
|
Stringex::Localization.backend = :internal
|
13
13
|
|
14
|
-
data = { :
|
14
|
+
data = { one: "number one", two: "number two" }
|
15
15
|
Stringex::Localization.store_translations :en, :test_store, data
|
16
16
|
|
17
17
|
data.each do |key, value|
|
@@ -34,7 +34,7 @@ class LocalizationTest < Test::Unit::TestCase
|
|
34
34
|
def test_can_translate
|
35
35
|
Stringex::Localization.backend = :internal
|
36
36
|
|
37
|
-
data = { :
|
37
|
+
data = { one: "number one", two: "number two" }
|
38
38
|
Stringex::Localization.store_translations :en, :test_translate, data
|
39
39
|
|
40
40
|
data.each do |key, value|
|
@@ -45,7 +45,7 @@ class LocalizationTest < Test::Unit::TestCase
|
|
45
45
|
def test_can_translate_when_given_string_as_key
|
46
46
|
Stringex::Localization.backend = :internal
|
47
47
|
|
48
|
-
data = { :
|
48
|
+
data = { one: "number one", two: "number two" }
|
49
49
|
Stringex::Localization.store_translations :en, :test_translate, data
|
50
50
|
|
51
51
|
data.each do |key, value|
|
@@ -55,7 +55,7 @@ class LocalizationTest < Test::Unit::TestCase
|
|
55
55
|
|
56
56
|
def test_returns_default_if_none_found
|
57
57
|
Stringex::Localization.backend = :internal
|
58
|
-
assert_equal "my default", Stringex::Localization.translate(:test_default, :nonexistent, :
|
58
|
+
assert_equal "my default", Stringex::Localization.translate(:test_default, :nonexistent, default: "my default")
|
59
59
|
end
|
60
60
|
|
61
61
|
def test_returns_nil_if_no_default
|
@@ -91,7 +91,7 @@ class LocalizationTest < Test::Unit::TestCase
|
|
91
91
|
def test_stores_translations_in_i18n
|
92
92
|
Stringex::Localization.backend = :i18n
|
93
93
|
|
94
|
-
data = { :
|
94
|
+
data = { one: "number one", two: "number two" }
|
95
95
|
Stringex::Localization.store_translations :en, :test_i18n_store, data
|
96
96
|
|
97
97
|
data.each do |key, value|
|
@@ -102,9 +102,9 @@ class LocalizationTest < Test::Unit::TestCase
|
|
102
102
|
def test_can_translate_using_i18n
|
103
103
|
Stringex::Localization.backend = :i18n
|
104
104
|
|
105
|
-
data = { :
|
105
|
+
data = { one: "number one", two: "number two" }
|
106
106
|
|
107
|
-
I18n.backend.store_translations :en, { :
|
107
|
+
I18n.backend.store_translations :en, { stringex: { test_i18n_translation: data } }
|
108
108
|
|
109
109
|
data.each do |key, value|
|
110
110
|
assert_equal value, Stringex::Localization.translate(:test_i18n_translation, key)
|
@@ -117,7 +117,7 @@ class LocalizationTest < Test::Unit::TestCase
|
|
117
117
|
|
118
118
|
assert_equal "Test blank", "Test blank".convert_miscellaneous_html_entities
|
119
119
|
|
120
|
-
Stringex::Localization.store_translations :en, :html_entities, { :
|
120
|
+
Stringex::Localization.store_translations :en, :html_entities, { nbsp: "" }
|
121
121
|
assert_equal "Testblank", "Test blank".convert_miscellaneous_html_entities
|
122
122
|
end
|
123
123
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stringex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Russell Norris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jeweler
|