armot 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -207,6 +207,24 @@ defined, using this syntax:
207
207
  define_localized_accessors_for :all, :locales => [:klingon, :pt]
208
208
  end
209
209
 
210
+ Presence validators
211
+ ----------
212
+
213
+ If you use the standard presence validator from Rails, as in
214
+
215
+ validates_presence_of :some_attribute
216
+
217
+ Only the value for the current locale will be checked. However, you
218
+ might want to check the presence of the value for a specific set of
219
+ locales. If this is your purpose, you can use:
220
+
221
+ validates_armotized_presence_of :some_attribute, %w{ en ca es }
222
+
223
+ where the first parameter is the attribute you want to check presence
224
+ of, and the second is the set of locales for which you want to check the
225
+ presence of the attribute. Note that the locales can either be a string
226
+ or symbol array (as in the example above), or a single string or symbol
227
+ in case you only want to do the check for one locale.
210
228
 
211
229
  Development with armot
212
230
  ----------------------
@@ -105,8 +105,12 @@ module Armot
105
105
  armot_attributes[I18n.locale]["#{attribute}"].present?
106
106
  end
107
107
 
108
+ define_method :"#{attribute}_raw" do
109
+ return armot_attributes[I18n.locale]["#{attribute}"]
110
+ end
111
+
108
112
  define_method :"#{attribute}" do
109
- return armot_attributes[I18n.locale]["#{attribute}"] if armot_attributes[I18n.locale]["#{attribute}"]
113
+ return send("#{attribute}_raw") if armot_attributes[I18n.locale]["#{attribute}"]
110
114
 
111
115
  if armot_attributes.any? && I18n.respond_to?(:fallbacks)
112
116
  I18n.fallbacks[I18n.locale].each do |fallback|
@@ -130,6 +134,10 @@ module Armot
130
134
  extend self.const_get("ArmotClassMethods") unless self.singleton_class.included_modules.map(&:to_s).include?("#{self}::ArmotClassMethods")
131
135
  end
132
136
 
137
+ def validates_armotized_presence_of(attr_name, locales)
138
+ validates_with Armot::ActiveRecordExtensions::Validations::PresenceValidator, :attr => attr_name, :locales => locales
139
+ end
140
+
133
141
  private
134
142
 
135
143
  # configure model
@@ -175,6 +183,23 @@ module Armot
175
183
  res
176
184
  end
177
185
  end
186
+
187
+ module Validations
188
+ class PresenceValidator < ActiveModel::Validator
189
+ def validate(record)
190
+ attr_name = options[:attr]
191
+ locales = options[:locales]
192
+ locales = [locales] if [ String, Symbol ].include?(locales.class)
193
+
194
+ valid = locales.map do |locale|
195
+ I18n.locale = locale.to_sym
196
+ record.send("#{attr_name}_raw").present?
197
+ end.inject(:&)
198
+
199
+ record.errors.add(attr_name, "has to be present for locales #{locales.to_sentence}") unless valid
200
+ end
201
+ end
202
+ end
178
203
  end
179
204
  end
180
205
 
@@ -1,3 +1,3 @@
1
1
  module Armot
2
- VERSION = "0.3.4"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -1,5 +1,6 @@
1
- require 'test_helper'
1
+ # encoding: UTF-8
2
2
 
3
+ require 'test_helper'
3
4
 
4
5
  def to_method_name(name)
5
6
  if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new("1.9")
@@ -45,14 +46,63 @@ class ArmotTest < ActiveSupport::TestCase
45
46
  assert_equal 'English title', post.title
46
47
  end
47
48
 
48
- test 'validates_presence_of should work' do
49
- post = Post.new
49
+ test 'validates_armotized_presence_of should work' do
50
+ class ValidatedPost < Post
51
+ validates_armotized_presence_of :title, %w{ en ca es }
52
+ end
53
+
54
+ post = ValidatedPost.new
50
55
  assert_equal false, post.valid?
51
56
 
57
+ I18n.locale = :en
52
58
  post.title = 'English title'
59
+ assert_equal false, post.valid?
60
+
61
+ { :ca => 'Títol català', :es => 'Título castellano' }.each do |locale, title|
62
+ I18n.locale = locale
63
+ post.title = title
64
+ end
65
+
66
+ assert_equal true, post.valid?
67
+ end
68
+
69
+ test 'validates_armotized_presence_of should work with one locale' do
70
+ class AnotherValidatedPost < Post
71
+ validates_armotized_presence_of :title, :ca
72
+ end
73
+
74
+ post = AnotherValidatedPost.new
75
+ I18n.locale = :ca
76
+ post.title = 'soc una cucota'
53
77
  assert_equal true, post.valid?
54
78
  end
55
79
 
80
+ test 'validates_armotized_presence_of fails when no valid locales provided' do
81
+ class WrongValidatedPost < Post
82
+ validates_armotized_presence_of :title, 1234
83
+ end
84
+
85
+ post = WrongValidatedPost.new
86
+ begin
87
+ post.valid?
88
+ fail
89
+ rescue
90
+ end
91
+ end
92
+
93
+ test 'validates_armotized_presence_of fails when no valid attr provided' do
94
+ class AnotherWrongValidatedPost < Post
95
+ validates_armotized_presence_of :invented_title, %w{ en ca es }
96
+ end
97
+
98
+ post = AnotherWrongValidatedPost.new
99
+ begin
100
+ post.valid?
101
+ fail
102
+ rescue
103
+ end
104
+ end
105
+
56
106
  test 'temporary locale switch should not clear changes' do
57
107
  I18n.locale = :de
58
108
  post = Post.first
@@ -29,7 +29,6 @@ end
29
29
 
30
30
  class Post < ActiveRecord::Base
31
31
  armotize :title, :text
32
- validates_presence_of :title
33
32
  end
34
33
 
35
34
  class Product < ActiveRecord::Base
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: armot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-28 00:00:00.000000000 Z
12
+ date: 2012-12-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n-active_record
@@ -134,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
134
  version: '0'
135
135
  requirements: []
136
136
  rubyforge_project: armot
137
- rubygems_version: 1.8.18
137
+ rubygems_version: 1.8.24
138
138
  signing_key:
139
139
  specification_version: 3
140
140
  summary: translation support for your models with an I18n active-record backend