rtopia 0.1.1 → 0.2.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 +1 -0
- data/VERSION +1 -1
- data/lib/rtopia.rb +46 -7
- data/rtopia.gemspec +3 -3
- data/test/helper.rb +1 -0
- data/test/test_rtopia.rb +18 -0
- metadata +5 -12
data/.gitignore
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/rtopia.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'cgi'
|
3
|
+
|
1
4
|
module Rtopia
|
2
5
|
def self.R(*args)
|
3
6
|
@rtopia ||= Object.new.extend(self)
|
4
|
-
|
5
7
|
@rtopia.R(*args)
|
6
8
|
end
|
7
9
|
|
8
|
-
#
|
9
|
-
# R will use it's :to_param, then :id (if ruby19), then :to_s
|
10
|
-
#
|
11
|
-
# Examples:
|
10
|
+
# Usage:
|
12
11
|
#
|
13
12
|
# R(:items) # => /items
|
14
13
|
#
|
@@ -17,15 +16,55 @@ module Rtopia
|
|
17
16
|
# R(@person, :posts) # => '/john-doe/posts'
|
18
17
|
# R(@person, :posts, :replied) # => '/john-doe/posts/replied'
|
19
18
|
#
|
20
|
-
# @entry = Entry.create # has an id of 1001 for example
|
19
|
+
# @entry = Entry.create # has an id of 1001 for example and Ruby1.9
|
21
20
|
# R(@entry) # => '/1001'
|
22
21
|
# R(:entry, @entry) # => '/entry/1001'
|
23
22
|
#
|
23
|
+
# R(:search, :q => 'Ruby', :page => 1) => '/search?q=Ruby&page=1'
|
24
|
+
# R(:q => 'Ruby', :page => 1) => '?q=Ruby&page=1'
|
25
|
+
# R(:q => ['first, 'second']) => '?q[]=first&q[]=second'
|
26
|
+
# R(:user => { :lname => 'Doe', :fname => 'John' })
|
27
|
+
# => '?user[lname]=Doe&user[fname]=John'
|
28
|
+
#
|
24
29
|
def R(*args)
|
25
|
-
args.
|
30
|
+
hash = args.last.is_a?(Hash) ? args.pop : {}
|
31
|
+
|
32
|
+
# No args, so we opt to make ?q=Ruby&page=1 style URIs
|
33
|
+
if hash.any? and args.empty?
|
34
|
+
'?' + query_string(hash)
|
35
|
+
else
|
36
|
+
r = args.unshift('/').map { |arg| to_param(arg) }.join('/').squeeze('/')
|
37
|
+
if hash.any?
|
38
|
+
r << '?'
|
39
|
+
r << query_string(hash)
|
40
|
+
end
|
41
|
+
r
|
42
|
+
end
|
26
43
|
end
|
27
44
|
|
28
45
|
private
|
46
|
+
def query_string(hash)
|
47
|
+
hash.inject([]) { |arr, (key, value)|
|
48
|
+
if value.is_a?(Array)
|
49
|
+
value.each do |e|
|
50
|
+
arr << to_query("#{key}[]", e)
|
51
|
+
end
|
52
|
+
arr
|
53
|
+
elsif value.is_a?(Hash)
|
54
|
+
value.each do |namespace, deeper|
|
55
|
+
arr << to_query("#{key}[#{namespace}]", deeper)
|
56
|
+
end
|
57
|
+
arr
|
58
|
+
else
|
59
|
+
arr << to_query(key, value)
|
60
|
+
end
|
61
|
+
}.join('&')
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_query(k, v)
|
65
|
+
'%s=%s' % [CGI.escape(k.to_s), URI.escape(to_param(v))]
|
66
|
+
end
|
67
|
+
|
29
68
|
# Primary difference of this method is that it checks if
|
30
69
|
# the passed object has an :id method
|
31
70
|
# after checking for a :to_param
|
data/rtopia.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rtopia}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Sinefunc"]
|
12
|
-
s.date = %q{2010-04-
|
12
|
+
s.date = %q{2010-04-25}
|
13
13
|
s.description = %q{For use anywhere you have objects with to_params, ids, or just to_s's}
|
14
14
|
s.email = %q{sinefunc@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -31,7 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.homepage = %q{http://github.com/sinefunc/rtopia}
|
32
32
|
s.rdoc_options = ["--charset=UTF-8"]
|
33
33
|
s.require_paths = ["lib"]
|
34
|
-
s.rubygems_version = %q{1.3.
|
34
|
+
s.rubygems_version = %q{1.3.5}
|
35
35
|
s.summary = %q{A cute helper for route generation}
|
36
36
|
s.test_files = [
|
37
37
|
"test/helper.rb",
|
data/test/helper.rb
CHANGED
data/test/test_rtopia.rb
CHANGED
@@ -60,4 +60,22 @@ class TestRtopia < Test::Unit::TestCase
|
|
60
60
|
def test_Rtopia_R_is_calleable_directly
|
61
61
|
assert_equal '/items/yeah/boi', Rtopia.R(:items, :yeah, :boi)
|
62
62
|
end
|
63
|
+
|
64
|
+
def test_Rtopia_R_with_just_hash_returns_query_string
|
65
|
+
assert_equal '?q=Ruby&page=1', Rtopia.R(:q => 'Ruby', :page => 1)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_Rtopia_R_with_search_then_hash_returns_search_with_query_string
|
69
|
+
assert_equal '/search?q=Ruby&page=1', R(:search, :q => 'Ruby', :page => 1)
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_Rtopia_R_of_array_produces_empty_brackets
|
73
|
+
assert_equal '/search?q%5B%5D=first&q%5B%5D=second',
|
74
|
+
R(:search, :q => ['first', 'second'])
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_Rtopia_R_of_nested_hash_produces_namespaced_hash
|
78
|
+
assert_equal '/users?user%5Blname%5D=Doe&user%5Bfname%5D=John',
|
79
|
+
R(:users, :user => { :lname => 'Doe', :fname => 'John' })
|
80
|
+
end
|
63
81
|
end
|
metadata
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rtopia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
- 1
|
9
|
-
version: 0.1.1
|
4
|
+
version: 0.2.0
|
10
5
|
platform: ruby
|
11
6
|
authors:
|
12
7
|
- Sinefunc
|
@@ -14,7 +9,7 @@ autorequire:
|
|
14
9
|
bindir: bin
|
15
10
|
cert_chain: []
|
16
11
|
|
17
|
-
date: 2010-04-
|
12
|
+
date: 2010-04-25 00:00:00 +08:00
|
18
13
|
default_executable:
|
19
14
|
dependencies: []
|
20
15
|
|
@@ -51,20 +46,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
51
46
|
requirements:
|
52
47
|
- - ">="
|
53
48
|
- !ruby/object:Gem::Version
|
54
|
-
segments:
|
55
|
-
- 0
|
56
49
|
version: "0"
|
50
|
+
version:
|
57
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
52
|
requirements:
|
59
53
|
- - ">="
|
60
54
|
- !ruby/object:Gem::Version
|
61
|
-
segments:
|
62
|
-
- 0
|
63
55
|
version: "0"
|
56
|
+
version:
|
64
57
|
requirements: []
|
65
58
|
|
66
59
|
rubyforge_project:
|
67
|
-
rubygems_version: 1.3.
|
60
|
+
rubygems_version: 1.3.5
|
68
61
|
signing_key:
|
69
62
|
specification_version: 3
|
70
63
|
summary: A cute helper for route generation
|