mobility 0.7.6 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/CHANGELOG.md +14 -3
  5. data/Gemfile.lock +57 -0
  6. data/README.md +15 -4
  7. data/lib/mobility.rb +17 -1
  8. data/lib/mobility/active_record/uniqueness_validator.rb +1 -1
  9. data/lib/mobility/arel/nodes.rb +0 -3
  10. data/lib/mobility/arel/nodes/pg_ops.rb +0 -4
  11. data/lib/mobility/attributes.rb +42 -25
  12. data/lib/mobility/backends/active_record.rb +2 -2
  13. data/lib/mobility/backends/active_record/column.rb +2 -2
  14. data/lib/mobility/backends/active_record/key_value.rb +6 -9
  15. data/lib/mobility/backends/active_record/table.rb +6 -7
  16. data/lib/mobility/backends/column.rb +2 -2
  17. data/lib/mobility/backends/key_value.rb +5 -0
  18. data/lib/mobility/backends/sequel.rb +24 -11
  19. data/lib/mobility/backends/sequel/column.rb +4 -3
  20. data/lib/mobility/backends/sequel/container.rb +21 -12
  21. data/lib/mobility/backends/sequel/hstore.rb +11 -3
  22. data/lib/mobility/backends/sequel/json.rb +11 -3
  23. data/lib/mobility/backends/sequel/jsonb.rb +35 -3
  24. data/lib/mobility/backends/sequel/key_value.rb +97 -17
  25. data/lib/mobility/backends/sequel/serialized.rb +5 -4
  26. data/lib/mobility/backends/sequel/table.rb +95 -26
  27. data/lib/mobility/backends/table.rb +4 -0
  28. data/lib/mobility/configuration.rb +1 -1
  29. data/lib/mobility/plugins/active_record/query.rb +52 -26
  30. data/lib/mobility/plugins/locale_accessors.rb +3 -2
  31. data/lib/mobility/plugins/query.rb +3 -0
  32. data/lib/mobility/plugins/sequel/query.rb +140 -0
  33. data/lib/mobility/sequel.rb +0 -14
  34. data/lib/mobility/sequel/sql.rb +16 -0
  35. data/lib/mobility/version.rb +1 -1
  36. data/lib/rails/generators/mobility/templates/column_translations.rb +1 -1
  37. data/lib/rails/generators/mobility/templates/initializer.rb +3 -2
  38. data/lib/rails/generators/mobility/translations_generator.rb +1 -1
  39. metadata +27 -46
  40. metadata.gz.sig +1 -1
  41. data/lib/mobility/backends/active_record/query_methods.rb +0 -50
  42. data/lib/mobility/backends/sequel/column/query_methods.rb +0 -29
  43. data/lib/mobility/backends/sequel/container/json_query_methods.rb +0 -41
  44. data/lib/mobility/backends/sequel/container/jsonb_query_methods.rb +0 -41
  45. data/lib/mobility/backends/sequel/hstore/query_methods.rb +0 -34
  46. data/lib/mobility/backends/sequel/json/query_methods.rb +0 -34
  47. data/lib/mobility/backends/sequel/jsonb/query_methods.rb +0 -34
  48. data/lib/mobility/backends/sequel/key_value/query_methods.rb +0 -58
  49. data/lib/mobility/backends/sequel/pg_query_methods.rb +0 -114
  50. data/lib/mobility/backends/sequel/query_methods.rb +0 -36
  51. data/lib/mobility/backends/sequel/serialized/query_methods.rb +0 -22
  52. data/lib/mobility/backends/sequel/table/query_methods.rb +0 -58
@@ -5,19 +5,5 @@ Module loading Sequel-specific classes for Mobility models.
5
5
 
6
6
  =end
7
7
  module Sequel
8
- def self.included(model_class)
9
- model_class.extend DatasetMethod.new(Mobility.query_method)
10
- end
11
-
12
- class DatasetMethod < Module
13
- def initialize(query_method)
14
- module_eval <<-EOM, __FILE__, __LINE__ + 1
15
- def #{query_method}
16
- dataset
17
- end
18
- EOM
19
- end
20
- end
21
- private_constant :DatasetMethod
22
8
  end
23
9
  end
@@ -0,0 +1,16 @@
1
+ module Mobility
2
+ module Sequel
3
+ module SQL
4
+ class QualifiedIdentifier < ::Sequel::SQL::QualifiedIdentifier
5
+ attr_reader :backend_class, :locale, :attribute_name
6
+
7
+ def initialize(table, column, locale, backend_class, attribute_name: nil)
8
+ @backend_class = backend_class
9
+ @locale = locale
10
+ @attribute_name = attribute_name || column
11
+ super(table, column)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mobility
4
- VERSION = "0.7.6"
4
+ VERSION = "0.8.0"
5
5
  end
@@ -1,7 +1,7 @@
1
1
  class <%= migration_class_name %> < <%= activerecord_migration_class %>
2
2
  def change
3
3
  <% attributes.each do |attribute| -%>
4
- <% I18n.available_locales.each do |locale| -%>
4
+ <% Mobility.available_locales.each do |locale| -%>
5
5
  <% column_name = Mobility.normalize_locale_accessor(attribute.name, locale) -%>
6
6
  <% if connection.column_exists?(table_name, column_name) -%>
7
7
  <% warn "#{column_name} already exists, skipping." -%>
@@ -62,8 +62,9 @@ Mobility.configure do |config|
62
62
  # config.default_options[:default] = ...
63
63
 
64
64
  # Uncomment to enable locale_accessors by default on models. A true value
65
- # will use the locales defined in I18n.available_locales. If you want
66
- # something else, pass an array of locales instead.
65
+ # will use the locales defined either in
66
+ # Rails.application.config.i18n.available_locales or I18n.available_locales.
67
+ # If you want something else, pass an array of locales instead.
67
68
  #
68
69
  # config.default_options[:locale_accessors] = true
69
70
 
@@ -23,7 +23,7 @@ For the +table+ backend, the generator will either create a translation table
23
23
  exists.
24
24
 
25
25
  For the +column+ backend, the generator will add columns for all locales in
26
- +I18n.available_locales+. If some columns already exist, they will simply be
26
+ +Mobility.available_locales+. If some columns already exist, they will simply be
27
27
  skipped.
28
28
 
29
29
  Other backends are not supported, for obvious reasons:
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobility
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.6
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Salzberg
@@ -10,27 +10,32 @@ bindir: exe
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDcDCCAligAwIBAgIBATANBgkqhkiG9w0BAQUFADA/MQ4wDAYDVQQDDAVjaHJp
13
+ MIIEcDCCAtigAwIBAgIBATANBgkqhkiG9w0BAQsFADA/MQ4wDAYDVQQDDAVjaHJp
14
14
  czEYMBYGCgmSJomT8ixkARkWCGRlamltYXRhMRMwEQYKCZImiZPyLGQBGRYDY29t
15
- MB4XDTE3MDgxMTE0NDU0N1oXDTE4MDgxMTE0NDU0N1owPzEOMAwGA1UEAwwFY2hy
15
+ MB4XDTE4MDkxMTA3MTIxOVoXDTE5MDkxMTA3MTIxOVowPzEOMAwGA1UEAwwFY2hy
16
16
  aXMxGDAWBgoJkiaJk/IsZAEZFghkZWppbWF0YTETMBEGCgmSJomT8ixkARkWA2Nv
17
- bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK4/1rb97IE2+aDbwqO0
18
- BdbiS9QONr9mZRyTCSVkKh4XY+Ex3XzoJSK/qj0E6eRb2K8Lsc8JNZra+1h6do8H
19
- dkl+GfFcHnWVuDkt17YcZuK/uAaxFOlWGVbFIdGxYz94rBddWGh3bOxqQGr3YtdD
20
- Ajj1foUnsPmxQ0j8p8vAJhHM0h0MTyphFxMT5xTDJkprVQOiktfWQBL+76jx/UQ4
21
- UXczbSgaObaUzvNM7ggi7+PPNG4S39SafjQ0MM/QvBZ31B6tN1KuzluKFhAMC+sH
22
- NofRUmYbrjZiCId6WCepJz48/fel6BtQ8CQGcQShx+eYOKEWRBiDkhpIil5JVaxi
23
- NucCAwEAAaN3MHUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFAzG
24
- 77899+wndUmwUTLUD8z+YnnwMB0GA1UdEQQWMBSBEmNocmlzQGRlamltYXRhLmNv
25
- bTAdBgNVHRIEFjAUgRJjaHJpc0BkZWppbWF0YS5jb20wDQYJKoZIhvcNAQEFBQAD
26
- ggEBAGP58/sXe/VX8dZ74Ih5VscaWOHZqfT5VzsremZS2899Mf+MaSDhMmdYx8b7
27
- e8Muzpi0V7EIbP0+QeocepYHugyodeoKerqaLEPQ0yCbUbfNAZd9HwkpFbd8hA/J
28
- Nt2Az+BsBS0COBZKnruEqXA2AbrDua/ifSAjQMPBKCJ8nPQqRQf5A1hcP71yO3du
29
- 8t13MBd1vS8/4nYUoCQnOCTA8A1Lj6RSbQWyS1zZHq7hDm9hmgvvcIMGOkBCcFhy
30
- eGDROPZoL5RXwiOnRbexxa7dcAxMrDfGB/hpiunIPWPsi4n5P7K/6OO/sGVMl9xv
31
- SZBPXjzrHdyOFLBYXB+PG7s3F/4=
17
+ bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBANhITJvJIMVXZJm7M4ci
18
+ SEY+ou/ugebCkfEZ7kJ+hKoprQixv/ox9WfFo8Mfdtw5XUHkmDate3yQ//yJ319Q
19
+ VxhM9/DDGffMJIQ0R5MRHF0wplKwlJfuoLqDRashBWqMaTzQZIGmUaYLFlLsbGhG
20
+ pYui/LixfEoGM6BJPJQa22gCTayLoOedj0UZRY60o50a7HquAl175DbC/pcvL/2u
21
+ sWfVUbY4ml+E/Y8ImSzzQ9281sf/qKAccbM4tOTRXCzf45aBpkfpgoNez7QUcO75
22
+ u84QlyBfrSjF3If7/i0N8XQoTm59XJqeoyoRUrs/9onzEK8FWcwRpjc2jnwwrS3G
23
+ FOS69dScNMJRhF/WCD0CiFr/x9TbcddANAv1dTo09ZIa9F4qYIXmrTbRVxedYp4J
24
+ 53yhhrmYKgPIIFgRwpZ4PLopBzcoqDQEDN2S7bF0uQKZEOFWmxFW0gSkais/kUQs
25
+ +KBOLR+hZE+XY9e9AF5sPFPI1cCVlzWycYYyj+q3esZNMQIDAQABo3cwdTAJBgNV
26
+ HRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUnl91HnXC+LP5WR3+xHTBPFpe
27
+ 7BwwHQYDVR0RBBYwFIESY2hyaXNAZGVqaW1hdGEuY29tMB0GA1UdEgQWMBSBEmNo
28
+ cmlzQGRlamltYXRhLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAbRUo4qXHMGMniB7t
29
+ 2TGnmV+pOhih+gMPUN15/fQNLITc2GCgNYeZNWLdhXvKI15EWD+kyZYuRy9TI7IJ
30
+ 8MJuh7C0llSB0MB8Q83T/V1cyG714fvrove6Ki8RgjQ+JMjN23zleaVIenhJu5mS
31
+ 7Yg4RkKmt3DaYiLP7GCzAaFMUFVhNyEmXVFcuVXgE2FO5SPUABegJS4S8hY/f/Wr
32
+ nLKv9tCpXO8np++HNp2ryj7Z54/eQ1KaqzodRL31HBuFkpzmm5Y34Hf9faaITeOJ
33
+ wLSx9yXQpNtMvtxj66ztwWR75HPP2ZsujTtLMxhRO74gADdIujX9FTQHmn3YaJ24
34
+ 8abCZ79sPvLP9FaOM2lLbzA+C/QWSTDAzNtyxS3+hOZsCyjRew8rpmhbGSoiCkJy
35
+ m46ezJjnr4uXgSNuTs+RdM6DtrKaFG2HuziSP+dzmWqZiUgj1eTACYsPwfF/Z1Z6
36
+ 2DiDkec/SK4qJBMlNYPo/PTZuh5m1jROtf/hyS0VXJmm+uWc
32
37
  -----END CERTIFICATE-----
33
- date: 2018-07-06 00:00:00.000000000 Z
38
+ date: 2018-09-11 00:00:00.000000000 Z
34
39
  dependencies:
35
40
  - !ruby/object:Gem::Dependency
36
41
  name: request_store
@@ -66,20 +71,6 @@ dependencies:
66
71
  - - "<"
67
72
  - !ruby/object:Gem::Version
68
73
  version: '1.1'
69
- - !ruby/object:Gem::Dependency
70
- name: bundler
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.12'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.12'
83
74
  - !ruby/object:Gem::Dependency
84
75
  name: database_cleaner
85
76
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +183,6 @@ files:
192
183
  - lib/mobility/backends/active_record/jsonb.rb
193
184
  - lib/mobility/backends/active_record/key_value.rb
194
185
  - lib/mobility/backends/active_record/pg_hash.rb
195
- - lib/mobility/backends/active_record/query_methods.rb
196
186
  - lib/mobility/backends/active_record/serialized.rb
197
187
  - lib/mobility/backends/active_record/table.rb
198
188
  - lib/mobility/backends/column.rb
@@ -205,25 +195,14 @@ files:
205
195
  - lib/mobility/backends/null.rb
206
196
  - lib/mobility/backends/sequel.rb
207
197
  - lib/mobility/backends/sequel/column.rb
208
- - lib/mobility/backends/sequel/column/query_methods.rb
209
198
  - lib/mobility/backends/sequel/container.rb
210
- - lib/mobility/backends/sequel/container/json_query_methods.rb
211
- - lib/mobility/backends/sequel/container/jsonb_query_methods.rb
212
199
  - lib/mobility/backends/sequel/hstore.rb
213
- - lib/mobility/backends/sequel/hstore/query_methods.rb
214
200
  - lib/mobility/backends/sequel/json.rb
215
- - lib/mobility/backends/sequel/json/query_methods.rb
216
201
  - lib/mobility/backends/sequel/jsonb.rb
217
- - lib/mobility/backends/sequel/jsonb/query_methods.rb
218
202
  - lib/mobility/backends/sequel/key_value.rb
219
- - lib/mobility/backends/sequel/key_value/query_methods.rb
220
203
  - lib/mobility/backends/sequel/pg_hash.rb
221
- - lib/mobility/backends/sequel/pg_query_methods.rb
222
- - lib/mobility/backends/sequel/query_methods.rb
223
204
  - lib/mobility/backends/sequel/serialized.rb
224
- - lib/mobility/backends/sequel/serialized/query_methods.rb
225
205
  - lib/mobility/backends/sequel/table.rb
226
- - lib/mobility/backends/sequel/table/query_methods.rb
227
206
  - lib/mobility/backends/serialized.rb
228
207
  - lib/mobility/backends/table.rb
229
208
  - lib/mobility/configuration.rb
@@ -249,11 +228,13 @@ files:
249
228
  - lib/mobility/plugins/query.rb
250
229
  - lib/mobility/plugins/sequel.rb
251
230
  - lib/mobility/plugins/sequel/dirty.rb
231
+ - lib/mobility/plugins/sequel/query.rb
252
232
  - lib/mobility/sequel.rb
253
233
  - lib/mobility/sequel/backend_resetter.rb
254
234
  - lib/mobility/sequel/column_changes.rb
255
235
  - lib/mobility/sequel/hash_initializer.rb
256
236
  - lib/mobility/sequel/model_translation.rb
237
+ - lib/mobility/sequel/sql.rb
257
238
  - lib/mobility/sequel/string_translation.rb
258
239
  - lib/mobility/sequel/text_translation.rb
259
240
  - lib/mobility/sequel/translation.rb
@@ -286,7 +267,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
286
267
  requirements:
287
268
  - - ">="
288
269
  - !ruby/object:Gem::Version
289
- version: 2.2.9
270
+ version: 2.3.7
290
271
  required_rubygems_version: !ruby/object:Gem::Requirement
291
272
  requirements:
292
273
  - - ">="
metadata.gz.sig CHANGED
@@ -1 +1 @@
1
- d��/഍i_�!��9LE]�,�
1
+ �m�y����}P$��@���g����;����e�w ��>/�iz��5D�K9+�PT��l^�'ړ��pN��lj�l���w�1rx�yUyV\82|�h9\��-�I�K�‹ޙf������<�[��X#�Y�3��վ*�ƒ�YR���_8���|�^��f�5��Ove�\��*�����h�L�;+gV�ԍ+��!���t��t��)����qߛmn<�J:p���j3H�(/3��1�R,i~�y���)�n�\y*����T
@@ -1,50 +0,0 @@
1
- module Mobility
2
- module Backends
3
- module ActiveRecord
4
- =begin
5
-
6
- Defines query method overrides to handle translated attributes for ActiveRecord
7
- models. For details see backend-specific subclasses.
8
-
9
- =end
10
- class QueryMethods < Module
11
- # @param [Array<String>] attributes Translated attributes
12
- def initialize(attributes, _)
13
- @attributes = attributes
14
-
15
- attributes.each do |attribute|
16
- define_method :"find_by_#{attribute}" do |value|
17
- find_by(attribute.to_sym => value)
18
- end
19
- end
20
- end
21
-
22
- # @param [ActiveRecord::Relation] relation Relation being extended
23
- # @note Only want to define this once, even if multiple QueryMethods
24
- # modules are included, so include it here into the singleton class.
25
- def extended(relation)
26
- relation.singleton_class.include WhereChainable
27
- end
28
-
29
- def extract_attributes(opts)
30
- opts.is_a?(Hash) && (opts.keys.map(&:to_s) & @attributes).presence
31
- end
32
-
33
- def collapse(value)
34
- value.is_a?(Array) ? value.uniq : value
35
- end
36
- end
37
-
38
- module WhereChainable
39
- def where(opts = :chain, *rest)
40
- opts == :chain ? mobility_where_chain.new(spawn) : super
41
- end
42
-
43
- def mobility_where_chain
44
- @mobility_where_chain ||= Class.new(::ActiveRecord::QueryMethods::WhereChain)
45
- end
46
- end
47
- private_constant :QueryMethods, :WhereChainable
48
- end
49
- end
50
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
- require "mobility/backends/sequel/query_methods"
3
-
4
- module Mobility
5
- module Backends
6
- module Sequel
7
- class Column::QueryMethods < QueryMethods
8
- def initialize(attributes, _)
9
- super
10
- q = self
11
-
12
- %w[exclude or where].each do |method_name|
13
- define_method method_name do |*conds, &block|
14
- if i18n_keys = q.extract_attributes(conds.first)
15
- cond = conds.first.dup
16
- i18n_keys.each do |attr|
17
- cond[Backends::Column.column_name_for(attr)] = q.collapse cond.delete(attr)
18
- end
19
- super(cond, &block)
20
- else
21
- super(*conds, &block)
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
- require "mobility/backends/sequel/pg_query_methods"
3
- require "mobility/backends/sequel/query_methods"
4
-
5
- Sequel.extension :pg_json, :pg_json_ops
6
-
7
- module Mobility
8
- module Backends
9
- module Sequel
10
- class Container::JsonQueryMethods < QueryMethods
11
- include PgQueryMethods
12
- attr_reader :column_name
13
-
14
- def initialize(attributes, options)
15
- super
16
- @column_name = options[:column_name]
17
- define_query_methods
18
- end
19
-
20
- def matches(key, locale)
21
- build_op(column_name)[locale].get_text(key.to_s)
22
- end
23
-
24
- def exists(key, locale)
25
- matches(key, locale) !~ nil
26
- end
27
-
28
- def quote(value)
29
- value && value.to_s
30
- end
31
-
32
- private
33
-
34
- def build_op(key)
35
- ::Sequel.pg_json_op(key)
36
- end
37
- end
38
- Container.private_constant :JsonQueryMethods
39
- end
40
- end
41
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
- require "mobility/backends/sequel/pg_query_methods"
3
- require "mobility/backends/sequel/query_methods"
4
-
5
- Sequel.extension :pg_json, :pg_json_ops
6
-
7
- module Mobility
8
- module Backends
9
- module Sequel
10
- class Container::JsonbQueryMethods < QueryMethods
11
- include PgQueryMethods
12
- attr_reader :column_name
13
-
14
- def initialize(attributes, options)
15
- super
16
- @column_name = options[:column_name]
17
- define_query_methods
18
- end
19
-
20
- def matches(key, locale)
21
- build_op(column_name)[locale][key.to_s]
22
- end
23
-
24
- def exists(key, locale)
25
- build_op(column_name).has_key?(locale) & build_op(column_name)[locale].has_key?(key.to_s)
26
- end
27
-
28
- def quote(value)
29
- value && value.to_json
30
- end
31
-
32
- private
33
-
34
- def build_op(key)
35
- ::Sequel.pg_jsonb_op(key)
36
- end
37
- end
38
- Container.private_constant :JsonbQueryMethods
39
- end
40
- end
41
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'mobility/backends/sequel/pg_query_methods'
3
- require "mobility/backends/sequel/query_methods"
4
-
5
- Sequel.extension :pg_hstore, :pg_hstore_ops
6
-
7
- module Mobility
8
- module Backends
9
- module Sequel
10
- class Hstore::QueryMethods < QueryMethods
11
- include PgQueryMethods
12
-
13
- def matches(key, locale)
14
- build_op(key)[locale]
15
- end
16
-
17
- def exists(key, locale)
18
- build_op(key).has_key?(locale)
19
- end
20
-
21
- def quote(value)
22
- value && value.to_s
23
- end
24
-
25
- private
26
-
27
- def build_op(key)
28
- ::Sequel.hstore_op(column_name(key))
29
- end
30
- end
31
- Hstore.private_constant :QueryMethods
32
- end
33
- end
34
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
- require "mobility/backends/sequel/pg_query_methods"
3
- require "mobility/backends/sequel/query_methods"
4
-
5
- Sequel.extension :pg_json, :pg_json_ops
6
-
7
- module Mobility
8
- module Backends
9
- module Sequel
10
- class Json::QueryMethods < QueryMethods
11
- include PgQueryMethods
12
-
13
- def matches(key, locale)
14
- build_op(key).get_text(locale)
15
- end
16
-
17
- def exists(key, locale)
18
- matches(key, locale) !~ nil
19
- end
20
-
21
- def quote(value)
22
- value && value.to_s
23
- end
24
-
25
- private
26
-
27
- def build_op(key)
28
- ::Sequel.pg_json_op(column_name(key))
29
- end
30
- end
31
- Json.private_constant :QueryMethods
32
- end
33
- end
34
- end