notification_center 0.2

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/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,33 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ notification_center (0.2)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ coderay (1.0.7)
10
+ diff-lcs (1.1.3)
11
+ method_source (0.7.1)
12
+ pry (0.9.9.6)
13
+ coderay (~> 1.0.5)
14
+ method_source (~> 0.7.1)
15
+ slop (>= 2.4.4, < 3)
16
+ rspec (2.10.0)
17
+ rspec-core (~> 2.10.0)
18
+ rspec-expectations (~> 2.10.0)
19
+ rspec-mocks (~> 2.10.0)
20
+ rspec-core (2.10.1)
21
+ rspec-expectations (2.10.0)
22
+ diff-lcs (~> 1.1.3)
23
+ rspec-mocks (2.10.1)
24
+ slop (2.4.4)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ bundler
31
+ notification_center!
32
+ pry
33
+ rspec (~> 2.10.0)
data/README.md ADDED
@@ -0,0 +1,81 @@
1
+ ## Notification/listener solution for ruby
2
+
3
+ ## Features
4
+
5
+ * any number of listners
6
+ * only one event of one kind can be fired per request (cache)
7
+ * disable/enable events (nice feature for tests)
8
+
9
+ ## Configuration for rails
10
+
11
+ In your Gemfile
12
+
13
+ ```ruby
14
+ gem 'notification_center', github: 'Houdini/notification_center'
15
+ ```
16
+
17
+ config/initializers/notification_center.rb
18
+
19
+ ```ruby
20
+ NotificationCenter.configure do
21
+ enable_cache = true # only one event fired in one request scope, default is false
22
+ end
23
+ ```
24
+
25
+ ## Use
26
+
27
+ In any class or multiple classes:
28
+
29
+ ```ruby
30
+ class SomeClass
31
+ observe :some_event
32
+
33
+ def some_event_handler # any number of args are possible
34
+ end
35
+ end
36
+ ```
37
+
38
+ Anywhere in code:
39
+
40
+ ```ruby
41
+ NotificationCenter.post_notification :some_event
42
+ ```
43
+
44
+ ## Common practice
45
+
46
+ Create directory app/listeners and put listeners there, like user_listener.rb
47
+
48
+ ```ruby
49
+ class UserListener
50
+ observe :user_did_some_action
51
+
52
+ def user_did_some_action_handler
53
+ # some complex logic
54
+ end
55
+ end
56
+ ```
57
+
58
+ ## Important
59
+
60
+ Make sure, that your classes are preloaded!
61
+ So for app/listeners, put this code to your application.rb
62
+
63
+ ```ruby
64
+ Dir[Rails.root.join + 'app/listeners/*.rb'].map{|f| require f}
65
+ ```
66
+
67
+ ## For rspec
68
+
69
+ In your spec_helper.rb
70
+
71
+ ```ruby
72
+ require 'notification_center/rspec_helpers'
73
+ ```
74
+
75
+ Then you can use notifications: false in describe, context, it. Like:
76
+
77
+ ```ruby
78
+ describe User, notifications: false do
79
+
80
+ it "should do smth", notifications: false do
81
+ ```
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rspec/core/rake_task'
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ task :test => :spec
10
+ task :default => :spec
@@ -0,0 +1,22 @@
1
+ module NotificationCenter
2
+ module Configuration
3
+ VALID_OPTIONS_KEYS = [:enable_cache, :enable_notifications, :method_suffix]
4
+
5
+ DEFAULT_ENABLE_CACHE = false
6
+ DEFAULT_ENABLE_NOTIFICATIONS = true
7
+ DEFAULT_METHOD_SUFFIX = 'handler'
8
+
9
+ attr_accessor *VALID_OPTIONS_KEYS
10
+
11
+ def self.extended base
12
+ base.reset
13
+ end
14
+
15
+ def reset
16
+ self.enable_cache = DEFAULT_ENABLE_CACHE
17
+ self.enable_notifications = DEFAULT_ENABLE_NOTIFICATIONS
18
+ self.method_suffix = DEFAULT_METHOD_SUFFIX
19
+ self
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ module NotificationCenter
2
+ module CoreExt
3
+ module Module
4
+ def observe *events
5
+ stored_events = NotificationCenter.events.dup
6
+ for event in events
7
+ next if stored_events.has_key? event
8
+ stored_events[event] += Array self
9
+ stored_events[event] = stored_events[event].uniq
10
+ end
11
+ NotificationCenter.events = stored_events
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ ::Module.__send__ :include, NotificationCenter::CoreExt::Module
@@ -0,0 +1,11 @@
1
+ module NotificationCenter
2
+ module RspecHelpers
3
+ Rspec.configure do |config|
4
+ config.around(:each) do |spec|
5
+ NotificationCenter.enable_notifications = false if spec.metadata[:notifications] == false
6
+ spec.call
7
+ NotificationCenter.enable_notifications = true if spec.metadata[:notifications] == false
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module NotificationCener
2
+ VERSION = "0.2".freeze
3
+ end
@@ -0,0 +1,42 @@
1
+ require 'notification_center/core_ext/module'
2
+ require 'notification_center/configuration'
3
+ require 'set'
4
+
5
+ module NotificationCenter
6
+ extend Configuration
7
+ class << self
8
+ def events; @@events end
9
+ def events= hash; @@events = hash end
10
+
11
+ def flush_cache!; @cache = nil end
12
+
13
+ def _initialize_event_store
14
+ @@events = Hash.new Array.new
15
+ end
16
+ alias :forget_observers! :_initialize_event_store
17
+
18
+ def post_notification *args
19
+ event = args.shift
20
+ if enable_notifications
21
+ enable_cache ? _with_cache(event){ _notify! event, *args } : _notify!(event, *args)
22
+ end
23
+ end
24
+
25
+ def _notify! event, *args
26
+ event_handler = "#{event}_#{method_suffix}"
27
+ receivers = @@events[event]
28
+ for receiver in receivers
29
+ receiver.send event_handler, *args
30
+ end
31
+ end
32
+
33
+ def _with_cache event
34
+ @cache ||= Set.new
35
+ unless @cache.include? event
36
+ yield
37
+ @cache << event
38
+ end
39
+ end
40
+ end
41
+ self._initialize_event_store
42
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "notification_center/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "notification_center"
7
+ s.version = NotificationCener::VERSION.dup
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Dmitrii Golub"]
10
+ s.email = ["dmitrii.golub@gmail.com"]
11
+ s.homepage = "http://github.com/Houdini/notification_center"
12
+ s.summary = %q{Observer pattern for ruby}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_development_dependency("bundler")
20
+ s.add_development_dependency("rspec", "~> 2.10.0")
21
+ s.add_development_dependency("pry")
22
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe NotificationCenter do
5
+ describe '.post_notification' do
6
+ before { NotificationCenter.flush_cache! }
7
+
8
+ it "should fire event handler" do
9
+ EventListener = Class.new { observe :event }
10
+ EventListener.should_receive(:event_handler)
11
+ NotificationCenter.post_notification :event
12
+ end
13
+
14
+ it "should not raise any exception when no event" do
15
+ NotificationCenter.post_notification :imaginary_event
16
+ end
17
+
18
+ context 'when cache disabled' do
19
+ before { NotificationCenter.enable_cache = false }
20
+ it "should not fire event twice" do
21
+ EventListener = Class.new { observe :event }
22
+ EventListener.should_receive(:event_handler).twice
23
+
24
+ NotificationCenter.post_notification :event
25
+ NotificationCenter.post_notification :event
26
+ end
27
+ end
28
+
29
+ context 'when cache enabled' do
30
+ before { NotificationCenter.enable_cache = true }
31
+
32
+ it "should not fire event twice" do
33
+ EventListener = Class.new { observe :event }
34
+ EventListener.should_receive :event_handler
35
+
36
+ NotificationCenter.post_notification :event
37
+ NotificationCenter.post_notification :event
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+
4
+ require 'pry'
5
+ require 'notification_center'
6
+
7
+ RSpec.configure do |config|
8
+ config.before do
9
+ NotificationCenter.forget_observers!
10
+ NotificationCenter.reset
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: notification_center
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dmitrii Golub
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.10.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.10.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description:
63
+ email:
64
+ - dmitrii.golub@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - Gemfile
70
+ - Gemfile.lock
71
+ - README.md
72
+ - Rakefile
73
+ - lib/notification_center.rb
74
+ - lib/notification_center/configuration.rb
75
+ - lib/notification_center/core_ext/module.rb
76
+ - lib/notification_center/rspec_helpers.rb
77
+ - lib/notification_center/version.rb
78
+ - notification_center.gemspec
79
+ - spec/lib/notification_center_spec.rb
80
+ - spec/spec_helper.rb
81
+ homepage: http://github.com/Houdini/notification_center
82
+ licenses: []
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ! '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 1.8.24
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: Observer pattern for ruby
105
+ test_files:
106
+ - spec/lib/notification_center_spec.rb
107
+ - spec/spec_helper.rb
108
+ has_rdoc: