efficient_translations 0.0.1 → 0.0.2
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/Gemfile.lock +1 -1
- data/lib/efficient_translations/schema.rb +2 -2
- data/lib/efficient_translations/translates_method.rb +30 -29
- data/lib/efficient_translations/translation_factory.rb +8 -10
- data/lib/efficient_translations/version.rb +1 -1
- data/spec/lib/efficient_translations/translation_factory_spec.rb +10 -10
- metadata +14 -14
data/Gemfile.lock
CHANGED
@@ -8,10 +8,10 @@ module EfficientTranslations
|
|
8
8
|
# the column name to create and its type.
|
9
9
|
# eg. create_translation_table :product, :name => :string, :description => :string
|
10
10
|
def create_translation_table model_name, translation_fields
|
11
|
-
translation_table_name = "#{model_name
|
11
|
+
translation_table_name = "#{model_name}_translations"
|
12
12
|
create_table translation_table_name do |t|
|
13
13
|
t.references model_name, :null => false
|
14
|
-
t.string :locale
|
14
|
+
t.string :locale, :null => false
|
15
15
|
end
|
16
16
|
translation_fields.each do |name, type|
|
17
17
|
add_column translation_table_name, name.to_s, type.to_sym
|
@@ -7,7 +7,9 @@ module EfficientTranslations
|
|
7
7
|
module ClassMethods
|
8
8
|
def translates *field_names
|
9
9
|
make_efficient_translatable! unless defined?(translation_model)
|
10
|
-
field_names.each
|
10
|
+
field_names.each do |field|
|
11
|
+
define_translation_accessors field
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
15
|
def validates_presence_of_default_locale
|
@@ -18,28 +20,28 @@ module EfficientTranslations
|
|
18
20
|
|
19
21
|
def make_efficient_translatable!
|
20
22
|
cattr_accessor :translation_model
|
21
|
-
self.translation_model = TranslationFactory
|
22
|
-
|
23
|
+
self.translation_model = TranslationFactory.build self
|
23
24
|
has_many :translations, :class_name => translation_model.name, :dependent => :destroy
|
24
25
|
accepts_nested_attributes_for :translations
|
26
|
+
after_save :update_translations!
|
25
27
|
|
26
28
|
named_scope :with_translations, :include => :translations
|
27
29
|
named_scope :with_current_translation, lambda {
|
28
30
|
{
|
29
31
|
:include => :translations,
|
30
|
-
:conditions => [
|
32
|
+
:conditions => [scope_conditions, I18n.locale.to_s, I18n.default_locale.to_s]
|
31
33
|
}
|
32
34
|
}
|
33
35
|
named_scope :with_translation_for, lambda { |locale|
|
34
36
|
{
|
35
37
|
:inlude => :translations,
|
36
|
-
:conditions => [
|
38
|
+
:conditions => [scope_conditions, locale.to_s, I18n.default_locale.to_s]
|
37
39
|
}
|
38
40
|
}
|
41
|
+
end
|
39
42
|
|
40
|
-
|
41
|
-
|
42
|
-
self.send :include, InstanceMethods
|
43
|
+
def self.scope_conditions
|
44
|
+
"#{translation_model.table_name}.locale = ? OR #{translation_model.table_name}.locale = ?"
|
43
45
|
end
|
44
46
|
|
45
47
|
def define_translation_accessors field
|
@@ -89,33 +91,32 @@ module EfficientTranslations
|
|
89
91
|
end
|
90
92
|
end
|
91
93
|
|
92
|
-
module
|
94
|
+
# instance methods - no need to put them a module
|
95
|
+
private
|
93
96
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
@efficient_translations_attributes ||= Hash.new { |hash, key| hash[key] = {} }
|
99
|
-
end
|
97
|
+
# attributes are stored in @efficient_attributes instance variable via setter
|
98
|
+
def efficient_translations_attributes
|
99
|
+
@efficient_translations_attributes ||= Hash.new { |hash, key| hash[key] = {} }
|
100
|
+
end
|
100
101
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
110
|
-
translation.update_attributes! attributes
|
102
|
+
def update_translations!
|
103
|
+
if efficient_translations_attributes.present?
|
104
|
+
translations true # force reload all translations
|
105
|
+
efficient_translations_attributes.each do |locale, attributes|
|
106
|
+
translation = translations.detect { |t| t.locale.to_sym == locale } || begin
|
107
|
+
args = { :locale => locale }
|
108
|
+
args[self.class.translation_model.translatable_relation_field] = self
|
109
|
+
self.class.translation_model.new args
|
111
110
|
end
|
111
|
+
translation.update_attributes! attributes
|
112
112
|
end
|
113
113
|
end
|
114
|
+
end
|
114
115
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
116
|
+
def default_locale_required
|
117
|
+
unless translations.detect { |t| t.locale.to_sym == I18n.default_locale }
|
118
|
+
# people may expect this message to be localized too ;-)
|
119
|
+
errors.add :translations, "for #{I18n.default_locale} is missing"
|
119
120
|
end
|
120
121
|
end
|
121
122
|
end
|
@@ -1,26 +1,24 @@
|
|
1
1
|
module EfficientTranslations
|
2
2
|
module TranslationFactory
|
3
|
-
def self.
|
4
|
-
if base_model.const_defined?
|
5
|
-
base_model.const_get
|
3
|
+
def self.build base_model
|
4
|
+
if base_model.const_defined? :Translation
|
5
|
+
base_model.const_get :Translation
|
6
6
|
else
|
7
|
-
klass = base_model.const_set
|
8
|
-
klass.
|
7
|
+
klass = base_model.const_set :Translation, Class.new(ActiveRecord::Base)
|
8
|
+
klass.class_eval do
|
9
|
+
table_name = "#{base_model.table_name.singularize}_translations"
|
9
10
|
cattr_accessor :translatable_model, :translatable_relation_field
|
10
11
|
self.translatable_model = base_model
|
11
12
|
self.translatable_relation_field = base_model.name.underscore.gsub '/', '_'
|
12
13
|
|
13
|
-
table_name = "#{base_model.table_name.singularize}_translations"
|
14
14
|
belongs_to translatable_relation_field
|
15
|
+
before_save :stringify_locale!
|
15
16
|
|
16
17
|
named_scope :for_locale, lambda { |locale|
|
17
18
|
{ :conditions => ['locale = ? OR locale = ?', locale.to_s, I18n.locale.to_s] }
|
18
19
|
}
|
19
20
|
|
20
|
-
|
21
|
-
end
|
22
|
-
klass.class_eval do
|
23
|
-
def stringify_locale!
|
21
|
+
define_method :stringify_locale! do
|
24
22
|
self.locale = locale.to_s
|
25
23
|
end
|
26
24
|
end
|
@@ -7,7 +7,7 @@ describe EfficientTranslations::TranslationFactory do
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
-
describe '::
|
10
|
+
describe '::build' do
|
11
11
|
context 'when no translation model is found' do
|
12
12
|
before do
|
13
13
|
@klass = Class.new(ActiveRecord::Base)
|
@@ -16,43 +16,43 @@ describe EfficientTranslations::TranslationFactory do
|
|
16
16
|
|
17
17
|
it 'should create a new ::Translation class' do
|
18
18
|
@model_class.should_receive(:const_set).with(:Translation, kind_of(Class)) { |name, klass| klass }
|
19
|
-
EfficientTranslations::TranslationFactory::
|
19
|
+
EfficientTranslations::TranslationFactory::build @model_class
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'should define a belongs_to association to the main model' do
|
23
23
|
@klass.should_receive(:belongs_to)
|
24
|
-
EfficientTranslations::TranslationFactory::
|
24
|
+
EfficientTranslations::TranslationFactory::build @model_class
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'should assign the translatable model in an accessor' do
|
28
|
-
translation = EfficientTranslations::TranslationFactory::
|
28
|
+
translation = EfficientTranslations::TranslationFactory::build @model_class
|
29
29
|
translation.translatable_model.should == @model_class
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'should assign the translatable model field in an accessor' do
|
33
|
-
translation = EfficientTranslations::TranslationFactory::
|
33
|
+
translation = EfficientTranslations::TranslationFactory::build @model_class
|
34
34
|
translation.translatable_relation_field.should == @model_class.name.underscore.gsub('/','_')
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'should return the created translation class' do
|
38
38
|
klass = Class.new(ActiveRecord::Base)
|
39
39
|
@model_class.stub :const_set => klass
|
40
|
-
EfficientTranslations::TranslationFactory::
|
40
|
+
EfficientTranslations::TranslationFactory::build(@model_class).should == klass
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
context 'when a translation model is found' do
|
45
45
|
it 'should not create a ::Translation class' do
|
46
|
-
EfficientTranslations::TranslationFactory::
|
46
|
+
EfficientTranslations::TranslationFactory::build @model_class
|
47
47
|
@model_class.should_not_receive(:const_set)
|
48
|
-
EfficientTranslations::TranslationFactory::
|
48
|
+
EfficientTranslations::TranslationFactory::build @model_class
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'should return the already defined translation class' do
|
52
52
|
klass = Class.new(ActiveRecord::Base)
|
53
53
|
@model_class.stub :const_set => klass
|
54
|
-
EfficientTranslations::TranslationFactory::
|
55
|
-
EfficientTranslations::TranslationFactory::
|
54
|
+
EfficientTranslations::TranslationFactory::build @model_class
|
55
|
+
EfficientTranslations::TranslationFactory::build(@model_class).should == klass
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: efficient_translations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-14 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: &
|
16
|
+
requirement: &70304938783780 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70304938783780
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70304938782640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70304938782640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &70304938781980 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70304938781980
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: activerecord
|
49
|
-
requirement: &
|
49
|
+
requirement: &70304938780640 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '2.3'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70304938780640
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: activesupport
|
60
|
-
requirement: &
|
60
|
+
requirement: &70304938779720 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '2.3'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70304938779720
|
69
69
|
description: Translation library for ActiveRecord models in Rails 2
|
70
70
|
email:
|
71
71
|
- nicola@nicolaracco.com
|
@@ -105,7 +105,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
105
|
version: '0'
|
106
106
|
segments:
|
107
107
|
- 0
|
108
|
-
hash:
|
108
|
+
hash: 2503706901101072046
|
109
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
110
|
none: false
|
111
111
|
requirements:
|
@@ -114,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
114
|
version: '0'
|
115
115
|
segments:
|
116
116
|
- 0
|
117
|
-
hash:
|
117
|
+
hash: 2503706901101072046
|
118
118
|
requirements: []
|
119
119
|
rubyforge_project:
|
120
120
|
rubygems_version: 1.8.10
|