deas 0.15.0 → 0.16.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.
@@ -0,0 +1,38 @@
1
+ module Deas
2
+ module Plugin
3
+
4
+ # use the Plugin mixin to define your own custom plugins you want to mixin
5
+ # on your Deas view handlers. Define included hooks using `plugin_included`.
6
+ # this allows you to define multiple hooks separately and ensures the hooks
7
+ # will only be called once - even if your plugin is mixed in multiple times.
8
+
9
+ def self.included(receiver)
10
+ receiver.class_eval do
11
+ extend ClassMethods
12
+
13
+ # install an included hook that first checks if this plugin has
14
+ # already been installed on the reciever. If it has not been,
15
+ # class eval each callback on the receiver.
16
+
17
+ def self.included(plugin_receiver)
18
+ return if self.deas_plugin_receivers.include?(plugin_receiver)
19
+
20
+ self.deas_plugin_receivers.push(plugin_receiver)
21
+ self.deas_plugin_included_hooks.each do |hook|
22
+ plugin_receiver.class_eval(&hook)
23
+ end
24
+ end
25
+
26
+ end
27
+ end
28
+
29
+ module ClassMethods
30
+
31
+ def deas_plugin_receivers; @plugin_receivers ||= []; end
32
+ def deas_plugin_included_hooks; @plugin_included_hooks ||= []; end
33
+ def plugin_included(&hook); self.deas_plugin_included_hooks << hook; end
34
+
35
+ end
36
+
37
+ end
38
+ end
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.15.0"
2
+ VERSION = "0.16.0"
3
3
  end
@@ -73,8 +73,7 @@ module Deas
73
73
  module ClassMethods
74
74
 
75
75
  def layout(*args)
76
- @layouts = args unless args.empty?
77
- @layouts
76
+ (@layouts ||= []).tap{ |l| l.push(*args) }
78
77
  end
79
78
  alias :layouts :layout
80
79
 
@@ -0,0 +1,95 @@
1
+ require 'assert'
2
+ require 'deas/plugin'
3
+
4
+ module Deas::Plugin
5
+
6
+ class BaseTests < Assert::Context
7
+ TestPlugin = Module.new do
8
+ include Deas::Plugin
9
+
10
+ plugin_included{ inc_hook1 }
11
+ plugin_included{ inc_hook2 }
12
+ end
13
+
14
+ desc "Deas::Plugin"
15
+ setup do
16
+ @receiver = Class.new do
17
+ def self.inc_hook1; @hook1_count ||= 0; @hook1_count += 1; end
18
+ def self.hook1_count; @hook1_count ||= 0; end
19
+ def self.inc_hook2; @hook2_count ||= 0; @hook2_count += 1; end
20
+ def self.hook2_count; @hook2_count ||= 0; end
21
+ end
22
+
23
+ @hook1 = proc{ 1 }
24
+ @hook2 = proc{ 2 }
25
+
26
+ @plugin = Module.new{ include Deas::Plugin }
27
+ end
28
+ subject{ @plugin }
29
+
30
+ should have_imeths :deas_plugin_included_hooks, :deas_plugin_receivers
31
+ should have_imeths :plugin_included
32
+
33
+ should "have no plugin_included_hooks by default" do
34
+ assert_empty subject.deas_plugin_included_hooks
35
+ end
36
+
37
+ should "have no plugin_receivers by default" do
38
+ assert_empty subject.deas_plugin_receivers
39
+ end
40
+
41
+ should "append hooks with #plugin_included" do
42
+ subject.plugin_included(&@hook1)
43
+ subject.plugin_included(&@hook2)
44
+
45
+ assert_equal @hook1, subject.deas_plugin_included_hooks.first
46
+ assert_equal @hook2, subject.deas_plugin_included_hooks.last
47
+ end
48
+
49
+ should "call the plugin included hooks when mixed in" do
50
+ assert_equal 0, @receiver.hook1_count
51
+ assert_equal 0, @receiver.hook2_count
52
+
53
+ @receiver.send(:include, BaseTests::TestPlugin)
54
+
55
+ assert_equal 1, @receiver.hook1_count
56
+ assert_equal 1, @receiver.hook2_count
57
+ end
58
+
59
+ should "call hooks once when mixed in multiple times" do
60
+ @receiver.send(:include, BaseTests::TestPlugin)
61
+
62
+ assert_equal 1, @receiver.hook1_count
63
+ assert_equal 1, @receiver.hook2_count
64
+
65
+ @receiver.send(:include, BaseTests::TestPlugin)
66
+
67
+ assert_equal 1, @receiver.hook1_count
68
+ assert_equal 1, @receiver.hook2_count
69
+ end
70
+
71
+ should "call hooks once when mixed in by a 3rd party" do
72
+ third_party = Module.new do
73
+ def self.included(receiver)
74
+ receiver.send(:include, BaseTests::TestPlugin)
75
+ end
76
+ end
77
+ @receiver.send(:include, third_party)
78
+
79
+ assert_equal 1, @receiver.hook1_count
80
+ assert_equal 1, @receiver.hook2_count
81
+
82
+ @receiver.send(:include, BaseTests::TestPlugin)
83
+
84
+ assert_equal 1, @receiver.hook1_count
85
+ assert_equal 1, @receiver.hook2_count
86
+
87
+ @receiver.send(:include, third_party)
88
+
89
+ assert_equal 1, @receiver.hook1_count
90
+ assert_equal 1, @receiver.hook2_count
91
+ end
92
+
93
+ end
94
+
95
+ end
@@ -37,10 +37,10 @@ module Deas::ViewHandler
37
37
  handler_class = Class.new{ include Deas::ViewHandler }
38
38
 
39
39
  handler_class.layout 'layouts/app'
40
- assert_equal [ 'layouts/app' ], handler_class.layouts
40
+ assert_equal ['layouts/app'], handler_class.layouts
41
41
 
42
42
  handler_class.layouts 'layouts/web', 'layouts/search'
43
- assert_equal [ 'layouts/web', 'layouts/search' ], handler_class.layouts
43
+ assert_equal ['layouts/app', 'layouts/web', 'layouts/search'], handler_class.layouts
44
44
  end
45
45
 
46
46
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deas
3
3
  version: !ruby/object:Gem::Version
4
- hash: 35
4
+ hash: 95
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 15
8
+ - 16
9
9
  - 0
10
- version: 0.15.0
10
+ version: 0.16.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2013-05-29 00:00:00 Z
19
+ date: 2013-06-01 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: ns-options
@@ -148,6 +148,7 @@ files:
148
148
  - lib/deas/error_handler.rb
149
149
  - lib/deas/exceptions.rb
150
150
  - lib/deas/logging.rb
151
+ - lib/deas/plugin.rb
151
152
  - lib/deas/rack_request_fix.rb
152
153
  - lib/deas/redirect_handler.rb
153
154
  - lib/deas/route.rb
@@ -184,6 +185,7 @@ files:
184
185
  - test/unit/error_handler_tests.rb
185
186
  - test/unit/exceptions_tests.rb
186
187
  - test/unit/logging_tests.rb
188
+ - test/unit/plugin_tests.rb
187
189
  - test/unit/redirect_handler_tests.rb
188
190
  - test/unit/route_tests.rb
189
191
  - test/unit/runner_tests.rb
@@ -251,6 +253,7 @@ test_files:
251
253
  - test/unit/error_handler_tests.rb
252
254
  - test/unit/exceptions_tests.rb
253
255
  - test/unit/logging_tests.rb
256
+ - test/unit/plugin_tests.rb
254
257
  - test/unit/redirect_handler_tests.rb
255
258
  - test/unit/route_tests.rb
256
259
  - test/unit/runner_tests.rb