ransack 1.8.4 → 1.8.6

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: c8e6d1b7f6033421d1b31eff646ed9a001e372a3
4
- data.tar.gz: 9a2736272f385849dc81f3a5f915c40ccde4d74e
3
+ metadata.gz: f251a5a3d39a780d575f8f18abd01de4a9096caa
4
+ data.tar.gz: 8846114332ef60596d2fc18b52cdb5715928e425
5
5
  SHA512:
6
- metadata.gz: 701f44cf5ed1ffa5c4c28ddf7267270161affdc70e6c5feffa1cd73e6fca16ab1438b836476337b41e25f67cfa71c5c4a51943f7848ea65150aeda5dd9ad2b8b
7
- data.tar.gz: 221fc344c558b0c152363ecee786b9be06bb2d45460af5c0942485f56d36856d465c4ca039e248c9d879b8d6d44ebbff8b22e43d0e6ab66fef94293cfe1c6561
6
+ metadata.gz: 86d509ea419bfe2bb1d43096e670f0736826c996a36f5fac74c650eaeb081a77832f8ff7edba63beaae0ad17ae2d4d8211aa99e5d003d259dff5fcb127187514
7
+ data.tar.gz: 705778bb578589bd055606eedfbe1ec10fdc01ab26508695fc0386d276f233c0bcdb767220331cf2b6b6b8b352d8b9c60edd9ef1c303e66ea4ea6cdb86725cb5
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  .bundle
3
3
  Gemfile.lock
4
4
  pkg/*
5
+ coverage/*
data/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # Change Log
2
2
 
3
+ ## Version 1.8.6 - 2018-01-23
4
+
5
+ ### Added
6
+
7
+ * Improve memory usage
8
+ PR [#820](https://github.com/activerecord-hackery/ransack/pull/820)
9
+
10
+ * Bump Polyamorous version to 1.3.2
11
+ PR [#858](https://github.com/activerecord-hackery/ransack/pull/858)
12
+
13
+ ## Version 1.8.5
14
+
15
+ ### Added
16
+
17
+ * Added Turkish Translations
18
+ PR [#835](https://github.com/activerecord-hackery/ransack/issues/835).
19
+
20
+ ## Version 1.8.4 - 2017-10-09
21
+
22
+ ### Added
23
+
24
+ * Added italian translations.
25
+ PR [#833](https://github.com/activerecord-hackery/ransack/pull/833).
26
+
27
+ * Add an optional default arrow for unsorted fields.
28
+ PR [#816](https://github.com/activerecord-hackery/ransack/pull/816/files).
29
+
30
+ ### Fixed
31
+
32
+ * Cast Postgres money type to float.
33
+ PR [#823](https://github.com/activerecord-hackery/ransack/pull/823).
34
+
35
+ * Fix the bug in sort_link, which causes the multiple fields option to be
36
+ ignored when block parameter is specified.
37
+ PR [#818](https://github.com/activerecord-hackery/ransack/pull/818).
38
+
39
+ * No need pass some arugments to JoinAssociation#join_constraints in Rails 5.1.
40
+ PR [#814](https://github.com/activerecord-hackery/ransack/pull/814).
41
+ Fixes [#807](https://github.com/activerecord-hackery/ransack/issues/807).
42
+ Reference [rails/rails#28267](https://github.com/rails/rails/pull/28267)
43
+ and [rails/rails#27851](https://github.com/rails/rails/pull/27851).
44
+
3
45
  ## Version 1.8.3 - 2017-06-15
4
46
 
5
47
  ### Added
data/Gemfile CHANGED
@@ -51,4 +51,5 @@ end
51
51
  group :test do
52
52
  # TestUnit was removed from Ruby 2.2 but still needed for testing Rails 3.x.
53
53
  gem 'test-unit', '~> 3.0' if RUBY_VERSION >= '2.2'
54
+ gem 'simplecov', :require => false
54
55
  end
data/lib/ransack.rb CHANGED
@@ -26,4 +26,6 @@ require 'ransack/translate'
26
26
 
27
27
  Ransack::Adapters.object_mapper.require_adapter
28
28
 
29
- ActionController::Base.helper Ransack::Helpers::FormHelper
29
+ ActiveSupport.on_load(:action_controller) do
30
+ ActionController::Base.helper Ransack::Helpers::FormHelper
31
+ end
@@ -44,7 +44,7 @@ module Ransack
44
44
 
45
45
  if ransackable_attribute?(str, klass)
46
46
  exists = true
47
- elsif (segments = str.split(/_/)).size > 1
47
+ elsif (segments = str.split(Constants::UNDERSCORE)).size > 1
48
48
  remainder = []
49
49
  found_assoc = nil
50
50
  while !found_assoc && remainder.unshift(segments.pop) &&
@@ -98,7 +98,7 @@ module Ransack
98
98
 
99
99
  if ransackable_attribute?(str, klassify(parent))
100
100
  attr_name = str
101
- elsif (segments = str.split(/_/)).size > 1
101
+ elsif (segments = str.split(Constants::UNDERSCORE)).size > 1
102
102
  remainder = []
103
103
  found_assoc = nil
104
104
  while remainder.unshift(segments.pop) && segments.size > 0 &&
@@ -38,7 +38,7 @@ module Ransack
38
38
 
39
39
  if ransackable_attribute?(str, klass)
40
40
  exists = true
41
- elsif (segments = str.split(/_/)).size > 1
41
+ elsif (segments = str.split(Constants::UNDERSCORE)).size > 1
42
42
  remainder = []
43
43
  found_assoc = nil
44
44
  while !found_assoc && remainder.unshift(segments.pop) &&
@@ -105,7 +105,7 @@ module Ransack
105
105
 
106
106
  if ransackable_attribute?(str, klassify(parent))
107
107
  attr_name = str
108
- elsif (segments = str.split(/_/)).size > 1
108
+ elsif (segments = str.split(Constants::UNDERSCORE)).size > 1
109
109
  remainder = []
110
110
  found_assoc = nil
111
111
  while remainder.unshift(segments.pop) && segments.size > 0 &&
@@ -32,7 +32,7 @@ module Ransack
32
32
  # For overriding with a whitelist array of strings.
33
33
  #
34
34
  def ransackable_attributes(auth_object = nil)
35
- if Ransack::SUPPORTS_ATTRIBUTE_ALIAS
35
+ @ransackable_attributes ||= if Ransack::SUPPORTS_ATTRIBUTE_ALIAS
36
36
  column_names + _ransackers.keys + _ransack_aliases.keys +
37
37
  attribute_aliases.keys
38
38
  else
@@ -45,7 +45,7 @@ module Ransack
45
45
  # For overriding with a whitelist array of strings.
46
46
  #
47
47
  def ransackable_associations(auth_object = nil)
48
- reflect_on_all_associations.map { |a| a.name.to_s }
48
+ @ransackable_associations ||= reflect_on_all_associations.map { |a| a.name.to_s }
49
49
  end
50
50
 
51
51
  # Ransortable_attributes, by default, returns the names
@@ -45,7 +45,7 @@ module Ransack
45
45
  exists = false
46
46
  if ransackable_attribute?(str, klass)
47
47
  exists = true
48
- elsif (segments = str.split(/_/)).size > 1
48
+ elsif (segments = str.split(Constants::UNDERSCORE)).size > 1
49
49
  remainder = []
50
50
  found_assoc = nil
51
51
  while !found_assoc && remainder.unshift(segments.pop) &&
@@ -268,7 +268,8 @@ module Ransack
268
268
  association_joins = buckets[:association_join]
269
269
  stashed_association_joins = buckets[:stashed_join]
270
270
  join_nodes = buckets[:join_node].uniq
271
- string_joins = buckets[:string_join].map(&:strip).uniq
271
+ string_joins = buckets[:string_join].map(&:strip)
272
+ string_joins.uniq!
272
273
 
273
274
  join_list =
274
275
  if ::ActiveRecord::VERSION::MAJOR >= 5
@@ -295,10 +296,9 @@ module Ransack
295
296
  end
296
297
 
297
298
  def convert_join_strings_to_ast(table, joins)
299
+ joins.map! { |join| table.create_string_join(Arel.sql(join)) unless join.blank? }
300
+ joins.compact!
298
301
  joins
299
- .flatten
300
- .reject(&:blank?)
301
- .map { |join| table.create_string_join(Arel.sql(join)) }
302
302
  end
303
303
 
304
304
  def build_or_find_association(name, parent = @base, klass = nil)
@@ -37,15 +37,14 @@ module Ransack
37
37
  @base = @join_dependency.join_base
38
38
  @engine = @base.arel_engine
39
39
  end
40
+ end
40
41
 
41
- @default_table = Arel::Table.new(
42
- @base.table_name, as: @base.aliased_table_name, type_caster: self
43
- )
44
- @bind_pairs = Hash.new do |hash, key|
45
- parent, attr_name = get_parent_and_attribute_name(key)
46
- if parent && attr_name
47
- hash[key] = [parent, attr_name]
48
- end
42
+ def bind_pair_for(key)
43
+ @bind_pairs ||= {}
44
+
45
+ @bind_pairs[key] ||= begin
46
+ parent, attr_name = get_parent_and_attribute_name(key.to_s)
47
+ [parent, attr_name] if parent && attr_name
49
48
  end
50
49
  end
51
50
 
@@ -34,7 +34,7 @@ module Ransack
34
34
 
35
35
  name = '_id' if name == 'id'
36
36
 
37
- t = object.klass.fields[name].try(:type) || @bind_pairs[attr.name].first.fields[name].type
37
+ t = object.klass.fields[name].try(:type) || bind_pair_for(attr.name).first.fields[name].type
38
38
 
39
39
  t.to_s.demodulize.underscore.to_sym
40
40
  end
@@ -61,7 +61,7 @@ module Ransack
61
61
  exists = false
62
62
  if ransackable_attribute?(str, klass)
63
63
  exists = true
64
- elsif (segments = str.split(/_/)).size > 1
64
+ elsif (segments = str.split(Constants::UNDERSCORE)).size > 1
65
65
  remainder = []
66
66
  found_assoc = nil
67
67
  while !found_assoc && remainder.unshift(
@@ -111,7 +111,7 @@ module Ransack
111
111
 
112
112
  if ransackable_attribute?(str, klassify(parent))
113
113
  attr_name = str
114
- elsif (segments = str.split(/_/)).size > 1
114
+ elsif (segments = str.split(Constants::UNDERSCORE)).size > 1
115
115
  remainder = []
116
116
  found_assoc = nil
117
117
  while remainder.unshift(
@@ -30,15 +30,14 @@ module Ransack
30
30
 
31
31
  @base = @object.klass
32
32
  # @engine = @base.arel_engine
33
+ end
34
+
35
+ def bind_pair_for(key)
36
+ @bind_pairs ||= {}
33
37
 
34
- # @default_table = Arel::Table.new(
35
- # @base.table_name, :as => @base.aliased_table_name, :engine => @engine
36
- # )
37
- @bind_pairs = Hash.new do |hash, key|
38
+ @bind_pairs[key] ||= begin
38
39
  parent, attr_name = get_parent_and_attribute_name(key.to_s)
39
- if parent && attr_name
40
- hash[key] = [parent, attr_name]
41
- end
40
+ [parent, attr_name] if parent && attr_name
42
41
  end
43
42
  end
44
43
 
@@ -5,7 +5,27 @@ module Ransack
5
5
  module Configuration
6
6
 
7
7
  mattr_accessor :predicates, :options
8
- self.predicates = {}
8
+
9
+ class PredicateCollection
10
+ attr_reader :sorted_names_with_underscores
11
+
12
+ def initialize
13
+ @collection = {}
14
+ @sorted_names_with_underscores = []
15
+ end
16
+
17
+ delegate :[], :keys, :has_key?, to: :@collection
18
+
19
+ def []=(key, value)
20
+ @sorted_names_with_underscores << [key, '_' + key]
21
+ @sorted_names_with_underscores.sort! { |(a, _), (b, _)| b.length <=> a.length }
22
+
23
+ @collection[key] = value
24
+ end
25
+ end
26
+
27
+ self.predicates = PredicateCollection.new
28
+
9
29
  self.options = {
10
30
  :search_key => :q,
11
31
  :ignore_unknown_conditions => true,
@@ -40,7 +40,7 @@ module Ransack
40
40
  # Convert a string representing a chain of associations and an attribute
41
41
  # into the attribute itself
42
42
  def contextualize(str)
43
- parent, attr_name = @bind_pairs[str]
43
+ parent, attr_name = bind_pair_for(str)
44
44
  table_for(parent)[attr_name]
45
45
  end
46
46
 
@@ -59,24 +59,24 @@ module Ransack
59
59
 
60
60
  def bind(object, str)
61
61
  return nil unless str
62
- object.parent, object.attr_name = @bind_pairs[str]
62
+ object.parent, object.attr_name = bind_pair_for(str)
63
63
  end
64
64
 
65
65
  def traverse(str, base = @base)
66
66
  str ||= ''.freeze
67
67
 
68
- if (segments = str.split(/_/)).size > 0
68
+ if (segments = str.split(Constants::UNDERSCORE)).size > 0
69
69
  remainder = []
70
70
  found_assoc = nil
71
71
  while !found_assoc && segments.size > 0 do
72
72
  # Strip the _of_Model_type text from the association name, but hold
73
73
  # onto it in klass, for use as the next base
74
74
  assoc, klass = unpolymorphize_association(
75
- segments.join('_'.freeze)
75
+ segments.join(Constants::UNDERSCORE)
76
76
  )
77
77
  if found_assoc = get_association(assoc, base)
78
78
  base = traverse(
79
- remainder.join('_'.freeze), klass || found_assoc.klass
79
+ remainder.join(Constants::UNDERSCORE), klass || found_assoc.klass
80
80
  )
81
81
  end
82
82
 
@@ -93,9 +93,9 @@ module Ransack
93
93
  base = klassify(base)
94
94
  str ||= ''.freeze
95
95
  path = []
96
- segments = str.split(/_/)
96
+ segments = str.split(Constants::UNDERSCORE)
97
97
  association_parts = []
98
- if (segments = str.split(/_/)).size > 0
98
+ if (segments = str.split(Constants::UNDERSCORE)).size > 0
99
99
  while segments.size > 0 &&
100
100
  !base.columns_hash[segments.join(Constants::UNDERSCORE)] &&
101
101
  association_parts << segments.shift do
@@ -135,7 +135,7 @@ module Ransack
135
135
  end
136
136
 
137
137
  def ransackable_scope?(str, klass)
138
- klass.ransackable_scopes(auth_object).any? { |s| s.to_s == str }
138
+ klass.ransackable_scopes(auth_object).any? { |s| s.to_sym == str.to_sym }
139
139
  end
140
140
 
141
141
  def searchable_attributes(str = ''.freeze)
@@ -0,0 +1,70 @@
1
+ tr:
2
+ ransack:
3
+ search: "ara"
4
+ predicate: "doğrula"
5
+ and: "ve"
6
+ or: "veya"
7
+ any: "herhangi"
8
+ all: "hepsi"
9
+ combinator: "birleştirici"
10
+ attribute: "nitelik"
11
+ value: "değer"
12
+ condition: "şart"
13
+ sort: "sırala"
14
+ asc: "artan"
15
+ desc: "azalan"
16
+ predicates:
17
+ eq: "eşit"
18
+ eq_any: "herhangi birine eşit"
19
+ eq_all: "hepsine eşit"
20
+ not_eq: "eşit değil"
21
+ not_eq_any: "herhangi birine eşit değil"
22
+ not_eq_all: "hiçbirine eşit değil"
23
+ matches: "eşleşen"
24
+ matches_any: "herhangi biri ile eşleşen"
25
+ matches_all: "hepsi ile eşleşen"
26
+ does_not_match: "eşleşmeyen"
27
+ does_not_match_any: "herhangi biri ile eşleşmeyen"
28
+ does_not_match_all: "hiçbiri ile eşleşmeyen"
29
+ lt: "daha küçük"
30
+ lt_any: "herhangi birinden küçük"
31
+ lt_all: "hepsinden küçük"
32
+ lteq: "daha küçük veya eşit"
33
+ lteq_any: "daha küçük veya herhangi birine eşit"
34
+ lteq_all: "daha küçük veya hepsine eşit"
35
+ gt: "daha büyük "
36
+ gt_any: "herhangi birinden daha büyük"
37
+ gt_all: "hepsinden daha büyük"
38
+ gteq: "daha büyük veya eşit"
39
+ gteq_any: "daha büyük veya herhangi birine eşit"
40
+ gteq_all: "daha büyük veya hepsine eşit"
41
+ in: "içinde"
42
+ in_any: "herhangi birinde"
43
+ in_all: "hepsinde"
44
+ not_in: "içinde değil"
45
+ not_in_any: "herhangi birinde değil"
46
+ not_in_all: "hiçbirinde değil"
47
+ cont: "içeren"
48
+ cont_any: "herhangi birini içeren"
49
+ cont_all: "hepsini içeren"
50
+ not_cont: "içermeyen"
51
+ not_cont_any: "herhangi birini içermeyen"
52
+ not_cont_all: "hiçbirini birini içermeyen"
53
+ start: "ile başlayan"
54
+ start_any: "herhangi biriyle başlayan"
55
+ start_all: "hepsiyle başlayan"
56
+ not_start: "ile başlamayan"
57
+ not_start_any: "herhangi biriyle başlamayan"
58
+ not_start_all: "hiçbiriyle başlamayan"
59
+ end: "ile biten"
60
+ end_any: "herhangi biriyle biten"
61
+ end_all: "hepsi ile biten"
62
+ not_end: "ile bitmeyen"
63
+ not_end_any: "herhangi biriyle bitmeyen"
64
+ not_end_all: "hiçbiriyle bitmeyen"
65
+ 'true': "doğru"
66
+ 'false': "yanlış"
67
+ present: "mevcut"
68
+ blank: "boş"
69
+ 'null': "geçersiz"
70
+ not_null: "geçerli"
@@ -191,7 +191,7 @@ module Ransack
191
191
  end
192
192
 
193
193
  def strip_predicate_and_index(str)
194
- string = str.split(/\(/).first
194
+ string = str[/(.+?)\(/, 1] || str.dup
195
195
  Predicate.detect_and_strip_from_string!(string)
196
196
  string
197
197
  end
@@ -9,34 +9,26 @@ module Ransack
9
9
  Ransack.predicates.keys
10
10
  end
11
11
 
12
- def names_by_decreasing_length
13
- names.sort { |a, b| b.length <=> a.length }
14
- end
15
-
16
12
  def named(name)
17
13
  Ransack.predicates[name.to_s]
18
14
  end
19
15
 
20
16
  def detect_and_strip_from_string!(str)
21
- if p = detect_from_string(str)
22
- str.sub! /_#{p}$/, ''.freeze
23
- p
24
- end
17
+ detect_from_string str, chomp: true
25
18
  end
26
19
 
27
- def detect_from_string(str)
28
- names_by_decreasing_length.detect { |p| str.end_with?("_#{p}") }
29
- end
20
+ def detect_from_string(str, chomp: false)
21
+ return unless str
30
22
 
31
- # def name_from_attribute_name(attribute_name)
32
- # names_by_decreasing_length.detect {
33
- # |p| attribute_name.to_s.match(/_#{p}$/)
34
- # }
35
- # end
23
+ Ransack.predicates.sorted_names_with_underscores.each do |predicate, underscored|
24
+ if str.end_with? underscored
25
+ str.chomp! underscored if chomp
26
+ return predicate
27
+ end
28
+ end
36
29
 
37
- # def for_attribute_name(attribute_name)
38
- # self.named(detect_from_string(attribute_name.to_s))
39
- # end
30
+ nil
31
+ end
40
32
 
41
33
  end
42
34
 
@@ -24,8 +24,8 @@ module Ransack
24
24
  base_ancestors = base_class.ancestors.select {
25
25
  |x| x.respond_to?(:model_name)
26
26
  }
27
- predicate = Predicate.detect_from_string(original_name)
28
- attributes_str = original_name.sub(/_#{predicate}$/, ''.freeze)
27
+ attributes_str = original_name.dup # will be modified by ⬇
28
+ predicate = Predicate.detect_and_strip_from_string!(attributes_str)
29
29
  attribute_names = attributes_str.split(/_and_|_or_/)
30
30
  combinator = attributes_str.match(/_and_/) ? :and : :or
31
31
  defaults = base_ancestors.map do |klass|
@@ -1,3 +1,3 @@
1
1
  module Ransack
2
- VERSION = '1.8.4'
2
+ VERSION = '1.8.6'
3
3
  end
data/ransack.gemspec CHANGED
@@ -6,8 +6,8 @@ Gem::Specification.new do |s|
6
6
  s.name = "ransack"
7
7
  s.version = Ransack::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Ernie Miller", "Ryan Bigg", "Jon Atack"]
10
- s.email = ["ernie@erniemiller.org", "radarlistener@gmail.com", "jonnyatack@gmail.com"]
9
+ s.authors = ["Ernie Miller", "Ryan Bigg", "Jon Atack","Sean Carroll"]
10
+ s.email = ["ernie@erniemiller.org", "radarlistener@gmail.com", "jonnyatack@gmail.com","sfcarroll@gmail.com"]
11
11
  s.homepage = "https://github.com/activerecord-hackery/ransack"
12
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.}
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.add_dependency 'activerecord', '>= 3.0'
21
21
  s.add_dependency 'activesupport', '>= 3.0'
22
22
  s.add_dependency 'i18n'
23
- s.add_dependency 'polyamorous', '~> 1.3'
23
+ s.add_dependency 'polyamorous', '~> 1.3.2'
24
24
  s.add_development_dependency 'rspec', '~> 3'
25
25
  s.add_development_dependency 'machinist', '~> 1.0.6'
26
26
  s.add_development_dependency 'faker', '~> 0.9.5'
data/spec/spec_helper.rb CHANGED
@@ -3,7 +3,9 @@ require 'sham'
3
3
  require 'faker'
4
4
  require 'ransack'
5
5
  require 'pry'
6
+ require 'simplecov'
6
7
 
8
+ SimpleCov.start
7
9
  I18n.enforce_available_locales = false
8
10
  Time.zone = 'Eastern Time (US & Canada)'
9
11
  I18n.load_path += Dir[File.join(File.dirname(__FILE__), 'support', '*.yml')]
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ransack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.4
4
+ version: 1.8.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ernie Miller
8
8
  - Ryan Bigg
9
9
  - Jon Atack
10
+ - Sean Carroll
10
11
  autorequire:
11
12
  bindir: bin
12
13
  cert_chain: []
13
- date: 2017-10-09 00:00:00.000000000 Z
14
+ date: 2018-01-23 00:00:00.000000000 Z
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
16
17
  name: actionpack
@@ -74,14 +75,14 @@ dependencies:
74
75
  requirements:
75
76
  - - "~>"
76
77
  - !ruby/object:Gem::Version
77
- version: '1.3'
78
+ version: 1.3.2
78
79
  type: :runtime
79
80
  prerelease: false
80
81
  version_requirements: !ruby/object:Gem::Requirement
81
82
  requirements:
82
83
  - - "~>"
83
84
  - !ruby/object:Gem::Version
84
- version: '1.3'
85
+ version: 1.3.2
85
86
  - !ruby/object:Gem::Dependency
86
87
  name: rspec
87
88
  requirement: !ruby/object:Gem::Requirement
@@ -186,6 +187,7 @@ email:
186
187
  - ernie@erniemiller.org
187
188
  - radarlistener@gmail.com
188
189
  - jonnyatack@gmail.com
190
+ - sfcarroll@gmail.com
189
191
  executables: []
190
192
  extensions: []
191
193
  extra_rdoc_files: []
@@ -246,6 +248,7 @@ files:
246
248
  - lib/ransack/locale/nl.yml
247
249
  - lib/ransack/locale/pt-BR.yml
248
250
  - lib/ransack/locale/ro.yml
251
+ - lib/ransack/locale/tr.yml
249
252
  - lib/ransack/locale/zh-CN.yml
250
253
  - lib/ransack/locale/zh-TW.yml
251
254
  - lib/ransack/naming.rb