ransack 1.6.6 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3d0f75469674a840fd6677c3e2cea940c84e4438
4
- data.tar.gz: 6ab05dd928c897263c629de60c06dfb10fc74ea5
3
+ metadata.gz: 1a62534d07f2b79f6ac71228f7b8884c2f97891f
4
+ data.tar.gz: 983a58938313d8b5ded1e13ff182f0ee1c27ee48
5
5
  SHA512:
6
- metadata.gz: a46b017f203b3581ba2349417891e6f3733f3a49aa2c843daa748d69fd1b9a6f7f0daf0ec7ad72ae56e6f8b724b3c886447fdc532f2a79254b2651353d148ed0
7
- data.tar.gz: a835c33713bcc0dd9269c12e1dbe80f20a922ca8ceaf2e5ce3955b360f80c4a42a478d0e72de9d7df9bc2f0b34f29853eb6fb75c919a64ecfdad9eb41d678612
6
+ metadata.gz: eb11af400660331859ddeeb11819d14849fd398ffe3b00368c860ee47baeeace67cb29116d15b46dcad92f1466bb19d6f9e85070baea384ef49500ad1aa1e3a1
7
+ data.tar.gz: 5ed69b32c4bd6a65b60e8dd2cccb5c634738b8fe3a3a7266ccc5c6a67ab2b720b016afbfcd8e7740c0ed76dea0c00d46db0c8a61b545b7e7ff66d324bd1057d3
@@ -5,7 +5,7 @@ language: ruby
5
5
  sudo: false
6
6
 
7
7
  rvm:
8
- - 2.2.1
8
+ - 2.2.3
9
9
  - 2.1
10
10
  - 2.0
11
11
  - 1.9
@@ -35,31 +35,35 @@ env:
35
35
 
36
36
  matrix:
37
37
  include:
38
- - rvm: 2.2
38
+ - rvm: 2.2.3
39
39
  env: RAILS=master DB=sqlite3
40
- - rvm: 2.2
40
+ - rvm: 2.2.3
41
41
  env: RAILS=master DB=mysql
42
- - rvm: 2.2
42
+ - rvm: 2.2.3
43
43
  env: RAILS=master DB=postgres
44
44
  exclude:
45
- - rvm: 2.2
45
+ - rvm: 2.2.3
46
46
  env: RAILS=3-1-stable DB=sqlite
47
- - rvm: 2.2
47
+ - rvm: 2.2.3
48
48
  env: RAILS=3-1-stable DB=mysql
49
- - rvm: 2.2
49
+ - rvm: 2.2.3
50
50
  env: RAILS=3-1-stable DB=postgres
51
51
  allow_failures:
52
52
  - env: RAILS=master DB=sqlite3
53
53
  - env: RAILS=master DB=mysql
54
54
  - env: RAILS=master DB=postgres
55
- - rvm: 2.2
55
+ - rvm: 2.2.3
56
56
  env: RAILS=3-2-stable DB=sqlite
57
- - rvm: 2.2
57
+ - rvm: 2.2.3
58
58
  env: RAILS=3-2-stable DB=mysql
59
- - rvm: 2.2
59
+ - rvm: 2.2.3
60
60
  env: RAILS=3-2-stable DB=postgres
61
61
 
62
62
  before_script:
63
63
  - mysql -e 'create database ransack collate utf8_general_ci;'
64
64
  - mysql -e 'use ransack;show variables like "%character%";show variables like "%collation%";'
65
65
  - psql -c 'create database ransack;' -U postgres
66
+
67
+ addons:
68
+ code_climate:
69
+ repo_token: 8b701c4364d51a0217105e08c06922d600cec3d9e60d546a89e3ddfe46e0664e
@@ -1,9 +1,98 @@
1
1
  # Change Log
2
2
 
3
+ ## Unreleased
4
+
5
+
6
+ ## Version 1.7.0 - 2015-08-20
7
+ ### Fixed
8
+
9
+ * Fix
10
+ [#499](https://github.com/activerecord-hackery/ransack/issues/499) and
11
+ [#549](https://github.com/activerecord-hackery/ransack/issues/549).
12
+ Ransack now loads only Active Record if both Active Record and Mongoid are
13
+ running to avoid the two adapters overriding each other. This clarifies
14
+ that Ransack currently knows how to work with only one database adapter
15
+ active at a time. PR
16
+ [#541](https://github.com/activerecord-hackery/ransack/pull/541).
17
+
18
+ *ASnow (Большов Андрей)*
19
+
20
+ * Fix [#299](https://github.com/activerecord-hackery/ransack/issues/299)
21
+ `attribute_method?` parsing for attribute names containing `_and_`
22
+ and `_or_`. Attributes named like `foo_and_bar` or `foo_or_bar` are
23
+ recognized now instead of running failing checks for `foo` and `bar`.
24
+ PR [#562](https://github.com/activerecord-hackery/ransack/pull/562).
25
+
26
+ *Ryohei Hoshi*
27
+
28
+ * Fix a time-dependent test failure. When the database has
29
+ `default_timezone = :local` (system time) and the `Time.zone` is set to
30
+ elsewhere, then `Date.current` does not match what the query produces for
31
+ the stored timestamps. Resolved by setting everything to UTC. PR
32
+ [#561](https://github.com/activerecord-hackery/ransack/pull/561).
33
+
34
+ *Andrew Vit*
35
+
36
+ * Avoid overwriting association conditions with default scope in Rails 3.
37
+ When a model with default scope was associated with conditions
38
+ (`has_many :x, conditions: ...`), the default scope would overwrite the
39
+ association conditions. This patch ensures that both sources of conditions
40
+ are applied. Avoid selecting records from joins that would normally be
41
+ filtered out if they were selected from the base table. Only applies to
42
+ Rails 3, as this issue was fixed since Rails 4. PR
43
+ [#560](https://github.com/activerecord-hackery/ransack/pull/560).
44
+
45
+ *Andrew Vit*
46
+
47
+ * Fix RSpec `its` method deprecation warning: 'Use of rspec-core's `its`
48
+ method is deprecated. Use the rspec-its gem instead
49
+ ([c09aa17](https://github.com/activerecord-hackery/ransack/commit/c09aa17)).
50
+
51
+ * Fix deprecated RSpec syntax in `grouping_spec.rb`
52
+ ([ba92a0b](https://github.com/activerecord-hackery/ransack/commit/ba92a0b)).
53
+
54
+ *Jon Atack*
55
+
56
+ ### Added
57
+
58
+ * Add Mongoid support for referenced/embedded relations. PR
59
+ [#498](https://github.com/activerecord-hackery/ransack/pull/498).
60
+ TODO: Missing spec coverage! Add documentation!
61
+
62
+ *Penn Su*
63
+
64
+ * Add German locale file (de.yml). PR
65
+ [#537](https://github.com/activerecord-hackery/ransack/pull/537).
66
+
67
+ *Philipp Weissensteiner*
68
+
69
+ ### Changed
70
+
71
+ * Upgrade gemspec dependencies: MySQL2 from '0.3.14' to '0.3.18', and RSpec
72
+ from '~> 2.14.0' to '~> 2' which loads 2.99
73
+ ([000cd2](https://github.com/activerecord-hackery/ransack/commit/000cd2)).
74
+
75
+ * Upgrade spec suite to RSpec 3 `expect` syntax backward compatible with
76
+ RSpec 2.9
77
+ ([87cd36d](https://github.com/activerecord-hackery/ransack/commit/87cd36d)
78
+ and
79
+ [d296caa](https://github.com/activerecord-hackery/ransack/commit/d296caa)).
80
+
81
+ * Various FormHelper refactorings
82
+ ([17dd97a](https://github.com/activerecord-hackery/ransack/commit/17dd97a)
83
+ and
84
+ [29a73b9](https://github.com/activerecord-hackery/ransack/commit/29a73b9)).
85
+
86
+ * Various documentation updates.
87
+
88
+ *Jon Atack*
89
+
90
+
3
91
  ## Version 1.6.6 - 2015-04-05
4
92
  ### Changed
5
93
 
6
- * Upgrade Polyamorous dependency to version 1.2.0, which uses Module#prepend instead of monkey-patching for hooking into Active Record (with Ruby 2.x).
94
+ * Upgrade Polyamorous dependency to version 1.2.0, which uses `Module#prepend`
95
+ instead of `alias_method` for hooking into Active Record (with Ruby 2.x).
7
96
 
8
97
  *Jon Atack*
9
98
 
@@ -1,16 +1,20 @@
1
1
  # Contributing to Ransack
2
2
 
3
- Please take a moment to review this document in order to make the contribution
4
- process easy and effective for everyone involved!
3
+ Please take a moment to review this document to make contributing easy and
4
+ effective for everyone involved!
5
5
 
6
6
  Ransack is an open source project and we encourage contributions.
7
7
 
8
8
  ## Filing an issue
9
9
 
10
- A bug is a _demonstrable problem_ that is caused by the code in the repository.
11
- Good bug reports are extremely helpful! Please do not use the issue tracker for personal support requests.
10
+ Good issue reports are extremely helpful! Please only open an issue if a bug
11
+ is caused by Ransack, is new (has not already been reported), and can be
12
+ reproduced from the information you provide.
12
13
 
13
- Guidelines for bug reports:
14
+ Please do not use the issue tracker personal support requests. Stack Overflow
15
+ is a better place for that where a wider community can help you.
16
+
17
+ Steps:
14
18
 
15
19
  1. **Use the GitHub issue search** — check if the issue has already been
16
20
  reported.
@@ -23,13 +27,13 @@ Guidelines for bug reports:
23
27
 
24
28
  When filing an issue, please provide these details:
25
29
 
26
- * A comprehensive list of steps to reproduce the issue, or - far better - **a failing spec**.
27
- * The version (and branch) of Ransack *and* the versions of Rails, Ruby, and your operating system.
30
+ * A comprehensive list of steps to reproduce the issue :smiley: or even better, a failing spec!
31
+ * The versions of Ruby, Rails, Ransack and your operating system and database.
28
32
  * Any relevant stack traces ("Full trace" preferred).
29
33
 
30
34
  Any issue that is open for 14 days without actionable information or activity
31
35
  will be marked as "stalled" and then closed. Stalled issues can be re-opened
32
- if the information requested is provided.
36
+ if actionable information to reproduce the issue is provided.
33
37
 
34
38
  ## Pull requests
35
39
 
@@ -107,11 +111,11 @@ Syntax:
107
111
  * 80 characters per line.
108
112
  * No trailing whitespace. Blank lines should not have any space.
109
113
  * Prefer `&&`/`||` over `and`/`or`.
110
- * `MyClass.my_method(my_arg)` not `my_method( my_arg )` or my_method my_arg.
114
+ * `MyClass.my_method(my_arg)` not `my_method( my_arg )` or `my_method my_arg`.
111
115
  * `a = b` and not `a=b`.
112
116
  * `a_method { |block| ... }` and not `a_method { | block | ... }` or
113
117
  `a_method{|block| ...}`.
114
118
  * Prefer simplicity, readability, and maintainability over terseness.
115
119
  * Follow the conventions you see used in the code already.
116
120
 
117
- And in case we didn't emphasize it enough: we love tests!
121
+ And in case we didn't emphasize it enough: We love tests!
data/README.md CHANGED
@@ -29,18 +29,19 @@ instead.
29
29
  If you're viewing this at
30
30
  [github.com/activerecord-hackery/ransack](https://github.com/activerecord-hackery/ransack),
31
31
  you're reading the documentation for the master branch with the latest features.
32
- [View documentation for the last release (1.6.6).]
33
- (https://github.com/activerecord-hackery/ransack/tree/v1.6.6)
32
+ [View documentation for the last release (1.7.0).](https://github.com/activerecord-hackery/ransack/tree/v1.7.0)
34
33
 
35
34
  ## Getting started
36
35
 
37
- Ransack is compatible with Rails 3 and 4 (including 4.2.1) on Ruby 1.9 and
38
- later (Ruby 2.2 recommended). Ransack currently works with Rails master (5.0.0)
39
- too! If you are using Ruby 1.8, you can use an earlier version of Ransack up to
40
- 1.3.0.
36
+ Ransack is compatible with Rails 3 and 4 on Ruby 1.9 and later (Ruby 2.2
37
+ recommended). JRuby 9 ought to work as well (see
38
+ [this](https://github.com/activerecord-hackery/polyamorous/issues/17)).
39
+ If you are using Ruby 1.8 or an earlier JRuby and run into compatibility
40
+ issues, you can use an earlier version of Ransack, say, up to 1.3.0.
41
41
 
42
- Ransack works out-of-the-box with Active Record and also features experimental
43
- support for Mongoid 4.0 (without associations, further details below).
42
+ Ransack works out-of-the-box with Active Record and also features limited
43
+ support for Mongoid 4.0 (without associations, further details
44
+ [below](https://github.com/activerecord-hackery/ransack#mongoid)).
44
45
 
45
46
  In your Gemfile, for the last officially released gem:
46
47
 
@@ -54,6 +55,12 @@ Or, if you would like to use the latest updates, use the `master` branch:
54
55
  gem 'ransack', github: 'activerecord-hackery/ransack'
55
56
  ```
56
57
 
58
+ ## Issues tracker
59
+
60
+ * Before filing an issue, please read the [Contributing Guide](CONTRIBUTING.md).
61
+ * File an issue if a bug is caused by Ransack, is new (has not already been reported), and _can be reproduced from the information you provide_.
62
+ * Contributions are welcome, but please do not add "+1" comments to issues or pull requests :smiley:
63
+
57
64
  ## Usage
58
65
 
59
66
  Ransack can be used in one of two modes, simple or advanced.
@@ -655,6 +662,17 @@ called on a `ransack` search returns a `Mongoid::Criteria` object:
655
662
  @people = @q.result.active.order_by(updated_at: -1).limit(10)
656
663
  ```
657
664
 
665
+ _NOTE: Ransack currently works with either Active Record or Mongoid, but not
666
+ both in the same application. If both are present, Ransack will default to
667
+ Active Record only. Here is the code containing the logic:_
668
+
669
+ ```ruby
670
+ @current_adapters ||= {
671
+ :active_record => defined?(::ActiveRecord::Base),
672
+ :mongoid => defined?(::Mongoid) && !defined?(::ActiveRecord::Base)
673
+ }
674
+ ```
675
+
658
676
  ## Semantic Versioning
659
677
 
660
678
  Ransack attempts to follow semantic versioning in the format of `x.y.z`, where:
data/Rakefile CHANGED
@@ -1,15 +1,11 @@
1
1
  require 'bundler'
2
2
  require 'rspec/core/rake_task'
3
- require 'active_record'
4
3
 
5
4
  Bundler::GemHelper.install_tasks
6
5
 
7
6
  RSpec::Core::RakeTask.new(:spec) do |rspec|
8
7
  ENV['SPEC'] = 'spec/ransack/**/*_spec.rb'
9
- if ActiveRecord::VERSION::MAJOR >= 4 || RUBY_VERSION < '2.2'
10
- # Raises `invalid option: --backtrace` with Rails 3.x on Ruby 2.2
11
- rspec.rspec_opts = ['--backtrace']
12
- end
8
+ rspec.rspec_opts = ['--backtrace']
13
9
  end
14
10
 
15
11
  RSpec::Core::RakeTask.new(:mongoid) do |rspec|
@@ -2,15 +2,11 @@ require 'active_support/core_ext'
2
2
 
3
3
  require 'ransack/configuration'
4
4
 
5
- if defined?(::Mongoid)
6
- require 'ransack/adapters/mongoid/ransack/constants'
7
- else
8
- require 'ransack/adapters/active_record/ransack/constants'
9
- end
5
+ require 'ransack/adapters'
6
+ Ransack::Adapters.require_constants
10
7
 
11
8
  module Ransack
12
9
  extend Configuration
13
-
14
10
  class UntraversableAssociationError < StandardError; end;
15
11
  end
16
12
 
@@ -18,20 +14,18 @@ Ransack.configure do |config|
18
14
  Ransack::Constants::AREL_PREDICATES.each do |name|
19
15
  config.add_predicate name, :arel_predicate => name
20
16
  end
21
-
22
17
  Ransack::Constants::DERIVED_PREDICATES.each do |args|
23
18
  config.add_predicate *args
24
19
  end
25
20
  end
26
21
 
27
- require 'ransack/translate'
28
- require 'ransack/adapters/active_record/ransack/translate' if defined?(::ActiveRecord::Base)
29
- require 'ransack/adapters/mongoid/ransack/translate' if defined?(::Mongoid)
30
22
  require 'ransack/search'
31
23
  require 'ransack/ransacker'
32
- require 'ransack/adapters/active_record' if defined?(::ActiveRecord::Base)
33
- require 'ransack/adapters/mongoid' if defined?(::Mongoid)
34
24
  require 'ransack/helpers'
35
25
  require 'action_controller'
36
26
 
27
+ require 'ransack/translate'
28
+
29
+ Ransack::Adapters.require_adapter
30
+
37
31
  ActionController::Base.helper Ransack::Helpers::FormHelper
@@ -0,0 +1,42 @@
1
+ module Ransack
2
+ module Adapters
3
+
4
+ def self.current_adapters
5
+ @current_adapters ||= {
6
+ :active_record => defined?(::ActiveRecord::Base),
7
+ :mongoid => defined?(::Mongoid) && !defined?(::ActiveRecord::Base)
8
+ }
9
+ end
10
+ def self.require_constants
11
+ require 'ransack/adapters/mongoid/ransack/constants' if current_adapters[:mongoid]
12
+ require 'ransack/adapters/active_record/ransack/constants' if current_adapters[:active_record]
13
+ end
14
+
15
+ def self.require_adapter
16
+ if current_adapters[:active_record]
17
+ require 'ransack/adapters/active_record/ransack/translate'
18
+ require 'ransack/adapters/active_record'
19
+ end
20
+
21
+ if current_adapters[:mongoid]
22
+ require 'ransack/adapters/mongoid/ransack/translate'
23
+ require 'ransack/adapters/mongoid'
24
+ end
25
+ end
26
+
27
+ def self.require_context
28
+ require 'ransack/adapters/active_record/ransack/visitor' if current_adapters[:active_record]
29
+ require 'ransack/adapters/mongoid/ransack/visitor' if current_adapters[:mongoid]
30
+ end
31
+
32
+ def self.require_nodes
33
+ require 'ransack/adapters/active_record/ransack/nodes/condition' if current_adapters[:active_record]
34
+ require 'ransack/adapters/mongoid/ransack/nodes/condition' if current_adapters[:mongoid]
35
+ end
36
+
37
+ def self.require_search
38
+ require 'ransack/adapters/active_record/ransack/context' if current_adapters[:active_record]
39
+ require 'ransack/adapters/mongoid/ransack/context' if current_adapters[:mongoid]
40
+ end
41
+ end
42
+ end
@@ -182,23 +182,19 @@ module Ransack
182
182
  :build, Polyamorous::Join.new(name, @join_type, klass), parent
183
183
  )
184
184
  found_association = @join_dependency.join_associations.last
185
- apply_default_conditions(found_association)
185
+
186
+ default_conditions = found_association.active_record.scoped.arel.constraints
187
+ if default_conditions.any?
188
+ and_default_conditions = "AND #{default_conditions.reduce(&:and).to_sql}"
189
+ end
190
+
186
191
  # Leverage the stashed association functionality in AR
187
- @object = @object.joins(found_association)
192
+ @object = @object.joins(found_association).joins(and_default_conditions)
188
193
  end
189
194
 
190
195
  found_association
191
196
  end
192
197
 
193
- def apply_default_conditions(join_association)
194
- reflection = join_association.reflection
195
- default_scope = join_association.active_record.scoped
196
- default_conditions = default_scope.arel.where_clauses
197
- if default_conditions.any?
198
- reflection.options[:conditions] = default_conditions
199
- end
200
- end
201
-
202
198
  end
203
199
  end
204
200
  end
@@ -90,8 +90,8 @@ module Ransack
90
90
  #
91
91
  def join_sources
92
92
  base = Arel::SelectManager.new(@object.engine, @object.table)
93
- joins = @object.joins_values
94
- joins.each do |assoc|
93
+ @object.joins_values.each do |assoc|
94
+ next unless assoc.is_a?(JoinDependency::JoinAssociation)
95
95
  assoc.join_to(base)
96
96
  end
97
97
  base.join_sources
@@ -151,7 +151,7 @@ module Ransack
151
151
  Constants::STRING_JOIN
152
152
  when Hash, Symbol, Array
153
153
  Constants::ASSOCIATION_JOIN
154
- when ::ActiveRecord::Associations::JoinDependency::JoinAssociation
154
+ when JoinDependency::JoinAssociation
155
155
  Constants::STASHED_JOIN
156
156
  when Arel::Nodes::Join
157
157
  Constants::JOIN_NODE
@@ -196,23 +196,19 @@ module Ransack
196
196
  :build, Polyamorous::Join.new(name, @join_type, klass), parent
197
197
  )
198
198
  found_association = @join_dependency.join_associations.last
199
- apply_default_conditions(found_association)
199
+
200
+ default_conditions = found_association.active_record.scoped.arel.constraints
201
+ if default_conditions.any?
202
+ and_default_conditions = "AND #{default_conditions.reduce(&:and).to_sql}"
203
+ end
204
+
200
205
  # Leverage the stashed association functionality in AR
201
- @object = @object.joins(found_association)
206
+ @object = @object.joins(found_association).joins(and_default_conditions)
202
207
  end
203
208
 
204
209
  found_association
205
210
  end
206
211
 
207
- def apply_default_conditions(join_association)
208
- reflection = join_association.reflection
209
- default_scope = join_association.active_record.scoped
210
- default_conditions = default_scope.arel.where_clauses
211
- if default_conditions.any?
212
- reflection.options[:conditions] = default_conditions
213
- end
214
- end
215
-
216
212
  end
217
213
  end
218
214
  end
@@ -35,7 +35,7 @@ module Ransack
35
35
  def format_predicate(predicate)
36
36
  predicate.tap do
37
37
  if casted_array_with_in_predicate?(predicate)
38
- predicate.right[0] = predicate.right[0].val.map { |v| format(v) }
38
+ predicate.right[0] = format_values_for(predicate.right[0])
39
39
  end
40
40
  end
41
41
  end
@@ -47,12 +47,9 @@ module Ransack
47
47
  predicate.right[0].val.is_a?(Array)
48
48
  end
49
49
 
50
- # Necessary for Arel >= 6.0 (Rails >= 4.2)
51
- def format(value)
52
- if value.is_a?(String)
53
- Arel::Nodes.build_quoted(value)
54
- else
55
- value
50
+ def format_values_for(predicate)
51
+ predicate.val.map do |value|
52
+ value.is_a?(String) ? Arel::Nodes.build_quoted(value) : value
56
53
  end
57
54
  end
58
55
 
@@ -73,7 +73,7 @@ module Ransack
73
73
  end
74
74
 
75
75
  def reflect_on_all_associations_all
76
- reflect_on_all_associations(:belongs_to, :has_one, :has_many)
76
+ reflect_on_all_associations(:belongs_to, :has_one, :has_many, :embeds_many, :embedded_in)
77
77
  end
78
78
 
79
79
  # For overriding with a whitelist of symbols
@@ -87,6 +87,10 @@ module Ransack
87
87
  []
88
88
  end
89
89
 
90
+ def custom_join_ast *args
91
+ []
92
+ end
93
+
90
94
  def first(*args)
91
95
  if args.size == 0
92
96
  super
@@ -21,7 +21,7 @@ module Ransack
21
21
 
22
22
  def type_for(attr)
23
23
  return nil unless attr && attr.valid?
24
- name = attr.arel_attribute.name.to_s
24
+ name = attr.arel_attribute.name.to_s.split('.').last
25
25
  # table = attr.arel_attribute.relation.table_name
26
26
 
27
27
  # schema_cache = @engine.connection.schema_cache
@@ -38,7 +38,7 @@ module Ransack
38
38
 
39
39
  name = '_id' if name == 'id'
40
40
 
41
- t = object.klass.fields[name].type
41
+ t = object.klass.fields[name].try(:type) || @bind_pairs[attr.name].first.fields[name].type
42
42
 
43
43
  t.to_s.demodulize.underscore.to_sym
44
44
  end
@@ -114,10 +114,10 @@ module Ransack
114
114
  segments.pop) && segments.size > 0 && !found_assoc do
115
115
  assoc, klass = unpolymorphize_association(segments.join('_'))
116
116
  if found_assoc = get_association(assoc, parent)
117
- join = build_or_find_association(found_assoc.name, parent, klass)
118
117
  parent, attr_name = get_parent_and_attribute_name(
119
- remainder.join('_'), join
118
+ remainder.join('_'), found_assoc.klass
120
119
  )
120
+ attr_name = "#{segments.join('_')}.#{attr_name}"
121
121
  end
122
122
  end
123
123
  end
@@ -1,12 +1,5 @@
1
1
  require 'ransack/visitor'
2
-
3
- if defined?(::ActiveRecord::Base)
4
- require 'ransack/adapters/active_record/ransack/visitor'
5
- end
6
-
7
- if defined?(::Mongoid)
8
- require 'ransack/adapters/mongoid/ransack/visitor'
9
- end
2
+ Ransack::Adapters.require_context
10
3
 
11
4
  module Ransack
12
5
  class Context
@@ -15,8 +15,7 @@ module Ransack
15
15
  elsif record.is_a?(Array) &&
16
16
  (search = record.detect { |o| o.is_a?(Ransack::Search) })
17
17
  options[:url] ||= polymorphic_path(
18
- record.map { |o| o.is_a?(Ransack::Search) ? o.klass : o },
19
- format: options.delete(:format)
18
+ options_for(record), format: options.delete(:format)
20
19
  )
21
20
  else
22
21
  raise ArgumentError,
@@ -24,13 +23,9 @@ module Ransack
24
23
  end
25
24
  options[:html] ||= {}
26
25
  html_options = {
27
- :class => options[:class].present? ?
28
- "#{options[:class]}" :
29
- "#{search.klass.to_s.underscore}_search",
30
- :id => options[:id].present? ?
31
- "#{options[:id]}" :
32
- "#{search.klass.to_s.underscore}_search",
33
- :method => :get
26
+ class: html_option_for(options[:class], search),
27
+ id: html_option_for(options[:id], search),
28
+ method: :get
34
29
  }
35
30
  options[:as] ||= Ransack.options[:search_key]
36
31
  options[:html].reverse_merge!(html_options)
@@ -54,6 +49,26 @@ module Ransack
54
49
 
55
50
  private
56
51
 
52
+ def options_for(record)
53
+ record.map &method(:parse_record)
54
+ end
55
+
56
+ def parse_record(object)
57
+ if object.is_a?(Ransack::Search)
58
+ object.klass
59
+ else
60
+ object
61
+ end
62
+ end
63
+
64
+ def html_option_for(option, search)
65
+ if option.present?
66
+ option.to_s
67
+ else
68
+ "#{search.klass.to_s.underscore}_search"
69
+ end
70
+ end
71
+
57
72
  def extract_search_and_routing_proxy(search)
58
73
  if search.is_a? Array
59
74
  [search.second, search.first]
@@ -75,14 +90,12 @@ module Ransack
75
90
  @search = search
76
91
  @params = params
77
92
  @field = attribute.to_s
78
- sort_fields = extract_sort_fields_and_mutate_args!(args).compact
93
+ @sort_fields = extract_sort_fields_and_mutate_args!(args).compact
79
94
  @current_dir = existing_sort_direction
80
95
  @label_text = extract_label_and_mutate_args!(args)
81
96
  @options = extract_options_and_mutate_args!(args)
82
97
  @hide_indicator = @options.delete :hide_indicator
83
98
  @default_order = @options.delete :default_order
84
- @sort_params = build_sort(sort_fields)
85
- @sort_params = @sort_params.first if @sort_params.size == 1
86
99
  end
87
100
 
88
101
  def name
@@ -100,10 +113,10 @@ module Ransack
100
113
 
101
114
  def html_options(args)
102
115
  html_options = extract_options_and_mutate_args!(args)
103
- html_options.merge(class:
104
- [[Constants::SORT_LINK, @current_dir], html_options[:class]]
105
- .compact.join(Constants::SPACE)
106
- )
116
+ html_options.merge(
117
+ class: [[Constants::SORT_LINK, @current_dir], html_options[:class]]
118
+ .compact.join(Constants::SPACE)
119
+ )
107
120
  end
108
121
 
109
122
  private
@@ -120,7 +133,7 @@ module Ransack
120
133
  if args.first.is_a? String
121
134
  args.shift
122
135
  else
123
- Translate.attribute(@field, :context => @search.context)
136
+ Translate.attribute(@field, context: @search.context)
124
137
  end
125
138
  end
126
139
 
@@ -133,16 +146,25 @@ module Ransack
133
146
  end
134
147
 
135
148
  def search_and_sort_params
136
- search_params.merge(:s => @sort_params)
149
+ search_params.merge(s: sort_params)
137
150
  end
138
151
 
139
152
  def search_params
140
153
  @params[@search.context.search_key].presence || {}
141
154
  end
142
155
 
143
- def build_sort(fields)
156
+ def sort_params
157
+ sort_array = recursive_sort_params_build(@sort_fields)
158
+ if sort_array.size == 1
159
+ sort_array.first
160
+ else
161
+ sort_array
162
+ end
163
+ end
164
+
165
+ def recursive_sort_params_build(fields)
144
166
  return [] if fields.empty?
145
- [parse_sort(fields[0])] + build_sort(fields.drop(1))
167
+ [parse_sort(fields[0])] + recursive_sort_params_build(fields.drop 1)
146
168
  end
147
169
 
148
170
  def parse_sort(field)
@@ -154,8 +176,7 @@ module Ransack
154
176
  end
155
177
 
156
178
  def detect_previous_sort_direction_and_invert_it(attr_name)
157
- sort_dir = existing_sort_direction(attr_name)
158
- if sort_dir
179
+ if sort_dir = existing_sort_direction(attr_name)
159
180
  direction_text(sort_dir)
160
181
  else
161
182
  default_sort_order(attr_name) || Constants::ASC
@@ -169,7 +190,11 @@ module Ransack
169
190
  end
170
191
 
171
192
  def default_sort_order(attr_name)
172
- Hash === @default_order ? @default_order[attr_name] : @default_order
193
+ if Hash === @default_order
194
+ @default_order[attr_name]
195
+ else
196
+ @default_order
197
+ end
173
198
  end
174
199
 
175
200
  def order_indicator
@@ -0,0 +1,70 @@
1
+ de:
2
+ ransack:
3
+ search: "suchen"
4
+ predicate: "Eigenschaft"
5
+ and: "und"
6
+ or: "oder"
7
+ any: "beliebige"
8
+ all: "alle"
9
+ combinator: "Kombinator"
10
+ attribute: "Attribut"
11
+ value: "Wert"
12
+ condition: "Bedingung"
13
+ sort: "sortieren"
14
+ asc: "aufsteigend"
15
+ desc: "absteigend"
16
+ predicates:
17
+ eq: "gleicht"
18
+ eq_any: "gleicht beliebigen"
19
+ eq_all: "gleicht allen"
20
+ not_eq: "ungleich"
21
+ not_eq_any: "ungleich beliebigen"
22
+ not_eq_all: "ungleich allen"
23
+ matches: "entspricht"
24
+ matches_any: "stimmt überein mit einem beliebigen"
25
+ matches_all: "stimmt mit allen überein"
26
+ does_not_match: "stimmt nicht überein"
27
+ does_not_match_any: "erfüllt ein beliebiger/s nicht"
28
+ does_not_match_all: "stimmt nicht mit allen überein"
29
+ lt: "kleiner als"
30
+ lt_any: "kleiner als ein beliebiger/s"
31
+ lt_all: "kleiner als alle als alle"
32
+ lteq: "kleiner oder gleich"
33
+ lteq_any: "kleiner oder gleich beliebige"
34
+ lteq_all: "kleiner oder gleich allen"
35
+ gt: "größer als"
36
+ gt_any: "größer als ein beliebiger/s"
37
+ gt_all: "größer als alle"
38
+ gteq: "größer oder gleich"
39
+ gteq_any: "größer oder gleich als ein beliebiger/s"
40
+ gteq_all: "größer oder gleich alle"
41
+ in: "in"
42
+ in_any: "ist nicht in einem beliebigen"
43
+ in_all: "in allen"
44
+ not_in: "nicht in"
45
+ not_in_any: "nicht in beliebige"
46
+ not_in_all: "nicht in allen"
47
+ cont: "enthält"
48
+ cont_any: "enthält beliebige"
49
+ cont_all: "enthält alle"
50
+ not_cont: "enthält nicht"
51
+ not_cont_any: "enthält ein beliebiger/s nicht"
52
+ not_cont_all: "enthält keine/s"
53
+ start: "beginnt mit"
54
+ start_any: "beginnt mit beliebigen"
55
+ start_all: "beginnt mit allen"
56
+ not_start: "beginnt nicht mit"
57
+ not_start_any: "beginnt nicht mit beliebigen"
58
+ not_start_all: "beginnt nicht mit allen"
59
+ end: "endet mit"
60
+ end_any: "endet mit beliebigen"
61
+ end_all: "endet mit allen"
62
+ not_end: "endet nicht mit"
63
+ not_end_any: "endet nicht mit beliebigen"
64
+ not_end_all: "endet nicht mit allen"
65
+ 'true': "ist wahr"
66
+ 'false': "ist falsch"
67
+ present: "ist vorhanden"
68
+ blank: "ist leer"
69
+ 'null': "ist null"
70
+ not_null: "ist nicht null"
@@ -3,7 +3,6 @@ require 'ransack/nodes/node'
3
3
  require 'ransack/nodes/attribute'
4
4
  require 'ransack/nodes/value'
5
5
  require 'ransack/nodes/condition'
6
- require 'ransack/adapters/active_record/ransack/nodes/condition' if defined?(::ActiveRecord::Base)
7
- require 'ransack/adapters/mongoid/ransack/nodes/condition' if defined?(::Mongoid)
6
+ Ransack::Adapters.require_nodes
8
7
  require 'ransack/nodes/sort'
9
- require 'ransack/nodes/grouping'
8
+ require 'ransack/nodes/grouping'
@@ -22,7 +22,7 @@ module Ransack
22
22
  def valid?
23
23
  bound? && attr &&
24
24
  context.klassify(parent).ransackable_attributes(context.auth_object)
25
- .include?(attr_name)
25
+ .include?(attr_name.split('.').last)
26
26
  end
27
27
 
28
28
  def type
@@ -9,7 +9,7 @@ module Ransack
9
9
 
10
10
  class << self
11
11
  def extract(context, key, values)
12
- attributes, predicate = extract_attributes_and_predicate(key)
12
+ attributes, predicate = extract_attributes_and_predicate(key, context)
13
13
  if attributes.size > 0 && predicate
14
14
  combinator = key.match(/_(or|and)_/) ? $1 : nil
15
15
  condition = self.new(context)
@@ -31,14 +31,18 @@ module Ransack
31
31
 
32
32
  private
33
33
 
34
- def extract_attributes_and_predicate(key)
34
+ def extract_attributes_and_predicate(key, context = nil)
35
35
  str = key.dup
36
36
  name = Predicate.detect_and_strip_from_string!(str)
37
37
  predicate = Predicate.named(name)
38
38
  unless predicate || Ransack.options[:ignore_unknown_conditions]
39
39
  raise ArgumentError, "No valid predicate for #{key}"
40
40
  end
41
- attributes = str.split(/_and_|_or_/)
41
+ if context.present? && context.attribute_method?(str)
42
+ attributes = [str]
43
+ else
44
+ attributes = str.split(/_and_|_or_/)
45
+ end
42
46
  [attributes, predicate]
43
47
  end
44
48
  end
@@ -1,14 +1,6 @@
1
1
  require 'ransack/nodes'
2
2
  require 'ransack/context'
3
-
4
- if defined?(::ActiveRecord::Base)
5
- require 'ransack/adapters/active_record/ransack/context'
6
- end
7
-
8
- if defined?(::Mongoid)
9
- require 'ransack/adapters/mongoid/ransack/context'
10
- end
11
-
3
+ Ransack::Adapters.require_search
12
4
  require 'ransack/naming'
13
5
 
14
6
  module Ransack
@@ -1,3 +1,3 @@
1
1
  module Ransack
2
- VERSION = '1.6.6'
2
+ VERSION = '1.7.0'
3
3
  end
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.authors = ["Ernie Miller", "Ryan Bigg", "Jon Atack"]
10
10
  s.email = ["ernie@erniemiller.org", "radarlistener@gmail.com", "jonnyatack@gmail.com"]
11
11
  s.homepage = "https://github.com/activerecord-hackery/ransack"
12
- s.summary = %q{Object-based searching for ActiveRecord (currently).}
12
+ s.summary = %q{Object-based searching for Active Record and Mongoid (currently).}
13
13
  s.description = %q{Ransack is the successor to the MetaSearch gem. It improves and expands upon MetaSearch's functionality, but does not have a 100%-compatible API.}
14
14
  s.required_ruby_version = '>= 1.9'
15
15
  s.license = 'MIT'
@@ -21,16 +21,15 @@ Gem::Specification.new do |s|
21
21
  s.add_dependency 'activesupport', '>= 3.0'
22
22
  s.add_dependency 'i18n'
23
23
  s.add_dependency 'polyamorous', '~> 1.2'
24
- s.add_development_dependency 'rspec', '~> 2.14.0'
24
+ s.add_development_dependency 'rspec', '~> 2'
25
25
  s.add_development_dependency 'machinist', '~> 1.0.6'
26
26
  s.add_development_dependency 'faker', '~> 0.9.5'
27
27
  s.add_development_dependency 'sqlite3', '~> 1.3.3'
28
28
  s.add_development_dependency 'pg'
29
- s.add_development_dependency 'mysql2', '0.3.14'
29
+ s.add_development_dependency 'mysql2', '0.3.18'
30
30
  s.add_development_dependency 'pry', '0.9.12.2'
31
31
 
32
- s.files = `git ls-files`
33
- .split("\n")
32
+ s.files = `git ls-files`.split("\n")
34
33
 
35
34
  s.test_files = `git ls-files -- {test,spec,features}/*`
36
35
  .split("\n")
@@ -26,7 +26,7 @@ module Ransack
26
26
  Ransack.configure { |config| config.ignore_unknown_conditions = true }
27
27
  end
28
28
 
29
- specify { subject.should be_nil }
29
+ specify { expect(subject).to be_nil }
30
30
  end
31
31
  end
32
32
  end
@@ -25,48 +25,48 @@ module Ransack
25
25
 
26
26
  it "applies true scopes" do
27
27
  s = Person.ransack('active' => true)
28
- s.result.to_sql.should include "active = 1"
28
+ expect(s.result.to_sql).to (include 'active = 1')
29
29
  end
30
30
 
31
31
  it "applies stringy true scopes" do
32
32
  s = Person.ransack('active' => 'true')
33
- s.result.to_sql.should include "active = 1"
33
+ expect(s.result.to_sql).to (include 'active = 1')
34
34
  end
35
35
 
36
36
  it "applies stringy boolean scopes with true value in an array" do
37
37
  s = Person.ransack('of_age' => ['true'])
38
- s.result.to_sql.should include "age >= 18"
38
+ expect(s.result.to_sql).to (include 'age >= 18')
39
39
  end
40
40
 
41
41
  it "applies stringy boolean scopes with false value in an array" do
42
42
  s = Person.ransack('of_age' => ['false'])
43
- s.result.to_sql.should include "age < 18"
43
+ expect(s.result.to_sql).to (include 'age < 18')
44
44
  end
45
45
 
46
46
  it "ignores unlisted scopes" do
47
47
  s = Person.ransack('restricted' => true)
48
- s.result.to_sql.should_not include "restricted"
48
+ expect(s.result.to_sql).to_not (include 'restricted')
49
49
  end
50
50
 
51
51
  it "ignores false scopes" do
52
52
  s = Person.ransack('active' => false)
53
- s.result.to_sql.should_not include "active"
53
+ expect(s.result.to_sql).not_to (include 'active')
54
54
  end
55
55
 
56
56
  it "ignores stringy false scopes" do
57
57
  s = Person.ransack('active' => 'false')
58
- s.result.to_sql.should_not include "active"
58
+ expect(s.result.to_sql).to_not (include 'active')
59
59
  end
60
60
 
61
61
  it "passes values to scopes" do
62
62
  s = Person.ransack('over_age' => 18)
63
- s.result.to_sql.should include "age > 18"
63
+ expect(s.result.to_sql).to (include 'age > 18')
64
64
  end
65
65
 
66
66
  it "chains scopes" do
67
67
  s = Person.ransack('over_age' => 18, 'active' => true)
68
- s.result.to_sql.should include "age > 18"
69
- s.result.to_sql.should include "active = 1"
68
+ expect(s.result.to_sql).to (include 'age > 18')
69
+ expect(s.result.to_sql).to (include 'active = 1')
70
70
  end
71
71
  end
72
72
 
@@ -145,6 +145,9 @@ module Ransack
145
145
  end
146
146
 
147
147
  it "should function correctly with a multi-parameter attribute" do
148
+ ::ActiveRecord::Base.default_timezone = :utc
149
+ Time.zone = 'UTC'
150
+
148
151
  date = Date.current
149
152
  s = Person.ransack(
150
153
  { "created_at_gteq(1i)" => date.year,
@@ -228,14 +231,9 @@ module Ransack
228
231
  end
229
232
 
230
233
  it "should function correctly when an attribute name has 'and' in it" do
231
- # FIXME: this test does not pass!
232
234
  p = Person.create!(:terms_and_conditions => true)
233
235
  s = Person.ransack(:terms_and_conditions_eq => true)
234
- # search is not detecting the attribute
235
- puts "
236
- FIXME: Search not detecting the `terms_and_conditions` attribute in
237
- base_spec.rb, line 178: #{s.result.to_sql}"
238
- # expect(s.result.to_a).to eq [p]
236
+ expect(s.result.to_a).to eq [p]
239
237
  end
240
238
 
241
239
  it 'allows sort by "only_sort" field' do
@@ -9,10 +9,11 @@ module Ransack
9
9
  describe Context do
10
10
  subject { Context.new(Person) }
11
11
 
12
- if AR_version >= "3.1"
13
- its(:alias_tracker) {
14
- should be_a ::ActiveRecord::Associations::AliasTracker
15
- }
12
+ if AR_version >= '3.1'
13
+ it 'has an Active Record alias tracker method' do
14
+ expect(subject.alias_tracker)
15
+ .to be_an ::ActiveRecord::Associations::AliasTracker
16
+ end
16
17
  end
17
18
 
18
19
  describe '#relation_for' do
@@ -1,3 +1,4 @@
1
+ =begin
1
2
  rails = ::ActiveRecord::VERSION::STRING.first(3)
2
3
 
3
4
  if %w(3.2 4.0 4.1).include?(rails) || rails == '3.1' && RUBY_VERSION < '2.2'
@@ -8,3 +9,4 @@ if %w(3.2 4.0 4.1).include?(rails) || rails == '3.1' && RUBY_VERSION < '2.2'
8
9
  end
9
10
  end
10
11
  end
12
+ =end
@@ -34,7 +34,7 @@ module Ransack
34
34
  Ransack.configure { |c| c.ignore_unknown_conditions = true }
35
35
  end
36
36
 
37
- specify { subject.should be_nil }
37
+ specify { expect(subject).to be_nil }
38
38
  end
39
39
  end
40
40
  end
@@ -15,37 +15,37 @@ module Ransack
15
15
  describe '#attribute_method?' do
16
16
  context 'for attributes of the context' do
17
17
  it 'is true' do
18
- expect(subject.attribute_method?('name')).to be_true
18
+ expect(subject.attribute_method?('name')).to be true
19
19
  end
20
20
 
21
21
  context "when the attribute contains '_and_'" do
22
22
  it 'is true' do
23
- expect(subject.attribute_method?('terms_and_conditions')).to be_true
23
+ expect(subject.attribute_method?('terms_and_conditions')).to be true
24
24
  end
25
25
  end
26
26
 
27
27
  context "when the attribute contains '_or_'" do
28
28
  it 'is true' do
29
- expect(subject.attribute_method?('true_or_false')).to be_true
29
+ expect(subject.attribute_method?('true_or_false')).to be true
30
30
  end
31
31
  end
32
32
 
33
33
  context "when the attribute ends with '_start'" do
34
34
  it 'is true' do
35
- expect(subject.attribute_method?('life_start')).to be_true
35
+ expect(subject.attribute_method?('life_start')).to be true
36
36
  end
37
37
  end
38
38
 
39
39
  context "when the attribute ends with '_end'" do
40
40
  it 'is true' do
41
- expect(subject.attribute_method?('stop_end')).to be_true
41
+ expect(subject.attribute_method?('stop_end')).to be true
42
42
  end
43
43
  end
44
44
  end
45
45
 
46
46
  context 'for unknown attributes' do
47
47
  it 'is false' do
48
- expect(subject.attribute_method?('not_an_attribute')).to be_false
48
+ expect(subject.attribute_method?('not_an_attribute')).to be false
49
49
  end
50
50
  end
51
51
  end
@@ -93,9 +93,10 @@ module Ransack
93
93
  expect(condition.value).to eq 'Ernie'
94
94
  end
95
95
 
96
- it 'preserves default scope conditions for associations' do
97
- search = Search.new(Person, articles_title_eq: 'Test')
96
+ it 'preserves default scope and conditions for associations' do
97
+ search = Search.new(Person, published_articles_title_eq: 'Test')
98
98
  expect(search.result.to_sql).to include 'default_scope'
99
+ expect(search.result.to_sql).to include 'published'
99
100
  end
100
101
 
101
102
  it 'discards empty conditions' do
@@ -33,6 +33,11 @@ class Person < ActiveRecord::Base
33
33
  belongs_to :parent, :class_name => 'Person', :foreign_key => :parent_id
34
34
  has_many :children, :class_name => 'Person', :foreign_key => :parent_id
35
35
  has_many :articles
36
+ if ActiveRecord::VERSION::MAJOR == 3
37
+ has_many :published_articles, conditions: { published: true }, class_name: "Article"
38
+ else
39
+ has_many :published_articles, ->{ where(published: true) }, class_name: "Article"
40
+ end
36
41
  has_many :comments
37
42
  has_many :authored_article_comments, :through => :articles,
38
43
  :source => :comments, :foreign_key => :person_id
@@ -171,6 +176,7 @@ module Schema
171
176
  t.string :title
172
177
  t.text :subject_header
173
178
  t.text :body
179
+ t.boolean :published, default: true
174
180
  end
175
181
 
176
182
  create_table :comments, :force => true do |t|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ransack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.6
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ernie Miller
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-04-05 00:00:00.000000000 Z
13
+ date: 2015-08-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: actionpack
@@ -88,14 +88,14 @@ dependencies:
88
88
  requirements:
89
89
  - - "~>"
90
90
  - !ruby/object:Gem::Version
91
- version: 2.14.0
91
+ version: '2'
92
92
  type: :development
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
- version: 2.14.0
98
+ version: '2'
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: machinist
101
101
  requirement: !ruby/object:Gem::Requirement
@@ -158,14 +158,14 @@ dependencies:
158
158
  requirements:
159
159
  - - '='
160
160
  - !ruby/object:Gem::Version
161
- version: 0.3.14
161
+ version: 0.3.18
162
162
  type: :development
163
163
  prerelease: false
164
164
  version_requirements: !ruby/object:Gem::Requirement
165
165
  requirements:
166
166
  - - '='
167
167
  - !ruby/object:Gem::Version
168
- version: 0.3.14
168
+ version: 0.3.18
169
169
  - !ruby/object:Gem::Dependency
170
170
  name: pry
171
171
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +199,7 @@ files:
199
199
  - README.md
200
200
  - Rakefile
201
201
  - lib/ransack.rb
202
+ - lib/ransack/adapters.rb
202
203
  - lib/ransack/adapters/active_record.rb
203
204
  - lib/ransack/adapters/active_record/3.0/compat.rb
204
205
  - lib/ransack/adapters/active_record/3.0/context.rb
@@ -233,6 +234,7 @@ files:
233
234
  - lib/ransack/helpers/form_builder.rb
234
235
  - lib/ransack/helpers/form_helper.rb
235
236
  - lib/ransack/locale/cs.yml
237
+ - lib/ransack/locale/de.yml
236
238
  - lib/ransack/locale/en.yml
237
239
  - lib/ransack/locale/es.yml
238
240
  - lib/ransack/locale/fr.yml
@@ -310,10 +312,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
310
312
  version: '0'
311
313
  requirements: []
312
314
  rubyforge_project: ransack
313
- rubygems_version: 2.4.6
315
+ rubygems_version: 2.4.8
314
316
  signing_key:
315
317
  specification_version: 4
316
- summary: Object-based searching for ActiveRecord (currently).
318
+ summary: Object-based searching for Active Record and Mongoid (currently).
317
319
  test_files:
318
320
  - spec/blueprints/articles.rb
319
321
  - spec/blueprints/comments.rb