mongoid_userstamp 0.3.2 → 0.4.0
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 +8 -8
- data/CHANGELOG.md +15 -0
- data/README.md +104 -38
- data/lib/mongoid/userstamp.rb +41 -52
- data/lib/mongoid/userstamp/config/gem_config.rb +38 -0
- data/lib/mongoid/userstamp/config/model_config.rb +27 -0
- data/lib/mongoid/userstamp/config/user_config.rb +17 -0
- data/lib/mongoid/userstamp/mixins/model.rb +41 -0
- data/lib/mongoid/userstamp/mixins/user.rb +46 -0
- data/lib/mongoid/userstamp/railtie.rb +29 -11
- data/lib/mongoid/userstamp/version.rb +2 -1
- data/lib/mongoid_userstamp.rb +6 -2
- data/mongoid_userstamp.gemspec +3 -2
- data/spec/spec_helper.rb +5 -6
- data/spec/support/admin.rb +7 -0
- data/spec/support/book.rb +3 -1
- data/spec/support/post.rb +11 -0
- data/spec/unit/gem_config_spec.rb +46 -0
- data/spec/unit/model_config_spec.rb +31 -0
- data/spec/unit/model_spec.rb +157 -0
- data/spec/unit/user_config_spec.rb +23 -0
- data/spec/unit/user_spec.rb +95 -0
- data/spec/unit/userstamp_spec.rb +120 -0
- metadata +41 -9
- data/lib/mongoid/userstamp/config.rb +0 -30
- data/lib/mongoid/userstamp/user.rb +0 -37
- data/spec/mongoid/userstamp_spec.rb +0 -163
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Userstamp
|
5
|
+
|
6
|
+
module User
|
7
|
+
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
|
12
|
+
Mongoid::Userstamp.add_user_class(self)
|
13
|
+
|
14
|
+
def current?
|
15
|
+
self._id == Mongoid::Userstamp.current_user(self.class).try(:_id)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module ClassMethods
|
20
|
+
|
21
|
+
def current
|
22
|
+
Mongoid::Userstamp.current_user(self)
|
23
|
+
end
|
24
|
+
|
25
|
+
def current=(value)
|
26
|
+
Mongoid::Userstamp.set_current_user(value, self)
|
27
|
+
end
|
28
|
+
|
29
|
+
def do_as(user, &block)
|
30
|
+
old = self.current
|
31
|
+
begin
|
32
|
+
self.current = user
|
33
|
+
response = block.call unless block.nil?
|
34
|
+
ensure
|
35
|
+
self.current = old
|
36
|
+
end
|
37
|
+
response
|
38
|
+
end
|
39
|
+
|
40
|
+
def mongoid_userstamp_user(opts = {})
|
41
|
+
@mongoid_userstamp_user ||= Mongoid::Userstamp::UserConfig.new(opts)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,18 +1,35 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
|
2
3
|
module Mongoid
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
4
|
+
module Userstamp
|
5
|
+
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
|
8
|
+
# Include Mongoid::Userstamp::User into User class, if not already done
|
9
|
+
config.to_prepare do
|
10
|
+
Mongoid::Userstamp.user_classes.each do |user_class|
|
11
|
+
unless user_class.included_modules.include?(Mongoid::Userstamp::User)
|
12
|
+
user_class.send(:include, Mongoid::Userstamp::User)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Add userstamp to models where Mongoid::Userstamp was included, but
|
18
|
+
# mongoid_userstamp was not explicitly called
|
19
|
+
config.to_prepare do
|
20
|
+
Mongoid::Userstamp.model_classes.each do |model_class|
|
21
|
+
unless model_class.included_modules.include?(Mongoid::Userstamp::Model)
|
22
|
+
model_class.send(:include, Mongoid::Userstamp::Model)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
13
26
|
|
27
|
+
# Set current_user from controller reader method
|
28
|
+
ActiveSupport.on_load :action_controller do
|
29
|
+
before_filter do |c|
|
30
|
+
Mongoid::Userstamp.user_classes.each do |user_class|
|
14
31
|
begin
|
15
|
-
|
32
|
+
user_class.current = c.send(user_class.mongoid_userstamp_user.reader)
|
16
33
|
rescue
|
17
34
|
end
|
18
35
|
end
|
@@ -20,3 +37,4 @@ module Mongoid
|
|
20
37
|
end
|
21
38
|
end
|
22
39
|
end
|
40
|
+
end
|
data/lib/mongoid_userstamp.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
+
|
2
3
|
require 'mongoid/userstamp'
|
3
4
|
require 'mongoid/userstamp/version'
|
4
|
-
require 'mongoid/userstamp/config'
|
5
|
-
require 'mongoid/userstamp/
|
5
|
+
require 'mongoid/userstamp/config/gem_config'
|
6
|
+
require 'mongoid/userstamp/config/model_config'
|
7
|
+
require 'mongoid/userstamp/config/user_config'
|
8
|
+
require 'mongoid/userstamp/mixins/user'
|
9
|
+
require 'mongoid/userstamp/mixins/model'
|
6
10
|
require 'mongoid/userstamp/railtie' if defined? Rails
|
data/mongoid_userstamp.gemspec
CHANGED
@@ -4,7 +4,7 @@ require 'mongoid/userstamp/version'
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = 'mongoid_userstamp'
|
6
6
|
s.version = Mongoid::Userstamp::VERSION
|
7
|
-
s.authors = ['Thomas Boerger', 'Johnny Shields']
|
7
|
+
s.authors = ['Thomas Boerger', 'Johnny Shields', 'Bharat Gupta']
|
8
8
|
s.homepage = 'https://github.com/tbpro/mongoid_userstamp'
|
9
9
|
s.license = 'MIT'
|
10
10
|
s.summary = 'Userstamp for Mongoid'
|
@@ -20,7 +20,8 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.add_runtime_dependency 'mongoid', '>= 3.0.4'
|
22
22
|
s.add_development_dependency 'rake'
|
23
|
-
s.add_development_dependency 'rspec', '>=
|
23
|
+
s.add_development_dependency 'rspec', '>= 3.0.0'
|
24
24
|
s.add_development_dependency 'yard'
|
25
25
|
s.add_development_dependency 'gem-release'
|
26
|
+
s.add_development_dependency 'request_store'
|
26
27
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'rubygems'
|
3
|
+
require 'ostruct'
|
3
4
|
|
4
5
|
$:.push File.expand_path('../../lib', __FILE__)
|
5
6
|
|
@@ -7,14 +8,12 @@ require 'active_support/all'
|
|
7
8
|
require 'mongoid'
|
8
9
|
require 'mongoid_userstamp'
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
'mongoid_userstamp_test'
|
13
|
-
)
|
11
|
+
%w(admin user book post).each do |file_name|
|
12
|
+
require "support/#{file_name}"
|
14
13
|
end
|
15
14
|
|
16
|
-
|
17
|
-
|
15
|
+
Mongoid.configure do |config|
|
16
|
+
config.connect_to 'mongoid_userstamp_test'
|
18
17
|
end
|
19
18
|
|
20
19
|
RSpec.configure do |config|
|
data/spec/support/book.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Mongoid::Userstamp::GemConfig do
|
5
|
+
|
6
|
+
subject { Mongoid::Userstamp::GemConfig.new }
|
7
|
+
|
8
|
+
describe '#initialize' do
|
9
|
+
|
10
|
+
context 'without block' do
|
11
|
+
it { should be_a Mongoid::Userstamp::GemConfig }
|
12
|
+
it { subject.created_name.should eq :created_by }
|
13
|
+
it { subject.updated_name.should eq :updated_by }
|
14
|
+
it { subject.user_reader.should eq :current_user }
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'with block' do
|
18
|
+
subject do
|
19
|
+
Mongoid::Userstamp::GemConfig.new do |u|
|
20
|
+
u.created_name = :c_by
|
21
|
+
u.updated_name = :u_by
|
22
|
+
u.user_reader = :foo
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it { should be_a Mongoid::Userstamp::GemConfig }
|
27
|
+
it { subject.created_name.should eq :c_by }
|
28
|
+
it { subject.updated_name.should eq :u_by }
|
29
|
+
it { subject.user_reader.should eq :foo }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'deprecated methods' do
|
34
|
+
subject do
|
35
|
+
Mongoid::Userstamp::GemConfig.new do |u|
|
36
|
+
u.user_model = :bar
|
37
|
+
u.created_column = :bing
|
38
|
+
u.updated_column = :baz
|
39
|
+
end
|
40
|
+
end
|
41
|
+
it { ->{ subject }.should_not raise_error }
|
42
|
+
it { should be_a Mongoid::Userstamp::GemConfig }
|
43
|
+
it { subject.created_name.should eq :bing }
|
44
|
+
it { subject.updated_name.should eq :baz }
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Mongoid::Userstamp::ModelConfig do
|
5
|
+
|
6
|
+
subject { Mongoid::Userstamp::ModelConfig.new }
|
7
|
+
before { Mongoid::Userstamp.stub('config').and_return(OpenStruct.new(created_name: :created_by,
|
8
|
+
updated_name: :updated_by)) }
|
9
|
+
before { Mongoid::Userstamp.stub('user_classes').and_return(['User']) }
|
10
|
+
|
11
|
+
describe '#initialize' do
|
12
|
+
|
13
|
+
context 'with opts hash' do
|
14
|
+
subject { Mongoid::Userstamp::ModelConfig.new(user_model: :bar,
|
15
|
+
created_name: :c_by,
|
16
|
+
updated_name: :u_by) }
|
17
|
+
|
18
|
+
it { should be_a Mongoid::Userstamp::ModelConfig }
|
19
|
+
it { subject.user_model.should eq :bar }
|
20
|
+
it { subject.created_name.should eq :c_by }
|
21
|
+
it { subject.updated_name.should eq :u_by }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'without opts hash' do
|
25
|
+
it { should be_a Mongoid::Userstamp::ModelConfig }
|
26
|
+
it { subject.user_model.should eq 'User' }
|
27
|
+
it { subject.created_name.should eq :created_by }
|
28
|
+
it { subject.updated_name.should eq :updated_by }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Mongoid::Userstamp::Model do
|
5
|
+
|
6
|
+
subject(:book) { Book.new(name: 'Crafting Rails Applications') }
|
7
|
+
subject(:post) { Post.new(title: 'Understanding Rails') }
|
8
|
+
|
9
|
+
let(:user_1) { User.create!(name: 'Charles Dikkens') }
|
10
|
+
let(:user_2) { User.create!(name: 'Edmund Wells') }
|
11
|
+
let(:admin_1) { Admin.create!(name: 'JK Rowling') }
|
12
|
+
let(:admin_2) { Admin.create!(name: 'Stephan Norway') }
|
13
|
+
|
14
|
+
describe '::mongoid_userstamp_config' do
|
15
|
+
before do
|
16
|
+
@config = Book.instance_variable_get(:'@mongoid_userstamp_config')
|
17
|
+
Book.instance_variable_set(:'@mongoid_userstamp_config', nil)
|
18
|
+
end
|
19
|
+
|
20
|
+
after do
|
21
|
+
Book.instance_variable_set(:'@mongoid_userstamp_config', @config)
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'when options are not given' do
|
25
|
+
subject{ Book.mongoid_userstamp_config }
|
26
|
+
it { should be_a Mongoid::Userstamp::ModelConfig }
|
27
|
+
it { subject.user_model.should eq Admin }
|
28
|
+
it { subject.created_name.should eq :created_by }
|
29
|
+
it { subject.updated_name.should eq :updated_by }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'when options are given' do
|
33
|
+
subject{ Book.mongoid_userstamp_config(user_model: 'User', created_name: :foo, updated_name: :bar) }
|
34
|
+
it { should be_a Mongoid::Userstamp::ModelConfig }
|
35
|
+
it { subject.user_model.should eq 'User' }
|
36
|
+
it { subject.created_name.should eq :foo }
|
37
|
+
it { subject.updated_name.should eq :bar }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when mongoid_userstamp_user has been set' do
|
41
|
+
subject{ Book.mongoid_userstamp_config; Book.mongoid_userstamp_config(user_model: 'User', created_name: :foo, updated_name: :bar) }
|
42
|
+
it { should be_a Mongoid::Userstamp::ModelConfig }
|
43
|
+
it { subject.user_model.should eq Admin }
|
44
|
+
it { subject.created_name.should eq :created_by }
|
45
|
+
it { subject.updated_name.should eq :updated_by }
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'when set via mongoid_userstamp method' do
|
49
|
+
subject{ Book.mongoid_userstamp(user_model: 'User', created_name: :foo, updated_name: :bar); Book.mongoid_userstamp_config }
|
50
|
+
it { should be_a Mongoid::Userstamp::ModelConfig }
|
51
|
+
it { subject.user_model.should eq 'User' }
|
52
|
+
it { subject.created_name.should eq :foo }
|
53
|
+
it { subject.updated_name.should eq :bar }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '::current_user' do
|
58
|
+
|
59
|
+
before { Admin.current = nil; User.current = nil }
|
60
|
+
|
61
|
+
context 'when current book user is not set' do
|
62
|
+
it { Book.current_user.should be_nil }
|
63
|
+
it { Post.current_user.should be_nil }
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when current book user is set' do
|
67
|
+
before{ User.current = user_1 }
|
68
|
+
it { Book.current_user.should eq user_1 }
|
69
|
+
it { Post.current_user.should be_nil }
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'when current post user is set' do
|
73
|
+
before{ Admin.current = admin_1 }
|
74
|
+
it { Book.current_user.should be_nil }
|
75
|
+
it { Post.current_user.should eq admin_1 }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe 'relations and callbacks' do
|
80
|
+
|
81
|
+
context 'when created without a user' do
|
82
|
+
before do
|
83
|
+
User.current = nil
|
84
|
+
Admin.current = nil
|
85
|
+
book.save!
|
86
|
+
post.save!
|
87
|
+
end
|
88
|
+
|
89
|
+
it { book.created_by.should be_nil }
|
90
|
+
it { book.updated_by.should be_nil }
|
91
|
+
it { post.writer.should be_nil }
|
92
|
+
it { post.editor.should be_nil }
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'when created with a user' do
|
96
|
+
before do
|
97
|
+
User.current = user_1
|
98
|
+
Admin.current = admin_1
|
99
|
+
book.save!
|
100
|
+
post.save!
|
101
|
+
end
|
102
|
+
|
103
|
+
it { book.created_by.should eq user_1 }
|
104
|
+
it { book.updated_by.should eq user_1 }
|
105
|
+
it { post.writer.should eq admin_1 }
|
106
|
+
it { post.editor.should eq admin_1 }
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when creator is manually set' do
|
110
|
+
before do
|
111
|
+
User.current = user_1
|
112
|
+
Admin.current = admin_1
|
113
|
+
book.created_by = user_2
|
114
|
+
book.save!
|
115
|
+
post.writer = admin_2
|
116
|
+
post.save!
|
117
|
+
end
|
118
|
+
|
119
|
+
it { book.created_by.should eq user_2 }
|
120
|
+
it { book.updated_by.should eq user_1 }
|
121
|
+
it { post.writer.should eq admin_2 }
|
122
|
+
it { post.editor.should eq admin_1 }
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'when updater is manually set' do
|
126
|
+
before do
|
127
|
+
User.current = user_1
|
128
|
+
Admin.current = admin_1
|
129
|
+
book.updated_by = user_2
|
130
|
+
book.save!
|
131
|
+
post.editor = admin_2
|
132
|
+
post.save!
|
133
|
+
end
|
134
|
+
|
135
|
+
it { book.created_by.should eq user_1 }
|
136
|
+
it { book.updated_by.should eq user_1 }
|
137
|
+
it { post.writer.should eq admin_1 }
|
138
|
+
it { post.editor.should eq admin_1 }
|
139
|
+
end
|
140
|
+
|
141
|
+
context 'when user has been destroyed' do
|
142
|
+
before do
|
143
|
+
User.current = user_1
|
144
|
+
Admin.current = admin_1
|
145
|
+
book.save!
|
146
|
+
post.save!
|
147
|
+
user_1.destroy
|
148
|
+
admin_1.destroy
|
149
|
+
end
|
150
|
+
|
151
|
+
it { Book.first.created_by.should be_nil }
|
152
|
+
it { Book.first.updated_by.should be_nil }
|
153
|
+
it { Post.first.writer.should be_nil }
|
154
|
+
it { Post.first.editor.should be_nil }
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Mongoid::Userstamp::UserConfig do
|
5
|
+
|
6
|
+
subject { Mongoid::Userstamp::UserConfig.new }
|
7
|
+
before { Mongoid::Userstamp.stub('config').and_return(OpenStruct.new(user_reader: :foo)) }
|
8
|
+
|
9
|
+
describe '#initialize' do
|
10
|
+
|
11
|
+
context 'with opts hash' do
|
12
|
+
subject { Mongoid::Userstamp::UserConfig.new({reader: :bar}) }
|
13
|
+
|
14
|
+
it { should be_a Mongoid::Userstamp::UserConfig }
|
15
|
+
it { subject.reader.should eq :bar }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'without opts hash' do
|
19
|
+
it { should be_a Mongoid::Userstamp::UserConfig }
|
20
|
+
it { subject.reader.should eq :foo }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|