autosuggest-rb 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +4 -0
  3. data/README.markdown +130 -0
  4. data/Rakefile +2 -0
  5. data/autosuggest-rb.gemspec +27 -0
  6. data/integration/.gitignore +4 -0
  7. data/integration/Gemfile +43 -0
  8. data/integration/README +256 -0
  9. data/integration/Rakefile +7 -0
  10. data/integration/app/controllers/application_controller.rb +3 -0
  11. data/integration/app/helpers/application_helper.rb +2 -0
  12. data/integration/app/views/layouts/application.html.erb +14 -0
  13. data/integration/config/application.rb +46 -0
  14. data/integration/config/boot.rb +6 -0
  15. data/integration/config/database.yml +22 -0
  16. data/integration/config/environment.rb +5 -0
  17. data/integration/config/environments/development.rb +26 -0
  18. data/integration/config/environments/production.rb +49 -0
  19. data/integration/config/environments/test.rb +35 -0
  20. data/integration/config/initializers/backtrace_silencers.rb +7 -0
  21. data/integration/config/initializers/inflections.rb +10 -0
  22. data/integration/config/initializers/mime_types.rb +5 -0
  23. data/integration/config/initializers/secret_token.rb +7 -0
  24. data/integration/config/initializers/session_store.rb +8 -0
  25. data/integration/config/locales/en.yml +5 -0
  26. data/integration/config/routes.rb +58 -0
  27. data/integration/config.ru +4 -0
  28. data/integration/db/seeds.rb +7 -0
  29. data/integration/doc/README_FOR_APP +2 -0
  30. data/integration/lib/tasks/.gitkeep +0 -0
  31. data/integration/public/404.html +26 -0
  32. data/integration/public/422.html +26 -0
  33. data/integration/public/500.html +26 -0
  34. data/integration/public/favicon.ico +0 -0
  35. data/integration/public/images/rails.png +0 -0
  36. data/integration/public/index.html +239 -0
  37. data/integration/public/javascripts/application.js +2 -0
  38. data/integration/public/javascripts/controls.js +965 -0
  39. data/integration/public/javascripts/dragdrop.js +974 -0
  40. data/integration/public/javascripts/effects.js +1123 -0
  41. data/integration/public/javascripts/prototype.js +6001 -0
  42. data/integration/public/javascripts/rails.js +191 -0
  43. data/integration/public/robots.txt +5 -0
  44. data/integration/public/stylesheets/.gitkeep +0 -0
  45. data/integration/script/rails +6 -0
  46. data/integration/test/performance/browsing_test.rb +9 -0
  47. data/integration/test/test_helper.rb +13 -0
  48. data/integration/vendor/plugins/.gitkeep +0 -0
  49. data/lib/autosuggest/controller_macros.rb +15 -0
  50. data/lib/autosuggest/form_helper.rb +35 -0
  51. data/lib/autosuggest/helpers.rb +12 -0
  52. data/lib/autosuggest/version.rb +3 -0
  53. data/lib/autosuggest-rb.rb +8 -0
  54. data/lib/generators/assets/autoSuggest.css +217 -0
  55. data/lib/generators/assets/jquery.autoSuggest.js +399 -0
  56. data/lib/generators/autosuggest_generator.rb +14 -0
  57. data/spec/lib/class_methods_spec.rb +9 -0
  58. data/spec/spec_helper.rb +17 -0
  59. metadata +169 -0
@@ -0,0 +1,399 @@
1
+ /*
2
+ * AutoSuggest
3
+ * Copyright 2009-2010 Drew Wilson
4
+ * www.drewwilson.com
5
+ * code.drewwilson.com/entry/autosuggest-jquery-plugin
6
+ *
7
+ * Version 1.4 - Updated: Mar. 23, 2010
8
+ *
9
+ * This Plug-In will auto-complete or auto-suggest completed search queries
10
+ * for you as you type. You can add multiple selections and remove them on
11
+ * the fly. It supports keybord navigation (UP + DOWN + RETURN), as well
12
+ * as multiple AutoSuggest fields on the same page.
13
+ *
14
+ * Inspied by the Autocomplete plugin by: J�rn Zaefferer
15
+ * and the Facelist plugin by: Ian Tearle (iantearle.com)
16
+ *
17
+ * This AutoSuggest jQuery plug-in is dual licensed under the MIT and GPL licenses:
18
+ * http://www.opensource.org/licenses/mit-license.php
19
+ * http://www.gnu.org/licenses/gpl.html
20
+ */
21
+
22
+
23
+ (function($){
24
+ $.fn.autoSuggest = function(data, options) {
25
+ var defaults = {
26
+ asHtmlID: false,
27
+ asHtmlName: false,
28
+ newValuesInputName: false,
29
+ startText: "Enter Name Here",
30
+ emptyText: "No Results Found",
31
+ preFill: {},
32
+ limitText: "No More Selections Are Allowed",
33
+ selectedItemProp: "value", //name of object property
34
+ selectedValuesProp: "value", //name of object property
35
+ searchObjProps: "value", //comma separated list of object property names
36
+ queryParam: "q",
37
+ retrieveLimit: false, //number for 'limit' param on ajax request
38
+ extraParams: "",
39
+ matchCase: false,
40
+ minChars: 1,
41
+ keyDelay: 400,
42
+ resultsHighlight: true,
43
+ neverSubmit: false,
44
+ selectionLimit: false,
45
+ showResultList: true,
46
+ start: function(){},
47
+ selectionClick: function(elem){},
48
+ selectionAdded: function(elem){},
49
+ selectionRemoved: function(elem){ elem.remove(); },
50
+ formatList: false, //callback function
51
+ beforeRetrieve: function(string){ return string; },
52
+ retrieveComplete: function(data){ return data; },
53
+ resultClick: function(data){},
54
+ resultsComplete: function(){}
55
+ };
56
+ var opts = $.extend(defaults, options);
57
+
58
+ var d_type = "object";
59
+ var d_count = 0;
60
+ if(typeof data == "string") {
61
+ d_type = "string";
62
+ var req_string = data;
63
+ } else {
64
+ var org_data = data;
65
+ for (k in data) if (data.hasOwnProperty(k)) d_count++;
66
+ }
67
+ if((d_type == "object" && d_count > 0) || d_type == "string"){
68
+ return this.each(function(x){
69
+ if(!opts.asHtmlID){
70
+ x = x+""+Math.floor(Math.random()*100); //this ensures there will be unique IDs on the page if autoSuggest() is called multiple times
71
+ var x_id = "as-input-"+x;
72
+ var as_values_name = "as_values_"+x;
73
+ } else {
74
+ x = opts.asHtmlID;
75
+ var x_id = x;
76
+ var as_values_name = "as_values_"+x;
77
+ }
78
+
79
+ if(opts.asHtmlName){
80
+ var as_values_name = opts.asHtmlName;
81
+ }
82
+ opts.start.call(this);
83
+ var input = $(this);
84
+ input.attr("autocomplete","off").addClass("as-input").attr("id",x_id).val(opts.startText);
85
+ var input_focus = false;
86
+
87
+ // Setup basic elements and render them to the DOM
88
+ input.wrap('<ul class="as-selections" id="as-selections-'+x+'"></ul>').wrap('<li class="as-original" id="as-original-'+x+'"></li>');
89
+ var count_of_new = 0;
90
+ var selections_holder = $("#as-selections-"+x);
91
+ var org_li = $("#as-original-"+x);
92
+ var results_holder = $('<div class="as-results" id="as-results-'+x+'"></div>').hide();
93
+ var results_ul = $('<ul class="as-list"></ul>');
94
+ var values_input = $('<input type="hidden" class="as-values" name="'+as_values_name+'" id="as-values-'+x+'" />');
95
+ var prefill_value = "";
96
+ if(typeof opts.preFill == "string"){
97
+ var vals = opts.preFill.split(",");
98
+ for(var i=0; i < vals.length; i++){
99
+ var v_data = {};
100
+ v_data[opts.selectedValuesProp] = vals[i];
101
+ if(vals[i] != ""){
102
+ add_selected_item(v_data, "000"+i);
103
+ }
104
+ }
105
+ prefill_value = opts.preFill;
106
+ } else {
107
+ prefill_value = "";
108
+ var prefill_count = 0;
109
+ for (k in opts.preFill) if (opts.preFill.hasOwnProperty(k)) prefill_count++;
110
+ if(prefill_count > 0){
111
+ for(var i=0; i < prefill_count; i++){
112
+ var new_v = opts.preFill[i][opts.selectedValuesProp];
113
+ if(new_v == undefined){ new_v = ""; }
114
+ prefill_value = prefill_value+new_v+",";
115
+ if(new_v != ""){
116
+ add_selected_item(opts.preFill[i], "000"+i);
117
+ }
118
+ }
119
+ }
120
+ }
121
+ if(prefill_value != ""){
122
+ input.val("");
123
+ var lastChar = prefill_value.substring(prefill_value.length-1);
124
+ if(lastChar != ","){ prefill_value = prefill_value+","; }
125
+ values_input.val(","+prefill_value);
126
+ $("li.as-selection-item", selections_holder).addClass("blur").removeClass("selected");
127
+ }
128
+ input.after(values_input);
129
+ selections_holder.click(function(){
130
+ input_focus = true;
131
+ input.focus();
132
+ }).mousedown(function(){ input_focus = false; }).after(results_holder);
133
+
134
+ var timeout = null;
135
+ var prev = "";
136
+ var totalSelections = 0;
137
+ var tab_press = false;
138
+
139
+ // Handle input field events
140
+ input.focus(function(){
141
+ if($(this).val() == opts.startText && values_input.val() == ""){
142
+ $(this).val("");
143
+ } else if(input_focus){
144
+ $("li.as-selection-item", selections_holder).removeClass("blur");
145
+ if($(this).val() != ""){
146
+ results_ul.css("width",selections_holder.outerWidth());
147
+ results_holder.show();
148
+ }
149
+ }
150
+ input_focus = true;
151
+ return true;
152
+ }).blur(function(){
153
+ if($(this).val() == "" && values_input.val() == "" && prefill_value == ""){
154
+ $(this).val(opts.startText);
155
+ } else if(input_focus){
156
+ $("li.as-selection-item", selections_holder).addClass("blur").removeClass("selected");
157
+ results_holder.hide();
158
+ }
159
+ }).keydown(function(e) {
160
+ // track last key pressed
161
+ lastKeyPressCode = e.keyCode;
162
+ first_focus = false;
163
+ switch(e.keyCode) {
164
+ case 38: // up
165
+ e.preventDefault();
166
+ moveSelection("up");
167
+ break;
168
+ case 40: // down
169
+ e.preventDefault();
170
+ moveSelection("down");
171
+ break;
172
+ case 8: // delete
173
+ if(input.val() == ""){
174
+ var last = values_input.val().split(",");
175
+ last = last[last.length - 2];
176
+ selections_holder.children().not(org_li.prev()).removeClass("selected");
177
+ if(org_li.prev().hasClass("selected")){
178
+ values_input.val(values_input.val().replace(","+last+",",","));
179
+ opts.selectionRemoved.call(this, org_li.prev());
180
+ } else {
181
+ opts.selectionClick.call(this, org_li.prev());
182
+ org_li.prev().addClass("selected");
183
+ }
184
+ }
185
+ if(input.val().length == 1){
186
+ results_holder.hide();
187
+ prev = "";
188
+ }
189
+ if($(":visible",results_holder).length > 0){
190
+ if (timeout){ clearTimeout(timeout); }
191
+ timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay);
192
+ }
193
+ break;
194
+ case 13: // return
195
+ tab_press = false;
196
+ var active = $("li.active:first", results_holder);
197
+ if(active.length > 0){
198
+ active.click();
199
+ results_holder.hide();
200
+ }
201
+ if(opts.neverSubmit || active.length > 0){
202
+ e.preventDefault();
203
+ }
204
+ break;
205
+ default:
206
+ if(opts.showResultList){
207
+ if(opts.selectionLimit && $("li.as-selection-item", selections_holder).length >= opts.selectionLimit){
208
+ updated_results_ul = results_ul.html('<li class="as-message">'+opts.limitText+'</li>');
209
+ if (results_holder.children().length == 0){
210
+ results_holder.append(updated_results_ul);
211
+ results_ul.css("width", selections_holder.outerWidth());
212
+ }
213
+ results_holder.show();
214
+ } else {
215
+ if (timeout){ clearTimeout(timeout); }
216
+ timeout = setTimeout(function(){ keyChange(); }, opts.keyDelay);
217
+ }
218
+ }
219
+ break;
220
+ }
221
+ });
222
+
223
+ function keyChange() {
224
+ // ignore if the following keys are pressed: [del] [shift] [capslock]
225
+ if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ){ return results_holder.hide(); }
226
+ if(opts.selectionLimit && $("li.as-selection-item", selections_holder).length >= opts.selectionLimit){ return; }
227
+ var string = input.val().replace(/[\\]+|[\/]+/g,"");
228
+ if (string == prev) return;
229
+ prev = string;
230
+ if (string.length >= opts.minChars) {
231
+ selections_holder.addClass("loading");
232
+ if(d_type == "string"){
233
+ var limit = "";
234
+ if(opts.retrieveLimit){
235
+ limit = "&limit="+encodeURIComponent(opts.retrieveLimit);
236
+ }
237
+ if(opts.beforeRetrieve){
238
+ string = opts.beforeRetrieve.call(this, string);
239
+ }
240
+ $.getJSON(req_string+"?"+opts.queryParam+"="+encodeURIComponent(string)+limit+opts.extraParams, function(data){
241
+ d_count = 0;
242
+ var new_data = opts.retrieveComplete.call(this, data);
243
+ for (k in new_data) if (new_data.hasOwnProperty(k)) d_count++;
244
+ processData(new_data, string);
245
+ });
246
+ } else {
247
+ if(opts.beforeRetrieve){
248
+ string = opts.beforeRetrieve.call(this, string);
249
+ }
250
+ processData(org_data, string);
251
+ }
252
+ } else {
253
+ selections_holder.removeClass("loading");
254
+ results_holder.hide();
255
+ }
256
+ }
257
+ var num_count = 0;
258
+ function processData(data, query){
259
+ var case_sensitive_query = query;
260
+ if (!opts.matchCase){ query = query.toLowerCase(); }
261
+ var matchCount = 0;
262
+ results_holder.html(results_ul.html("")).hide();
263
+ for(var i=0;i<d_count;i++){
264
+ var num = i;
265
+ num_count++;
266
+ var forward = false;
267
+ if(opts.searchObjProps == "value") {
268
+ var str = data[num].value;
269
+ } else {
270
+ var str = "";
271
+ var names = opts.searchObjProps.split(",");
272
+ for(var y=0;y<names.length;y++){
273
+ var name = $.trim(names[y]);
274
+ str = str+data[num][name]+" ";
275
+ }
276
+ }
277
+ if(str){
278
+ if (!opts.matchCase){ str = str.toLowerCase(); }
279
+ if(str.search(query) != -1 && values_input.val().search(","+data[num][opts.selectedValuesProp]+",") == -1){
280
+ forward = true;
281
+ }
282
+ }
283
+ if('true'){
284
+ var formatted = $('<li class="as-result-item" id="as-result-item-'+num+'"></li>').click(function(){
285
+ var raw_data = $(this).data("data");
286
+ var number = raw_data.num;
287
+ if($("#as-selection-"+number, selections_holder).length <= 0 && !tab_press){
288
+ var data = raw_data.attributes;
289
+ input.val("").focus();
290
+ prev = "";
291
+ add_selected_item(data, number);
292
+ opts.resultClick.call(this, raw_data);
293
+ results_holder.hide();
294
+ }
295
+ tab_press = false;
296
+ }).mousedown(function(){ input_focus = false; }).mouseover(function(){
297
+ $("li", results_ul).removeClass("active");
298
+ $(this).addClass("active");
299
+ }).data("data",{attributes: data[num], num: num_count});
300
+ var this_data = $.extend({},data[num]);
301
+ if (!opts.matchCase){
302
+ var regx = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + query + ")(?![^<>]*>)(?![^&;]+;)", "gi");
303
+ } else {
304
+ var regx = new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + query + ")(?![^<>]*>)(?![^&;]+;)", "g");
305
+ }
306
+
307
+ if(opts.resultsHighlight){
308
+ this_data[opts.selectedItemProp] = this_data[opts.selectedItemProp].replace(regx,"<em>$1</em>");
309
+ }
310
+ if(!opts.formatList){
311
+ formatted = formatted.html(this_data[opts.selectedItemProp]);
312
+ } else {
313
+ formatted = opts.formatList.call(this, this_data, formatted);
314
+ }
315
+ results_ul.append(formatted);
316
+ delete this_data;
317
+ matchCount++;
318
+ if(opts.retrieveLimit && opts.retrieveLimit == matchCount ){ break; }
319
+ }
320
+ }
321
+ selections_holder.removeClass("loading");
322
+ if(matchCount <= 0){
323
+ var formatted = $('<li class="as-result-item" id="as-result-item-1"></li>');
324
+ if(opts.newValuesInputName){
325
+ count_of_new += 1;
326
+ formatted.html('Add new: <em>' + case_sensitive_query + '</em>').click(function(){
327
+ input_focus = false;
328
+ new_data_item = {};
329
+ new_data_item[opts.selectedItemProp] = case_sensitive_query;
330
+ new_data_item[opts.selectedValuesProp] = case_sensitive_query;
331
+ add_selected_item(new_data_item, count_of_new, true);
332
+ input.val("");
333
+ results_holder.hide();
334
+ }).mousedown(function(){ input_focus = false; }).mouseover(function(){
335
+ $("li", results_ul).removeClass("active");
336
+ $(this).addClass("active");
337
+ });
338
+ } else {
339
+ formatted.html('<em>New items not allowed in this field</em>');
340
+ }
341
+ results_ul.append('<li class="as-message">'+opts.emptyText+'</li>').append(formatted);
342
+ }
343
+ results_ul.css("width", selections_holder.outerWidth());
344
+ results_holder.show();
345
+ opts.resultsComplete.call(this);
346
+ }
347
+
348
+ function add_selected_item(data, num, is_new_value){
349
+ is_new_value = is_new_value || false;
350
+ if(!is_new_value){
351
+ values_input.val(values_input.val()+data[opts.selectedValuesProp]+",");
352
+ } else {
353
+ values_input.after('<input type="hidden" name="'+opts.newValuesInputName+'" value="'+data[opts.selectedValuesProp]+'">');
354
+ }
355
+ var item = $('<li class="as-selection-item" id="as-selection-'+num+'"></li>').click(function(){
356
+ opts.selectionClick.call(this, $(this));
357
+ selections_holder.children().removeClass("selected");
358
+ $(this).addClass("selected");
359
+ }).mousedown(function(){ input_focus = false; });
360
+ var close = $('<a class="as-close">&times;</a>').click(function(){
361
+ if(!is_new_value){
362
+ values_input.val(values_input.val().replace(","+data[opts.selectedValuesProp]+",",","));
363
+ } else {
364
+ $('input[value='+data[opts.selectedValuesProp]+']').remove();
365
+ }
366
+ opts.selectionRemoved.call(this, item);
367
+ input_focus = true;
368
+ input.focus();
369
+ return false;
370
+ });
371
+ org_li.before(item.html(data[opts.selectedItemProp]).prepend(close));
372
+ opts.selectionAdded.call(this, org_li.prev());
373
+ }
374
+
375
+ function moveSelection(direction){
376
+ if($(":visible",results_holder).length > 0){
377
+ var lis = $("li", results_holder);
378
+ if(direction == "down"){
379
+ var start = lis.eq(0);
380
+ } else {
381
+ var start = lis.filter(":last");
382
+ }
383
+ var active = $("li.active:first", results_holder);
384
+ if(active.length > 0){
385
+ if(direction == "down"){
386
+ start = active.next();
387
+ } else {
388
+ start = active.prev();
389
+ }
390
+ }
391
+ lis.removeClass("active");
392
+ start.addClass("active");
393
+ }
394
+ }
395
+
396
+ });
397
+ }
398
+ }
399
+ })(jQuery);
@@ -0,0 +1,14 @@
1
+ require 'rails/generators'
2
+
3
+ class AutosuggestGenerator < Rails::Generators::Base
4
+ def install
5
+ # Copy the unobtrusive JS file
6
+ copy_file('jquery.autoSuggest.js', 'public/javascripts/jquery.autoSuggest.js')
7
+ copy_file('autoSuggest.css', 'public/stylesheets/autoSuggest.css')
8
+ end
9
+
10
+ def self.source_root
11
+ File.join(File.dirname(__FILE__), 'assets')
12
+ end
13
+ end
14
+
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Autosuggest::ControllerMacros do
4
+
5
+ it "should respond to autosuggest_ingredients_name" do
6
+ IngredientsController.new.should respond_to :autosuggest_ingredients_name
7
+ end
8
+
9
+ end
@@ -0,0 +1,17 @@
1
+ ENV['RAILS_ENV'] ||= 'test'
2
+
3
+ require 'rails/all'
4
+ require 'rspec/rails'
5
+ require 'autosuggest'
6
+ require 'ruby-debug'
7
+
8
+ Dir["#{File.dirname(__FILE__)}/support/*.rb"].each { |f| require f }
9
+
10
+ RSpec.configure do |config|
11
+ config.mock_with :mocha
12
+ end
13
+
14
+ Ingredient = Class.new
15
+ IngredientsController = Class.new(ActionController::Base)
16
+ IngredientsController.autosuggest(:ingredients, :name)
17
+
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: autosuggest-rb
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.2
6
+ platform: ruby
7
+ authors:
8
+ - Derrick Camerino
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-05-28 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rails
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: "3.0"
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: "0"
36
+ type: :development
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: rspec-rails
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: ruby-debug19
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: mocha
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ type: :development
70
+ version_requirements: *id005
71
+ description: This is a gem that wraps the AutoSuggest javascript plugin
72
+ email:
73
+ - robustdj@gmail.com
74
+ executables: []
75
+
76
+ extensions: []
77
+
78
+ extra_rdoc_files: []
79
+
80
+ files:
81
+ - .gitignore
82
+ - Gemfile
83
+ - README.markdown
84
+ - Rakefile
85
+ - autosuggest-rb.gemspec
86
+ - integration/.gitignore
87
+ - integration/Gemfile
88
+ - integration/README
89
+ - integration/Rakefile
90
+ - integration/app/controllers/application_controller.rb
91
+ - integration/app/helpers/application_helper.rb
92
+ - integration/app/views/layouts/application.html.erb
93
+ - integration/config.ru
94
+ - integration/config/application.rb
95
+ - integration/config/boot.rb
96
+ - integration/config/database.yml
97
+ - integration/config/environment.rb
98
+ - integration/config/environments/development.rb
99
+ - integration/config/environments/production.rb
100
+ - integration/config/environments/test.rb
101
+ - integration/config/initializers/backtrace_silencers.rb
102
+ - integration/config/initializers/inflections.rb
103
+ - integration/config/initializers/mime_types.rb
104
+ - integration/config/initializers/secret_token.rb
105
+ - integration/config/initializers/session_store.rb
106
+ - integration/config/locales/en.yml
107
+ - integration/config/routes.rb
108
+ - integration/db/seeds.rb
109
+ - integration/doc/README_FOR_APP
110
+ - integration/lib/tasks/.gitkeep
111
+ - integration/public/404.html
112
+ - integration/public/422.html
113
+ - integration/public/500.html
114
+ - integration/public/favicon.ico
115
+ - integration/public/images/rails.png
116
+ - integration/public/index.html
117
+ - integration/public/javascripts/application.js
118
+ - integration/public/javascripts/controls.js
119
+ - integration/public/javascripts/dragdrop.js
120
+ - integration/public/javascripts/effects.js
121
+ - integration/public/javascripts/prototype.js
122
+ - integration/public/javascripts/rails.js
123
+ - integration/public/robots.txt
124
+ - integration/public/stylesheets/.gitkeep
125
+ - integration/script/rails
126
+ - integration/test/performance/browsing_test.rb
127
+ - integration/test/test_helper.rb
128
+ - integration/vendor/plugins/.gitkeep
129
+ - lib/autosuggest-rb.rb
130
+ - lib/autosuggest/controller_macros.rb
131
+ - lib/autosuggest/form_helper.rb
132
+ - lib/autosuggest/helpers.rb
133
+ - lib/autosuggest/version.rb
134
+ - lib/generators/assets/autoSuggest.css
135
+ - lib/generators/assets/jquery.autoSuggest.js
136
+ - lib/generators/autosuggest_generator.rb
137
+ - spec/lib/class_methods_spec.rb
138
+ - spec/spec_helper.rb
139
+ has_rdoc: true
140
+ homepage: ""
141
+ licenses: []
142
+
143
+ post_install_message:
144
+ rdoc_options: []
145
+
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: "0"
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: "0"
160
+ requirements: []
161
+
162
+ rubyforge_project: autosuggest-rb
163
+ rubygems_version: 1.6.2
164
+ signing_key:
165
+ specification_version: 3
166
+ summary: This is a gem that wraps the AutoSuggest javascript plugin
167
+ test_files:
168
+ - spec/lib/class_methods_spec.rb
169
+ - spec/spec_helper.rb