simple_slug 0.3.4 → 0.3.5
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.
- 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.
|