teambox-permalink_fu 1.0.2 → 1.0.4
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 +1 -0
- data/Rakefile +14 -2
- data/lib/data/x00.yml +3 -3
- data/lib/permalink_fu.rb +15 -11
- data/teambox-permalink_fu.gemspec +12 -11
- data/test/models.rb +130 -0
- data/test/permalink_fu_test.rb +73 -197
- metadata +25 -49
- data/test/test_helper.rb +0 -13
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 796145ed6da4b5645dc2f373f6065845b66b61cc
|
|
4
|
+
data.tar.gz: ab564f64f5762cc27999b1ae48c3610a96be6f7b
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 290a0087418cf8650c04fb4c3ff61898ed7ff175ccc9fdacd02235d74ebe47cb9806c51e09f5ce9785bcf205a7aa5ea40f08cc14cb059db219849d86061e7bcf
|
|
7
|
+
data.tar.gz: 5c56804d1dd12fb808bb849e6f1406d71036eafb68f17f9643f7258ff8db45326959b2c9ab24767aa23bb887ef2df083e4dc1f0b08bbc2ad82844359fe5a86de
|
data/.gitignore
CHANGED
data/Rakefile
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
|
-
require 'bundler'
|
|
2
|
-
|
|
1
|
+
require 'bundler/gem_tasks'
|
|
2
|
+
|
|
3
|
+
require 'rake'
|
|
4
|
+
require 'rake/testtask'
|
|
5
|
+
|
|
6
|
+
desc 'Default: run unit tests.'
|
|
7
|
+
task :default => :test
|
|
8
|
+
|
|
9
|
+
desc 'Test the permalink_fu plugin.'
|
|
10
|
+
Rake::TestTask.new(:test) do |t|
|
|
11
|
+
t.libs << 'lib'
|
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
|
13
|
+
t.verbose = true
|
|
14
|
+
end
|
data/lib/data/x00.yml
CHANGED
data/lib/permalink_fu.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
require 'yaml'
|
|
2
|
-
require 'iconv'
|
|
3
2
|
|
|
4
3
|
module PermalinkFu
|
|
5
4
|
def has_permalink(attr_names = [], permalink_field = nil, options = {})
|
|
@@ -12,21 +11,26 @@ module PermalinkFu
|
|
|
12
11
|
self.permalink_field = (permalink_field || 'permalink').to_s
|
|
13
12
|
self.permalink_options = {:unique => true, :min_length => 1}.update(options)
|
|
14
13
|
end
|
|
15
|
-
|
|
14
|
+
|
|
16
15
|
include InstanceMethods
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
class << self
|
|
20
19
|
# This method does the actual permalink escaping.
|
|
21
20
|
def escape(str, klass = nil)
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
if Gem::Version.new("#{RUBY_VERSION}") < Gem::Version.new("1.9")
|
|
22
|
+
require 'iconv'
|
|
23
|
+
s = ClassMethods.decode(str)#.force_encoding("UTF-8")
|
|
24
|
+
s = Iconv.iconv('ascii//ignore//translit', 'utf-8', s).to_s
|
|
25
|
+
else
|
|
26
|
+
s = ClassMethods.decode(str).encode("ascii")
|
|
27
|
+
end
|
|
24
28
|
s.gsub!(/[^\w_ \-]+/i, '') # Remove unwanted chars.
|
|
25
29
|
s.gsub!(/[ \-]+/i, '-') # No more than one of the separator in a row.
|
|
26
30
|
s.gsub!(/^\-|\-$/i, '') # Remove leading/trailing separator.
|
|
27
31
|
s.downcase!
|
|
28
|
-
s = "#{klass}-#{s}" if klass &&
|
|
29
|
-
s.size
|
|
32
|
+
s = "#{klass}-#{s}" if klass && s.match(/\A\d+\z/)
|
|
33
|
+
s = s.size < klass.classify.constantize.permalink_options[:min_length] ? ClassMethods.random_permalink : s
|
|
30
34
|
end
|
|
31
35
|
end
|
|
32
36
|
|
|
@@ -36,7 +40,7 @@ module PermalinkFu
|
|
|
36
40
|
CODEPOINTS = Hash.new { |h, k|
|
|
37
41
|
h[k] = YAML::load_file(File.join(File.dirname(__FILE__), "data", "#{k}.yml"))
|
|
38
42
|
}
|
|
39
|
-
|
|
43
|
+
|
|
40
44
|
class << self
|
|
41
45
|
def decode(string)
|
|
42
46
|
string.gsub(/[^\x00-\x7f]/u) do |codepoint|
|
|
@@ -47,12 +51,12 @@ module PermalinkFu
|
|
|
47
51
|
end
|
|
48
52
|
end
|
|
49
53
|
end
|
|
50
|
-
|
|
54
|
+
|
|
51
55
|
def random_permalink
|
|
52
56
|
rand(Time.now.to_i**2).to_s(36)
|
|
53
57
|
end
|
|
54
58
|
end
|
|
55
|
-
|
|
59
|
+
|
|
56
60
|
def self.setup_permalink_fu_on(base)
|
|
57
61
|
base.extend self
|
|
58
62
|
class << base
|
|
@@ -78,7 +82,7 @@ module PermalinkFu
|
|
|
78
82
|
if (value = define_attribute_methods_without_permalinks) && self.permalink_field
|
|
79
83
|
class_eval <<-EOV
|
|
80
84
|
def #{self.permalink_field}=(new_value);
|
|
81
|
-
write_attribute(:#{self.permalink_field}, new_value.blank? ? '' : PermalinkFu.escape(new_value, self.class.to_s
|
|
85
|
+
write_attribute(:#{self.permalink_field}, new_value.blank? ? '' : PermalinkFu.escape(new_value.to_s, self.class.to_s));
|
|
82
86
|
end
|
|
83
87
|
EOV
|
|
84
88
|
end
|
|
@@ -127,7 +131,7 @@ module PermalinkFu
|
|
|
127
131
|
end
|
|
128
132
|
end
|
|
129
133
|
while self.class.exists?(conditions)
|
|
130
|
-
suffix = "
|
|
134
|
+
suffix = "-".concat(SecureRandom.hex(3))
|
|
131
135
|
conditions[1] = "#{base[0..limit-suffix.size-1]}#{suffix}"
|
|
132
136
|
send("#{self.class.permalink_field}=", conditions[1])
|
|
133
137
|
end
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
|
|
2
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |s|
|
|
5
|
-
s.name =
|
|
6
|
-
s.version =
|
|
5
|
+
s.name = 'teambox-permalink_fu'
|
|
6
|
+
s.version = '1.0.4'
|
|
7
7
|
s.platform = Gem::Platform::RUBY
|
|
8
|
-
s.authors = ["Gonçalo Silva",
|
|
9
|
-
s.email = [
|
|
10
|
-
s.homepage =
|
|
11
|
-
s.summary =
|
|
12
|
-
s.description =
|
|
8
|
+
s.authors = ["Gonçalo Silva", 'Charles Barbier']
|
|
9
|
+
s.email = ['goncalossilva@gmail.com', 'unixcharles@gmail.com']
|
|
10
|
+
s.homepage = 'http://rubygems.org/gems/teambox-permalink_fu'
|
|
11
|
+
s.summary = 'Fork of permalink_fu used at Teambox'
|
|
12
|
+
s.description = 'Same functionality as the original one, except now it ' \
|
|
13
|
+
"doesn't accept numerical permalinks and is safer with" \
|
|
14
|
+
'unicode characters.'
|
|
13
15
|
|
|
14
16
|
s.files = `git ls-files`.split("\n")
|
|
15
|
-
s.test_files = `git ls-files -- {test
|
|
16
|
-
s.
|
|
17
|
-
s.require_paths = ["lib"]
|
|
17
|
+
s.test_files = `git ls-files -- {test}/*`.split("\n")
|
|
18
|
+
s.require_paths = ['lib']
|
|
18
19
|
end
|
data/test/models.rb
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
class ClassModel < ActiveRecord::Base
|
|
2
|
+
has_permalink :title
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
class SubClassHasPermalinkModel < ClassModel
|
|
6
|
+
has_permalink [:title, :extra]
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class SubClassNoPermalinkModel < ClassModel
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class MockModel < ClassModel
|
|
13
|
+
def self.exists?(conditions)
|
|
14
|
+
if conditions[1] == 'foo' || conditions[1] == 'bar' ||
|
|
15
|
+
(conditions[1] == 'bar-2' && conditions[2] != 2)
|
|
16
|
+
true
|
|
17
|
+
else
|
|
18
|
+
false
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
has_permalink :title
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class PermalinkChangeableMockModel < ClassModel
|
|
26
|
+
def self.exists?(conditions)
|
|
27
|
+
if conditions[1] == 'foo'
|
|
28
|
+
true
|
|
29
|
+
else
|
|
30
|
+
false
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
has_permalink :title
|
|
35
|
+
|
|
36
|
+
def permalink_changed?
|
|
37
|
+
@permalink_changed
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def permalink_will_change!
|
|
41
|
+
@permalink_changed = true
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class CommonMockModel < ClassModel
|
|
46
|
+
def self.exists?(conditions)
|
|
47
|
+
false # oh noes
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
has_permalink :title, :unique => false
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class ScopedModel < ClassModel
|
|
54
|
+
def self.exists?(conditions)
|
|
55
|
+
if conditions[1] == 'foo' && conditions[2] != 5
|
|
56
|
+
true
|
|
57
|
+
else
|
|
58
|
+
false
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
has_permalink :title, :scope => :foo
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
class ScopedModelForNilScope < ClassModel
|
|
66
|
+
def self.exists?(conditions)
|
|
67
|
+
(conditions[0] == 'permalink = ? and foo IS NULL') ? (conditions[1] == 'ack') : false
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
has_permalink :title, :scope => :foo
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
class OverrideModel < ClassModel
|
|
74
|
+
has_permalink :title
|
|
75
|
+
|
|
76
|
+
def permalink
|
|
77
|
+
'not the permalink'
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
class ChangedWithoutUpdateModel < ClassModel
|
|
82
|
+
has_permalink :title
|
|
83
|
+
def title_changed?; true; end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
class ChangedWithUpdateModel < ClassModel
|
|
87
|
+
has_permalink :title, :update => true
|
|
88
|
+
def title_changed?; true; end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
class NoChangeModel < ClassModel
|
|
92
|
+
has_permalink :title, :update => true
|
|
93
|
+
def title_changed?; false; end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
class IfProcConditionModel < ClassModel
|
|
97
|
+
has_permalink :title, :if => Proc.new { |obj| false }
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
class IfMethodConditionModel < ClassModel
|
|
101
|
+
has_permalink :title, :if => :false_method
|
|
102
|
+
|
|
103
|
+
def false_method; false; end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
class IfStringConditionModel < ClassModel
|
|
107
|
+
has_permalink :title, :if => 'false'
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
class UnlessProcConditionModel < ClassModel
|
|
111
|
+
has_permalink :title, :unless => Proc.new { |obj| false }
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
class UnlessMethodConditionModel < ClassModel
|
|
115
|
+
has_permalink :title, :unless => :false_method
|
|
116
|
+
|
|
117
|
+
def false_method; false; end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
class UnlessStringConditionModel < ClassModel
|
|
121
|
+
has_permalink :title, :unless => 'false'
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
class MockModelExtra < ClassModel
|
|
125
|
+
has_permalink [:title, :extra]
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
class MinLength < ClassModel
|
|
129
|
+
has_permalink :title, :min_length => 5
|
|
130
|
+
end
|
data/test/permalink_fu_test.rb
CHANGED
|
@@ -1,10 +1,31 @@
|
|
|
1
1
|
# encoding: UTF-8
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'test/unit'
|
|
5
|
+
require 'active_record'
|
|
6
|
+
require 'permalink_fu'
|
|
7
|
+
require './test/models'
|
|
8
|
+
|
|
9
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
|
10
|
+
|
|
11
|
+
def setup_db
|
|
12
|
+
silence_stream(STDOUT) do
|
|
13
|
+
ActiveRecord::Schema.define(:version => 1) do
|
|
14
|
+
create_table :class_models do |t|
|
|
15
|
+
t.integer :id
|
|
16
|
+
t.string :title
|
|
17
|
+
t.string :permalink
|
|
18
|
+
t.string :extra
|
|
19
|
+
t.string :foo
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def teardown_db
|
|
26
|
+
ActiveRecord::Base.connection.tables.each do |table|
|
|
27
|
+
ActiveRecord::Base.connection.drop_table(table)
|
|
28
|
+
end
|
|
8
29
|
end
|
|
9
30
|
|
|
10
31
|
class PermalinkFuTest < Test::Unit::TestCase
|
|
@@ -18,14 +39,12 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
18
39
|
|
|
19
40
|
@@extra = { 'some-)()()-ExtRa!/// .data==?> to \/\/test' => 'some-extra-data-to-test' }
|
|
20
41
|
|
|
21
|
-
def
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
assert_equal @m.extra, nil
|
|
28
|
-
assert_equal @m.foo, nil
|
|
42
|
+
def setup
|
|
43
|
+
setup_db
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def teardown
|
|
47
|
+
teardown_db
|
|
29
48
|
end
|
|
30
49
|
|
|
31
50
|
def test_set_new_permalink_attributes_on_sub_class
|
|
@@ -34,14 +53,14 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
34
53
|
@m.extra = 'bar'
|
|
35
54
|
assert @m.valid?
|
|
36
55
|
assert_equal @m.permalink, 'foo'
|
|
37
|
-
|
|
56
|
+
|
|
38
57
|
@m = SubClassHasPermalinkModel.new
|
|
39
58
|
@m.title = 'foo'
|
|
40
59
|
@m.extra = 'bar'
|
|
41
60
|
assert @m.valid?
|
|
42
61
|
assert_equal @m.permalink, 'foo-bar'
|
|
43
62
|
end
|
|
44
|
-
|
|
63
|
+
|
|
45
64
|
def test_should_not_inherit_permalink_attributes
|
|
46
65
|
@m = SubClassNoPermalinkModel.new
|
|
47
66
|
@m.title = 'foo'
|
|
@@ -49,12 +68,6 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
49
68
|
assert_equal @m.permalink, nil
|
|
50
69
|
end
|
|
51
70
|
|
|
52
|
-
def test_should_escape_permalinks
|
|
53
|
-
@@samples.each do |from, to|
|
|
54
|
-
assert_equal to, PermalinkFu.escape(from)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
71
|
def test_should_escape_activerecord_model
|
|
59
72
|
@m = MockModel.new
|
|
60
73
|
@@samples.each do |from, to|
|
|
@@ -63,7 +76,7 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
63
76
|
assert_equal to, @m.permalink
|
|
64
77
|
end
|
|
65
78
|
end
|
|
66
|
-
|
|
79
|
+
|
|
67
80
|
def test_should_escape_activerecord_model_with_existing_permalink
|
|
68
81
|
@m = MockModel.new
|
|
69
82
|
@@samples.each do |from, to|
|
|
@@ -72,8 +85,9 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
72
85
|
assert_equal to, @m.permalink
|
|
73
86
|
end
|
|
74
87
|
end
|
|
75
|
-
|
|
88
|
+
|
|
76
89
|
def test_multiple_attribute_permalink
|
|
90
|
+
|
|
77
91
|
@m = MockModelExtra.new
|
|
78
92
|
@@samples.each do |from, to|
|
|
79
93
|
@@extra.each do |from_extra, to_extra|
|
|
@@ -88,33 +102,33 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
88
102
|
@m = MockModel.new
|
|
89
103
|
@m.title = 'foo'
|
|
90
104
|
assert @m.valid?
|
|
91
|
-
|
|
92
|
-
|
|
105
|
+
assert_match /foo\-[0-9a-z]+/, @m.permalink
|
|
106
|
+
|
|
93
107
|
@m.title = 'bar'
|
|
94
108
|
@m.permalink = nil
|
|
95
109
|
assert @m.valid?
|
|
96
|
-
|
|
110
|
+
assert_match /bar\-[0-9a-z]+/, @m.permalink
|
|
97
111
|
end
|
|
98
|
-
|
|
112
|
+
|
|
99
113
|
def test_should_create_unique_permalink_when_assigned_directly
|
|
100
114
|
@m = MockModel.new
|
|
101
115
|
@m.permalink = 'foo'
|
|
102
116
|
assert @m.valid?
|
|
103
|
-
|
|
104
|
-
|
|
117
|
+
assert_match /foo\-[0-9a-z]+/, @m.permalink
|
|
118
|
+
|
|
105
119
|
# should always check itself for uniqueness when not respond_to?(:permalink_changed?)
|
|
106
120
|
@m.permalink = 'bar'
|
|
107
121
|
assert @m.valid?
|
|
108
|
-
|
|
122
|
+
assert_match /bar\-[0-9a-z]+/, @m.permalink
|
|
109
123
|
end
|
|
110
|
-
|
|
124
|
+
|
|
111
125
|
def test_should_common_permalink_if_unique_is_false
|
|
112
126
|
@m = CommonMockModel.new
|
|
113
127
|
@m.permalink = 'foo'
|
|
114
128
|
assert @m.valid?
|
|
115
129
|
assert_equal 'foo', @m.permalink
|
|
116
130
|
end
|
|
117
|
-
|
|
131
|
+
|
|
118
132
|
def test_should_not_check_itself_for_unique_permalink_if_unchanged
|
|
119
133
|
@m = MockModel.new
|
|
120
134
|
@m.id = 2
|
|
@@ -131,7 +145,7 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
131
145
|
@m.permalink_will_change!
|
|
132
146
|
@m.permalink = 'foo'
|
|
133
147
|
assert @m.valid?
|
|
134
|
-
|
|
148
|
+
assert_match /foo\-[0-9a-z]+/, @m.permalink
|
|
135
149
|
end
|
|
136
150
|
|
|
137
151
|
def test_should_not_check_itself_for_unique_permalink_if_permalink_field_not_changed
|
|
@@ -140,19 +154,19 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
140
154
|
assert @m.valid?
|
|
141
155
|
assert_equal 'foo', @m.permalink
|
|
142
156
|
end
|
|
143
|
-
|
|
157
|
+
|
|
144
158
|
def test_should_create_unique_scoped_permalink
|
|
145
159
|
@m = ScopedModel.new
|
|
146
160
|
@m.permalink = 'foo'
|
|
147
161
|
assert @m.valid?
|
|
148
|
-
|
|
149
|
-
|
|
162
|
+
assert_match /foo\-[0-9a-z]+/, @m.permalink
|
|
163
|
+
|
|
150
164
|
@m.foo = 5
|
|
151
165
|
@m.permalink = 'foo'
|
|
152
166
|
assert @m.valid?
|
|
153
167
|
assert_equal 'foo', @m.permalink
|
|
154
168
|
end
|
|
155
|
-
|
|
169
|
+
|
|
156
170
|
def test_should_limit_permalink
|
|
157
171
|
@old = MockModel.columns_hash['permalink'].instance_variable_get(:@limit)
|
|
158
172
|
MockModel.columns_hash['permalink'].instance_variable_set(:@limit, 2)
|
|
@@ -163,73 +177,73 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
163
177
|
ensure
|
|
164
178
|
MockModel.columns_hash['permalink'].instance_variable_set(:@limit, @old)
|
|
165
179
|
end
|
|
166
|
-
|
|
180
|
+
|
|
167
181
|
def test_should_limit_unique_permalink
|
|
168
182
|
@old = MockModel.columns_hash['permalink'].instance_variable_get(:@limit)
|
|
169
183
|
MockModel.columns_hash['permalink'].instance_variable_set(:@limit, 3)
|
|
170
184
|
@m = MockModel.new
|
|
171
185
|
@m.title = 'foo'
|
|
172
186
|
assert @m.valid?
|
|
173
|
-
|
|
187
|
+
assert_match /[0-9a-z]+/, @m.permalink
|
|
174
188
|
ensure
|
|
175
189
|
MockModel.columns_hash['permalink'].instance_variable_set(:@limit, @old)
|
|
176
190
|
end
|
|
177
|
-
|
|
191
|
+
|
|
178
192
|
def test_should_abide_by_if_proc_condition
|
|
179
193
|
@m = IfProcConditionModel.new
|
|
180
194
|
@m.title = 'dont make me a permalink'
|
|
181
195
|
assert @m.valid?
|
|
182
196
|
assert_nil @m.permalink
|
|
183
197
|
end
|
|
184
|
-
|
|
198
|
+
|
|
185
199
|
def test_should_abide_by_if_method_condition
|
|
186
200
|
@m = IfMethodConditionModel.new
|
|
187
201
|
@m.title = 'dont make me a permalink'
|
|
188
202
|
assert @m.valid?
|
|
189
203
|
assert_nil @m.permalink
|
|
190
204
|
end
|
|
191
|
-
|
|
205
|
+
|
|
192
206
|
def test_should_abide_by_if_string_condition
|
|
193
207
|
@m = IfStringConditionModel.new
|
|
194
208
|
@m.title = 'dont make me a permalink'
|
|
195
209
|
assert @m.valid?
|
|
196
210
|
assert_nil @m.permalink
|
|
197
211
|
end
|
|
198
|
-
|
|
212
|
+
|
|
199
213
|
def test_should_abide_by_unless_proc_condition
|
|
200
214
|
@m = UnlessProcConditionModel.new
|
|
201
215
|
@m.title = 'make me a permalink'
|
|
202
216
|
assert @m.valid?
|
|
203
217
|
assert_not_nil @m.permalink
|
|
204
218
|
end
|
|
205
|
-
|
|
219
|
+
|
|
206
220
|
def test_should_abide_by_unless_method_condition
|
|
207
221
|
@m = UnlessMethodConditionModel.new
|
|
208
222
|
@m.title = 'make me a permalink'
|
|
209
223
|
assert @m.valid?
|
|
210
224
|
assert_not_nil @m.permalink
|
|
211
225
|
end
|
|
212
|
-
|
|
226
|
+
|
|
213
227
|
def test_should_abide_by_unless_string_condition
|
|
214
228
|
@m = UnlessStringConditionModel.new
|
|
215
229
|
@m.title = 'make me a permalink'
|
|
216
230
|
assert @m.valid?
|
|
217
231
|
assert_not_nil @m.permalink
|
|
218
232
|
end
|
|
219
|
-
|
|
233
|
+
|
|
220
234
|
def test_should_allow_override_of_permalink_method
|
|
221
235
|
@m = OverrideModel.new
|
|
222
236
|
@m[:permalink] = 'the permalink'
|
|
223
237
|
assert_not_equal @m.permalink, @m[:permalink]
|
|
224
238
|
end
|
|
225
|
-
|
|
239
|
+
|
|
226
240
|
def test_should_create_permalink_from_attribute_not_attribute_accessor
|
|
227
241
|
@m = OverrideModel.new
|
|
228
242
|
@m.title = 'the permalink'
|
|
229
243
|
assert @m.valid?
|
|
230
244
|
assert_equal 'the-permalink', @m[:permalink]
|
|
231
245
|
end
|
|
232
|
-
|
|
246
|
+
|
|
233
247
|
def test_should_not_update_permalink_unless_field_changed
|
|
234
248
|
@m = NoChangeModel.new
|
|
235
249
|
@m.title = 'the permalink'
|
|
@@ -237,7 +251,7 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
237
251
|
assert @m.valid?
|
|
238
252
|
assert_equal 'unchanged', @m[:permalink]
|
|
239
253
|
end
|
|
240
|
-
|
|
254
|
+
|
|
241
255
|
def test_should_not_update_permalink_without_update_set_even_if_field_changed
|
|
242
256
|
@m = ChangedWithoutUpdateModel.new
|
|
243
257
|
@m.title = 'the permalink'
|
|
@@ -245,7 +259,7 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
245
259
|
assert @m.valid?
|
|
246
260
|
assert_equal 'unchanged', @m[:permalink]
|
|
247
261
|
end
|
|
248
|
-
|
|
262
|
+
|
|
249
263
|
def test_should_update_permalink_if_changed_method_does_not_exist
|
|
250
264
|
@m = OverrideModel.new
|
|
251
265
|
@m.title = 'the permalink'
|
|
@@ -312,165 +326,27 @@ class PermalinkFuTest < Test::Unit::TestCase
|
|
|
312
326
|
assert @m.valid?
|
|
313
327
|
assert_equal "new-title", @m[:permalink]
|
|
314
328
|
end
|
|
315
|
-
|
|
329
|
+
|
|
316
330
|
def test_should_work_correctly_for_scoped_fields_with_nil_value
|
|
317
331
|
s1 = ScopedModelForNilScope.new
|
|
318
332
|
s1.title = 'ack'
|
|
319
333
|
s1.foo = 3
|
|
320
334
|
assert s1.valid?
|
|
321
335
|
assert_equal 'ack', s1.permalink
|
|
322
|
-
|
|
336
|
+
|
|
337
|
+
|
|
323
338
|
s2 = ScopedModelForNilScope.new
|
|
324
339
|
s2.title = 'ack'
|
|
325
340
|
s2.foo = nil
|
|
326
341
|
assert s2.valid?
|
|
327
|
-
|
|
328
|
-
end
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
class BaseModel < ActiveRecord::Base
|
|
332
|
-
cattr_accessor :columns
|
|
333
|
-
@@columns ||= []
|
|
334
|
-
|
|
335
|
-
def self.column(name, sql_type = nil, default = nil, null = true)
|
|
336
|
-
columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type, null)
|
|
337
|
-
end
|
|
338
|
-
|
|
339
|
-
def self.exists?(*args)
|
|
340
|
-
false
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
column :id, 'int(11)'
|
|
344
|
-
column :title, 'varchar(100)'
|
|
345
|
-
column :permalink, 'varchar(100)'
|
|
346
|
-
column :extra, 'varchar(100)'
|
|
347
|
-
column :foo, 'varchar(100)'
|
|
348
|
-
|
|
349
|
-
end
|
|
350
|
-
|
|
351
|
-
class ClassModel < BaseModel
|
|
352
|
-
has_permalink :title
|
|
353
|
-
end
|
|
354
|
-
|
|
355
|
-
class SubClassHasPermalinkModel < ClassModel
|
|
356
|
-
has_permalink [:title, :extra]
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
class SubClassNoPermalinkModel < ClassModel
|
|
360
|
-
end
|
|
361
|
-
|
|
362
|
-
class MockModel < BaseModel
|
|
363
|
-
def self.exists?(conditions)
|
|
364
|
-
if conditions[1] == 'foo' || conditions[1] == 'bar' ||
|
|
365
|
-
(conditions[1] == 'bar-2' && conditions[2] != 2)
|
|
366
|
-
true
|
|
367
|
-
else
|
|
368
|
-
false
|
|
369
|
-
end
|
|
370
|
-
end
|
|
371
|
-
|
|
372
|
-
has_permalink :title
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
class PermalinkChangeableMockModel < BaseModel
|
|
376
|
-
def self.exists?(conditions)
|
|
377
|
-
if conditions[1] == 'foo'
|
|
378
|
-
true
|
|
379
|
-
else
|
|
380
|
-
false
|
|
381
|
-
end
|
|
382
|
-
end
|
|
383
|
-
|
|
384
|
-
has_permalink :title
|
|
385
|
-
|
|
386
|
-
def permalink_changed?
|
|
387
|
-
@permalink_changed
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
def permalink_will_change!
|
|
391
|
-
@permalink_changed = true
|
|
392
|
-
end
|
|
393
|
-
end
|
|
394
|
-
|
|
395
|
-
class CommonMockModel < BaseModel
|
|
396
|
-
def self.exists?(conditions)
|
|
397
|
-
false # oh noes
|
|
398
|
-
end
|
|
399
|
-
|
|
400
|
-
has_permalink :title, :unique => false
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
class ScopedModel < BaseModel
|
|
404
|
-
def self.exists?(conditions)
|
|
405
|
-
if conditions[1] == 'foo' && conditions[2] != 5
|
|
406
|
-
true
|
|
407
|
-
else
|
|
408
|
-
false
|
|
409
|
-
end
|
|
410
|
-
end
|
|
411
|
-
|
|
412
|
-
has_permalink :title, :scope => :foo
|
|
413
|
-
end
|
|
414
|
-
|
|
415
|
-
class ScopedModelForNilScope < BaseModel
|
|
416
|
-
def self.exists?(conditions)
|
|
417
|
-
(conditions[0] == 'permalink = ? and foo IS NULL') ? (conditions[1] == 'ack') : false
|
|
342
|
+
assert_match /ack-[0-9a-z]+/, s2.permalink
|
|
418
343
|
end
|
|
419
344
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
def permalink
|
|
427
|
-
'not the permalink'
|
|
345
|
+
def test_permalink_is_randomly_created_when_min_length_is_set
|
|
346
|
+
a = MinLength.create(:title => "MinL")
|
|
347
|
+
assert a.permalink.size.eql?(12)
|
|
348
|
+
a = MinLength.create(:title => "MinLe")
|
|
349
|
+
assert_equal "minle", a.permalink
|
|
428
350
|
end
|
|
429
|
-
end
|
|
430
|
-
|
|
431
|
-
class ChangedWithoutUpdateModel < BaseModel
|
|
432
|
-
has_permalink :title
|
|
433
|
-
def title_changed?; true; end
|
|
434
|
-
end
|
|
435
|
-
|
|
436
|
-
class ChangedWithUpdateModel < BaseModel
|
|
437
|
-
has_permalink :title, :update => true
|
|
438
|
-
def title_changed?; true; end
|
|
439
|
-
end
|
|
440
|
-
|
|
441
|
-
class NoChangeModel < BaseModel
|
|
442
|
-
has_permalink :title, :update => true
|
|
443
|
-
def title_changed?; false; end
|
|
444
|
-
end
|
|
445
|
-
|
|
446
|
-
class IfProcConditionModel < BaseModel
|
|
447
|
-
has_permalink :title, :if => Proc.new { |obj| false }
|
|
448
|
-
end
|
|
449
|
-
|
|
450
|
-
class IfMethodConditionModel < BaseModel
|
|
451
|
-
has_permalink :title, :if => :false_method
|
|
452
|
-
|
|
453
|
-
def false_method; false; end
|
|
454
|
-
end
|
|
455
|
-
|
|
456
|
-
class IfStringConditionModel < BaseModel
|
|
457
|
-
has_permalink :title, :if => 'false'
|
|
458
|
-
end
|
|
459
|
-
|
|
460
|
-
class UnlessProcConditionModel < BaseModel
|
|
461
|
-
has_permalink :title, :unless => Proc.new { |obj| false }
|
|
462
|
-
end
|
|
463
|
-
|
|
464
|
-
class UnlessMethodConditionModel < BaseModel
|
|
465
|
-
has_permalink :title, :unless => :false_method
|
|
466
|
-
|
|
467
|
-
def false_method; false; end
|
|
468
|
-
end
|
|
469
|
-
|
|
470
|
-
class UnlessStringConditionModel < BaseModel
|
|
471
|
-
has_permalink :title, :unless => 'false'
|
|
472
|
-
end
|
|
473
351
|
|
|
474
|
-
class MockModelExtra < BaseModel
|
|
475
|
-
has_permalink [:title, :extra]
|
|
476
352
|
end
|
metadata
CHANGED
|
@@ -1,37 +1,26 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: teambox-permalink_fu
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
5
|
-
prerelease: false
|
|
6
|
-
segments:
|
|
7
|
-
- 1
|
|
8
|
-
- 0
|
|
9
|
-
- 2
|
|
10
|
-
version: 1.0.2
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.4
|
|
11
5
|
platform: ruby
|
|
12
|
-
authors:
|
|
13
|
-
-
|
|
6
|
+
authors:
|
|
7
|
+
- Gonçalo Silva
|
|
14
8
|
- Charles Barbier
|
|
15
9
|
autorequire:
|
|
16
10
|
bindir: bin
|
|
17
11
|
cert_chain: []
|
|
18
|
-
|
|
19
|
-
date: 2011-09-20 00:00:00 +02:00
|
|
20
|
-
default_executable:
|
|
12
|
+
date: 2016-04-04 00:00:00.000000000 Z
|
|
21
13
|
dependencies: []
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
email:
|
|
14
|
+
description: Same functionality as the original one, except now it doesn't accept
|
|
15
|
+
numerical permalinks and is safer withunicode characters.
|
|
16
|
+
email:
|
|
25
17
|
- goncalossilva@gmail.com
|
|
26
18
|
- unixcharles@gmail.com
|
|
27
19
|
executables: []
|
|
28
|
-
|
|
29
20
|
extensions: []
|
|
30
|
-
|
|
31
21
|
extra_rdoc_files: []
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
- .gitignore
|
|
22
|
+
files:
|
|
23
|
+
- ".gitignore"
|
|
35
24
|
- Gemfile
|
|
36
25
|
- README.markdown
|
|
37
26
|
- Rakefile
|
|
@@ -218,42 +207,29 @@ files:
|
|
|
218
207
|
- lib/data/xff.yml
|
|
219
208
|
- lib/permalink_fu.rb
|
|
220
209
|
- teambox-permalink_fu.gemspec
|
|
210
|
+
- test/models.rb
|
|
221
211
|
- test/permalink_fu_test.rb
|
|
222
|
-
- test/test_helper.rb
|
|
223
|
-
has_rdoc: true
|
|
224
212
|
homepage: http://rubygems.org/gems/teambox-permalink_fu
|
|
225
213
|
licenses: []
|
|
226
|
-
|
|
214
|
+
metadata: {}
|
|
227
215
|
post_install_message:
|
|
228
216
|
rdoc_options: []
|
|
229
|
-
|
|
230
|
-
require_paths:
|
|
217
|
+
require_paths:
|
|
231
218
|
- lib
|
|
232
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
233
|
-
|
|
234
|
-
requirements:
|
|
219
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
220
|
+
requirements:
|
|
235
221
|
- - ">="
|
|
236
|
-
- !ruby/object:Gem::Version
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
version: "0"
|
|
241
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
242
|
-
none: false
|
|
243
|
-
requirements:
|
|
222
|
+
- !ruby/object:Gem::Version
|
|
223
|
+
version: '0'
|
|
224
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
|
+
requirements:
|
|
244
226
|
- - ">="
|
|
245
|
-
- !ruby/object:Gem::Version
|
|
246
|
-
|
|
247
|
-
segments:
|
|
248
|
-
- 0
|
|
249
|
-
version: "0"
|
|
227
|
+
- !ruby/object:Gem::Version
|
|
228
|
+
version: '0'
|
|
250
229
|
requirements: []
|
|
251
|
-
|
|
252
230
|
rubyforge_project:
|
|
253
|
-
rubygems_version:
|
|
231
|
+
rubygems_version: 2.6.2
|
|
254
232
|
signing_key:
|
|
255
|
-
specification_version:
|
|
233
|
+
specification_version: 4
|
|
256
234
|
summary: Fork of permalink_fu used at Teambox
|
|
257
|
-
test_files:
|
|
258
|
-
- test/permalink_fu_test.rb
|
|
259
|
-
- test/test_helper.rb
|
|
235
|
+
test_files: []
|
data/test/test_helper.rb
DELETED