stringex 2.2.2 → 2.3.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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NDFjMTk3NzM4MjA3YjNjYWYzNzVlYTNhMmU5M2IyNDM1YTAxZDY0OQ==
4
+ NjA4ZGNmOGZiZGNiY2VkNTIwYTg2NGY1MjVmNGIwN2NmZDRhNTRkNg==
5
5
  data.tar.gz: !binary |-
6
- OTNhMjhlZmYwYTFjN2E3MmI3ZmQyZDIxNmYwZGQ0NTU3ZjhmNTVmZg==
6
+ NDQ5NTlmMTU2MTgxYTA1OTRkMmRmMGE5YTllOTI1NGQwMDNiODYyYw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- MjE0YjM3ZDI5NzA1ZWQ4YmI1ZDAwNTMzYWY0MzlhMjFlNWVkYmQ4YzViOWUw
10
- MjRjOTQ5ODBmNzE1YTZmYjg2NGZlMDg5MDg0MDgwOWFhZjcxYTNlNDdmMTE1
11
- OGIyN2VjN2UyODk2N2IxNzM1YjdiZjYwOWZhZjUzYWYyM2Y2NTY=
9
+ YjNjMDc2N2QxODJhODJhZWVlNDBiMjkwODBhNWMwODlhNTEwODM4ODVlMWEy
10
+ MGI4OTU4NzhiY2EyYTM3OTE4Y2E5YzQwZTFmYzc5NGE1Nzk0YzYxYmFjOGIw
11
+ Y2NlODI0Njg2NzQ3NWUzZGNiYWQwN2EzOGI5ZDc3Y2UxODk3MzE=
12
12
  data.tar.gz: !binary |-
13
- MDZmYTE4OTIzZGIyYTQ1ZTEwNzY5MTIyZTVkNTY0YmY3YmM3ZWNmMTQ1MzEw
14
- MzQ5NzM1MTBlMzAyYmM4N2ViNTQwMzFmNGIwNTEzZGE3MzQyYzEyOTlmNDI5
15
- ZDFlNmU4ODRhNzQ5ZWVjNTFjM2JkMjYxM2UzOWI2MmRlYTQxMzA=
13
+ NTUxYjg0NDExOTk5OTk4OGE0NmZmZmE4NDY0OTM1MDkzYjZlMWUwOTY1Njhl
14
+ ZGI1M2QxM2I0MDAwMzdlNzNhNjJiNjY4NGNiNGNmZTc2MGNhZGI5Y2E3NTIz
15
+ NTVjZGM3MzUwOTU1MmZkYWFlNTIwOWY1MDg5MmZkNDM2MTc0YzE=
data/README.rdoc CHANGED
@@ -13,7 +13,8 @@ This library is designed to create URI-friendly representations of an attribute,
13
13
  # Inside your model
14
14
  acts_as_url :title
15
15
 
16
- which will populate the <tt>url</tt> attribute on the object with the converted contents of the <tt>title</tt> attribute. This behavior can be customized by adding the following options to the arguments of the <tt>acts_as_url</tt> method:
16
+ which will populate the <tt>url</tt> attribute on the object with the converted contents of the <tt>title</tt> attribute.
17
+ <tt>acts_as_url</tt> takes the following options:
17
18
 
18
19
  <tt>:url_attribute</tt>:: The name of the attribute to use for storing the generated url string.
19
20
  Default is <tt>:url</tt>
@@ -30,6 +31,11 @@ which will populate the <tt>url</tt> attribute on the object with the converted
30
31
  <tt>:limit</tt>:: If set, will limit length of url generated. Default is nil.
31
32
  <tt>:truncate_words</tt>:: Used with :limit. If set to false, the url will be truncated to the last
32
33
  whole word before the limit was reached. Default is true.
34
+ <tt>:blacklist</tt>:: List of urls that should not be allowed. Default is <tt>%w{new}</tt> [which avoids confusion
35
+ on urls like <tt>/documents/new</tt>].
36
+ <tt>:blacklist_policy</tt>:: Proc or lambda defining new naming behavior when blacklisted urls are encountered.
37
+ Default converts <tt>/documents/new</tt> to </tt>/documents/new-document</tt>.
38
+
33
39
 
34
40
  In order to use the generated url attribute, you will probably want to override <tt>to_param</tt> like so, in your Model:
35
41
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.2
1
+ 2.3.0
@@ -22,6 +22,7 @@ module Stringex
22
22
  self.instance = instance
23
23
 
24
24
  handle_url!
25
+ handle_blacklisted_url!
25
26
  handle_duplicate_url! unless settings.allow_duplicates
26
27
  end
27
28
 
@@ -132,6 +133,12 @@ module Stringex
132
133
  write_url_attribute base_url
133
134
  end
134
135
 
136
+ def handle_blacklisted_url!
137
+ return unless settings.blacklist.to_set.include?(base_url)
138
+ self.base_url = settings.blacklist_policy.call(instance, base_url)
139
+ write_url_attribute base_url
140
+ end
141
+
135
142
  def instance_from_db
136
143
  instance.class.find(instance.id)
137
144
  end
@@ -15,7 +15,7 @@ module Stringex
15
15
  :force_downcase,
16
16
  :limit,
17
17
  :replace_whitespace_with,
18
- :truncate_words,
18
+ :truncate_words
19
19
  ].inject(Hash.new){|m, x| m[x] = settings.send(x); m}
20
20
  end
21
21
 
@@ -39,8 +39,12 @@ module Stringex
39
39
  :scope_for_url => nil,
40
40
  :sync_url => false,
41
41
  :url_attribute => "url",
42
+ :blacklist => %w[new],
43
+ :blacklist_policy => lambda { |instance, url|
44
+ "#{url}-#{instance.class.to_s.downcase}"
45
+ }
42
46
  }.merge(Stringex::Configuration::StringExtensions.new.default_settings)
43
47
  end
44
48
  end
45
49
  end
46
- end
50
+ end
data/stringex.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "stringex"
8
- s.version = "2.2.2"
8
+ s.version = "2.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Russell Norris"]
12
- s.date = "2014-03-10"
12
+ s.date = "2014-03-11"
13
13
  s.description = "Some [hopefully] useful extensions to Ruby's String class. Stringex is made up of three libraries: ActsAsUrl [permalink solution with better character translation], Unidecoder [Unicode to ASCII transliteration], and StringExtensions [miscellaneous helper methods for the String class]."
14
14
  s.email = "rsl@luckysneaks.com"
15
15
  s.extra_rdoc_files = [
@@ -20,6 +20,38 @@ class ActsAsUrlIntegrationTest < Test::Unit::TestCase
20
20
  assert_equal "unique-1", @other_doc.url
21
21
  end
22
22
 
23
+ def test_should_avoid_blacklist
24
+ @doc = Document.create(:title => "New")
25
+ @other_doc = Document.create(:title => "new")
26
+ assert_equal "new-document", @doc.url
27
+ assert_equal "new-document-1", @other_doc.url
28
+ end
29
+
30
+ def test_should_allow_customizing_blacklist
31
+ Document.class_eval do
32
+ # Un-blacklisting 'new' isn't advisable
33
+ acts_as_url :title, :blacklist => %w{special}
34
+ end
35
+
36
+ @doc = Document.create(:title => "New")
37
+ @other_doc = Document.create(:title => "Special")
38
+ assert_equal 'new', @doc.url
39
+ assert_equal 'special-document', @other_doc.url
40
+ end
41
+
42
+ def test_should_allow_customizing_blacklist_policy
43
+ Document.class_eval do
44
+ acts_as_url :title, :blacklist_policy => Proc.new(){|instance, url|
45
+ "#{url}-customized"
46
+ }
47
+ end
48
+
49
+ @doc = Document.create(:title => "New")
50
+ @other_doc = Document.create(:title => "New")
51
+ assert_equal 'new-customized', @doc.url
52
+ assert_equal 'new-customized-1', @other_doc.url
53
+ end
54
+
23
55
  def test_should_create_unique_url_when_partial_url_already_exists
24
56
  @doc = Document.create(:title => "House Farms")
25
57
  @other_doc = Document.create(:title => "House Farm")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stringex
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Russell Norris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-10 00:00:00.000000000 Z
11
+ date: 2014-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jeweler