mobility 0.4.3 → 0.5.0
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile.lock +27 -27
- data/README.md +8 -8
- data/lib/mobility.rb +18 -5
- data/lib/mobility/{wrapper.rb → accumulator.rb} +2 -4
- data/lib/mobility/active_record.rb +1 -0
- data/lib/mobility/active_record/backend_resetter.rb +1 -0
- data/lib/mobility/active_record/string_translation.rb +1 -0
- data/lib/mobility/active_record/text_translation.rb +1 -0
- data/lib/mobility/adapter.rb +19 -0
- data/lib/mobility/attributes.rb +2 -1
- data/lib/mobility/backend.rb +1 -1
- data/lib/mobility/backend/orm_delegator.rb +5 -4
- data/lib/mobility/backend_resetter.rb +2 -0
- data/lib/mobility/backends/active_record/column.rb +1 -0
- data/lib/mobility/backends/active_record/column/query_methods.rb +1 -0
- data/lib/mobility/backends/active_record/container.rb +21 -4
- data/lib/mobility/backends/active_record/container/json_query_methods.rb +30 -0
- data/lib/mobility/backends/active_record/container/{query_methods.rb → jsonb_query_methods.rb} +4 -2
- data/lib/mobility/backends/active_record/json.rb +36 -0
- data/lib/mobility/backends/active_record/json/query_methods.rb +25 -0
- data/lib/mobility/backends/active_record/jsonb.rb +4 -4
- data/lib/mobility/backends/active_record/jsonb/query_methods.rb +1 -0
- data/lib/mobility/backends/active_record/key_value.rb +2 -2
- data/lib/mobility/backends/active_record/key_value/query_methods.rb +1 -0
- data/lib/mobility/backends/active_record/pg_hash.rb +1 -0
- data/lib/mobility/backends/active_record/pg_query_methods.rb +1 -1
- data/lib/mobility/backends/active_record/serialized.rb +1 -0
- data/lib/mobility/backends/active_record/serialized/query_methods.rb +1 -0
- data/lib/mobility/backends/active_record/table.rb +2 -2
- data/lib/mobility/backends/active_record/table/query_methods.rb +1 -0
- data/lib/mobility/backends/column.rb +2 -0
- data/lib/mobility/backends/json.rb +20 -0
- data/lib/mobility/backends/jsonb.rb +0 -1
- data/lib/mobility/backends/key_value.rb +1 -0
- data/lib/mobility/backends/sequel/column.rb +1 -0
- data/lib/mobility/backends/sequel/column/query_methods.rb +1 -0
- data/lib/mobility/backends/sequel/container.rb +19 -3
- data/lib/mobility/backends/sequel/container/json_query_methods.rb +34 -0
- data/lib/mobility/backends/sequel/container/{query_methods.rb → jsonb_query_methods.rb} +2 -1
- data/lib/mobility/backends/sequel/hstore/query_methods.rb +1 -0
- data/lib/mobility/backends/sequel/json.rb +36 -0
- data/lib/mobility/backends/sequel/json/query_methods.rb +27 -0
- data/lib/mobility/backends/sequel/jsonb/query_methods.rb +2 -1
- data/lib/mobility/backends/sequel/key_value.rb +3 -3
- data/lib/mobility/backends/sequel/key_value/query_methods.rb +1 -0
- data/lib/mobility/backends/sequel/pg_hash.rb +1 -0
- data/lib/mobility/backends/sequel/query_methods.rb +1 -0
- data/lib/mobility/backends/sequel/serialized.rb +1 -0
- data/lib/mobility/backends/sequel/serialized/query_methods.rb +1 -0
- data/lib/mobility/backends/sequel/table.rb +1 -0
- data/lib/mobility/backends/sequel/table/query_methods.rb +1 -0
- data/lib/mobility/backends/serialized.rb +1 -0
- data/lib/mobility/backends/table.rb +1 -0
- data/lib/mobility/configuration.rb +3 -5
- data/lib/mobility/fallbacks.rb +28 -0
- data/lib/mobility/plugins/active_model/dirty.rb +5 -5
- data/lib/mobility/plugins/active_record/dirty.rb +1 -1
- data/lib/mobility/plugins/cache.rb +1 -0
- data/lib/mobility/plugins/default.rb +2 -0
- data/lib/mobility/plugins/dirty.rb +1 -0
- data/lib/mobility/plugins/fallbacks.rb +3 -1
- data/lib/mobility/plugins/fallthrough_accessors.rb +4 -4
- data/lib/mobility/plugins/locale_accessors.rb +2 -2
- data/lib/mobility/plugins/presence.rb +1 -0
- data/lib/mobility/sequel/column_changes.rb +3 -1
- data/lib/mobility/sequel/hash_initializer.rb +2 -0
- data/lib/mobility/sequel/string_translation.rb +1 -0
- data/lib/mobility/sequel/text_translation.rb +1 -0
- data/lib/mobility/translates.rb +2 -0
- data/lib/mobility/util.rb +3 -1
- data/lib/mobility/version.rb +3 -1
- data/lib/rails/generators/mobility/active_record_migration_compatibility.rb +1 -0
- data/lib/rails/generators/mobility/backend_generators/base.rb +3 -3
- data/lib/rails/generators/mobility/generators.rb +1 -0
- data/lib/rails/generators/mobility/install_generator.rb +1 -0
- data/lib/rails/generators/mobility/templates/initializer.rb +75 -0
- data/lib/rails/generators/mobility/translations_generator.rb +3 -3
- metadata +14 -5
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 517f855df0698bb34baeac4033972a5950df7333
|
4
|
+
data.tar.gz: 569bf64eb02f45abd227d75bf28e53fd8a2aa4a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6431a9d3884fffec244488d8f56e906f5a514eb9f74e14b9d6fff192fe43046ad3bfe6a00720bf27e383e613c38b8269fac2a58aa6996b25b483aac6450b6bd
|
7
|
+
data.tar.gz: d78ecb91bd70a1f3266a550f5fb69297e0259dd08ba7cae7091bec8146fb85d72230d9d0ebeea803118a11f96fc5ac41cf7b2041f9efdd60daed81d1dba10342
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,17 @@
|
|
2
2
|
|
3
3
|
## 0.4
|
4
4
|
|
5
|
+
### 0.5.0 (March 16, 2018)
|
6
|
+
* Support PostgreSQL json column format as Json backend and dynamically in
|
7
|
+
Container backend ([#182](https://github.com/shioyama/mobility/pull/182) and
|
8
|
+
[#184](https://github.com/shioyama/mobility/pull/184), respectively)
|
9
|
+
* Fall through to `I18n.fallbacks` when defined
|
10
|
+
([#180](https://github.com/shioyama/mobility/pull/180))
|
11
|
+
* Improve comments in Rails initializer
|
12
|
+
([#186](https://github.com/shioyama/mobility/pull/186))
|
13
|
+
* Use pragma comments to freeze strings everywhere
|
14
|
+
([#177](https://github.com/shioyama/mobility/pull/177))
|
15
|
+
|
5
16
|
### 0.4.3 (February 18, 2018)
|
6
17
|
* Add missing require in container backend
|
7
18
|
([#174](https://github.com/shioyama/mobility/pull/174))
|
data/Gemfile.lock
CHANGED
@@ -1,33 +1,33 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mobility (0.
|
5
|
-
i18n (>= 0.6.10, <
|
4
|
+
mobility (0.5.0)
|
5
|
+
i18n (>= 0.6.10, < 1.1)
|
6
6
|
request_store (~> 1.0)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
actionpack (5.2.0.
|
12
|
-
actionview (= 5.2.0.
|
13
|
-
activesupport (= 5.2.0.
|
11
|
+
actionpack (5.2.0.beta2)
|
12
|
+
actionview (= 5.2.0.beta2)
|
13
|
+
activesupport (= 5.2.0.beta2)
|
14
14
|
rack (~> 2.0)
|
15
15
|
rack-test (>= 0.6.3)
|
16
16
|
rails-dom-testing (~> 2.0)
|
17
17
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
18
|
-
actionview (5.2.0.
|
19
|
-
activesupport (= 5.2.0.
|
18
|
+
actionview (5.2.0.beta2)
|
19
|
+
activesupport (= 5.2.0.beta2)
|
20
20
|
builder (~> 3.1)
|
21
21
|
erubi (~> 1.4)
|
22
22
|
rails-dom-testing (~> 2.0)
|
23
23
|
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
24
|
-
activemodel (5.2.0.
|
25
|
-
activesupport (= 5.2.0.
|
26
|
-
activerecord (5.2.0.
|
27
|
-
activemodel (= 5.2.0.
|
28
|
-
activesupport (= 5.2.0.
|
24
|
+
activemodel (5.2.0.beta2)
|
25
|
+
activesupport (= 5.2.0.beta2)
|
26
|
+
activerecord (5.2.0.beta2)
|
27
|
+
activemodel (= 5.2.0.beta2)
|
28
|
+
activesupport (= 5.2.0.beta2)
|
29
29
|
arel (>= 9.0)
|
30
|
-
activesupport (5.2.0.
|
30
|
+
activesupport (5.2.0.beta2)
|
31
31
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
32
32
|
i18n (~> 0.7)
|
33
33
|
minitest (~> 5.1)
|
@@ -35,14 +35,14 @@ GEM
|
|
35
35
|
arel (9.0.0)
|
36
36
|
benchmark-ips (2.7.2)
|
37
37
|
builder (3.2.3)
|
38
|
-
byebug (
|
38
|
+
byebug (10.0.0)
|
39
39
|
coderay (1.1.2)
|
40
40
|
concurrent-ruby (1.0.5)
|
41
41
|
crass (1.0.3)
|
42
42
|
database_cleaner (1.6.2)
|
43
43
|
diff-lcs (1.3)
|
44
|
-
erubi (1.7.
|
45
|
-
ffi (1.9.
|
44
|
+
erubi (1.7.1)
|
45
|
+
ffi (1.9.23)
|
46
46
|
formatador (0.2.5)
|
47
47
|
generator_spec (0.9.4)
|
48
48
|
activesupport (>= 3.0.0)
|
@@ -61,13 +61,13 @@ GEM
|
|
61
61
|
guard (~> 2.1)
|
62
62
|
guard-compat (~> 1.1)
|
63
63
|
rspec (>= 2.99.0, < 4.0)
|
64
|
-
i18n (0.9.
|
64
|
+
i18n (0.9.5)
|
65
65
|
concurrent-ruby (~> 1.0)
|
66
66
|
listen (3.1.5)
|
67
67
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
68
68
|
rb-inotify (~> 0.9, >= 0.9.7)
|
69
69
|
ruby_dep (~> 1.2)
|
70
|
-
loofah (2.
|
70
|
+
loofah (2.2.0)
|
71
71
|
crass (~> 1.0.2)
|
72
72
|
nokogiri (>= 1.5.9)
|
73
73
|
lumberjack (1.0.12)
|
@@ -85,25 +85,25 @@ GEM
|
|
85
85
|
pry (0.11.3)
|
86
86
|
coderay (~> 1.1.0)
|
87
87
|
method_source (~> 0.9.0)
|
88
|
-
pry-byebug (3.
|
89
|
-
byebug (~>
|
88
|
+
pry-byebug (3.6.0)
|
89
|
+
byebug (~> 10.0)
|
90
90
|
pry (~> 0.10)
|
91
91
|
rack (2.0.4)
|
92
|
-
rack-test (0.8.
|
92
|
+
rack-test (0.8.3)
|
93
93
|
rack (>= 1.0, < 3)
|
94
94
|
rails-dom-testing (2.0.3)
|
95
95
|
activesupport (>= 4.2.0)
|
96
96
|
nokogiri (>= 1.6)
|
97
97
|
rails-html-sanitizer (1.0.3)
|
98
98
|
loofah (~> 2.0)
|
99
|
-
railties (5.2.0.
|
100
|
-
actionpack (= 5.2.0.
|
101
|
-
activesupport (= 5.2.0.
|
99
|
+
railties (5.2.0.beta2)
|
100
|
+
actionpack (= 5.2.0.beta2)
|
101
|
+
activesupport (= 5.2.0.beta2)
|
102
102
|
method_source
|
103
103
|
rake (>= 0.8.7)
|
104
104
|
thor (>= 0.18.1, < 2.0)
|
105
105
|
rake (12.3.0)
|
106
|
-
rb-fsevent (0.10.
|
106
|
+
rb-fsevent (0.10.3)
|
107
107
|
rb-inotify (0.9.10)
|
108
108
|
ffi (>= 0.5.0, < 2)
|
109
109
|
request_store (1.4.0)
|
@@ -134,7 +134,7 @@ PLATFORMS
|
|
134
134
|
ruby
|
135
135
|
|
136
136
|
DEPENDENCIES
|
137
|
-
activerecord (
|
137
|
+
activerecord (= 5.2.0.beta2)
|
138
138
|
benchmark-ips
|
139
139
|
bundler (~> 1.12)
|
140
140
|
database_cleaner (~> 1.5, >= 1.5.3)
|
@@ -144,7 +144,7 @@ DEPENDENCIES
|
|
144
144
|
mysql2 (~> 0.4.9)
|
145
145
|
pg (< 1.0)
|
146
146
|
pry-byebug
|
147
|
-
railties (
|
147
|
+
railties (= 5.2.0.beta2)
|
148
148
|
rake (~> 12, >= 12.2.1)
|
149
149
|
rspec (~> 3.0)
|
150
150
|
sqlite3
|
data/README.md
CHANGED
@@ -29,7 +29,7 @@ columns](http://dejimata.com/2017/3/3/translating-with-mobility#strategy-1) and
|
|
29
29
|
[model translation
|
30
30
|
tables](http://dejimata.com/2017/3/3/translating-with-mobility#strategy-2), as
|
31
31
|
well as database-specific storage solutions such as
|
32
|
-
[jsonb](https://www.postgresql.org/docs/current/static/datatype-json.html) and
|
32
|
+
[json/jsonb](https://www.postgresql.org/docs/current/static/datatype-json.html) and
|
33
33
|
[Hstore](https://www.postgresql.org/docs/current/static/hstore.html) (for
|
34
34
|
PostgreSQL).
|
35
35
|
|
@@ -54,7 +54,7 @@ Installation
|
|
54
54
|
Add this line to your application's Gemfile:
|
55
55
|
|
56
56
|
```ruby
|
57
|
-
gem 'mobility', '~> 0.
|
57
|
+
gem 'mobility', '~> 0.5.0'
|
58
58
|
```
|
59
59
|
|
60
60
|
Mobility is cryptographically signed. To be sure the gem you install hasn't
|
@@ -794,11 +794,11 @@ class](http://www.rubydoc.info/gems/mobility/Mobility/Backends/Column).
|
|
794
794
|
|
795
795
|
### PostgreSQL-specific Backends
|
796
796
|
|
797
|
-
Mobility also supports
|
797
|
+
Mobility also supports JSON and Hstore storage options, if you are using
|
798
798
|
PostgreSQL as your database. To use this option, create column(s) on the model
|
799
|
-
table for each translated attribute, and set your backend to `:jsonb`
|
800
|
-
`:hstore`. If you are using Sequel, note that you
|
801
|
-
[pg_json](http://sequel.jeremyevans.net/rdoc-plugins/files/lib/sequel/extensions/pg_json_rb.html)
|
799
|
+
table for each translated attribute, and set your backend to `:json`, `:jsonb`
|
800
|
+
or `:hstore`. If you are using Sequel, note that you
|
801
|
+
will need to enable the [pg_json](http://sequel.jeremyevans.net/rdoc-plugins/files/lib/sequel/extensions/pg_json_rb.html)
|
802
802
|
or
|
803
803
|
[pg_hstore](http://sequel.jeremyevans.net/rdoc-plugins/files/lib/sequel/extensions/pg_hstore_rb.html)
|
804
804
|
extensions with `DB.extension :pg_json` or `DB.extension :pg_hstore` (where
|
@@ -857,8 +857,8 @@ they conform to the same expected behaviour. These examples can be found in:
|
|
857
857
|
- `spec/support/shared_examples/querying_examples.rb` (specs for
|
858
858
|
[querying](#querying))
|
859
859
|
- `spec/support/shared_examples/serialization_examples.rb` (specialized specs
|
860
|
-
for backends which store translations as a Hash: `serialized`, `hstore
|
861
|
-
`jsonb` backends)
|
860
|
+
for backends which store translations as a Hash: `serialized`, `hstore`,
|
861
|
+
`json` and `jsonb` backends)
|
862
862
|
|
863
863
|
A minimal test can simply define a model class and use helpers defined in
|
864
864
|
`spec/support/helpers.rb` to run these examples, by extending either
|
data/lib/mobility.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require 'i18n'
|
2
3
|
require 'request_store'
|
3
4
|
require 'mobility/version'
|
@@ -24,15 +25,17 @@ in backends to define gem-dependent behavior.
|
|
24
25
|
|
25
26
|
=end
|
26
27
|
module Mobility
|
28
|
+
require "mobility/adapter"
|
29
|
+
require "mobility/accumulator"
|
27
30
|
require "mobility/attributes"
|
28
31
|
require "mobility/backend"
|
29
32
|
require "mobility/backends"
|
30
33
|
require "mobility/backend_resetter"
|
31
34
|
require "mobility/configuration"
|
35
|
+
require "mobility/fallbacks"
|
32
36
|
require "mobility/loaded"
|
33
37
|
require "mobility/plugins"
|
34
38
|
require "mobility/translates"
|
35
|
-
require "mobility/wrapper"
|
36
39
|
|
37
40
|
# General error for version compatibility conflicts
|
38
41
|
class VersionNotSupportedError < ArgumentError; end
|
@@ -194,7 +197,7 @@ module Mobility
|
|
194
197
|
# Mobility.normalize_locale("pt-BR")
|
195
198
|
# #=> "pt_br"
|
196
199
|
def normalize_locale(locale = Mobility.locale)
|
197
|
-
"#{locale.to_s.downcase.sub("-", "_")}"
|
200
|
+
"#{locale.to_s.downcase.sub("-", "_")}"
|
198
201
|
end
|
199
202
|
alias_method :normalized_locale, :normalize_locale
|
200
203
|
|
@@ -208,7 +211,7 @@ module Mobility
|
|
208
211
|
# Mobility.normalize_locale_accessor(:bar, "pt-BR")
|
209
212
|
# #=> "bar_pt_br"
|
210
213
|
def normalize_locale_accessor(attribute, locale = Mobility.locale)
|
211
|
-
"#{attribute}_#{normalize_locale(locale)}"
|
214
|
+
"#{attribute}_#{normalize_locale(locale)}"
|
212
215
|
end
|
213
216
|
|
214
217
|
# Raises InvalidLocale exception if the locale passed in is present but not available.
|
@@ -243,22 +246,32 @@ EOL
|
|
243
246
|
|
244
247
|
module InstanceMethods
|
245
248
|
# Fetch backend for an attribute
|
249
|
+
# @deprecated Use mobility.backend_for(attribute) instead.
|
246
250
|
# @param [String] attribute Attribute
|
251
|
+
# TODO: Remove in v1.0
|
247
252
|
def mobility_backend_for(attribute)
|
248
|
-
|
253
|
+
warn %{
|
254
|
+
WARNING: mobility_backend_for is deprecated and will be removed in the next
|
255
|
+
major version of Mobility. Use <post>.mobility.backend_for(attributes)
|
256
|
+
instead.}
|
257
|
+
mobility.backend_for(attribute)
|
249
258
|
end
|
250
259
|
|
251
260
|
def initialize_dup(other)
|
252
261
|
@mobility_backends = nil
|
253
262
|
super
|
254
263
|
end
|
264
|
+
|
265
|
+
def mobility
|
266
|
+
@mobility ||= Adapter.new(self)
|
267
|
+
end
|
255
268
|
end
|
256
269
|
|
257
270
|
module ClassMethods
|
258
271
|
include Translates
|
259
272
|
|
260
273
|
def mobility
|
261
|
-
@mobility ||= Mobility::
|
274
|
+
@mobility ||= Mobility::Accumulator.new
|
262
275
|
end
|
263
276
|
|
264
277
|
def translated_attribute_names
|
@@ -6,14 +6,12 @@ which {Attributes} modules have been included on the model class. It is also a
|
|
6
6
|
simple delegator, so any missing method will be delegated to the model class.
|
7
7
|
|
8
8
|
=end
|
9
|
-
class
|
9
|
+
class Accumulator
|
10
10
|
# @return [Array<Attributes>]
|
11
11
|
attr_reader :modules
|
12
|
-
alias :model_class :__getobj__
|
13
12
|
|
14
13
|
# @param [Class] model_class Model class
|
15
|
-
def initialize
|
16
|
-
super
|
14
|
+
def initialize
|
17
15
|
@modules = []
|
18
16
|
end
|
19
17
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Mobility
|
2
|
+
=begin
|
3
|
+
|
4
|
+
Provides interface to access attributes across all backends of an instance.
|
5
|
+
|
6
|
+
=end
|
7
|
+
class Adapter
|
8
|
+
# @param [Object] model Instance of model class
|
9
|
+
def initialize(model)
|
10
|
+
@model = model
|
11
|
+
end
|
12
|
+
|
13
|
+
# Fetch backend for an attribute
|
14
|
+
# @param [String] attribute Attribute
|
15
|
+
def backend_for(attribute)
|
16
|
+
@model.send(Backend.method_name(attribute))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/mobility/attributes.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require "mobility/util"
|
2
3
|
|
3
4
|
module Mobility
|
@@ -138,7 +139,7 @@ with other backends.
|
|
138
139
|
end
|
139
140
|
|
140
141
|
# Setup backend class, include modules into model class, add this
|
141
|
-
# attributes module to shared {Mobility::
|
142
|
+
# attributes module to shared {Mobility::Accumulator} and setup model with
|
142
143
|
# backend setup block (see {Mobility::Backend::Setup#setup_model}).
|
143
144
|
# @param klass [Class] Class of model
|
144
145
|
def included(klass)
|
data/lib/mobility/backend.rb
CHANGED
@@ -116,7 +116,7 @@ On top of this, a backend will normally:
|
|
116
116
|
# @return [String] name of backend reader method
|
117
117
|
def self.method_name(attribute)
|
118
118
|
@backend_method_names ||= {}
|
119
|
-
@backend_method_names[attribute] ||= "#{attribute}_backend"
|
119
|
+
@backend_method_names[attribute] ||= "#{attribute}_backend"
|
120
120
|
end
|
121
121
|
|
122
122
|
# Defines setup hooks for backend to customize model class.
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Mobility
|
2
3
|
module Backend
|
3
4
|
=begin
|
@@ -16,15 +17,15 @@ Adds {#for} method to backend to return ORM-specific backend.
|
|
16
17
|
# @param [Class] model_class Class of model
|
17
18
|
# @return [Class] Class of backend to use for model
|
18
19
|
def for(model_class)
|
19
|
-
namespace = name.split('::'
|
20
|
+
namespace = name.split('::')
|
20
21
|
if Loaded::ActiveRecord && model_class < ::ActiveRecord::Base
|
21
22
|
require_backend("active_record", namespace.last.underscore)
|
22
|
-
const_get(namespace.insert(-2, "ActiveRecord"
|
23
|
+
const_get(namespace.insert(-2, "ActiveRecord").join("::"))
|
23
24
|
elsif Loaded::Sequel && model_class < ::Sequel::Model
|
24
25
|
require_backend("sequel", namespace.last.underscore)
|
25
|
-
const_get(namespace.insert(-2, "Sequel"
|
26
|
+
const_get(namespace.insert(-2, "Sequel").join("::"))
|
26
27
|
else
|
27
|
-
raise ArgumentError, "#{namespace.last} backend can only be used by ActiveRecord or Sequel models"
|
28
|
+
raise ArgumentError, "#{namespace.last} backend can only be used by ActiveRecord or Sequel models"
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require "mobility/backends/active_record"
|
2
3
|
|
3
4
|
module Mobility
|
@@ -10,7 +11,8 @@ Implements the {Mobility::Backends::Container} backend for ActiveRecord models.
|
|
10
11
|
class ActiveRecord::Container
|
11
12
|
include ActiveRecord
|
12
13
|
|
13
|
-
require 'mobility/backends/active_record/container/
|
14
|
+
require 'mobility/backends/active_record/container/json_query_methods'
|
15
|
+
require 'mobility/backends/active_record/container/jsonb_query_methods'
|
14
16
|
|
15
17
|
# @return [Symbol] name of container column
|
16
18
|
attr_reader :column_name
|
@@ -47,8 +49,14 @@ Implements the {Mobility::Backends::Container} backend for ActiveRecord models.
|
|
47
49
|
|
48
50
|
# @!group Backend Configuration
|
49
51
|
# @option options [Symbol] column_name (:translations) Name of column on which to store translations
|
52
|
+
# @raise [InvalidColumnType] if the type of the container column is not json or jsonb
|
50
53
|
def self.configure(options)
|
51
54
|
options[:column_name] ||= :translations
|
55
|
+
options[:column_name] = options[:column_name].to_sym
|
56
|
+
options[:column_type] = options[:model_class].type_for_attribute(options[:column_name].to_s).try(:type)
|
57
|
+
unless %i[json jsonb].include?(options[:column_type])
|
58
|
+
raise InvalidColumnType, "#{options[:column_name]} must be a column of type json or jsonb"
|
59
|
+
end
|
52
60
|
end
|
53
61
|
# @!endgroup
|
54
62
|
|
@@ -59,7 +67,9 @@ Implements the {Mobility::Backends::Container} backend for ActiveRecord models.
|
|
59
67
|
end
|
60
68
|
end
|
61
69
|
|
62
|
-
|
70
|
+
backend_class = self
|
71
|
+
|
72
|
+
setup do |attributes, options|
|
63
73
|
store options[:column_name], coder: Coder
|
64
74
|
|
65
75
|
# Fix for duping depth-2 jsonb column in AR < 5.0
|
@@ -78,9 +88,14 @@ Implements the {Mobility::Backends::Container} backend for ActiveRecord models.
|
|
78
88
|
include const_set(module_name, dupable)
|
79
89
|
end
|
80
90
|
end
|
81
|
-
end
|
82
91
|
|
83
|
-
|
92
|
+
query_methods = backend_class.const_get("#{options[:column_type].capitalize}QueryMethods")
|
93
|
+
extend(Module.new do
|
94
|
+
define_method ::Mobility.query_method do
|
95
|
+
super().extending(query_methods.new(attributes, options))
|
96
|
+
end
|
97
|
+
end)
|
98
|
+
end
|
84
99
|
|
85
100
|
private
|
86
101
|
|
@@ -113,6 +128,8 @@ Implements the {Mobility::Backends::Container} backend for ActiveRecord models.
|
|
113
128
|
obj
|
114
129
|
end
|
115
130
|
end
|
131
|
+
|
132
|
+
class InvalidColumnType < StandardError; end
|
116
133
|
end
|
117
134
|
end
|
118
135
|
end
|