hstore_translate 0.0.8 → 0.0.9
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.
- data/lib/hstore_translate/translates.rb +13 -2
- data/lib/hstore_translate/version.rb +1 -1
- data/lib/hstore_translate.rb +3 -3
- data/test/database.yml +6 -0
- data/test/gemfiles/Gemfile.rails-3.1.x +4 -0
- data/test/gemfiles/Gemfile.rails-3.2.x +4 -0
- data/test/gemfiles/Gemfile.rails-4.0.x +4 -0
- data/test/test_helper.rb +69 -0
- data/test/translates_test.rb +115 -0
- metadata +55 -14
- data/Gemfile +0 -8
- data/Gemfile.lock +0 -49
- data/Rakefile +0 -12
@@ -35,12 +35,23 @@ module HstoreTranslate
|
|
35
35
|
|
36
36
|
protected
|
37
37
|
|
38
|
+
def hstore_translate_fallback_locales(locale)
|
39
|
+
return if !!@disable_fallback || !I18n.respond_to?(:fallbacks)
|
40
|
+
I18n.fallbacks[locale]
|
41
|
+
end
|
42
|
+
|
38
43
|
def read_hstore_translation(attr_name, locale = I18n.locale)
|
39
44
|
translations = send("#{attr_name}_translations") || {}
|
40
45
|
translation = translations[locale.to_s]
|
41
46
|
|
42
|
-
if
|
43
|
-
|
47
|
+
if fallback_locales = hstore_translate_fallback_locales(locale)
|
48
|
+
fallback_locales.each do |fallback_locale|
|
49
|
+
t = translations[fallback_locale.to_s]
|
50
|
+
if t && !t.empty? # differs from blank?
|
51
|
+
translation = t
|
52
|
+
break
|
53
|
+
end
|
54
|
+
end
|
44
55
|
end
|
45
56
|
|
46
57
|
translation
|
data/lib/hstore_translate.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require 'active_record'
|
2
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
3
|
+
require 'hstore_translate/translates'
|
4
4
|
|
5
5
|
module HstoreTranslate
|
6
6
|
def self.native_hstore?
|
data/test/database.yml
ADDED
data/test/test_helper.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'hstore_translate'
|
3
|
+
|
4
|
+
require 'database_cleaner'
|
5
|
+
DatabaseCleaner.strategy = :transaction
|
6
|
+
|
7
|
+
class Post < ActiveRecord::Base
|
8
|
+
translates :title
|
9
|
+
end
|
10
|
+
|
11
|
+
class HstoreTranslate::Test < MiniTest::Unit::TestCase
|
12
|
+
class << self
|
13
|
+
def prepare_database
|
14
|
+
create_database
|
15
|
+
create_table
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def db_config
|
21
|
+
@db_config ||= begin
|
22
|
+
filepath = File.join('test', 'database.yml')
|
23
|
+
YAML.load_file(filepath)['test']
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def establish_connection(config)
|
28
|
+
ActiveRecord::Base.establish_connection(config)
|
29
|
+
ActiveRecord::Base.connection
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_database
|
33
|
+
system_config = db_config.merge('database' => 'postgres', 'schema_search_path' => 'public')
|
34
|
+
connection = establish_connection(system_config)
|
35
|
+
connection.create_database(db_config['database']) rescue nil
|
36
|
+
enable_extension
|
37
|
+
end
|
38
|
+
|
39
|
+
def enable_extension
|
40
|
+
connection = establish_connection(db_config)
|
41
|
+
unless connection.select_value("SELECT proname FROM pg_proc WHERE proname = 'akeys'")
|
42
|
+
if connection.send(:postgresql_version) < 90100
|
43
|
+
pg_sharedir = `pg_config --sharedir`.strip
|
44
|
+
hstore_script_path = File.join(pg_sharedir, 'contrib', 'hstore.sql')
|
45
|
+
connection.execute(File.read(hstore_script_path))
|
46
|
+
else
|
47
|
+
connection.execute('CREATE EXTENSION IF NOT EXISTS hstore')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def create_table
|
53
|
+
connection = establish_connection(db_config)
|
54
|
+
connection.create_table(:posts, :force => true) do |t|
|
55
|
+
t.column :title_translations, 'hstore'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
prepare_database
|
61
|
+
|
62
|
+
def setup
|
63
|
+
DatabaseCleaner.start
|
64
|
+
end
|
65
|
+
|
66
|
+
def teardown
|
67
|
+
DatabaseCleaner.clean
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class TranslatesTest < HstoreTranslate::Test
|
5
|
+
def test_assigns_in_current_locale
|
6
|
+
I18n.with_locale(:en) do
|
7
|
+
p = Post.new(:title => "English Title")
|
8
|
+
assert_equal("English Title", p.title_translations['en'])
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_retrieves_in_current_locale
|
13
|
+
p = Post.new(:title_translations => { "en" => "English Title", "fr" => "Titre français" })
|
14
|
+
I18n.with_locale(:fr) do
|
15
|
+
assert_equal("Titre français", p.title)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_retrieves_in_current_locale_with_fallbacks
|
20
|
+
I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
|
21
|
+
I18n.default_locale = :"en-US"
|
22
|
+
|
23
|
+
p = Post.new(:title_translations => {"en" => "English Title"})
|
24
|
+
I18n.with_locale(:fr) do
|
25
|
+
assert_equal("English Title", p.title)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_assigns_in_specified_locale
|
30
|
+
I18n.with_locale(:en) do
|
31
|
+
p = Post.new(:title_translations => { "en" => "English Title" })
|
32
|
+
p.title_fr = "Titre français"
|
33
|
+
assert_equal("Titre français", p.title_translations["fr"])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_persists_changes_in_specified_locale
|
38
|
+
I18n.with_locale(:en) do
|
39
|
+
p = Post.create!(:title_translations => { "en" => "Original Text" })
|
40
|
+
p.title_en = "Updated Text"
|
41
|
+
p.save!
|
42
|
+
assert_equal("Updated Text", Post.last.title_en)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_retrieves_in_specified_locale
|
47
|
+
I18n.with_locale(:en) do
|
48
|
+
p = Post.new(:title_translations => { "en" => "English Title", "fr" => "Titre français" })
|
49
|
+
assert_equal("Titre français", p.title_fr)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_retrieves_in_specified_locale_with_fallbacks
|
54
|
+
I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
|
55
|
+
I18n.default_locale = :"en-US"
|
56
|
+
|
57
|
+
p = Post.new(:title_translations => { "en" => "English Title" })
|
58
|
+
I18n.with_locale(:fr) do
|
59
|
+
assert_equal("English Title", p.title_fr)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_fallback_from_empty_string
|
64
|
+
I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
|
65
|
+
I18n.default_locale = :"en-US"
|
66
|
+
|
67
|
+
p = Post.new(:title_translations => { "en" => "English Title", "fr" => "" })
|
68
|
+
I18n.with_locale(:fr) do
|
69
|
+
assert_equal("English Title", p.title_fr)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_retrieves_in_specified_locale_with_fallback_disabled
|
74
|
+
I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
|
75
|
+
I18n.default_locale = :"en-US"
|
76
|
+
|
77
|
+
p = Post.new(:title_translations => { "en" => "English Title" })
|
78
|
+
p.disable_fallback
|
79
|
+
I18n.with_locale(:fr) do
|
80
|
+
assert_equal(nil, p.title_fr)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_retrieves_in_specified_locale_with_fallback_reenabled
|
85
|
+
I18n::Backend::Simple.include(I18n::Backend::Fallbacks)
|
86
|
+
I18n.default_locale = :"en-US"
|
87
|
+
|
88
|
+
p = Post.new(:title_translations => { "en" => "English Title" })
|
89
|
+
p.disable_fallback
|
90
|
+
p.enable_fallback
|
91
|
+
I18n.with_locale(:fr) do
|
92
|
+
assert_equal("English Title", p.title_fr)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_method_missing_delegates
|
97
|
+
assert_raises(NoMethodError) { Post.new.nonexistant_method }
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_method_missing_delegates_non_translated_attributes
|
101
|
+
assert_raises(NoMethodError) { Post.new.other_fr }
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_persists_translations_assigned_as_hash
|
105
|
+
p = Post.create!(:title_translations => { "en" => "English Title", "fr" => "Titre français" })
|
106
|
+
p.reload
|
107
|
+
assert_equal({"en" => "English Title", "fr" => "Titre français"}, p.title_translations)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_persists_translations_assigned_to_localized_accessors
|
111
|
+
p = Post.create!(:title_en => "English Title", :title_fr => "Titre français")
|
112
|
+
p.reload
|
113
|
+
assert_equal({"en" => "English Title", "fr" => "Titre français"}, p.title_translations)
|
114
|
+
end
|
115
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hstore_translate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,16 +9,16 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: pg
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,15 +26,15 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: '0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
31
|
+
name: activerecord
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
35
|
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
37
|
+
version: 3.1.0
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
45
|
+
version: 3.1.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: activerecord-postgres-hstore
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -75,6 +75,38 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: minitest
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '4.0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '4.0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: database_cleaner
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
78
110
|
description: Rails I18n library for ActiveRecord model/data translation using PostgreSQL's
|
79
111
|
hstore datatype. Translations are stored directly in the model table rather than
|
80
112
|
shadow tables.
|
@@ -86,11 +118,14 @@ files:
|
|
86
118
|
- lib/hstore_translate/translates.rb
|
87
119
|
- lib/hstore_translate/version.rb
|
88
120
|
- lib/hstore_translate.rb
|
89
|
-
- Gemfile
|
90
|
-
- Gemfile.lock
|
91
|
-
- MIT-LICENSE
|
92
|
-
- Rakefile
|
93
121
|
- README.md
|
122
|
+
- MIT-LICENSE
|
123
|
+
- test/database.yml
|
124
|
+
- test/gemfiles/Gemfile.rails-3.1.x
|
125
|
+
- test/gemfiles/Gemfile.rails-3.2.x
|
126
|
+
- test/gemfiles/Gemfile.rails-4.0.x
|
127
|
+
- test/test_helper.rb
|
128
|
+
- test/translates_test.rb
|
94
129
|
homepage: https://github.com/robworley/hstore_translate
|
95
130
|
licenses: []
|
96
131
|
post_install_message:
|
@@ -110,11 +145,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
145
|
- !ruby/object:Gem::Version
|
111
146
|
version: '0'
|
112
147
|
requirements: []
|
113
|
-
rubyforge_project:
|
148
|
+
rubyforge_project:
|
114
149
|
rubygems_version: 1.8.24
|
115
150
|
signing_key:
|
116
151
|
specification_version: 3
|
117
152
|
summary: Rails I18n library for ActiveRecord model/data translation using PostgreSQL's
|
118
153
|
hstore datatype.
|
119
|
-
test_files:
|
154
|
+
test_files:
|
155
|
+
- test/database.yml
|
156
|
+
- test/gemfiles/Gemfile.rails-3.1.x
|
157
|
+
- test/gemfiles/Gemfile.rails-3.2.x
|
158
|
+
- test/gemfiles/Gemfile.rails-4.0.x
|
159
|
+
- test/test_helper.rb
|
160
|
+
- test/translates_test.rb
|
120
161
|
has_rdoc:
|
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
hstore_translate (0.0.8)
|
5
|
-
activerecord (= 4.0.0.rc2)
|
6
|
-
activerecord-postgres-hstore (~> 0.7.0)
|
7
|
-
pg
|
8
|
-
|
9
|
-
GEM
|
10
|
-
remote: http://rubygems.org/
|
11
|
-
specs:
|
12
|
-
activemodel (4.0.0.rc2)
|
13
|
-
activesupport (= 4.0.0.rc2)
|
14
|
-
builder (~> 3.1.0)
|
15
|
-
activerecord (4.0.0.rc2)
|
16
|
-
activemodel (= 4.0.0.rc2)
|
17
|
-
activerecord-deprecated_finders (~> 1.0.2)
|
18
|
-
activesupport (= 4.0.0.rc2)
|
19
|
-
arel (~> 4.0.0)
|
20
|
-
activerecord-deprecated_finders (1.0.2)
|
21
|
-
activerecord-postgres-hstore (0.7.6)
|
22
|
-
activerecord (>= 3.1)
|
23
|
-
pg-hstore (>= 1.1.5)
|
24
|
-
rake
|
25
|
-
activesupport (4.0.0.rc2)
|
26
|
-
i18n (~> 0.6, >= 0.6.4)
|
27
|
-
minitest (~> 4.2)
|
28
|
-
multi_json (~> 1.3)
|
29
|
-
thread_safe (~> 0.1)
|
30
|
-
tzinfo (~> 0.3.37)
|
31
|
-
arel (4.0.0)
|
32
|
-
atomic (1.1.9)
|
33
|
-
builder (3.1.4)
|
34
|
-
i18n (0.6.4)
|
35
|
-
minitest (4.7.4)
|
36
|
-
multi_json (1.7.6)
|
37
|
-
pg (0.15.1)
|
38
|
-
pg-hstore (1.1.7)
|
39
|
-
rake (10.0.3)
|
40
|
-
thread_safe (0.1.0)
|
41
|
-
atomic
|
42
|
-
tzinfo (0.3.37)
|
43
|
-
|
44
|
-
PLATFORMS
|
45
|
-
ruby
|
46
|
-
|
47
|
-
DEPENDENCIES
|
48
|
-
hstore_translate!
|
49
|
-
rake
|
data/Rakefile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
|
4
|
-
desc 'Default: run unit tests.'
|
5
|
-
task :default => :test
|
6
|
-
|
7
|
-
desc 'Test the ltree_hierarchy plugin.'
|
8
|
-
Rake::TestTask.new(:test) do |t|
|
9
|
-
t.libs << 'lib'
|
10
|
-
t.pattern = 'test/**/*_test.rb'
|
11
|
-
t.verbose = true
|
12
|
-
end
|