slugable 0.0.4 → 1.0.0
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 +7 -0
- data/.gitignore +2 -1
- data/.rvmrc +1 -0
- data/.travis.yml +26 -0
- data/Appraisals +24 -0
- data/README.md +152 -80
- data/Rakefile +14 -1
- data/changelog.md +50 -0
- data/db/schema.rb +22 -15
- data/gemfiles/activerecord_3.2.gemfile +9 -0
- data/gemfiles/activerecord_4.0.gemfile +8 -0
- data/gemfiles/activerecord_4.1.gemfile +8 -0
- data/gemfiles/activerecord_4.2.gemfile +8 -0
- data/lib/slugable.rb +10 -6
- data/lib/slugable/cache_layer.rb +24 -0
- data/lib/slugable/formatter/parameterize.rb +9 -0
- data/lib/slugable/has_slug.rb +99 -168
- data/lib/slugable/railtie.rb +1 -1
- data/lib/slugable/slug_builder/caching_tree_ancestry.rb +16 -0
- data/lib/slugable/slug_builder/flat.rb +24 -0
- data/lib/slugable/slug_builder/tree_ancestry.rb +28 -0
- data/lib/slugable/version.rb +1 -1
- data/slugable.gemspec +14 -12
- data/spec/slugable/cache_layer_spec.rb +35 -0
- data/spec/slugable/has_slug_spec.rb +136 -199
- data/spec/slugable/slugable_builder/caching_tree_ancestry_spec.rb +38 -0
- data/spec/slugable/slugable_builder/flat_spec.rb +42 -0
- data/spec/slugable/slugable_builder/tree_ancestry_spec.rb +55 -0
- data/spec/spec_helper.rb +25 -5
- data/spec/support/hash_cache_storage.rb +27 -0
- data/spec/support/set_up_models.rb +27 -0
- data/spec/support/simple_to_slug.rb +13 -0
- metadata +108 -64
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/set_up_models'
|
3
|
+
|
4
|
+
describe Slugable::SlugBuilder::CachingTreeAncestry do
|
5
|
+
let(:cache) { double(:cache) }
|
6
|
+
|
7
|
+
subject {
|
8
|
+
Slugable::SlugBuilder::CachingTreeAncestry.new(
|
9
|
+
slug_column: :slug,
|
10
|
+
formatter: lambda { |string| "#{string}-formatted" },
|
11
|
+
cache: cache,
|
12
|
+
)
|
13
|
+
}
|
14
|
+
|
15
|
+
let(:model) { TreeCategory }
|
16
|
+
|
17
|
+
describe '#to_slug' do
|
18
|
+
it 'returns array of slugs column from record path that are loaded from cache' do
|
19
|
+
root = model.create!(slug: 'root')
|
20
|
+
child = model.create!(slug: 'child', parent: root)
|
21
|
+
|
22
|
+
allow(cache).to receive(:read_slug).with(:slug, root.id).and_return('root-cached')
|
23
|
+
allow(cache).to receive(:read_slug).with(:slug, child.id).and_return('child-cached')
|
24
|
+
|
25
|
+
expect(subject.to_slug(child)).to eq ['root-cached', 'child-cached']
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'removes blank values from array of record path' do
|
29
|
+
root = model.create!(slug: 'root')
|
30
|
+
child = model.create!(slug: 'child', parent: root)
|
31
|
+
|
32
|
+
allow(cache).to receive(:read_slug).with(:slug, root.id).and_return('')
|
33
|
+
allow(cache).to receive(:read_slug).with(:slug, child.id).and_return(nil)
|
34
|
+
|
35
|
+
expect(subject.to_slug(child)).to eq []
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/set_up_models'
|
3
|
+
|
4
|
+
describe Slugable::SlugBuilder::Flat do
|
5
|
+
subject {
|
6
|
+
Slugable::SlugBuilder::Flat.new(
|
7
|
+
slug_column: :slug,
|
8
|
+
formatter: lambda { |string| "#{string}-formatted" }
|
9
|
+
)
|
10
|
+
}
|
11
|
+
|
12
|
+
let(:model) { FlatItem }
|
13
|
+
|
14
|
+
describe '#to_slug' do
|
15
|
+
it 'returns value from record column' do
|
16
|
+
record = model.new(slug: 'value')
|
17
|
+
expect(subject.to_slug(record)).to eq 'value'
|
18
|
+
|
19
|
+
record = model.create!(slug: 'value')
|
20
|
+
expect(subject.to_slug(record)).to eq 'value'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#to_slug_was' do
|
25
|
+
it 'returns old value from record'do
|
26
|
+
record = model.create!(slug: 'value')
|
27
|
+
record.slug = 'new-value'
|
28
|
+
expect(subject.to_slug_was(record)).to eq 'value'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#to_slug_will' do
|
33
|
+
it 'returns future value of record' do
|
34
|
+
record = model.new(slug: 'value')
|
35
|
+
expect(subject.to_slug_will(record)).to eq 'value-formatted'
|
36
|
+
|
37
|
+
record = model.create!(slug: 'value')
|
38
|
+
record.slug = 'new-value'
|
39
|
+
expect(subject.to_slug_will(record)).to eq 'new-value-formatted'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/set_up_models'
|
3
|
+
|
4
|
+
describe Slugable::SlugBuilder::TreeAncestry do
|
5
|
+
subject {
|
6
|
+
Slugable::SlugBuilder::TreeAncestry.new(
|
7
|
+
slug_column: :slug,
|
8
|
+
formatter: lambda { |string| "#{string}-formatted" }
|
9
|
+
)
|
10
|
+
}
|
11
|
+
|
12
|
+
let(:model) { TreeCategory }
|
13
|
+
|
14
|
+
describe '#to_slug' do
|
15
|
+
it 'returns array of slugs column from record path' do
|
16
|
+
root = model.create!(slug: 'root')
|
17
|
+
child = model.create!(slug: 'child', parent: root)
|
18
|
+
expect(subject.to_slug(child)).to eq ['root', 'child']
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'removes blank values from array of record path' do
|
22
|
+
child = model.new(slug: '')
|
23
|
+
expect(subject.to_slug(child)).to eq []
|
24
|
+
|
25
|
+
child = model.new(slug: nil)
|
26
|
+
expect(subject.to_slug(child)).to eq []
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#to_slug_was' do
|
31
|
+
it 'returns old value of slug using old ancestry and slug_was from record' do
|
32
|
+
root = model.create!(slug: 'root')
|
33
|
+
child = model.create!(slug: 'child', parent: root)
|
34
|
+
|
35
|
+
new_root = model.create!(slug: 'new-root')
|
36
|
+
child.parent = new_root
|
37
|
+
child.slug = 'new-child'
|
38
|
+
|
39
|
+
expect(subject.to_slug_was(child)).to eq ['root', 'child']
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#to_slug_will' do
|
44
|
+
it 'returns future value of slugs in record path' do
|
45
|
+
root = model.create!(slug: 'root')
|
46
|
+
child = model.create!(slug: 'child', parent: root)
|
47
|
+
|
48
|
+
new_root = model.create!(slug: 'new-root')
|
49
|
+
child.parent = new_root
|
50
|
+
child.slug = 'new-child'
|
51
|
+
|
52
|
+
expect(subject.to_slug_will(child)).to eq ['new-root', 'new-child-formatted']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,32 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
|
1
|
+
if ENV['COVERAGE'] == '1'
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start do
|
4
|
+
load_profile 'test_frameworks'
|
5
|
+
add_group 'Libraries", "lib'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
if ENV['CI'] == 'true' && ENV['TRAVIS_RUBY_VERSION'] == '2.2.2' && ENV['BUNDLE_GEMFILE'] =~ /activerecord_4\.2/
|
10
|
+
require 'codeclimate-test-reporter'
|
11
|
+
CodeClimate::TestReporter.start
|
12
|
+
end
|
4
13
|
|
5
|
-
|
14
|
+
require 'slugable'
|
15
|
+
require 'sqlite3'
|
16
|
+
require 'ancestry'
|
17
|
+
require 'pry'
|
6
18
|
|
7
|
-
|
19
|
+
ActiveRecord::Base.send :extend, Slugable::HasSlug
|
20
|
+
|
21
|
+
ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
|
22
|
+
|
23
|
+
load 'db/schema.rb'
|
8
24
|
|
9
25
|
RSpec.configure do |config|
|
26
|
+
config.filter_run focus: true
|
27
|
+
config.filter_run_excluding skip: true
|
28
|
+
config.run_all_when_everything_filtered = true
|
29
|
+
|
10
30
|
config.around do |example|
|
11
31
|
ActiveRecord::Base.transaction do
|
12
32
|
example.run
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class HashCacheStorage
|
2
|
+
attr_reader :store
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@store = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def fetch(key, options = nil, &block)
|
9
|
+
store.fetch(key) {
|
10
|
+
value = block.call
|
11
|
+
store[key] = value
|
12
|
+
value
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def clear(options = nil)
|
17
|
+
@store = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def read(key, options = nil)
|
21
|
+
store[key]
|
22
|
+
end
|
23
|
+
|
24
|
+
def write(key, value, options = nil)
|
25
|
+
store[key] = value
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'support/simple_to_slug'
|
2
|
+
|
3
|
+
class FlatItem < ActiveRecord::Base
|
4
|
+
has_slug
|
5
|
+
end
|
6
|
+
|
7
|
+
class FlatPage < ActiveRecord::Base
|
8
|
+
has_slug from: :title, to: :seo_url
|
9
|
+
end
|
10
|
+
|
11
|
+
class TreeCategory < ActiveRecord::Base
|
12
|
+
has_ancestry
|
13
|
+
has_slug tree_cache_storage: nil
|
14
|
+
end
|
15
|
+
|
16
|
+
class TreeItem < ActiveRecord::Base
|
17
|
+
has_ancestry
|
18
|
+
has_slug tree_cache_storage: Slugable.configuration.tree_cache_storage
|
19
|
+
end
|
20
|
+
|
21
|
+
class FlatProduct < ActiveRecord::Base
|
22
|
+
has_slug formatter: lambda { |string| 'hello-all-the-time' }
|
23
|
+
end
|
24
|
+
|
25
|
+
class FlatNews < ActiveRecord::Base
|
26
|
+
has_slug to_slug_builder: SimpleToSlug.new
|
27
|
+
end
|
metadata
CHANGED
@@ -1,128 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slugable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Miroslav Hettes
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2015-11-22 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activerecord
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '3.0'
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
20
|
+
- - "<"
|
28
21
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: activesupport
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ! '>='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '3.0'
|
22
|
+
version: '5.0'
|
38
23
|
type: :runtime
|
39
24
|
prerelease: false
|
40
25
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
26
|
requirements:
|
43
|
-
- -
|
27
|
+
- - ">="
|
44
28
|
- !ruby/object:Gem::Version
|
45
29
|
version: '3.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.0'
|
46
33
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
34
|
+
name: appraisal
|
48
35
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
36
|
requirements:
|
51
|
-
- - ~>
|
37
|
+
- - "~>"
|
52
38
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
54
|
-
type: :
|
39
|
+
version: 2.1.0
|
40
|
+
type: :development
|
55
41
|
prerelease: false
|
56
42
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
43
|
requirements:
|
59
|
-
- - ~>
|
44
|
+
- - "~>"
|
60
45
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
46
|
+
version: 2.1.0
|
62
47
|
- !ruby/object:Gem::Dependency
|
63
48
|
name: rspec
|
64
49
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
50
|
requirements:
|
67
|
-
- - ~>
|
51
|
+
- - "~>"
|
68
52
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
53
|
+
version: 3.4.0
|
70
54
|
type: :development
|
71
55
|
prerelease: false
|
72
56
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
57
|
requirements:
|
75
|
-
- - ~>
|
58
|
+
- - "~>"
|
76
59
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
60
|
+
version: 3.4.0
|
78
61
|
- !ruby/object:Gem::Dependency
|
79
62
|
name: rake
|
80
63
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
64
|
requirements:
|
83
|
-
- - ~>
|
65
|
+
- - "~>"
|
84
66
|
- !ruby/object:Gem::Version
|
85
67
|
version: 0.9.2.2
|
86
68
|
type: :development
|
87
69
|
prerelease: false
|
88
70
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
71
|
requirements:
|
91
|
-
- - ~>
|
72
|
+
- - "~>"
|
92
73
|
- !ruby/object:Gem::Version
|
93
74
|
version: 0.9.2.2
|
94
75
|
- !ruby/object:Gem::Dependency
|
95
76
|
name: sqlite3
|
96
77
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
78
|
requirements:
|
99
|
-
- - ~>
|
79
|
+
- - "~>"
|
100
80
|
- !ruby/object:Gem::Version
|
101
|
-
version: 1.3.
|
81
|
+
version: 1.3.11
|
102
82
|
type: :development
|
103
83
|
prerelease: false
|
104
84
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
85
|
requirements:
|
107
|
-
- - ~>
|
86
|
+
- - "~>"
|
108
87
|
- !ruby/object:Gem::Version
|
109
|
-
version: 1.3.
|
88
|
+
version: 1.3.11
|
110
89
|
- !ruby/object:Gem::Dependency
|
111
90
|
name: ancestry
|
112
91
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
92
|
requirements:
|
115
|
-
- -
|
93
|
+
- - ">="
|
116
94
|
- !ruby/object:Gem::Version
|
117
95
|
version: 1.3.0
|
96
|
+
- - "<"
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '3.0'
|
118
99
|
type: :development
|
119
100
|
prerelease: false
|
120
101
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
102
|
requirements:
|
123
|
-
- -
|
103
|
+
- - ">="
|
124
104
|
- !ruby/object:Gem::Version
|
125
105
|
version: 1.3.0
|
106
|
+
- - "<"
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '3.0'
|
109
|
+
- !ruby/object:Gem::Dependency
|
110
|
+
name: pry
|
111
|
+
requirement: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
type: :development
|
117
|
+
prerelease: false
|
118
|
+
version_requirements: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: simplecov
|
125
|
+
requirement: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
type: :development
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: codeclimate-test-reporter
|
139
|
+
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
type: :development
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - ">="
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '0'
|
126
151
|
description: Add dsl method for automatic storing seo friendly url in database column
|
127
152
|
email:
|
128
153
|
- hettes@webynamieru.sk
|
@@ -130,51 +155,70 @@ executables: []
|
|
130
155
|
extensions: []
|
131
156
|
extra_rdoc_files: []
|
132
157
|
files:
|
133
|
-
- .gitignore
|
134
|
-
- .rspec
|
158
|
+
- ".gitignore"
|
159
|
+
- ".rspec"
|
160
|
+
- ".rvmrc"
|
161
|
+
- ".travis.yml"
|
162
|
+
- Appraisals
|
135
163
|
- Gemfile
|
136
164
|
- LICENSE.txt
|
137
165
|
- README.md
|
138
166
|
- Rakefile
|
139
167
|
- changelog.md
|
140
168
|
- db/schema.rb
|
169
|
+
- gemfiles/activerecord_3.2.gemfile
|
170
|
+
- gemfiles/activerecord_4.0.gemfile
|
171
|
+
- gemfiles/activerecord_4.1.gemfile
|
172
|
+
- gemfiles/activerecord_4.2.gemfile
|
141
173
|
- lib/slugable.rb
|
174
|
+
- lib/slugable/cache_layer.rb
|
175
|
+
- lib/slugable/formatter/parameterize.rb
|
142
176
|
- lib/slugable/has_slug.rb
|
143
177
|
- lib/slugable/railtie.rb
|
178
|
+
- lib/slugable/slug_builder/caching_tree_ancestry.rb
|
179
|
+
- lib/slugable/slug_builder/flat.rb
|
180
|
+
- lib/slugable/slug_builder/tree_ancestry.rb
|
144
181
|
- lib/slugable/version.rb
|
145
182
|
- slugable.gemspec
|
183
|
+
- spec/slugable/cache_layer_spec.rb
|
146
184
|
- spec/slugable/has_slug_spec.rb
|
185
|
+
- spec/slugable/slugable_builder/caching_tree_ancestry_spec.rb
|
186
|
+
- spec/slugable/slugable_builder/flat_spec.rb
|
187
|
+
- spec/slugable/slugable_builder/tree_ancestry_spec.rb
|
147
188
|
- spec/spec_helper.rb
|
189
|
+
- spec/support/hash_cache_storage.rb
|
190
|
+
- spec/support/set_up_models.rb
|
191
|
+
- spec/support/simple_to_slug.rb
|
148
192
|
homepage: https://github.com/mirrec/slugable
|
149
193
|
licenses: []
|
194
|
+
metadata: {}
|
150
195
|
post_install_message:
|
151
196
|
rdoc_options: []
|
152
197
|
require_paths:
|
153
198
|
- lib
|
154
199
|
required_ruby_version: !ruby/object:Gem::Requirement
|
155
|
-
none: false
|
156
200
|
requirements:
|
157
|
-
- -
|
201
|
+
- - ">="
|
158
202
|
- !ruby/object:Gem::Version
|
159
203
|
version: '0'
|
160
|
-
segments:
|
161
|
-
- 0
|
162
|
-
hash: -494734928332233680
|
163
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
|
-
none: false
|
165
205
|
requirements:
|
166
|
-
- -
|
206
|
+
- - ">="
|
167
207
|
- !ruby/object:Gem::Version
|
168
208
|
version: '0'
|
169
|
-
segments:
|
170
|
-
- 0
|
171
|
-
hash: -494734928332233680
|
172
209
|
requirements: []
|
173
210
|
rubyforge_project:
|
174
|
-
rubygems_version:
|
211
|
+
rubygems_version: 2.4.5
|
175
212
|
signing_key:
|
176
|
-
specification_version:
|
213
|
+
specification_version: 4
|
177
214
|
summary: Storing seo friendly url in column
|
178
215
|
test_files:
|
216
|
+
- spec/slugable/cache_layer_spec.rb
|
179
217
|
- spec/slugable/has_slug_spec.rb
|
218
|
+
- spec/slugable/slugable_builder/caching_tree_ancestry_spec.rb
|
219
|
+
- spec/slugable/slugable_builder/flat_spec.rb
|
220
|
+
- spec/slugable/slugable_builder/tree_ancestry_spec.rb
|
180
221
|
- spec/spec_helper.rb
|
222
|
+
- spec/support/hash_cache_storage.rb
|
223
|
+
- spec/support/set_up_models.rb
|
224
|
+
- spec/support/simple_to_slug.rb
|