simple_slug 0.3.3 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c874adc1930625e01a5acd27c1fe86702b83f165
4
- data.tar.gz: 42c385427b5cd8f19414cc8f04425e0303d53cf6
3
+ metadata.gz: 4ee4149b3d1f301a58ec9bc4ff2000727be10650
4
+ data.tar.gz: 8e9554c782d1b5b33187e3848873f0d12b81ca5d
5
5
  SHA512:
6
- metadata.gz: d4509499086e9cd6a8f56d41861c1a83328be626ba89edea4e2a0599f729a81b6345d43064515f16f7d4aee395fceb519878b356470bf44f46051f15c60bd91a
7
- data.tar.gz: e43c614e9f37982a6a7b6a8eec8897161ca097093dade94674e7661cc5655b748b0333301137ecd89fb2860dcdc61a8393b7fa5e9729bf6f54c02bb7f1ae1c34
6
+ metadata.gz: 9392260bc6505c78f5044916e93d79dcfb3d0dc1bb64570da75c859fb5932d6034d87438af8c3ade9e911ccb728879a8c7712b4fab28488d19b356d99e7b7948
7
+ data.tar.gz: de23e545145e537dce36ca62973648724ef9dd5e748b0998de3cda46a5c10670004dc6f5e6f8a299ca77de997ec045486eef177c3eeb960b10748d1bf3f3bc67
data/.gitignore CHANGED
@@ -20,3 +20,4 @@ spec/reports
20
20
  test/tmp
21
21
  test/version_tmp
22
22
  tmp
23
+ .byebug_history
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in simple_slug.gemspec
4
4
  gemspec
5
+
6
+ gem 'byebug'
data/lib/simple_slug.rb CHANGED
@@ -9,8 +9,8 @@ module SimpleSlug
9
9
  mattr_accessor :excludes
10
10
  @@excludes = %w(new edit show index session login logout sign_in sign_out users admin stylesheets assets javascripts images)
11
11
 
12
- mattr_accessor :exclude_regexp
13
- @@exclude_regexp = /\A\d+\z/
12
+ mattr_accessor :slug_regexp
13
+ @@slug_regexp = /\A\w+[\w\d\-_]*\z/
14
14
 
15
15
  mattr_accessor :slug_column
16
16
  @@slug_column = 'slug'
@@ -11,6 +11,7 @@ module SimpleSlug
11
11
  self.simple_slug_options = options.reverse_merge(
12
12
  slug_column: SimpleSlug.slug_column,
13
13
  slug_method: args,
14
+ slug_regexp: SimpleSlug.slug_regexp,
14
15
  max_length: SimpleSlug.max_length,
15
16
  callback_type: SimpleSlug.callback_type,
16
17
  add_validation: SimpleSlug.add_validation
@@ -22,10 +23,12 @@ module SimpleSlug
22
23
  send(simple_slug_options[:callback_type], :simple_slug_generate, if: :should_generate_new_slug?) if simple_slug_options[:callback_type]
23
24
 
24
25
  if simple_slug_options[:add_validation]
25
- validates simple_slug_options[:slug_column],
26
- presence: true,
27
- exclusion: {in: SimpleSlug.excludes},
28
- format: {without: SimpleSlug.exclude_regexp}
26
+ simple_slug_locales.each do |locale|
27
+ validates simple_slug_column(locale),
28
+ presence: true,
29
+ exclusion: {in: SimpleSlug.excludes},
30
+ format: {with: simple_slug_options[:slug_regexp]}
31
+ end
29
32
  end
30
33
 
31
34
  if simple_slug_options[:history]
@@ -43,11 +46,32 @@ module SimpleSlug
43
46
  find(id_param)
44
47
  else
45
48
  finder_method = simple_slug_options[:history] ? :find_by : :find_by!
46
- send(finder_method, simple_slug_options[:slug_column] => id_param) or find(::SimpleSlug::HistorySlug.find_by!(slug: id_param).sluggable_id)
49
+ send(finder_method, simple_slug_column => id_param) or find(::SimpleSlug::HistorySlug.find_by!(slug: id_param).sluggable_id)
47
50
  end
48
51
  end
49
52
 
50
53
  alias_method :friendly_find, :simple_slug_find
54
+
55
+ def simple_slug_column(locale=I18n.locale)
56
+ if simple_slug_localized?(locale)
57
+ [simple_slug_options[:slug_column], locale].compact.join('_')
58
+ else
59
+ simple_slug_options[:slug_column]
60
+ end
61
+ end
62
+
63
+ def simple_slug_columns
64
+ simple_slug_locales.map{|locale| simple_slug_column(locale) }
65
+ end
66
+
67
+ def simple_slug_locales
68
+ Array(simple_slug_options[:locales] || [nil])
69
+ end
70
+
71
+ def simple_slug_localized?(locale=I18n.locale)
72
+ return unless locale
73
+ simple_slug_locales.include?(locale.to_sym)
74
+ end
51
75
  end
52
76
 
53
77
  module InstanceMethods
@@ -67,7 +91,7 @@ module SimpleSlug
67
91
  end
68
92
  end
69
93
 
70
- def simple_slug_generate_for_locale(locale=nil, force=false)
94
+ def simple_slug_generate_for_locale(locale=I18n.locale, force=false)
71
95
  simple_slug_with_locale(locale) do
72
96
  simple_slug = simple_slug_normalize(simple_slug_base)
73
97
  simple_slug = simple_slug.first(simple_slug_options[:max_length]) if simple_slug_options[:max_length]
@@ -87,14 +111,6 @@ module SimpleSlug
87
111
  end
88
112
  end
89
113
 
90
- def simple_slug_generate_(force=false, locale=nil)
91
- simple_slug = simple_slug_normalize(simple_slug_base)
92
- simple_slug = simple_slug.first(simple_slug_options[:max_length]) if simple_slug_options[:max_length]
93
- return true if !force && simple_slug == simple_slug_get(locale).to_s.sub(/--\d+\z/, '')
94
- resolved_simple_slug = simple_slug_resolve(simple_slug, locale)
95
- simple_slug_set(resolved_simple_slug, locale)
96
- end
97
-
98
114
  def simple_slug_base
99
115
  simple_slug_options[:slug_method].map{|m| send(m).to_s }.reject(&:blank?).join(' ')
100
116
  end
@@ -106,7 +122,7 @@ module SimpleSlug
106
122
  normalized.to_s =~ SimpleSlug::STARTS_WITH_NUMBER_REGEXP ? "_#{normalized}" : normalized
107
123
  end
108
124
 
109
- def simple_slug_resolve(slug_value, locale=nil)
125
+ def simple_slug_resolve(slug_value, locale=I18n.locale)
110
126
  if simple_slug_exists?(slug_value, locale)
111
127
  loop do
112
128
  slug_value_with_suffix = simple_slug_next(slug_value)
@@ -121,12 +137,12 @@ module SimpleSlug
121
137
  "#{slug_value}--#{rand(99999)}"
122
138
  end
123
139
 
124
- def simple_slug_exists?(slug_value, locale=nil)
140
+ def simple_slug_exists?(slug_value, locale=I18n.locale)
125
141
  simple_slug_base_exists?(slug_value, locale) || simple_slug_history_exists?(slug_value)
126
142
  end
127
143
 
128
- def simple_slug_base_exists?(slug_value, locale=nil)
129
- base_scope = self.class.unscoped.where(simple_slug_column(locale) => slug_value)
144
+ def simple_slug_base_exists?(slug_value, locale=I18n.locale)
145
+ base_scope = self.class.unscoped.where(self.class.simple_slug_column(locale) => slug_value)
130
146
  base_scope = base_scope.where('id != ?', id) if persisted?
131
147
  base_scope.exists?
132
148
  end
@@ -138,20 +154,16 @@ module SimpleSlug
138
154
  base_scope.exists?
139
155
  end
140
156
 
141
- def simple_slug_set(value, locale=nil)
142
- send "#{simple_slug_column(locale)}=", value
143
- end
144
-
145
- def simple_slug_get(locale=nil)
146
- send simple_slug_column(locale)
157
+ def simple_slug_set(value, locale=I18n.locale)
158
+ send "#{self.class.simple_slug_column(locale)}=", value
147
159
  end
148
160
 
149
- def simple_slug_stored_slug(locale=nil)
150
- send("#{simple_slug_column(locale)}_was")
161
+ def simple_slug_get(locale=I18n.locale)
162
+ send self.class.simple_slug_column(locale)
151
163
  end
152
164
 
153
- def simple_slug_column(locale=nil)
154
- [simple_slug_options[:slug_column], locale].compact.join('_')
165
+ def simple_slug_stored_slug(locale=I18n.locale)
166
+ send("#{self.class.simple_slug_column(locale)}_was")
155
167
  end
156
168
  end
157
169
 
@@ -167,9 +179,8 @@ module SimpleSlug
167
179
 
168
180
  def simple_slug_create_history_slug
169
181
  return true unless slug_changed?
170
- ::SimpleSlug::HistorySlug.where(sluggable_type: self.class.name, sluggable_id: id, slug: simple_slug_get).first_or_create
182
+ ::SimpleSlug::HistorySlug.where(sluggable_type: self.class.name, slug: simple_slug_get).first_or_create{|hs| hs.sluggable_id = id }
171
183
  end
172
184
  end
173
-
174
185
  end
175
186
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleSlug
2
- VERSION = '0.3.3'
2
+ VERSION = '0.3.4'
3
3
  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.1'
21
+ spec.add_dependency 'activerecord', '>= 4.0.0', '< 5.2'
22
22
  spec.add_dependency 'i18n', '~> 0.7'
23
23
 
24
24
  spec.add_development_dependency 'bundler', '~> 1.5'
@@ -10,10 +10,6 @@ describe SimpleSlug do
10
10
  expect(SimpleSlug.excludes).to include('new', 'edit')
11
11
  end
12
12
 
13
- it 'exclude regexps' do
14
- expect( SimpleSlug.exclude_regexp).to eq /\A\d+\z/
15
- end
16
-
17
13
  it 'max length' do
18
14
  expect( SimpleSlug.max_length).to eq 240
19
15
  end
@@ -12,7 +12,7 @@ describe 'slug history' do
12
12
 
13
13
  it 'create' do
14
14
  relation = double
15
- expect(::SimpleSlug::HistorySlug).to receive(:where).once.ordered.with(sluggable_type: 'SlugHistoryRspecModel', sluggable_id: 1, slug: 'hello').and_return(relation)
15
+ expect(::SimpleSlug::HistorySlug).to receive(:where).once.ordered.with(sluggable_type: 'SlugHistoryRspecModel', slug: 'hello').and_return(relation)
16
16
  expect(relation).to receive(:first_or_create)
17
17
  SlugHistoryRspecModel.create(id: 1, name: 'Hello')
18
18
  end
@@ -41,6 +41,14 @@ describe SimpleSlug::ModelAddition do
41
41
  expect(SlugGenerationRspecModel.new(name: '123')).not_to be_valid
42
42
  end
43
43
 
44
+ it 'skip spaces' do
45
+ expect(SlugGenerationRspecModel.new(slug: 'test test')).not_to be_valid
46
+ end
47
+
48
+ it 'skip punctuation' do
49
+ expect(SlugGenerationRspecModel.new(slug: 'test.test')).not_to be_valid
50
+ end
51
+
44
52
  it 'skip slug generation' do
45
53
  allow_any_instance_of(SlugGenerationRspecModel).to receive(:should_generate_new_slug?).and_return(false)
46
54
  expect(SlugGenerationRspecModel.create(name: 'Hello').slug).to be_blank
@@ -147,5 +155,33 @@ describe SimpleSlug::ModelAddition do
147
155
  expect(record.slug).to eq 'hello'
148
156
  expect(record.slug_en).to eq 'hello-en'
149
157
  end
158
+
159
+ describe '#to_param' do
160
+ it 'generate not localized for default locale' do
161
+ record = SlugGenerationRspecModelLocalized.create(name: 'Hello', name_en: 'Hello en')
162
+ expect(record.to_param).to eq 'hello'
163
+ end
164
+
165
+ it 'generate localized' do
166
+ record = SlugGenerationRspecModelLocalized.create(name: 'Hello', name_en: 'Hello en')
167
+ I18n.with_locale(:en) do
168
+ expect(record.to_param).to eq 'hello-en'
169
+ end
170
+ end
171
+ end
172
+
173
+ describe '#simple_slug_find' do
174
+ it 'use default slug column with default locale' do
175
+ record = SlugGenerationRspecModelLocalized.create(name: 'Hello', name_en: 'Hello en')
176
+ expect(SlugGenerationRspecModelLocalized).to receive(:find_by!).with('slug' => 'hello').and_return(record)
177
+ SlugGenerationRspecModelLocalized.simple_slug_find('hello')
178
+ end
179
+
180
+ it 'use localized slug column' do
181
+ record = SlugGenerationRspecModelLocalized.create(name: 'Hello', name_en: 'Hello en')
182
+ expect(SlugGenerationRspecModelLocalized).to receive(:find_by!).with('slug_en' => 'hello-en').and_return(record)
183
+ I18n.with_locale(:en) { SlugGenerationRspecModelLocalized.simple_slug_find('hello-en') }
184
+ end
185
+ end
150
186
  end
151
187
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'active_record'
2
2
  require 'i18n'
3
3
  require 'active_support/core_ext'
4
+ require 'byebug'
4
5
  require 'simple_slug'
5
6
 
6
7
  # just silence warning
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.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Leschenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-29 00:00:00.000000000 Z
11
+ date: 2017-05-27 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.1'
22
+ version: '5.2'
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.1'
32
+ version: '5.2'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: i18n
35
35
  requirement: !ruby/object:Gem::Requirement