vidibus-permalink 0.1.9 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +1 -1
- data/app/models/permalink.rb +29 -43
- data/lib/vidibus/permalink/dispatcher.rb +4 -4
- data/lib/vidibus/permalink/mongoid.rb +38 -23
- data/lib/vidibus/permalink/version.rb +1 -1
- data/lib/vidibus-permalink.rb +0 -1
- metadata +35 -76
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a0f6739c06733a192c1cc9d64e185be44323af2a
|
4
|
+
data.tar.gz: 87b4010b49dab36fbe7e7bd23a0566a046721fd2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a32a63c0e96135aa6915add4a471666008bdfac1fe19053094b53a874268dc49925e60d61df67efa40e377797fdabe5c8944444fa21f23677308a8ea08f13a8e
|
7
|
+
data.tar.gz: 55eac63dd2eba1965e68624cdb516bb99d6028c6e17c079a1a0c0fd6d7c13a559a0592dab10f3656da438de8bef6701b74ee486bee45a7bed3ab67727a1144cf
|
data/README.md
CHANGED
data/app/models/permalink.rb
CHANGED
@@ -2,41 +2,19 @@ class Permalink
|
|
2
2
|
include Mongoid::Document
|
3
3
|
include Mongoid::Timestamps
|
4
4
|
|
5
|
-
|
5
|
+
belongs_to :linkable, polymorphic: true
|
6
6
|
|
7
7
|
field :value
|
8
|
-
field :
|
9
|
-
field :
|
10
|
-
field :scope, :type => Array
|
11
|
-
field :_current, :type => Boolean, :default => true
|
8
|
+
field :scope, type: Array
|
9
|
+
field :_current, type: Boolean, default: true
|
12
10
|
|
13
11
|
before_validation :sanitize_value!
|
14
|
-
after_save :unset_other_current, :
|
15
|
-
after_destroy :set_last_current, :
|
16
|
-
|
17
|
-
validates :linkable_uuid, :uuid => true
|
18
|
-
validates :value, :linkable_class, :presence => true
|
19
|
-
|
20
|
-
index value: 1
|
21
|
-
|
22
|
-
# Sets object as linkable.
|
23
|
-
def linkable=(obj)
|
24
|
-
@linkable = nil
|
25
|
-
self.linkable_class = obj.class.to_s
|
26
|
-
if uuid = obj.try!(:uuid)
|
27
|
-
self.linkable_uuid = uuid
|
28
|
-
else
|
29
|
-
raise UuidRequiredError.new("The linkable object must respond to #uuid. The gem vidibus-uuid will help you.")
|
30
|
-
end
|
31
|
-
end
|
12
|
+
after_save :unset_other_current, if: :current?
|
13
|
+
after_destroy :set_last_current, if: :current?
|
32
14
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
return unless linkable_class and linkable_uuid
|
37
|
-
linkable_class.constantize.where(:uuid => linkable_uuid).first
|
38
|
-
end
|
39
|
-
end
|
15
|
+
validates :value, :linkable, presence: true
|
16
|
+
|
17
|
+
index({value: 1}, {sparse: true})
|
40
18
|
|
41
19
|
# Sanitizes and increments string, if necessary.
|
42
20
|
def sanitize_value!
|
@@ -69,7 +47,7 @@ class Permalink
|
|
69
47
|
if current?
|
70
48
|
self
|
71
49
|
else
|
72
|
-
Permalink.where(:
|
50
|
+
Permalink.where(linkable_id: linkable.id, _current: true).first
|
73
51
|
end
|
74
52
|
end
|
75
53
|
end
|
@@ -83,18 +61,18 @@ class Permalink
|
|
83
61
|
class << self
|
84
62
|
# Scope method for finding Permalinks for given object.
|
85
63
|
def for_linkable(object)
|
86
|
-
where(:
|
64
|
+
where(linkable_id: object.id)
|
87
65
|
end
|
88
66
|
|
89
67
|
# Scope method for finding Permalinks for given value.
|
90
68
|
# The value will be sanitized.
|
91
69
|
def for_value(value)
|
92
|
-
where(:
|
70
|
+
where(value: sanitize(value))
|
93
71
|
end
|
94
72
|
|
95
73
|
def for_scope(scope)
|
96
74
|
return all unless scope
|
97
|
-
all_in(:
|
75
|
+
all_in(scope: scope_list(scope))
|
98
76
|
end
|
99
77
|
|
100
78
|
# Returns a dispatcher object for given path.
|
@@ -112,7 +90,7 @@ class Permalink
|
|
112
90
|
def scope_list(scope)
|
113
91
|
return [] unless scope
|
114
92
|
return scope if scope.kind_of?(Array)
|
115
|
-
scope.map {|key, value| "#{key}:#{value}"}
|
93
|
+
scope.map { |key, value| "#{key}:#{value}" }
|
116
94
|
end
|
117
95
|
end
|
118
96
|
|
@@ -158,24 +136,32 @@ class Permalink
|
|
158
136
|
# Finds existing permalinks with current value.
|
159
137
|
def existing(string)
|
160
138
|
@existing ||= {}
|
161
|
-
@existing[string] ||=
|
162
|
-
|
139
|
+
@existing[string] ||= Permalink
|
140
|
+
.for_scope(scope)
|
141
|
+
.where(value: /^#{string}(-\d+)?$/)
|
142
|
+
.excludes(:_id => id)
|
143
|
+
.to_a
|
163
144
|
end
|
164
145
|
|
165
146
|
# Sets _current to false on all permalinks of the assigned linkable.
|
166
147
|
def unset_other_current
|
167
148
|
return unless linkable
|
168
|
-
conditions = {:
|
149
|
+
conditions = {linkable_id: linkable.id, _id: {'$ne' => id}}
|
169
150
|
conditions[:scope] = Permalink.scope_list(scope) if scope.present?
|
170
|
-
|
171
|
-
|
172
|
-
|
151
|
+
Permalink.where(conditions).each do |obj|
|
152
|
+
obj.set(_current: false)
|
153
|
+
end
|
173
154
|
end
|
174
155
|
|
175
156
|
# Sets the lastly updated permalink of the assigned linkable as current one.
|
176
157
|
def set_last_current
|
177
|
-
|
178
|
-
|
158
|
+
last = Permalink
|
159
|
+
.where(linkable_id: linkable.id)
|
160
|
+
.order_by(:updated_at.desc)
|
161
|
+
.limit(1)
|
162
|
+
.first
|
163
|
+
if last
|
164
|
+
last.update_attributes!(_current: true)
|
179
165
|
end
|
180
166
|
end
|
181
167
|
end
|
@@ -60,12 +60,12 @@ module Vidibus
|
|
60
60
|
private
|
61
61
|
|
62
62
|
def resolve_path
|
63
|
-
results = ::Permalink.for_scope(@scope).any_in(:
|
63
|
+
results = ::Permalink.for_scope(@scope).any_in(value: parts)
|
64
64
|
links = Array.new(parts.length)
|
65
65
|
done = {}
|
66
66
|
for result in results
|
67
67
|
if i = parts.index(result.value)
|
68
|
-
key = "#{result.
|
68
|
+
key = "#{result.linkable_type}##{result.linkable_id}"
|
69
69
|
next if done[key]
|
70
70
|
links[i] = result
|
71
71
|
done[key] = true
|
@@ -76,11 +76,11 @@ module Vidibus
|
|
76
76
|
|
77
77
|
# Returns an array containing the current permalinks of all objects.
|
78
78
|
def current_parts
|
79
|
-
objects.map {|o| o.current.value}
|
79
|
+
objects.map { |o| o.current.value }
|
80
80
|
end
|
81
81
|
|
82
82
|
def redirectables
|
83
|
-
objects.select {|o| !o.current?}
|
83
|
+
objects.select { |o| !o.current? }
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
@@ -6,18 +6,18 @@ module Vidibus
|
|
6
6
|
class PermalinkConfigurationError < StandardError; end
|
7
7
|
|
8
8
|
included do
|
9
|
-
field :permalink, :
|
10
|
-
field :static_permalink, :
|
9
|
+
field :permalink, type: String
|
10
|
+
field :static_permalink, type: String
|
11
11
|
|
12
|
-
index
|
13
|
-
index
|
12
|
+
index({permalink: 1}, {sparse: true})
|
13
|
+
index({static_permalink: 1}, {sparse: true})
|
14
14
|
|
15
15
|
attr_accessor :skip_permalink
|
16
16
|
|
17
|
-
before_validation :set_permalink, :
|
18
|
-
validates :permalink, :
|
17
|
+
before_validation :set_permalink, unless: :skip_permalink
|
18
|
+
validates :permalink, presence: true, unless: :skip_permalink
|
19
19
|
|
20
|
-
after_save :store_permalink_object, :
|
20
|
+
after_save :store_permalink_object, unless: :skip_permalink
|
21
21
|
after_destroy :destroy_permalink_objects
|
22
22
|
end
|
23
23
|
|
@@ -42,18 +42,23 @@ module Vidibus
|
|
42
42
|
|
43
43
|
# Returns the defined permalink repository object.
|
44
44
|
def permalink_repository
|
45
|
-
@permalink_repository ||=
|
45
|
+
@permalink_repository ||= begin
|
46
|
+
self.class.permalink_options[:repository] == false ? nil : ::Permalink
|
47
|
+
end
|
46
48
|
end
|
47
49
|
|
48
50
|
# Returns the current permalink object.
|
49
51
|
def permalink_object
|
50
|
-
@permalink_object ||
|
51
|
-
permalink_repository.for_linkable(self).where(:
|
52
|
+
@permalink_object || if permalink_repository
|
53
|
+
permalink_repository.for_linkable(self).where(_current: true).first
|
54
|
+
end
|
52
55
|
end
|
53
56
|
|
54
57
|
# Returns all permalink objects ordered by time of update.
|
55
58
|
def permalink_objects
|
56
|
-
|
59
|
+
if permalink_repository
|
60
|
+
permalink_repository.for_linkable(self).asc(:updated_at)
|
61
|
+
end
|
57
62
|
end
|
58
63
|
|
59
64
|
# Returns permalink scope.
|
@@ -66,14 +71,21 @@ module Vidibus
|
|
66
71
|
# Returns a existing or new permalink object with wanted value.
|
67
72
|
# The permalink scope is also applied
|
68
73
|
def permalink_object_by_value(value)
|
69
|
-
permalink_repository
|
70
|
-
|
74
|
+
item = permalink_repository
|
75
|
+
.for_linkable(self)
|
76
|
+
.for_value(value)
|
77
|
+
.for_scope(permalink_scope)
|
78
|
+
.first
|
79
|
+
item ||= permalink_repository.new({
|
80
|
+
value: value,
|
81
|
+
scope: permalink_scope,
|
82
|
+
linkable: self
|
83
|
+
})
|
71
84
|
end
|
72
85
|
|
73
86
|
def get_scope
|
74
87
|
scope = self.class.permalink_options[:scope]
|
75
88
|
return unless scope
|
76
|
-
|
77
89
|
{}.tap do |hash|
|
78
90
|
scope.each do |key, value|
|
79
91
|
if value.kind_of?(String)
|
@@ -99,12 +111,12 @@ module Vidibus
|
|
99
111
|
|
100
112
|
changed = false
|
101
113
|
values = []
|
102
|
-
|
103
|
-
changed
|
104
|
-
values <<
|
114
|
+
attribute_names.each do |name|
|
115
|
+
changed ||= changes[name].present?
|
116
|
+
values << attributes[name.to_s]
|
105
117
|
end
|
106
|
-
return unless permalink.blank?
|
107
|
-
value = values.join(
|
118
|
+
return unless permalink.blank? || changed
|
119
|
+
value = values.join(' ')
|
108
120
|
if permalink_repository
|
109
121
|
@permalink_object = permalink_object_by_value(value)
|
110
122
|
@permalink_object.sanitize_value!
|
@@ -123,13 +135,16 @@ module Vidibus
|
|
123
135
|
|
124
136
|
# Stores current new permalink object or updates an existing one that matches.
|
125
137
|
def store_permalink_object
|
126
|
-
return unless @permalink_object
|
127
|
-
@permalink_object
|
128
|
-
|
138
|
+
return unless obj = @permalink_object
|
139
|
+
@permalink_object = nil # reset to avoid storing it again
|
140
|
+
obj.updated_at = Time.now
|
141
|
+
obj.save!
|
129
142
|
end
|
130
143
|
|
131
144
|
def destroy_permalink_objects
|
132
|
-
|
145
|
+
if permalink_repository
|
146
|
+
permalink_repository.where(linkable_id: id).delete
|
147
|
+
end
|
133
148
|
end
|
134
149
|
end
|
135
150
|
end
|
data/lib/vidibus-permalink.rb
CHANGED
metadata
CHANGED
@@ -1,190 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vidibus-permalink
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Andre Pankratz
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2019-03-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: activesupport
|
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'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '3'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: mongoid
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version: '
|
33
|
+
version: '6'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version: '
|
40
|
+
version: '6'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: vidibus-core_extensions
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: vidibus-uuid
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
44
|
requirements:
|
67
|
-
- -
|
45
|
+
- - ">="
|
68
46
|
- !ruby/object:Gem::Version
|
69
47
|
version: '0'
|
70
48
|
type: :runtime
|
71
49
|
prerelease: false
|
72
50
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
51
|
requirements:
|
75
|
-
- -
|
52
|
+
- - ">="
|
76
53
|
- !ruby/object:Gem::Version
|
77
54
|
version: '0'
|
78
55
|
- !ruby/object:Gem::Dependency
|
79
56
|
name: vidibus-words
|
80
57
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
58
|
requirements:
|
83
|
-
- -
|
59
|
+
- - ">="
|
84
60
|
- !ruby/object:Gem::Version
|
85
61
|
version: '0'
|
86
62
|
type: :runtime
|
87
63
|
prerelease: false
|
88
64
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
65
|
requirements:
|
91
|
-
- -
|
66
|
+
- - ">="
|
92
67
|
- !ruby/object:Gem::Version
|
93
68
|
version: '0'
|
94
69
|
- !ruby/object:Gem::Dependency
|
95
70
|
name: bundler
|
96
71
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
72
|
requirements:
|
99
|
-
- -
|
73
|
+
- - ">="
|
100
74
|
- !ruby/object:Gem::Version
|
101
75
|
version: 1.0.0
|
102
76
|
type: :development
|
103
77
|
prerelease: false
|
104
78
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
79
|
requirements:
|
107
|
-
- -
|
80
|
+
- - ">="
|
108
81
|
- !ruby/object:Gem::Version
|
109
82
|
version: 1.0.0
|
110
83
|
- !ruby/object:Gem::Dependency
|
111
84
|
name: rspec
|
112
85
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
86
|
requirements:
|
115
|
-
- - ~>
|
87
|
+
- - "~>"
|
116
88
|
- !ruby/object:Gem::Version
|
117
89
|
version: '2'
|
118
90
|
type: :development
|
119
91
|
prerelease: false
|
120
92
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
93
|
requirements:
|
123
|
-
- - ~>
|
94
|
+
- - "~>"
|
124
95
|
- !ruby/object:Gem::Version
|
125
96
|
version: '2'
|
126
97
|
- !ruby/object:Gem::Dependency
|
127
98
|
name: rr
|
128
99
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
100
|
requirements:
|
131
|
-
- -
|
101
|
+
- - ">="
|
132
102
|
- !ruby/object:Gem::Version
|
133
103
|
version: '0'
|
134
104
|
type: :development
|
135
105
|
prerelease: false
|
136
106
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
107
|
requirements:
|
139
|
-
- -
|
108
|
+
- - ">="
|
140
109
|
- !ruby/object:Gem::Version
|
141
110
|
version: '0'
|
142
111
|
- !ruby/object:Gem::Dependency
|
143
112
|
name: rake
|
144
113
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
114
|
requirements:
|
147
|
-
- -
|
115
|
+
- - ">="
|
148
116
|
- !ruby/object:Gem::Version
|
149
117
|
version: '0'
|
150
118
|
type: :development
|
151
119
|
prerelease: false
|
152
120
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
121
|
requirements:
|
155
|
-
- -
|
122
|
+
- - ">="
|
156
123
|
- !ruby/object:Gem::Version
|
157
124
|
version: '0'
|
158
125
|
- !ruby/object:Gem::Dependency
|
159
126
|
name: rdoc
|
160
127
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
128
|
requirements:
|
163
|
-
- - ~>
|
129
|
+
- - "~>"
|
164
130
|
- !ruby/object:Gem::Version
|
165
131
|
version: '3.4'
|
166
132
|
type: :development
|
167
133
|
prerelease: false
|
168
134
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
135
|
requirements:
|
171
|
-
- - ~>
|
136
|
+
- - "~>"
|
172
137
|
- !ruby/object:Gem::Version
|
173
138
|
version: '3.4'
|
174
139
|
- !ruby/object:Gem::Dependency
|
175
140
|
name: simplecov
|
176
141
|
requirement: !ruby/object:Gem::Requirement
|
177
|
-
none: false
|
178
142
|
requirements:
|
179
|
-
- -
|
143
|
+
- - ">="
|
180
144
|
- !ruby/object:Gem::Version
|
181
145
|
version: '0'
|
182
146
|
type: :development
|
183
147
|
prerelease: false
|
184
148
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
-
none: false
|
186
149
|
requirements:
|
187
|
-
- -
|
150
|
+
- - ">="
|
188
151
|
- !ruby/object:Gem::Version
|
189
152
|
version: '0'
|
190
153
|
description: Allows changeable permalinks (good for SEO).
|
@@ -193,41 +156,37 @@ executables: []
|
|
193
156
|
extensions: []
|
194
157
|
extra_rdoc_files: []
|
195
158
|
files:
|
196
|
-
- lib/vidibus/permalink/dispatcher.rb
|
197
|
-
- lib/vidibus/permalink/mongoid.rb
|
198
|
-
- lib/vidibus/permalink/version.rb
|
199
|
-
- lib/vidibus/permalink.rb
|
200
|
-
- lib/vidibus-permalink.rb
|
201
|
-
- app/models/permalink.rb
|
202
159
|
- LICENSE
|
203
160
|
- README.md
|
204
161
|
- Rakefile
|
162
|
+
- app/models/permalink.rb
|
163
|
+
- lib/vidibus-permalink.rb
|
164
|
+
- lib/vidibus/permalink.rb
|
165
|
+
- lib/vidibus/permalink/dispatcher.rb
|
166
|
+
- lib/vidibus/permalink/mongoid.rb
|
167
|
+
- lib/vidibus/permalink/version.rb
|
205
168
|
homepage: https://github.com/vidibus/vidibus-permalink
|
206
169
|
licenses:
|
207
170
|
- MIT
|
171
|
+
metadata: {}
|
208
172
|
post_install_message:
|
209
173
|
rdoc_options: []
|
210
174
|
require_paths:
|
211
175
|
- lib
|
212
176
|
required_ruby_version: !ruby/object:Gem::Requirement
|
213
|
-
none: false
|
214
177
|
requirements:
|
215
|
-
- -
|
178
|
+
- - ">="
|
216
179
|
- !ruby/object:Gem::Version
|
217
180
|
version: '0'
|
218
|
-
segments:
|
219
|
-
- 0
|
220
|
-
hash: -3383487206857057643
|
221
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
222
|
-
none: false
|
223
182
|
requirements:
|
224
|
-
- -
|
183
|
+
- - ">="
|
225
184
|
- !ruby/object:Gem::Version
|
226
185
|
version: 1.3.6
|
227
186
|
requirements: []
|
228
187
|
rubyforge_project:
|
229
|
-
rubygems_version:
|
188
|
+
rubygems_version: 2.6.11
|
230
189
|
signing_key:
|
231
|
-
specification_version:
|
190
|
+
specification_version: 4
|
232
191
|
summary: Permalink handling
|
233
192
|
test_files: []
|