sluggi 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96fa3f419d83aa9dd9df2699072fc12c8c3e786b45fcf8d19fe7adca90fd5438
4
- data.tar.gz: 853a52b8ff87cb5833a56ca6d889f2cecce7d56763e6d5c9fed2b1a91a806368
3
+ metadata.gz: 183a80354c5c2961a06f2bfb30c00d2ba041475c66903307b6b3ceb365796cbe
4
+ data.tar.gz: 215ba9fbe8b604f934c71e5c8114d31e03f143d97dcee1a34424c13151ced084
5
5
  SHA512:
6
- metadata.gz: 4f135200b99655e4437f10e077355f84bdcbe5b474eb72148644a0b9b72fc43a3d3da38f78b6f45951a98fc41bbdf36d60a6b711c93767763ac4cf91937ad423
7
- data.tar.gz: edd20ee1f9d8d63c3e3d6a21e1d51fb229b5bf35510d2b53b6029cdbbc2eedbfcc35cd4d70a25a701db9cdfbf0cd71256602af5d540af54eef5dcfd7944a0f99
6
+ metadata.gz: 157a8f7ff7f2cba47c84741db578733a5ca1a61474f8a1e9d50b4a42ed9ee2a718fb15b0dcab90a53887bca51fcfe567b599d40a9371d703bab565217f754782
7
+ data.tar.gz: 6d673e52d9bd68df5d4413e8eb64bf7d8c90db80cec5fe011802ff209efee0b685a56710d25996a48e2b6698955f89397421f69f0da5d0bfe1ed1a4f7e80ffe8
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # Sluggi
2
2
 
3
- [![Gem Version](http://img.shields.io/gem/v/sluggi.svg)](http://rubygems.org/gems/sluggi)
4
- [![Build Status](http://img.shields.io/travis/neighborland/sluggi.svg)](https://travis-ci.org/neighborland/sluggi)
3
+ [![Gem Version](https://img.shields.io/gem/v/sluggi.svg)](https://rubygems.org/gems/sluggi)
4
+ [![Build Status](https://github.com/neighborland/sluggi/actions/workflows/ruby.yml/badge.svg)](https://github.com/neighborland/sluggi/actions/workflows/ruby.yml)
5
5
 
6
- Sluggi is a simple [friendly_id](https://github.com/norman/friendly_id)-inspired slugging library for ActiveRecord models.
6
+ Sluggi is a simple [friendly_id](https://github.com/norman/friendly_id)-inspired slugging library for ActiveRecord models. It is faster than `friendly_id` (see below for benchmarks).
7
7
 
8
8
  It provides basic slugs, slug history, and the ability to define multiple slug candidates.
9
9
 
@@ -129,20 +129,23 @@ Cat.find_by_slug('tuxedo-stan')
129
129
 
130
130
  ### Model with Slug Candidates
131
131
 
132
- Override `#slug_candidates` to define cascading candidate values for slugs. This is useful to avoid
133
- uniqueness conflicts.
132
+ Override `#slug_candidates` to define cascading candidate values for slugs.
133
+ This is useful to avoid uniqueness conflicts. Do not override `#slug_value` -
134
+ the default implementation in `Model` will call `#slug_candidates` and
135
+ works with or without `History`.
134
136
 
135
137
  ```ruby
136
138
  class Cat < ActiveRecord::Base
137
139
  include Sluggi::Slugged
138
140
 
139
- def name_and_id
140
- "#{name}-#{id}"
141
- end
142
-
143
- # the first unused value in the list is used
141
+ # The first unused value in the list is used.
142
+ # Each item may be a value or a lambda.
143
+ # Use a lambda to defer expensive unique value calculations.
144
144
  def slug_candidates
145
- [name, name_and_id]
145
+ [
146
+ name,
147
+ -> { "#{name}-#{Cat.count}" }
148
+ ]
146
149
  end
147
150
 
148
151
  def slug_value_changed?
@@ -158,11 +161,41 @@ cat.slug
158
161
 
159
162
  cat_2 = Cat.create(name: 'Tuxedo Stan')
160
163
  cat_2.slug
161
- => 'tuxedo-stan-2'
162
- cat_2.id
163
- => 2
164
+ => 'tuxedo-stan-456'
165
+ ```
166
+
167
+ ## Performance
168
+
169
+ Run the benchmark script: `ruby bench.rb`. This script is based on the
170
+ benchmark script from `friendly_id`.
171
+
172
+ Here are some anecdotal results using ruby 2.5.3:
164
173
 
165
174
  ```
175
+ SLUGGI FRIENDLY_ID
176
+ 1) find (id) - direct ActiveRecord 0.092318 0.093049
177
+ 2) find (in-table slug) 0.102773 0.259542
178
+ 3) find (in-table slug; using finders module) 0.098183 0.108248
179
+ 4) find (external slug) 0.670229 0.832791
180
+ 5) insert (plain AR / no slug) 0.345077 0.345105
181
+ 6) insert (in-table-slug) 0.666451 0.815505
182
+ 7) insert (in-table-slug; using finders module) 0.668737 0.744433
183
+ 8) insert (external slug) 2.480790 2.849761
184
+ ```
185
+
186
+ Notes:
187
+
188
+ Sluggi is at least 10% faster in every benchmark.
189
+
190
+ 1) Baseline (does not use either gem)
191
+ 2) 0.44x
192
+ 3) 0.90x
193
+ 4) 0.80x
194
+ 5) Baseline (does not use either gem)
195
+ 6) 0.82x
196
+ 7) 0.90x
197
+ 8) 0.87x
198
+
166
199
 
167
200
  ## Alternatives
168
201
 
@@ -39,11 +39,10 @@ module Sluggi
39
39
  end
40
40
 
41
41
  def create_slug
42
- value = clean_slug(slug_value)
43
- return if value.blank?
44
- return if slugs.first&.slug == value
45
- self.class.find_slugs(value).delete_all # revert to previous slug & put first
46
- slugs.create(slug: value)
42
+ return if slug.blank?
43
+ return if slugs.first&.slug == slug
44
+ self.class.find_slugs(slug).delete_all # revert to previous slug & put first
45
+ slugs.create(slug: slug)
47
46
  end
48
47
  end
49
48
  end
data/lib/sluggi/model.rb CHANGED
@@ -11,6 +11,13 @@ module Sluggi
11
11
  before_validation :set_slug
12
12
  end
13
13
 
14
+ module ClassMethods
15
+ # Define this so that History can override it.
16
+ def slug_exists?(name)
17
+ exists?(slug: name)
18
+ end
19
+ end
20
+
14
21
  def to_param
15
22
  errors.any? ? slug_was : slug
16
23
  end
@@ -31,11 +38,12 @@ module Sluggi
31
38
  # these are generally good to override:
32
39
 
33
40
  def slug_value
34
- slug_candidates.each do |value|
41
+ slug_candidates.each do |item|
42
+ value = item.respond_to?(:call) ? item.call : item
35
43
  next if value.blank?
36
44
  candidate = clean_slug(value)
37
45
  return candidate if candidate == slug
38
- return candidate unless self.class.exists?(slug: candidate)
46
+ return candidate unless self.class.slug_exists?(candidate)
39
47
  end
40
48
  nil
41
49
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sluggi
4
- VERSION = "1.2.0"
4
+ VERSION = "2.0.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sluggi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tee Parham
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-21 00:00:00.000000000 Z
11
+ date: 2024-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.1'
19
+ version: '6.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.1'
26
+ version: '6.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: railties
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '5.1'
33
+ version: '6.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '5.1'
40
+ version: '6.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: appraisal
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -52,20 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.22'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.22'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '12.0'
75
+ version: '13.0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '12.0'
82
+ version: '13.0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: sqlite3
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -104,7 +118,7 @@ homepage: https://github.com/neighborland/sluggi
104
118
  licenses:
105
119
  - MIT
106
120
  metadata: {}
107
- post_install_message:
121
+ post_install_message:
108
122
  rdoc_options: []
109
123
  require_paths:
110
124
  - lib
@@ -112,16 +126,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
126
  requirements:
113
127
  - - ">="
114
128
  - !ruby/object:Gem::Version
115
- version: 2.3.0
129
+ version: 3.0.0
116
130
  required_rubygems_version: !ruby/object:Gem::Requirement
117
131
  requirements:
118
132
  - - ">="
119
133
  - !ruby/object:Gem::Version
120
134
  version: '0'
121
135
  requirements: []
122
- rubyforge_project:
123
- rubygems_version: 2.7.8
124
- signing_key:
136
+ rubygems_version: 3.5.23
137
+ signing_key:
125
138
  specification_version: 4
126
139
  summary: Rails Slug Generator
127
140
  test_files: []