globalize 6.0.0.alpha.1 → 6.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bb12d7f3b6c17018cefe1614dfba6b585ba169ef2ca412b58d230ccabf778033
4
- data.tar.gz: ac44f2e8a75b53ad116b8674d1f5c3d47a122c9782133e3853359217fb944375
3
+ metadata.gz: 70e3196446a295412903e65b76e6a1d834904abb732a7692232936fa782f4a9a
4
+ data.tar.gz: 672eddfec21d2d7205d36bbbe176f646f84511c51a5508056cea828d2d8f2751
5
5
  SHA512:
6
- metadata.gz: 2f358f026bc47645ae8751cb3b2a3a7660cfbbb64c6c37e2ab2b46a9b548de357ba0e8a8880eb82326ce78c6e7605c31fbf27726d645b33baa62c594bace13b5
7
- data.tar.gz: 185fbeea91d8fda53c23232897deba40ad149fbea99c329a32aa8d9bbd7c296c4b9a5a814ced76d39785969d8503011f9316bc600a07de7e82b1a03fe0c3a76a
6
+ metadata.gz: 90f9f98183c545e5f255dd57b48367f6e7b1bba0bde85962c7613e8957086e16757432b56f84acaea36dcbd222ca07d2b0188278bebea7d065ccdb80a052ff22
7
+ data.tar.gz: e6a718305ce3fd62835ceed0fefdadf4cb19b2e9499a7955acf19763f655b406b468e951f22e6d15edc147ec22906ec17d3792b66fd5bff8eef3ab17071907a3
checksums.yaml.gz.sig ADDED
Binary file
data/Appraisals CHANGED
@@ -1,19 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RAILS_VERSIONS = %w[
4
- 4.2.10
5
- 5.1.6
6
- 5.2.1
4
+ 4.2.11.3
5
+ 5.1.7
6
+ 5.2.5
7
+ 6.0.3.6
8
+ 6.1.3.1
9
+ 7.0.0
7
10
  ]
8
11
 
9
12
  RAILS_VERSIONS.each do |version|
10
13
  appraise "rails_#{version}" do
11
14
  gem 'activemodel', version
12
15
  gem 'activerecord', version
16
+
17
+ if version =~ /^4/
18
+ gem 'sqlite3', '~> 1.3.6', platforms: [:ruby, :rbx]
19
+ elsif version =~ /^5/
20
+ gem 'sqlite3', '~> 1.3', '>= 1.3.6', platforms: [:ruby, :rbx]
21
+ else
22
+ gem 'sqlite3', '~> 1.4', platforms: [:ruby, :rbx]
23
+ end
13
24
 
14
- platforms :rbx do
15
- gem "rubysl", "~> 2.0"
16
- gem "rubinius-developer_tools"
25
+ if !ENV['CI'] || %w(postgres postgresql).include?(ENV['DB'])
26
+ group :postgres, :postgresql do
27
+ if version =~ /^4/
28
+ gem 'pg', '< 1.0', platforms: [:ruby, :rbx]
29
+ else
30
+ gem 'pg', '~> 1.1', platforms: [:ruby, :rbx]
31
+ end
32
+ end
17
33
  end
18
34
 
19
35
  platforms :jruby do
data/CHANGELOG.md CHANGED
@@ -1,9 +1,19 @@
1
1
  # Globalize Changelog
2
2
 
3
- ## Unreleased
3
+ ## 6.0.1 (2021-06-23)
4
+
5
+ * Fix errors with Rails 6.1 and Ruby 3.0 [#778](https://github.com/globalize/globalize/pull/778) by [Andrew White](https://github.com/pixeltrix)
6
+ * Track `saved_changes` for Rails 5.1 and above [#780](https://github.com/globalize/globalize/pull/780) by [Peter Postma](https://github.com/ppostma)
7
+
8
+ ## 6.0.0 (2021-01-11)
4
9
 
5
10
  * Add `create_source_columns` option for migrations. [#715](https://github.com/globalize/globalize/pull/715) by [IlyasValiullov](https://github.com/IlyasValiullov)
6
- * Autosave is now configurable, but defaults to false. [#736](https://github.com/globalize/globalize/pull/736) by [James Hart](https://github.com/hjhart)
11
+ * Autosave is now configurable, but defaults to false. [#736](https://github.com/globalize/globalize/pull/736) by [James Hart](https://github.com/hjhart)
12
+ * Fix foreign keys translation. [#769](https://github.com/globalize/globalize/pull/769) by [Sergey Tokarenko](https://github.com/stokarenko)
13
+
14
+ ## 5.3.1 (2021-01-11)
15
+
16
+ * Fix foreign keys translation. [#773](https://github.com/globalize/globalize/pull/773) by [Sergey Tokarenko](https://github.com/stokarenko)
7
17
 
8
18
  ## 5.3.0 (2019-05-14)
9
19
 
data/Gemfile CHANGED
@@ -15,6 +15,6 @@ end
15
15
 
16
16
  if !ENV['CI'] || %w(postgres postgresql).include?(ENV['DB'])
17
17
  group :postgres, :postgresql do
18
- gem 'pg', '< 1.0', platforms: [:ruby, :rbx]
18
+ gem 'pg', platforms: [:ruby, :rbx]
19
19
  end
20
20
  end
data/Gemfile.lock CHANGED
@@ -1,66 +1,96 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- globalize (5.3.0)
5
- activemodel (>= 4.2, < 6.1)
6
- activerecord (>= 4.2, < 6.1)
4
+ globalize (6.0.1)
5
+ activemodel (>= 4.2, < 7.0)
6
+ activerecord (>= 4.2, < 7.0)
7
7
  request_store (~> 1.0)
8
8
 
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- activemodel (6.0.2.1)
13
- activesupport (= 6.0.2.1)
14
- activerecord (6.0.2.1)
15
- activemodel (= 6.0.2.1)
16
- activesupport (= 6.0.2.1)
17
- activesupport (6.0.2.1)
12
+ activemodel (6.1.4.1)
13
+ activesupport (= 6.1.4.1)
14
+ activerecord (6.1.4.1)
15
+ activemodel (= 6.1.4.1)
16
+ activesupport (= 6.1.4.1)
17
+ activesupport (6.1.4.1)
18
18
  concurrent-ruby (~> 1.0, >= 1.0.2)
19
- i18n (>= 0.7, < 2)
20
- minitest (~> 5.1)
21
- tzinfo (~> 1.1)
22
- zeitwerk (~> 2.2)
19
+ i18n (>= 1.6, < 2)
20
+ minitest (>= 5.1)
21
+ tzinfo (~> 2.0)
22
+ zeitwerk (~> 2.3)
23
23
  ansi (1.5.0)
24
- appraisal (2.2.0)
24
+ appraisal (2.4.1)
25
25
  bundler
26
26
  rake
27
27
  thor (>= 0.14.0)
28
+ ast (2.4.2)
28
29
  builder (3.2.4)
29
- coderay (1.1.2)
30
- concurrent-ruby (1.1.6)
31
- database_cleaner (1.8.2)
32
- i18n (1.8.2)
30
+ coderay (1.1.3)
31
+ concurrent-ruby (1.1.9)
32
+ database_cleaner (2.0.1)
33
+ database_cleaner-active_record (~> 2.0.0)
34
+ database_cleaner-active_record (2.0.1)
35
+ activerecord (>= 5.a)
36
+ database_cleaner-core (~> 2.0.0)
37
+ database_cleaner-core (2.0.1)
38
+ i18n (1.8.10)
33
39
  concurrent-ruby (~> 1.0)
34
- m (1.5.1)
40
+ m (1.6.0)
35
41
  method_source (>= 0.6.7)
36
42
  rake (>= 0.9.2.2)
37
- method_source (0.9.2)
38
- minitest (5.14.0)
39
- minitest-reporters (1.4.2)
43
+ method_source (1.0.0)
44
+ minitest (5.14.4)
45
+ minitest-reporters (1.4.3)
40
46
  ansi
41
47
  builder
42
48
  minitest (>= 5.0)
43
49
  ruby-progressbar
44
50
  mysql2 (0.5.3)
45
- pg (0.21.0)
46
- pry (0.12.2)
47
- coderay (~> 1.1.0)
48
- method_source (~> 0.9.0)
49
- rack (2.2.2)
50
- rake (13.0.1)
51
- rdoc (6.2.1)
51
+ parallel (1.20.1)
52
+ parser (3.0.2.0)
53
+ ast (~> 2.4.1)
54
+ pg (1.2.3)
55
+ pry (0.14.1)
56
+ coderay (~> 1.1)
57
+ method_source (~> 1.0)
58
+ rack (2.2.3)
59
+ rainbow (3.0.0)
60
+ rake (13.0.6)
61
+ rdoc (6.3.2)
62
+ regexp_parser (2.1.1)
52
63
  request_store (1.5.0)
53
64
  rack (>= 1.4)
54
- ruby-progressbar (1.10.1)
65
+ rexml (3.2.5)
66
+ rubocop (1.20.0)
67
+ parallel (~> 1.10)
68
+ parser (>= 3.0.0.0)
69
+ rainbow (>= 2.2.2, < 4.0)
70
+ regexp_parser (>= 1.8, < 3.0)
71
+ rexml
72
+ rubocop-ast (>= 1.9.1, < 2.0)
73
+ ruby-progressbar (~> 1.7)
74
+ unicode-display_width (>= 1.4.0, < 3.0)
75
+ rubocop-ast (1.11.0)
76
+ parser (>= 3.0.1.1)
77
+ rubocop-performance (1.11.5)
78
+ rubocop (>= 1.7.0, < 2.0)
79
+ rubocop-ast (>= 0.4.0)
80
+ ruby-progressbar (1.11.0)
55
81
  sqlite3 (1.4.2)
56
- thor (1.0.1)
57
- thread_safe (0.3.6)
58
- tzinfo (1.2.6)
59
- thread_safe (~> 0.1)
60
- zeitwerk (2.2.2)
82
+ standard (1.3.0)
83
+ rubocop (= 1.20.0)
84
+ rubocop-performance (= 1.11.5)
85
+ thor (1.1.0)
86
+ tzinfo (2.0.4)
87
+ concurrent-ruby (~> 1.0)
88
+ unicode-display_width (2.0.0)
89
+ zeitwerk (2.4.2)
61
90
 
62
91
  PLATFORMS
63
- ruby
92
+ arm64-darwin-20
93
+ arm64-darwin-21
64
94
 
65
95
  DEPENDENCIES
66
96
  appraisal
@@ -70,11 +100,12 @@ DEPENDENCIES
70
100
  minitest
71
101
  minitest-reporters
72
102
  mysql2
73
- pg (< 1.0)
103
+ pg
74
104
  pry
75
105
  rake
76
106
  rdoc
77
107
  sqlite3
108
+ standard
78
109
 
79
110
  BUNDLED WITH
80
- 2.1.4
111
+ 2.2.28
data/README.md CHANGED
@@ -12,6 +12,11 @@ to add model translations to ActiveRecord models.
12
12
 
13
13
  In other words, a way to translate actual user-generated content, for example; a single blog post with multiple translations.
14
14
 
15
+ ## Current state of the gem
16
+
17
+ Globalize is not very actively maintained. Pull Requests are welcome, especially for compatibility with new versions of Rails, but none of the maintainers actively use Globalize anymore. If you need a more actively maintained model translation gem, we recommend checking out [Mobility](https://github.com/shioyama/mobility), a natural successor of Globalize created by Chris Salzberg (one of Globalize maintainers) and inspired by the ideas discussed around Globalize. For a more up-to-date discussion of the current situation, see [issue #753](https://github.com/globalize/globalize/issues/753).
18
+
19
+
15
20
  ## Requirements
16
21
 
17
22
  * ActiveRecord >= 4.2.0 (see below for installation with ActiveRecord 3.x)
@@ -0,0 +1,22 @@
1
+ version: '3.7'
2
+ services:
3
+ postgres:
4
+ image: postgres:11
5
+ volumes:
6
+ - ./tmp/postgres:/var/lib/postgresql/data
7
+ ports:
8
+ - "5432:5432"
9
+ environment:
10
+ POSTGRES_USER: "postgres"
11
+ POSTGRES_PASSWORD: ""
12
+ mysql:
13
+ image: mysql:8.0
14
+ volumes:
15
+ - ./tmp/mysql:/var/lib/mysql
16
+ ports:
17
+ - "3306:3306"
18
+ environment:
19
+ MYSQL_USER: "root"
20
+ MYSQL_PASSWORD: ""
21
+ MYSQL_ROOT_PASSWORD: ""
22
+ MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
data/globalize.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/globalize/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'globalize'
7
+ s.version = Globalize::Version
8
+ s.authors = ['Sven Fuchs', 'Joshua Harvey', 'Clemens Kofler', 'John-Paul Bader', 'Tomasz Stachewicz', 'Philip Arndt', 'Chris Salzberg']
9
+ s.email = 'nobody@globalize-rails.org'
10
+ s.homepage = 'http://github.com/globalize/globalize'
11
+ s.summary = 'Rails I18n de-facto standard library for ActiveRecord model/data translation'
12
+ s.description = "#{s.summary}."
13
+ s.license = "MIT"
14
+
15
+ s.files = Dir['{lib/**/*,[A-Z]*}']
16
+ s.platform = Gem::Platform::RUBY
17
+ s.require_path = 'lib'
18
+ s.required_ruby_version = '>= 2.4.6'
19
+
20
+ s.add_dependency 'activerecord', '>= 4.2', '< 7.1'
21
+ s.add_dependency 'activemodel', '>= 4.2', '< 7.1'
22
+ s.add_dependency 'request_store', '~> 1.0'
23
+
24
+ s.add_development_dependency 'appraisal'
25
+ s.add_development_dependency 'database_cleaner'
26
+ s.add_development_dependency 'm'
27
+ s.add_development_dependency 'minitest'
28
+ s.add_development_dependency 'minitest-reporters'
29
+ s.add_development_dependency 'pry'
30
+ s.add_development_dependency 'rake'
31
+ s.add_development_dependency 'rdoc'
32
+
33
+ s.cert_chain = [File.expand_path('certs/parndt.pem', __dir__)]
34
+ if $PROGRAM_NAME =~ /gem\z/ && ARGV.include?('build') && ARGV.include?(__FILE__)
35
+ s.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
36
+ end
37
+ end
data/issue_template.rb ADDED
@@ -0,0 +1,38 @@
1
+ # Activate the gem you are reporting the issue against.
2
+ gem 'activerecord', '4.2.0'
3
+ gem 'globalize', '5.0.1'
4
+ require 'active_record'
5
+ require 'globalize'
6
+ require 'minitest/autorun'
7
+ require 'logger'
8
+
9
+ # Ensure backward compatibility with Minitest 4
10
+ Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)
11
+
12
+ # This connection will do for database-independent bug reports.
13
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
14
+ ActiveRecord::Base.logger = Logger.new(STDOUT)
15
+
16
+ ActiveRecord::Schema.define do
17
+ create_table :posts, force: true do |t|
18
+ end
19
+
20
+ create_table :post_translations, force: true do |t|
21
+ t.references :post
22
+ t.string :title
23
+ t.text :content
24
+ t.string :locale
25
+ end
26
+ end
27
+
28
+ class Post < ActiveRecord::Base
29
+ translates :content, :title
30
+ end
31
+
32
+ class BugTest < Minitest::Test
33
+ def test_association_stuff
34
+ post = Post.create!(title: 'HI')
35
+
36
+ assert_equal 'HI', post.title
37
+ end
38
+ end
@@ -41,7 +41,7 @@ module Globalize
41
41
  end
42
42
 
43
43
  begin
44
- if ::ActiveRecord::VERSION::STRING > "5.0" && table_exists? && translation_class.table_exists?
44
+ if Globalize.rails_5? && table_exists? && translation_class.table_exists?
45
45
  self.ignored_columns += translated_attribute_names.map(&:to_s)
46
46
  reset_column_information
47
47
  end
@@ -52,7 +52,7 @@ module Globalize
52
52
 
53
53
  def check_columns!(attr_names)
54
54
  # If tables do not exist or Rails version is greater than 5, do not warn about conflicting columns
55
- return unless ::ActiveRecord::VERSION::STRING < "5.0" && table_exists? && translation_class.table_exists?
55
+ return unless Globalize.rails_42? && table_exists? && translation_class.table_exists?
56
56
  if (overlap = attr_names.map(&:to_s) & column_names).present?
57
57
  ActiveSupport::Deprecation.warn(
58
58
  ["You have defined one or more translated attributes with names that conflict with column(s) on the model table. ",
@@ -41,11 +41,17 @@ module Globalize
41
41
  self.dirty = {}
42
42
  end
43
43
 
44
- def _reset_attribute name
45
- original_value = record.changed_attributes[name]
46
- record.send(:clear_attribute_changes, [name])
47
- record.send("#{name}=", original_value)
48
- record.send(:clear_attribute_changes, [name])
44
+ if Globalize.rails_6?
45
+ def _reset_attribute name
46
+ record.send(:clear_attribute_changes, [name])
47
+ end
48
+ else
49
+ def _reset_attribute name
50
+ original_value = record.changed_attributes[name]
51
+ record.send(:clear_attribute_changes, [name])
52
+ record.send("#{name}=", original_value)
53
+ record.send(:clear_attribute_changes, [name])
54
+ end
49
55
  end
50
56
 
51
57
  def reset
@@ -53,6 +59,30 @@ module Globalize
53
59
  super
54
60
  end
55
61
 
62
+ def changed_attributes(locale)
63
+ Hash[changes(locale).map { |name, change| [name, change.first] }]
64
+ end
65
+
66
+ def changed
67
+ stash.keys.flat_map { |locale| changes(locale).keys }.uniq
68
+ end
69
+
70
+ def changes(locale)
71
+ stash[locale].keys.inject({}) do |hash, name|
72
+ next hash unless dirty[name].is_a?(Hash)
73
+ next hash unless dirty[name].key?(locale)
74
+
75
+ new_value = stash[locale][name]
76
+ old_value = dirty[name][locale]
77
+
78
+ unless new_value == old_value
79
+ hash[name] = [old_value, new_value]
80
+ end
81
+
82
+ hash
83
+ end
84
+ end
85
+
56
86
  end
57
87
  end
58
88
  end
@@ -3,7 +3,7 @@ module Globalize
3
3
  module ClassMethods
4
4
  delegate :translated_locales, :set_translations_table_name, :to => :translation_class
5
5
 
6
- if ::ActiveRecord::VERSION::STRING < "5.0.0"
6
+ if Globalize.rails_42?
7
7
  def columns_hash
8
8
  super.except(*translated_attribute_names.map(&:to_s))
9
9
  end
@@ -120,7 +120,7 @@ module Globalize
120
120
  end
121
121
 
122
122
  def define_translations_accessor(name)
123
- attribute(name, ::ActiveRecord::Type::Value.new) if ::ActiveRecord::VERSION::STRING >= "5.0"
123
+ attribute(name, ::ActiveRecord::Type::Value.new) if Globalize.rails_5?
124
124
  define_translations_reader(name)
125
125
  define_translations_writer(name)
126
126
  end
@@ -66,7 +66,7 @@ module Globalize
66
66
  end
67
67
 
68
68
  def _read_attribute(attr_name, options = {}, &block)
69
- translated_value = read_translated_attribute(attr_name, options, &block)
69
+ translated_value = read_translated_attribute(attr_name, options)
70
70
  translated_value.nil? ? super(attr_name, &block) : translated_value
71
71
  end
72
72
 
@@ -158,17 +158,34 @@ module Globalize
158
158
  Globalize.fallbacks(locale)
159
159
  end
160
160
 
161
- def save(*)
162
- result = Globalize.with_locale(translation.locale || I18n.default_locale) do
163
- without_fallbacks do
164
- super
161
+ if Globalize.ruby_27?
162
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
163
+ def save(...)
164
+ result = Globalize.with_locale(translation.locale || I18n.default_locale) do
165
+ without_fallbacks do
166
+ super
167
+ end
168
+ end
169
+ if result
170
+ globalize.clear_dirty
171
+ end
172
+
173
+ result
174
+ end
175
+ RUBY
176
+ else
177
+ def save(*)
178
+ result = Globalize.with_locale(translation.locale || I18n.default_locale) do
179
+ without_fallbacks do
180
+ super
181
+ end
182
+ end
183
+ if result
184
+ globalize.clear_dirty
165
185
  end
166
- end
167
- if result
168
- globalize.clear_dirty
169
- end
170
186
 
171
- result
187
+ result
188
+ end
172
189
  end
173
190
 
174
191
  def column_for_attribute name
@@ -185,6 +202,32 @@ module Globalize
185
202
  changed_attributes.present? || translations.any?(&:changed?)
186
203
  end
187
204
 
205
+ if Globalize.rails_51?
206
+ def saved_changes
207
+ super.tap do |changes|
208
+ translation = translation_for(::Globalize.locale, false)
209
+ if translation
210
+ translation_changes = translation.saved_changes.select { |name| translated?(name) }
211
+ changes.merge!(translation_changes) if translation_changes.any?
212
+ end
213
+ end
214
+ end
215
+ end
216
+
217
+ if Globalize.rails_6?
218
+ def changed_attributes
219
+ super.merge(globalize.changed_attributes(::Globalize.locale))
220
+ end
221
+
222
+ def changes
223
+ super.merge(globalize.changes(::Globalize.locale))
224
+ end
225
+
226
+ def changed
227
+ super.concat(globalize.changed).uniq
228
+ end
229
+ end
230
+
188
231
  # need to access instance variable directly since changed_attributes
189
232
  # is frozen as of Rails 4.2
190
233
  def original_changed_attributes
@@ -236,10 +279,7 @@ module Globalize
236
279
  return nil unless options[:translated]
237
280
  return nil unless translated?(name)
238
281
 
239
- value = globalize.fetch(options[:locale] || Globalize.locale, name)
240
- return nil if value.nil?
241
-
242
- block_given? ? yield(value) : value
282
+ globalize.fetch(options[:locale] || Globalize.locale, name)
243
283
  end
244
284
  end
245
285
  end
@@ -89,13 +89,27 @@ module Globalize
89
89
  end
90
90
  end
91
91
 
92
- def add_translation_fields
93
- connection.change_table(translations_table_name) do |t|
94
- fields.each do |name, options|
95
- if options.is_a? Hash
96
- t.column name, options.delete(:type), options
97
- else
98
- t.column name, options
92
+ if Globalize.rails_6?
93
+ def add_translation_fields
94
+ connection.change_table(translations_table_name) do |t|
95
+ fields.each do |name, options|
96
+ if options.is_a? Hash
97
+ t.column name, options.delete(:type), **options
98
+ else
99
+ t.column name, options
100
+ end
101
+ end
102
+ end
103
+ end
104
+ else
105
+ def add_translation_fields
106
+ connection.change_table(translations_table_name) do |t|
107
+ fields.each do |name, options|
108
+ if options.is_a? Hash
109
+ t.column name, options.delete(:type), options
110
+ else
111
+ t.column name, options
112
+ end
99
113
  end
100
114
  end
101
115
  end
@@ -155,6 +169,8 @@ module Globalize
155
169
  # Create a hash containing the translated column names and their values.
156
170
  translated_attribute_names.inject(fields_to_update={}) do |f, name|
157
171
  f.update({name.to_sym => translated_record[name.to_s]})
172
+ # Remove attributes that will no longer be translated
173
+ translated_attribute_names.delete(name)
158
174
  end
159
175
 
160
176
  # Now, update the actual model's record with the hash.
@@ -99,7 +99,7 @@ module Globalize
99
99
  end
100
100
  end
101
101
 
102
- if ::ActiveRecord::VERSION::STRING < "5.0.0"
102
+ if Globalize.rails_42?
103
103
  def where_values_hash(*args)
104
104
  return super unless respond_to?(:translations_table_name)
105
105
  equalities = respond_to?(:with_default_scope) ? with_default_scope.where_values : where_values
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Globalize
4
- Version = '6.0.0.alpha.1'
4
+ Version = '6.1.0'
5
5
  end
data/lib/globalize.rb CHANGED
@@ -6,11 +6,21 @@ require 'patches/active_record/relation'
6
6
  require 'patches/active_record/serialization'
7
7
  require 'patches/active_record/uniqueness_validator'
8
8
  require 'patches/active_record/persistence'
9
+ require 'patches/active_support/inflections'
9
10
 
10
11
  module Globalize
11
12
  autoload :ActiveRecord, 'globalize/active_record'
12
13
  autoload :Interpolation, 'globalize/interpolation'
13
14
 
15
+ ACTIVE_RECORD_50 = Gem::Version.new('5.0.0')
16
+ ACTIVE_RECORD_51 = Gem::Version.new('5.1.0')
17
+ ACTIVE_RECORD_52 = Gem::Version.new('5.2.0')
18
+ ACTIVE_RECORD_60 = Gem::Version.new('6.0.0')
19
+ ACTIVE_RECORD_61 = Gem::Version.new('6.1.0')
20
+
21
+ CURRENT_RUBY = Gem::Version.new(RUBY_VERSION)
22
+ RUBY_VERSION_27 = Gem::Version.new('2.7.0')
23
+
14
24
  class << self
15
25
  def locale
16
26
  read_locale || I18n.locale
@@ -58,12 +68,32 @@ module Globalize
58
68
  RequestStore.store
59
69
  end
60
70
 
71
+ def ruby_27?
72
+ CURRENT_RUBY >= RUBY_VERSION_27
73
+ end
74
+
75
+ def rails_42?
76
+ ::ActiveRecord.version < ACTIVE_RECORD_50
77
+ end
78
+
61
79
  def rails_5?
62
- ::ActiveRecord.version >= Gem::Version.new('5.1.0')
80
+ ::ActiveRecord.version >= ACTIVE_RECORD_50
81
+ end
82
+
83
+ def rails_51?
84
+ ::ActiveRecord.version >= ACTIVE_RECORD_51
63
85
  end
64
86
 
65
87
  def rails_52?
66
- ::ActiveRecord.version >= Gem::Version.new('5.2.0')
88
+ ::ActiveRecord.version >= ACTIVE_RECORD_52
89
+ end
90
+
91
+ def rails_6?
92
+ ::ActiveRecord.version >= ACTIVE_RECORD_60
93
+ end
94
+
95
+ def rails_61?
96
+ ::ActiveRecord.version >= ACTIVE_RECORD_61
67
97
  end
68
98
 
69
99
  protected
@@ -1,3 +1,3 @@
1
- if ::ActiveRecord::VERSION::STRING < "5.0.0"
1
+ if ::ActiveRecord.version < Gem::Version.new("5.0.0")
2
2
  require_relative 'rails4/query_method'
3
- end
3
+ end
@@ -0,0 +1,45 @@
1
+ module Globalize
2
+ module Validations
3
+ module UniquenessValidator
4
+ def validate_each(record, attribute, value)
5
+ klass = record.class
6
+ if klass.translates? && klass.translated?(attribute)
7
+ finder_class = klass.translation_class
8
+ relation = build_relation(finder_class, attribute, value).where(locale: Globalize.locale)
9
+ relation = relation.where.not(klass.reflect_on_association(:translations).foreign_key => record.send(:id)) if record.persisted?
10
+
11
+
12
+ translated_scopes = Array(options[:scope]) & klass.translated_attribute_names
13
+ untranslated_scopes = Array(options[:scope]) - translated_scopes
14
+
15
+ relation = relation.joins(:globalized_model) if untranslated_scopes.present?
16
+ untranslated_scopes.each do |scope_item|
17
+ scope_value = record.send(scope_item)
18
+ reflection = klass.reflect_on_association(scope_item)
19
+ if reflection
20
+ scope_value = record.send(reflection.foreign_key)
21
+ scope_item = reflection.foreign_key
22
+ end
23
+ relation = relation.where(find_finder_class_for(record).table_name => { scope_item => scope_value })
24
+ end
25
+
26
+ translated_scopes.each do |scope_item|
27
+ scope_value = record.send(scope_item)
28
+ relation = relation.where(scope_item => scope_value)
29
+ end
30
+ relation = relation.merge(options[:conditions]) if options[:conditions]
31
+
32
+ if relation.exists?
33
+ error_options = options.except(:case_sensitive, :scope, :conditions)
34
+ error_options[:value] = value
35
+ record.errors.add(attribute, :taken, **error_options)
36
+ end
37
+ else
38
+ super(record, attribute, value)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ ActiveRecord::Validations::UniquenessValidator.prepend Globalize::Validations::UniquenessValidator
@@ -1,12 +1,19 @@
1
- if ::ActiveRecord::VERSION::STRING >= "5.0.0"
1
+ if ::ActiveRecord.version >= Gem::Version.new("5.0.0")
2
2
  module Globalize
3
3
  module Relation
4
4
  def where_values_hash(relation_table_name = table_name)
5
5
  return super unless respond_to?(:translations_table_name)
6
6
  super.merge(super(translations_table_name))
7
7
  end
8
+
9
+ if ::ActiveRecord.version >= Gem::Version.new("6.1.3")
10
+ def scope_for_create
11
+ return super unless respond_to?(:translations_table_name)
12
+ super.merge(where_values_hash(translations_table_name))
13
+ end
14
+ end
8
15
  end
9
16
  end
10
17
 
11
18
  ActiveRecord::Relation.prepend Globalize::Relation
12
- end
19
+ end
@@ -1,5 +1,5 @@
1
- if ::ActiveRecord::VERSION::STRING < "5.1.0"
1
+ if ::ActiveRecord.version < Gem::Version.new("5.1.0")
2
2
  require_relative 'rails4/serialization'
3
3
  else
4
4
  require_relative 'rails5_1/serialization'
5
- end
5
+ end
@@ -1,7 +1,9 @@
1
- if ::ActiveRecord::VERSION::STRING < "5.0.0"
1
+ if ::ActiveRecord.version < Gem::Version.new("5.0.0")
2
2
  require_relative 'rails4/uniqueness_validator'
3
- elsif ::ActiveRecord::VERSION::STRING < "5.1.0"
3
+ elsif ::ActiveRecord.version < Gem::Version.new("5.1.0")
4
4
  require_relative 'rails5/uniqueness_validator'
5
- else
5
+ elsif ::ActiveRecord.version < Gem::Version.new("6.1.0")
6
6
  require_relative 'rails5_1/uniqueness_validator'
7
- end
7
+ else
8
+ require_relative 'rails6_1/uniqueness_validator'
9
+ end
@@ -0,0 +1,14 @@
1
+ if ::ActiveSupport.version >= Gem::Version.new("7.0.0")
2
+ module Globalize
3
+ module Inflections
4
+ def instance_or_fallback(locale)
5
+ I18n.respond_to?(:fallbacks) && I18n.fallbacks[locale].each do |k|
6
+ return @__instance__[k] if @__instance__.key?(k)
7
+ end
8
+ instance(locale)
9
+ end
10
+ end
11
+ end
12
+
13
+ ActiveSupport::Inflector::Inflections.singleton_class.send :prepend, Globalize::Inflections
14
+ end
data.tar.gz.sig ADDED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: globalize
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0.alpha.1
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sven Fuchs
@@ -11,10 +11,36 @@ authors:
11
11
  - Tomasz Stachewicz
12
12
  - Philip Arndt
13
13
  - Chris Salzberg
14
- autorequire:
14
+ autorequire:
15
15
  bindir: bin
16
- cert_chain: []
17
- date: 2020-04-19 00:00:00.000000000 Z
16
+ cert_chain:
17
+ - |
18
+ -----BEGIN CERTIFICATE-----
19
+ MIIEMjCCApqgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhnZW1z
20
+ L0RDPXAvREM9YXJuZHQvREM9aW8wHhcNMjEwNjIzMDkyNzU2WhcNMjIwNjIzMDky
21
+ NzU2WjAjMSEwHwYDVQQDDBhnZW1zL0RDPXAvREM9YXJuZHQvREM9aW8wggGiMA0G
22
+ CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQD0CYnD37uLlJ3Urla2EnnUQ8S6s16k
23
+ AGMpAzpmARo8YwSqtYMJVGyBzUeI7y93Fk9ncswhIFSH/hnh/Ouat/ki9flHlZ+w
24
+ anv0M+9v3wCLyZSC5BQIWpoduFM/fuvLoDUJDWxL50RjwMS0qo2x2LvfQdHN8gn3
25
+ JdSIV5WLJKIvlmIl9S3pw0JO5KRUGn1PcBO7C0S0SlbhVjRHtlao1ycWUULsX109
26
+ hCh39MPGtnZpdCcxheh0TH/UA/jV0/du9/rQdoidkNHkaC24pPfBJ3nS+rAbWaHP
27
+ WmP+0rjfk/XnGBu/HZpKvlnwQjP3QdK4UMtWl8zewqFMNcIiBRALQugnL/SfrP/4
28
+ CSlha9LwkiE6ByeY4WGnNjNqpi5J3IzjEkZRAxG7u9gCB3FzTaBTyXZYI6jplYNw
29
+ TcCJIBHuoPaa+m9brpjb3Uv94nfM97ZP+OmpGYCCAMq4TT7OOV+t8wJc0w8bb0FO
30
+ ROhmVNTxrBaNcl6MkZn88EMRCsGgoWklOG0CAwEAAaNxMG8wCQYDVR0TBAIwADAL
31
+ BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGu7pbmeILyHnBmannuaNRfdN8MsMBoGA1Ud
32
+ EQQTMBGBD2dlbXNAcC5hcm5kdC5pbzAaBgNVHRIEEzARgQ9nZW1zQHAuYXJuZHQu
33
+ aW8wDQYJKoZIhvcNAQELBQADggGBANlxc4uAnkPC3zbztG7uZfBfn4HSuvv655Pa
34
+ UaYZ6hNETFrqg78mGs3PkFe2Ru7cVWwckbmH46aq50QoNnx4ClxT03vr03n76Jg1
35
+ 8WWHkf0+rcINFlbtIFcmcFrois5Ow3n7pH+xstDtzoWcbh41WwuZStNhrIYsnjAK
36
+ /ovz8D5JlboxceOpVLB/0NiqNEWltK+EMQHmX25Sqf/r5o5rAL9zwEKPFp1Y5X+z
37
+ t2jBjYt2ymr1eMWxux6e+N2uKZL4MblHawxvKlI8UHsIiV9xrc4BwlwlbitcvNIL
38
+ ZykdSlpTJd0Guy92iYjCJMC09tMRUNxiVBwD3jRGSeW9YAPIZGXIcVlm6srIRDjJ
39
+ o8wB6oOvHAkRXnntOo/4bBDH+ehmgvhh/O/mI+au6C0M430fv+ooH0w08LEXLx1k
40
+ e17ZNASZffbQRP09MH2GZ2AOlkildTX6looWRforZEZi+qamognrozd3MI5QHi1W
41
+ UAZUzHLrrFu7gnkFvLVpxOUf4ItOkA==
42
+ -----END CERTIFICATE-----
43
+ date: 2022-02-25 00:00:00.000000000 Z
18
44
  dependencies:
19
45
  - !ruby/object:Gem::Dependency
20
46
  name: activerecord
@@ -25,7 +51,7 @@ dependencies:
25
51
  version: '4.2'
26
52
  - - "<"
27
53
  - !ruby/object:Gem::Version
28
- version: '7.0'
54
+ version: '7.1'
29
55
  type: :runtime
30
56
  prerelease: false
31
57
  version_requirements: !ruby/object:Gem::Requirement
@@ -35,7 +61,7 @@ dependencies:
35
61
  version: '4.2'
36
62
  - - "<"
37
63
  - !ruby/object:Gem::Version
38
- version: '7.0'
64
+ version: '7.1'
39
65
  - !ruby/object:Gem::Dependency
40
66
  name: activemodel
41
67
  requirement: !ruby/object:Gem::Requirement
@@ -45,7 +71,7 @@ dependencies:
45
71
  version: '4.2'
46
72
  - - "<"
47
73
  - !ruby/object:Gem::Version
48
- version: '7.0'
74
+ version: '7.1'
49
75
  type: :runtime
50
76
  prerelease: false
51
77
  version_requirements: !ruby/object:Gem::Requirement
@@ -55,7 +81,7 @@ dependencies:
55
81
  version: '4.2'
56
82
  - - "<"
57
83
  - !ruby/object:Gem::Version
58
- version: '7.0'
84
+ version: '7.1'
59
85
  - !ruby/object:Gem::Dependency
60
86
  name: request_store
61
87
  requirement: !ruby/object:Gem::Requirement
@@ -196,6 +222,9 @@ files:
196
222
  - LICENSE
197
223
  - README.md
198
224
  - Rakefile
225
+ - docker-compose.yml
226
+ - globalize.gemspec
227
+ - issue_template.rb
199
228
  - lib/globalize.rb
200
229
  - lib/globalize/active_record.rb
201
230
  - lib/globalize/active_record/act_macro.rb
@@ -220,15 +249,17 @@ files:
220
249
  - lib/patches/active_record/rails5/uniqueness_validator.rb
221
250
  - lib/patches/active_record/rails5_1/serialization.rb
222
251
  - lib/patches/active_record/rails5_1/uniqueness_validator.rb
252
+ - lib/patches/active_record/rails6_1/uniqueness_validator.rb
223
253
  - lib/patches/active_record/relation.rb
224
254
  - lib/patches/active_record/serialization.rb
225
255
  - lib/patches/active_record/uniqueness_validator.rb
226
256
  - lib/patches/active_record/xml_attribute_serializer.rb
257
+ - lib/patches/active_support/inflections.rb
227
258
  homepage: http://github.com/globalize/globalize
228
259
  licenses:
229
260
  - MIT
230
261
  metadata: {}
231
- post_install_message:
262
+ post_install_message:
232
263
  rdoc_options: []
233
264
  require_paths:
234
265
  - lib
@@ -239,12 +270,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
239
270
  version: 2.4.6
240
271
  required_rubygems_version: !ruby/object:Gem::Requirement
241
272
  requirements:
242
- - - ">"
273
+ - - ">="
243
274
  - !ruby/object:Gem::Version
244
- version: 1.3.1
275
+ version: '0'
245
276
  requirements: []
246
- rubygems_version: 3.0.3
247
- signing_key:
277
+ rubygems_version: 3.2.32
278
+ signing_key:
248
279
  specification_version: 4
249
280
  summary: Rails I18n de-facto standard library for ActiveRecord model/data translation
250
281
  test_files: []
metadata.gz.sig ADDED
Binary file