baptist 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.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .DS_Store
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm 1.9.2@baptist --create
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in baptist.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Niklas Holmgren, Sutajio
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ Generates a well-formed and unique URI from an array of strings.
2
+
3
+ Usage
4
+ -----
5
+
6
+ Baptist.generate('Arthur Russell') => 'Arthur-Russell'
7
+ Baptist.generate('Arthur Russell', :space => '_') => 'Arthur_Russell'
8
+ Baptist.generate(['Arthur Russell', 'Calling Out of Context']) => 'Arthur-Russell/Calling-Out-of-Context'
9
+
10
+ Percent encoding
11
+ ----------------
12
+
13
+ Baptist will percent encode any character (except the delimiter characters explicitly added by Baptist) that is not an unreserved URI character according to RFC3986.
14
+
15
+ Uniqueness
16
+ ----------
17
+
18
+ To guarantee the generated URI is unique:
19
+
20
+ Baptist.generate('Arthur Russell', :multiplier => '*') do |uri|
21
+ Resource.find_by_uri(uri)
22
+ end
23
+
24
+ Will take the <code>:multiplier</code> character and multiply it for each time
25
+ the block returns <code>false</code> and add that to the end of the URI. So if
26
+ there were three name collisions when running the code above the resulting
27
+ URI would be <code>'Arthur-Russell-\*\*\*'</code>.
28
+
29
+ The default multiplier is simply the Integer 1, which will result in an
30
+ incrementing number being added to the end of the URI.
31
+
32
+ Options
33
+ -------
34
+
35
+ * <code>:space</code> - Space character (default: '-')
36
+ * <code>:separator</code> - Separator character (default: '/')
37
+ * <code>:multiplier</code> - The object to multiply with to find a unique URI (default: 1)
38
+ * <code>:encoding</code> - Force this encoding (default: 'UTF-8')
39
+
40
+ Author
41
+ ------
42
+
43
+ Baptist was created by Niklas Holmgren (niklas@sutajio.se) and released under
44
+ the MIT license.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task :default => [:test]
4
+
5
+ task :test do
6
+ Dir.glob('test/**/*_test.rb').each do |file|
7
+ require File.expand_path(file)
8
+ end
9
+ end
data/baptist.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "baptist/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "baptist"
7
+ s.version = Baptist::VERSION
8
+ s.authors = ["Niklas Holmgren"]
9
+ s.email = ["niklas@sutajio.se"]
10
+ s.homepage = "https://github.com/sutajio/baptist"
11
+ s.summary = %q{A tool for generating unique and well-formed URIs.}
12
+ s.description = %q{Baptist creates well-formed relative URIs from a set of strings.}
13
+
14
+ s.rubyforge_project = "baptist"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
@@ -0,0 +1,3 @@
1
+ module Baptist
2
+ VERSION = "1.0.0"
3
+ end
data/lib/baptist.rb ADDED
@@ -0,0 +1,111 @@
1
+ require "baptist/version"
2
+
3
+ # A tool for generating unique and well-formed URIs.
4
+ module Baptist
5
+
6
+ SEPARATOR = '/'
7
+ SPACE = '-'
8
+ MULTIPLIER = 1
9
+ ENCODING = 'UTF-8'
10
+
11
+ # Generates a well-formed and unique URI from an array of strings.
12
+ #
13
+ # === Usage
14
+ #
15
+ # Baptist.generate('Arthur Russell') # => 'Arthur-Russell'
16
+ # Baptist.generate('Arthur Russell', :space => '_') # => 'Arthur_Russell'
17
+ # Baptist.generate(['Arthur Russell', 'Calling Out of Context']) # => 'Arthur-Russell/Calling-Out-of-Context'
18
+ #
19
+ # === Uniqueness
20
+ #
21
+ # To guarantee the generated URI is unique:
22
+ #
23
+ # Baptist.generate('Arthur Russell', :multiplier => '*') do |uri|
24
+ # Resource.find_by_uri(uri)
25
+ # end
26
+ #
27
+ # Will take the <tt>:multiplier</tt> character and multiply it for each time
28
+ # the block returns <tt>false</tt> and add that to the end of the URI. So if
29
+ # there were three name collisions when running the code above the resulting
30
+ # URI would be 'Arthur-Russell-***'.
31
+ #
32
+ # The default multiplier is simply the Integer 1, which will result in an
33
+ # incrementing number being added to the end of the URI.
34
+ #
35
+ # === Options
36
+ #
37
+ # :space - Space character (default: '-')
38
+ # :separator - Separator character (default: '/')
39
+ # :multiplier - The object to multiply with to find a unique URI (default: 1)
40
+ # :encoding - Force this encoding (default: 'UTF-8')
41
+ #
42
+ def generate(names, options = {})
43
+ options = { :space => SPACE,
44
+ :separator => SEPARATOR,
45
+ :multiplier => MULTIPLIER,
46
+ :encoding => ENCODING }.merge(options)
47
+
48
+ names = names.is_a?(Array) ? names : [names]
49
+ names = names.map do |name|
50
+ escape(name, options)
51
+ end
52
+
53
+ uri = names.join(options[:separator]) +
54
+ (options[:modifier] ? "#{options[:space]}(#{escape(options[:modifier], options)})" : '')
55
+
56
+ if block_given?
57
+ (1..100).each do |i|
58
+ s = uri + options[:space] + (options[:multiplier] * i).to_s
59
+ if yield(s)
60
+ return s
61
+ end
62
+ end
63
+ end
64
+
65
+ uri
66
+ end
67
+ module_function :generate
68
+
69
+ protected
70
+
71
+ def escape(s, options = {})
72
+ s = encode(s, options[:encoding])
73
+ regexp = case
74
+ when RUBY_VERSION >= "1.9" && s.encoding === Encoding.find('UTF-8')
75
+ /([^ a-zA-Z0-9_.-]+)/u
76
+ else
77
+ /([^ a-zA-Z0-9_.-]+)/n
78
+ end
79
+ s.to_s.gsub(regexp) {
80
+ '%'+$1.unpack('H2'*bytesize($1)).join('%').upcase
81
+ }.tr(' ', options[:space])
82
+ end
83
+ module_function :escape
84
+
85
+ # Converts string to given encoding; uses String#encode under Ruby 1.9 and
86
+ # does nothing under 1.8.
87
+ if ''.respond_to?(:encode)
88
+ def encode(s, encoding)
89
+ s.to_s.encode(encoding)
90
+ end
91
+ else
92
+ def encode(s, encoding)
93
+ s.to_s
94
+ end
95
+ end
96
+ module_function :encode
97
+
98
+ # Return the bytesize of String; uses String#size under Ruby 1.8 and
99
+ # String#bytesize under 1.9.
100
+ if ''.respond_to?(:bytesize)
101
+ def bytesize(string)
102
+ string.bytesize
103
+ end
104
+ else
105
+ def bytesize(string)
106
+ string.size
107
+ end
108
+ end
109
+ module_function :bytesize
110
+
111
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test/unit'
4
+ require 'baptist'
5
+
6
+ class BaptistTest < Test::Unit::TestCase
7
+
8
+ def test_spaces
9
+ assert_equal 'Arthur-Russell', Baptist.generate('Arthur Russell')
10
+ assert_equal 'Arthur_Russell', Baptist.generate('Arthur Russell', :space => '_')
11
+ assert_equal 'Maher-Shalal-Hash-Baz', Baptist.generate('Maher Shalal Hash Baz')
12
+ end
13
+
14
+ def test_multiple_names
15
+ assert_equal 'Arthur-Russell/Calling-Out-of-Context', Baptist.generate(['Arthur Russell', 'Calling Out of Context'])
16
+ assert_equal 'Arthur-Russell|Calling-Out-of-Context', Baptist.generate(['Arthur Russell', 'Calling Out of Context'], :separator => '|')
17
+ end
18
+
19
+ def test_strange_characters
20
+ assert_equal 'Tr%C3%A4d%2C-Gr%C3%A4s-och-Stenar', Baptist.generate('Träd, Gräs och Stenar')
21
+ end
22
+
23
+ def test_modifier
24
+ assert_equal 'Rihanna/Loud-(Explicit)', Baptist.generate(['Rihanna', 'Loud'], :modifier => 'Explicit')
25
+ end
26
+
27
+ def test_unique
28
+ assert_equal 'John-Doe-3', Baptist.generate('John Doe') {|uri| uri == 'John-Doe-3' }
29
+ assert_equal 'John-Doe-1000', Baptist.generate('John Doe', :multiplier => 10) {|uri| uri == 'John-Doe-1000' }
30
+ assert_equal 'John-Doe-***', Baptist.generate('John Doe', :multiplier => '*') {|uri| uri == 'John-Doe-***' }
31
+ end
32
+
33
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: ISO-8859-1
2
+
3
+ require 'test/unit'
4
+ require 'baptist'
5
+
6
+ class BaptistTest < Test::Unit::TestCase
7
+
8
+ def test_forces_utf_8
9
+ assert_equal 'Tr%C3%A4d-Gr%C3%A4s-och-Stenar', Baptist.generate('Tr�d Gr�s och Stenar')
10
+ end
11
+
12
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: baptist
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 1.0.0
6
+ platform: ruby
7
+ authors:
8
+ - Niklas Holmgren
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-12-15 00:00:00 Z
14
+ dependencies: []
15
+
16
+ description: Baptist creates well-formed relative URIs from a set of strings.
17
+ email:
18
+ - niklas@sutajio.se
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files: []
24
+
25
+ files:
26
+ - .gitignore
27
+ - .rvmrc
28
+ - Gemfile
29
+ - LICENSE
30
+ - README.md
31
+ - Rakefile
32
+ - baptist.gemspec
33
+ - lib/baptist.rb
34
+ - lib/baptist/version.rb
35
+ - test/baptist_test.rb
36
+ - test/encoding_test.rb
37
+ homepage: https://github.com/sutajio/baptist
38
+ licenses: []
39
+
40
+ post_install_message:
41
+ rdoc_options: []
42
+
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ requirements: []
58
+
59
+ rubyforge_project: baptist
60
+ rubygems_version: 1.8.11
61
+ signing_key:
62
+ specification_version: 3
63
+ summary: A tool for generating unique and well-formed URIs.
64
+ test_files:
65
+ - test/baptist_test.rb
66
+ - test/encoding_test.rb