easy_translatable 0.1.6 → 0.1.7

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
  SHA1:
3
- metadata.gz: 4bf467e734ff69ca81e47edf7fcbb917b59e84a8
4
- data.tar.gz: 76bc1946777bc451dce2f741e519ea9ef338266d
3
+ metadata.gz: 92e6ca6a6f1919678d40513de824e5f10866940d
4
+ data.tar.gz: 20b38ee4b7dada0802f53fab8077ebc1079e60fc
5
5
  SHA512:
6
- metadata.gz: f5c47b00241ee66bf92180d7811fadab41dcf66bf58d117b109a2e6a918488f47c7d7b0fcccba0f1eddc9eae7f3907af518d0ae0cb686bbea70405f6ad27d73c
7
- data.tar.gz: 54cb446e8f2ea1a018014bec4db87b377874e3fb2f64577efb491e14e2924bd714d5d12aa21cb6cdde95e8b2e3c581df41dac431c52456312a30342d167c755f
6
+ metadata.gz: 901ae4e1c1cfd1aa47b14e544f785e4dc595777e2aaf4aba0ecf871584cb7756071867bc08428bda2f6200ab137faa4208a7e42a842f3ca0d08203d16116a6fb
7
+ data.tar.gz: f779b1fc88db5887f82ad102429f5c50279f368826776fa4a4262a62d35a7d774fd31bf0fce64fd6ebdd4511fe5e7cce9c71442d69969f7f0b8e604b3830fea2
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- # Translatable [![Gem Version](https://badge.fury.io/rb/easy_translatable.png)](http://badge.fury.io/rb/easy_translatable) [![Code Climate](https://codeclimate.com/github/popox/translatable.png)](https://codeclimate.com/github/popox/translatable)
2
-
1
+ # Translatable [![Gem Version](https://badge.fury.io/rb/easy_translatable.png)](http://badge.fury.io/rb/easy_translatable) [![Code Climate](https://codeclimate.com/github/popox/translatable.png)](https://codeclimate.com/github/popox/translatable) [![Build Status](https://travis-ci.org/popox/translatable.png)](https://travis-ci.org/popox/translatable) [![Coverage Status](https://coveralls.io/repos/popox/translatable/badge.png)](https://coveralls.io/r/popox/translatable)
3
2
  ## Requirements
4
3
 
5
4
  * ActiveRecord 3.2
@@ -31,6 +31,25 @@ module Translatable
31
31
  stash.write(locale, name, value)
32
32
  end
33
33
 
34
+ def save_translations!
35
+ stash.reject {|locale, attrs| attrs.empty?}.each do |locale, attrs|
36
+ translations = record.translations_by_locale[locale]
37
+ attrs.each { |name, value|
38
+ translation = translations && translations[name] ||
39
+ record.translations.build(:locale => locale.to_s, :scope => record.class.table_name, :key => name)
40
+ translation['record_id'] = record.id
41
+ translation['value'] = value
42
+ translation.save!
43
+ }
44
+ end
45
+
46
+ reset
47
+ end
48
+
49
+ def reset
50
+ stash.clear
51
+ end
52
+
34
53
  protected
35
54
 
36
55
  def fetch_attribute(locale, name, value = nil)
@@ -8,50 +8,85 @@ module Translatable
8
8
  end
9
9
 
10
10
  def self.included(base)
11
- # only Rails > 3.1.x compatibility
12
- base.class_eval %{
13
- def attributes=(attributes, *args)
14
- with_given_locale(attributes) { super }
11
+ # Maintian Rails 3.0.x compatibility ..
12
+ if base.method_defined?(:assign_attributes)
13
+ base.class_eval %{
14
+ def assign_attributes(attributes, options = {})
15
+ with_given_locale(attributes) { super }
16
+ end
17
+ }
18
+ else
19
+ base.class_eval %{
20
+ def attributes=(attributes, *args)
21
+ with_given_locale(attributes) { super }
22
+ end
23
+
24
+ def update_attributes!(attributes, *args)
25
+ with_given_locale(attributes) { super }
26
+ end
27
+
28
+ def update_attributes(attributes, *args)
29
+ with_given_locale(attributes) { super }
30
+ end
31
+ }
32
+ end
33
+ end
34
+
35
+
36
+ def write_attribute(name, value, options = {})
37
+ if translated?(name) && translate?
38
+ options = {:locale => Translatable.locale}.merge(options)
39
+
40
+ # Dirty tracking, paraphrased from
41
+ # ActiveRecord::AttributeMethods::Dirty#write_attribute.
42
+ name_str = name.to_s
43
+ if attribute_changed?(name_str)
44
+ # If there's already a change, delete it if this undoes the change.
45
+ old = changed_attributes[name_str]
46
+ changed_attributes.delete(name_str) if value == old
47
+ else
48
+ # If there's not a change yet, record it.
49
+ serialized_value = read_attribute(name, options) if self.serialized_attributes.has_key?(name)
50
+ old = translatable.fetch(options[:locale], name, serialized_value)
51
+ old = old.clone if old.duplicable?
52
+ changed_attributes[name_str] = old if value != old
15
53
  end
16
- }
17
- end
18
-
19
-
20
- #def write_attribute(name, value, options = {})
21
- # if translated?(name)
22
- # options = {:locale => Translatable.locale}.merge(options)
23
- #
24
- # # Dirty tracking, paraphrased from
25
- # # ActiveRecord::AttributeMethods::Dirty#write_attribute.
26
- # name_str = name.to_s
27
- # if attribute_changed?(name_str)
28
- # # If there's already a change, delete it if this undoes the change.
29
- # old = changed_attributes[name_str]
30
- # changed_attributes.delete(name_str) if value == old
31
- # else
32
- # # If there's not a change yet, record it.
33
- # old = globalize.fetch(options[:locale], name)
34
- # old = old.clone if old.duplicable?
35
- # changed_attributes[name_str] = old if value != old
36
- # end
37
- #
38
- # translatable.write(options[:locale], name, value)
39
- # else
40
- # super(name, value)
41
- # end
42
- #end
54
+
55
+ translatable.write(options[:locale], name, value)
56
+ else
57
+ super(name, value)
58
+ end
59
+ end
43
60
 
44
61
  def translate
45
62
  @translate_me = true
46
63
  self
47
64
  end
48
65
 
66
+ def end_translate
67
+ @translate_me = nil
68
+ self
69
+ end
70
+
71
+ def reload(options = nil)
72
+ @translate_me = false
73
+ translation_caches.clear
74
+ translated_attribute_names.each { |name| @attributes.delete(name.to_s) }
75
+ translatable.reset
76
+ super(options)
77
+ end
78
+
79
+ def save(*)
80
+ @translate_me = false
81
+ super
82
+ end
83
+
49
84
  def translate?
50
85
  !@translate_me.nil? && @translate_me
51
86
  end
52
87
 
53
88
  def read_attribute(name, options = {})
54
- options = {:translated => true, :locale => nil}.merge(options)
89
+ options = {:translated => true, :locale => Translatable.locale}.merge(options)
55
90
  if translated?(name) and options[:translated]
56
91
  serialized_value = super(name) if self.serialized_attributes.has_key?(name)
57
92
  if translate? && (value = translatable.fetch(options[:locale] || Translatable.locale, name, serialized_value))
@@ -68,6 +103,22 @@ module Translatable
68
103
  self.class.translated?(name)
69
104
  end
70
105
 
106
+ def translated_attributes
107
+ translated_attribute_names.inject({}) do |attributes, name|
108
+ attributes.merge(name.to_s => translation.send(name))
109
+ end
110
+ end
111
+
112
+ # This method is basically the method built into Rails
113
+ # but we have to pass {:translated => false}
114
+ def untranslated_attributes
115
+ attrs = {}
116
+ attribute_names.each do |name|
117
+ attrs[name] = read_attribute(name, {:translated => false})
118
+ end
119
+ attrs
120
+ end
121
+
71
122
  def translation_for(locale, name, build_if_missing = false)
72
123
  unless translation_caches["#{locale}_#{name}"]
73
124
  # Fetch translations from database as those in the translation collection may be incomplete
@@ -129,11 +180,29 @@ module Translatable
129
180
  attributes.try(:delete, :locale)
130
181
 
131
182
  if locale
183
+ already = translate?
184
+ translate unless translate?
132
185
  Translatable.with_locale(locale, &block)
186
+ end_translate unless already
133
187
  else
134
188
  yield
135
189
  end
136
190
  end
191
+
192
+ def translations_by_locale(&block)
193
+ translations.each_with_object(HashWithIndifferentAccess.new) do |t, hash|
194
+ hash[t.locale] ||= HashWithIndifferentAccess.new
195
+ hash[t.locale][t.key] = block_given? ? block.call(t) : t
196
+ end
197
+ end
198
+
199
+ protected
200
+
201
+ def save_translations!
202
+ translatable.save_translations!
203
+ translation_caches.clear
204
+ end
205
+
137
206
  end
138
207
  end
139
208
  end
@@ -69,10 +69,8 @@ module Translatable
69
69
  :extend => HasManyExtensions,
70
70
  :autosave => false
71
71
 
72
- #after_create :save_translations!
73
- #after_update :save_translations!
74
-
75
- #translation_class.instance_eval %{ attr_accessible :lang }
72
+ after_create :save_translations!
73
+ after_update :save_translations!
76
74
  end
77
75
  end
78
76
 
@@ -1,3 +1,3 @@
1
1
  module Translatable
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
data/lib/translatable.rb CHANGED
@@ -7,7 +7,7 @@ module Translatable
7
7
 
8
8
  class << self
9
9
  def locale
10
- I18n.locale
10
+ read_locale || I18n.locale
11
11
  end
12
12
 
13
13
  def locale=(locale)
@@ -16,9 +16,12 @@ module Translatable
16
16
 
17
17
  def with_locale(locale, &block)
18
18
  previous_locale = read_locale
19
- set_locale(locale)
20
- result = yield(locale)
21
- set_locale(previous_locale)
19
+ begin
20
+ set_locale(locale)
21
+ result = yield(locale)
22
+ ensure
23
+ set_locale(previous_locale)
24
+ end
22
25
  result
23
26
  end
24
27
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easy_translatable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Bonaud
@@ -25,6 +25,96 @@ dependencies:
25
25
  - - ~>
26
26
  - !ruby/object:Gem::Version
27
27
  version: '3.2'
28
+ - !ruby/object:Gem::Dependency
29
+ name: database_cleaner
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 0.6.0
35
+ - - '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.6.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ~>
43
+ - !ruby/object:Gem::Version
44
+ version: 0.6.0
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.6.0
48
+ - !ruby/object:Gem::Dependency
49
+ name: mocha
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: pathname_local
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ - !ruby/object:Gem::Dependency
77
+ name: test_declarative
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: friendly_id
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ - !ruby/object:Gem::Dependency
105
+ name: sqlite3
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
28
118
  - !ruby/object:Gem::Dependency
29
119
  name: rake
30
120
  requirement: !ruby/object:Gem::Requirement
@@ -39,6 +129,20 @@ dependencies:
39
129
  - - ~>
40
130
  - !ruby/object:Gem::Version
41
131
  version: '0'
132
+ - !ruby/object:Gem::Dependency
133
+ name: rdoc
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
42
146
  - !ruby/object:Gem::Dependency
43
147
  name: coveralls
44
148
  requirement: !ruby/object:Gem::Requirement