simple_slug 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/simple_slug/model_addition.rb +18 -5
- data/lib/simple_slug/version.rb +1 -1
- data/lib/simple_slug.rb +26 -1
- data/simple_slug.gemspec +1 -1
- data/spec/simple_slug/model_addition_spec.rb +34 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e372bf7c9afde482560d5e69ed52ce343e0c08e
|
4
|
+
data.tar.gz: 3f51178cc10919580d3e167839c93d1ceaa5fedd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6b3a471ce38ccb23d33ca1be285012b7980d1d5c15f6a982b869c8d348ee879d405728c1fe0eeea80e112b4471a2765e6ceec7b38da3b01c1ea7e1dcd64be6f
|
7
|
+
data.tar.gz: 5872ee8fe9b193d425ec3090c403a19fe7fec864f1fdf94f0a6039a65782248bef837600d49ba3b2679299ba6008353ea83bd8d6d749678f2b867d0bde8431ec
|
@@ -81,12 +81,25 @@ module SimpleSlug
|
|
81
81
|
|
82
82
|
def should_generate_new_slug?
|
83
83
|
return true if simple_slug_options[:history]
|
84
|
-
|
85
|
-
|
84
|
+
if simple_slug_options[:locales]
|
85
|
+
should_generate_new_slug_for_locales.present?
|
86
|
+
else
|
87
|
+
simple_slug_get.blank?
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def should_generate_new_slug_for_locales
|
92
|
+
return unless simple_slug_options[:locales]
|
93
|
+
simple_slug_options[:locales].find_all {|locale| simple_slug_get(locale).blank?}
|
86
94
|
end
|
87
95
|
|
88
96
|
def simple_slug_generate(force=false)
|
89
|
-
|
97
|
+
locales = if simple_slug_options[:locales]
|
98
|
+
((!force && should_generate_new_slug_for_locales) || simple_slug_options[:locales])
|
99
|
+
else
|
100
|
+
[nil]
|
101
|
+
end
|
102
|
+
locales.each do |locale|
|
90
103
|
simple_slug_generate_for_locale(locale, force)
|
91
104
|
end
|
92
105
|
end
|
@@ -95,6 +108,7 @@ module SimpleSlug
|
|
95
108
|
simple_slug_with_locale(locale) do
|
96
109
|
simple_slug = simple_slug_normalize(simple_slug_base)
|
97
110
|
simple_slug = simple_slug.first(simple_slug_options[:max_length]) if simple_slug_options[:max_length]
|
111
|
+
simple_slug = "__#{id || rand(9999)}" if simple_slug.blank? && simple_slug_options[:fallback_on_blank]
|
98
112
|
return if !force && simple_slug == simple_slug_get(locale).to_s.sub(/--\d+\z/, '')
|
99
113
|
resolved_simple_slug = simple_slug_resolve(simple_slug, locale)
|
100
114
|
simple_slug_set(resolved_simple_slug, locale)
|
@@ -116,9 +130,8 @@ module SimpleSlug
|
|
116
130
|
end
|
117
131
|
|
118
132
|
def simple_slug_normalize(base)
|
119
|
-
base = SimpleSlug.normalize_cyrillic(base) unless SimpleSlug::CYRILLIC_LOCALES.include?(I18n.locale)
|
120
133
|
parameterize_args = ActiveSupport::VERSION::MAJOR > 4 ? {separator: '-'} : '-'
|
121
|
-
normalized = I18n.transliterate(base).parameterize(parameterize_args).downcase
|
134
|
+
normalized = I18n.transliterate(SimpleSlug.normalize_i18n_fix(base)).parameterize(parameterize_args).downcase
|
122
135
|
normalized.to_s =~ SimpleSlug::STARTS_WITH_NUMBER_REGEXP ? "_#{normalized}" : normalized
|
123
136
|
end
|
124
137
|
|
data/lib/simple_slug/version.rb
CHANGED
data/lib/simple_slug.rb
CHANGED
@@ -10,7 +10,7 @@ module SimpleSlug
|
|
10
10
|
@@excludes = %w(new edit show index session login logout sign_in sign_out users admin stylesheets assets javascripts images)
|
11
11
|
|
12
12
|
mattr_accessor :slug_regexp
|
13
|
-
@@slug_regexp = /\A
|
13
|
+
@@slug_regexp = /\A(?:\w+[\w\d\-_]*|--\d+)\z/
|
14
14
|
|
15
15
|
mattr_accessor :slug_column
|
16
16
|
@@slug_column = 'slug'
|
@@ -26,12 +26,37 @@ module SimpleSlug
|
|
26
26
|
|
27
27
|
STARTS_WITH_NUMBER_REGEXP =/\A\d+/
|
28
28
|
CYRILLIC_LOCALES = [:uk, :ru, :be].freeze
|
29
|
+
ES_LOCALES = [:es].freeze
|
30
|
+
|
31
|
+
ES_NORMALIZE_SINGLE = [
|
32
|
+
'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåçèéêëìíîïñòóôõöøùúûüýÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıĴĵĶķĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƒƠơƯưǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǺǻǾǿ',
|
33
|
+
'AAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaceeeeiiiinoooooouuuuyyAaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiJjKkLlLlLlLlllNnNnNnnOoOoOoRrRrRrSsSsSsSsTtTtTtUuUuUuUuUuUuWwYyYZzZzZzsfOoUuAaIiOoUuUuUuUuUuAaOo'
|
34
|
+
].freeze
|
35
|
+
|
36
|
+
ES_NORMALIZE_MULTI = [['Æ', 'AE'], ['æ', 'ae'], ['IJ', 'IJ'], ['ij', 'ij'], ['Œ', 'OE'], ['œ', 'oe'], ['Ǽ', 'AE'], ['ǽ', 'ae']].freeze
|
29
37
|
|
30
38
|
def self.setup
|
31
39
|
yield self
|
32
40
|
end
|
33
41
|
|
42
|
+
def self.normalize_i18n_fix(base, locale=I18n.locale)
|
43
|
+
locale_sym = locale.to_sym
|
44
|
+
if CYRILLIC_LOCALES.include?(locale_sym)
|
45
|
+
normalize_cyrillic(base)
|
46
|
+
elsif ES_LOCALES.include?(locale_sym)
|
47
|
+
normalize_es(base)
|
48
|
+
else
|
49
|
+
base
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
34
53
|
def self.normalize_cyrillic(base)
|
35
54
|
base.tr('АаВЕеіКкМНОоРрСсТуХх', 'AaBEeiKkMHOoPpCcTyXx')
|
36
55
|
end
|
56
|
+
|
57
|
+
def self.normalize_es(base)
|
58
|
+
base = base.tr(*ES_NORMALIZE_SINGLE)
|
59
|
+
ES_NORMALIZE_MULTI.each{|d| base.gsub!(*d) }
|
60
|
+
base
|
61
|
+
end
|
37
62
|
end
|
data/simple_slug.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_dependency 'activerecord', '>= 4.0.0', '< 5.
|
21
|
+
spec.add_dependency 'activerecord', '>= 4.0.0', '< 5.3'
|
22
22
|
spec.add_dependency 'i18n', '~> 0.7'
|
23
23
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.5'
|
@@ -12,6 +12,10 @@ class SlugGenerationRspecModelWithoutCallback < RspecActiveModelBase
|
|
12
12
|
simple_slug :name, callback_type: nil
|
13
13
|
end
|
14
14
|
|
15
|
+
class SlugGenerationRspecModelWithFallbackOnBlank < RspecActiveModelBase
|
16
|
+
simple_slug :name, fallback_on_blank: true
|
17
|
+
end
|
18
|
+
|
15
19
|
class SlugGenerationRspecModelLocalized < RspecActiveModelBase
|
16
20
|
attr_accessor :slug_en, :name_en
|
17
21
|
alias_method :slug_en_was, :slug_en
|
@@ -27,6 +31,7 @@ describe SimpleSlug::ModelAddition do
|
|
27
31
|
describe 'slug generation' do
|
28
32
|
before do
|
29
33
|
allow_any_instance_of(SlugGenerationRspecModel). to receive(:simple_slug_exists?).and_return(false)
|
34
|
+
allow_any_instance_of(SlugGenerationRspecModelWithFallbackOnBlank). to receive(:simple_slug_exists?).and_return(false)
|
30
35
|
end
|
31
36
|
|
32
37
|
it 'after save' do
|
@@ -49,6 +54,17 @@ describe SimpleSlug::ModelAddition do
|
|
49
54
|
expect(SlugGenerationRspecModel.new(slug: 'test.test')).not_to be_valid
|
50
55
|
end
|
51
56
|
|
57
|
+
it 'es chars' do
|
58
|
+
I18n.with_locale(:es) do
|
59
|
+
expect(SlugGenerationRspecModel.create(name: 'áǼßHello').slug).to eq 'aaeshello'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'fallback on blank' do
|
64
|
+
SlugGenerationRspecModelWithFallbackOnBlank.create({})
|
65
|
+
expect(SlugGenerationRspecModelWithFallbackOnBlank.create({}).slug).to start_with '__'
|
66
|
+
end
|
67
|
+
|
52
68
|
it 'skip slug generation' do
|
53
69
|
allow_any_instance_of(SlugGenerationRspecModel).to receive(:should_generate_new_slug?).and_return(false)
|
54
70
|
expect(SlugGenerationRspecModel.create(name: 'Hello').slug).to be_blank
|
@@ -156,6 +172,24 @@ describe SimpleSlug::ModelAddition do
|
|
156
172
|
expect(record.slug_en).to eq 'hello-en'
|
157
173
|
end
|
158
174
|
|
175
|
+
describe '#should_generate_new_slug?' do
|
176
|
+
it 'keep generated slugs' do
|
177
|
+
record = SlugGenerationRspecModelLocalized.create(name: 'Hello', name_en: 'Hello en')
|
178
|
+
record.name = 'bye'
|
179
|
+
record.slug_en = nil
|
180
|
+
record.name_en = 'Bye en'
|
181
|
+
expect{ record.save }.not_to change{ record.slug }
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'generate slug for locales with blank slug' do
|
185
|
+
record = SlugGenerationRspecModelLocalized.create(name: 'Hello', name_en: 'Hello en')
|
186
|
+
record.name = 'bye'
|
187
|
+
record.slug_en = nil
|
188
|
+
record.name_en = 'Bye en'
|
189
|
+
expect{ record.save }.to change{ record.slug_en }.to('bye-en')
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
159
193
|
describe '#to_param' do
|
160
194
|
it 'generate not localized for default locale' do
|
161
195
|
record = SlugGenerationRspecModelLocalized.create(name: 'Hello', name_en: 'Hello en')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_slug
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Leschenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: 4.0.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '5.
|
22
|
+
version: '5.3'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: 4.0.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '5.
|
32
|
+
version: '5.3'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: i18n
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
130
|
version: '0'
|
131
131
|
requirements: []
|
132
132
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.
|
133
|
+
rubygems_version: 2.6.14
|
134
134
|
signing_key:
|
135
135
|
specification_version: 4
|
136
136
|
summary: Friendly url generator with history.
|