link2 0.1.6 → 0.1.7
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/README.textile +44 -15
- data/Rakefile +2 -2
- data/TODO +15 -21
- data/lib/link2/brain.rb +31 -26
- data/lib/link2/helpers.rb +0 -26
- data/lib/link2/support.rb +1 -1
- data/lib/link2/version.rb +1 -1
- data/test/helpers_test.rb +90 -12
- data/test/support_test.rb +2 -1
- data/test/test_helper.rb +3 -1
- metadata +68 -33
data/README.textile
CHANGED
@@ -19,7 +19,7 @@ This is *not* a re-implementation of these helpers; rather it wraps these but pa
|
|
19
19
|
* *DRY* - based on specified arguments: Use what's know to make smart assumptions for more readable and maintainable view code.
|
20
20
|
* *I18n deluxe* - Lookup scoped translations based on action, model, etc., for more flexible translations - with lean defaults. Enhanced with some nifty interpolation features as well. Code first, translate later.
|
21
21
|
* *DOM Selectors* - Why defining DOM classes for RESTful links all the time when same patterns occur? Optionally DONE.
|
22
|
-
* *Stable* - Full test-coverage for stability. Unit + Rails integration tests, check: @
|
22
|
+
* *Stable* - Full test-coverage for stability. Unit + Rails integration tests, check: @59 tests: all passed@
|
23
23
|
* *Maintainable* - Well-documented code.
|
24
24
|
|
25
25
|
h2. Installation
|
@@ -116,18 +116,11 @@ h2. Usage
|
|
116
116
|
...
|
117
117
|
</pre>
|
118
118
|
|
119
|
-
|
119
|
+
Same works for @button@, and you also can optionally use the branded aliases: @link2@ and @button2@.
|
120
120
|
|
121
|
-
|
122
|
-
link :edit, [@post, @comment]
|
123
|
-
# => ::Link2::NotImplementedYetError, "case link(:action, [...]) not yet supported. Need to refactor some stuff."
|
124
|
-
</pre>
|
125
|
-
|
126
|
-
Same works for @button_to@, and you also can optionally use the branded aliases: @link2@ and @button2@.
|
121
|
+
h2. URL + HTML Options
|
127
122
|
|
128
|
-
|
129
|
-
|
130
|
-
Link2 link helpers accept options in the same way as the core helpers @link_to@/@button_to@: first @options@ (a.k.a. @url_options@) and then @html_options@. See the "Rails core UrlHelpers documentation":http://railsapi.com/doc/rails-v2.3.5/classes/ActionView/Helpers/UrlHelper.html#M002452 for details on this. Link2 helpers just pass any non-Link2-related options to the Rails core helpers. In other words no need to learn a new API; just pass the needed options like in the past.
|
123
|
+
Link2 link helpers accept options in the same way as the core helpers @link_to@ and @button_to@: first @options@ (a.k.a. @url_options@) and then @html_options@. See the "Rails core UrlHelpers documentation":http://railsapi.com/doc/rails-v2.3.5/classes/ActionView/Helpers/UrlHelper.html#M002452 for details on this. Link2 helpers just pass any non-Link2-related options to the Rails core helpers. In other words no need to learn a new API; just pass the needed options like in the past.
|
131
124
|
|
132
125
|
h2. Expected arguments (...but the examples should be enough)
|
133
126
|
|
@@ -248,13 +241,49 @@ This behavior is enabled by default but can be disabled just in case; preferably
|
|
248
241
|
end
|
249
242
|
</pre>
|
250
243
|
|
251
|
-
h2.
|
244
|
+
h2. The other fellows...
|
252
245
|
|
253
|
-
|
246
|
+
*@link_to_function@*
|
247
|
+
|
248
|
+
To get the Link2 features for @link_to_function@ - which is *deprecated in Rails 3* because of it's obtrusive nature (note: obtrusive should be avoided) - you can get such behaviour with Link2 (if you must) by specifying @:onclick@ HTML attribute like so:
|
249
|
+
|
250
|
+
<pre>
|
251
|
+
link :hello, :onclick => "alert('Hello world!')"
|
252
|
+
</pre>
|
253
|
+
|
254
|
+
*@link_to_remote@*
|
255
|
+
|
256
|
+
No Link2-wrapper for this one. Also, it's *deprecated in Rails 3* as well for same reasons as above. In Rails 3 it should be possible to call it like so:
|
257
|
+
|
258
|
+
<pre>
|
259
|
+
link :hello, say_hello_path(@world), :remote => true
|
260
|
+
</pre>
|
254
261
|
|
255
|
-
|
262
|
+
...but as Link2 is *not tested with Rails 3* yet; use the old-school @link_to@ for now.
|
256
263
|
|
257
|
-
|
264
|
+
*@link_to_if@ + @link_to_unless@*
|
265
|
+
|
266
|
+
I didn't extend the behavior for the helpers @link_to_if@ and @link_to_unless@ because I simply think they should not be used in Rails apps; my strong opinion is that they introduce unnecessary complexity in code and make it less readable. I also skipped @link_to_if_current@ because it's not very thorough implementation - even an extra URI slash make it confused, which is funny. Hate it, or LOVE IT.
|
267
|
+
|
268
|
+
h2. Inspiration
|
269
|
+
|
270
|
+
I really like the "declarative_authorization":http://github.com/stffn/declarative_authorization view helper DSL for checking permissions on models, and brought the pattern to the link helpers - they are like *ying & yang*:
|
271
|
+
|
272
|
+
<pre>
|
273
|
+
link(:edit, @account) if permitted_to?(:edit, @account)
|
274
|
+
</pre>
|
275
|
+
|
276
|
+
...but I usually mix it with an alias:
|
277
|
+
|
278
|
+
<pre>
|
279
|
+
link(:edit, @account) if can?(:edit, @account)
|
280
|
+
</pre>
|
281
|
+
|
282
|
+
Nice, huh? =)
|
283
|
+
|
284
|
+
h2. TODO
|
285
|
+
|
286
|
+
See "TODO":http://github.com/grimen/link2/blob/master/TODO
|
258
287
|
|
259
288
|
h2. License
|
260
289
|
|
data/Rakefile
CHANGED
@@ -13,11 +13,11 @@ require File.join(File.dirname(__FILE__), 'lib', 'link2', 'version')
|
|
13
13
|
# rake build
|
14
14
|
# sudo rake install
|
15
15
|
#
|
16
|
-
# == Git tag & push to origin/master
|
16
|
+
# == Git tag & push to origin/master and push gem to Rubygems.org:
|
17
17
|
#
|
18
18
|
# rake release
|
19
19
|
#
|
20
|
-
# == Release to
|
20
|
+
# == Release to Rubygems.org:
|
21
21
|
#
|
22
22
|
# rake gemcutter:release
|
23
23
|
#
|
data/TODO
CHANGED
@@ -1,26 +1,27 @@
|
|
1
1
|
TODO
|
2
2
|
|
3
|
-
|
3
|
+
* [FEATURE:] Fix action mapping procs to handle named scopes. Should work, but do not for some reason. =/
|
4
4
|
|
5
|
-
* Fix action mapping procs to
|
5
|
+
* [FEATURE:] Fix action mapping procs to receive session, params, etc in a options hash. My mocking/stubbing don't want to work. ='(
|
6
6
|
|
7
|
-
*
|
7
|
+
* [TEST:] Integration tests for namespaced controllers/models
|
8
8
|
|
9
|
-
*
|
9
|
+
* [DESIGN:] Link2::Brain#link_to_args MUST be refactored when the DSL is 100% settled. Not far from it, but feedback first.
|
10
10
|
|
11
|
-
|
11
|
+
* [DESIGN:] Merge #label_and_url_for_resource and #url_for_args
|
12
12
|
|
13
|
-
*
|
13
|
+
* [TEST:] ORM-tests: DataMapper, MongoMapper
|
14
14
|
|
15
|
-
|
15
|
+
* [COMPAT:] Check Rails 3 compatibility.
|
16
16
|
|
17
|
-
*
|
17
|
+
* [ENHANCEMENT:] Check with Rails routes (RouteSet) if current action is a :member or :collection:
|
18
18
|
|
19
|
-
|
19
|
+
link(:show) => link(:show, @post)
|
20
|
+
link(:index) => link(:index, Post)
|
20
21
|
|
21
|
-
|
22
|
+
NOT SURE:
|
22
23
|
|
23
|
-
*
|
24
|
+
* Make Link2 parse label and title-attribute for the link based on configuration: Link2.label_method = :to_s, Link2.attr_methods = {:title => :description}
|
24
25
|
|
25
26
|
* This works:
|
26
27
|
link_to x, :terms => link_to x, terms_path
|
@@ -30,15 +31,8 @@ TODO
|
|
30
31
|
|
31
32
|
The middle part (auto-detect route for :fraggle before resource :fraggle) maybe too abstract DSL, not sure.
|
32
33
|
|
34
|
+
* Add support for: #link_to_remote + #button_to_remote in Rails 2.x, with:
|
33
35
|
|
34
|
-
|
35
|
-
|
36
|
-
* Check with Rails routes (RouteSet) if current action is a :member or :collection, and look for resource vs. collection:
|
36
|
+
link(..., :remote => true)
|
37
37
|
|
38
|
-
|
39
|
-
link(:index) => link(@posts) => link(:index, @posts) => link("Index", @posts)
|
40
|
-
|
41
|
-
Current implementation is a bit dumber but should work okay: resource_or_collection = @post || @posts, where
|
42
|
-
@post is tried first. Maybe should be developers responsibility like now...
|
43
|
-
|
44
|
-
* Make Link2 parse label and title-attribute for the link based on configuration: Link2.label_method = :to_s, Link2.attr_methods = {:title => :description}
|
38
|
+
...or not: Maybe only support in Rails 3.
|
data/lib/link2/brain.rb
CHANGED
@@ -3,7 +3,8 @@
|
|
3
3
|
module Link2
|
4
4
|
module Brain
|
5
5
|
|
6
|
-
AutoDetectionFailed = Class.new(::
|
6
|
+
AutoDetectionFailed = Class.new(::ArgumentError)
|
7
|
+
NilArgument = Class.new(::ArgumentError)
|
7
8
|
|
8
9
|
URL_PATH_REGEX = /\//
|
9
10
|
CLASS_INSTANCE_STRING = /\#\<.*\:0x.*\>/
|
@@ -29,6 +30,8 @@ module Link2
|
|
29
30
|
html_options = args.pop if args.last.is_a?(Hash)
|
30
31
|
url_options = args.pop if args.last.is_a?(Hash)
|
31
32
|
|
33
|
+
raise NilArgument, "Passed argument is nil: #{args.inspect}." if args.any? { |arg| arg.nil? }
|
34
|
+
|
32
35
|
case args.size
|
33
36
|
when 0
|
34
37
|
raise ArgumentError, "No arguments specified. A least specify action or url."
|
@@ -46,8 +49,8 @@ module Link2
|
|
46
49
|
# link :new => link_to I18n.t(:new, ...), new_{auto_detected_resource}_path
|
47
50
|
# link :back => link_to I18n.t(:back, ...), (session[:return_to] || :back)
|
48
51
|
action = args.shift
|
49
|
-
|
50
|
-
|
52
|
+
label = self.localized_label(action, resource = nil, url_options)
|
53
|
+
resource = false if html_options && html_options.key?(:onclick) # false => do not auto-detect
|
51
54
|
url = self.url_for_args(action, resource, url_options)
|
52
55
|
elsif args.first.is_a?(Object)
|
53
56
|
# link @user => link_to I18n.t(:show, ...), user_path(@user)
|
@@ -66,36 +69,26 @@ module Link2
|
|
66
69
|
# link "Start", :home => link_to I18n.t(:start, ...), root_path
|
67
70
|
# link "Cancel", :back => link_to I18n.t(:cancel, ...), :back
|
68
71
|
label, action = args.slice!(0..1)
|
69
|
-
resource = nil
|
70
|
-
url = self.url_for_args(action, resource, url_options)
|
72
|
+
url = self.url_for_args(action, resource = nil, url_options)
|
71
73
|
elsif ::Link2::Support.resource_identifier_class?(args.second)
|
72
74
|
# link "New", :new => link_to "New", new_{auto_detected_resource}_path
|
73
75
|
# link "<<", :back => link_to "<<", (session[:return_to] || :back)
|
74
76
|
label, action = args.slice!(0..1)
|
75
|
-
|
76
|
-
url = self.url_for_args(action, resource, url_options)
|
77
|
+
url = self.url_for_args(action, resource = nil, url_options)
|
77
78
|
else
|
78
79
|
raise ArgumentError, "Invalid 2nd argument: #{args.inspect}"
|
79
80
|
end
|
80
81
|
elsif args.first.is_a?(Symbol)
|
81
|
-
# TODO: Implement support for aray of nested resources.
|
82
|
-
if args.second.is_a?(Array)
|
83
|
-
raise ::Link2::NotImplementedYetError, "case link(:action, [...]) not yet supported. Need to refactor some stuff."
|
84
|
-
end
|
85
|
-
|
86
82
|
if args.second.is_a?(String)
|
87
83
|
# link :new, new_post_path => link_to I18n.t(:new, ...), new_post_path
|
88
84
|
# link :back, root_path => link_to I18n.t(:back, ...), (session[:return_to] || :back)
|
89
85
|
action, url = args.slice!(0..1)
|
90
|
-
resource = nil
|
91
|
-
label = self.localized_label(action, resource, url_options)
|
86
|
+
label = self.localized_label(action, resource = nil, url_options)
|
92
87
|
elsif args.second.is_a?(Symbol) && ::Link2.url_for_mapping(args.second)
|
93
88
|
# link :start, :home => link_to I18n.t(:start, ...), root_path
|
94
89
|
# link :cancel, :back => link_to I18n.t(:cancel, ...), :back
|
95
90
|
key, action = args.slice!(0..1)
|
96
|
-
resource = nil
|
97
|
-
resource = self.auto_detect_resource || self.auto_detect_resource
|
98
|
-
label = self.localized_label(key, resource, url_options)
|
91
|
+
label = self.localized_label(key, resource = nil, url_options)
|
99
92
|
url = self.url_for_args(action, resource, url_options)
|
100
93
|
elsif ::Link2::Support.resource_identifier_class?(args.second)
|
101
94
|
# link :new, Post => link_to I18n.t(:new, ...), new_post_path
|
@@ -104,6 +97,11 @@ module Link2
|
|
104
97
|
action, resource = args.slice!(0..1)
|
105
98
|
label = self.localized_label(action, resource, url_options)
|
106
99
|
url = self.url_for_args(action, resource, url_options)
|
100
|
+
elsif args.second.is_a?(Array)
|
101
|
+
# link :kick, [:admin, @user] => link_to I18n.t(:show, ...), admin_user_path(@user)
|
102
|
+
action, resource = args.slice!(0..1)
|
103
|
+
url_options_with_action = url_options.present? ? url_options.merge(:action => action) : {:action => action}
|
104
|
+
label, url = self.label_and_url_for_resource(resource, url_options_with_action)
|
107
105
|
else
|
108
106
|
raise ArgumentError, "Invalid 2nd argument: #{args.inspect}"
|
109
107
|
end
|
@@ -113,16 +111,16 @@ module Link2
|
|
113
111
|
when 3
|
114
112
|
if args.first.is_a?(String)
|
115
113
|
if args.second.is_a?(Symbol)
|
116
|
-
# TODO: Implement support for aray of nested resources.
|
117
|
-
if args.third.is_a?(Array)
|
118
|
-
raise ::Link2::NotImplementedYetError, 'case link("Label", :action, [...]) not yet supported. Need to refactor some stuff.'
|
119
|
-
end
|
120
|
-
|
121
114
|
if ::Link2::Support.resource_identifier_class?(args.third)
|
122
115
|
# link "New", :new, Post => link_to "New", new_post_path
|
123
116
|
# link "Edit", :edit, @post => link_to "Edit", edit_post_path(@post)
|
124
117
|
label, action, resource = args.slice!(0..2)
|
125
118
|
url = self.url_for_args(action, resource, url_options)
|
119
|
+
elsif args.third.is_a?(Array)
|
120
|
+
# link "Kick", :kick, [:admin, @user] => link_to I18n.t(:show, ...), admin_user_path(@user)
|
121
|
+
label, action, resource = args.slice!(0..2)
|
122
|
+
url_options_with_action = url_options.present? ? url_options.merge(:action => action) : {:action => action}
|
123
|
+
url = self.label_and_url_for_resource(resource, url_options_with_action).last
|
126
124
|
else
|
127
125
|
raise ArgumentError, "Invalid 3rd argument: #{args.inspect}"
|
128
126
|
end
|
@@ -164,13 +162,18 @@ module Link2
|
|
164
162
|
#
|
165
163
|
# See documentation on +polymorphic_url+ for available core options.
|
166
164
|
#
|
167
|
-
def label_and_url_for_resource(
|
168
|
-
options
|
165
|
+
def label_and_url_for_resource(*args)
|
166
|
+
options = args.extract_options!.dup
|
167
|
+
resource = args.first
|
168
|
+
|
169
169
|
url_for_options = options.slice(*POLYMORPHIC_OPTION_KEYS).reverse_merge(:routing_type => :path)
|
170
170
|
i18n_options = options.except(url_for_options.keys)
|
171
|
+
|
171
172
|
last_resource = ::Link2::Support.extract_resource(resource)
|
173
|
+
action = options.delete(:action)
|
174
|
+
url_for_options[:action] = [:show, :index].include?(action) ? nil : action
|
172
175
|
|
173
|
-
label = self.localized_label(:show, last_resource, i18n_options)
|
176
|
+
label = self.localized_label(action || :show, last_resource, i18n_options)
|
174
177
|
url = polymorphic_url(resource, url_for_options)
|
175
178
|
|
176
179
|
[label, url]
|
@@ -200,7 +203,9 @@ module Link2
|
|
200
203
|
options = args.extract_options!.dup
|
201
204
|
action, resource = args
|
202
205
|
|
203
|
-
if resource
|
206
|
+
if resource == false # javascript onclick; disable resource auto-detection
|
207
|
+
::Link2::DEFAULT_LINK
|
208
|
+
elsif resource.is_a?(String) # url
|
204
209
|
resource
|
205
210
|
elsif resource.nil? && url = ::Link2.url_for_mapping(action, resource) # mapping
|
206
211
|
url
|
data/lib/link2/helpers.rb
CHANGED
@@ -5,10 +5,6 @@ module Link2
|
|
5
5
|
|
6
6
|
include ::Link2::Brain
|
7
7
|
|
8
|
-
def self.included(base)
|
9
|
-
include JavascriptLinkHelpers
|
10
|
-
end
|
11
|
-
|
12
8
|
# Enhanced +link_to+ helper.
|
13
9
|
#
|
14
10
|
# TODO: Documentation for this helper. For now the README should be sufficient.
|
@@ -31,27 +27,5 @@ module Link2
|
|
31
27
|
end
|
32
28
|
alias :button2 :button
|
33
29
|
|
34
|
-
# Rails 3-deprecations - unless +prototype_legacy_helper+-plugin.
|
35
|
-
|
36
|
-
module JavascriptLinkHelpers
|
37
|
-
def js_link(*args)
|
38
|
-
raise ::Link2::NotImplementedYetError
|
39
|
-
end
|
40
|
-
|
41
|
-
def js_button(*args)
|
42
|
-
raise ::Link2::NotImplementedYetError
|
43
|
-
end
|
44
|
-
|
45
|
-
def ajax_link(*args)
|
46
|
-
raise ::Link2::NotImplementedYetError
|
47
|
-
end
|
48
|
-
alias :remote_link :ajax_link
|
49
|
-
|
50
|
-
def ajax_button(*args)
|
51
|
-
raise ::Link2::NotImplementedYetError
|
52
|
-
end
|
53
|
-
alias :remote_button :ajax_button
|
54
|
-
end
|
55
|
-
|
56
30
|
end
|
57
31
|
end
|
data/lib/link2/support.rb
CHANGED
@@ -71,7 +71,7 @@ module Link2
|
|
71
71
|
# # => true
|
72
72
|
#
|
73
73
|
def resource_identifier_class?(object)
|
74
|
-
(object.is_a?(
|
74
|
+
(object.is_a?(Symbol) || self.record_class?(object))
|
75
75
|
end
|
76
76
|
|
77
77
|
# Check if passed object is an array for record instances, i.e. "collection".
|
data/lib/link2/version.rb
CHANGED
data/test/helpers_test.rb
CHANGED
@@ -35,6 +35,16 @@ class HelpersTest < ActionView::TestCase
|
|
35
35
|
assert_equal link_to('Hello', '#'), link('Hello')
|
36
36
|
end
|
37
37
|
|
38
|
+
test "link(label_or_action, :onclick => '...') should render link_to_function(label, 'javascript: ...')" do
|
39
|
+
if self.respond_to?(:link_to_function) # Note: Deprecated in Rails 3
|
40
|
+
assert_equal link_to_function('Hello', 'alert("hello")'), link('Hello', :onclick => 'alert("hello"); return false;')
|
41
|
+
assert_equal link_to_function('Hello', 'alert("hello")'), link(:hello, :onclick => 'alert("hello"); return false;')
|
42
|
+
end
|
43
|
+
|
44
|
+
assert_equal link_to('Hello', '#', :onclick => 'alert("hello"); return false;'), link('Hello', :onclick => 'alert("hello"); return false;')
|
45
|
+
assert_equal link_to('Hello', '#', :onclick => 'alert("hello"); return false;'), link(:hello, :onclick => 'alert("hello"); return false;')
|
46
|
+
end
|
47
|
+
|
38
48
|
test "auto-detecting resource: link(:action) should render link_to(t(:action, ...), @resource)" do
|
39
49
|
self.expects(:current_controller_name).with(nil).returns('fraggles').at_least_once
|
40
50
|
|
@@ -90,7 +100,7 @@ class HelpersTest < ActionView::TestCase
|
|
90
100
|
# assert_equal link_to("Show", "?"), link(::Fraggle) # test this stupid case?
|
91
101
|
end
|
92
102
|
|
93
|
-
test "link([@
|
103
|
+
test "link([@parent_resource, @resource]) should render link_to(t(:show, ...), polymorphic_path([@parent_resource, @resource]))" do
|
94
104
|
assert_equal link_to("Show", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}"), link([@mookey, @mookeys_cool_aid])
|
95
105
|
assert_equal link_to("Show", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}", ONE_HASH), link([@mookey, @mookeys_cool_aid], ONE_HASH)
|
96
106
|
assert_equal link_to("Show", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}", *TWO_HASHES), link([@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
@@ -159,11 +169,37 @@ class HelpersTest < ActionView::TestCase
|
|
159
169
|
assert_equal link_to("Edit", "/fraggles/#{@mookey.id}/edit", *TWO_HASHES), link(:edit, @mookey, *TWO_HASHES)
|
160
170
|
end
|
161
171
|
|
162
|
-
test "
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
172
|
+
test "should accept polymorphic resource array for valid actions" do
|
173
|
+
[:edit, :show, :kick, :index].each do |action|
|
174
|
+
assert_nothing_raised { link(action, [@mookey, @mookeys_cool_aid]) }
|
175
|
+
assert_nothing_raised { link(action, [@mookey, @mookeys_cool_aid], ONE_HASH) }
|
176
|
+
assert_nothing_raised { link(action, [@mookey, @mookeys_cool_aid], *TWO_HASHES) }
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
test "should raise the traditional error if generated route don't exists" do
|
181
|
+
assert_raise(NoMethodError) { link(:hug, [@mookey, @mookeys_cool_aid]) }
|
182
|
+
assert_raise(NoMethodError) { link(:hug, [@mookey, @mookeys_cool_aid], ONE_HASH) }
|
183
|
+
assert_raise(NoMethodError) { link(:hug, [@mookey, @mookeys_cool_aid], *TWO_HASHES) }
|
184
|
+
end
|
185
|
+
|
186
|
+
test "link(:action, [@a, @b]) should render link_to(t(:action, ...), polymorphic_path([@a, @b]), :action => :action)" do
|
187
|
+
assert_equal link_to("Edit", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/edit"), link(:edit, [@mookey, @mookeys_cool_aid])
|
188
|
+
assert_equal link_to("Edit", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/edit", ONE_HASH), link(:edit, [@mookey, @mookeys_cool_aid], ONE_HASH)
|
189
|
+
assert_equal link_to("Edit", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/edit", *TWO_HASHES), link(:edit, [@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
190
|
+
|
191
|
+
assert_equal link_to("Show", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}"), link(:show, [@mookey, @mookeys_cool_aid])
|
192
|
+
assert_equal link_to("Show", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}", ONE_HASH), link(:show, [@mookey, @mookeys_cool_aid], ONE_HASH)
|
193
|
+
assert_equal link_to("Show", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}", *TWO_HASHES), link(:show, [@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
194
|
+
|
195
|
+
assert_equal link_to("Kick", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/kick"), link(:kick, [@mookey, @mookeys_cool_aid])
|
196
|
+
assert_equal link_to("Kick", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/kick", ONE_HASH), link(:kick, [@mookey, @mookeys_cool_aid], ONE_HASH)
|
197
|
+
assert_equal link_to("Kick", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/kick", *TWO_HASHES), link(:kick, [@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
198
|
+
|
199
|
+
# QUESTION: Hum...should be a case?
|
200
|
+
# assert_equal link_to("Index", "/fraggles/#{@mookey.id}/cool_aids"), link(:index, [@mookey, @mookeys_cool_aid])
|
201
|
+
# assert_equal link_to("Index", "/fraggles/#{@mookey.id}/cool_aids", ONE_HASH), link(:index, [@mookey, @mookeys_cool_aid], ONE_HASH)
|
202
|
+
# assert_equal link_to("Index", "/fraggles/#{@mookey.id}/cool_aids", *TWO_HASHES), link(:index, [@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
167
203
|
end
|
168
204
|
|
169
205
|
test "auto-detecting resource: link(label, :action) should render link_to(label, @resource, :action => :action)" do
|
@@ -214,14 +250,56 @@ class HelpersTest < ActionView::TestCase
|
|
214
250
|
assert_equal link_to("Editish", "/fraggles/#{@mookey.id}/edit", *TWO_HASHES), link("Editish", :edit, @mookey, *TWO_HASHES)
|
215
251
|
end
|
216
252
|
|
217
|
-
test "
|
218
|
-
|
219
|
-
|
253
|
+
test "three arguments: should accept polymorphic resource array for valid actions" do
|
254
|
+
[:edit, :show, :kick, :index].each do |action|
|
255
|
+
assert_nothing_raised { link("", action, [@mookey, @mookeys_cool_aid]) }
|
256
|
+
assert_nothing_raised { link("", action, [@mookey, @mookeys_cool_aid], ONE_HASH) }
|
257
|
+
assert_nothing_raised { link("", action, [@mookey, @mookeys_cool_aid], *TWO_HASHES) }
|
258
|
+
end
|
220
259
|
end
|
221
260
|
|
222
|
-
test "
|
223
|
-
assert_raise(
|
224
|
-
assert_raise(
|
261
|
+
test "three arguments: should raise the traditional error if generated route don't exists" do
|
262
|
+
assert_raise(NoMethodError) { link("", :hug, [@mookey, @mookeys_cool_aid]) }
|
263
|
+
assert_raise(NoMethodError) { link("", :hug, [@mookey, @mookeys_cool_aid], ONE_HASH) }
|
264
|
+
assert_raise(NoMethodError) { link("", :hug, [@mookey, @mookeys_cool_aid], *TWO_HASHES) }
|
265
|
+
end
|
266
|
+
|
267
|
+
test "three arguments: link(:action, [@a, @b]) should render link_to(t(:action, ...), polymorphic_path([@a, @b]), :action => :action)" do
|
268
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/edit"), link("", :edit, [@mookey, @mookeys_cool_aid])
|
269
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/edit", ONE_HASH), link("", :edit, [@mookey, @mookeys_cool_aid], ONE_HASH)
|
270
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/edit", *TWO_HASHES), link("", :edit, [@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
271
|
+
|
272
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}"), link("", :show, [@mookey, @mookeys_cool_aid])
|
273
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}", ONE_HASH), link("", :show, [@mookey, @mookeys_cool_aid], ONE_HASH)
|
274
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}", *TWO_HASHES), link("", :show, [@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
275
|
+
|
276
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/kick"), link("", :kick, [@mookey, @mookeys_cool_aid])
|
277
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/kick", ONE_HASH), link("", :kick, [@mookey, @mookeys_cool_aid], ONE_HASH)
|
278
|
+
assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids/#{@mookeys_cool_aid.id}/kick", *TWO_HASHES), link("", :kick, [@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
279
|
+
|
280
|
+
# QUESTION: Hum...should be a case?
|
281
|
+
# assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids"), link("", :index, [@mookey, @mookeys_cool_aid])
|
282
|
+
# assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids", ONE_HASH), link("", :index, [@mookey, @mookeys_cool_aid], ONE_HASH)
|
283
|
+
# assert_equal link_to("", "/fraggles/#{@mookey.id}/cool_aids", *TWO_HASHES), link("", :index, [@mookey, @mookeys_cool_aid], *TWO_HASHES)
|
284
|
+
end
|
285
|
+
|
286
|
+
# Nil
|
287
|
+
|
288
|
+
test "should throw error on any nil argument (excluding options)" do
|
289
|
+
self.stubs(:current_controller_name).returns('fraggles')
|
290
|
+
@fraggle = @mookey
|
291
|
+
|
292
|
+
assert_raise(::Link2::Brain::NilArgument) { link(nil) }
|
293
|
+
|
294
|
+
assert_raise(::Link2::Brain::NilArgument) { link(Object.new, nil) }
|
295
|
+
assert_raise(::Link2::Brain::NilArgument) { link(nil, Object.new) }
|
296
|
+
|
297
|
+
assert_raise(::Link2::Brain::NilArgument) { link(nil, nil, nil) }
|
298
|
+
assert_raise(::Link2::Brain::NilArgument) { link(Object.new, nil, nil) }
|
299
|
+
assert_raise(::Link2::Brain::NilArgument) { link(nil, Object.new, nil) }
|
300
|
+
assert_raise(::Link2::Brain::NilArgument) { link(nil, nil, Object.new) }
|
301
|
+
assert_raise(::Link2::Brain::NilArgument) { link(Object.new, Object.new, nil) }
|
302
|
+
assert_raise(::Link2::Brain::NilArgument) { link(Object.new, nil, Object.new) }
|
225
303
|
end
|
226
304
|
|
227
305
|
# DOM selectors
|
data/test/support_test.rb
CHANGED
@@ -19,10 +19,11 @@ class SupportTest < ActiveSupport::TestCase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
test "#resource_identifier_class?: should only be true for valid classes" do
|
22
|
-
assert ::Link2::Support.resource_identifier_class?(nil)
|
23
22
|
assert ::Link2::Support.resource_identifier_class?(:hello)
|
24
23
|
assert ::Link2::Support.resource_identifier_class?(::Fraggle)
|
24
|
+
assert ::Link2::Support.resource_identifier_class?(::Fraggle.new)
|
25
25
|
|
26
|
+
assert_not ::Link2::Support.resource_identifier_class?(nil)
|
26
27
|
assert_not ::Link2::Support.resource_identifier_class?(::Unicorn)
|
27
28
|
end
|
28
29
|
|
data/test/test_helper.rb
CHANGED
@@ -44,7 +44,9 @@ end
|
|
44
44
|
|
45
45
|
# Routes.
|
46
46
|
ActionController::Routing::Routes.draw do |map|
|
47
|
-
map.resources :fraggles, :
|
47
|
+
map.resources :fraggles, :member => {:kick => :post} do |fraggles|
|
48
|
+
fraggles.resources :cool_aids, :member => {:kick => :post}
|
49
|
+
end
|
48
50
|
map.resource :cool_aid
|
49
51
|
|
50
52
|
map.root :controller => 'fraggles'
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: link2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 7
|
9
|
+
version: 0.1.7
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Jonas Grimfelt
|
@@ -9,79 +14,107 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-21 00:00:00 +01:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: activesupport
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 3
|
30
|
+
- 0
|
23
31
|
version: 2.3.0
|
24
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: actionpack
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ">="
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 2
|
43
|
+
- 3
|
44
|
+
- 0
|
33
45
|
version: 2.3.0
|
34
|
-
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
35
48
|
- !ruby/object:Gem::Dependency
|
36
49
|
name: test-unit
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
52
|
requirements:
|
41
53
|
- - "="
|
42
54
|
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 2
|
58
|
+
- 3
|
43
59
|
version: 1.2.3
|
44
|
-
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
45
62
|
- !ruby/object:Gem::Dependency
|
46
63
|
name: mocha
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
prerelease: false
|
65
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
66
|
requirements:
|
51
67
|
- - ">="
|
52
68
|
- !ruby/object:Gem::Version
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 9
|
72
|
+
- 8
|
53
73
|
version: 0.9.8
|
54
|
-
|
74
|
+
type: :development
|
75
|
+
version_requirements: *id004
|
55
76
|
- !ruby/object:Gem::Dependency
|
56
77
|
name: webrat
|
57
|
-
|
58
|
-
|
59
|
-
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
60
80
|
requirements:
|
61
81
|
- - ">="
|
62
82
|
- !ruby/object:Gem::Version
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
- 7
|
86
|
+
- 0
|
63
87
|
version: 0.7.0
|
64
|
-
|
88
|
+
type: :development
|
89
|
+
version_requirements: *id005
|
65
90
|
- !ruby/object:Gem::Dependency
|
66
91
|
name: leftright
|
67
|
-
|
68
|
-
|
69
|
-
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
prerelease: false
|
93
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
70
94
|
requirements:
|
71
95
|
- - ">="
|
72
96
|
- !ruby/object:Gem::Version
|
97
|
+
segments:
|
98
|
+
- 0
|
99
|
+
- 0
|
100
|
+
- 3
|
73
101
|
version: 0.0.3
|
74
|
-
|
102
|
+
type: :development
|
103
|
+
version_requirements: *id006
|
75
104
|
- !ruby/object:Gem::Dependency
|
76
105
|
name: activerecord
|
77
|
-
|
78
|
-
|
79
|
-
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
prerelease: false
|
107
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
80
108
|
requirements:
|
81
109
|
- - ">="
|
82
110
|
- !ruby/object:Gem::Version
|
111
|
+
segments:
|
112
|
+
- 2
|
113
|
+
- 3
|
114
|
+
- 0
|
83
115
|
version: 2.3.0
|
84
|
-
|
116
|
+
type: :development
|
117
|
+
version_requirements: *id007
|
85
118
|
description: "Generation next link_to-helper for Rails: Spiced with intelligence, and semantic beauty."
|
86
119
|
email: grimen@gmail.com
|
87
120
|
executables: []
|
@@ -119,18 +152,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
152
|
requirements:
|
120
153
|
- - ">="
|
121
154
|
- !ruby/object:Gem::Version
|
155
|
+
segments:
|
156
|
+
- 0
|
122
157
|
version: "0"
|
123
|
-
version:
|
124
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
159
|
requirements:
|
126
160
|
- - ">="
|
127
161
|
- !ruby/object:Gem::Version
|
162
|
+
segments:
|
163
|
+
- 0
|
128
164
|
version: "0"
|
129
|
-
version:
|
130
165
|
requirements: []
|
131
166
|
|
132
167
|
rubyforge_project:
|
133
|
-
rubygems_version: 1.3.
|
168
|
+
rubygems_version: 1.3.6
|
134
169
|
signing_key:
|
135
170
|
specification_version: 3
|
136
171
|
summary: "Generation next link_to-helper for Rails: Spiced with intelligence, and semantic beauty."
|