draper 0.10.0 → 0.11.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.
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."