dynamic_default_scoping 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -51,3 +51,8 @@ Here is how it should be:
51
51
  == When there will be a normal implementation of this feature?
52
52
 
53
53
  http://rails.lighthouseapp.com/projects/8994/tickets/1812-default_scope-cant-take-procs
54
+
55
+ == Credits
56
+
57
+ * Adam Wróbel (https://github.com/amw)
58
+ * Ivan Ukhov (https://github.com/UVSoft)
@@ -1,3 +1,3 @@
1
1
  module DynamicDefaultScoping
2
- VERSION = "0.0.2"
2
+ VERSION = '0.0.3'
3
3
  end
@@ -0,0 +1,14 @@
1
+ class Post < ActiveRecord::Base
2
+ scope :recent, limit(5)
3
+
4
+ include DynamicDefaultScoping
5
+
6
+ default_scope :language, lambda { |*args|
7
+ case locale = (args[0].presence || I18n.locale).to_s
8
+ when 'any', 'all'
9
+ where :locale => I18n.available_locales.map(&:to_s)
10
+ else
11
+ where :locale => locale
12
+ end
13
+ }
14
+ end
@@ -5,39 +5,14 @@ require 'active_support/all'
5
5
  require 'active_record'
6
6
  require 'dynamic_default_scoping'
7
7
 
8
+ %w(models support).each do |directory|
9
+ Dir[File.join(File.dirname(__FILE__), "#{ directory }/**/*.rb")].each do |file|
10
+ require file
11
+ end
12
+ end
13
+
8
14
  RSpec.configure do |config|
9
15
  config.before(:each) do
10
16
  Post.unscoped.delete_all
11
17
  end
12
18
  end
13
-
14
- ActiveRecord::Base.establish_connection \
15
- :adapter => 'mysql2',
16
- :hostname => 'localhost',
17
- :database => 'dynamic_default_scoping',
18
- :username => 'root',
19
- :password => ''
20
-
21
- connection = ActiveRecord::Base.connection
22
- connection.drop_table 'posts' if connection.table_exists? 'posts'
23
- connection.create_table 'posts' do |table|
24
- table.string :locale
25
- table.timestamps
26
- end
27
-
28
- LOCALES = [ :en, :ru ]
29
-
30
- class Post < ActiveRecord::Base
31
- scope :recent, limit(5)
32
-
33
- include DynamicDefaultScoping
34
-
35
- default_scope :language, lambda { |*args|
36
- case locale = (args[0].presence || I18n.locale).to_s
37
- when 'any', 'all'
38
- where :locale => LOCALES.map(&:to_s)
39
- else
40
- where :locale => locale
41
- end
42
- }
43
- end
@@ -0,0 +1,15 @@
1
+ ActiveRecord::Base.establish_connection \
2
+ :adapter => 'mysql2',
3
+ :hostname => 'localhost',
4
+ :database => 'dynamic_default_scoping',
5
+ :username => 'root',
6
+ :password => ''
7
+
8
+ connection = ActiveRecord::Base.connection
9
+
10
+ ActiveRecord::Base.descendants.each do |model|
11
+ table_name = model.table_name
12
+ connection.drop_table table_name if connection.table_exists? table_name
13
+ table = File.join File.dirname(__FILE__), '..', "tables/#{ table_name }.rb"
14
+ connection.instance_eval File.open(table).read if File.exist? table
15
+ end
@@ -0,0 +1,7 @@
1
+ RSpec::Matchers.define :have_valid_locale do |*args|
2
+ locales = Array.wrap(args[0] || I18n.locale).map &:to_s
3
+
4
+ match do |*records|
5
+ records.flatten.all? { |record| locales.include? record.locale }
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ create_table 'posts' do |table|
2
+ table.string :locale
3
+ table.timestamps
4
+ end
@@ -1,28 +1,24 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DynamicDefaultScoping do
4
- def should_have_valid_locale *args
5
- options = args.extract_options!
6
- locale = (options[:locale].presence || I18n.locale).to_s
7
- args.flatten.all?{ |post| post.locale == locale }.should be_true
4
+ let :locales do
5
+ [ :en, :ru ]
8
6
  end
9
7
 
10
- let(:locales) { LOCALES }
11
- let(:per_locale) do
8
+ let :per_locale do
12
9
  hash = {}
13
10
  locales.each_with_index { |locale, i| hash[locale] = 3 + i }
14
11
  hash
15
12
  end
16
13
 
17
- describe 'when switching between locales' do
18
- before do
19
- locales.each do |locale|
20
- per_locale[locale].times do
21
- Post.create! :locale => locale.to_s
22
- end
23
- end
14
+ before do
15
+ I18n.stub(:available_locales).and_return locales
16
+ per_locale.each do |locale, count|
17
+ count.times { Post.create! :locale => locale.to_s }
24
18
  end
19
+ end
25
20
 
21
+ describe 'when switching between locales' do
26
22
  around do |block|
27
23
  locales.each do |locale|
28
24
  I18n.locale = locale
@@ -30,85 +26,75 @@ describe DynamicDefaultScoping do
30
26
  end
31
27
  end
32
28
 
33
- context 'when the locale is not specified' do
29
+ shared_examples_for 'a well localized class' do
30
+ it 'generates the right query' do
31
+ part = if @locale.is_a? Array
32
+ %[`locale` IN (#{ @locale.map{ |l| "'#{ l }'" }.join(', ') })]
33
+ else
34
+ %[`locale` = '#{ @locale }']
35
+ end
36
+ @relation.to_sql.should include part
37
+ end
38
+
34
39
  it 'finds records only in the current locale' do
35
- should_have_valid_locale Post.first, Post.all
40
+ [ @relation.first, @relation.all ].should have_valid_locale @locale
36
41
  end
37
42
 
38
43
  it 'counts records only in the current locale' do
39
- Post.count.should == per_locale[I18n.locale]
44
+ count = Array.wrap(@locale).map{ |l| per_locale[l] }.sum
45
+ @relation.count.should == count
40
46
  end
41
47
  end
42
48
 
43
- context 'when the locale is specified' do
44
- shared_examples_for 'well localized class' do
45
- it 'generates correct query' do
46
- sql = @scoped.to_sql
47
- sql.should include %[`locale` = '#{ @locale }']
48
- end
49
-
50
- it 'finds records in the specified locale' do
51
- all = @scoped.all
52
- all.length.should == per_locale[@locale]
53
- should_have_valid_locale all, :locale => @locale
54
- end
55
-
56
- it 'counts records in the specified locale' do
57
- @scoped.count.should == per_locale[@locale]
58
- end
49
+ context 'when the locale is not specified' do
50
+ before do
51
+ @relation, @locale = Post.scoped, I18n.locale
59
52
  end
60
53
 
54
+ it_behaves_like 'a well localized class'
55
+ end
56
+
57
+ context 'when the locale is specified' do
61
58
  context 'when there is another scope before' do
62
59
  around do |block|
63
60
  locales.each do |locale|
64
- @locale = locale
65
- @scoped = Post.recent.language(locale)
61
+ @relation, @locale = Post.recent.language(locale), locale
66
62
  block.call
67
63
  end
68
64
  end
69
65
 
70
- it_behaves_like 'well localized class'
66
+ it_behaves_like 'a well localized class'
71
67
  end
72
68
 
73
69
  context 'when there is another scope after' do
74
70
  around do |block|
75
71
  locales.each do |locale|
76
- @locale = locale
77
- @scoped = Post.language(locale).recent
72
+ @relation, @locale = Post.language(locale).recent, locale
78
73
  block.call
79
74
  end
80
75
  end
81
76
 
82
- it_behaves_like 'well localized class'
77
+ it_behaves_like 'a well localized class'
83
78
  end
84
79
 
85
80
  context 'when there is no another scope' do
86
81
  around do |block|
87
82
  locales.each do |locale|
88
- @locale = locale
89
- @scoped = Post.language(locale)
83
+ @relation, @locale = Post.language(locale), locale
90
84
  block.call
91
85
  end
92
86
  end
93
87
 
94
- it_behaves_like 'well localized class'
88
+ it_behaves_like 'a well localized class'
95
89
  end
96
90
  end
97
91
 
98
92
  context 'when we are interested in all locales' do
99
- let(:scoped) { Post.language :any }
100
-
101
- it 'finds all records' do
102
- sql = scoped.to_sql
103
- locales.each do |locale|
104
- sql.should =~ %r[`locale` IN \(.*'#{ locale }'.*\)]
105
- end
106
- scoped.length.should == per_locale.values.sum
93
+ before do
94
+ @relation, @locale = Post.language(:any), locales
107
95
  end
108
96
 
109
- it 'counts all records' do
110
- scoped.count.should == per_locale.values.sum
111
- end
97
+ it_behaves_like 'a well localized class'
112
98
  end
113
99
  end
114
100
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamic_default_scoping
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ivan Ukhov
@@ -84,7 +84,11 @@ files:
84
84
  - dynamic_default_scoping.gemspec
85
85
  - lib/dynamic_default_scoping.rb
86
86
  - lib/dynamic_default_scoping/version.rb
87
+ - spec/models/post.rb
87
88
  - spec/spec_helper.rb
89
+ - spec/support/connection.rb
90
+ - spec/support/matchers.rb
91
+ - spec/tables/posts.rb
88
92
  - spec/unit/dynamic_default_scoping_spec.rb
89
93
  has_rdoc: true
90
94
  homepage: https://github.com/UVSoft/dynamic_default_scoping
@@ -121,5 +125,9 @@ signing_key:
121
125
  specification_version: 3
122
126
  summary: Make ActiveRecord::Base.default_scope take a proc and have a name.
123
127
  test_files:
128
+ - spec/models/post.rb
124
129
  - spec/spec_helper.rb
130
+ - spec/support/connection.rb
131
+ - spec/support/matchers.rb
132
+ - spec/tables/posts.rb
125
133
  - spec/unit/dynamic_default_scoping_spec.rb