SpiritSC-case_collection_observer 0.1.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.
- data/CHANGELOG +2 -0
- data/LICENSE +0 -0
- data/Manifest +14 -0
- data/README +139 -0
- data/Rakefile +12 -0
- data/case_collection_observer.gemspec +30 -0
- data/generators/case_observer/USAGE +0 -0
- data/generators/case_observer/case_observer_generator.rb +60 -0
- data/generators/case_observer/templates/case_collection_observer.rb +18 -0
- data/generators/case_observer/templates/case_collection_observer_test.rb +8 -0
- data/init.rb +1 -0
- data/lib/case_collection_observer.rb +1 -0
- data/lib/case_collection_observer/base.rb +67 -0
- data/lib/case_collection_observer/version.rb +9 -0
- data/lib/casecollectionobserver.rb +1 -0
- metadata +79 -0
data/CHANGELOG
ADDED
data/LICENSE
ADDED
File without changes
|
data/Manifest
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
CHANGELOG
|
2
|
+
LICENSE
|
3
|
+
Manifest
|
4
|
+
README
|
5
|
+
Rakefile
|
6
|
+
generators/case_observer/USAGE
|
7
|
+
generators/case_observer/case_observer_generator.rb
|
8
|
+
generators/case_observer/templates/case_collection_observer.rb
|
9
|
+
generators/case_observer/templates/case_collection_observer_test.rb
|
10
|
+
init.rb
|
11
|
+
lib/case_collection_observer.rb
|
12
|
+
lib/case_collection_observer/base.rb
|
13
|
+
lib/case_collection_observer/version.rb
|
14
|
+
lib/casecollectionobserver.rb
|
data/README
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
== Case Collection Observer v. 0.1.0
|
2
|
+
Simple notifier for object in HM and HABTM associations in AR...
|
3
|
+
|
4
|
+
<b>Usage:</b>
|
5
|
+
|
6
|
+
* Installation
|
7
|
+
sudo gem install case_collection_observer --source http://gems.github.com/
|
8
|
+
|
9
|
+
* Generator:
|
10
|
+
|
11
|
+
script/console case_observer OBSERVER_NAME MODELS_TO_OBSERVE [options]
|
12
|
+
|
13
|
+
# options:
|
14
|
+
--skip-test => Skip all tests for observer
|
15
|
+
|
16
|
+
<b>Rails example:</b>
|
17
|
+
|
18
|
+
- Simple construction with "has_many" association
|
19
|
+
|
20
|
+
# "Post" and "Comment" models
|
21
|
+
|
22
|
+
class Post < ActiveRecord::Base
|
23
|
+
has_many_with_observer :comments
|
24
|
+
end
|
25
|
+
|
26
|
+
class Comment < ActiveRecord::Base
|
27
|
+
belongs_to :post
|
28
|
+
end
|
29
|
+
|
30
|
+
# simple "Blog" observer for "Post" model
|
31
|
+
|
32
|
+
class BlogObserver < ActiveRecord::Observer
|
33
|
+
observe :post
|
34
|
+
|
35
|
+
def before_save_comments(comment)
|
36
|
+
end
|
37
|
+
|
38
|
+
def after_save_comments(comment)
|
39
|
+
end
|
40
|
+
|
41
|
+
def before_destroy_comments(comment)
|
42
|
+
end
|
43
|
+
|
44
|
+
def after_destroy_comments(comment)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
- Simple construction with "has_many :through" association
|
49
|
+
|
50
|
+
# "Post", "Category" and "Categorization" models
|
51
|
+
|
52
|
+
class Post < ActiveRecord::Base
|
53
|
+
has_many :categorization
|
54
|
+
has_many_with_observer :categories, :through => :categorization
|
55
|
+
end
|
56
|
+
|
57
|
+
class Category < ActiveRecord::Base
|
58
|
+
has_many :categorization
|
59
|
+
has_many_with_observer :posts, :through => :categorization
|
60
|
+
end
|
61
|
+
|
62
|
+
class Categorization < ActiveRecord::Base
|
63
|
+
belongs_to :post
|
64
|
+
belongs_to :category
|
65
|
+
end
|
66
|
+
|
67
|
+
# simple "Blog" observer for "Post" and "Category" models
|
68
|
+
|
69
|
+
class BlogObserver < ActiveRecord::Observer
|
70
|
+
observe :post, :category
|
71
|
+
|
72
|
+
def before_save_posts(post)
|
73
|
+
end
|
74
|
+
|
75
|
+
def after_save_posts(post)
|
76
|
+
end
|
77
|
+
|
78
|
+
def before_destroy_posts(post)
|
79
|
+
end
|
80
|
+
|
81
|
+
def after_destroy_posts(post)
|
82
|
+
end
|
83
|
+
|
84
|
+
def before_save_categories(category)
|
85
|
+
end
|
86
|
+
|
87
|
+
def after_save_categories(category)
|
88
|
+
end
|
89
|
+
|
90
|
+
def before_destroy_categories(category)
|
91
|
+
end
|
92
|
+
|
93
|
+
def after_destroy_categories(category)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
- Simple construction with "has_and_belongs_to_many" association
|
98
|
+
|
99
|
+
# "Post", "Category" models and "categories_posts" table
|
100
|
+
|
101
|
+
class Post < ActiveRecord::Base
|
102
|
+
has_and_belongs_to_many_with_observer :categories
|
103
|
+
end
|
104
|
+
|
105
|
+
class Category < ActiveRecord::Base
|
106
|
+
has_and_belongs_to_many_with_observer :posts
|
107
|
+
end
|
108
|
+
|
109
|
+
# simple "Blog" observer for "Post" and "Category" models
|
110
|
+
|
111
|
+
class BlogObserver < ActiveRecord::Observer
|
112
|
+
observe :post, :category
|
113
|
+
|
114
|
+
def before_save_posts(post)
|
115
|
+
end
|
116
|
+
|
117
|
+
def after_save_posts(post)
|
118
|
+
end
|
119
|
+
|
120
|
+
def before_destroy_posts(post)
|
121
|
+
end
|
122
|
+
|
123
|
+
def after_destroy_posts(post)
|
124
|
+
end
|
125
|
+
|
126
|
+
def before_save_categories(category)
|
127
|
+
end
|
128
|
+
|
129
|
+
def after_save_categories(category)
|
130
|
+
end
|
131
|
+
|
132
|
+
def before_destroy_categories(category)
|
133
|
+
end
|
134
|
+
|
135
|
+
def after_destroy_categories(category)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
Copyright © 2009 Szymon Czarnecki
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('case_collection_observer', '0.1.0') do |p|
|
6
|
+
p.description = "Simple notifier for object in HM and HABTM associations in AR..."
|
7
|
+
p.url = "http://github.com/SpiritSC/Case-Collection-Observer"
|
8
|
+
p.author = "Szymon Czarnecki"
|
9
|
+
p.email = "spirit_sc@thinkdifferent.pl"
|
10
|
+
p.ignore_pattern = ["tmp/*", "script/*"]
|
11
|
+
p.development_dependencies = []
|
12
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{case_collection_observer}
|
5
|
+
s.version = "0.1.0"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Szymon Czarnecki"]
|
9
|
+
s.date = %q{2009-09-21}
|
10
|
+
s.description = %q{Simple notifier for object in HM and HABTM associations in AR...}
|
11
|
+
s.email = %q{spirit_sc@thinkdifferent.pl}
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "lib/case_collection_observer.rb", "lib/case_collection_observer/base.rb", "lib/case_collection_observer/version.rb", "lib/casecollectionobserver.rb"]
|
13
|
+
s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "generators/case_observer/USAGE", "generators/case_observer/case_observer_generator.rb", "generators/case_observer/templates/case_collection_observer.rb", "generators/case_observer/templates/case_collection_observer_test.rb", "init.rb", "lib/case_collection_observer.rb", "lib/case_collection_observer/base.rb", "lib/case_collection_observer/version.rb", "lib/casecollectionobserver.rb", "case_collection_observer.gemspec"]
|
14
|
+
s.homepage = %q{http://github.com/SpiritSC/Case-Collection-Observer}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Case_collection_observer", "--main", "README"]
|
16
|
+
s.require_paths = ["lib"]
|
17
|
+
s.rubyforge_project = %q{case_collection_observer}
|
18
|
+
s.rubygems_version = %q{1.3.5}
|
19
|
+
s.summary = %q{Simple notifier for object in HM and HABTM associations in AR...}
|
20
|
+
|
21
|
+
if s.respond_to? :specification_version then
|
22
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
|
+
s.specification_version = 3
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
26
|
+
else
|
27
|
+
end
|
28
|
+
else
|
29
|
+
end
|
30
|
+
end
|
File without changes
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class CaseObserverGenerator < Rails::Generator::NamedBase
|
2
|
+
attr_accessor :observer
|
3
|
+
attr_accessor :models
|
4
|
+
|
5
|
+
def initialize(runtime_args, runtime_options = {})
|
6
|
+
super
|
7
|
+
@observer = class_name
|
8
|
+
@models = @args
|
9
|
+
end
|
10
|
+
|
11
|
+
def manifest
|
12
|
+
record do |m|
|
13
|
+
# Check existing folders
|
14
|
+
m.directory "app/models"
|
15
|
+
m.directory "test/unit"
|
16
|
+
|
17
|
+
# Copy observer
|
18
|
+
m.template "case_collection_observer.rb", "app/models/#{observer_singular}_observer.rb"
|
19
|
+
|
20
|
+
# Copy observer tests
|
21
|
+
unless options[:skip_test]
|
22
|
+
m.template "case_collection_observer_test.rb", "test/unit/#{observer_singular}_observer_test.rb"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def observer_singular
|
28
|
+
observer.underscore
|
29
|
+
end
|
30
|
+
|
31
|
+
def observer_singular_class
|
32
|
+
observer_singular.camelize
|
33
|
+
end
|
34
|
+
|
35
|
+
def models_singular
|
36
|
+
models.collect { |m| m.underscore }
|
37
|
+
end
|
38
|
+
|
39
|
+
def models_singular_sym
|
40
|
+
models_singular.collect { |m| ":#{m.to_sym}" }
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
def banner
|
45
|
+
"\nCase Collection Observer usage:\n" +
|
46
|
+
"========================================================" +
|
47
|
+
"\n#{$0} case_observer OBSERVER_NAME MODELS_TO_OBSERVE [options]\n"
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_options!(opt)
|
51
|
+
opt.separator ''
|
52
|
+
opt.separator 'Case Collection Observer options:'
|
53
|
+
opt.separator '========================================================'
|
54
|
+
opt.on("--skip-test", "Skip all tests for observer") { |value| options[:skip_test] = value }
|
55
|
+
end
|
56
|
+
|
57
|
+
def usage_message
|
58
|
+
''
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class <%= observer_singular_class %>Observer < ActiveRecord::Observer
|
2
|
+
<% unless models.empty? %>
|
3
|
+
observe <%= models_singular_sym.join(', ') %>
|
4
|
+
<% end %>
|
5
|
+
<% for model in models_singular %>
|
6
|
+
def before_save_<%= model.pluralize %>(<%= model %>)
|
7
|
+
end
|
8
|
+
|
9
|
+
def after_save_<%= model.pluralize %>(<%= model %>)
|
10
|
+
end
|
11
|
+
|
12
|
+
def before_destroy_<%= model.pluralize %>(<%= model %>)
|
13
|
+
end
|
14
|
+
|
15
|
+
def after_destroy_<%= model.pluralize %>(<%= model %>)
|
16
|
+
end
|
17
|
+
<% end %>
|
18
|
+
end
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "case_collection_observer"
|
@@ -0,0 +1 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/case_collection_observer/base"
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module CaseCollectionObserver
|
2
|
+
module Base
|
3
|
+
def self.included(base)
|
4
|
+
base.class_eval do
|
5
|
+
include InstanceMethods
|
6
|
+
extend ClassMethods
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module InstanceMethods
|
11
|
+
end
|
12
|
+
|
13
|
+
module ClassMethods
|
14
|
+
def has_many_with_observer(association_id, options = {}, &extension)
|
15
|
+
has_many association_id, case_observer_options(association_id, options), &extension
|
16
|
+
case_observer_callbacks(association_id)
|
17
|
+
end
|
18
|
+
|
19
|
+
def has_and_belongs_to_many_with_observer(association_id, options = {}, &extension)
|
20
|
+
has_and_belongs_to_many association_id, case_observer_options(association_id, options), &extension
|
21
|
+
case_observer_callbacks(association_id)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def case_observer_callbacks(association_id)
|
26
|
+
["before_save_#{association_id}", "after_save_#{association_id}",
|
27
|
+
"before_destroy_#{association_id}", "after_destroy_#{association_id}"].each do |method|
|
28
|
+
define_method method do |record|
|
29
|
+
self.class.changed
|
30
|
+
self.class.notify_observers(method, record)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def case_observer_options(association_id, options = {})
|
36
|
+
callbacks = %w(before_add after_add before_remove after_remove)
|
37
|
+
callbacks.each do |callback_name|
|
38
|
+
new_callback = case callback_name.to_sym
|
39
|
+
when :before_add
|
40
|
+
"before_save_#{association_id}".to_sym
|
41
|
+
when :after_add
|
42
|
+
"after_save_#{association_id}".to_sym
|
43
|
+
when :before_remove
|
44
|
+
"before_destroy_#{association_id}".to_sym
|
45
|
+
when :after_remove
|
46
|
+
"after_destroy_#{association_id}".to_sym
|
47
|
+
end
|
48
|
+
if options[callback_name.to_sym]
|
49
|
+
defined_callbacks = options[callback_name.to_sym]
|
50
|
+
options[callback_name.to_sym] = [defined_callbacks, new_callback]
|
51
|
+
else
|
52
|
+
options[callback_name.to_sym] = new_callback
|
53
|
+
end
|
54
|
+
end
|
55
|
+
return options
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
if defined?(::ActiveRecord)
|
62
|
+
module ::ActiveRecord
|
63
|
+
class Base
|
64
|
+
include CaseCollectionObserver::Base
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "case_collection_observer"
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: SpiritSC-case_collection_observer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Szymon Czarnecki
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-21 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Simple notifier for object in HM and HABTM associations in AR...
|
17
|
+
email: spirit_sc@thinkdifferent.pl
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- CHANGELOG
|
24
|
+
- LICENSE
|
25
|
+
- README
|
26
|
+
- lib/case_collection_observer.rb
|
27
|
+
- lib/case_collection_observer/base.rb
|
28
|
+
- lib/case_collection_observer/version.rb
|
29
|
+
- lib/casecollectionobserver.rb
|
30
|
+
files:
|
31
|
+
- CHANGELOG
|
32
|
+
- LICENSE
|
33
|
+
- Manifest
|
34
|
+
- README
|
35
|
+
- Rakefile
|
36
|
+
- generators/case_observer/USAGE
|
37
|
+
- generators/case_observer/case_observer_generator.rb
|
38
|
+
- generators/case_observer/templates/case_collection_observer.rb
|
39
|
+
- generators/case_observer/templates/case_collection_observer_test.rb
|
40
|
+
- init.rb
|
41
|
+
- lib/case_collection_observer.rb
|
42
|
+
- lib/case_collection_observer/base.rb
|
43
|
+
- lib/case_collection_observer/version.rb
|
44
|
+
- lib/casecollectionobserver.rb
|
45
|
+
- case_collection_observer.gemspec
|
46
|
+
has_rdoc: false
|
47
|
+
homepage: http://github.com/SpiritSC/Case-Collection-Observer
|
48
|
+
licenses:
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options:
|
51
|
+
- --line-numbers
|
52
|
+
- --inline-source
|
53
|
+
- --title
|
54
|
+
- Case_collection_observer
|
55
|
+
- --main
|
56
|
+
- README
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: "1.2"
|
70
|
+
version:
|
71
|
+
requirements: []
|
72
|
+
|
73
|
+
rubyforge_project: case_collection_observer
|
74
|
+
rubygems_version: 1.3.5
|
75
|
+
signing_key:
|
76
|
+
specification_version: 3
|
77
|
+
summary: Simple notifier for object in HM and HABTM associations in AR...
|
78
|
+
test_files: []
|
79
|
+
|