has_localization_table 0.3.3 → 0.3.4

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.
@@ -14,7 +14,7 @@ module HasLocalizationTable
14
14
  end
15
15
 
16
16
  def localized_attributes
17
- # Determine which attributes of the association model should be accessable through the base class
17
+ # Determine which attributes of the association model should be accessible through the base class
18
18
  # ie. everything that's not a primary key, foreign key, or timestamp attribute
19
19
  association_name = self.localization_table_options[:association_name] || :strings
20
20
  association = reflect_on_association(association_name)
@@ -23,23 +23,30 @@ module HasLocalizationTable
23
23
 
24
24
  def create_localization_associations!
25
25
  create_has_many_association
26
- create_has_one_association
26
+
27
+ # if caller explicitly asked not to create a has_one association, there's nothing more to do
28
+ return unless localization_table_options.fetch(:has_one, true)
29
+
30
+ create_has_one_association if localization_table_options[:has_one] or HasLocalizationTable.create_has_one_by_default
27
31
  end
28
32
 
29
33
  # Collect the localization for the current locale
30
34
  def create_has_one_association
31
35
  table_name = localization_class.table_name
32
36
  foreign_key = HasLocalizationTable.locale_foreign_key
37
+ association_name = localization_association_name.to_s.singularize.to_sym
38
+ association_name = :localization if localized_attributes.include?(association_name)
33
39
 
34
- has_one_options = localization_table_options.except(:association_name, :required, :optional, :dependent).
40
+ has_one_options = localization_table_options.except(:association_name, :required, :optional, :dependent, :has_one).
35
41
  merge({ conditions: Proc.new { "#{table_name}.#{foreign_key} = #{HasLocalizationTable.current_locale.id}"} })
36
42
 
37
- self.has_one localization_association_name.to_s.singularize.to_sym, has_one_options
43
+ self.has_one association_name, has_one_options
44
+ self.has_one(:localization, has_one_options) unless association_name == :localization
38
45
  end
39
46
 
40
47
  # Collect all localizations for the object
41
48
  def create_has_many_association
42
- self.has_many localization_association_name, localization_table_options.except(:association_name, :required, :optional)
49
+ self.has_many localization_association_name, localization_table_options.except(:association_name, :required, :optional, :has_one)
43
50
  end
44
51
 
45
52
  public
@@ -27,6 +27,7 @@ module HasLocalizationTable
27
27
  config_accessor :all_locales
28
28
  config_accessor :class_suffix
29
29
  config_accessor :default_association_name
30
+ config_accessor :create_has_one_by_default # Should a has_one association be automatically created?
30
31
  end
31
32
 
32
33
  # this is ugly. why can't we pass the default value to config_accessor...?
@@ -38,5 +39,6 @@ module HasLocalizationTable
38
39
  config.primary_locale = ->{ config.locale_class.constantize.first }
39
40
  config.current_locale = ->{ config.locale_class.constantize.first }
40
41
  config.all_locales = ->{ config.locale_class.constantize.all }
42
+ config.create_has_one_by_default = true
41
43
  end
42
44
  end
@@ -1,3 +1,3 @@
1
1
  module HasLocalizationTable
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.4"
3
3
  end
@@ -15,6 +15,7 @@ describe HasLocalizationTable do
15
15
  def self.localization_association_name; :strings; end
16
16
  def self.localization_table_options; {}; end
17
17
  def self.localization_class; ArticleLocalization; end
18
+ def self.localized_attributes; []; end
18
19
  end
19
20
  end
20
21
 
@@ -39,6 +40,41 @@ describe HasLocalizationTable do
39
40
  reflection.macro.must_equal :has_one
40
41
  end
41
42
 
43
+ it "should alias the has_one association as localization" do
44
+ reflection = subject.reflect_on_association(:localization)
45
+ refute_nil reflection
46
+ reflection.macro.must_equal :has_one
47
+ end
48
+
49
+ it "should not create a has_one association if disabled in configuration" do
50
+ HasLocalizationTable.stub :create_has_one_by_default, false do
51
+ assert_nil subject.reflect_on_association(:localization)
52
+ end
53
+ end
54
+
55
+ it "should not create a has_one association if disabled in table options" do
56
+ Article.stub :localization_table_options, { has_one: false } do
57
+ assert_nil subject.reflect_on_association(:localization)
58
+ end
59
+ end
60
+
61
+ it "should create a has_one association if asked for, even if disabled in configuration" do
62
+ HasLocalizationTable.stub :create_has_one_by_default, false do
63
+ Article.stub :localization_table_options, { has_one: true } do
64
+ reflection = subject.reflect_on_association(:localization)
65
+ refute_nil reflection
66
+ reflection.macro.must_equal :has_one
67
+ end
68
+ end
69
+ end
70
+
71
+ it "should not create an association that conflicts with an attribute name" do
72
+ Article.stub :localized_attributes, [:string] do
73
+ Article.send(:extend, HasLocalizationTable::ActiveRecord::Relation)
74
+ assert_nil Article.reflect_on_association(:string)
75
+ end
76
+ end
77
+
42
78
  it "should use the current locale for the has_one association" do
43
79
  locale = MiniTest::Mock.new
44
80
  locale.expect :id, 2
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: has_localization_table
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
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: 2013-05-31 00:00:00.000000000 Z
12
+ date: 2013-06-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport