handler 0.8.0 → 0.9.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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4e1e6c53663ede3c98f55892c9cc63eb86ec9e78
4
+ data.tar.gz: 2446f113f9b31c486007e8a033cfe6529ba8f97e
5
+ SHA512:
6
+ metadata.gz: 72c3cc99324f5031b926e606ccc1727d9a35d549077ee824e83418cc708da0a014873e2356dba4cc051883c738831be369aa9f453ec10565401a874b3274262f
7
+ data.tar.gz: 6a227d82f710b2e4d176a5dcbce4105114642984fbc2597d4891462bf57cc8c08abbb0faa1478f30dbe57fbcdfe72a4faf2fc240c14cb29bcdaa3badf8f0c642
@@ -2,6 +2,9 @@
2
2
 
3
3
  Per-release changes to Handler.
4
4
 
5
+ == 0.9.0 (2016 Sep 5)
6
+
7
+ Compatibility with ActiveRecord 4+ (use new AR Query Interface).
5
8
 
6
9
  == 0.8.0 (2009 Oct 12)
7
10
 
@@ -1,5 +1,7 @@
1
1
  = Handler
2
2
 
3
+ <b>Handler is currently compatible with Rails 3.x, 4.x, and 5.x.</b>
4
+
3
5
  Handler is a Rails plugin that generates handles (filesystem- and URL-friendly names) for ActiveRecord models based on a given attribute or method. For example, in your model:
4
6
 
5
7
  handle_based_on :title
data/Rakefile CHANGED
@@ -41,7 +41,7 @@ task :test => :check_dependencies
41
41
 
42
42
  task :default => :test
43
43
 
44
- require 'rake/rdoctask'
44
+ require 'rdoc/task'
45
45
  Rake::RDocTask.new do |rdoc|
46
46
  if File.exist?('VERSION')
47
47
  version = File.read('VERSION')
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.9.0
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{handler}
8
- s.version = "0.8.0"
8
+ s.version = "0.9.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alex Reisner"]
@@ -36,9 +36,13 @@ Gem::Specification.new do |s|
36
36
  s.summary = %q{Handler generates filesystem- and URL-friendly names for ActiveRecord models.}
37
37
  s.test_files = [
38
38
  "test/handler_test.rb",
39
- "test/test_helper.rb"
39
+ "test/test_helper.rb"
40
40
  ]
41
41
 
42
+ s.add_dependency 'activesupport', '>= 3.0'
43
+ s.add_dependency 'activerecord', '>= 3.0'
44
+ s.add_development_dependency 'minitest'
45
+
42
46
  if s.respond_to? :specification_version then
43
47
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
44
48
  s.specification_version = 3
@@ -1,16 +1,16 @@
1
1
  module Handler
2
-
2
+
3
3
  ##
4
4
  # Included hook: extend including class.
5
5
  #
6
6
  def self.included(base)
7
7
  base.extend ClassMethods
8
8
  end
9
-
9
+
10
10
  ##
11
11
  # Transliterate a string: change accented Unicode characters to ASCII
12
12
  # approximations. Tries several methods, attempting the best first:
13
- #
13
+ #
14
14
  # 1. unidecode, if installed (http://rubyforge.org/projects/unidecode)
15
15
  # 2. iconv (included with Ruby, doesn't work with all Ruby versions)
16
16
  # 3. normalize, then remove un-normalizable characters
@@ -21,7 +21,7 @@ module Handler
21
21
  transliterate_with_normalization(string) or
22
22
  string
23
23
  end
24
-
24
+
25
25
  ##
26
26
  # Transliterate a string with the unidecode library.
27
27
  # Return nil if unsuccessful (eg, library not available).
@@ -34,7 +34,7 @@ module Handler
34
34
  nil
35
35
  end
36
36
  end
37
-
37
+
38
38
  ##
39
39
  # Transliterate a string with the iconv library.
40
40
  # Return nil if unsuccessful (eg, library not available).
@@ -46,7 +46,16 @@ module Handler
46
46
  nil
47
47
  end
48
48
  end
49
-
49
+
50
+ ##
51
+ # Transliterate a string using multibyte normalization,
52
+ # then remove remaining non-ASCII characters. Taken from
53
+ # <tt>ActiveSupport::Inflector.transliterate</tt>.
54
+ #
55
+ def self.transliterate_with_normalization(string)
56
+ string.mb_chars.normalize.gsub(/[^\x00-\x7F]+/, '').to_s
57
+ end
58
+
50
59
  ##
51
60
  # Generate a handle from a string.
52
61
  #
@@ -59,10 +68,11 @@ module Handler
59
68
  str = str.gsub('&', ' and ') # add space for, e.g., "Y&T"
60
69
  str = str.delete('.\'"') # no space
61
70
  str = str.gsub(/\W/, ' ') # space
71
+ str = str.strip
62
72
  str = str.gsub(/ +/, separator)
63
- str
73
+ str
64
74
  end
65
-
75
+
66
76
  ##
67
77
  # Get the next handle in the sequence (for avoiding duplicates).
68
78
  #
@@ -73,22 +83,13 @@ module Handler
73
83
  handle + separator + "2"
74
84
  end
75
85
  end
76
-
77
- ##
78
- # Transliterate a string using multibyte normalization,
79
- # then remove remaining non-ASCII characters. Taken from
80
- # <tt>ActiveSupport::Inflector.transliterate</tt>.
81
- #
82
- def self.transliterate_with_normalization(string)
83
- string.mb_chars.normalize.gsub(/[^\x00-\x7F]+/, '').to_s
84
- end
85
-
86
+
86
87
  module ClassMethods
87
-
88
+
88
89
  ##
89
90
  # Declare that a model generates a handle based on
90
91
  # a given attribute or method. Options include:
91
- #
92
+ #
92
93
  # <tt>:separator</tt> - character to place between words
93
94
  # <tt>:store</tt> - attribute in which to store handle
94
95
  # <tt>:unique</tt> - generate a handle which is unique among all records
@@ -98,22 +99,33 @@ module Handler
98
99
  options[:write_to] ||= :handle
99
100
  options[:unique] = true if options[:unique].nil?
100
101
 
101
- ##
102
- # Generate a URL-friendly name.
103
- #
102
+ ##
103
+ # Generate a URL-friendly name.
104
+ #
104
105
  define_method :generate_handle do
105
106
  h = Handler.generate_handle(send(attribute), options[:separator])
106
107
  if options[:unique]
107
-
108
+
109
+ # generate a condition for finding an existing record with a
110
+ # given handle
111
+ find_dupe = lambda{ |h|
112
+ conds = ["#{options[:write_to]} = ?", h]
113
+ unless new_record?
114
+ conds[0] << " AND id != ?"
115
+ conds << id
116
+ end
117
+ conds
118
+ }
119
+
108
120
  # increase number while *other* records exist with the same handle
109
121
  # (record might be saved and should keep its handle)
110
- while self.class.all(:conditions => ["#{options[:write_to]} = ? AND id != ?", h, id]).size > 0
122
+ while self.class.where(find_dupe.call(h)).size > 0
111
123
  h = Handler.next_handle(h, options[:separator])
112
124
  end
113
125
  end
114
126
  h
115
127
  end
116
-
128
+
117
129
  ##
118
130
  # Assign the generated handle to the specified attribute.
119
131
  #
@@ -24,7 +24,7 @@ class HandlerTest < ActiveSupport::TestCase
24
24
  ".38 Special" => "38_special",
25
25
  "Guns N' Roses" => "guns_n_roses",
26
26
  "The Rossington-Collins Band" => "the_rossington_collins_band"
27
-
27
+
28
28
  }.each do |s,t|
29
29
  b.name = s
30
30
  assert_equal t, b.generate_handle
@@ -37,19 +37,19 @@ class HandlerTest < ActiveSupport::TestCase
37
37
  "Y&T" => "y_and_t",
38
38
  "Huey Lewis & the News" => "huey_lewis_and_the_news",
39
39
  "Emerson, Lake & Palmer" => "emerson_lake_and_palmer"
40
-
40
+
41
41
  }.each do |s,t|
42
42
  b.name = s
43
43
  assert_equal t, b.generate_handle
44
44
  end
45
45
  end
46
-
46
+
47
47
  test "next handle" do
48
48
  assert_equal "banana_boat_2", Handler.next_handle("banana_boat", "_")
49
49
  assert_equal "banana-boat-3", Handler.next_handle("banana-boat-2", "-")
50
50
  assert_equal "banana-boat-12", Handler.next_handle("banana-boat-11", "-")
51
51
  end
52
-
52
+
53
53
  test "unique handle generation" do
54
54
  p = Person.new
55
55
  p.name = "Captain Beefheart"
@@ -62,14 +62,17 @@ end
62
62
  class ActiveRecordSimulator
63
63
  include Handler
64
64
  attr_accessor :name
65
-
65
+
66
66
  # simulate id method
67
67
  def id; 123; end
68
68
 
69
- # simulate ActiveRecord::Base.all method;
69
+ # simulate new_record? method
70
+ def new_record?; true; end
71
+
72
+ # simulate ActiveRecord::Base.where method;
70
73
  # needed for testing whether records exist with a given handle
71
- def self.all(options)
72
- @existing_handles.include?(options[:conditions][1]) ? [nil, nil] : []
74
+ def self.where(options)
75
+ @existing_handles.include?(options[1]) ? [nil, nil] : []
73
76
  end
74
77
  end
75
78
 
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'active_support'
3
3
  require 'active_support/test_case'
4
- require 'test/unit'
4
+ require 'minitest/autorun'
5
5
 
6
6
  # required to avoid errors
7
7
  module ActiveRecord
metadata CHANGED
@@ -1,29 +1,24 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: handler
3
- version: !ruby/object:Gem::Version
4
- version: 0.8.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.0
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Alex Reisner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
-
12
- date: 2009-10-13 00:00:00 -04:00
13
- default_executable:
11
+ date: 2016-09-04 00:00:00.000000000 Z
14
12
  dependencies: []
15
-
16
- description: Handler is a Rails plugin that generates handles (filesystem- and URL-friendly names) for ActiveRecord models based on a given attribute or method.
13
+ description: Handler is a Rails plugin that generates handles (filesystem- and URL-friendly
14
+ names) for ActiveRecord models based on a given attribute or method.
17
15
  email: alex@alexreisner.com
18
16
  executables: []
19
-
20
17
  extensions: []
21
-
22
- extra_rdoc_files:
18
+ extra_rdoc_files:
23
19
  - LICENSE
24
20
  - README.rdoc
25
- files:
26
- - .gitignore
21
+ files:
27
22
  - CHANGELOG.rdoc
28
23
  - LICENSE
29
24
  - README.rdoc
@@ -34,34 +29,27 @@ files:
34
29
  - lib/handler.rb
35
30
  - test/handler_test.rb
36
31
  - test/test_helper.rb
37
- has_rdoc: true
38
32
  homepage: http://github.com/alexreisner/handler
39
33
  licenses: []
40
-
34
+ metadata: {}
41
35
  post_install_message:
42
- rdoc_options:
43
- - --charset=UTF-8
44
- require_paths:
36
+ rdoc_options: []
37
+ require_paths:
45
38
  - lib
46
- required_ruby_version: !ruby/object:Gem::Requirement
47
- requirements:
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
48
41
  - - ">="
49
- - !ruby/object:Gem::Version
50
- version: "0"
51
- version:
52
- required_rubygems_version: !ruby/object:Gem::Requirement
53
- requirements:
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
54
46
  - - ">="
55
- - !ruby/object:Gem::Version
56
- version: "0"
57
- version:
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
58
49
  requirements: []
59
-
60
50
  rubyforge_project:
61
- rubygems_version: 1.3.5
51
+ rubygems_version: 2.5.1
62
52
  signing_key:
63
- specification_version: 3
53
+ specification_version: 4
64
54
  summary: Handler generates filesystem- and URL-friendly names for ActiveRecord models.
65
- test_files:
66
- - test/handler_test.rb
67
- - test/test_helper.rb
55
+ test_files: []
data/.gitignore DELETED
@@ -1,5 +0,0 @@
1
- *.sw?
2
- .DS_Store
3
- coverage
4
- rdoc
5
- pkg