has_localization_table 0.2.0 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ .idea
1
2
  *.gem
2
3
  *.rbc
3
4
  .bundle
@@ -3,7 +3,8 @@ module HasLocalizationTable
3
3
  module Relation
4
4
  def self.extended(klass)
5
5
  klass.send(:include, InstanceMethods)
6
-
6
+ klass.send(:create_localization_associations!)
7
+
7
8
  # Alias the scoping method to use the actual association name
8
9
  alias_method :"with_#{klass.localization_association_name}", :with_localizations
9
10
  end
@@ -17,12 +18,32 @@ module HasLocalizationTable
17
18
  join_sql
18
19
  )
19
20
  end
20
-
21
- def create_localization_association!
21
+
22
+ private
23
+
24
+ def create_localization_associations!
25
+ create_has_many_association
26
+ create_has_one_association
27
+ end
28
+
29
+ # Collect the localization for the current locale
30
+ def create_has_one_association
31
+ table_name = localization_class.table_name
32
+ foreign_key = HasLocalizationTable.locale_foreign_key
33
+
34
+ has_one_options = localization_table_options.except(:association_name, :required, :optional, :dependent).
35
+ merge({ conditions: Proc.new { "#{table_name}.#{foreign_key} = #{HasLocalizationTable.current_locale.id}"} })
36
+
37
+ self.has_one localization_association_name.to_s.singularize.to_sym, has_one_options
38
+ end
39
+
40
+ # Collect all localizations for the object
41
+ def create_has_many_association
22
42
  self.has_many localization_association_name, localization_table_options.except(:association_name, :required, :optional)
23
43
  end
24
- private :create_localization_association!
25
-
44
+
45
+ public
46
+
26
47
  module InstanceMethods
27
48
  # Add localization objects for any available locale that doesn't have one
28
49
  def build_missing_localizations!
@@ -19,7 +19,6 @@ module HasLocalizationTable
19
19
  extend Relation, FinderMethods, OrderedBy, Callbacks, Validations, MetaMethods
20
20
  include Attributes
21
21
 
22
- create_localization_association!
23
22
  setup_localization_callbacks!
24
23
  setup_localization_validations!
25
24
  end
@@ -1,3 +1,3 @@
1
1
  module HasLocalizationTable
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.3"
3
3
  end
@@ -13,7 +13,7 @@ describe HasLocalizationTable do
13
13
  Article = Class.new(ActiveRecord::Base)
14
14
  Article.has_localization_table
15
15
  end
16
-
16
+
17
17
  let(:a) { Article.new(name: "Test", description: "Description") }
18
18
 
19
19
  it "should set localized attributes" do
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ #require 'active_record/relation'
2
3
 
3
4
  describe HasLocalizationTable do
4
5
  before do
@@ -10,11 +11,48 @@ describe HasLocalizationTable do
10
11
  end
11
12
 
12
13
  Object.send(:remove_const, :Article) rescue nil
13
- Article = Class.new(ActiveRecord::Base)
14
+ Article = Class.new(ActiveRecord::Base) do
15
+ def self.localization_association_name; :strings; end
16
+ def self.localization_table_options; {}; end
17
+ def self.localization_class; ArticleLocalization; end
18
+ end
19
+ end
20
+
21
+ subject do
22
+ Article.send(:extend, HasLocalizationTable::ActiveRecord::Relation)
23
+ Article
14
24
  end
15
-
25
+
16
26
  it "should alias with_localizations with the actual association name" do
17
- Article.has_localization_table :strings
18
- assert Article.respond_to? :with_strings
27
+ assert subject.respond_to? :with_strings
28
+ end
29
+
30
+ it "should create a has_many association" do
31
+ reflection = subject.reflect_on_association(:strings)
32
+ refute_nil reflection
33
+ reflection.macro.must_equal :has_many
34
+ end
35
+
36
+ it "should create a has_one association" do
37
+ reflection = subject.reflect_on_association(:string)
38
+ refute_nil reflection
39
+ reflection.macro.must_equal :has_one
40
+ end
41
+
42
+ it "should use the current locale for the has_one association" do
43
+ locale = MiniTest::Mock.new
44
+ locale.expect :id, 2
45
+
46
+ conditions = subject.reflect_on_association(:string).options[:conditions]
47
+
48
+ HasLocalizationTable.stub :current_locale, locale do
49
+ conditions.call.must_equal "article_localizations.locale_id = 2"
50
+ end
51
+
52
+ locale.expect :id, 3
53
+
54
+ HasLocalizationTable.stub :current_locale, locale do
55
+ conditions.call.must_equal "article_localizations.locale_id = 3"
56
+ end
19
57
  end
20
58
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ gem "minitest" # Use the gem version
1
2
  require 'minitest/autorun'
2
3
  require 'active_record'
3
4
  require 'has_localization_table'
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.2.0
4
+ version: 0.3.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,52 +9,72 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-16 00:00:00.000000000 Z
12
+ date: 2013-05-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &10582840 !ruby/object:Gem::Requirement
17
- none: false
16
+ prerelease: false
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: 3.0.0
22
+ none: false
22
23
  type: :runtime
23
- prerelease: false
24
- version_requirements: *10582840
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ! '>='
27
+ - !ruby/object:Gem::Version
28
+ version: 3.0.0
29
+ none: false
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: activerecord
27
- requirement: &10581980 !ruby/object:Gem::Requirement
28
- none: false
32
+ prerelease: false
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  requirements:
30
35
  - - ! '>='
31
36
  - !ruby/object:Gem::Version
32
37
  version: 3.0.0
38
+ none: false
33
39
  type: :runtime
34
- prerelease: false
35
- version_requirements: *10581980
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: 3.0.0
45
+ none: false
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: minitest
38
- requirement: &10581320 !ruby/object:Gem::Requirement
39
- none: false
48
+ prerelease: false
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  requirements:
41
51
  - - ! '>='
42
52
  - !ruby/object:Gem::Version
43
53
  version: '0'
54
+ none: false
44
55
  type: :development
45
- prerelease: false
46
- version_requirements: *10581320
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ! '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ none: false
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: sqlite3
49
- requirement: &10580720 !ruby/object:Gem::Requirement
50
- none: false
64
+ prerelease: false
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  requirements:
52
67
  - - ! '>='
53
68
  - !ruby/object:Gem::Version
54
69
  version: '0'
70
+ none: false
55
71
  type: :development
56
- prerelease: false
57
- version_requirements: *10580720
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ none: false
58
78
  description: Automatically sets up usage of a relational table to contain user-created
59
79
  multi-locale string attributes
60
80
  email:
@@ -95,20 +115,20 @@ rdoc_options: []
95
115
  require_paths:
96
116
  - lib
97
117
  required_ruby_version: !ruby/object:Gem::Requirement
98
- none: false
99
118
  requirements:
100
119
  - - ! '>='
101
120
  - !ruby/object:Gem::Version
102
121
  version: '0'
103
- required_rubygems_version: !ruby/object:Gem::Requirement
104
122
  none: false
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
124
  requirements:
106
125
  - - ! '>='
107
126
  - !ruby/object:Gem::Version
108
127
  version: '0'
128
+ none: false
109
129
  requirements: []
110
130
  rubyforge_project:
111
- rubygems_version: 1.8.12
131
+ rubygems_version: 1.8.24
112
132
  signing_key:
113
133
  specification_version: 3
114
134
  summary: Sets up associations and attribute methods for AR models that have a relational