simple_slugs 0.0.4 → 0.0.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.
- metadata +6 -10
- data/lib/simple_slugs.rb +0 -15
- data/lib/simple_slugs/act_macro.rb +0 -12
- data/lib/simple_slugs/slug.rb +0 -28
- data/lib/simple_slugs/slugger.rb +0 -68
- data/lib/simple_slugs/version.rb +0 -3
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_slugs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 5
|
10
|
+
version: 0.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sven Fuchs
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-31 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -124,12 +124,8 @@ extensions: []
|
|
124
124
|
|
125
125
|
extra_rdoc_files: []
|
126
126
|
|
127
|
-
files:
|
128
|
-
|
129
|
-
- lib/simple_slugs/act_macro.rb
|
130
|
-
- lib/simple_slugs/slug.rb
|
131
|
-
- lib/simple_slugs/slugger.rb
|
132
|
-
- lib/simple_slugs/version.rb
|
127
|
+
files: []
|
128
|
+
|
133
129
|
has_rdoc: true
|
134
130
|
homepage: http://github.com/svenfuchs/simple_slugs
|
135
131
|
licenses: []
|
data/lib/simple_slugs.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
|
3
|
-
module SimpleSlugs
|
4
|
-
autoload :Slug, 'simple_slugs/slug'
|
5
|
-
autoload :Slugger, 'simple_slugs/slugger'
|
6
|
-
autoload :ActMacro, 'simple_slugs/act_macro'
|
7
|
-
end
|
8
|
-
|
9
|
-
class String
|
10
|
-
def to_slug
|
11
|
-
SimpleSlugs::Slug.new(self)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
ActiveRecord::Base.extend(SimpleSlugs::ActMacro)
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module SimpleSlugs
|
2
|
-
module ActMacro
|
3
|
-
def has_slug(options = {})
|
4
|
-
return if respond_to?(:slugger)
|
5
|
-
|
6
|
-
before_validation lambda { |record| record.slugger.unique_slug!(record) }
|
7
|
-
|
8
|
-
class_inheritable_accessor :slugger
|
9
|
-
self.slugger = Slugger.new(self, options)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
data/lib/simple_slugs/slug.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
module SimpleSlugs
|
2
|
-
class Slug < String
|
3
|
-
def initialize(string)
|
4
|
-
super
|
5
|
-
normalize
|
6
|
-
end
|
7
|
-
|
8
|
-
def normalize
|
9
|
-
transliterate
|
10
|
-
spacify
|
11
|
-
strip!
|
12
|
-
downcase!
|
13
|
-
dasherize
|
14
|
-
end
|
15
|
-
|
16
|
-
def transliterate
|
17
|
-
replace(I18n.transliterate(self))
|
18
|
-
end
|
19
|
-
|
20
|
-
def spacify
|
21
|
-
gsub!(/[\W_]/, ' ')
|
22
|
-
end
|
23
|
-
|
24
|
-
def dasherize
|
25
|
-
gsub!(' ', '-')
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/lib/simple_slugs/slugger.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
require 'active_support/ordered_options'
|
2
|
-
require 'active_support/core_ext/hash/reverse_merge'
|
3
|
-
|
4
|
-
module SimpleSlugs
|
5
|
-
class Slugger < ActiveSupport::InheritableOptions
|
6
|
-
DEFAULTS = {
|
7
|
-
:slug_name => :slug,
|
8
|
-
:on_blank => true,
|
9
|
-
:scope => nil,
|
10
|
-
:separator => '-'
|
11
|
-
}
|
12
|
-
|
13
|
-
attr_reader :model
|
14
|
-
|
15
|
-
def initialize(model, options)
|
16
|
-
@model = model
|
17
|
-
super(options.reverse_merge(DEFAULTS))
|
18
|
-
end
|
19
|
-
|
20
|
-
def unique_slug!(record)
|
21
|
-
if record.send(slug_name).blank? || !on_blank
|
22
|
-
source = record.send(self.source)
|
23
|
-
record.slug = ensure_unique_slug(record, source.to_slug) if source
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
protected
|
28
|
-
|
29
|
-
def ensure_unique_slug(record, base)
|
30
|
-
slug, taken, n = base, self.taken_slugs(record, base), 0
|
31
|
-
slug = [base, separator, n += 1].join while taken.include?(slug)
|
32
|
-
slug
|
33
|
-
end
|
34
|
-
|
35
|
-
def taken_slugs(record, slug)
|
36
|
-
scope = translated? ? with_translated_slug(record, slug) : with_slug(record, slug)
|
37
|
-
scope.map(&:slug)
|
38
|
-
end
|
39
|
-
|
40
|
-
def slug_scope(record)
|
41
|
-
scope ? model.where(scope => record.send(scope)) : model.scoped
|
42
|
-
end
|
43
|
-
|
44
|
-
def with_slug(record, slug)
|
45
|
-
condition = model.arel_table[:slug].matches("#{slug}%")
|
46
|
-
slug_scope(record).where(condition)
|
47
|
-
end
|
48
|
-
|
49
|
-
def with_translated_slug(record, slug)
|
50
|
-
condition = model.translation_class.arel_table[:slug].matches("#{slug}%")
|
51
|
-
slug_scope(record) & model.with_translations.where(condition)
|
52
|
-
end
|
53
|
-
|
54
|
-
def source
|
55
|
-
@source ||= self[:source] || %w(name title).detect { |s| column_names.include?(s) }
|
56
|
-
end
|
57
|
-
|
58
|
-
def column_names
|
59
|
-
names = model.column_names
|
60
|
-
names = names + model.translation_class.column_names if model.respond_to?(:translation_class)
|
61
|
-
names
|
62
|
-
end
|
63
|
-
|
64
|
-
def translated?
|
65
|
-
model.respond_to?(:translated?) ? model.translated?(:slug) : false
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
data/lib/simple_slugs/version.rb
DELETED