rails-jquery-autocomplete 1.0.0 → 1.0.1

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.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- OTIyMDlkNDA3MmY3MmYwZjlmYzJlNzE1ODgzMTYxMzNjYTU1Nzc4Ng==
5
- data.tar.gz: !binary |-
6
- YTQyYjQyYjk2MTg1ZWYwOTZiMGMwYzNmMDE0ZWM5ZjJhMTI3NmFiZQ==
2
+ SHA1:
3
+ metadata.gz: bf8cc770234ad7b4dc2e5f40ce94eeef32f8d863
4
+ data.tar.gz: db3cdccdece71ac86dbe930c2ddfdf1978520651
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- ODAzMDE0YTVmNmFlYjJmMjI0YzNlYzljODQ0OWYzMjVjZTI0MDExNWQyOTZm
10
- YjEwNjI0ZWU4YWFmZGExNmNiYjJiMjlhMmY3ZWU5YzM0Y2RhZjMxMGM0MTYy
11
- Y2Y2MjBkMWI0YzY3MzBhNGFiZDRjYTlhMWEyZmVkMzI0OGEwNDU=
12
- data.tar.gz: !binary |-
13
- ZmM5YWNmNWUwMDQyZDZkNGQzY2RjYTU2OGY1OWZmYWRlMTI1ZWYzZmE4NDhl
14
- ZWViNzY5ZmRmMTQyYWY3Y2ZjODFiNGNjYWMwZmRlYTUxNzJkMTA2OGVmZmRl
15
- NjllYWIwYTgxOWQ5NTQ3NTBiM2Q0ZDM2MTBhMmM1ZjNiNzAyMGI=
6
+ metadata.gz: 5d9890a5fa77fa0067d4d8ccb8669ea04622c11a645da8e7e01861a18bd5ad45a86b155756fa1a6db8762304e2c95ab0873a8930c0f4d28bcb9f28393b45439d
7
+ data.tar.gz: 3a6deefdc47513cdcd6830a4349f64972791de3d6f6536dee5d53c2f68d43c2fe0d37691161d9f3dcb2499467cca82630b2b0d0e2d6bcfbe426364b6a4fa85ac
data/README.md CHANGED
@@ -1,52 +1,17 @@
1
1
  ## Status
2
2
 
3
- As you may have noticed we are working through the backlog of issues and pull requests
4
- and trying to get those caught up. Couple of quick notes related to this.
5
-
6
- 1. A new gem with Rails 4 support HAS BEEN recently RELEASED (1.0.12).
7
- 2. If there is a specific feature that is in master, but not in the gem I strongly suggest you
8
- point to the specific changeset that addresses your issue rather than directly at master. There
9
- are going to be a lot of changes going on here and while we will do our best; there will probably
10
- be some breakage on master in the short term. Use at your discretion!
11
- 3. Some pull requests have been submitted to address the same functionality; in those cases we will try
12
- to pick the best/optimal solution, accept that and close out the other tickets.
13
- 4. Backwards compatibility is considered a high priority, so if a pull request is a great idea,
14
- but it breaks backwards compatibility, it will be closed and noted that it causes breakage
15
- to backwards compatibility. If anyone passionately wants the feature they are welcome to update
16
- in a way that maintiains backwards compatibility and issue new pull reqs.
17
- 5. Performance is critical. If a feature is a nice to have, but has been implemented in such a way that it causes
18
- performance degradation to existing searches; it will be rejected.
19
- 6. Thanks to everyone who is submitting pull requests, issues, comments, etc... I appreciate the help
20
- from each one of you. Sometimes it has to get worse before it gets better. But I promise,
21
- it will get better!
22
-
23
- -------
24
-
25
- Thanks to David @ crowdint for creating this gem and all of his hard
26
- work on it in the past.
27
-
28
- Just posting this update to let everyone know this project is still
29
- alive and has a new maintainer. Over the next couple of weeks we will
30
- be reviewing existing pull requests and you will see updates shortly.
31
-
32
- Thanks for your patience.
33
-
34
- joiey-seeley@uiowa.edu
35
-
36
- -------
37
-
38
- Unfortunately, I don't have much time to work on this gem, I'm looking for
39
- someone to help with its maintenance. Send me an email if you are interested in
40
- getting push privileges to this repo.
41
-
42
- david@crowdint.com
43
-
3
+ 1. This is the officially maintained fork of
4
+ [rails3-jquery-autocomplete](http://github.com/crowdint/rails3-jquery-autocomplete)
5
+ 2. All new features and support of Rails 4 and above will occur here
6
+ going forward. If you are still using Rails 3 please continue to use
7
+ the previous fork. No new features will be added there, but bug fixes &
8
+ security patches will continue until Rails 3 is EOL.
44
9
 
45
10
  # rails-jquery-autocomplete
46
11
 
47
- [![Build Status](https://secure.travis-ci.org/crowdint/rails3-jquery-autocomplete.png)](http://travis-ci.org/crowdint/rails3-jquery-autocomplete) [![Gem Version](https://badge.fury.io/rb/rails3-jquery-autocomplete.png)](http://badge.fury.io/rb/rails3-jquery-autocomplete)
12
+ [![Build Status](https://secure.travis-ci.org/bigtunacan/rails-jquery-autocomplete.png)](http://travis-ci.org/bigtunacan/rails-jquery-autocomplete) [![Gem Version](https://badge.fury.io/rb/rails-jquery-autocomplete.png)](http://badge.fury.io/rb/rails-jquery-autocomplete)
48
13
 
49
- An easy way to use jQuery's autocomplete with Rails 3.
14
+ An easy way to use jQuery's autocomplete with Rails.
50
15
 
51
16
  Supports both ActiveRecord, [mongoid](http://github.com/mongoid/mongoid), and [MongoMapper](https://github.com/jnunemaker/mongomapper).
52
17
 
@@ -86,7 +51,7 @@ Install it
86
51
 
87
52
  bundle install
88
53
 
89
- ### Rails 3.0.x
54
+ ### Rails 4.x.x
90
55
 
91
56
  Run the generator
92
57
 
@@ -111,7 +76,7 @@ uncompressed version by running:
111
76
 
112
77
  rails generate autocomplete:uncompressed
113
78
 
114
- ### Rails 3.1.x and higher
79
+ ### Rails 4 and higher
115
80
 
116
81
  Just add it to your app/assets/javascripts/application.js file
117
82
 
@@ -273,7 +238,23 @@ To have the first item be automatically focused on when the autocomplete menu is
273
238
  'data-auto-focus' => true
274
239
  end
275
240
 
276
- Now your autocomplete code is unobtrusive, Rails 3 style.
241
+ Now your autocomplete code is unobtrusive, Rails style.
242
+
243
+ #### Client-side config
244
+
245
+ To configure the behaviour if no matches are found, you can set the following options:
246
+
247
+ jQuery.railsAutocomplete.options.showNoMatches //default true
248
+ jQuery.railsAutocomplete.options.noMatchesLabel //default 'no existing match'
249
+
250
+ These will change the behaviour globally. To set them on a single input field use:
251
+
252
+ f.autocomplete_field :brand_names, autocomplete_brand_name_products_path,
253
+ 'data-showNoMatches' => false
254
+ #or
255
+ f.autocomplete_field :brand_names, autocomplete_brand_name_products_path,
256
+ 'data-noMatchesLabel' => 'no brands found'
257
+
277
258
 
278
259
  ### Getting the object id
279
260
 
@@ -474,3 +455,4 @@ Everyone on [this list](https://github.com/crowdint/rails3-jquery-autocomplete/c
474
455
  We specialize in building and growing online retail stores. We don’t work with everyone – just companies we believe in. Call us today to see if there’s a fit.
475
456
  Find more info [here](http://www.crowdint.com)!
476
457
 
458
+
@@ -35,6 +35,10 @@
35
35
  var _e = e;
36
36
  this.init(_e);
37
37
  };
38
+ jQuery.railsAutocomplete.options = {
39
+ showNoMatches: true,
40
+ noMatchesLabel: 'no existing match'
41
+ }
38
42
 
39
43
  jQuery.railsAutocomplete.fn = jQuery.railsAutocomplete.prototype = {
40
44
  railsAutocomplete: '0.0.1'
@@ -67,9 +71,17 @@
67
71
  });
68
72
  }
69
73
  jQuery.getJSON( jQuery(e).attr('data-autocomplete'), params, function() {
70
- if(arguments[0].length === 0) {
74
+ var options = {};
75
+ jQuery.extend(options, jQuery.railsAutocomplete.options);
76
+ jQuery.each(options, function(key, value) {
77
+ if(options.hasOwnProperty(key)) {
78
+ var attrVal = jQuery(e).attr('data-' + key);
79
+ options[key] = attrVal ? attrVal : value;
80
+ }
81
+ });
82
+ if(arguments[0].length == 0 && options.showNoMatches) {
71
83
  arguments[0] = [];
72
- arguments[0][0] = { id: "", label: "no existing match" };
84
+ arguments[0][0] = { id: "", label: options.noMatchesLabel };
73
85
  }
74
86
  jQuery(arguments[0]).each(function(i, el) {
75
87
  var obj = {};
@@ -1 +1 @@
1
- !function(t){t.fn.railsAutocomplete=function(){var e=function(){this.railsAutoCompleter||(this.railsAutoCompleter=new t.railsAutocomplete(this))};return void 0!==t.fn.on?t(document).on("focus",this.selector,e):this.live("focus",e)},t.railsAutocomplete=function(t){var e=t;this.init(e)},t.railsAutocomplete.fn=t.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"},t.railsAutocomplete.fn.extend=t.railsAutocomplete.extend=t.extend,t.railsAutocomplete.fn.extend({init:function(e){function a(t){return t.split(e.delimiter)}function i(t){return a(t).pop().replace(/^\s+/,"")}e.delimiter=t(e).attr("data-delimiter")||null,e.min_length=t(e).attr("min-length")||2,e.append_to=t(e).attr("data-append-to")||null,e.autoFocus=t(e).attr("data-auto-focus")||!1,t(e).autocomplete({appendTo:e.append_to,autoFocus:e.autoFocus,delay:t(e).attr("delay")||0,source:function(a,n){var r=this.element[0],o={term:i(a.term)};t(e).attr("data-autocomplete-fields")&&t.each(t.parseJSON(t(e).attr("data-autocomplete-fields")),function(e,a){o[e]=t(a).val()}),t.getJSON(t(e).attr("data-autocomplete"),o,function(){0===arguments[0].length&&(arguments[0]=[],arguments[0][0]={id:"",label:"no existing match"}),t(arguments[0]).each(function(a,i){var n={};n[i.id]=i,t(e).data(n)}),n.apply(null,arguments),t(r).trigger("railsAutocomplete.source",arguments)})},change:function(e,a){if(t(this).is("[data-id-element]")&&""!==t(t(this).attr("data-id-element")).val()&&(t(t(this).attr("data-id-element")).val(a.item?a.item.id:""),t(this).attr("data-update-elements"))){var i=t.parseJSON(t(this).attr("data-update-elements")),n=a.item?t(this).data(a.item.id.toString()):{};if(i&&""===t(i.id).val())return;for(var r in i){var o=t(i[r]);o.is(":checkbox")?null!=n[r]&&o.prop("checked",n[r]):o.val(a.item?n[r]:"")}}},search:function(){var t=i(this.value);return t.length<e.min_length?!1:void 0},focus:function(){return!1},select:function(i,n){if(-1!=n.item.value.toLowerCase().indexOf("no match")||-1!=n.item.value.toLowerCase().indexOf("too many results"))return t(this).trigger("railsAutocomplete.noMatch",n),!1;var r=a(this.value);if(r.pop(),r.push(n.item.value),null!=e.delimiter)r.push(""),this.value=r.join(e.delimiter);else if(this.value=r.join(""),t(this).attr("data-id-element")&&t(t(this).attr("data-id-element")).val(n.item.id),t(this).attr("data-update-elements")){var o=n.item,l=-1!=n.item.value.indexOf("Create New")?!0:!1,u=t.parseJSON(t(this).attr("data-update-elements"));for(var s in u)"checkbox"===t(u[s]).attr("type")?o[s]===!0||1===o[s]?t(u[s]).attr("checked","checked"):t(u[s]).removeAttr("checked"):t(u[s]).val(l&&o[s]&&-1==o[s].indexOf("Create New")||!l?o[s]:"")}var c=this.value;return t(this).bind("keyup.clearId",function(){t.trim(t(this).val())!=t.trim(c)&&(t(t(this).attr("data-id-element")).val(""),t(this).unbind("keyup.clearId"))}),t(e).trigger("railsAutocomplete.select",n),!1}})}}),t(document).ready(function(){t("input[data-autocomplete]").railsAutocomplete()})}(jQuery);
1
+ !function(t){t.fn.railsAutocomplete=function(){var e=function(){this.railsAutoCompleter||(this.railsAutoCompleter=new t.railsAutocomplete(this))};return void 0!==t.fn.on?t(document).on("focus",this.selector,e):this.live("focus",e)},t.railsAutocomplete=function(t){var e=t;this.init(e)},t.railsAutocomplete.options={showNoMatches:!0,noMatchesLabel:"no existing match"},t.railsAutocomplete.fn=t.railsAutocomplete.prototype={railsAutocomplete:"0.0.1"},t.railsAutocomplete.fn.extend=t.railsAutocomplete.extend=t.extend,t.railsAutocomplete.fn.extend({init:function(e){function a(t){return t.split(e.delimiter)}function i(t){return a(t).pop().replace(/^\s+/,"")}e.delimiter=t(e).attr("data-delimiter")||null,e.min_length=t(e).attr("min-length")||2,e.append_to=t(e).attr("data-append-to")||null,e.autoFocus=t(e).attr("data-auto-focus")||!1,t(e).autocomplete({appendTo:e.append_to,autoFocus:e.autoFocus,delay:t(e).attr("delay")||0,source:function(a,n){var o=this.element[0],r={term:i(a.term)};t(e).attr("data-autocomplete-fields")&&t.each(t.parseJSON(t(e).attr("data-autocomplete-fields")),function(e,a){r[e]=t(a).val()}),t.getJSON(t(e).attr("data-autocomplete"),r,function(){var a={};t.extend(a,t.railsAutocomplete.options),t.each(a,function(i,n){if(a.hasOwnProperty(i)){var o=t(e).attr("data-"+i);a[i]=o?o:n}}),0==arguments[0].length&&a.showNoMatches&&(arguments[0]=[],arguments[0][0]={id:"",label:a.noMatchesLabel}),t(arguments[0]).each(function(a,i){var n={};n[i.id]=i,t(e).data(n)}),n.apply(null,arguments),t(o).trigger("railsAutocomplete.source",arguments)})},change:function(e,a){if(t(this).is("[data-id-element]")&&""!==t(t(this).attr("data-id-element")).val()&&(t(t(this).attr("data-id-element")).val(a.item?a.item.id:""),t(this).attr("data-update-elements"))){var i=t.parseJSON(t(this).attr("data-update-elements")),n=a.item?t(this).data(a.item.id.toString()):{};if(i&&""===t(i.id).val())return;for(var o in i){var r=t(i[o]);r.is(":checkbox")?null!=n[o]&&r.prop("checked",n[o]):r.val(a.item?n[o]:"")}}},search:function(){var t=i(this.value);return t.length<e.min_length?!1:void 0},focus:function(){return!1},select:function(i,n){if(-1!=n.item.value.toLowerCase().indexOf("no match")||-1!=n.item.value.toLowerCase().indexOf("too many results"))return t(this).trigger("railsAutocomplete.noMatch",n),!1;var o=a(this.value);if(o.pop(),o.push(n.item.value),null!=e.delimiter)o.push(""),this.value=o.join(e.delimiter);else if(this.value=o.join(""),t(this).attr("data-id-element")&&t(t(this).attr("data-id-element")).val(n.item.id),t(this).attr("data-update-elements")){var r=n.item,l=-1!=n.item.value.indexOf("Create New")?!0:!1,u=t.parseJSON(t(this).attr("data-update-elements"));for(var s in u)"checkbox"===t(u[s]).attr("type")?r[s]===!0||1===r[s]?t(u[s]).attr("checked","checked"):t(u[s]).removeAttr("checked"):t(u[s]).val(l&&r[s]&&-1==r[s].indexOf("Create New")||!l?r[s]:"")}var c=this.value;return t(this).bind("keyup.clearId",function(){t.trim(t(this).val())!=t.trim(c)&&(t(t(this).attr("data-id-element")).val(""),t(this).unbind("keyup.clearId"))}),t(e).trigger("railsAutocomplete.select",n),!1}})}}),t(document).ready(function(){t("input[data-autocomplete]").railsAutocomplete()})}(jQuery);
@@ -1,3 +1,3 @@
1
1
  module RailsJQueryAutocomplete
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -0,0 +1,25 @@
1
+ require "test_helper"
2
+
3
+ class Post
4
+ attr_accessor :author
5
+ end
6
+
7
+ class FormHelperTest < ActionView::TestCase
8
+ def test_text_field_tag
9
+ assert_match(/autocomplete=\"some\/path\"/, text_field_tag('field_name', '', :autocomplete => 'some/path'))
10
+ end
11
+
12
+ def test_text_field
13
+ post = Post.new
14
+ assert_match(/autocomplete=\"some\/path\"/, text_field(:post, :author, :autocomplete => 'some/path'))
15
+ end
16
+
17
+ def test_autocomplete_field_tag
18
+ assert_match(/data-autocomplete=\"some\/path\"/, autocomplete_field_tag('field_name', '', 'some/path'))
19
+ end
20
+
21
+ def test_autocomplete_field
22
+ post= Post.new
23
+ assert_match(/data-autocomplete=\"some\/path\"/, autocomplete_field(:post, :author, 'some/path'))
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+ require 'generators/autocomplete/install_generator'
3
+
4
+ module Autocomplete
5
+ class InstallGeneratorTest < Test::Unit::TestCase
6
+ def setup
7
+ @destination = File.join('tmp', 'test_app')
8
+ @source = InstallGenerator.source_root
9
+ @filename = File.join(@destination, 'public', 'javascripts', 'autocomplete-rails.js')
10
+
11
+ File.unlink(@filename) if File.exists?(@filename)
12
+
13
+ InstallGenerator.start([], :destination_root => @destination)
14
+ end
15
+
16
+ def test_install
17
+ assert File.exists?(@filename)
18
+
19
+ assert_equal(
20
+ File.read(File.join(@source, 'autocomplete-rails.js')),
21
+ File.read(@filename)
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+ require 'generators/autocomplete/uncompressed_generator'
3
+
4
+ module Autocomplete
5
+ class UncompressedGeneratorTest < Test::Unit::TestCase
6
+ def setup
7
+ @destination = File.join('tmp', 'test_app')
8
+ @source = UncompressedGenerator.source_root
9
+ @filename = File.join(@destination, 'public', 'javascripts', 'autocomplete-rails.js')
10
+
11
+ File.unlink(@filename) if File.exists?(@filename)
12
+
13
+ UncompressedGenerator.start([], :destination_root => @destination)
14
+ end
15
+
16
+ def test_install
17
+ assert File.exists?(@filename)
18
+
19
+ assert_equal(
20
+ File.read(File.join(@source, 'autocomplete-rails-uncompressed.js')),
21
+ File.read(@filename)
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,82 @@
1
+ require 'test_helper'
2
+
3
+ module RailsJQueryAutocomplete
4
+ class AutocompleteTest < Test::Unit::TestCase
5
+ include RailsJQueryAutocomplete::Autocomplete
6
+
7
+ context 'ClassMethods' do
8
+ context '#autocomplete' do
9
+ context '#get_prefix' do
10
+ context 'Mongoid and MongoMapper is not defined' do
11
+ setup do
12
+ ActorsController = Class.new(ActionController::Base)
13
+ ActorsController.autocomplete(:movie, :name)
14
+ @controller = ActorsController.new
15
+
16
+ @model = Class.new(ActiveRecord::Base)
17
+
18
+ Object.send(:remove_const, :Mongoid)
19
+ Object.send(:remove_const, :MongoMapper)
20
+ end
21
+
22
+ should 'not raise exception' do
23
+ @controller.get_prefix(@model)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ context '#get_autocomplete_limit' do
31
+ context 'the limit option was specified' do
32
+ should "return the limit option" do
33
+ assert_equal 99, get_autocomplete_limit({:limit => 99})
34
+ end
35
+ end
36
+
37
+ context 'the limit option is not specified' do
38
+ should 'return 10' do
39
+ assert_equal 10, get_autocomplete_limit({})
40
+ end
41
+ end
42
+ end
43
+
44
+ context '#get_object' do
45
+ should 'return the specified sym as a class name' do
46
+ symbol = Object.new
47
+ class_object = Class.new
48
+ mock(symbol).to_s.mock!.camelize.mock!.constantize { class_object }
49
+ assert_equal class_object, get_object(symbol)
50
+ end
51
+ end
52
+
53
+ context '#json_for_autocomplete' do
54
+ should 'parse items to JSON' do
55
+ item = mock(Object)
56
+ mock(item).send(:name).times(2) { 'Object Name' }
57
+ mock(item).id { 1 }
58
+ items = [item]
59
+ response = self.json_for_autocomplete(items, :name).first
60
+ assert_equal response["id"], "1"
61
+ assert_equal response["value"], "Object Name"
62
+ assert_equal response["label"], "Object Name"
63
+ end
64
+
65
+ context 'with extra data' do
66
+ should 'add that extra data to result' do
67
+ item = mock(Object)
68
+ mock(item).send(:name).times(2) { 'Object Name' }
69
+ mock(item).id { 1 }
70
+ mock(item).send("extra") { 'Object Extra ' }
71
+
72
+ items = [item]
73
+ response = self.json_for_autocomplete(items, :name, ["extra"]).first
74
+
75
+ assert_equal "1" , response["id"]
76
+ assert_equal "Object Name" , response["value"]
77
+ assert_equal "Object Name" , response["label"]
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,190 @@
1
+ require 'test_helper'
2
+
3
+ module RailsJQueryAutocomplete
4
+ module Orm
5
+ class ActiveRecordTest < Test::Unit::TestCase
6
+ include RailsJQueryAutocomplete::Orm::ActiveRecord
7
+
8
+ context "#get_autocomplete_order" do
9
+ context 'order is specified' do
10
+ should 'returns that order option' do
11
+ assert_equal "field ASC", active_record_get_autocomplete_order(:field, {:order => 'field ASC'})
12
+ end
13
+ end
14
+
15
+ context 'no order is specified' do
16
+ should 'return the order clause by the LOWER(table_name.field) ASC' do
17
+ assert_equal "LOWER(field) ASC", active_record_get_autocomplete_order(:field, {})
18
+ end
19
+
20
+ context 'a different model is specified' do
21
+ should 'return the order clause by the LOWER(table_name.field) ASC' do
22
+ model = Object.new
23
+ mock(model).table_name { 'table_name' }
24
+ assert_equal "LOWER(table_name.field) ASC", active_record_get_autocomplete_order(:field, {}, model)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ context '#active_record_get_autocomplete_items' do
31
+ should 'retrieve the items from ActiveRecord' do
32
+ class Dog ; end
33
+
34
+ model = Dog
35
+ scoped = []
36
+ whered = []
37
+ term = 'query'
38
+ method = :field
39
+
40
+ options = {
41
+ :model => model,
42
+ :term => term,
43
+ :method => method,
44
+ :options => {}
45
+ }
46
+
47
+ mock(self).get_autocomplete_limit(anything) { 10 }
48
+ mock(self).active_record_get_autocomplete_order(anything, anything, anything) { "order ASC" }
49
+ mock(self).get_autocomplete_select_clause(model, method, {}) { ["field"] }
50
+ mock(self).get_autocomplete_where_clause(model, term, method, {}) { ["WHERE something"] }
51
+ mock(model).table_name.times(any_times) { 'model_table_name' }
52
+
53
+ mock(model).scoped { model }
54
+ mock(model).select(["field"]) { model }
55
+ mock(model).where(["WHERE something"]).mock!.limit(10).mock!.
56
+ order("order ASC") { 1 }
57
+
58
+ assert_equal 1, active_record_get_autocomplete_items(options)
59
+ end
60
+
61
+ should 'use hstore method if present' do
62
+ class Dog ; end
63
+
64
+ model = Dog
65
+ scoped = []
66
+ whered = []
67
+ term = 'query'
68
+ method = :field
69
+ hsmethod = :hsfield
70
+
71
+ options = {
72
+ :model => model,
73
+ :term => term,
74
+ :method => method,
75
+ :options => {hstore: {method: hsmethod}}
76
+ }
77
+
78
+ mock(self).get_autocomplete_limit(anything) { 10 }
79
+ mock(self).active_record_get_autocomplete_order(anything, anything, anything) { "order ASC" }
80
+ mock(self).get_autocomplete_select_clause(model, hsmethod, options[:options]) { ["hsfield"] }
81
+ mock(self).get_autocomplete_where_clause(model, term, hsmethod, options[:options]) { ["WHERE something"] }
82
+ mock(model).table_name.times(any_times) { 'model_table_name' }
83
+
84
+ mock(model).scoped { model }
85
+ mock(model).select(["hsfield"]) { model }
86
+ mock(model).where(["WHERE something"]).mock!.limit(10).mock!.
87
+ order("order ASC") { 1 }
88
+
89
+ assert_equal 1, active_record_get_autocomplete_items(options)
90
+ end
91
+ end
92
+
93
+ context '#get_autocomplete_select_clause' do
94
+ setup do
95
+ @model = Object.new
96
+ mock(@model).table_name { 'table_name' }
97
+ mock(@model).primary_key { 'id' }
98
+ end
99
+
100
+ should 'create a select clause' do
101
+ assert_equal ["table_name.id", "table_name.method"],
102
+ get_autocomplete_select_clause(@model, :method, {})
103
+ end
104
+
105
+ should 'create a select clause with hstore method' do
106
+ assert_equal ["table_name.id", "table_name.hsmethod"],
107
+ get_autocomplete_select_clause(@model, :hsmethod, {hstore: {method: :hsmethod}})
108
+ end
109
+
110
+ context 'with extra options' do
111
+ should 'return those extra fields on the clause' do
112
+ options = {:extra_data => ['table_name.created_at']}
113
+
114
+ assert_equal ["table_name.id", "table_name.method", "table_name.created_at"],
115
+ get_autocomplete_select_clause(@model, :method, options)
116
+ end
117
+ end
118
+ end
119
+
120
+ context '#get_autocomplete_where_clause' do
121
+ setup do
122
+ @model = Object.new
123
+ mock(@model).table_name { 'table_name' }
124
+
125
+ @term = 'query'
126
+ @options = {}
127
+ @method = :method
128
+ end
129
+
130
+ context 'Not Postgres' do
131
+ should 'return options for where' do
132
+ mock(self).postgres?(@model) { false }
133
+ assert_equal ["LOWER(table_name.method) LIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
134
+ end
135
+ end
136
+
137
+ context 'Postgres' do
138
+ should 'return options for where with ILIKE' do
139
+ mock(self).postgres?(@model) { true }
140
+ assert_equal ["LOWER(table_name.method) ILIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
141
+ end
142
+ end
143
+
144
+ context 'HStore' do
145
+ should 'return options for where from hstore options' do
146
+ mock(self).postgres?(@model) { true }
147
+ @options[:hstore] = {method: :hsmethod, key: :hskey}
148
+ @method = :hsmethod
149
+ assert_equal ["LOWER(table_name.hsmethod -> 'hskey') LIKE ?", "query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
150
+ end
151
+ end
152
+
153
+ context 'full search' do
154
+ should 'return options for where with the term sourrounded by %%' do
155
+ mock(self).postgres?(@model) { false }
156
+ @options[:full] = true
157
+ assert_equal ["LOWER(table_name.method) LIKE ?", "%query%"], get_autocomplete_where_clause(@model, @term, @method, @options)
158
+ end
159
+ end
160
+ end
161
+
162
+ context '#postgres?' do
163
+ setup do
164
+ @model = stub
165
+ end
166
+
167
+ context 'the connection class is not postgres' do
168
+ setup do
169
+ mock(@model).connection { stub }
170
+ end
171
+
172
+ should 'return nil if the connection class matches PostgreSQLAdapter' do
173
+ assert_nil self.postgres?(@model)
174
+ end
175
+ end
176
+
177
+ context 'the connection class matches PostgreSQLAdapter' do
178
+ setup do
179
+ class PostgreSQLAdapter; end
180
+ mock(@model).connection { PostgreSQLAdapter.new }
181
+ end
182
+
183
+ should 'return true' do
184
+ assert self.postgres?(@model)
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,60 @@
1
+ require 'test_helper'
2
+
3
+ module RailsJQueryAutocomplete
4
+ module Orm
5
+ class MongoMapperTest < Test::Unit::TestCase
6
+ include RailsJQueryAutocomplete::Orm::MongoMapper
7
+
8
+ context "#mongo_mapper_get_autocomplete_order" do
9
+ context "order is specified" do
10
+ should 'returns the parametrized order for Mongoid' do
11
+ assert_equal [[:field, :asc], [:state, :desc]],
12
+ mongo_mapper_get_autocomplete_order(:method, :order => 'field ASC, state DESC')
13
+ end
14
+ end
15
+
16
+ context 'order is not specified' do
17
+ should 'return the method ordered ASC by default' do
18
+ assert_equal [[:method, :asc]],
19
+ mongo_mapper_get_autocomplete_order(:method, {})
20
+ end
21
+ end
22
+ end
23
+
24
+ context "#mongo_mapper_get_autocomplete_items" do
25
+ setup do
26
+ @model = mock(Object)
27
+
28
+ @parameters = {
29
+ :model => @model,
30
+ :method => :field,
31
+ :term => 'query',
32
+ :options => {:full => false}
33
+ }
34
+ mock(self).get_autocomplete_limit(anything) { 10 }
35
+ mock(self).mongo_mapper_get_autocomplete_order(anything, anything) { [[:order, :asc]] }
36
+ end
37
+
38
+ context 'not a full search' do
39
+ should 'do stuff' do
40
+ mock(@model).where({:field=>/^query.*/i}).mock!.limit(10).
41
+ mock!.sort([[:order, :asc]])
42
+
43
+ mongo_mapper_get_autocomplete_items(@parameters)
44
+ end
45
+ end
46
+
47
+ context 'full search' do
48
+ should 'return a full search query' do
49
+ @parameters[:options] = {:full => true}
50
+
51
+ mock(@model).where({:field => /.*query.*/i}).mock!.limit(10).
52
+ mock!.sort([[:order, :asc]])
53
+
54
+ mongo_mapper_get_autocomplete_items(@parameters)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,60 @@
1
+ require 'test_helper'
2
+
3
+ module RailsJQueryAutocomplete
4
+ module Orm
5
+ class MongoidTest < Test::Unit::TestCase
6
+ include RailsJQueryAutocomplete::Orm::Mongoid
7
+
8
+ context "#mongoid_get_autocomplete_order" do
9
+ context "order is specified" do
10
+ should 'returns the parametrized order for Mongoid' do
11
+ assert_equal [[:field, :asc], [:state, :desc]],
12
+ mongoid_get_autocomplete_order(:method, :order => 'field ASC, state DESC')
13
+ end
14
+ end
15
+
16
+ context 'order is not specified' do
17
+ should 'return the method ordered ASC by default' do
18
+ assert_equal [[:method, :asc]],
19
+ mongoid_get_autocomplete_order(:method, {})
20
+ end
21
+ end
22
+ end
23
+
24
+ context "#mongoid_get_autocomplete_items" do
25
+ setup do
26
+ @model = mock(Object)
27
+
28
+ @parameters = {
29
+ :model => @model,
30
+ :method => :field,
31
+ :term => 'query',
32
+ :options => {:full => false}
33
+ }
34
+ mock(self).get_autocomplete_limit(anything) { 10 }
35
+ mock(self).mongoid_get_autocomplete_order(anything, anything) { [[:order, :asc]] }
36
+ end
37
+
38
+ context 'not a full search' do
39
+ should 'do stuff' do
40
+ mock(@model).where({:field=>/^query/i}).mock!.limit(10).
41
+ mock!.order_by([[:order, :asc]])
42
+
43
+ mongoid_get_autocomplete_items(@parameters)
44
+ end
45
+ end
46
+
47
+ context 'full search' do
48
+ should 'return a full search query' do
49
+ @parameters[:options] = {:full => true}
50
+
51
+ mock(@model).where({:field=>/.*query.*/i}).mock!.limit(10).
52
+ mock!.order_by([[:order, :asc]])
53
+
54
+ mongoid_get_autocomplete_items(@parameters)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+ require 'view_test_helper'
3
+
4
+ module RailsJQueryAutocomplete
5
+ class SimpleFormPluginTest < ActionView::TestCase
6
+
7
+ should "apply a class of 'autocomplete'" do
8
+ with_input_for @user, :name, :autocomplete
9
+ assert_select "input#user_name.autocomplete[type=text][name='user[name]']"
10
+ end
11
+
12
+ should "add a data-autocomplete attribute with the provided :url" do
13
+ with_input_for @user, :name, :autocomplete, :url => '/test'
14
+ assert_select "input#user_name[data-autocomplete=/test]"
15
+ end
16
+
17
+ should "add a data-update-elements attribute with encoded data if passed an :update_elements option" do
18
+ with_input_for @user, :name, :autocomplete, :update_elements => { :id => '#this', :ego => '#that' }
19
+ assert_select "input#user_name[data-update-elements='{&quot;id&quot;:&quot;#this&quot;,&quot;ego&quot;:&quot;#that&quot;}']"
20
+ end
21
+
22
+ should "not add a data-update-elements attribute if not passed an :update_elements option" do
23
+ with_input_for @user, :name, :autocomplete, :url => '/test'
24
+ assert_no_select "input#user_name[data-update-elements]"
25
+ end
26
+
27
+ should "add arbitrary html options, if specified" do
28
+ with_input_for @user, :name, :autocomplete, :input_html => { :class => "superego" }
29
+ assert_select "input#user_name.superego"
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ require 'test_helper'
2
+
3
+ module RailsJQueryAutocomplete
4
+ class RailsJQueryAutocompleteTest < ActionController::TestCase
5
+ ActorsController = Class.new(ActionController::Base)
6
+ ActorsController.autocomplete(:movie, :name)
7
+
8
+ class ::Movie ; end
9
+
10
+ context '#autocomplete_object_method' do
11
+ setup do
12
+ @controller = ActorsController.new
13
+ @items = {}
14
+ @options = { :display_value => :name }
15
+ end
16
+
17
+ should 'respond to the action' do
18
+ assert_respond_to @controller, :autocomplete_movie_name
19
+ end
20
+
21
+ should 'render the JSON items' do
22
+ mock(@controller).get_autocomplete_items({
23
+ :model => Movie, :method => :name, :options => @options, :term => "query"
24
+ }) { @items }
25
+
26
+ mock(@controller).json_for_autocomplete(@items, :name, nil)
27
+ get :autocomplete_movie_name, :term => 'query'
28
+ end
29
+
30
+ context 'no term is specified' do
31
+ should "render an empty hash" do
32
+ mock(@controller).json_for_autocomplete({}, :name, nil)
33
+ get :autocomplete_movie_name
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+
7
+ ENV["RAILS_ENV"] = "test"
8
+ module Rails
9
+ def self.env
10
+ ActiveSupport::StringInquirer.new("test")
11
+ end
12
+ end
13
+
14
+ require 'rails/all'
15
+ require 'mongoid'
16
+ require 'mongo_mapper'
17
+ require 'shoulda'
18
+ require 'rr'
19
+ require 'rails/test_help'
20
+ require 'rails-jquery-autocomplete'
21
+
22
+ module RailsJQueryAutocomplete
23
+ class Application < ::Rails::Application
24
+ end
25
+ end
26
+
27
+ RailsJQueryAutocomplete::Application.routes.draw do
28
+ match '/:controller(/:action(/:id))'
29
+ end
30
+
31
+ ActionController::Base.send :include, RailsJQueryAutocomplete::Application.routes.url_helpers
32
+
33
+ class Test::Unit::TestCase
34
+
35
+ end
36
+
@@ -0,0 +1,108 @@
1
+ class User
2
+ extend ActiveModel::Naming
3
+ include ActiveModel::Conversion
4
+
5
+ attr_accessor :id, :name, :description, :created_at, :updated_at
6
+
7
+ def initialize(options={})
8
+ @new_record = false
9
+ options.each do |key, value|
10
+ send("#{key}=", value)
11
+ end if options
12
+ end
13
+
14
+ def new_record!
15
+ @new_record = true
16
+ end
17
+
18
+ def persisted?
19
+ !@new_record
20
+ end
21
+ end
22
+
23
+ class MockController
24
+ attr_writer :action_name
25
+
26
+ def _routes
27
+ self
28
+ end
29
+
30
+ def action_name
31
+ defined?(@action_name) ? @action_name : "edit"
32
+ end
33
+
34
+ def url_for(*args)
35
+ "http://example.com"
36
+ end
37
+
38
+ def url_helpers
39
+ self
40
+ end
41
+
42
+ def hash_for_user_path(*args); end
43
+ def hash_for_users_path(*args); end
44
+ end
45
+
46
+ class MockResponse
47
+
48
+ def initialize(test_case)
49
+ @test_case = test_case
50
+ end
51
+
52
+ def content_type
53
+ 'text/html'
54
+ end
55
+
56
+ def body
57
+ @test_case.send :output_buffer
58
+ end
59
+ end
60
+
61
+ class ActionView::TestCase
62
+ include RailsJQueryAutocomplete::Autocomplete
63
+ include SimpleForm::ActionViewExtensions::FormHelper
64
+
65
+ setup :set_controller
66
+ setup :set_response
67
+ setup :setup_new_user
68
+
69
+ def assert_no_select(selector, value = nil)
70
+ assert_select(selector, :text => value, :count => 0)
71
+ end
72
+
73
+ def with_concat_form_for(*args, &block)
74
+ concat simple_form_for(*args, &block)
75
+ end
76
+
77
+ def with_input_for(object, attribute_name, type, options={})
78
+ with_concat_form_for(object) do |f|
79
+ f.input(attribute_name, options.merge(:as => type))
80
+ end
81
+ end
82
+
83
+ def set_controller
84
+ @controller = MockController.new
85
+ end
86
+
87
+ def set_response
88
+ @response = MockResponse.new(self)
89
+ end
90
+
91
+ def setup_new_user
92
+ @user = User.new(
93
+ :id => 1,
94
+ :name => 'New in SimpleForm!',
95
+ :description => 'Hello!',
96
+ :created_at => Time.now
97
+ )
98
+ end
99
+
100
+ def protect_against_forgery?
101
+ false
102
+ end
103
+
104
+ def user_path(*args)
105
+ '/users'
106
+ end
107
+ alias :users_path :user_path
108
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-jquery-autocomplete
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Padilla
@@ -10,78 +10,64 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-01-20 00:00:00.000000000 Z
13
+ date: 2015-06-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - ! '>='
19
+ - - '>='
20
20
  - !ruby/object:Gem::Version
21
- version: '4.0'
21
+ version: '3.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - ! '>='
26
+ - - '>='
27
27
  - !ruby/object:Gem::Version
28
- version: '4.0'
28
+ version: '3.2'
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: sqlite3-ruby
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - ! '>='
33
+ - - '>='
34
34
  - !ruby/object:Gem::Version
35
35
  version: '0'
36
36
  type: :development
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - ! '>='
40
+ - - '>='
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: mongoid
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - ! '>='
47
+ - - '>='
48
48
  - !ruby/object:Gem::Version
49
49
  version: 2.0.0
50
50
  type: :development
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - ! '>='
54
+ - - '>='
55
55
  - !ruby/object:Gem::Version
56
56
  version: 2.0.0
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: mongo_mapper
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - ! '>='
61
+ - - '>='
62
62
  - !ruby/object:Gem::Version
63
63
  version: '0.9'
64
64
  type: :development
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
- - - ! '>='
68
+ - - '>='
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0.9'
71
- - !ruby/object:Gem::Dependency
72
- name: mongo
73
- requirement: !ruby/object:Gem::Requirement
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: 1.6.2
78
- type: :development
79
- prerelease: false
80
- version_requirements: !ruby/object:Gem::Requirement
81
- requirements:
82
- - - ~>
83
- - !ruby/object:Gem::Version
84
- version: 1.6.2
85
71
  - !ruby/object:Gem::Dependency
86
72
  name: bson_ext
87
73
  requirement: !ruby/object:Gem::Requirement
@@ -100,28 +86,28 @@ dependencies:
100
86
  name: guard
101
87
  requirement: !ruby/object:Gem::Requirement
102
88
  requirements:
103
- - - ! '>='
89
+ - - '>='
104
90
  - !ruby/object:Gem::Version
105
91
  version: '0'
106
92
  type: :development
107
93
  prerelease: false
108
94
  version_requirements: !ruby/object:Gem::Requirement
109
95
  requirements:
110
- - - ! '>='
96
+ - - '>='
111
97
  - !ruby/object:Gem::Version
112
98
  version: '0'
113
99
  - !ruby/object:Gem::Dependency
114
100
  name: guard-test
115
101
  requirement: !ruby/object:Gem::Requirement
116
102
  requirements:
117
- - - ! '>='
103
+ - - '>='
118
104
  - !ruby/object:Gem::Version
119
105
  version: '0'
120
106
  type: :development
121
107
  prerelease: false
122
108
  version_requirements: !ruby/object:Gem::Requirement
123
109
  requirements:
124
- - - ! '>='
110
+ - - '>='
125
111
  - !ruby/object:Gem::Version
126
112
  version: '0'
127
113
  - !ruby/object:Gem::Dependency
@@ -156,28 +142,28 @@ dependencies:
156
142
  name: uglifier
157
143
  requirement: !ruby/object:Gem::Requirement
158
144
  requirements:
159
- - - ! '>='
145
+ - - '>='
160
146
  - !ruby/object:Gem::Version
161
147
  version: '0'
162
148
  type: :development
163
149
  prerelease: false
164
150
  version_requirements: !ruby/object:Gem::Requirement
165
151
  requirements:
166
- - - ! '>='
152
+ - - '>='
167
153
  - !ruby/object:Gem::Version
168
154
  version: '0'
169
155
  - !ruby/object:Gem::Dependency
170
156
  name: rr
171
157
  requirement: !ruby/object:Gem::Requirement
172
158
  requirements:
173
- - - ! '>='
159
+ - - '>='
174
160
  - !ruby/object:Gem::Version
175
161
  version: '0'
176
162
  type: :development
177
163
  prerelease: false
178
164
  version_requirements: !ruby/object:Gem::Requirement
179
165
  requirements:
180
- - - ! '>='
166
+ - - '>='
181
167
  - !ruby/object:Gem::Version
182
168
  version: '0'
183
169
  - !ruby/object:Gem::Dependency
@@ -222,7 +208,18 @@ files:
222
208
  - LICENSE
223
209
  - README.md
224
210
  - Rakefile
225
- homepage: http://github.com/crowdint/rails-jquery-autocomplete
211
+ - test/form_helper_test.rb
212
+ - test/generators/autocomplete/install_generator_test.rb
213
+ - test/generators/autocomplete/uncompressed_generator_test.rb
214
+ - test/lib/rails-jquery-autocomplete/autocomplete_test.rb
215
+ - test/lib/rails-jquery-autocomplete/orm/active_record_test.rb
216
+ - test/lib/rails-jquery-autocomplete/orm/mongo_mapper_test.rb
217
+ - test/lib/rails-jquery-autocomplete/orm/mongoid_test.rb
218
+ - test/lib/rails-jquery-autocomplete/simple_form_plugin_test.rb
219
+ - test/lib/rails-jquery-autocomplete_test.rb
220
+ - test/test_helper.rb
221
+ - test/view_test_helper.rb
222
+ homepage: https://github.com/bigtunacan/rails-jquery-autocomplete/
226
223
  licenses:
227
224
  - MIT
228
225
  metadata: {}
@@ -232,12 +229,12 @@ require_paths:
232
229
  - lib
233
230
  required_ruby_version: !ruby/object:Gem::Requirement
234
231
  requirements:
235
- - - ! '>='
232
+ - - '>='
236
233
  - !ruby/object:Gem::Version
237
234
  version: '0'
238
235
  required_rubygems_version: !ruby/object:Gem::Requirement
239
236
  requirements:
240
- - - ! '>='
237
+ - - '>='
241
238
  - !ruby/object:Gem::Version
242
239
  version: '0'
243
240
  requirements: []
@@ -246,5 +243,15 @@ rubygems_version: 2.1.11
246
243
  signing_key:
247
244
  specification_version: 4
248
245
  summary: Use jQuery's autocomplete plugin with Rails 4+.
249
- test_files: []
250
- has_rdoc:
246
+ test_files:
247
+ - test/form_helper_test.rb
248
+ - test/generators/autocomplete/install_generator_test.rb
249
+ - test/generators/autocomplete/uncompressed_generator_test.rb
250
+ - test/lib/rails-jquery-autocomplete/autocomplete_test.rb
251
+ - test/lib/rails-jquery-autocomplete/orm/active_record_test.rb
252
+ - test/lib/rails-jquery-autocomplete/orm/mongo_mapper_test.rb
253
+ - test/lib/rails-jquery-autocomplete/orm/mongoid_test.rb
254
+ - test/lib/rails-jquery-autocomplete/simple_form_plugin_test.rb
255
+ - test/lib/rails-jquery-autocomplete_test.rb
256
+ - test/test_helper.rb
257
+ - test/view_test_helper.rb