controller_observer 0.0.1
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +2 -0
- data/controller_observer.gemspec +21 -0
- data/lib/controller_observer.rb +85 -0
- data/lib/controller_observer/version.rb +3 -0
- metadata +62 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "controller_observer/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "controller_observer"
|
7
|
+
s.version = ControllerObserver::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Florian Günther"]
|
10
|
+
s.email = ["mail@gee-f.de"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Observe your ActionControllers in rails}
|
13
|
+
s.description = %q{Observers for ActionController similar to ActiveRecord Observers}
|
14
|
+
|
15
|
+
# s.rubyforge_project = "controller_observer"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module ControllerObserver
|
4
|
+
module ClassMethods
|
5
|
+
def observers=(*observers)
|
6
|
+
@observers = observers.flatten
|
7
|
+
end
|
8
|
+
|
9
|
+
# Gets the current observers.
|
10
|
+
def observers
|
11
|
+
@observers ||= []
|
12
|
+
end
|
13
|
+
|
14
|
+
# Instantiate the global Active Controller observers.
|
15
|
+
def instantiate_observers
|
16
|
+
return if @observers.blank?
|
17
|
+
@observers.each do |observer|
|
18
|
+
if observer.respond_to?(:to_sym) # Symbol or String
|
19
|
+
observer.to_s.camelize.constantize.instance
|
20
|
+
#elsif observer.respond_to?(:instance)
|
21
|
+
# observer.instance
|
22
|
+
# puts "instance: #{observer}"
|
23
|
+
else
|
24
|
+
raise ArgumentError, "#{observer} must be a lowercase, underscored class name (or an instance of the class itself) responding to the instance method. Example: Person.observers = :big_brother # calls BigBrother.instance"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Observer
|
31
|
+
include Singleton
|
32
|
+
|
33
|
+
class << self
|
34
|
+
def observed_class
|
35
|
+
if observed_class_name = name[/(.*)Observer/, 1]
|
36
|
+
observed_class_name.constantize
|
37
|
+
else
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize
|
44
|
+
add_observer!(self.class.observed_class)
|
45
|
+
end
|
46
|
+
|
47
|
+
def before(controller)
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
def after(controller)
|
52
|
+
method = get_method(controller)
|
53
|
+
if respond_to?(method) && response([200, 201], controller)
|
54
|
+
send(method, get_item(controller))
|
55
|
+
end
|
56
|
+
return true
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_method(controller)
|
60
|
+
"after_#{controller.action_name}".to_sym
|
61
|
+
end
|
62
|
+
|
63
|
+
def get_item(controller)
|
64
|
+
var_sym = "@#{controller.controller_name.singularize}".to_sym
|
65
|
+
return controller.instance_variable_get(var_sym) if controller.instance_variable_defined?(var_sym)
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
|
69
|
+
def response(code_expected, controller)
|
70
|
+
@status = controller.response.status.to_s.match(/([0-9]*)/)[0].to_i
|
71
|
+
code_expected.include? @status
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
def add_observer!(klass)
|
76
|
+
klass.after_filter self
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
unless ActionController::Base.respond_to?(:observers)
|
83
|
+
ActionController::Base.send(:extend, ControllerObserver::ClassMethods)
|
84
|
+
# ActionController::Dispatcher.to_prepare(:actioncontroller_instantiate_observers) { ActionController::Base.instantiate_observers }
|
85
|
+
end
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: controller_observer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.0.1
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- "Florian G\xC3\xBCnther"
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-04 00:00:00 +02:00
|
14
|
+
default_executable:
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description: Observers for ActionController similar to ActiveRecord Observers
|
18
|
+
email:
|
19
|
+
- mail@gee-f.de
|
20
|
+
executables: []
|
21
|
+
|
22
|
+
extensions: []
|
23
|
+
|
24
|
+
extra_rdoc_files: []
|
25
|
+
|
26
|
+
files:
|
27
|
+
- .gitignore
|
28
|
+
- Gemfile
|
29
|
+
- Rakefile
|
30
|
+
- controller_observer.gemspec
|
31
|
+
- lib/controller_observer.rb
|
32
|
+
- lib/controller_observer/version.rb
|
33
|
+
has_rdoc: true
|
34
|
+
homepage: ""
|
35
|
+
licenses: []
|
36
|
+
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
|
40
|
+
require_paths:
|
41
|
+
- lib
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
requirements: []
|
55
|
+
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 1.6.2
|
58
|
+
signing_key:
|
59
|
+
specification_version: 3
|
60
|
+
summary: Observe your ActionControllers in rails
|
61
|
+
test_files: []
|
62
|
+
|