enhanced_hooks 0.5

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use ruby-1.9.3-p362@event_machine
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in event_machine.gemspec
4
+ gemspec
5
+
6
+ gem 'activesupport', ">= 3.0.0"
7
+ gem 'rails', ">= 3.0.0"
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 tim.teng
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.
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 readline
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,73 @@
1
+ = enhanced_hooks
2
+ With enhanced hooks, you can keep an eye on any action on your rails controller, say in your sns website, when user posts a blog, you need to notice all of his friends, but it's really urgly to do like this:
3
+
4
+ BlogController:
5
+ def create
6
+ # new and save code
7
+ notice_all_friends
8
+ end
9
+ end
10
+
11
+ let's take another scenario, in your sns site, when one user makes friends with the other one, we should notice all friends of these two people, but how to?
12
+ we'd beeter have an observer on the action, the code in the make_friends action block only concerns about building relationship between the two people, the observer then notice other people on fly.
13
+
14
+ Usage:
15
+
16
+ in your Gemfile:
17
+
18
+ gem "enhanced_hooks", :version => ">=0.4.1"
19
+
20
+ and the generate command :
21
+
22
+ ~your_project_path> rails g enhanced_hooks create_favorite Favorites create
23
+
24
+ here 'create_event' stands for the event name, and 'Favorites' 'create' for which contorller#action to observe
25
+
26
+ then it will generate a event file named create_favorite_event.rb under the Rails.root/events directory, which content like following:
27
+
28
+
29
+ for_action FavoritesController, :create do
30
+
31
+ before do
32
+ # This will be called before FavoriteController#create
33
+ end
34
+
35
+ after do
36
+ # This will be called after FavoriteController#create
37
+ end
38
+
39
+ end
40
+
41
+
42
+ now you can add your code in the block and after block, enjoy.
43
+
44
+ = to observe multiple actions
45
+
46
+ to observe multiple actions, you should:
47
+
48
+ for_actions [[FavoritesController, :create], [BlogsController,:create]] do
49
+
50
+ before do
51
+ # your code goes here
52
+ end
53
+
54
+ after do
55
+ # your code goes here
56
+ end
57
+
58
+ end
59
+
60
+
61
+ == Note on Patches/Pull Requests
62
+
63
+ * Fork the project.
64
+ * Make your feature addition or bug fix.
65
+ * Add tests for it. This is important so I don't break it in a
66
+ future version unintentionally.
67
+ * Commit, do not mess with rakefile, version, or history.
68
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
69
+ * Send me a pull request. Bonus points for topic branches.
70
+
71
+ == Copyright
72
+
73
+ Copyright (c) 2010 tim.teng. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'enhanced_hooks/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "enhanced_hooks"
8
+ gem.version = EnhancedHooks::VERSION
9
+ gem.authors = ["readline"]
10
+ gem.email = ["tim.rubist@gmail.com"]
11
+ gem.description = %q{enhanced before/after filter hooks}
12
+ gem.summary = %q{enhanced before/after filter hooks}
13
+ gem.homepage = "http://github.com/tteng/enhanced_hooks"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
@@ -0,0 +1,15 @@
1
+ require "enhanced_hooks/version"
2
+ require "active_support/dependencies"
3
+
4
+ module EnhancedHooks
5
+
6
+ mattr_accessor :app_root
7
+
8
+ def self.setup
9
+ yield self
10
+ end
11
+
12
+ end
13
+
14
+ require "enhanced_hooks/engine"
15
+ require "enhanced_hooks/hooks"
@@ -0,0 +1,21 @@
1
+ module EnhancedHooks
2
+ class Engine < Rails::Engine
3
+
4
+ initializer "enhanced_hooks.load_app_instance_data" do |app|
5
+ EnhancedHooks.setup do |config|
6
+ config.app_root = app.root
7
+ end
8
+ end
9
+
10
+ #initialize "enhanced_hooks.load_static_assets" do |app|
11
+ # app.middleware.use ::ActionDispatc::Static, "#{root}/public"
12
+ #end
13
+
14
+ initializer "enhanced_hooks.application" do
15
+ ActiveSupport.on_load :action_controller do
16
+ include EnhancedHooks::Hooks
17
+ end
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,116 @@
1
+ require "pp"
2
+ require 'benchmark'
3
+
4
+ module EnhancedHooks
5
+
6
+ module Hooks
7
+
8
+ EVENTS_DIR = "events"
9
+
10
+ def self.included(base)
11
+ class_eval <<-EOF
12
+ @@reporter_events = Array.new
13
+ EOF
14
+ base.class_eval <<-BCE
15
+ around_filter :reporter_around_filter
16
+ BCE
17
+ end
18
+
19
+ protected
20
+
21
+ def reporter_around_filter
22
+
23
+ events_load_bm = Benchmark.measure do
24
+ load_events if @@reporter_events.empty?
25
+ end
26
+
27
+ events = @@reporter_events.select {|e| e.match_event?(self.class, action_name)}
28
+
29
+ # Calling all before actions for this controler and action
30
+ events.each { |event| event.call_before(self) }
31
+
32
+ # Calling original action
33
+ yield
34
+
35
+ # Calling all after actions for this controler and action
36
+ events.each { |event| event.call_after(self) }
37
+ end
38
+
39
+ def for_action(controller, action, &block)
40
+ @@reporter_events << EventMeta.new(controller, action, &block)
41
+ end
42
+
43
+ def for_actions(actions_array, &block)
44
+ actions_array.each do |item|
45
+ @@reporter_events << EventMeta.new(item[0], item[1], &block)
46
+ end
47
+ end
48
+
49
+ def turn_off_for_action(controller, action, &block)
50
+ for_action(controller, action, &block) if test?
51
+ end
52
+
53
+ def load_events
54
+ return if test?
55
+ Dir["#{Rails.root + EVENTS_DIR}/**/*event.rb"].collect do |file|
56
+ load_event(file)
57
+ end
58
+ end
59
+
60
+ def load_event(file)
61
+ clear_events if test?
62
+ code = File.new(file).readlines.join('')
63
+ begin
64
+ instance_eval code, __FILE__, __LINE__
65
+ rescue => e
66
+ logger.warn "FAILED!"
67
+ logger.warn e.backtrace
68
+ end
69
+ end
70
+
71
+ def clear_events
72
+ @@reporter_events.clear
73
+ end
74
+
75
+ def reporter_events
76
+ @@reporter_events
77
+ end
78
+
79
+ def test?
80
+ ENV["RAILS_ENV"] == "test"
81
+ end
82
+
83
+ class EventMeta
84
+
85
+ def initialize(controller_class, name, &block)
86
+ @controller_class = controller_class
87
+ @action = name
88
+ self.instance_eval(&block)
89
+ end
90
+
91
+ def call_before(controller_instance)
92
+ controller_instance.instance_eval(&@before) if @before
93
+ end
94
+
95
+ def call_after(controller_instance)
96
+ controller_instance.instance_eval(&@after) if @after
97
+ end
98
+
99
+ def match_event?(clazz, action_name)
100
+ @controller_class == clazz && @action.to_s == action_name.to_s
101
+ end
102
+ private
103
+
104
+ def before(&block)
105
+ @before = block
106
+ end
107
+
108
+ def after(&block)
109
+ @after = block
110
+ end
111
+
112
+ end
113
+
114
+ end
115
+
116
+ end
@@ -0,0 +1,3 @@
1
+ module EnhancedHooks
2
+ VERSION = "0.5"
3
+ end
@@ -0,0 +1,28 @@
1
+ require 'rails/generators'
2
+ class EnhancedHooksGenerator < Rails::Generators::Base
3
+ source_root File.expand_path('../templates', __FILE__)
4
+
5
+ argument :this_event_name, :type => :string
6
+ argument :controller_name, :type => :string
7
+ argument :action_name, :type => :string
8
+
9
+ def generate_event
10
+ template "event.rb", "#{EnhancedHooks::Hooks::EVENTS_DIR}/#{parsed_event_name}_event.rb"
11
+ template "functional_test.rb", "test/functional/events/#{parsed_event_name}_test.rb"
12
+ end
13
+
14
+ private
15
+
16
+ def parsed_event_name
17
+ this_event_name.underscore
18
+ end
19
+
20
+ def parsed_controller_name
21
+ controller_name.camelize
22
+ end
23
+
24
+ def parsed_action_name
25
+ action_name.underscore
26
+ end
27
+
28
+ end
@@ -0,0 +1,11 @@
1
+ for_action <%= parsed_controller_name %>Controller, :<%= action_name %> do
2
+
3
+ before do
4
+ # This will be called before <%= parsed_controller_name %>#<%= parsed_action_name %>
5
+ end
6
+
7
+ after do
8
+ # This will be called after <%= parsed_controller_name %>#<%= parsed_action_name %>
9
+ end
10
+
11
+ end
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+ require File.dirname(__FILE__) + '/../../functional/events/events_base_test'
3
+ require '<%= parsed_controller_name.underscore -%>_controller'
4
+
5
+ # Re-raise errors caught by the controller.
6
+ class <%= parsed_controller_name -%>; def rescue_action(e) raise e end; end
7
+
8
+ class <%= parsed_event_name.camelize -%>Test < EventBaseTest
9
+
10
+ fixtures :users
11
+
12
+ def setup
13
+ @controller = <%= parsed_controller_name.camelize-%>.new
14
+ @request = ActionController::TestRequest.new
15
+ @response = ActionController::TestResponse.new
16
+
17
+ prepare
18
+ load_event "app/events/<%= parsed_event_name-%>_event.rb"
19
+ emulate_login
20
+ end
21
+
22
+ # Put actual tests here
23
+ def test_true
24
+ assert true
25
+ end
26
+
27
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'event_machine'
8
+
9
+ class Test::Unit::TestCase
10
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestEventMachine < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: enhanced_hooks
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.5'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - readline
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-09 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: enhanced before/after filter hooks
15
+ email:
16
+ - tim.rubist@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - .rvmrc
23
+ - Gemfile
24
+ - LICENSE
25
+ - LICENSE.txt
26
+ - README.rdoc
27
+ - Rakefile
28
+ - enhanced_hooks.gemspec
29
+ - lib/enhanced_hooks.rb
30
+ - lib/enhanced_hooks/engine.rb
31
+ - lib/enhanced_hooks/hooks.rb
32
+ - lib/enhanced_hooks/version.rb
33
+ - lib/generators/enhanced_hooks/enhanced_hooks_generator.rb
34
+ - lib/generators/enhanced_hooks/templates/event.rb
35
+ - lib/generators/enhanced_hooks/templates/functional_test.rb
36
+ - test/helper.rb
37
+ - test/test_event_machine.rb
38
+ homepage: http://github.com/tteng/enhanced_hooks
39
+ licenses: []
40
+ post_install_message:
41
+ rdoc_options: []
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ requirements: []
57
+ rubyforge_project:
58
+ rubygems_version: 1.8.24
59
+ signing_key:
60
+ specification_version: 3
61
+ summary: enhanced before/after filter hooks
62
+ test_files:
63
+ - test/helper.rb
64
+ - test/test_event_machine.rb