manacle 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4c15b4fe1557d5ec2312bb4223ac342bd6b7432d
4
+ data.tar.gz: e1fadac4c7532ef3533daafa688ae4171c98886b
5
+ SHA512:
6
+ metadata.gz: a954e2e91239354668392b1a8cc2026a31a908f19658157cb93785890633e8ce59ef0f028e4efdd20211d0eb3a683300abe918c0f64e2c16e761ab77c4628ebb
7
+ data.tar.gz: ad2fce07cb9bbf6b2488d6b4265c2c424dadf3e111da3ff65ea527eecb005d268d772844912f6caeeb13e950627bc20e30f3a7dc41b7c5f9e8af6240653939f7
@@ -0,0 +1,70 @@
1
+ require 'manacle/constraint/actuator/base'
2
+ require 'manacle/constraint/actuator/nested'
3
+
4
+ module Manacle
5
+ # Include this, and magically each of your decorators will get a time
6
+ # attached, as well as delegation to all the modules contained therein.
7
+ #
8
+ # You can then override the parts of Time you want to change.
9
+ module Constraint
10
+ module InstanceMethods
11
+
12
+ def initialize(obj)
13
+ if obj.nil?
14
+ raise
15
+ end
16
+
17
+ if obj.class < Manacle::Proxy
18
+ raise
19
+ end
20
+
21
+ @actuator = if obj.class < Actuator
22
+ obj
23
+ else
24
+ Actuator.build(obj, self)
25
+ end
26
+ end
27
+
28
+ attr_reader :actuator
29
+
30
+ def constrainables
31
+ self.class.constrainables
32
+ end
33
+
34
+ def reconstrain(obj)
35
+ r = @actuator.reconstrain(obj)
36
+ self.class.new(r)
37
+ end
38
+
39
+ def unconstrain
40
+ @actuator.unconstrain
41
+ end
42
+
43
+ def constrain
44
+ @actuator.constrain
45
+ end
46
+
47
+ def proxy
48
+ proxy_class = @actuator.proxy
49
+ unless proxy_class.kind_of?(Class)
50
+ raise "#{@actuator.inspect} is proxying non-classes: #{self.levels}"
51
+ end
52
+ proxy_class.new(self)
53
+ end
54
+
55
+ def klass
56
+ @actuator.constrain.class
57
+ end
58
+
59
+ def levels
60
+ ["CONSTRAINT #{constraint}"] + @actuator.levels
61
+ end
62
+ end
63
+
64
+ def self.included(base)
65
+ base.instance_eval do
66
+ include InstanceMethods
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,15 @@
1
+ module Manacle
2
+ module Constraint
3
+ module Actuator
4
+ module_function
5
+
6
+ def build(subject, constraint)
7
+ if subject.class < Constraint
8
+ Actuator::Nested.new(subject.actuator, constraint)
9
+ else
10
+ Actuator::Base.new(subject, constraint)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,46 @@
1
+ require 'manacle/constraint/actuator'
2
+
3
+ require 'manacle/proxy/templates'
4
+
5
+ module Manacle
6
+ # Include this, and magically each of your decorators will get a time
7
+ # attached, as well as delegation to all the modules contained therein.
8
+ #
9
+ # You can then override the parts of Time you want to change.
10
+ module Constraint
11
+ module Actuator
12
+ class Base
13
+
14
+ include Manacle::Constraint::Actuator
15
+
16
+ def initialize(val, constraint)
17
+ if val.kind_of?(self.class)
18
+ raise
19
+ end
20
+ @val = val
21
+ @constraint = constraint
22
+ end
23
+
24
+ def unconstrain
25
+ @val
26
+ end
27
+
28
+ def levels
29
+ [self.class, @val.class]
30
+ end
31
+
32
+ def proxy
33
+ Manacle::Proxy::Templates.for(@val)
34
+ end
35
+
36
+ def reconstrain(obj)
37
+ self.class.new(obj, @constraint)
38
+ end
39
+
40
+ def constrain
41
+ @constrained ||= @constraint.base_constrain(@val)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,45 @@
1
+ require 'manacle/constraint/actuator'
2
+
3
+ module Manacle
4
+ module Constraint
5
+ module Actuator
6
+ class Nested
7
+
8
+ include Manacle::Constraint::Actuator
9
+
10
+ def initialize(nested, constraint)
11
+ @nested = nested
12
+ @constraint = constraint
13
+ end
14
+
15
+ def unconstrain
16
+ @nested.unconstrain
17
+ end
18
+
19
+ def reconstrain(obj)
20
+ res = @nested.reconstrain(obj)
21
+ self.class.new(res, @constraint)
22
+ end
23
+
24
+ def proxy
25
+ @nested.proxy
26
+ end
27
+
28
+ def levels
29
+ [self.class] + @nested.levels
30
+ end
31
+
32
+ def constrain
33
+ @constrained ||= build_constraint
34
+ end
35
+
36
+ private
37
+
38
+ def build_constraint
39
+ res = @nested.constrain
40
+ @constraint.base_constrain(res)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ require 'manacle/constraint'
2
+
3
+ module Manacle
4
+ module Constraint
5
+ module Method
6
+ def self.included(base)
7
+ base.instance_eval do
8
+ include Manacle::Constraint
9
+ end
10
+ end
11
+
12
+ def base_constrain(val)
13
+ val.method(constraint).call
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,31 @@
1
+ module Manacle
2
+ class Proxy
3
+ module InstanceMethods
4
+ def inspect
5
+ "#<Manacle::Proxy::#{self.class} #<Manacle::Constraint::#{@constraint.class} #{@constraint.inspect}>"
6
+ end
7
+
8
+ def unproxy
9
+ @constraint
10
+ end
11
+
12
+ def constrain
13
+ @constrained ||= @constraint.constrain
14
+ end
15
+
16
+ def unconstrain
17
+ @constraint.unconstrain
18
+ end
19
+
20
+ def initialize(constraint)
21
+ if constraint.nil?
22
+ raise
23
+ end
24
+ unless constraint.kind_of?(Manacle::Constraint)
25
+ raise
26
+ end
27
+ @constraint = constraint
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ require 'manacle/proxy/template'
2
+ module Manacle
3
+ class Proxy
4
+ class Factory
5
+ def initialize(constraint)
6
+ @constraint = constraint
7
+ @templates = Manacle::Proxy::Template::Collection.new(@constraint.constrainables)
8
+ end
9
+
10
+ def proxyable?(obj)
11
+ @templates.has_key?(obj.class)
12
+ end
13
+
14
+ def proxy(obj)
15
+ c = @constraint.new(obj)
16
+ @templates.fetch(obj.class).for(c)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ module Manacle
2
+ class Proxy
3
+ module Method
4
+ def initialize(name)
5
+ @name = name
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,35 @@
1
+ require 'manacle/proxy/method'
2
+
3
+ module Manacle
4
+ class Proxy
5
+ module Method
6
+ class Constrained
7
+ class Postprocessor
8
+ def initialize(proxy)
9
+ @constraint = proxy.unproxy
10
+ end
11
+
12
+ def process(result)
13
+ if @constraint.constrainables.include?(result.class)
14
+ @constraint.reconstrain(result).proxy
15
+ else
16
+ result
17
+ end
18
+ end
19
+ end
20
+
21
+ include Manacle::Proxy::Method
22
+
23
+ def bind(proxy)
24
+ proxy.instance_exec(@name) do |name|
25
+ define_method(name) do |*args|
26
+ postprocessor = Postprocessor.new(self)
27
+ res = constrain.method(name).call(*args)
28
+ postprocessor.process(res)
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ require 'manacle/proxy/method'
2
+
3
+ module Manacle
4
+ class Proxy
5
+ module Method
6
+ class Unconstrained
7
+ include Manacle::Proxy::Method
8
+ def bind(proxy)
9
+ proxy.instance_exec(@name) do |name|
10
+ define_method(name) do |*args|
11
+ @constraint.method(name).call(*args)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,36 @@
1
+ require 'delegate'
2
+
3
+ require 'manacle/proxy'
4
+ require 'manacle/proxy/method/constrained'
5
+ require 'manacle/proxy/method/unconstrained'
6
+
7
+ module Manacle
8
+ class Proxy
9
+ class Template
10
+ def self.cut(klass)
11
+ Class.new do |k|
12
+ include Manacle::Proxy::InstanceMethods
13
+
14
+ define_method(:proxied_klass) do
15
+ klass
16
+ end
17
+ private :proxied_klass
18
+
19
+ methods = klass.instance_methods.reject {|m|
20
+ [:inspect, :new, :class].include?(m)
21
+ }.map {|m|
22
+ Method::Constrained.new(m)
23
+ } +
24
+ Manacle::Constraint::InstanceMethods.instance_methods.map {|m|
25
+ Method::Unconstrained.new(m)
26
+ }
27
+
28
+
29
+ methods.each do |mth|
30
+ mth.bind(self)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ require 'manacle/proxy/template'
2
+
3
+ module Manacle
4
+ class Proxy
5
+ class Template
6
+ class Factory
7
+ def initialize
8
+ @proxies = {}
9
+ end
10
+
11
+ def build(klass)
12
+ @proxies[klass] ||= Template.cut(klass)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,40 @@
1
+ require 'punchout/fabricable'
2
+ require 'punchout/puncher'
3
+ require 'punchout/puncher/matchable'
4
+ require 'punchout/matcher/class'
5
+ require 'manacle/proxy/template/factory'
6
+
7
+ module Manacle
8
+ class Proxy
9
+ module Templates
10
+ class Factory
11
+ def initialize
12
+ @factory = Manacle::Proxy::Template::Factory.new
13
+ end
14
+
15
+ def build(obj)
16
+ matcher = Punchout::Matcher::Klass.new(obj.class)
17
+ built = @factory.build(obj)
18
+
19
+ Punchout::Puncher::Matchable.new(matcher, built)
20
+ end
21
+ end
22
+
23
+ extend Punchout::Fabricable
24
+
25
+ module_function
26
+
27
+ def factory
28
+ @factory ||= Factory.new
29
+ end
30
+
31
+ def for(obj)
32
+ res = puncher.punch(obj.class)
33
+ unless res.kind_of?(Class)
34
+ raise
35
+ end
36
+ res
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,155 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ require 'active_support/core_ext'
4
+ require 'date'
5
+ require 'manacle/constraint/method'
6
+
7
+ class Manacle::Constraint::Test < Test::Unit::TestCase
8
+ test '#constrain' do
9
+ mock_constrainable = Class.new do
10
+
11
+ def self.constrainables
12
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
13
+ end
14
+
15
+ include Manacle::Constraint::Method
16
+
17
+ def constraint
18
+ :utc
19
+ end
20
+ end
21
+
22
+ time = Time.new
23
+
24
+ orig = mock_constrainable.new(time)
25
+
26
+ mod = orig.reconstrain(Time.now.utc)
27
+ end
28
+
29
+ test '#constrain comparisons' do
30
+ mock_constrainable = Class.new do
31
+
32
+ def self.constrainables
33
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
34
+ end
35
+
36
+ include Manacle::Constraint::Method
37
+
38
+ def constraint
39
+ :utc
40
+ end
41
+ end
42
+
43
+ time = Time.new
44
+
45
+ orig_cons = mock_constrainable.new(time)
46
+
47
+ orig = orig_cons.proxy
48
+
49
+ steps = [60*60*24, 60*60*5, 60*30]
50
+
51
+ mod = steps.reduce(orig) {|d, s|
52
+ d + s
53
+ }
54
+ assert_equal 1, mod <=> orig
55
+ assert_equal -1, orig <=> mod
56
+ assert_equal 0, orig <=> orig
57
+
58
+ assert mod.kind_of?(::Time), "Result of kind #{mod.class.ancestors} instead of Time"
59
+ assert_equal mod.constrain, (time + 60*60*24 + 60*60*5 + 60*30).utc
60
+ end
61
+
62
+ test '#constrain nesting' do
63
+ mock_constrainable = Class.new do
64
+ def self.constrainables
65
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
66
+ end
67
+
68
+ include Manacle::Constraint::Method
69
+
70
+ def constraint
71
+ :utc
72
+ end
73
+ end
74
+
75
+ mock_other_constrainable = Class.new do
76
+ def self.constrainables
77
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
78
+ end
79
+
80
+ include Manacle::Constraint::Method
81
+
82
+ def constraint
83
+ :beginning_of_day
84
+ end
85
+ end
86
+
87
+ time = Time.now.in_time_zone('PST8PDT')
88
+
89
+ orig_cons = mock_constrainable.new(time)
90
+ oo_cons = mock_other_constrainable.new(orig_cons)
91
+ oo = oo_cons.proxy
92
+
93
+
94
+ mod = oo + (1.day + 5.hours + 30.minutes)
95
+
96
+
97
+ assert mod.kind_of?(::Time)
98
+ assert_equal mod.constrain, (time + 1.day).utc.beginning_of_day
99
+
100
+ end
101
+
102
+ test '#constrain repeated' do
103
+ mock_constrainable = Class.new do
104
+
105
+ def self.constrainables
106
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
107
+ end
108
+
109
+ include Manacle::Constraint::Method
110
+
111
+ def constraint
112
+ :utc
113
+ end
114
+ end
115
+
116
+ mock_other_constrainable = Class.new do
117
+ def self.constrainables
118
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
119
+ end
120
+
121
+ include Manacle::Constraint::Method
122
+
123
+ def constraint
124
+ :beginning_of_day
125
+ end
126
+ end
127
+
128
+ time = Time.now.in_time_zone('PST8PDT')
129
+
130
+ orig_cons = mock_constrainable.new(time)
131
+ oo_cons = mock_other_constrainable.new(orig_cons)
132
+
133
+ oo = oo_cons.proxy
134
+
135
+
136
+ 5.times do
137
+ oo = oo + (1.day + 5.hours + 30.minutes)
138
+ end
139
+
140
+
141
+ 5.times do
142
+ oo = oo.in_time_zone("PST8PDT")
143
+ end
144
+
145
+
146
+ assert_kind_of ::Time, oo
147
+ constrained = oo.constrain
148
+ assert_kind_of ::Time, constrained
149
+
150
+ expected_time = (time + 5.day).utc.beginning_of_day
151
+ assert_equal expected_time, constrained
152
+
153
+ end
154
+ end
155
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ require 'active_support/core_ext'
4
+ require 'manacle/constraint/method'
5
+
6
+ class Manacle::Proxy::Test < Test::Unit::TestCase
7
+ end
@@ -0,0 +1,151 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ require 'active_support/core_ext'
4
+ require 'date'
5
+ require 'manacle/constraint/method'
6
+
7
+ class Manacle::ConstraintTest < Test::Unit::TestCase
8
+ test '#constrain' do
9
+ mock_constrainable = Class.new do
10
+
11
+ def self.constrainables
12
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
13
+ end
14
+
15
+ include Manacle::Constraint::Method
16
+
17
+ def constraint
18
+ :utc
19
+ end
20
+ end
21
+
22
+ time = Time.new
23
+
24
+ orig = mock_constrainable.new(time).proxy
25
+
26
+ mod = orig + 1.day + 5.hours + 30.minutes
27
+
28
+ assert mod.kind_of?(::Time), "Result of kind #{mod.class.ancestors} instead of Time"
29
+ assert_equal mod.constrain, (time + 1.day + 5.hours + 30.minutes).utc
30
+ end
31
+
32
+ test '#constrain comparisons' do
33
+ mock_constrainable = Class.new do
34
+
35
+ def self.constrainables
36
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
37
+ end
38
+
39
+ include Manacle::Constraint::Method
40
+
41
+ def constraint
42
+ :utc
43
+ end
44
+ end
45
+
46
+ time = Time.new
47
+
48
+ orig = mock_constrainable.new(time).proxy
49
+
50
+
51
+ mod = orig + 1.day + 5.hours + 30.minutes
52
+
53
+ assert_equal 1, mod <=> orig
54
+ assert_equal -1, orig <=> mod
55
+ assert_equal 0, orig <=> orig
56
+
57
+ assert mod.kind_of?(::Time), "Result of kind #{mod.class.ancestors} instead of Time"
58
+ assert_equal mod.constrain, (time + 1.day + 5.hours + 30.minutes).utc
59
+ end
60
+
61
+ test '#constrain nesting' do
62
+ mock_constrainable = Class.new do
63
+ def self.constrainables
64
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
65
+ end
66
+
67
+ include Manacle::Constraint::Method
68
+
69
+ def constraint
70
+ :utc
71
+ end
72
+ end
73
+
74
+ mock_other_constrainable = Class.new do
75
+ def self.constrainables
76
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
77
+ end
78
+
79
+ include Manacle::Constraint::Method
80
+
81
+ def constraint
82
+ :beginning_of_day
83
+ end
84
+ end
85
+
86
+ time = Time.now.in_time_zone('PST8PDT')
87
+
88
+ orig_cons = mock_constrainable.new(time)
89
+ oo_cons = mock_other_constrainable.new(orig_cons)
90
+ oo = oo_cons.proxy
91
+
92
+ mod = oo + (1.day + 5.hours + 30.minutes)
93
+
94
+ assert mod.kind_of?(::Time)
95
+ assert_equal mod.constrain, (time + 1.day).utc.beginning_of_day
96
+
97
+ end
98
+
99
+ test '#constrain repeated' do
100
+ mock_constrainable = Class.new do
101
+
102
+ def self.constrainables
103
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
104
+ end
105
+
106
+ include Manacle::Constraint::Method
107
+
108
+ def constraint
109
+ :utc
110
+ end
111
+ end
112
+
113
+ mock_other_constrainable = Class.new do
114
+ def self.constrainables
115
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
116
+ end
117
+
118
+ include Manacle::Constraint::Method
119
+
120
+ def constraint
121
+ :beginning_of_day
122
+ end
123
+ end
124
+
125
+ time = Time.now.in_time_zone('PST8PDT')
126
+
127
+ orig_cons = mock_constrainable.new(time)
128
+ oo_cons = mock_other_constrainable.new(orig_cons)
129
+
130
+ oo = oo_cons.proxy
131
+
132
+
133
+ 5.times do
134
+ oo = oo + (1.day + 5.hours + 30.minutes)
135
+ end
136
+
137
+ 5.times do
138
+ oo = oo.in_time_zone("PST8PDT")
139
+ end
140
+
141
+
142
+ assert_kind_of ::Time, oo
143
+ constrained = oo.constrain
144
+ assert_kind_of ::Time, constrained
145
+
146
+ expected_time = (time + 5.day).utc.beginning_of_day
147
+ assert_equal expected_time, constrained
148
+
149
+ end
150
+ end
151
+
@@ -0,0 +1,7 @@
1
+ $:.push('lib')
2
+
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ require 'test/unit/testcase'
7
+ require "mocha/setup"
@@ -0,0 +1,58 @@
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
+
3
+ require 'manacle/constraint/actuator/base'
4
+
5
+ class Manacle::Constraint::Actuator::BaseTest < Test::Unit::TestCase
6
+ def setup
7
+ @mock_value = mock
8
+ @mock_constraint = mock
9
+
10
+ @actuator = Manacle::Constraint::Actuator::Base.new(@mock_value, @mock_constraint)
11
+
12
+ end
13
+
14
+ puts Test::Unit::TestCase.method(:test).inspect
15
+
16
+ test '#constrain uncached' do
17
+
18
+ mock_constrained = mock
19
+ @mock_constraint.expects(:base_constrain).returns(mock_constrained)
20
+
21
+ result = @actuator.constrain
22
+
23
+ assert_equal mock_constrained, result
24
+ end
25
+
26
+ test '#constrain cached' do
27
+
28
+ mock_constrained = mock
29
+
30
+ @mock_value.expects(:constrain).never
31
+
32
+ @actuator.instance_variable_set(:@constrained, mock_constrained)
33
+
34
+ result = @actuator.constrain
35
+
36
+ assert_equal mock_constrained, result
37
+ end
38
+
39
+ test '#reconstrain' do
40
+ mock_new_value = mock
41
+
42
+ mock_actuator = mock
43
+ Manacle::Constraint::Actuator::Base.expects(:new).with(mock_new_value, @mock_constraint).returns(mock_actuator)
44
+
45
+ result = @actuator.reconstrain(mock_new_value)
46
+
47
+ assert_equal mock_actuator, result
48
+ end
49
+
50
+ test '#proxy' do
51
+ mock_proxy = mock
52
+ Manacle::Proxy::Templates.expects(:for).with(@mock_value).returns(mock_proxy)
53
+
54
+ result = @actuator.proxy
55
+
56
+ assert_equal mock_proxy, result
57
+ end
58
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
+
3
+ require 'manacle/constraint/actuator/nested'
4
+
5
+ class Manacle::Constraint::Actuator::NestedTest < Test::Unit::TestCase
6
+ def setup
7
+ @mock_nested = mock
8
+ @mock_constraint = mock
9
+
10
+ @actuator = Manacle::Constraint::Actuator::Nested.new(@mock_nested, @mock_constraint)
11
+
12
+ end
13
+
14
+ test '#constrain uncached' do
15
+
16
+ mock_ascending_value = mock
17
+ @mock_nested.expects(:constrain).returns(mock_ascending_value)
18
+
19
+ mock_constrained = mock
20
+ @mock_constraint.expects(:base_constrain).returns(mock_constrained)
21
+
22
+ result = @actuator.constrain
23
+
24
+ assert_equal mock_constrained, result
25
+ end
26
+
27
+ test '#constrain cached' do
28
+ mock_constrained = mock
29
+
30
+ @mock_nested.expects(:constrain).never
31
+
32
+ @actuator.instance_variable_set(:@constrained, mock_constrained)
33
+
34
+ result = @actuator.constrain
35
+
36
+ assert_equal mock_constrained, result
37
+ end
38
+
39
+ test '#reconstrain' do
40
+ mock_object = mock
41
+
42
+ mock_new_nested = mock
43
+ @mock_nested.expects(:reconstrain).with(mock_object).returns(mock_new_nested)
44
+
45
+ mock_new_actuator = mock
46
+ Manacle::Constraint::Actuator::Nested.expects(:new).with(mock_new_nested, @mock_constraint).returns(mock_new_actuator)
47
+
48
+ result = @actuator.reconstrain(mock_object)
49
+
50
+ assert_equal mock_new_actuator, result
51
+ end
52
+
53
+ test '#proxy' do
54
+ mock_proxy = mock
55
+ @mock_nested.expects(:proxy).returns(mock_proxy)
56
+
57
+ result = @actuator.proxy
58
+ assert_equal mock_proxy, result
59
+ end
60
+ end
61
+
62
+
@@ -0,0 +1,65 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ require 'manacle/constraint'
4
+
5
+ class Manacle::ConstraintTest < Test::Unit::TestCase
6
+ def setup
7
+ @mock_constrainable = Class.new do
8
+
9
+ def self.constrainables
10
+ [ActiveSupport::TimeWithZone, ::Time, ::Date]
11
+ end
12
+
13
+ include Manacle::Constraint
14
+
15
+ def constraint=(constraint)
16
+ @constraint = constraint
17
+ end
18
+
19
+ def constraint
20
+ @constraint
21
+ end
22
+ end
23
+
24
+ @mock_obj = mock
25
+
26
+ @mock_actuator = mock
27
+
28
+ Manacle::Constraint::Actuator.expects(:build).with(@mock_obj, instance_of(@mock_constrainable)).returns(@mock_actuator)
29
+
30
+ @constraint = @mock_constrainable.new(@mock_obj)
31
+
32
+ @mock_constraint = mock
33
+
34
+ @constraint.constraint = @mock_constraint
35
+ end
36
+
37
+ test "#klass" do
38
+ mock_val = mock
39
+ @mock_actuator.expects(:constrain).returns(mock_val)
40
+
41
+ mock_val_class = mock
42
+ mock_val.expects(:class).returns(mock_val_class)
43
+
44
+ result = @constraint.klass
45
+ assert_equal mock_val_class, result
46
+ end
47
+
48
+ test "#unconstrain" do
49
+ @mock_actuator.expects(:unconstrain).returns(@mock_obj)
50
+
51
+ result = @constraint.unconstrain
52
+
53
+ assert_equal @mock_obj, result
54
+ end
55
+
56
+ test "#reconstrain" do
57
+ mock_new_obj = mock
58
+ @mock_actuator.expects(:reconstrain).returns(mock_new_obj)
59
+
60
+ mock_new_actuator = mock
61
+ Manacle::Constraint::Actuator.expects(:build).with(mock_new_obj, instance_of(@mock_constrainable)).returns(mock_new_actuator)
62
+
63
+ result = @constraint.reconstrain(mock_new_obj)
64
+ end
65
+ end
File without changes
@@ -0,0 +1,48 @@
1
+ require File.expand_path('../../../test_helper', __FILE__)
2
+
3
+ require 'manacle/proxy/template'
4
+
5
+ class Manacle::Proxy::TemplateTest < Test::Unit::TestCase
6
+ class MockClass ; end
7
+
8
+
9
+ test ".ancestors" do
10
+ mock_klass = MockClass
11
+
12
+ mock_instance_methods = 5.times.map {|x|
13
+ "method_#{x}".to_sym
14
+ }
15
+
16
+ mock_klass.expects(:instance_methods).returns(mock_instance_methods)
17
+
18
+ mock_proxy_klass = Manacle::Proxy::Template.cut(mock_klass)
19
+
20
+ mock_proxy_klass.ancestors.include?(MockClass)
21
+ end
22
+
23
+ test ".cut" do
24
+ mock_klass = MockClass
25
+
26
+ mock_instance_methods = 5.times.map {|x|
27
+ "method_#{x}".to_sym
28
+ }
29
+
30
+ mock_instance_methods.each {|m|
31
+ mock_method_obj = mock
32
+ #mock_klass.expects(:instance_method).returns(mock_method_obj)
33
+ }
34
+
35
+ mock_klass.expects(:instance_methods).returns(mock_instance_methods)
36
+
37
+ mock_proxy_klass = Manacle::Proxy::Template.cut(mock_klass)
38
+
39
+ mock_constraint = mock
40
+ mock_constraint.expects(:kind_of?).with(Manacle::Constraint).returns(true)
41
+
42
+ mock_proxy_instance = mock_proxy_klass.new(mock_constraint)
43
+
44
+ mock_instance_methods.each {|m|
45
+ assert mock_proxy_instance.respond_to?(m), "mock class does not respond to #{m}"
46
+ }
47
+ end
48
+ end
@@ -0,0 +1,42 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+
3
+ require 'manacle/proxy'
4
+
5
+ class Manacle::ProxyTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @mock_constraint = mock
9
+
10
+ @mock_constraint.expects(:kind_of?).with(Manacle::Constraint).returns(true)
11
+
12
+ proxy_class = Class.new do
13
+ include Manacle::Proxy::InstanceMethods
14
+ end
15
+
16
+ @proxy = proxy_class.new(@mock_constraint)
17
+ end
18
+
19
+ test "#constrained uncached" do
20
+ mock_constrained = mock
21
+
22
+ @mock_constraint.expects(:constrain).returns(mock_constrained)
23
+
24
+ result = @proxy.constrain
25
+
26
+ assert_equal mock_constrained, result
27
+ end
28
+
29
+ test "#constrained cached" do
30
+ mock_constrained = mock
31
+
32
+ @proxy.instance_variable_set(:@constrained, mock_constrained)
33
+
34
+ @mock_constraint.expects(:constrain).never
35
+
36
+ result = @proxy.constrain
37
+
38
+ assert_equal mock_constrained, result
39
+ end
40
+
41
+
42
+ end
@@ -0,0 +1,16 @@
1
+ $:.push('lib')
2
+
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ if ENV["ENABLE_SIMPLE_COV"]
7
+ require 'simplecov'
8
+ SimpleCov.start do
9
+ add_filter "test"
10
+ add_group 'API', "lib"
11
+ end
12
+ end
13
+
14
+ require 'test/unit/testcase'
15
+ require "mocha/setup"
16
+
metadata ADDED
@@ -0,0 +1,143 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: manacle
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Ed Carrel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: punchout
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: test-unit
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: |2
84
+ Manacle will allow you to attach constraints to your objects that will persist across new instances of similar objects.
85
+
86
+ As an example, you can constrain a Time object to always advance to the next hour. Then, if you add even one minute to that Time, it will snap to the next hour.
87
+ email:
88
+ - ed@pocketchange.com
89
+ executables: []
90
+ extensions: []
91
+ extra_rdoc_files: []
92
+ files:
93
+ - lib/manacle/constraint/actuator/base.rb
94
+ - lib/manacle/constraint/actuator/nested.rb
95
+ - lib/manacle/constraint/actuator.rb
96
+ - lib/manacle/constraint/method.rb
97
+ - lib/manacle/constraint.rb
98
+ - lib/manacle/proxy/factory.rb
99
+ - lib/manacle/proxy/method/constrained.rb
100
+ - lib/manacle/proxy/method/unconstrained.rb
101
+ - lib/manacle/proxy/method.rb
102
+ - lib/manacle/proxy/template/factory.rb
103
+ - lib/manacle/proxy/template.rb
104
+ - lib/manacle/proxy/templates.rb
105
+ - lib/manacle/proxy.rb
106
+ - test/integration/manacle/constraint/actuator_test.rb
107
+ - test/integration/manacle/constraint_test.rb
108
+ - test/integration/manacle/proxy_test.rb
109
+ - test/integration/manacle_test.rb
110
+ - test/integration/test_helper.rb
111
+ - test/unit/manacle/constraint/actuator/base_test.rb
112
+ - test/unit/manacle/constraint/actuator/nested_test.rb
113
+ - test/unit/manacle/constraint_test.rb
114
+ - test/unit/manacle/proxy/factory_test.rb
115
+ - test/unit/manacle/proxy/template_test.rb
116
+ - test/unit/manacle/proxy_test.rb
117
+ - test/unit/test_helper.rb
118
+ homepage:
119
+ licenses:
120
+ - MIT
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.1.10
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: A sticky constraint gem
142
+ test_files: []
143
+ has_rdoc: