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.
@@ -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
@@ -1,12 +1,32 @@
1
- require "slugable"
2
- require "sqlite3"
3
- require "ancestry"
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
- ActiveRecord::Base.establish_connection :adapter => "sqlite3", :database => ":memory:"
14
+ require 'slugable'
15
+ require 'sqlite3'
16
+ require 'ancestry'
17
+ require 'pry'
6
18
 
7
- load "db/schema.rb"
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
@@ -0,0 +1,13 @@
1
+ class SimpleToSlug
2
+ def to_slug(record)
3
+ "to_slug_#{record.id}"
4
+ end
5
+
6
+ def to_slug_was(record)
7
+ "to_slug_was_#{record.id}"
8
+ end
9
+
10
+ def to_slug_will(record)
11
+ "to_slug_will_#{record.id}"
12
+ end
13
+ 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.4
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: 2013-05-30 00:00:00.000000000 Z
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
- type: :runtime
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: '3.0'
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: wnm_support
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: 0.0.4
54
- type: :runtime
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: 0.0.4
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: 2.11.0
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: 2.11.0
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.6
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.6
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: 1.8.24
211
+ rubygems_version: 2.4.5
175
212
  signing_key:
176
- specification_version: 3
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