Commit 2827fff7c76aa180de0323ab2b99339fe4e71cf9
Exists in
master
and in
9 other branches
Merge branch 'global-user' into 'master'
Global thread-safe current user for models use See merge request !362
Showing
30 changed files
with
122 additions
and
587 deletions
Show diff stats
app/models/user.rb
| ... | ... | @@ -15,6 +15,14 @@ class User < ActiveRecord::Base |
| 15 | 15 | :email => {:label => _('Email'), :weight => 5}, |
| 16 | 16 | } |
| 17 | 17 | |
| 18 | + # see http://stackoverflow.com/a/2513456/670229 | |
| 19 | + def self.current | |
| 20 | + Thread.current[:current_user] | |
| 21 | + end | |
| 22 | + def self.current=(user) | |
| 23 | + Thread.current[:current_user] = user | |
| 24 | + end | |
| 25 | + | |
| 18 | 26 | def self.[](login) |
| 19 | 27 | self.find_by_login(login) |
| 20 | 28 | end | ... | ... |
config/initializers/action_tracker.rb
lib/authenticated_system.rb
| 1 | 1 | module AuthenticatedSystem |
| 2 | + | |
| 2 | 3 | protected |
| 4 | + | |
| 5 | + # See impl. from http://stackoverflow.com/a/2513456/670229 | |
| 6 | + def self.included? base | |
| 7 | + base.around_filter do | |
| 8 | + begin | |
| 9 | + User.current = current_user | |
| 10 | + yield | |
| 11 | + ensure | |
| 12 | + # to address the thread variable leak issues in Puma/Thin webserver | |
| 13 | + User.current = nil | |
| 14 | + end | |
| 15 | + end | |
| 16 | + end | |
| 17 | + | |
| 3 | 18 | # Returns true or false if the user is logged in. |
| 4 | 19 | # Preloads @current_user with the user model if they're logged in. |
| 5 | 20 | def logged_in? |
| ... | ... | @@ -8,7 +23,9 @@ module AuthenticatedSystem |
| 8 | 23 | |
| 9 | 24 | # Accesses the current user from the session. |
| 10 | 25 | def current_user |
| 11 | - @current_user ||= (session[:user] && User.find_by_id(session[:user])) || nil | |
| 26 | + @current_user ||= begin | |
| 27 | + User.current = (session[:user] && User.find_by_id(session[:user])) || nil | |
| 28 | + end | |
| 12 | 29 | end |
| 13 | 30 | |
| 14 | 31 | # Store the given user in the session. |
| ... | ... | @@ -19,7 +36,7 @@ module AuthenticatedSystem |
| 19 | 36 | session[:user] = new_user.id |
| 20 | 37 | new_user.register_login |
| 21 | 38 | end |
| 22 | - @current_user = new_user | |
| 39 | + @current_user = User.current = new_user | |
| 23 | 40 | end |
| 24 | 41 | |
| 25 | 42 | # Check if the user is authorized. | ... | ... |
test/action_tracker_test_helper.rb
test/functional/profile_controller_test.rb
| ... | ... | @@ -703,13 +703,13 @@ class ProfileControllerTest < ActionController::TestCase |
| 703 | 703 | p1= create_user.person |
| 704 | 704 | p2= create_user.person |
| 705 | 705 | |
| 706 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p1) | |
| 706 | + User.current = p1.user | |
| 707 | 707 | scrap1 = create(Scrap, defaults_for_scrap(:sender => p1, :receiver => p2)) |
| 708 | 708 | |
| 709 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
| 709 | + User.current = p2.user | |
| 710 | 710 | scrap2 = create(Scrap, defaults_for_scrap(:sender => p2, :receiver => p1)) |
| 711 | 711 | |
| 712 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p1) | |
| 712 | + User.current = p1.user | |
| 713 | 713 | create(TinyMceArticle, :profile => p1, :name => 'An article about free software') |
| 714 | 714 | a1 = ActionTracker::Record.last |
| 715 | 715 | |
| ... | ... | @@ -738,10 +738,10 @@ class ProfileControllerTest < ActionController::TestCase |
| 738 | 738 | scrap1 = create(Scrap, defaults_for_scrap(:sender => p2, :receiver => p3)) |
| 739 | 739 | scrap2 = create(Scrap, defaults_for_scrap(:sender => p2, :receiver => profile)) |
| 740 | 740 | |
| 741 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p3) | |
| 741 | + User.current = p3.user | |
| 742 | 742 | article1 = TinyMceArticle.create!(:profile => p3, :name => 'An article about free software') |
| 743 | 743 | |
| 744 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
| 744 | + User.current = p2.user | |
| 745 | 745 | article2 = TinyMceArticle.create!(:profile => p2, :name => 'Another article about free software') |
| 746 | 746 | |
| 747 | 747 | login_as(profile.identifier) |
| ... | ... | @@ -761,15 +761,15 @@ class ProfileControllerTest < ActionController::TestCase |
| 761 | 761 | |
| 762 | 762 | ActionTracker::Record.delete_all |
| 763 | 763 | |
| 764 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p1) | |
| 764 | + User.current = p1.user | |
| 765 | 765 | create(Scrap,defaults_for_scrap(:sender => p1, :receiver => p1)) |
| 766 | 766 | a1 = ActionTracker::Record.last |
| 767 | 767 | |
| 768 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
| 768 | + User.current = p2.user | |
| 769 | 769 | create(Scrap, defaults_for_scrap(:sender => p2, :receiver => p3)) |
| 770 | 770 | a2 = ActionTracker::Record.last |
| 771 | 771 | |
| 772 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p3) | |
| 772 | + User.current = p3.user | |
| 773 | 773 | create(Scrap, defaults_for_scrap(:sender => p3, :receiver => p1)) |
| 774 | 774 | a3 = ActionTracker::Record.last |
| 775 | 775 | |
| ... | ... | @@ -791,15 +791,15 @@ class ProfileControllerTest < ActionController::TestCase |
| 791 | 791 | |
| 792 | 792 | ActionTracker::Record.delete_all |
| 793 | 793 | |
| 794 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p1) | |
| 794 | + User.current = p1.user | |
| 795 | 795 | create(Scrap, defaults_for_scrap(:sender => p1, :receiver => p1)) |
| 796 | 796 | a1 = ActionTracker::Record.last |
| 797 | 797 | |
| 798 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
| 798 | + User.current = p2.user | |
| 799 | 799 | create(Scrap, defaults_for_scrap(:sender => p2, :receiver => p3)) |
| 800 | 800 | a2 = ActionTracker::Record.last |
| 801 | 801 | |
| 802 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p3) | |
| 802 | + User.current = p3.user | |
| 803 | 803 | create(Scrap, defaults_for_scrap(:sender => p3, :receiver => p1)) |
| 804 | 804 | a3 = ActionTracker::Record.last |
| 805 | 805 | |
| ... | ... | @@ -833,10 +833,10 @@ class ProfileControllerTest < ActionController::TestCase |
| 833 | 833 | ActionTracker::Record.destroy_all |
| 834 | 834 | create(Scrap, defaults_for_scrap(:sender => p1, :receiver => p1)) |
| 835 | 835 | a1 = ActionTracker::Record.last |
| 836 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
| 836 | + User.current = p2.user | |
| 837 | 837 | create(Scrap, defaults_for_scrap(:sender => p2, :receiver => p3)) |
| 838 | 838 | a2 = ActionTracker::Record.last |
| 839 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p3) | |
| 839 | + User.current = p3.user | |
| 840 | 840 | create(Scrap, defaults_for_scrap(:sender => p3, :receiver => p1)) |
| 841 | 841 | a3 = ActionTracker::Record.last |
| 842 | 842 | |
| ... | ... | @@ -868,7 +868,7 @@ class ProfileControllerTest < ActionController::TestCase |
| 868 | 868 | ActionTracker::Record.destroy_all |
| 869 | 869 | create(Article, :name => 'a', :profile_id => community.id) |
| 870 | 870 | create(Article, :name => 'b', :profile_id => community.id) |
| 871 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
| 871 | + User.current = p2.user | |
| 872 | 872 | create(Article, :name => 'c', :profile_id => community.id) |
| 873 | 873 | process_delayed_job_queue |
| 874 | 874 | |
| ... | ... | @@ -895,10 +895,10 @@ class ProfileControllerTest < ActionController::TestCase |
| 895 | 895 | ActionTracker::Record.destroy_all |
| 896 | 896 | create(Scrap, defaults_for_scrap(:sender => p1, :receiver => p1)) |
| 897 | 897 | a1 = ActionTracker::Record.last |
| 898 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p2) | |
| 898 | + User.current = p2.user | |
| 899 | 899 | create(Scrap, defaults_for_scrap(:sender => p2, :receiver => p3)) |
| 900 | 900 | a2 = ActionTracker::Record.last |
| 901 | - UserStampSweeper.any_instance.stubs(:current_user).returns(p3) | |
| 901 | + User.current = p3.user | |
| 902 | 902 | create(Scrap, defaults_for_scrap(:sender => p3, :receiver => p1)) |
| 903 | 903 | a3 = ActionTracker::Record.last |
| 904 | 904 | |
| ... | ... | @@ -1317,7 +1317,7 @@ class ProfileControllerTest < ActionController::TestCase |
| 1317 | 1317 | another_person = fast_create(Person) |
| 1318 | 1318 | create(Scrap, defaults_for_scrap(:sender => another_person, :receiver => profile, :content => 'A scrap')) |
| 1319 | 1319 | |
| 1320 | - UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | |
| 1320 | + User.current = profile.user | |
| 1321 | 1321 | ActionTracker::Record.destroy_all |
| 1322 | 1322 | TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') |
| 1323 | 1323 | |
| ... | ... | @@ -1332,7 +1332,7 @@ class ProfileControllerTest < ActionController::TestCase |
| 1332 | 1332 | another_person = fast_create(Person) |
| 1333 | 1333 | scrap = create(Scrap, defaults_for_scrap(:sender => another_person, :receiver => profile, :content => 'A scrap')) |
| 1334 | 1334 | |
| 1335 | - UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | |
| 1335 | + User.current = profile.user | |
| 1336 | 1336 | ActionTracker::Record.destroy_all |
| 1337 | 1337 | TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') |
| 1338 | 1338 | activity = ActionTracker::Record.last |
| ... | ... | @@ -1380,7 +1380,7 @@ class ProfileControllerTest < ActionController::TestCase |
| 1380 | 1380 | end |
| 1381 | 1381 | |
| 1382 | 1382 | should 'display comment in wall if user was removed after click in view all comments' do |
| 1383 | - UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | |
| 1383 | + User.current = profile.user | |
| 1384 | 1384 | article = TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') |
| 1385 | 1385 | to_be_removed = create_user('removed_user').person |
| 1386 | 1386 | comment = create(Comment, :author => to_be_removed, :title => 'Test Comment', :body => 'My author does not exist =(', :source_id => article.id, :source_type => 'Article') |
| ... | ... | @@ -1397,7 +1397,7 @@ class ProfileControllerTest < ActionController::TestCase |
| 1397 | 1397 | end |
| 1398 | 1398 | |
| 1399 | 1399 | should 'not display spam comments in wall' do |
| 1400 | - UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | |
| 1400 | + User.current = profile.user | |
| 1401 | 1401 | article = TinyMceArticle.create!(:profile => profile, :name => 'An article about spam\'s nutritional attributes') |
| 1402 | 1402 | comment = create(Comment, :author => profile, :title => 'Test Comment', :body => 'This article makes me hungry', :source_id => article.id, :source_type => 'Article') |
| 1403 | 1403 | comment.spam! |
| ... | ... | @@ -1408,7 +1408,7 @@ class ProfileControllerTest < ActionController::TestCase |
| 1408 | 1408 | end |
| 1409 | 1409 | |
| 1410 | 1410 | should 'display comment in wall from non logged users after click in view all comments' do |
| 1411 | - UserStampSweeper.any_instance.stubs(:current_user).returns(profile) | |
| 1411 | + User.current = profile.user | |
| 1412 | 1412 | article = TinyMceArticle.create!(:profile => profile, :name => 'An article about free software') |
| 1413 | 1413 | comment = create(Comment, :name => 'outside user', :email => 'outside@localhost.localdomain', :title => 'Test Comment', :body => 'My author does not exist =(', :source_id => article.id, :source_type => 'Article') |
| 1414 | 1414 | ... | ... |
test/test_helper.rb
test/unit/action_tracker_notification_test.rb
| ... | ... | @@ -89,7 +89,7 @@ class ActionTrackerNotificationTest < ActiveSupport::TestCase |
| 89 | 89 | end |
| 90 | 90 | |
| 91 | 91 | should "have comments through article action_tracker" do |
| 92 | - person = fast_create(Person) | |
| 92 | + person = create_user.person | |
| 93 | 93 | article = create(TextileArticle, :profile_id => person.id) |
| 94 | 94 | process_delayed_job_queue |
| 95 | 95 | notification = ActionTrackerNotification.last | ... | ... |
test/unit/article_test.rb
| ... | ... | @@ -985,12 +985,12 @@ class ArticleTest < ActiveSupport::TestCase |
| 985 | 985 | |
| 986 | 986 | should 'track action when a published article is created in a community' do |
| 987 | 987 | community = fast_create(Community) |
| 988 | - p1 = fast_create(Person) | |
| 989 | - p2 = fast_create(Person) | |
| 990 | - p3 = fast_create(Person) | |
| 988 | + p1 = create_user.person | |
| 989 | + p2 = create_user.person | |
| 990 | + p3 = create_user.person | |
| 991 | 991 | community.add_member(p1) |
| 992 | 992 | community.add_member(p2) |
| 993 | - UserStampSweeper.any_instance.expects(:current_user).returns(p1).at_least_once | |
| 993 | + User.current = p1.user | |
| 994 | 994 | |
| 995 | 995 | article = create(TinyMceArticle, :profile_id => community.id) |
| 996 | 996 | activity = article.activity |
| ... | ... | @@ -1085,11 +1085,11 @@ class ArticleTest < ActiveSupport::TestCase |
| 1085 | 1085 | end |
| 1086 | 1086 | |
| 1087 | 1087 | should 'create the notification to organization and all organization members' do |
| 1088 | - Profile.delete_all | |
| 1089 | - ActionTracker::Record.delete_all | |
| 1088 | + Profile.destroy_all | |
| 1089 | + ActionTracker::Record.destroy_all | |
| 1090 | 1090 | |
| 1091 | 1091 | community = fast_create(Community) |
| 1092 | - member_1 = fast_create(Person) | |
| 1092 | + member_1 = create_user.person | |
| 1093 | 1093 | community.add_member(member_1) |
| 1094 | 1094 | |
| 1095 | 1095 | article = create TinyMceArticle, :name => 'Tracked Article 1', :profile_id => community.id |
| ... | ... | @@ -1116,7 +1116,7 @@ class ArticleTest < ActiveSupport::TestCase |
| 1116 | 1116 | Article.destroy_all |
| 1117 | 1117 | ActionTracker::Record.destroy_all |
| 1118 | 1118 | ActionTrackerNotification.destroy_all |
| 1119 | - UserStampSweeper.any_instance.expects(:current_user).returns(profile).at_least_once | |
| 1119 | + User.current = profile.user | |
| 1120 | 1120 | article = create(TinyMceArticle, :profile_id => profile.id) |
| 1121 | 1121 | |
| 1122 | 1122 | process_delayed_job_queue |
| ... | ... | @@ -1127,7 +1127,7 @@ class ArticleTest < ActiveSupport::TestCase |
| 1127 | 1127 | f1 = fast_create(Person) |
| 1128 | 1128 | profile.add_friend(f1) |
| 1129 | 1129 | |
| 1130 | - UserStampSweeper.any_instance.expects(:current_user).returns(profile).at_least_once | |
| 1130 | + User.current = profile.user | |
| 1131 | 1131 | article = create TinyMceArticle, :name => 'Tracked Article 1', :profile_id => profile.id |
| 1132 | 1132 | assert_equal 1, ActionTracker::Record.find_all_by_verb('create_article').count |
| 1133 | 1133 | process_delayed_job_queue |
| ... | ... | @@ -1147,7 +1147,7 @@ class ArticleTest < ActiveSupport::TestCase |
| 1147 | 1147 | Article.destroy_all |
| 1148 | 1148 | ActionTracker::Record.destroy_all |
| 1149 | 1149 | ActionTrackerNotification.destroy_all |
| 1150 | - UserStampSweeper.any_instance.expects(:current_user).returns(profile).at_least_once | |
| 1150 | + User.current = profile.user | |
| 1151 | 1151 | article = create(TinyMceArticle, :profile_id => profile.id) |
| 1152 | 1152 | activity = article.activity |
| 1153 | 1153 | |
| ... | ... | @@ -1165,11 +1165,11 @@ class ArticleTest < ActiveSupport::TestCase |
| 1165 | 1165 | |
| 1166 | 1166 | should 'destroy action_tracker and notifications when an article is destroyed in a community' do |
| 1167 | 1167 | community = fast_create(Community) |
| 1168 | - p1 = fast_create(Person) | |
| 1169 | - p2 = fast_create(Person) | |
| 1168 | + p1 = create_user.person | |
| 1169 | + p2 = create_user.person | |
| 1170 | 1170 | community.add_member(p1) |
| 1171 | 1171 | community.add_member(p2) |
| 1172 | - UserStampSweeper.any_instance.expects(:current_user).returns(p1).at_least_once | |
| 1172 | + User.current = p1.user | |
| 1173 | 1173 | |
| 1174 | 1174 | article = create(TinyMceArticle, :profile_id => community.id) |
| 1175 | 1175 | activity = article.activity | ... | ... |
test/unit/comment_test.rb
| ... | ... | @@ -286,7 +286,7 @@ class CommentTest < ActiveSupport::TestCase |
| 286 | 286 | end |
| 287 | 287 | |
| 288 | 288 | should "return activities comments as a thread" do |
| 289 | - person = fast_create(Person) | |
| 289 | + person = create_user.person | |
| 290 | 290 | a = TextileArticle.create!(:profile => person, :name => 'My article', :body => 'Article body') |
| 291 | 291 | c0 = Comment.create!(:source => a, :body => 'My comment', :author => person) |
| 292 | 292 | c1 = Comment.create!(:reply_of_id => c0.id, :source => a, :body => 'bla', :author => person) |
| ... | ... | @@ -302,7 +302,7 @@ class CommentTest < ActiveSupport::TestCase |
| 302 | 302 | end |
| 303 | 303 | |
| 304 | 304 | should "return activities comments when some comment on thread is spam and not display its replies" do |
| 305 | - person = fast_create(Person) | |
| 305 | + person = create_user.person | |
| 306 | 306 | a = TextileArticle.create!(:profile => person, :name => 'My article', :body => 'Article body') |
| 307 | 307 | c0 = Comment.create(:source => a, :body => 'Root comment', :author => person) |
| 308 | 308 | c1 = Comment.create(:reply_of_id => c0.id, :source => a, :body => 'c1', :author => person) | ... | ... |
test/unit/community_test.rb
| ... | ... | @@ -301,8 +301,8 @@ class CommunityTest < ActiveSupport::TestCase |
| 301 | 301 | ActionTrackerNotification.delete_all |
| 302 | 302 | p1 = Person.first |
| 303 | 303 | community = fast_create(Community) |
| 304 | - p2 = fast_create(Person) | |
| 305 | - p3 = fast_create(Person) | |
| 304 | + p2 = create_user.person | |
| 305 | + p3 = create_user.person | |
| 306 | 306 | community.add_member(p3) |
| 307 | 307 | article = create(TextileArticle, :profile_id => community.id) |
| 308 | 308 | time = article.activity.updated_at + 1.day |
| ... | ... | @@ -372,10 +372,10 @@ class CommunityTest < ActiveSupport::TestCase |
| 372 | 372 | end |
| 373 | 373 | |
| 374 | 374 | should 'return tracked_actions of community as activities' do |
| 375 | - person = fast_create(Person) | |
| 375 | + person = create_user.person | |
| 376 | 376 | community = fast_create(Community) |
| 377 | 377 | |
| 378 | - UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
| 378 | + User.current = person.user | |
| 379 | 379 | assert_difference 'ActionTracker::Record.count', 1 do |
| 380 | 380 | article = create(TinyMceArticle, :profile => community, :name => 'An article about free software') |
| 381 | 381 | assert_equal [article.activity], community.activities.map { |a| a.klass.constantize.find(a.id) } |
| ... | ... | @@ -387,7 +387,7 @@ class CommunityTest < ActiveSupport::TestCase |
| 387 | 387 | community = fast_create(Community) |
| 388 | 388 | community2 = fast_create(Community) |
| 389 | 389 | |
| 390 | - UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
| 390 | + User.current = person.user | |
| 391 | 391 | article = create(TinyMceArticle, :profile => community2, :name => 'Another article about free software') |
| 392 | 392 | |
| 393 | 393 | assert_not_includes community.activities.map { |a| a.klass.constantize.find(a.id) }, article.activity | ... | ... |
test/unit/enterprise_test.rb
| ... | ... | @@ -475,7 +475,7 @@ class EnterpriseTest < ActiveSupport::TestCase |
| 475 | 475 | person = fast_create(Person) |
| 476 | 476 | enterprise = fast_create(Enterprise) |
| 477 | 477 | |
| 478 | - UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
| 478 | + User.current = person.user | |
| 479 | 479 | article = create(TinyMceArticle, :profile => enterprise, :name => 'An article about free software') |
| 480 | 480 | |
| 481 | 481 | assert_equal [article.activity], enterprise.activities.map { |a| a.klass.constantize.find(a.id) } |
| ... | ... | @@ -486,7 +486,7 @@ class EnterpriseTest < ActiveSupport::TestCase |
| 486 | 486 | enterprise = fast_create(Enterprise) |
| 487 | 487 | enterprise2 = fast_create(Enterprise) |
| 488 | 488 | |
| 489 | - UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
| 489 | + User.current = person.user | |
| 490 | 490 | article = create(TinyMceArticle, :profile => enterprise2, :name => 'Another article about free software') |
| 491 | 491 | |
| 492 | 492 | assert_not_includes enterprise.activities.map { |a| a.klass.constantize.find(a.id) }, article.activity | ... | ... |
test/unit/person_test.rb
| ... | ... | @@ -1249,9 +1249,9 @@ class PersonTest < ActiveSupport::TestCase |
| 1249 | 1249 | person = create_user.person |
| 1250 | 1250 | another_person = create_user.person |
| 1251 | 1251 | |
| 1252 | - UserStampSweeper.any_instance.stubs(:current_user).returns(another_person) | |
| 1252 | + User.current = another_person.user | |
| 1253 | 1253 | scrap = create(Scrap, defaults_for_scrap(:sender => another_person, :receiver => person, :content => 'A scrap')) |
| 1254 | - UserStampSweeper.any_instance.expects(:current_user).returns(person).at_least_once | |
| 1254 | + User.current = person.user | |
| 1255 | 1255 | article = create(TinyMceArticle, :profile => person, :name => 'An article about free software') |
| 1256 | 1256 | |
| 1257 | 1257 | assert_equivalent [scrap,article.activity], person.activities.map { |a| a.klass.constantize.find(a.id) } |
| ... | ... | @@ -1259,17 +1259,17 @@ class PersonTest < ActiveSupport::TestCase |
| 1259 | 1259 | |
| 1260 | 1260 | should 'not return tracked_actions and scraps from others as activities' do |
| 1261 | 1261 | ActionTracker::Record.destroy_all |
| 1262 | - person = fast_create(Person) | |
| 1263 | - another_person = fast_create(Person) | |
| 1262 | + person = create_user.person | |
| 1263 | + another_person = create_user.person | |
| 1264 | 1264 | |
| 1265 | 1265 | person_scrap = create(Scrap, defaults_for_scrap(:sender => person, :receiver => person, :content => 'A scrap from person')) |
| 1266 | 1266 | another_person_scrap = create(Scrap, defaults_for_scrap(:sender => another_person, :receiver => another_person, :content => 'A scrap from another person')) |
| 1267 | 1267 | |
| 1268 | - UserStampSweeper.any_instance.stubs(:current_user).returns(another_person) | |
| 1268 | + User.current = another_person.user | |
| 1269 | 1269 | create(TinyMceArticle, :profile => another_person, :name => 'An article about free software from another person') |
| 1270 | 1270 | another_person_activity = ActionTracker::Record.last |
| 1271 | 1271 | |
| 1272 | - UserStampSweeper.any_instance.stubs(:current_user).returns(person) | |
| 1272 | + User.current = person.user | |
| 1273 | 1273 | create(TinyMceArticle, :profile => person, :name => 'An article about free software') |
| 1274 | 1274 | person_activity = ActionTracker::Record.last |
| 1275 | 1275 | ... | ... |
test/unit/textile_article_test.rb
| 1 | 1 | require_relative "../test_helper" |
| 2 | 2 | |
| 3 | 3 | class TextileArticleTest < ActiveSupport::TestCase |
| 4 | - | |
| 4 | + | |
| 5 | 5 | def setup |
| 6 | 6 | @profile = create_user('testing').person |
| 7 | - ActionTracker::Record.stubs(:current_user_from_model).returns(fast_create(Person)) | |
| 8 | 7 | end |
| 9 | 8 | attr_reader :profile |
| 10 | 9 | |
| ... | ... | @@ -128,7 +127,7 @@ class TextileArticleTest < ActiveSupport::TestCase |
| 128 | 127 | assert_equal true, a.notifiable? |
| 129 | 128 | assert_equal true, a.advertise? |
| 130 | 129 | assert_equal true, a.is_trackable? |
| 131 | - | |
| 130 | + | |
| 132 | 131 | a.published=false |
| 133 | 132 | assert_equal false, a.published? |
| 134 | 133 | assert_equal false, a.is_trackable? | ... | ... |
test/unit/uploaded_file_test.rb
| ... | ... | @@ -325,7 +325,6 @@ class UploadedFileTest < ActiveSupport::TestCase |
| 325 | 325 | |
| 326 | 326 | should 'group trackers activity of image\'s upload' do |
| 327 | 327 | ActionTracker::Record.delete_all |
| 328 | - ActionTracker::Record.stubs(:current_user_from_model).returns(profile) | |
| 329 | 328 | gallery = fast_create(Gallery, :profile_id => profile.id) |
| 330 | 329 | |
| 331 | 330 | image1 = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :parent => gallery, :profile => profile) | ... | ... |
vendor/plugins/action_tracker/init.rb
vendor/plugins/action_tracker/lib/action_tracker.rb
| ... | ... | @@ -5,7 +5,6 @@ module ActionTracker |
| 5 | 5 | module ControllerMethods |
| 6 | 6 | |
| 7 | 7 | def self.included(base) |
| 8 | - base.send :user_stamp, ActionTracker::Record | |
| 9 | 8 | base.send :extend, ClassMethods |
| 10 | 9 | end |
| 11 | 10 | |
| ... | ... | @@ -42,7 +41,7 @@ module ActionTracker |
| 42 | 41 | elsif keep_params.to_s == 'all' |
| 43 | 42 | stored_params = params |
| 44 | 43 | end |
| 45 | - user = send ActionTrackerConfig.current_user_method | |
| 44 | + user = send ActionTrackerConfig.current_user | |
| 46 | 45 | tracked_action = case ActionTrackerConfig.verb_type(verb) |
| 47 | 46 | when :groupable |
| 48 | 47 | Record.add_or_create :verb => verb, :user => user, :params => stored_params |
| ... | ... | @@ -90,7 +89,7 @@ module ActionTracker |
| 90 | 89 | |
| 91 | 90 | def save_action_for_verb(verb, keep_params = :all, post_proc = Proc.new{}, custom_user = nil, custom_target = nil) |
| 92 | 91 | user = self.send(custom_user) unless custom_user.blank? |
| 93 | - user ||= ActionTracker::Record.current_user_from_model | |
| 92 | + user ||= ActionTracker::Record.current_user | |
| 94 | 93 | target = self.send(custom_target) unless custom_target.blank? |
| 95 | 94 | return nil if user.nil? |
| 96 | 95 | if keep_params.is_a? Array |
| ... | ... | @@ -115,7 +114,7 @@ module ActionTracker |
| 115 | 114 | end |
| 116 | 115 | tracked_action.target = target || self |
| 117 | 116 | user.tracked_actions << tracked_action |
| 118 | - post_proc.call tracked_action.reload | |
| 117 | + post_proc.call tracked_action | |
| 119 | 118 | end |
| 120 | 119 | |
| 121 | 120 | end | ... | ... |
vendor/plugins/action_tracker/lib/action_tracker_config.rb
| ... | ... | @@ -20,12 +20,12 @@ class ActionTrackerConfig |
| 20 | 20 | verbs.keys.map(&:to_s) |
| 21 | 21 | end |
| 22 | 22 | |
| 23 | - def self.current_user_method | |
| 24 | - config[:current_user_method] || :current_user | |
| 23 | + def self.current_user | |
| 24 | + config[:current_user] || proc{ nil } | |
| 25 | 25 | end |
| 26 | 26 | |
| 27 | - def self.current_user_method=(method_name) | |
| 28 | - UserStamp.current_user_method = config[:current_user_method] = method_name | |
| 27 | + def self.current_user= block | |
| 28 | + config[:current_user] = block | |
| 29 | 29 | end |
| 30 | 30 | |
| 31 | 31 | def self.default_filter_time | ... | ... |
vendor/plugins/action_tracker/lib/action_tracker_model.rb
| ... | ... | @@ -27,14 +27,12 @@ module ActionTracker |
| 27 | 27 | scope :recent, :conditions => ['created_at >= ?', RECENT_DELAY.days.ago] |
| 28 | 28 | scope :visible, :conditions => { :visible => true } |
| 29 | 29 | |
| 30 | - def self.current_user_from_model | |
| 31 | - u = new | |
| 32 | - u.valid? | |
| 33 | - u.user | |
| 30 | + def self.current_user | |
| 31 | + ActionTrackerConfig.current_user.call | |
| 34 | 32 | end |
| 35 | 33 | |
| 36 | 34 | def self.update_or_create(params) |
| 37 | - u = params[:user] || current_user_from_model | |
| 35 | + u = params[:user] || current_user | |
| 38 | 36 | return if u.nil? |
| 39 | 37 | target_hash = params[:target].nil? ? {} : {:target_type => params[:target].class.base_class.to_s, :target_id => params[:target].id} |
| 40 | 38 | conditions = { :user_id => u.id, :user_type => u.class.base_class.to_s, :verb => params[:verb].to_s }.merge(target_hash) |
| ... | ... | @@ -44,7 +42,7 @@ module ActionTracker |
| 44 | 42 | end |
| 45 | 43 | |
| 46 | 44 | def self.add_or_create(params) |
| 47 | - u = params[:user] || current_user_from_model | |
| 45 | + u = params[:user] || current_user | |
| 48 | 46 | return if u.nil? |
| 49 | 47 | target_hash = params[:target].nil? ? {} : {:target_type => params[:target].class.base_class.to_s, :target_id => params[:target].id} |
| 50 | 48 | l = last :conditions => { :user_id => u.id, :user_type => u.class.base_class.to_s, :verb => params[:verb].to_s }.merge(target_hash) | ... | ... |
vendor/plugins/action_tracker/test/action_tracker_config_test.rb
| ... | ... | @@ -33,16 +33,6 @@ class ActionTrackerConfigTest < ActiveSupport::TestCase |
| 33 | 33 | %w(search delete login).each { |verb| assert ActionTrackerConfig.verb_names.include?(verb) } |
| 34 | 34 | end |
| 35 | 35 | |
| 36 | - def test_current_user_is_default_method | |
| 37 | - ActionTrackerConfig.config[:current_user_method] = nil | |
| 38 | - assert_equal :current_user, ActionTrackerConfig.current_user_method | |
| 39 | - end | |
| 40 | - | |
| 41 | - def test_current_user_can_be_set | |
| 42 | - ActionTrackerConfig.current_user_method = :logged_in_user | |
| 43 | - assert_equal :logged_in_user, ActionTrackerConfig.current_user_method | |
| 44 | - end | |
| 45 | - | |
| 46 | 36 | def test_default_filter_time_is_after |
| 47 | 37 | ActionTrackerConfig.config[:default_filter_time] = nil |
| 48 | 38 | assert_equal :after, ActionTrackerConfig.default_filter_time |
| ... | ... | @@ -66,7 +56,7 @@ class ActionTrackerConfigTest < ActiveSupport::TestCase |
| 66 | 56 | def test_get_verb_return_hash |
| 67 | 57 | assert_kind_of Hash, ActionTrackerConfig.get_verb(:search) |
| 68 | 58 | end |
| 69 | - | |
| 59 | + | |
| 70 | 60 | def test_get_verb_symbol_search_by_symbol |
| 71 | 61 | ActionTrackerConfig.verbs = { :search => { :description => "Got it" } } |
| 72 | 62 | assert_equal "Got it", ActionTrackerConfig.get_verb(:search)[:description] | ... | ... |
vendor/plugins/action_tracker/test/action_tracker_test.rb
| ... | ... | @@ -43,10 +43,6 @@ class ThingsController < ActionController::Base |
| 43 | 43 | render :text => "test" |
| 44 | 44 | end |
| 45 | 45 | |
| 46 | - def current_user | |
| 47 | - SomeModel.first || SomeModel.create! | |
| 48 | - end | |
| 49 | - | |
| 50 | 46 | def rescue_action(e) |
| 51 | 47 | raise e |
| 52 | 48 | end |
| ... | ... | @@ -58,9 +54,7 @@ ActionController::Routing::Routes.draw { |map| map.resources :things, :collectio |
| 58 | 54 | class ActionTrackerTest < ActiveSupport::TestCase |
| 59 | 55 | |
| 60 | 56 | def setup |
| 61 | - UserStamp.creator_attribute = :user | |
| 62 | - UserStamp.updater_attribute = :user | |
| 63 | - ActionTrackerConfig.current_user_method = :current_user | |
| 57 | + ActionTrackerConfig.current_user = proc{ SomeModel.first || SomeModel.create! } | |
| 64 | 58 | ActionTracker::Record.delete_all |
| 65 | 59 | ActionTrackerConfig.verbs = { :some_verb => { :description => "Did something" } } |
| 66 | 60 | @request = ActionController::TestRequest.new |
| ... | ... | @@ -108,7 +102,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 108 | 102 | end |
| 109 | 103 | |
| 110 | 104 | def test_track_actions_executes_block |
| 111 | - @controller = create_controller do | |
| 105 | + @controller = create_controller do | |
| 112 | 106 | track_actions :some_verb do |
| 113 | 107 | throw :some_symbol |
| 114 | 108 | end |
| ... | ... | @@ -162,7 +156,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 162 | 156 | assert_difference 'ActionTracker::Record.count' do |
| 163 | 157 | get :index, :foo => 5 |
| 164 | 158 | end |
| 165 | - assert_equal({"action"=>"index", "foo"=>"5", "controller"=>"things"}, ActionTracker::Record.first.params) | |
| 159 | + assert_equal({"action"=>"index", "foo"=>"5", "controller"=>"things"}, ActionTracker::Record.first.params) | |
| 166 | 160 | end |
| 167 | 161 | |
| 168 | 162 | def test_keep_params_not_set_should_store_all_params |
| ... | ... | @@ -228,16 +222,15 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 228 | 222 | def test_store_user |
| 229 | 223 | @controller = create_controller do |
| 230 | 224 | track_actions_before :some_verb |
| 231 | - def current_user | |
| 232 | - SomeModel.create! :some_column => "test" | |
| 233 | - end | |
| 234 | 225 | end |
| 226 | + ActionTrackerConfig.current_user = proc{ SomeModel.create! :some_column => "test" } | |
| 227 | + | |
| 235 | 228 | assert_difference 'ActionTracker::Record.count' do |
| 236 | 229 | get :test |
| 237 | 230 | end |
| 238 | 231 | assert_equal "test", ActionTracker::Record.last.user.some_column |
| 239 | 232 | end |
| 240 | - | |
| 233 | + | |
| 241 | 234 | def test_should_update_when_verb_is_updatable_and_no_timeout |
| 242 | 235 | ActionTrackerConfig.verbs = { :some_verb => { :description => "Did something", :type => :updatable } } |
| 243 | 236 | ActionTrackerConfig.timeout = 5.minutes |
| ... | ... | @@ -252,7 +245,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 252 | 245 | assert_no_difference 'ActionTracker::Record.count' do |
| 253 | 246 | get :test |
| 254 | 247 | end |
| 255 | - end | |
| 248 | + end | |
| 256 | 249 | |
| 257 | 250 | def test_should_create_when_verb_is_updatable_and_timeout |
| 258 | 251 | ActionTrackerConfig.verbs = { :some_verb => { :description => "Did something", :type => :updatable } } |
| ... | ... | @@ -268,7 +261,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 268 | 261 | assert_difference 'ActionTracker::Record.count' do |
| 269 | 262 | get :test |
| 270 | 263 | end |
| 271 | - end | |
| 264 | + end | |
| 272 | 265 | |
| 273 | 266 | def test_should_update_when_verb_is_groupable_and_no_timeout |
| 274 | 267 | ActionTrackerConfig.verbs = { :some_verb => { :description => "Did something", :type => :groupable } } |
| ... | ... | @@ -284,7 +277,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 284 | 277 | assert_no_difference 'ActionTracker::Record.count' do |
| 285 | 278 | get :test, :foo => "test" |
| 286 | 279 | end |
| 287 | - end | |
| 280 | + end | |
| 288 | 281 | |
| 289 | 282 | def test_should_create_when_verb_is_groupable_and_timeout |
| 290 | 283 | ActionTrackerConfig.verbs = { :some_verb => { :description => "Did something", :type => :groupable } } |
| ... | ... | @@ -330,7 +323,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 330 | 323 | def test_should_get_time_spent_doing_something |
| 331 | 324 | ActionTrackerConfig.verbs = { :some_verb => { :type => :updatable }, :other_verb => { :type => :updatable } } |
| 332 | 325 | m = SomeModel.create! |
| 333 | - @controller = create_controller do | |
| 326 | + @controller = create_controller do | |
| 334 | 327 | track_actions :some_verb |
| 335 | 328 | end |
| 336 | 329 | @controller.stubs(:current_user).returns(m) |
| ... | ... | @@ -394,7 +387,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 394 | 387 | assert_equal "foo", ActionTracker::Record.last.params["other_column"] |
| 395 | 388 | assert_nil ActionTracker::Record.last.params["another_column"] |
| 396 | 389 | end |
| 397 | - | |
| 390 | + | |
| 398 | 391 | def test_replace_dots_by_underline_in_param_name |
| 399 | 392 | ActionTrackerConfig.verbs = { :test => { :description => "Some" } } |
| 400 | 393 | model = create_model do |
| ... | ... | @@ -407,7 +400,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 407 | 400 | assert_equal 3, ActionTracker::Record.last.params["other_column_size"] |
| 408 | 401 | assert_equal 5, ActionTracker::Record.last.params["another_column"] |
| 409 | 402 | end |
| 410 | - | |
| 403 | + | |
| 411 | 404 | def test_track_actions_store_all_params |
| 412 | 405 | ActionTrackerConfig.verbs = { :test => { :description => "Some" } } |
| 413 | 406 | model = create_model do |
| ... | ... | @@ -452,7 +445,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 452 | 445 | model = create_model { track_actions :test, :after_create, :keep_params => :all, :if => Proc.new { 2 > 1 } } |
| 453 | 446 | @controller = create_controller_for_model(model) |
| 454 | 447 | assert_difference('ActionTracker::Record.count') { get :test } |
| 455 | - | |
| 448 | + | |
| 456 | 449 | model = create_model { track_actions :test, :after_create, :keep_params => :all, :if => Proc.new { 2 < 1 } } |
| 457 | 450 | @controller = create_controller_for_model(model) |
| 458 | 451 | assert_no_difference('ActionTracker::Record.count') { get :test } |
| ... | ... | @@ -460,7 +453,7 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 460 | 453 | model = create_model { track_actions :test, :after_create, :keep_params => :all, :unless => Proc.new { 2 > 1 } } |
| 461 | 454 | @controller = create_controller_for_model(model) |
| 462 | 455 | assert_no_difference('ActionTracker::Record.count') { get :test } |
| 463 | - | |
| 456 | + | |
| 464 | 457 | model = create_model { track_actions :test, :after_create, :keep_params => :all, :unless => Proc.new { 2 < 1 } } |
| 465 | 458 | @controller = create_controller_for_model(model) |
| 466 | 459 | assert_difference('ActionTracker::Record.count') { get :test } |
| ... | ... | @@ -498,13 +491,11 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 498 | 491 | ActionTrackerConfig.verbs = { :test => { :description => "Some" } } |
| 499 | 492 | model = create_model do |
| 500 | 493 | track_actions :test, :after_create, :custom_user => :test_custom_user |
| 501 | - def current_user | |
| 502 | - SomeModel.create! | |
| 503 | - end | |
| 504 | 494 | def test_custom_user |
| 505 | 495 | OtherModel.create! |
| 506 | 496 | end |
| 507 | 497 | end |
| 498 | + ActionTrackerConfig.current_user = proc{ SomeModel.create! } | |
| 508 | 499 | @controller = create_controller_for_model(model, :another_column => 2) |
| 509 | 500 | assert_difference('ActionTracker::Record.count') { get :test } |
| 510 | 501 | assert_kind_of OtherModel, ActionTracker::Record.last.user |
| ... | ... | @@ -514,13 +505,11 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 514 | 505 | ActionTrackerConfig.verbs = { :test => { :description => "Some" } } |
| 515 | 506 | model = create_model do |
| 516 | 507 | track_actions :test, :after_create, "custom_user" => :test_custom_user |
| 517 | - def current_user | |
| 518 | - SomeModel.create! | |
| 519 | - end | |
| 520 | 508 | def test_custom_user |
| 521 | 509 | OtherModel.create! |
| 522 | 510 | end |
| 523 | 511 | end |
| 512 | + ActionTrackerConfig.current_user = proc{ SomeModel.create! } | |
| 524 | 513 | @controller = create_controller_for_model(model, :another_column => 2) |
| 525 | 514 | assert_difference('ActionTracker::Record.count') { get :test } |
| 526 | 515 | assert_kind_of OtherModel, ActionTracker::Record.last.user |
| ... | ... | @@ -530,13 +519,11 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 530 | 519 | ActionTrackerConfig.verbs = { :test => { :description => "Some" } } |
| 531 | 520 | model = create_model do |
| 532 | 521 | track_actions :test, :after_create |
| 533 | - def current_user | |
| 534 | - SomeModel.create! | |
| 535 | - end | |
| 536 | 522 | def test_custom_user |
| 537 | 523 | OtherModel.create! |
| 538 | 524 | end |
| 539 | 525 | end |
| 526 | + ActionTrackerConfig.current_user = proc{ SomeModel.create! } | |
| 540 | 527 | @controller = create_controller_for_model(model, :another_column => 2) |
| 541 | 528 | assert_difference('ActionTracker::Record.count') { get :test } |
| 542 | 529 | assert_kind_of SomeModel, ActionTracker::Record.last.user |
| ... | ... | @@ -625,10 +612,8 @@ class ActionTrackerTest < ActiveSupport::TestCase |
| 625 | 612 | render :text => "test" |
| 626 | 613 | end |
| 627 | 614 | |
| 628 | - def current_user | |
| 629 | - SomeModel.create! :some_column => "test" | |
| 630 | - end | |
| 631 | 615 | end |
| 616 | + ActionTrackerConfig.current_user = proc{ SomeModel.create! :some_column => "test" } | |
| 632 | 617 | end |
| 633 | 618 | |
| 634 | 619 | end | ... | ... |
vendor/plugins/user_stamp/MIT-LICENSE
| ... | ... | @@ -1,20 +0,0 @@ |
| 1 | -Copyright (c) 2008 [John Nunemaker] | |
| 2 | - | |
| 3 | -Permission is hereby granted, free of charge, to any person obtaining | |
| 4 | -a copy of this software and associated documentation files (the | |
| 5 | -"Software"), to deal in the Software without restriction, including | |
| 6 | -without limitation the rights to use, copy, modify, merge, publish, | |
| 7 | -distribute, sublicense, and/or sell copies of the Software, and to | |
| 8 | -permit persons to whom the Software is furnished to do so, subject to | |
| 9 | -the following conditions: | |
| 10 | - | |
| 11 | -The above copyright notice and this permission notice shall be | |
| 12 | -included in all copies or substantial portions of the Software. | |
| 13 | - | |
| 14 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
| 15 | -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
| 16 | -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
| 17 | -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | |
| 18 | -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | |
| 19 | -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
| 20 | -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
vendor/plugins/user_stamp/README
| ... | ... | @@ -1,37 +0,0 @@ |
| 1 | -= UserStamp | |
| 2 | - | |
| 3 | -Rails plugin that makes stamping records with a user when they are | |
| 4 | -created and updated dirt simple. It assumes that your controller has | |
| 5 | -a current_user method. It also assumes that any record being stamped | |
| 6 | -has two attributes--creator_id and updater_id. You can override both | |
| 7 | -of these assumptions easily. | |
| 8 | - | |
| 9 | -== Setup | |
| 10 | - | |
| 11 | -1. script/plugin install git://github.com/jnunemaker/user_stamp.git | |
| 12 | -2. Add user_stamp to application.rb, like the following: | |
| 13 | - | |
| 14 | - class ApplicationController < ActionController::Base | |
| 15 | - user_stamp Post, Asset, Job | |
| 16 | - end | |
| 17 | - | |
| 18 | - | |
| 19 | -== Defaults | |
| 20 | - | |
| 21 | - UserStamp.creator_attribute = :creator_id | |
| 22 | - UserStamp.updater_attribute = :updater_id | |
| 23 | - UserStamp.current_user_method = :current_user | |
| 24 | - | |
| 25 | -If your user stamped columns and current_user method are different, | |
| 26 | -just create an initializer such as config/initializers/user_stamp.rb | |
| 27 | -and copy and paste the defaults above, changing them to fit your app. | |
| 28 | - | |
| 29 | -== Problems? | |
| 30 | - | |
| 31 | -Use the issue tracker on Github. | |
| 32 | - | |
| 33 | -== Docs | |
| 34 | - | |
| 35 | -http://rdoc.info/projects/jnunemaker/user_stamp | |
| 36 | - | |
| 37 | -Copyright (c) 2008 [John Nunemaker], released under the MIT license |
vendor/plugins/user_stamp/Rakefile
| ... | ... | @@ -1,11 +0,0 @@ |
| 1 | -require 'rake' | |
| 2 | -require 'spec/rake/spectask' | |
| 3 | - | |
| 4 | -desc 'Default: run specs.' | |
| 5 | -task :default => :spec | |
| 6 | - | |
| 7 | -desc 'Run the specs' | |
| 8 | -Spec::Rake::SpecTask.new(:spec) do |t| | |
| 9 | - t.spec_opts = ['--colour --format progress --loadby mtime --reverse'] | |
| 10 | - t.spec_files = FileList['spec/**/*_spec.rb'] | |
| 11 | -end | |
| 12 | 0 | \ No newline at end of file |
vendor/plugins/user_stamp/init.rb
vendor/plugins/user_stamp/install.rb
| ... | ... | @@ -1,15 +0,0 @@ |
| 1 | -instructions = <<EOF | |
| 2 | - | |
| 3 | -#{'*' * 62} | |
| 4 | -Don't forget to add user stamp to your application controller. | |
| 5 | - | |
| 6 | - class ApplicationController < ActionController::Base | |
| 7 | - user_stamp Post, Asset, Job | |
| 8 | - end | |
| 9 | - | |
| 10 | -View the README for more information. | |
| 11 | -#{'*' * 62} | |
| 12 | - | |
| 13 | -EOF | |
| 14 | - | |
| 15 | -puts instructions | |
| 16 | 0 | \ No newline at end of file |
vendor/plugins/user_stamp/lib/user_stamp.rb
| ... | ... | @@ -1,50 +0,0 @@ |
| 1 | -module UserStamp | |
| 2 | - mattr_accessor :creator_attribute | |
| 3 | - mattr_accessor :updater_attribute | |
| 4 | - mattr_accessor :current_user_method | |
| 5 | - | |
| 6 | - def self.creator_assignment_method | |
| 7 | - "#{UserStamp.creator_attribute}=" | |
| 8 | - end | |
| 9 | - | |
| 10 | - def self.updater_assignment_method | |
| 11 | - "#{UserStamp.updater_attribute}=" | |
| 12 | - end | |
| 13 | - | |
| 14 | - module ClassMethods | |
| 15 | - def user_stamp(*models) | |
| 16 | - models.each { |klass| UserStampSweeper.observe(klass) } | |
| 17 | - | |
| 18 | - class_eval do | |
| 19 | - cache_sweeper :user_stamp_sweeper | |
| 20 | - end | |
| 21 | - end | |
| 22 | - end | |
| 23 | -end | |
| 24 | - | |
| 25 | -UserStamp.creator_attribute = :creator_id | |
| 26 | -UserStamp.updater_attribute = :updater_id | |
| 27 | -UserStamp.current_user_method = :current_user | |
| 28 | - | |
| 29 | -class UserStampSweeper < ActionController::Caching::Sweeper | |
| 30 | - def before_validation(record) | |
| 31 | - return unless current_user | |
| 32 | - | |
| 33 | - attribute, method = UserStamp.creator_attribute, UserStamp.creator_assignment_method | |
| 34 | - if record.respond_to?(method) && record.new_record? | |
| 35 | - record.send(method, current_user) unless record.send("#{attribute}_id_changed?") || record.send("#{attribute}_type_changed?") | |
| 36 | - end | |
| 37 | - | |
| 38 | - attribute, method = UserStamp.updater_attribute, UserStamp.updater_assignment_method | |
| 39 | - if record.respond_to?(method) | |
| 40 | - record.send(method, current_user) if record.send(attribute).blank? | |
| 41 | - end | |
| 42 | - end | |
| 43 | - | |
| 44 | - private | |
| 45 | - def current_user | |
| 46 | - if controller.respond_to?(UserStamp.current_user_method) | |
| 47 | - controller.send UserStamp.current_user_method | |
| 48 | - end | |
| 49 | - end | |
| 50 | -end |
vendor/plugins/user_stamp/spec/spec_helper.rb
| ... | ... | @@ -1,24 +0,0 @@ |
| 1 | -require 'rubygems' | |
| 2 | - | |
| 3 | -gem 'rspec' | |
| 4 | -require 'spec' | |
| 5 | - | |
| 6 | -%w[activesupport activerecord actionpack].each do |lib| | |
| 7 | - gem lib | |
| 8 | - require lib | |
| 9 | -end | |
| 10 | - | |
| 11 | -require 'action_controller' | |
| 12 | - | |
| 13 | -$:.unshift File.join(File.dirname(__FILE__), '..', 'lib') | |
| 14 | -require 'user_stamp' | |
| 15 | - | |
| 16 | -UserStampSweeper.instance | |
| 17 | - | |
| 18 | -class User | |
| 19 | - attr_accessor :id | |
| 20 | - | |
| 21 | - def initialize(id); | |
| 22 | - @id = id | |
| 23 | - end | |
| 24 | -end |
vendor/plugins/user_stamp/spec/user_stamp_class_methods_spec.rb
| ... | ... | @@ -1,51 +0,0 @@ |
| 1 | -require File.dirname(__FILE__) + '/spec_helper' | |
| 2 | - | |
| 3 | -class FauxModelBase | |
| 4 | - def self.add_observer(observer_instance); end | |
| 5 | -end | |
| 6 | - | |
| 7 | -class Post < FauxModelBase; end | |
| 8 | -class Category < FauxModelBase; end | |
| 9 | -class Label < FauxModelBase; end | |
| 10 | - | |
| 11 | -class FauxApplicationController | |
| 12 | - def self.cache_sweeper(sweepers); end | |
| 13 | - | |
| 14 | - def self.current_user | |
| 15 | - User.new(220) | |
| 16 | - end | |
| 17 | -end | |
| 18 | - | |
| 19 | -class PostsController < FauxApplicationController | |
| 20 | - extend UserStamp::ClassMethods | |
| 21 | -end | |
| 22 | - | |
| 23 | -describe UserStamp::ClassMethods do | |
| 24 | - before do | |
| 25 | - UserStamp.creator_attribute = :creator_id | |
| 26 | - UserStamp.updater_attribute = :updater_id | |
| 27 | - UserStamp.current_user_method = :current_user | |
| 28 | - end | |
| 29 | - | |
| 30 | - it "should add user_stamp method" do | |
| 31 | - PostsController.respond_to?(:user_stamp).should == true | |
| 32 | - end | |
| 33 | - | |
| 34 | - def user_stamp | |
| 35 | - PostsController.user_stamp Post, Category, Label | |
| 36 | - end | |
| 37 | - | |
| 38 | - describe "#user_stamp" do | |
| 39 | - it "should add UserStampSweeper as observer for each model" do | |
| 40 | - [Post, Category, Label].each do |klass| | |
| 41 | - klass.should_receive(:add_observer).with(UserStampSweeper.instance).once | |
| 42 | - end | |
| 43 | - user_stamp | |
| 44 | - end | |
| 45 | - | |
| 46 | - it "should setup cache sweeper for controller" do | |
| 47 | - PostsController.should_receive(:cache_sweeper).with(:user_stamp_sweeper).once | |
| 48 | - user_stamp | |
| 49 | - end | |
| 50 | - end | |
| 51 | -end | |
| 52 | 0 | \ No newline at end of file |
vendor/plugins/user_stamp/spec/user_stamp_spec.rb
| ... | ... | @@ -1,51 +0,0 @@ |
| 1 | -require File.dirname(__FILE__) + '/spec_helper' | |
| 2 | - | |
| 3 | -describe UserStamp do | |
| 4 | - before do | |
| 5 | - UserStamp.creator_attribute = :creator_id | |
| 6 | - UserStamp.updater_attribute = :updater_id | |
| 7 | - UserStamp.current_user_method = :current_user | |
| 8 | - end | |
| 9 | - | |
| 10 | - it "should default creator_attribute to creator_id" do | |
| 11 | - UserStamp.creator_attribute.should == :creator_id | |
| 12 | - end | |
| 13 | - | |
| 14 | - it "should default updater_attribute to updater_id" do | |
| 15 | - UserStamp.updater_attribute.should == :updater_id | |
| 16 | - end | |
| 17 | - | |
| 18 | - it "should default current_user_method to current_user" do | |
| 19 | - UserStamp.current_user_method.should == :current_user | |
| 20 | - end | |
| 21 | - | |
| 22 | - it "should have accessor for creator_attribute" do | |
| 23 | - UserStamp.creator_attribute = 'mofo_id' | |
| 24 | - UserStamp.creator_attribute.should == 'mofo_id' | |
| 25 | - end | |
| 26 | - | |
| 27 | - it "should have accessor for updater_attribute" do | |
| 28 | - UserStamp.updater_attribute = 'mofo_id' | |
| 29 | - UserStamp.updater_attribute.should == 'mofo_id' | |
| 30 | - end | |
| 31 | - | |
| 32 | - it "should have accessor for current_user_method" do | |
| 33 | - UserStamp.current_user_method = 'my_current_user' | |
| 34 | - UserStamp.current_user_method.should == 'my_current_user' | |
| 35 | - end | |
| 36 | - | |
| 37 | - describe "assignment methods" do | |
| 38 | - before do | |
| 39 | - UserStamp.creator_attribute = 'creator_mofo_id' | |
| 40 | - UserStamp.updater_attribute = 'updater_mofo_id' | |
| 41 | - end | |
| 42 | - | |
| 43 | - it "should include creator assignment method" do | |
| 44 | - UserStamp.creator_assignment_method.should == 'creator_mofo_id=' | |
| 45 | - end | |
| 46 | - | |
| 47 | - it "should include updater assignment method" do | |
| 48 | - UserStamp.updater_assignment_method.should == 'updater_mofo_id=' | |
| 49 | - end | |
| 50 | - end | |
| 51 | -end | |
| 52 | 0 | \ No newline at end of file |
vendor/plugins/user_stamp/spec/user_stamp_sweeper_spec.rb
| ... | ... | @@ -1,194 +0,0 @@ |
| 1 | -require File.dirname(__FILE__) + '/spec_helper' | |
| 2 | - | |
| 3 | -class PostsController | |
| 4 | - def self.current_user | |
| 5 | - @@user | |
| 6 | - end | |
| 7 | -end | |
| 8 | - | |
| 9 | -describe UserStampSweeper, "#before_validation" do | |
| 10 | - before do | |
| 11 | - @@user = User.new(220) | |
| 12 | - UserStamp.creator_attribute = :creator | |
| 13 | - UserStamp.updater_attribute = :updater | |
| 14 | - UserStamp.current_user_method = :current_user | |
| 15 | - @sweeper = UserStampSweeper.instance | |
| 16 | - @sweeper.stub!(:controller).and_return(PostsController) | |
| 17 | - end | |
| 18 | - | |
| 19 | - describe "(with new record)" do | |
| 20 | - it "should set creator if attribute exists" do | |
| 21 | - record = mock('Record', :creator= => nil, :updater= => nil, :new_record? => true, :updater => nil, :creator_id_changed? => false, :creator_type_changed? => false, :updater_id_changed? => false, :updater_type_changed? => false) | |
| 22 | - record.should_receive(:creator=).with(@@user).once | |
| 23 | - @sweeper.before_validation(record) | |
| 24 | - end | |
| 25 | - | |
| 26 | - it "should NOT set creator if attribute does not exist" do | |
| 27 | - record = mock('Record', :new_record? => true, :updater= => nil, :respond_to? => false) | |
| 28 | - record.should_receive(:respond_to?).with("creator=").and_return(false) | |
| 29 | - record.should_not_receive(:creator=) | |
| 30 | - @sweeper.before_validation(record) | |
| 31 | - end | |
| 32 | - end | |
| 33 | - | |
| 34 | - describe "(with non new record)" do | |
| 35 | - it "should NOT set creator if attribute exists" do | |
| 36 | - record = mock('Record', :creator= => nil, :updater= => nil, :updater => nil, :new_record? => false, :creator_id_changed? => false, :creator_type_changed? => false, :updater_id_changed? => false, :updater_type_changed? => false) | |
| 37 | - record.should_not_receive(:creator=) | |
| 38 | - @sweeper.before_validation(record) | |
| 39 | - end | |
| 40 | - | |
| 41 | - it "should NOT set creator if attribute does not exist" do | |
| 42 | - record = mock('Record', :updater= => nil, :updater => nil, :new_record? => false, :creator_id_changed? => false, :creator_type_changed? => false, :updater_id_changed? => false, :updater_type_changed? => false) | |
| 43 | - record.should_not_receive(:creator=) | |
| 44 | - @sweeper.before_validation(record) | |
| 45 | - end | |
| 46 | - end | |
| 47 | - | |
| 48 | - it "should set updater if attribute exists" do | |
| 49 | - record = mock('Record', :creator= => nil, :updater= => nil, :new_record? => false, :updater => nil) | |
| 50 | - record.should_receive(:updater=) | |
| 51 | - @sweeper.before_validation(record) | |
| 52 | - end | |
| 53 | - | |
| 54 | - it "should NOT set updater if attribute does not exist" do | |
| 55 | - record = mock('Record', :creator= => nil, :updater= => nil, :new_record? => :false, :respond_to? => false) | |
| 56 | - record.should_receive(:respond_to?).with("updater=").and_return(false) | |
| 57 | - record.should_not_receive(:updater=) | |
| 58 | - @sweeper.before_validation(record) | |
| 59 | - end | |
| 60 | -end | |
| 61 | - | |
| 62 | -describe UserStampSweeper, "#before_validation (with custom attribute names)" do | |
| 63 | - before do | |
| 64 | - UserStamp.creator_attribute = :created_by | |
| 65 | - UserStamp.updater_attribute = :updated_by | |
| 66 | - UserStamp.current_user_method = :current_user | |
| 67 | - @sweeper = UserStampSweeper.instance | |
| 68 | - @sweeper.stub!(:controller).and_return(PostsController) | |
| 69 | - end | |
| 70 | - | |
| 71 | - describe "(with new record)" do | |
| 72 | - it "should set created_by if attribute exists" do | |
| 73 | - record = mock('Record', :created_by= => nil, :updated_by => nil, :updated_by= => nil, :new_record? => true, :created_by_id_changed? => false, :created_by_type_changed? => false, :updated_by_id_changed? => false, :updated_by_type_changed? => false) | |
| 74 | - record.should_receive(:created_by=).with(@@user).once | |
| 75 | - @sweeper.before_validation(record) | |
| 76 | - end | |
| 77 | - | |
| 78 | - it "should NOT set created_by if attribute does not exist" do | |
| 79 | - record = mock('Record', :new_record? => true, :updated_by= => nil, :respond_to? => false) | |
| 80 | - record.should_receive(:respond_to?).with("created_by=").and_return(false) | |
| 81 | - record.should_not_receive(:created_by=) | |
| 82 | - @sweeper.before_validation(record) | |
| 83 | - end | |
| 84 | - end | |
| 85 | - | |
| 86 | - describe "(with non new record)" do | |
| 87 | - it "should NOT set created_by if attribute exists" do | |
| 88 | - record = mock('Record', :created_by= => nil, :updated_by => nil, :updated_by= => nil, :new_record? => false, :updated_by_id_changed? => false, :updated_by_type_changed? => false) | |
| 89 | - record.should_not_receive(:created_by=) | |
| 90 | - @sweeper.before_validation(record) | |
| 91 | - end | |
| 92 | - | |
| 93 | - it "should NOT set created_by if attribute does not exist" do | |
| 94 | - record = mock('Record', :updated_by= => nil, :updated_by => nil, :new_record? => false, :updated_by_id_changed? => false, :updated_by_type_changed? => false) | |
| 95 | - record.should_not_receive(:created_by=) | |
| 96 | - @sweeper.before_validation(record) | |
| 97 | - end | |
| 98 | - end | |
| 99 | - | |
| 100 | - it "should set updated_by if attribute exists" do | |
| 101 | - record = mock('Record', :created_by= => nil, :updated_by= => nil, :updated_by => nil, :new_record? => :false, :created_by_id_changed? => false, :created_by_type_changed? => false, :updated_by_id_changed? => false, :updated_by_type_changed? => false) | |
| 102 | - record.should_receive(:updated_by=) | |
| 103 | - @sweeper.before_validation(record) | |
| 104 | - end | |
| 105 | - | |
| 106 | - it "should NOT set updated_by if attribute does not exist" do | |
| 107 | - record = mock('Record', :created_by= => nil, :updated_by= => nil, :new_record? => :false, :respond_to? => false) | |
| 108 | - record.should_receive(:respond_to?).with("updated_by=").and_return(false) | |
| 109 | - record.should_not_receive(:updated_by=) | |
| 110 | - @sweeper.before_validation(record) | |
| 111 | - end | |
| 112 | - | |
| 113 | - it "should NOT set created_by if attribute changed" do | |
| 114 | - record = mock('Record', :created_by= => nil, :updated_by= => nil, :new_record? => true, :created_by_id_changed? => true, :created_by_type_changed? => true) | |
| 115 | - record.should_receive(:respond_to?).with("updated_by=").and_return(false) | |
| 116 | - record.should_receive(:respond_to?).with("created_by=").and_return(true) | |
| 117 | - record.should_not_receive(:created_by=) | |
| 118 | - @sweeper.before_validation(record) | |
| 119 | - end | |
| 120 | - | |
| 121 | - it "should NOT set updated_by if attribute is not nil" do | |
| 122 | - record = mock('Record', :created_by= => nil, :updated_by= => nil, :updated_by => 1, :new_record? => false) | |
| 123 | - record.should_receive(:respond_to?).with("updated_by=").and_return(true) | |
| 124 | - record.should_receive(:respond_to?).with("created_by=").and_return(false) | |
| 125 | - record.should_not_receive(:updated_by=) | |
| 126 | - @sweeper.before_validation(record) | |
| 127 | - end | |
| 128 | - | |
| 129 | - it "should set created_by if attribute has not changed" do | |
| 130 | - record = mock('Record', :created_by= => nil, :updated_by= => nil, :new_record? => true, :created_by_id_changed? => false, :created_by_type_changed? => false) | |
| 131 | - record.should_receive(:respond_to?).with("updated_by=").and_return(false) | |
| 132 | - record.should_receive(:respond_to?).with("created_by=").and_return(true) | |
| 133 | - record.should_receive(:created_by=) | |
| 134 | - @sweeper.before_validation(record) | |
| 135 | - end | |
| 136 | - | |
| 137 | - it "should set updated_by if attribute is nil" do | |
| 138 | - record = mock('Record', :created_by= => nil, :updated_by= => nil, :updated_by => nil, :new_record? => false) | |
| 139 | - record.should_receive(:respond_to?).with("updated_by=").and_return(true) | |
| 140 | - record.should_receive(:respond_to?).with("created_by=").and_return(false) | |
| 141 | - record.should_receive(:updated_by=) | |
| 142 | - @sweeper.before_validation(record) | |
| 143 | - end | |
| 144 | -end | |
| 145 | - | |
| 146 | -describe UserStampSweeper, "#current_user" do | |
| 147 | - before do | |
| 148 | - UserStamp.creator_attribute = :creator | |
| 149 | - UserStamp.updater_attribute = :updater | |
| 150 | - UserStamp.current_user_method = :current_user | |
| 151 | - @sweeper = UserStampSweeper.instance | |
| 152 | - end | |
| 153 | - | |
| 154 | - it "should send current_user if controller responds to it" do | |
| 155 | - user = mock('User') | |
| 156 | - controller = mock('Controller', :current_user => user) | |
| 157 | - @sweeper.stub!(:controller).and_return(controller) | |
| 158 | - controller.should_receive(:current_user) | |
| 159 | - @sweeper.send(:current_user) | |
| 160 | - end | |
| 161 | - | |
| 162 | - it "should not send current_user if controller does not respond to it" do | |
| 163 | - user = mock('User') | |
| 164 | - controller = mock('Controller', :respond_to? => false) | |
| 165 | - @sweeper.stub!(:controller).and_return(controller) | |
| 166 | - controller.should_not_receive(:current_user) | |
| 167 | - @sweeper.send(:current_user) | |
| 168 | - end | |
| 169 | -end | |
| 170 | - | |
| 171 | -describe UserStampSweeper, "#current_user (with custom current_user_method)" do | |
| 172 | - before do | |
| 173 | - UserStamp.creator_attribute = :creator | |
| 174 | - UserStamp.updater_attribute = :updater | |
| 175 | - UserStamp.current_user_method = :my_user | |
| 176 | - @sweeper = UserStampSweeper.instance | |
| 177 | - end | |
| 178 | - | |
| 179 | - it "should send current_user if controller responds to it" do | |
| 180 | - user = mock('User') | |
| 181 | - controller = mock('Controller', :my_user => user) | |
| 182 | - @sweeper.stub!(:controller).and_return(controller) | |
| 183 | - controller.should_receive(:my_user) | |
| 184 | - @sweeper.send(:current_user) | |
| 185 | - end | |
| 186 | - | |
| 187 | - it "should not send current_user if controller does not respond to it" do | |
| 188 | - user = mock('User') | |
| 189 | - controller = mock('Controller', :respond_to? => false) | |
| 190 | - @sweeper.stub!(:controller).and_return(controller) | |
| 191 | - controller.should_not_receive(:my_user) | |
| 192 | - @sweeper.send(:current_user) | |
| 193 | - end | |
| 194 | -end |