draper 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.travis.yml +0 -1
  2. data/Gemfile +3 -3
  3. data/Rakefile +8 -8
  4. data/Readme.markdown +41 -22
  5. data/doc/css/full_list.css +2 -2
  6. data/doc/css/style.css +30 -30
  7. data/doc/js/app.js +10 -10
  8. data/doc/js/full_list.js +8 -8
  9. data/draper.gemspec +2 -2
  10. data/lib/draper.rb +1 -1
  11. data/lib/draper/base.rb +65 -22
  12. data/lib/draper/decorated_enumerable_proxy.rb +6 -1
  13. data/lib/draper/model_support.rb +2 -2
  14. data/lib/draper/railtie.rb +19 -0
  15. data/lib/draper/system.rb +7 -4
  16. data/lib/draper/version.rb +1 -1
  17. data/lib/generators/draper/decorator/decorator_generator.rb +26 -4
  18. data/lib/generators/draper/decorator/templates/decorator.rb +2 -2
  19. data/lib/generators/{rspec → draper/decorator}/templates/decorator_spec.rb +1 -1
  20. data/lib/generators/{test_unit → draper/decorator}/templates/decorator_test.rb +1 -1
  21. data/lib/generators/draper/install/install_generator.rb +6 -6
  22. data/lib/generators/rails/decorator_generator.rb +3 -3
  23. data/performance/bechmark.rb +5 -5
  24. data/performance/decorators.rb +4 -4
  25. data/performance/models.rb +2 -2
  26. data/spec/draper/base_spec.rb +176 -10
  27. data/spec/draper/helper_support_spec.rb +1 -1
  28. data/spec/draper/model_support_spec.rb +23 -14
  29. data/spec/draper/view_context_spec.rb +4 -4
  30. data/spec/generators/draper/decorator/decorator_generator_spec.rb +81 -1
  31. data/spec/generators/draper/install/install_generator_spec.rb +5 -5
  32. data/spec/spec_helper.rb +3 -0
  33. data/spec/support/samples/application_controller.rb +8 -11
  34. data/spec/support/samples/decorator_with_allows.rb +1 -1
  35. data/spec/support/samples/decorator_with_application_helper.rb +5 -5
  36. data/spec/support/samples/decorator_with_denies.rb +1 -1
  37. data/spec/support/samples/decorator_with_multiple_allows.rb +4 -0
  38. data/spec/support/samples/product.rb +28 -7
  39. data/spec/support/samples/some_thing.rb +2 -0
  40. data/spec/support/samples/some_thing_decorator.rb +3 -0
  41. metadata +62 -37
  42. data/lib/generators/rspec/decorator_generator.rb +0 -11
  43. data/lib/generators/test_unit/decorator_generator.rb +0 -11
  44. data/spec/generators/rspec/decorator_generator_spec.rb +0 -22
  45. data/spec/generators/test_unit/decorator_generator_spec.rb +0 -22
@@ -2,6 +2,5 @@ rvm:
2
2
  - 1.8.7
3
3
  - 1.9.2
4
4
  - rbx
5
- - rbx-2.0
6
5
  - ree
7
6
  - jruby
data/Gemfile CHANGED
@@ -4,10 +4,10 @@ gem 'rake'
4
4
  gem 'rspec', '~> 2.0'
5
5
  gem 'activesupport', '~> 3.1.3'
6
6
  gem 'actionpack', "~> 3.1.3", :require => 'action_view'
7
- gem 'ammeter', '~> 0.1.3', :require => 'ammeter/init'
7
+ gem 'ammeter', '~> 0.2.2', :require => 'ammeter/init'
8
8
  gem 'guard'
9
9
  gem 'guard-rspec'
10
- gem 'launchy'
10
+ gem 'launchy'
11
11
  gem 'yard'
12
12
 
13
- gemspec
13
+ gemspec
data/Rakefile CHANGED
@@ -2,31 +2,31 @@ require 'bundler/gem_tasks'
2
2
  require 'rake'
3
3
  require 'rspec/core/rake_task'
4
4
 
5
- RCOV = RUBY_VERSION.to_f == 1.8
5
+ RCOV = RUBY_VERSION.to_f == 1.8
6
6
 
7
7
  namespace :spec do
8
-
8
+
9
9
  RSpec::Core::RakeTask.new(:coverage) do |t|
10
10
  t.pattern = 'spec/**/*_spec.rb'
11
-
12
- if RCOV
11
+
12
+ if RCOV
13
13
  t.rcov = true
14
14
  t.rcov_opts = '--exclude osx\/objc,spec,gems\/'
15
15
  end
16
16
  end
17
-
17
+
18
18
  RSpec::Core::RakeTask.new(:normal) do |t|
19
19
  t.pattern ='spec/**/*_spec.rb'
20
20
  t.rcov = false
21
21
  end
22
-
22
+
23
23
  namespace :coverage do
24
24
  desc "Cleanup coverage data"
25
25
  task :cleanup do
26
26
  rm_rf 'coverage.data'
27
27
  rm_rf 'coverage'
28
28
  end
29
-
29
+
30
30
  desc "Browse the code coverage report."
31
31
  task :report => ["spec:coverage:cleanup", "spec:coverage"] do
32
32
  if RCOV
@@ -38,7 +38,7 @@ namespace :spec do
38
38
  end
39
39
  end
40
40
  end
41
-
41
+
42
42
  end
43
43
 
44
44
  desc "RSpec tests"
@@ -30,20 +30,17 @@ Ryan Bates has put together an excellent RailsCast on Draper based on the 0.8.0
30
30
 
31
31
  ## What's New
32
32
 
33
- ### Version 0.9.X
34
-
35
- * `.5`: Render the `decorate` helper, passing a source object and a block in a view template to auto-decorate and render the block (ISSUE: see https://github.com/jcasimir/draper/issues/32)
36
- * `.5`: `ArticleDecorator.first` and `ArticleDecorator.last` will return decorated instances as you'd expect
37
- * `.5`: Calling `ArticleDecorator.all` will now return a `DecoratedEnumerableProxy` of the objects from `Article.all`
38
- * `.5`: More love for `DecoratedEnumerableProxy` including better use of `respond_to`, `include?`, and overriding `.all` to return a
39
- * `.4`: Improved the collection proxy's `respond_to` and `to_ary` to play nicely with Rails' `render`
40
- * `.3`: Helpers are available from the decorator class level, so you could write a `ArticleDecorator.new_article_link` that uses `h.link_to`
41
- * `.2`: Automatically generate a named accessor for the wrapped object, so now inside of `ArticleDecorator` you can use `article` instead of just `model`
42
- * `.2`: Automatically generate RSpec/Test::Unit stub for decorator class
43
- * `.1`: Removed the `lazy_helpers` method to favor using `include Draper::LazyHelpers`
44
- * `.1`: Refactored how methods are selected for delegation to the wrapped model
45
- * `.0`: Fixed how the view context is stored to resolve cross-request issues
46
- * `.0`: Decorated collections now return a collection proxy instead of an array, which fixes many compatibility issues
33
+ Check out the full commit history at https://github.com/jcasimir/draper/compare/ad94f54369deabd11315fc241c66b74a30adec0a...04bb00505b7832419fddba20e5068317610eb38d
34
+
35
+ In summary, you can now:
36
+
37
+ * [Namespace the `decorates` call](https://github.com/jcasimir/draper/commit/1c3d5667b8406b80b490d876257379087b129f92)
38
+ * [Use your decorators with CanCan](https://github.com/jcasimir/draper/commit/ac1f3083989107d877e2b1c918c3a3e792db99e8)
39
+ * [Use a more generalized `options` hash in decorator initialization](https://github.com/jcasimir/draper/commit/03910877d0461356da0968a87346592908f292a7)
40
+ * [Get better performance by generating methods](https://github.com/jcasimir/draper/commit/ebe30511b79eac82276413ca7ae54a4a4d86d4dc)
41
+ * [Automatically decorate associated objects](https://github.com/jcasimir/draper/commit/1580baa287997ed4e356aae0ffeeb8fe9c326ced) See Example near bottom of Readme
42
+
43
+ Thanks to [steveklabnik](http://github.com/steveklabnik), [i0rek](http://github.com/i0rek), [laserlemon](http://github.com/laserlemon), [michaelfairley](http://github.com/michaelfairley), [dnagir](http://github.com/dnagir), [ubermajestix](http://github.com/ubermajestix), [tmaier](http://github.com/tmaier), [angelim](http://github.com/angelim), [duncanbeevers](http://github.com/duncanbeevers), Albert Peng & JR Boyens, [leocassarani](http://github.com/leocassarani), [Jeff Felchner](http://github.com/Felchner), [shingara](http://github.com/shingara), [momolog](http://github.com/momolog), and [ayamomiji](http://github.com/ayamomiji) for their contributions to this version!
47
44
 
48
45
  ## Goals
49
46
 
@@ -238,15 +235,11 @@ Use the new methods in your views like any other model method (ex: `@article.pub
238
235
  ### Using in Mailers
239
236
 
240
237
  To use decorators in mailers that use helpers, you have to call `set_current_view_context` in your
241
- mailer method:
238
+ ActionMailer class.
242
239
 
243
240
  ```ruby
244
- class ActicleMailer < ActionMailer::Base
245
- def new_article(article)
246
- set_current_view_context
247
- @article_decorator = ArticleDecorator.decorate(article)
248
- mail(:to => 'come@me.bro', :subject => "New Article: #{@article_decorator.title}")
249
- end
241
+ class ArticleMailer < ActionMailer::Base
242
+ defaults 'init-draper' => Proc.new { set_current_view_context }
250
243
  end
251
244
  ```
252
245
  ### Integration with RSpec
@@ -269,7 +262,7 @@ Here are some ideas of what you might do in decorator methods:
269
262
 
270
263
  ## Example Using a Decorator
271
264
 
272
- For a brief tutorial with sample project, check this out: http://tutorials.jumpstartlab.com/rails/topics/decorators.html
265
+ For a brief tutorial with sample project, check this out: http://tutorials.jumpstartlab.com/topics/decorators.html
273
266
 
274
267
  Say I have a publishing system with `Article` resources. My designer decides that whenever we print the `published_at` timestamp, it should be constructed like this:
275
268
 
@@ -329,6 +322,32 @@ class ArticleDecorator < ApplicationDecorator
329
322
  end
330
323
  end
331
324
  ```
325
+
326
+ ### Example of Decorated Associations
327
+
328
+ Add a `decorates_association :association_name` to gain access to a decorated version of your target association.
329
+
330
+ ```ruby
331
+ class ArticleDecorator < ApplicationDecorator
332
+ decorates :article
333
+ decorates_association :author # belongs_to :author association
334
+ end
335
+
336
+ class AuthorDecorator < ApplicationDecorator
337
+ decorates :author
338
+
339
+ def fancy_name
340
+ "#{model.title}. #{model.first_name} #{model.middle_name[0]}. #{model.last_name}"
341
+ end
342
+ end
343
+ ```
344
+
345
+ Now when you call the association it will use a decorator.
346
+
347
+ ```ruby
348
+ <%= @article.author.fancy_name %>
349
+ ```
350
+
332
351
  ## Issues / Pending
333
352
 
334
353
  * Documentation
@@ -1,6 +1,6 @@
1
- body {
1
+ body {
2
2
  margin: 0;
3
- font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
3
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
4
  font-size: 13px;
5
5
  height: 101%;
6
6
  overflow-x: hidden;
@@ -1,6 +1,6 @@
1
- body {
1
+ body {
2
2
  padding: 0 20px;
3
- font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
3
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
4
  font-size: 13px;
5
5
  }
6
6
  body.frames { padding: 0 5px; }
@@ -8,7 +8,7 @@ h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dot
8
8
  h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; }
9
9
  h1.title { margin-bottom: 10px; }
10
10
  h1.alphaindex { margin-top: 0; font-size: 22px; }
11
- h2 {
11
+ h2 {
12
12
  padding: 0;
13
13
  padding-bottom: 3px;
14
14
  border-bottom: 1px #aaa solid;
@@ -34,9 +34,9 @@ h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right;
34
34
  #filecontents dd, .docstring dd { padding: 5px 0px; margin-left: 18px; }
35
35
  #filecontents dd > p, .docstring dd > p { margin: 0px; }
36
36
 
37
- .note {
37
+ .note {
38
38
  color: #222;
39
- -moz-border-radius: 3px; -webkit-border-radius: 3px;
39
+ -moz-border-radius: 3px; -webkit-border-radius: 3px;
40
40
  background: #e3e4e3; border: 1px solid #d5d5d5; padding: 7px 10px;
41
41
  display: block;
42
42
  }
@@ -47,9 +47,9 @@ h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right;
47
47
  .note.title { text-transform: lowercase; padding: 1px 5px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; }
48
48
  .summary_signature + .note.title { margin-left: 7px; }
49
49
  h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; }
50
- .note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
51
- .note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
52
- .note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
50
+ .note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
51
+ .note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
52
+ .note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
53
53
  .note.title.private { background: #d5d5d5; border-color: #c5c5c5; }
54
54
  .discussion .note { margin-top: 6px; }
55
55
  .discussion .note:first-child { margin-top: 0; }
@@ -123,9 +123,9 @@ dl.constants .discussion *:last-child { margin-bottom: 0; }
123
123
 
124
124
  .method_details { border-top: 1px dotted #aaa; margin-top: 15px; padding-top: 0; }
125
125
  .method_details.first { border: 0; }
126
- p.signature {
127
- font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
128
- padding: 6px 10px; margin-top: 18px;
126
+ p.signature {
127
+ font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
128
+ padding: 6px 10px; margin-top: 18px;
129
129
  background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
130
130
  }
131
131
  p.signature tt { font-family: Monaco, Consolas, Courier, monospace; }
@@ -145,7 +145,7 @@ p.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace;
145
145
  .tags .examples h4 { padding: 0; margin: 0; margin-left: 15px; font-weight: bold; font-size: 0.9em; }
146
146
 
147
147
  .tags .overload .overload_item { list-style: none; margin-bottom: 25px; }
148
- .tags .overload .overload_item .signature {
148
+ .tags .overload .overload_item .signature {
149
149
  padding: 2px 8px;
150
150
  background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
151
151
  }
@@ -169,19 +169,19 @@ ul.summary {
169
169
  font-size: 1em;
170
170
  line-height: 1.5em;
171
171
  }
172
- ul.summary a:link, ul.summary a:visited {
172
+ ul.summary a:link, ul.summary a:visited {
173
173
  text-decoration: none; font-size: 1.1em;
174
174
  }
175
175
  ul.summary li { margin-bottom: 5px; }
176
- .summary .summary_signature {
176
+ .summary .summary_signature {
177
177
  padding: 1px 10px;
178
178
  background: #eaeaff; border: 1px solid #dfdfe5;
179
- -moz-border-radius: 3px; -webkit-border-radius: 3px;
179
+ -moz-border-radius: 3px; -webkit-border-radius: 3px;
180
180
  }
181
181
  .summary_signature:hover { background: #eeeeff; cursor: pointer; }
182
182
  ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;}
183
183
  ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; }
184
- #content .summary_signature:hover a:link,
184
+ #content .summary_signature:hover a:link,
185
185
  #content .summary_signature:hover a:visited {
186
186
  background: transparent;
187
187
  color: #48f;
@@ -204,18 +204,18 @@ ul.fullTree li:last-child { padding-bottom: 0; }
204
204
  .showAll .inheritName { display: none; }
205
205
 
206
206
  #search { position: absolute; right: 14px; top: 0px; }
207
- #search a:link, #search a:visited {
207
+ #search a:link, #search a:visited {
208
208
  display: block; float: left; margin-right: 4px;
209
209
  padding: 8px 10px; text-decoration: none; color: #05a;
210
210
  border: 1px solid #d8d8e5;
211
- -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;
211
+ -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;
212
212
  -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px;
213
213
  background: #eaf0ff;
214
214
  -webkit-box-shadow: -1px 1px 3px #ddd;
215
215
  }
216
216
  #search a:hover { background: #f5faff; color: #06b; }
217
- #search a.active {
218
- background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457;
217
+ #search a.active {
218
+ background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457;
219
219
  -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px;
220
220
  -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px;
221
221
  }
@@ -249,8 +249,8 @@ li.r2 { background: #fafafa; }
249
249
  z-index: 9999;
250
250
  background: #fff;
251
251
  display: none;
252
- position: absolute;
253
- top: 36px;
252
+ position: absolute;
253
+ top: 36px;
254
254
  right: 18px;
255
255
  width: 500px;
256
256
  height: 80%;
@@ -266,7 +266,7 @@ li.r2 { background: #fafafa; }
266
266
  #content ul.summary li.deprecated .summary_signature a:link,
267
267
  #content ul.summary li.deprecated .summary_signature a:visited { text-decoration: line-through; font-style: italic; }
268
268
 
269
- #toc {
269
+ #toc {
270
270
  padding: 20px; padding-right: 30px; border: 1px solid #ddd; float: right; background: #fff; margin-left: 20px; margin-bottom: 20px;
271
271
  max-width: 300px;
272
272
  -webkit-box-shadow: -2px 2px 6px #bbb;
@@ -291,7 +291,7 @@ li.r2 { background: #fafafa; }
291
291
  #filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; }
292
292
  #filecontents pre.code, .docstring pre.code { display: block; }
293
293
  .source_code .lines { padding-right: 12px; color: #555; text-align: right; }
294
- #filecontents pre.code, .docstring pre.code,
294
+ #filecontents pre.code, .docstring pre.code,
295
295
  .tags .example { padding: 5px 12px; margin-top: 4px; border: 1px solid #eef; background: #f5f5ff; }
296
296
  pre.code { color: #000; }
297
297
  pre.code .info.file { color: #555; }
@@ -300,21 +300,21 @@ pre.code .tstring_content,
300
300
  pre.code .heredoc_beg, pre.code .heredoc_end,
301
301
  pre.code .qwords_beg, pre.code .qwords_end,
302
302
  pre.code .tstring, pre.code .dstring { color: #036A07; }
303
- pre.code .fid, pre.code .id.new, pre.code .id.to_s,
304
- pre.code .id.to_sym, pre.code .id.to_f,
303
+ pre.code .fid, pre.code .id.new, pre.code .id.to_s,
304
+ pre.code .id.to_sym, pre.code .id.to_f,
305
305
  pre.code .dot + pre.code .id,
306
306
  pre.code .id.to_i pre.code .id.each { color: #0085FF; }
307
307
  pre.code .comment { color: #0066FF; }
308
308
  pre.code .const, pre.code .constant { color: #585CF6; }
309
309
  pre.code .symbol { color: #C5060B; }
310
- pre.code .kw,
310
+ pre.code .kw,
311
311
  pre.code .label,
312
- pre.code .id.require,
312
+ pre.code .id.require,
313
313
  pre.code .id.extend,
314
314
  pre.code .id.include { color: #0000FF; }
315
315
  pre.code .ivar { color: #318495; }
316
- pre.code .gvar,
317
- pre.code .id.backref,
316
+ pre.code .gvar,
317
+ pre.code .id.backref,
318
318
  pre.code .id.nth_ref { color: #6D79DE; }
319
319
  pre.code .regexp, .dregexp { color: #036A07; }
320
320
  pre.code a { border-bottom: 1px dotted #bbf; }
@@ -44,7 +44,7 @@ function createFullTreeLinks() {
44
44
 
45
45
  function fixBoxInfoHeights() {
46
46
  $('dl.box dd.r1, dl.box dd.r2').each(function() {
47
- $(this).prev().height($(this).height());
47
+ $(this).prev().height($(this).height());
48
48
  });
49
49
  }
50
50
 
@@ -113,7 +113,7 @@ function summaryToggle() {
113
113
  if (next.hasClass('compact')) {
114
114
  next.toggle();
115
115
  next.next().toggle();
116
- }
116
+ }
117
117
  else if (next.hasClass('summary')) {
118
118
  var list = $('<ul class="summary compact" />');
119
119
  list.html(next.html());
@@ -159,13 +159,13 @@ function generateTOC() {
159
159
  if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; }
160
160
  this.id = proposedId;
161
161
  }
162
- if (thisTag > lastTag) {
163
- for (i = 0; i < thisTag - lastTag; i++) {
164
- var tmp = $('<ol/>'); toc.append(tmp); toc = tmp;
165
- }
162
+ if (thisTag > lastTag) {
163
+ for (i = 0; i < thisTag - lastTag; i++) {
164
+ var tmp = $('<ol/>'); toc.append(tmp); toc = tmp;
165
+ }
166
166
  }
167
- if (thisTag < lastTag) {
168
- for (i = 0; i < lastTag - thisTag; i++) toc = toc.parent();
167
+ if (thisTag < lastTag) {
168
+ for (i = 0; i < lastTag - thisTag; i++) toc = toc.parent();
169
169
  }
170
170
  toc.append('<li><a href="#' + this.id + '">' + $(this).text() + '</a></li>');
171
171
  lastTag = thisTag;
@@ -174,7 +174,7 @@ function generateTOC() {
174
174
  html = '<div id="toc"><p class="title"><a class="hide_toc" href="#"><strong>Table of Contents</strong></a> <small>(<a href="#" class="float_toc">left</a>)</small></p></div>';
175
175
  $('#content').prepend(html);
176
176
  $('#toc').append(_toc);
177
- $('#toc .hide_toc').toggle(function() {
177
+ $('#toc .hide_toc').toggle(function() {
178
178
  $('#toc .top').slideUp('fast');
179
179
  $('#toc').toggleClass('hidden');
180
180
  $('#toc .title small').toggle();
@@ -183,7 +183,7 @@ function generateTOC() {
183
183
  $('#toc').toggleClass('hidden');
184
184
  $('#toc .title small').toggle();
185
185
  });
186
- $('#toc .float_toc').toggle(function() {
186
+ $('#toc .float_toc').toggle(function() {
187
187
  $(this).text('float');
188
188
  $('#toc').toggleClass('nofloat');
189
189
  }, function() {
@@ -10,7 +10,7 @@ function fullListSearch() {
10
10
  var link = $(this).find('.object_link a');
11
11
  searchCache.push({name:link.text(), node:$(this), link:link});
12
12
  });
13
-
13
+
14
14
  $('#search input').keyup(function() {
15
15
  searchString = this.value.toLowerCase();
16
16
  if (searchString === "") {
@@ -18,9 +18,9 @@ function fullListSearch() {
18
18
  inSearch = null;
19
19
  $('#full_list, #content').removeClass('insearch');
20
20
  $('#full_list li').removeClass('found').each(function() {
21
-
21
+
22
22
  var link = $(this).find('.object_link a');
23
- link.text(link.text());
23
+ link.text(link.text());
24
24
  });
25
25
  if (clicked) {
26
26
  clicked.parents('ul').each(function() {
@@ -38,7 +38,7 @@ function fullListSearch() {
38
38
  searchItem();
39
39
  }
40
40
  });
41
-
41
+
42
42
  $('#search input').focus();
43
43
  $('#full_list').after("<div id='noresults'></div>");
44
44
  }
@@ -54,8 +54,8 @@ function searchItem() {
54
54
  item.node.css('padding-left', '10px').addClass('found');
55
55
  item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1');
56
56
  lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2';
57
- item.link.html(item.name.replace(new RegExp("(" +
58
- searchString.replace(/([\/.*+?|()\[\]{}\\])/g, "\\$1") + ")", "ig"),
57
+ item.link.html(item.name.replace(new RegExp("(" +
58
+ searchString.replace(/([\/.*+?|()\[\]{}\\])/g, "\\$1") + ")", "ig"),
59
59
  '<strong>$1</strong>'));
60
60
  }
61
61
 
@@ -110,10 +110,10 @@ function linkList() {
110
110
 
111
111
  function collapse() {
112
112
  if (!$('#full_list').hasClass('class')) return;
113
- $('#full_list.class a.toggle').click(function() {
113
+ $('#full_list.class a.toggle').click(function() {
114
114
  $(this).parent().toggleClass('collapsed').next().toggleClass('collapsed');
115
115
  highlight();
116
- return false;
116
+ return false;
117
117
  });
118
118
  $('#full_list.class ul').each(function() {
119
119
  $(this).addClass('collapsed').prev().addClass('collapsed');
@@ -5,8 +5,8 @@ require "draper/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "draper"
7
7
  s.version = Draper::VERSION
8
- s.authors = ["Jeff Casimir"]
9
- s.email = ["jeff@casimircreative.com"]
8
+ s.authors = ["Jeff Casimir", "Steve Klabnik"]
9
+ s.email = ["jeff@casimircreative.com", "steve@steveklabnik.com"]
10
10
  s.homepage = "http://github.com/jcasimir/draper"
11
11
  s.summary = "Decorator pattern implementation for Rails."
12
12
  s.description = "Draper implements a decorator or presenter pattern for Rails applications."