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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODZhMzk0MmJlYTI2NDZiMzFkZDM4N2JkNzZkOTU4ZGNlMTVmMDFlZg==
4
+ ZjBmOTVmOWY3YzY2NzE4NGM3MjgwM2U5ODE1MGIzZmU2YTA1ZWM3Ng==
5
5
  data.tar.gz: !binary |-
6
- NzNiZjUxYzc3ZWNkNTc4ZDQyOGNkNTE3NmEwOGYzOGU4M2QxYWE1NQ==
6
+ M2NmYjY1MjIyNDk5ZjI2YmY3YWJlMzEyNjgyOGJjMzE4NDcyZTI3OA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NDRiMDkzOGNmYTJhY2Y4ZjljYTRiNmJmODM1Mjg2ZjliYzc2ODJhMzgwMzE2
10
- MmNiM2I5NTkzZWVjNzlhYmIxOTVjZDFmMTkzY2E5ZGI4YjMwNDNmZDJkOGE2
11
- YWQ0MzY5NDAyM2E0MTdlYjI1YzA1Y2I5MWExMmRhMzVmZTFhZDg=
9
+ OGVjMWVjYzZlMDNkMTgzOTQ4MDc5Y2I1YmI3MGRiYmNlMTYyY2Y2YzNiNzcy
10
+ MjlhZWZjMDk1ZWVkZTI5ZWNlZmE4NGU4ZDZjM2I1YjhhOGNjZGJjMDVmMTNj
11
+ YzY5ZmJhZGZkZTBjYjdkZDEzZmJhOTU3MjgzZDNlNWYwY2RiY2E=
12
12
  data.tar.gz: !binary |-
13
- OWNhNGYyMzY1NTc3NzI3ZWMwZjFhZjZlOTdkYjQwOTQxYTQxMzE1MzczY2Yy
14
- OWJiZDA4MjBmMTI0NzdjMmIzZmZkZDViN2M2NjgyY2RlMTk5NjM5MGVkZmRj
15
- MDQzODg4ODQxMDZiY2UyNTU0OGU5ODVhMDFlY2ZhN2RmZDQwOWE=
13
+ N2U4YzlmZDNkZmJhYmM4NGFiZTZhNTVhYWQzMWNiZmJiYWJhMDk4OGFkMTMz
14
+ ZTE3MTBlNjIxZTViNzYzZjM0M2Y4M2I2YjY3MzE5OTliYjkyYmZmM2M2MGIz
15
+ NmNhYmNiN2FjMTNiN2QwOWU0YzY0MzZkY2NmYTEzYjk2NzZkNmI=
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.0](https://github.com/tbpro/mongoid_userstamp/releases/tag/v0.4.0) - 2014-02-24
4
+
5
+ * Improvement
6
+ * BREAKING: Change userstamp keys to use Mongoid relations. This will change the underlying database field names, and as such will require a migration.
7
+ * BREAKING: Do not include Mongoid::Userstamp in "User" class by default.
8
+ * Mongoid::Userstamp config initializer is now optional.
9
+ * Add support for multiple user classes.
10
+ * Add class-level config override capability for both users and userstamped model classes.
11
+ * Add automatic support for `RequestStore` gem as drop-in replacement for `Thread.current`
12
+ * Refactor
13
+ * DEPRECATION: `created_column` config is now `created_name`
14
+ * DEPRECATION: `created_updated` config is now `created_updated`
15
+ * DEPRECATION: `user_model` config is no longer used. Instead, include Mongoid::Userstamp::User in your user model.
16
+ * Substantial refactoring of all classes and test cases. Among other changes, all access to `Thread.current` variables is now done in the Mongoid::Userstamp module singleton.
17
+
3
18
  ## [0.3.2](https://github.com/tbpro/mongoid_userstamp/releases/tag/v0.3.2) - 2014-01-12
4
19
 
5
20
  * Fix bad gem release
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
- # MongoidUserstamp [![Build Status](https://secure.travis-ci.org/tbpro/mongoid_userstamp.png)](https://travis-ci.org/tbpro/mongoid_userstamp) [![Code Climate](https://codeclimate.com/github/tbpro/mongoid_userstamp.png)](https://codeclimate.com/github/tbpro/mongoid_userstamp)
1
+ # Mongoid::Userstamp [![Build Status](https://secure.travis-ci.org/tbpro/mongoid_userstamp.png)](https://travis-ci.org/tbpro/mongoid_userstamp) [![Code Climate](https://codeclimate.com/github/tbpro/mongoid_userstamp.png)](https://codeclimate.com/github/tbpro/mongoid_userstamp)
2
2
 
3
- MongoidUserstamp adds stamp columns for created by and updated by
3
+ Mongoid::Userstamp adds stamp columns for created by and updated by
4
4
  information within Rails applications using Mongoid ORM.
5
5
 
6
6
  ## Version Support
7
7
 
8
- MongoidUserstamp is tested on the following versions:
8
+ Mongoid::Userstamp is tested on the following versions:
9
9
 
10
10
  * Ruby 1.9.3 and 2.0.0
11
11
  * Rails 3
@@ -19,59 +19,124 @@ MongoidUserstamp is tested on the following versions:
19
19
 
20
20
  ## Usage
21
21
 
22
+ Mongoid::Userstamp does the following:
23
+ * Defines Mongoid `belongs_to` relations to the user class for `created_by` and `updated_by` on each class where `Mongoid::Userstamp` is included
24
+ * Automatically tracks the current user via a `before_filter` (see Rails Integration below)
25
+ * Sets the `created_by` and `updated_by` values in `before_save` and `before_update` callbacks respectively on the target models.
26
+ * Adds methods to the user class to check for the current user.
27
+
22
28
  ```ruby
23
- # Default config
29
+ # Default config (optional unless you want to customize the values)
24
30
  Mongoid::Userstamp.config do |c|
25
-
26
- # Default config values
27
-
28
31
  c.user_reader = :current_user
29
- c.user_model = :user
30
-
31
- c.created_column = :created_by
32
- c.created_accessor = :creator
33
-
34
- c.updated_column = :updated_by
35
- c.updated_accessor = :updater
36
-
37
- # Optional config values
38
-
39
- # c.created_alias = :c
40
- # c.updated_alias = :u
32
+ c.created_name = :created_by
33
+ c.updated_name = :updated_by
41
34
  end
42
35
 
43
- # Example model
44
- class Person
36
+ # Example model class
37
+ class Product
45
38
  include Mongoid::Document
46
39
  include Mongoid::Userstamp
40
+
41
+ # optional class-level config override
42
+ # mongoid_userstamp user_model: 'MyUser',
43
+ # created_name: :creator,
44
+ # updated_name: :updater,
47
45
  end
48
46
 
47
+ # Example user class (you can skip this step you have a single user class is named "User")
48
+ class MyUser
49
+ include Mongoid::Document
50
+ include Mongoid::Userstamp::User
51
+
52
+ # optional class-level config override
53
+ # mongoid_userstamp_user reader: :current_my_user
54
+ end
55
+
49
56
  # Create instance
50
- p = Person.create
57
+ p = Product.create
51
58
 
52
- # Updater ObjectID or nil
53
- p.updated_by
59
+ # Creator ObjectID | Updater ObjectID
60
+ p.created_by_id | p.updated_by_id
54
61
  # => BSON::ObjectId('4f7c719f476da850ba000039')
55
62
 
56
- # Updater instance or nil
57
- p.updater
63
+ # Creator instance | Updater instance
64
+ p.created_by | p.updated_by
58
65
  # => <User _id: 4f7c719f476da850ba000039>
59
66
 
60
- # Set updater manually (usually not required)
61
- p.updater = my_user # can be a Mongoid::Document or a BSON::ObjectID
62
- # => sets updated_by to my_user's ObjectID
67
+ # Set creator/updater manually (usually not required)
68
+ p.created_by = MyUser.where(name: 'Will Smith')
69
+ p.updated_by = MyUser.where(name: 'DJ Jazzy Jeff')
70
+ ```
63
71
 
64
- # Creator ObjectID or nil
65
- p.created_by
66
- # => BSON::ObjectId('4f7c719f476da850ba000039')
67
72
 
68
- # Creator instance or nil
69
- p.creator
70
- # => <User _id: 4f7c719f476da850ba000039>
73
+ ## Rails Integration
74
+
75
+ Popular Rails authentication frameworks such as Devise and Sorcery make a `current_user` method available in
76
+ your Controllers. Mongoid::Userstamp will automatically use this to set its user reference in a `before_filter`
77
+ on each request. (You can set an alternative method name via the `user_reader` config.)
78
+
79
+ *Gotcha:* If you have special controller actions which change/switch the current user to a new user, you will
80
+ need to set `User.current = new_user` after the switch occurs.
81
+
82
+
83
+ ## Thread Safety
84
+
85
+ Mongoid::Userstamp stores all-related user variables in `Thread.current`. If the
86
+ [RequestStore](https://github.com/steveklabnik/request_store) gem is installed, Mongoid::Userstamp
87
+ will automatically store variables in the `RequestStore.store` instead. RequestStore is recommended
88
+ for threaded web servers like Thin or Puma.
89
+
90
+
91
+ ## Advanced Usage: Multiple User Classes
92
+
93
+ Most Rails apps use a single user model. However, Mongoid::Userstamp supports using multiple user models
94
+ at once, and will track a separate current_user for each class.
95
+
96
+ Please note that each model may subscribe to only one user type for its userstamps, set via the
97
+ `:user_model` option.
98
+
99
+ ```ruby
100
+ class Admin
101
+ include Mongoid::Document
102
+ include Mongoid::Userstamp::User
103
+
104
+ mongoid_userstamp_user reader: :current_admin
105
+ end
106
+
107
+ class Customer
108
+ include Mongoid::Document
109
+ include Mongoid::Userstamp::User
110
+
111
+ mongoid_userstamp_user reader: :current_customer
112
+ end
113
+
114
+ class Album
115
+ include Mongoid::Document
116
+ include Mongoid::Userstamp
117
+
118
+ mongoid_userstamp user_model: 'Customer'
119
+ end
120
+
121
+ class Label
122
+ include Mongoid::Document
123
+ include Mongoid::Userstamp
124
+
125
+ mongoid_userstamp user_model: 'Admin'
126
+ end
127
+
128
+ # Set current user for each type
129
+ Admin.current = Admin.where(name: 'Biz Markie')
130
+ Customer.current = Customer.where(name: 'Sir Mix-A-Lot')
131
+
132
+ # In your Controller action
133
+ album = Album.new('Baby Got Back Single')
134
+ album.save!
135
+ album.created_by.name #=> 'Sir Mix-A-Lot'
71
136
 
72
- # Set creator manually (usually not required)
73
- p.creator = my_user # can be a Mongoid::Document or a BSON::ObjectID
74
- # => sets created_by to my_user._id
137
+ label = Label.new('Cold Chillin Records')
138
+ label.save!
139
+ label.created_by.name #=> 'Biz Markie'
75
140
  ```
76
141
 
77
142
  ## Contributing
@@ -84,6 +149,7 @@ Please use Ruby 1.9.3 hash syntax, as Mongoid 3 requires Ruby >= 1.9.3
84
149
 
85
150
  * [Thomas Boerger](http://www.tbpro.de)
86
151
  * [John Shields](https://github.com/johnnyshields)
152
+ * [Bharat Gupta](https://github.com/Bharat311)
87
153
 
88
154
  ## Copyright
89
155
 
@@ -1,88 +1,77 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module Mongoid
4
+
4
5
  module Userstamp
5
6
  extend ActiveSupport::Concern
6
7
 
7
8
  included do
8
- field Userstamp.config.updated_column, Userstamp.field_opts(Userstamp.config.updated_column_opts)
9
- field Userstamp.config.created_column, Userstamp.field_opts(Userstamp.config.created_column_opts)
9
+ Mongoid::Userstamp.add_model_class(self)
10
+ end
10
11
 
11
- before_save :set_updater
12
- before_create :set_creator
12
+ module ClassMethods
13
13
 
14
- define_method Userstamp.config.updated_accessor do
15
- Userstamp.find_user self.send(Userstamp.config.updated_column)
14
+ def mongoid_userstamp(opts = {})
15
+ mongoid_userstamp_config(opts)
16
+ self.send(:include, Mongoid::Userstamp::Model) unless self.included_modules.include?(Mongoid::Userstamp::Model)
16
17
  end
17
18
 
18
- define_method Userstamp.config.created_accessor do
19
- Userstamp.find_user self.send(Userstamp.config.created_column)
19
+ def mongoid_userstamp_config(opts = {})
20
+ @mongoid_userstamp_config ||= Mongoid::Userstamp::ModelConfig.new(opts)
20
21
  end
22
+ end
21
23
 
22
- define_method "#{Userstamp.config.updated_accessor}=" do |user|
23
- self.send("#{Userstamp.config.updated_column}=", Userstamp.extract_bson_id(user))
24
- end
24
+ class << self
25
25
 
26
- define_method "#{Userstamp.config.created_accessor}=" do |user|
27
- self.send("#{Userstamp.config.created_column}=", Userstamp.extract_bson_id(user))
26
+ def config(&block)
27
+ @config ||= Mongoid::Userstamp::GemConfig.new(&block)
28
28
  end
29
29
 
30
- protected
30
+ # @deprecated
31
+ def configure(&block)
32
+ warn 'Mongoid::Userstamp.configure is deprecated. Please use Mongoid::Userstamp.config instead'
33
+ config(&block)
34
+ end
31
35
 
32
- def set_updater
33
- return if !Userstamp.has_current_user?
34
- self.send("#{Userstamp.config.updated_accessor}=", Userstamp.current_user)
36
+ def current_user(user_class = nil)
37
+ user_class ||= user_classes.first
38
+ store[userstamp_key(user_class)]
35
39
  end
36
40
 
37
- def set_creator
38
- return if !Userstamp.has_current_user? || self.send(Userstamp.config.created_column)
39
- self.send("#{Userstamp.config.created_accessor}=", Userstamp.current_user)
41
+ def current_user=(value)
42
+ set_current_user(value)
40
43
  end
41
- end
42
44
 
43
- class << self
44
- def config(&block)
45
- if block_given?
46
- @@config = Userstamp::Config.new(&block)
47
- else
48
- @@config ||= Userstamp::Config.new
49
- end
45
+ # It is better to provide the user class, in case the value is nil.
46
+ def set_current_user(value, user_class = nil)
47
+ user_class ||= value ? value.class : user_classes.first
48
+ store[userstamp_key(user_class)] = value
50
49
  end
51
50
 
52
- # DEPRECATED
53
- def configure(&block)
54
- warn 'Mongoid::Userstamp.configure is deprecated. Please use Mongoid::Userstamp.config instead'
55
- config(block)
51
+ def model_classes
52
+ (@model_classes || []).map{|c| c.is_a?(Class) ? c : c.to_s.classify.constantize }
56
53
  end
57
54
 
58
- def field_opts(opts)
59
- {type: ::Moped::BSON::ObjectId}.reverse_merge(opts || {})
55
+ def add_model_class(model)
56
+ @model_classes ||= []
57
+ @model_classes << model
60
58
  end
61
59
 
62
- def has_current_user?
63
- config.user_model.respond_to?(:current)
60
+ def user_classes
61
+ (@user_classes || []).map{|c| c.is_a?(Class) ? c : c.to_s.classify.constantize }
64
62
  end
65
63
 
66
- def current_user
67
- config.user_model.try(:current)
64
+ def add_user_class(user)
65
+ @user_classes ||= []
66
+ @user_classes << user
68
67
  end
69
68
 
70
- def extract_bson_id(value)
71
- if value.respond_to?(:_id)
72
- value.try(:_id)
73
- elsif value.present?
74
- ::Moped::BSON::ObjectId.from_string(value.to_s)
75
- else
76
- nil
77
- end
69
+ def userstamp_key(model)
70
+ "mongoid_userstamp/#{model.to_s.underscore}".to_sym
78
71
  end
79
72
 
80
- def find_user(user_id)
81
- begin
82
- user_id ? Userstamp.config.user_model.unscoped.find(user_id) : nil
83
- rescue Mongoid::Errors::DocumentNotFound => e
84
- nil
85
- end
73
+ def store
74
+ defined?(RequestStore) ? RequestStore.store : Thread.current
86
75
  end
87
76
  end
88
77
  end
@@ -0,0 +1,38 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Mongoid
4
+ module Userstamp
5
+
6
+ class GemConfig
7
+
8
+ attr_accessor :created_name
9
+ attr_accessor :updated_name
10
+ attr_accessor :user_reader
11
+
12
+ def initialize(&block)
13
+ @created_name = :created_by
14
+ @updated_name = :updated_by
15
+ @user_reader = :current_user
16
+
17
+ instance_eval(&block) if block_given?
18
+ end
19
+
20
+ # @deprecated
21
+ def user_model=(value)
22
+ warn 'Mongoid::Userstamp `user_model` config is removed as of v0.4.0. If using a model named other than `User`, please include `Mongoid::Userstamp::User` in your user model instead.'
23
+ end
24
+
25
+ # @deprecated
26
+ def created_column=(value)
27
+ warn 'Mongoid::Userstamp `created_column` is deprecated as of v0.4.0. Please use `created_name` instead.'
28
+ @created_name = value
29
+ end
30
+
31
+ # @deprecated
32
+ def updated_column=(value)
33
+ warn 'Mongoid::Userstamp `created_column` is deprecated as of v0.4.0. Please use `created_name` instead.'
34
+ @updated_name = value
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Mongoid
4
+ module Userstamp
5
+
6
+ class ModelConfig
7
+
8
+ def initialize(opts = {})
9
+ @user_model = opts.delete(:user_model)
10
+ @created_name = opts.delete(:created_name)
11
+ @updated_name = opts.delete(:updated_name)
12
+ end
13
+
14
+ def user_model
15
+ @user_model || Mongoid::Userstamp.user_classes.first
16
+ end
17
+
18
+ def created_name
19
+ @created_name || Mongoid::Userstamp.config.created_name
20
+ end
21
+
22
+ def updated_name
23
+ @updated_name || Mongoid::Userstamp.config.updated_name
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Mongoid
4
+ module Userstamp
5
+
6
+ class UserConfig
7
+
8
+ def initialize(opts = {})
9
+ @reader = opts.delete(:reader)
10
+ end
11
+
12
+ def reader
13
+ @reader || Mongoid::Userstamp.config.user_reader
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,41 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Mongoid
4
+ module Userstamp
5
+
6
+ module Model
7
+
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+
12
+ belongs_to mongoid_userstamp_config.created_name, class_name: mongoid_userstamp_config.user_model, inverse_of: nil
13
+ belongs_to mongoid_userstamp_config.updated_name, class_name: mongoid_userstamp_config.user_model, inverse_of: nil
14
+
15
+ before_create :set_created_by
16
+ before_save :set_updated_by
17
+
18
+ protected
19
+
20
+ def set_created_by
21
+ current_user = Mongoid::Userstamp.current_user(self.class.mongoid_userstamp_config.user_model)
22
+ return if current_user.blank? || self.send(self.class.mongoid_userstamp_config.created_name)
23
+ self.send("#{self.class.mongoid_userstamp_config.created_name}=", current_user)
24
+ end
25
+
26
+ def set_updated_by
27
+ current_user = Mongoid::Userstamp.current_user(self.class.mongoid_userstamp_config.user_model)
28
+ return if current_user.blank?
29
+ self.send("#{self.class.mongoid_userstamp_config.updated_name}=", current_user)
30
+ end
31
+ end
32
+
33
+ module ClassMethods
34
+
35
+ def current_user
36
+ Mongoid::Userstamp.current_user(mongoid_userstamp_config.user_model)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end