json_translate 3.0.1 → 4.0.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: cf107bdbc1965bfe33a5dbe315fb17f4f0dea348
4
- data.tar.gz: b100d78c6d6ed8cf4519470810c095bed8c0b47d
3
+ metadata.gz: 18109ecd716fe83a685fba1c452278e24c292d88
4
+ data.tar.gz: 23188ebe9a7a00efc712a3ee7945911eae0137bb
5
5
  SHA512:
6
- metadata.gz: 0797a274b96cf268c5f5a86eab8dd97f6cca3c4590ee34765986e2d663030bffa12d94b9c51c28acb3c1e883ebcb5a0e372af9d4ebb49c0589d7ba68f7101e19
7
- data.tar.gz: 7c30af32a81d2c8dc8a160c57687e037a5725f1c3afb8f517e0ace39137d316a9a8ce4f217d216015fadf1bd0480d967e85f98558dc2a99617019bb7975f24ec
6
+ metadata.gz: b38e84f20f8c74bd68cd8cf18149fdc54c55b5b514d491056b177c1cacc9372289235d11f4bc954395e25dbf7aa1d6eb533fe23d26fd01fa616c2e0724147c07
7
+ data.tar.gz: bb93cce1c20f30bcc460e59c53f80fda46e6f5232ef4f7c43c7344dafc618a26b424bb60ac7320d9be1d5849e7bf1a13f007d23d869181408d35145f7d8d72ee
data/README.md CHANGED
@@ -1,18 +1,20 @@
1
+ [![Gem Version](https://badge.fury.io/rb/json_translate.svg)](https://badge.fury.io/rb/json_translate)
2
+ [![Build Status](https://api.travis-ci.org/cfabianski/json_translate.png)](https://travis-ci.org/cfabianski/json_translate)
3
+ [![License](http://img.shields.io/badge/license-mit-brightgreen.svg)](COPYRIGHT)
4
+ [![Code Climate](https://codeclimate.com/github/cfabianski/json_translate.png)](https://codeclimate.com/github/cfabianski/json_translate)
5
+
1
6
  # JSON Translate
2
7
 
3
8
  Rails I18n library for ActiveRecord model/data translation using PostgreSQL's
4
- JSONB datatype. It provides an interface inspired by
9
+ JSONB datatype or MySQL's JSON datatype. It provides an interface inspired by
5
10
  [Globalize3](https://github.com/svenfuchs/globalize3) but removes the need to
6
11
  maintain separate translation tables.
7
12
 
8
- [![Build Status](https://api.travis-ci.org/cfabianski/json_translate.png)](https://travis-ci.org/cfabianski/json_translate)
9
- [![License](http://img.shields.io/badge/license-mit-brightgreen.svg)](COPYRIGHT)
10
- [![Code Climate](https://codeclimate.com/github/cfabianski/json_translate.png)](https://codeclimate.com/github/cfabianski/json_translate)
11
-
12
13
  ## Requirements
13
14
 
14
15
  * ActiveRecord >= 4.2.0
15
16
  * I18n
17
+ * MySQL support requires ActiveRecord >= 5 and MySQL >= 5.7.8.
16
18
 
17
19
  ## Installation
18
20
 
@@ -24,8 +26,15 @@ When using bundler, put it in your Gemfile:
24
26
  source 'https://rubygems.org'
25
27
 
26
28
  gem 'activerecord'
29
+
30
+ # PostgreSQL
27
31
  gem 'pg', :platform => :ruby
28
32
  gem 'activerecord-jdbcpostgresql-adapter', :platform => :jruby
33
+
34
+ # or MySQL
35
+ gem 'mysql2', :platform => :ruby
36
+ gem 'activerecord-jdbcmysql-adapter', :platform => :jruby
37
+
29
38
  gem 'json_translate'
30
39
  ```
31
40
 
@@ -57,21 +66,21 @@ post.title # => This database rocks!
57
66
  post.title_he # => אתר זה טוב
58
67
  ```
59
68
 
60
- To find records using translations without constructing JSONB queries by hand:
69
+ To find records using translations without constructing JSON queries by hand:
61
70
 
62
71
  ```ruby
63
72
  Post.with_title_translation("This database rocks!") # => #<ActiveRecord::Relation ...>
64
73
  Post.with_title_translation("אתר זה טוב", :he) # => #<ActiveRecord::Relation ...>
65
74
  ```
66
75
 
67
- In order to make this work, you'll need to define an JSONB column for each of
76
+ In order to make this work, you'll need to define an JSON or JSONB column for each of
68
77
  your translated attributes, using the suffix "_translations":
69
78
 
70
79
  ```ruby
71
80
  class CreatePosts < ActiveRecord::Migration
72
81
  def up
73
82
  create_table :posts do |t|
74
- t.column :title_translations, 'jsonb'
83
+ t.column :title_translations, 'jsonb' # or 'json' for MySQL
75
84
  t.column :body_translations, 'jsonb'
76
85
  t.timestamps
77
86
  end
@@ -1,6 +1,5 @@
1
1
  require "active_record"
2
2
  require "json_translate/translates"
3
3
  require "json_translate/translates/instance_methods"
4
- require "json_translate/translates/active_record_with_json_translates"
5
4
 
6
5
  ActiveRecord::Base.extend(JSONTranslate::Translates)
@@ -1,7 +1,7 @@
1
1
  module JSONTranslate
2
2
  module Translates
3
3
  SUFFIX = "_translations".freeze
4
-
4
+ MYSQL_ADAPTERS = %w[MySQL Mysql2 Mysql2Spatial]
5
5
 
6
6
  def translates(*attrs)
7
7
  include InstanceMethods
@@ -18,22 +18,37 @@ module JSONTranslate
18
18
  ].flatten.compact
19
19
 
20
20
  attrs.each do |attr_name|
21
- define_method attr_name do
22
- read_json_translation(attr_name)
21
+ define_method attr_name do |**params|
22
+ read_json_translation(attr_name, params)
23
23
  end
24
24
 
25
25
  define_method "#{attr_name}=" do |value|
26
26
  write_json_translation(attr_name, value)
27
27
  end
28
28
 
29
+ I18n.available_locales.each do |locale|
30
+ normalized_locale = locale.to_s.downcase.gsub(/[^a-z]/, '')
31
+
32
+ define_method :"#{attr_name}_#{normalized_locale}" do |**params|
33
+ read_json_translation(attr_name, locale, false, params)
34
+ end
35
+
36
+ define_method "#{attr_name}_#{normalized_locale}=" do |value|
37
+ write_json_translation(attr_name, value, locale)
38
+ end
39
+ end
40
+
29
41
  define_singleton_method "with_#{attr_name}_translation" do |value, locale = I18n.locale|
30
42
  quoted_translation_store = connection.quote_column_name("#{attr_name}#{SUFFIX}")
31
43
  translation_hash = { "#{locale}" => value }
32
- where("#{quoted_translation_store} @> :translation::jsonb", translation: translation_hash.to_json)
44
+
45
+ if MYSQL_ADAPTERS.include?(connection.adapter_name)
46
+ where("JSON_CONTAINS(#{quoted_translation_store}, :translation, '$')", translation: translation_hash.to_json)
47
+ else
48
+ where("#{quoted_translation_store} @> :translation::jsonb", translation: translation_hash.to_json)
49
+ end
33
50
  end
34
51
  end
35
-
36
- send(:prepend, ActiveRecordWithJSONTranslate)
37
52
  end
38
53
 
39
54
  def translates?
@@ -3,10 +3,12 @@ module JSONTranslate
3
3
  module InstanceMethods
4
4
  def disable_fallback
5
5
  toggle_fallback(false)
6
+ yield if block_given?
6
7
  end
7
8
 
8
9
  def enable_fallback
9
10
  toggle_fallback(true)
11
+ yield if block_given?
10
12
  end
11
13
 
12
14
  protected
@@ -14,70 +16,47 @@ module JSONTranslate
14
16
  attr_reader :enabled_fallback
15
17
 
16
18
  def json_translate_fallback_locales(locale)
17
- return locale if enabled_fallback == false || !I18n.respond_to?(:fallbacks)
18
- I18n.fallbacks[locale]
19
+ if enabled_fallback != false && I18n.respond_to?(:fallbacks)
20
+ Array(I18n.fallbacks[locale])
21
+ else
22
+ Array(locale)
23
+ end
19
24
  end
20
25
 
21
- def read_json_translation(attr_name, locale = I18n.locale)
26
+ def read_json_translation(attr_name, locale = I18n.locale, fallback = true, **params)
22
27
  translations = public_send("#{attr_name}#{SUFFIX}") || {}
23
28
 
24
- available = Array(json_translate_fallback_locales(locale)).detect do |available_locale|
25
- translations[available_locale.to_s].present?
29
+ selected_locale = locale
30
+ if fallback
31
+ selected_locale = json_translate_fallback_locales(locale).detect do |available_locale|
32
+ translations[available_locale.to_s].present?
33
+ end
34
+ end
35
+
36
+ translation = translations[selected_locale.to_s]
37
+
38
+ if translation && params.present?
39
+ begin
40
+ translation = I18n.interpolate(translation, params)
41
+ rescue I18n::MissingInterpolationArgument
42
+ end
26
43
  end
27
44
 
28
- translations[available.to_s]
45
+ translation
29
46
  end
30
47
 
31
48
  def write_json_translation(attr_name, value, locale = I18n.locale)
49
+ value = value.presence
32
50
  translation_store = "#{attr_name}#{SUFFIX}"
33
51
  translations = public_send(translation_store) || {}
34
52
  public_send("#{translation_store}_will_change!") unless translations[locale.to_s] == value
35
- translations[locale.to_s] = value
36
- public_send("#{translation_store}=", translations)
37
- value
38
- end
39
-
40
- def respond_to_with_translates?(symbol, include_all = false)
41
- return true if parse_translated_attribute_accessor(symbol)
42
- respond_to_without_translates?(symbol, include_all)
43
- end
44
-
45
- def method_missing_with_translates(method_name, *args)
46
- translated_attr_name, locale, assigning = parse_translated_attribute_accessor(method_name)
47
-
48
- return method_missing_without_translates(method_name, *args) unless translated_attr_name
49
-
50
- if assigning
51
- write_json_translation(translated_attr_name, args.first, locale)
53
+ if value
54
+ translations[locale.to_s] = value
52
55
  else
53
- read_json_translation(translated_attr_name, locale)
56
+ translations.delete(locale.to_s)
54
57
  end
55
- end
56
-
57
- # Internal: Parse a translated convenience accessor name.
58
- #
59
- # method_name - The accessor name.
60
- #
61
- # Examples
62
- #
63
- # parse_translated_attribute_accessor("title_en=")
64
- # # => [:title, :en, true]
65
- #
66
- # parse_translated_attribute_accessor("title_fr")
67
- # # => [:title, :fr, false]
68
- #
69
- # Returns the attribute name Symbol, locale Symbol, and a Boolean
70
- # indicating whether or not the caller is attempting to assign a value.
71
- def parse_translated_attribute_accessor(method_name)
72
- return unless /\A(?<attribute>[a-z_]+)_(?<locale>[a-z]{2})(?<assignment>=?)\z/ =~ method_name
73
-
74
- translated_attr_name = attribute.to_sym
75
- return unless translated_attribute_names.include?(translated_attr_name)
76
-
77
- locale = locale.to_sym
78
- assigning = assignment.present?
79
-
80
- [translated_attr_name, locale, assigning]
58
+ public_send("#{translation_store}=", translations)
59
+ value
81
60
  end
82
61
 
83
62
  def toggle_fallback(enabled)
@@ -1,3 +1,3 @@
1
1
  module JSONTranslate
2
- VERSION = "3.0.1"
2
+ VERSION = "4.0.0"
3
3
  end
@@ -1,6 +1,13 @@
1
- test:
1
+ postgres:
2
2
  adapter: postgresql
3
3
  host: localhost
4
4
  database: json_translate_test
5
5
  username: postgres
6
+ schema_search_path: public
6
7
  min_messages: warning
8
+
9
+ mysql:
10
+ adapter: mysql2
11
+ host: localhost
12
+ database: json_translate_test
13
+ username: root
@@ -1,5 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec :path => './../..'
3
3
 
4
- gem 'pg'
4
+ gem 'pg', '< 1.0.0'
5
+ gem 'mysql2'
5
6
  gem 'activerecord', '~> 4.2.0'
@@ -1,5 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec :path => './../..'
3
3
 
4
- gem 'pg'
4
+ gem 'pg', '< 1.0.0'
5
+ gem 'mysql2'
5
6
  gem 'activerecord', '~> 5.0.0'
@@ -7,7 +7,7 @@ DatabaseCleaner.strategy = :transaction
7
7
  I18n.available_locales = [:en, :fr]
8
8
 
9
9
  class Post < ActiveRecord::Base
10
- translates :title
10
+ translates :title, :body_1
11
11
  end
12
12
 
13
13
  class PostDetailed < Post
@@ -23,10 +23,14 @@ class JSONTranslate::Test < Minitest::Test
23
23
 
24
24
  private
25
25
 
26
+ def adapter
27
+ @adapter ||= ENV['DB'] || 'postgres'
28
+ end
29
+
26
30
  def db_config
27
31
  @db_config ||= begin
28
32
  filepath = File.join('test', 'database.yml')
29
- YAML.load_file(filepath)['test']
33
+ YAML.load_file(filepath)[adapter]
30
34
  end
31
35
  end
32
36
 
@@ -36,16 +40,18 @@ class JSONTranslate::Test < Minitest::Test
36
40
  end
37
41
 
38
42
  def create_database
39
- system_config = db_config.merge('database' => 'postgres', 'schema_search_path' => 'public')
43
+ system_config = db_config
40
44
  connection = establish_connection(system_config)
41
45
  connection.create_database(db_config['database']) rescue nil
42
46
  end
43
47
 
44
48
  def create_table
49
+ column_type = adapter == 'mysql' ? 'json' : 'jsonb'
45
50
  connection = establish_connection(db_config)
46
51
  connection.create_table(:posts, :force => true) do |t|
47
- t.column :title_translations, 'jsonb'
48
- t.column :comment_translations, 'jsonb'
52
+ t.column :title_translations, column_type
53
+ t.column :body_1_translations, column_type
54
+ t.column :comment_translations, column_type
49
55
  end
50
56
  end
51
57
  end
@@ -4,15 +4,20 @@ require 'test_helper'
4
4
  class TranslatesTest < JSONTranslate::Test
5
5
  def test_assigns_in_current_locale
6
6
  I18n.with_locale(:en) do
7
- p = Post.new(:title => "English Title")
7
+ p = Post.new(:title => "English Title", :body_1 => "English Body")
8
8
  assert_equal("English Title", p.title_translations['en'])
9
+ assert_equal("English Body", p.body_1_translations['en'])
9
10
  end
10
11
  end
11
12
 
12
13
  def test_retrieves_in_current_locale
13
- p = Post.new(:title_translations => { "en" => "English Title", "fr" => "Titre français" })
14
+ p = Post.new(
15
+ :title_translations => { "en" => "English Title", "fr" => "Titre français" },
16
+ :body_1_translations => { "en" => "English Body", "fr" => "Corps anglais" }
17
+ )
14
18
  I18n.with_locale(:fr) do
15
19
  assert_equal("Titre français", p.title)
20
+ assert_equal("Corps anglais", p.body_1)
16
21
  end
17
22
  end
18
23
 
@@ -20,33 +25,41 @@ class TranslatesTest < JSONTranslate::Test
20
25
  I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
21
26
  I18n.default_locale = :"en-US"
22
27
 
23
- p = Post.new(:title_translations => {"en" => "English Title"})
28
+ p = Post.new(:title_translations => {"en" => "English Title"}, :body_1_translations => { "en" => "English Body" })
24
29
  I18n.with_locale(:fr) do
25
30
  assert_equal("English Title", p.title)
31
+ assert_equal("English Body", p.body_1)
26
32
  end
27
33
  end
28
34
 
29
35
  def test_assigns_in_specified_locale
30
36
  I18n.with_locale(:en) do
31
- p = Post.new(:title_translations => { "en" => "English Title" })
37
+ p = Post.new(:title_translations => { "en" => "English Title" }, :body_1_translations => { "en" => "English Body" })
32
38
  p.title_fr = "Titre français"
39
+ p.body_1_fr = "Corps anglais"
33
40
  assert_equal("Titre français", p.title_translations["fr"])
41
+ assert_equal("Corps anglais", p.body_1_translations["fr"])
34
42
  end
35
43
  end
36
44
 
37
45
  def test_persists_changes_in_specified_locale
38
46
  I18n.with_locale(:en) do
39
- p = Post.create!(:title_translations => { "en" => "Original Text" })
47
+ p = Post.create!(:title_translations => { "en" => "Original Text" }, :body_1_translations => { "en" => "Original Body" })
40
48
  p.title_en = "Updated Text"
49
+ p.body_1_en = "Updated Body"
41
50
  p.save!
42
51
  assert_equal("Updated Text", Post.last.title_en)
52
+ assert_equal("Updated Body", Post.last.body_1_en)
43
53
  end
44
54
  end
45
55
 
46
56
  def test_retrieves_in_specified_locale
47
57
  I18n.with_locale(:en) do
48
- p = Post.new(:title_translations => { "en" => "English Title", "fr" => "Titre français" })
58
+ p = Post.new(:title_translations => { "en" => "English Title", "fr" => "Titre français" }, :body_1_translations => { "en" => "English Body", "fr" => "Corps anglais" })
49
59
  assert_equal("Titre français", p.title_fr)
60
+ assert_equal("Corps anglais", p.body_1_fr)
61
+ assert_equal("English Title", p.title_en)
62
+ assert_equal("English Body", p.body_1_en)
50
63
  end
51
64
  end
52
65
 
@@ -54,9 +67,14 @@ class TranslatesTest < JSONTranslate::Test
54
67
  I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
55
68
  I18n.default_locale = :"en-US"
56
69
 
57
- p = Post.new(:title_translations => { "en" => "English Title" })
70
+ p = Post.new(:title_translations => { "en" => "English Title" }, :body_1_translations => { "en" => "English Body" })
58
71
  I18n.with_locale(:fr) do
59
- assert_equal("English Title", p.title_fr)
72
+ assert_equal("English Title", p.title)
73
+ assert_equal("English Body", p.body_1)
74
+ assert_nil(p.title_fr)
75
+ assert_nil(p.body_1_fr)
76
+ assert_equal("English Title", p.title_en)
77
+ assert_equal("English Body", p.body_1_en)
60
78
  end
61
79
  end
62
80
 
@@ -64,9 +82,14 @@ class TranslatesTest < JSONTranslate::Test
64
82
  I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
65
83
  I18n.default_locale = :"en-US"
66
84
 
67
- p = Post.new(:title_translations => { "en" => "English Title", "fr" => "" })
85
+ p = Post.new(:title_translations => { "en" => "English Title", "fr" => "" }, :body_1_translations => { "en" => "English Body", "fr" => "" })
68
86
  I18n.with_locale(:fr) do
69
- assert_equal("English Title", p.title_fr)
87
+ assert_equal("English Title", p.title)
88
+ assert_equal("English Body", p.body_1)
89
+ assert_equal("", p.title_fr)
90
+ assert_equal("", p.body_1_fr)
91
+ assert_equal("English Title", p.title_en)
92
+ assert_equal("English Body", p.body_1_en)
70
93
  end
71
94
  end
72
95
 
@@ -74,10 +97,11 @@ class TranslatesTest < JSONTranslate::Test
74
97
  I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
75
98
  I18n.default_locale = :"en-US"
76
99
 
77
- p = Post.new(:title_translations => { "en" => "English Title" })
100
+ p = Post.new(:title_translations => { "en" => "English Title" }, :body_1_translations => { "en" => "English Body" })
78
101
  p.disable_fallback
79
102
  I18n.with_locale(:fr) do
80
- assert_equal(nil, p.title_fr)
103
+ assert_nil(p.title)
104
+ assert_nil(p.body_1)
81
105
  end
82
106
  end
83
107
 
@@ -85,22 +109,43 @@ class TranslatesTest < JSONTranslate::Test
85
109
  I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
86
110
  I18n.default_locale = :"en-US"
87
111
 
88
- p = Post.new(:title_translations => { "en" => "English Title" })
112
+ p = Post.new(:title_translations => { "en" => "English Title" }, :body_1_translations => { "en" => "English Body" })
89
113
  p.enable_fallback
90
114
 
91
- assert_equal("English Title", p.title_fr)
92
- p.disable_fallback { assert_nil p.title_fr }
115
+ I18n.with_locale(:fr) do
116
+ assert_equal("English Title", p.title)
117
+ assert_equal("English Body", p.body_1)
118
+ assert_nil(p.title_fr)
119
+ assert_nil(p.body_1_fr)
120
+ assert_equal("English Title", p.title_en)
121
+ assert_equal("English Body", p.body_1_en)
122
+ yielded = p.disable_fallback do
123
+ assert_nil(p.title)
124
+ assert_nil(p.body_1)
125
+ assert_nil(p.title_fr)
126
+ assert_nil(p.body_1_fr)
127
+ assert_equal("English Title", p.title_en)
128
+ assert_equal("English Body", p.body_1_en)
129
+ :block_return_value
130
+ end
131
+ assert_equal(:block_return_value, yielded)
132
+ end
93
133
  end
94
134
 
95
135
  def test_retrieves_in_specified_locale_with_fallback_reenabled
96
136
  I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
97
137
  I18n.default_locale = :"en-US"
98
138
 
99
- p = Post.new(:title_translations => { "en" => "English Title" })
139
+ p = Post.new(:title_translations => { "en" => "English Title" }, :body_1_translations => { "en" => "English Body" })
100
140
  p.disable_fallback
101
141
  p.enable_fallback
102
142
  I18n.with_locale(:fr) do
103
- assert_equal("English Title", p.title_fr)
143
+ assert_equal("English Title", p.title)
144
+ assert_equal("English Body", p.body_1)
145
+ assert_nil(p.title_fr)
146
+ assert_nil(p.body_1_fr)
147
+ assert_equal("English Title", p.title_en)
148
+ assert_equal("English Body", p.body_1_en)
104
149
  end
105
150
  end
106
151
 
@@ -108,11 +153,27 @@ class TranslatesTest < JSONTranslate::Test
108
153
  I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
109
154
  I18n.default_locale = :"en-US"
110
155
 
111
- p = Post.new(:title_translations => { "en" => "English Title" })
156
+ p = Post.new(:title_translations => { "en" => "English Title" }, :body_1_translations => { "en" => "English Body" })
112
157
  p.disable_fallback
113
158
 
114
- assert_nil(p.title_fr)
115
- p.enable_fallback { assert_equal("English Title", p.title_fr) }
159
+ I18n.with_locale(:fr) do
160
+ assert_nil(p.title)
161
+ assert_nil(p.body_1)
162
+ assert_nil(p.title_fr)
163
+ assert_nil(p.body_1_fr)
164
+ assert_equal("English Title", p.title_en)
165
+ assert_equal("English Body", p.body_1_en)
166
+ yielded = p.enable_fallback do
167
+ assert_equal("English Title", p.title)
168
+ assert_equal("English Body", p.body_1)
169
+ assert_nil(p.title_fr)
170
+ assert_nil(p.body_1_fr)
171
+ assert_equal("English Title", p.title_en)
172
+ assert_equal("English Body", p.body_1_en)
173
+ :block_return_value
174
+ end
175
+ assert_equal(:block_return_value, yielded)
176
+ end
116
177
  end
117
178
 
118
179
  def test_method_missing_delegates
@@ -124,22 +185,38 @@ class TranslatesTest < JSONTranslate::Test
124
185
  end
125
186
 
126
187
  def test_persists_translations_assigned_as_hash
127
- p = Post.create!(:title_translations => { "en" => "English Title", "fr" => "Titre français" })
188
+ p = Post.create!(:title_translations => { "en" => "English Title", "fr" => "Titre français" }, :body_1_translations => { "en" => "English Body", "fr" => "Corps anglais" })
128
189
  p.reload
129
190
  assert_equal({"en" => "English Title", "fr" => "Titre français"}, p.title_translations)
191
+ assert_equal({"en" => "English Body", "fr" => "Corps anglais"}, p.body_1_translations)
130
192
  end
131
193
 
132
194
  def test_persists_translations_assigned_to_localized_accessors
133
- p = Post.create!(:title_en => "English Title", :title_fr => "Titre français")
195
+ p = Post.create!(:title_en => "English Title", :title_fr => "Titre français", :body_1_en => "English Body", :body_1_fr => "Corps anglais")
134
196
  p.reload
135
197
  assert_equal({"en" => "English Title", "fr" => "Titre français"}, p.title_translations)
198
+ assert_equal({"en" => "English Body", "fr" => "Corps anglais"}, p.body_1_translations)
136
199
  end
137
200
 
138
201
  def test_with_translation_relation
139
- p = Post.create!(:title_translations => { "en" => "Alice in Wonderland", "fr" => "Alice au pays des merveilles" })
202
+ p = Post.create!(:title_translations => { "en" => "Alice in Wonderland", "fr" => "Alice au pays des merveilles" }, :body_1_translations => { "en" => "English Body", "fr" => "Corps anglais" })
140
203
  I18n.with_locale(:en) do
141
204
  assert_equal p.title_en, Post.with_title_translation("Alice in Wonderland").first.try(:title)
205
+ assert_equal p.body_1_en, Post.with_body_1_translation("English Body").first.try(:body_1)
206
+ end
207
+ end
208
+
209
+ def test_with_interpolation_arguments
210
+ p = Post.create!(:title_translations => { "en" => "Alice in %{where}" })
211
+ I18n.with_locale(:en) do
212
+ assert_equal p.title(where: "Wonderland"), "Alice in Wonderland"
142
213
  end
214
+ assert_equal p.title_en(where: "Wonderland"), "Alice in Wonderland"
215
+ end
216
+
217
+ def test_for_missing_interpolation_arguments
218
+ p = Post.create!(:title_translations => { "en" => "Alice in %{where}" })
219
+ assert_equal p.title_en, "Alice in %{where}"
143
220
  end
144
221
 
145
222
  def test_class_method_translates?
@@ -153,6 +230,10 @@ class TranslatesTest < JSONTranslate::Test
153
230
  "en" => "Alice in Wonderland",
154
231
  "fr" => "Alice au pays des merveilles"
155
232
  },
233
+ :body_1_translations => {
234
+ "en" => "English Body",
235
+ "fr" => "Corps anglais"
236
+ },
156
237
  :comment_translations => {
157
238
  "en" => "Awesome book",
158
239
  "fr" => "Un livre unique"
@@ -161,11 +242,13 @@ class TranslatesTest < JSONTranslate::Test
161
242
 
162
243
  I18n.with_locale(:en) { assert_equal "Awesome book", p.comment }
163
244
  I18n.with_locale(:en) { assert_equal "Alice in Wonderland", p.title }
245
+ I18n.with_locale(:en) { assert_equal "English Body", p.body_1 }
164
246
  I18n.with_locale(:fr) { assert_equal "Un livre unique", p.comment }
165
247
  I18n.with_locale(:fr) { assert_equal "Alice au pays des merveilles", p.title }
248
+ I18n.with_locale(:fr) { assert_equal "Corps anglais", p.body_1 }
166
249
  end
167
250
 
168
251
  def test_permitted_translated_attributes
169
- assert_equal [:title_en, :title_fr, :comment_en, :comment_fr], PostDetailed.permitted_translated_attributes
252
+ assert_equal [:title_en, :title_fr, :body_1_en, :body_1_fr, :comment_en, :comment_fr], PostDetailed.permitted_translated_attributes
170
253
  end
171
254
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_translate
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Worley
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-02-09 00:00:00.000000000 Z
12
+ date: 2018-01-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -79,7 +79,6 @@ files:
79
79
  - README.md
80
80
  - lib/json_translate.rb
81
81
  - lib/json_translate/translates.rb
82
- - lib/json_translate/translates/active_record_with_json_translates.rb
83
82
  - lib/json_translate/translates/instance_methods.rb
84
83
  - lib/json_translate/version.rb
85
84
  - test/database.yml
@@ -87,7 +86,7 @@ files:
87
86
  - test/gemfiles/Gemfile.rails-5.0.x
88
87
  - test/test_helper.rb
89
88
  - test/translates_test.rb
90
- homepage: https://github.com/cfabiaski/json_translate
89
+ homepage: https://github.com/cfabianski/json_translate
91
90
  licenses:
92
91
  - MIT
93
92
  metadata: {}
@@ -107,14 +106,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
106
  version: '0'
108
107
  requirements: []
109
108
  rubyforge_project:
110
- rubygems_version: 2.6.8
109
+ rubygems_version: 2.6.14
111
110
  signing_key:
112
111
  specification_version: 4
113
112
  summary: Rails I18n library for ActiveRecord model/data translation using PostgreSQL's
114
113
  JSONB datatype.
115
114
  test_files:
116
- - test/database.yml
117
- - test/gemfiles/Gemfile.rails-4.2.x
118
115
  - test/gemfiles/Gemfile.rails-5.0.x
119
- - test/test_helper.rb
116
+ - test/gemfiles/Gemfile.rails-4.2.x
117
+ - test/database.yml
120
118
  - test/translates_test.rb
119
+ - test/test_helper.rb
@@ -1,22 +0,0 @@
1
- module JSONTranslate
2
- module Translates
3
- module ActiveRecordWithJSONTranslate
4
- def respond_to?(symbol, include_all = false)
5
- return true if parse_translated_attribute_accessor(symbol)
6
- super(symbol, include_all)
7
- end
8
-
9
- def method_missing(method_name, *args)
10
- translated_attr_name, locale, assigning = parse_translated_attribute_accessor(method_name)
11
-
12
- return super(method_name, *args) unless translated_attr_name
13
-
14
- if assigning
15
- write_json_translation(translated_attr_name, args.first, locale)
16
- else
17
- read_json_translation(translated_attr_name, locale)
18
- end
19
- end
20
- end
21
- end
22
- end