temporaries 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.2.0 2012-06-08
2
+
3
+ * Methods to set temporary method definitions.
4
+
1
5
  == 0.1.0 2012-06-06
2
6
 
3
7
  * Support minitest/unit and minitest/spec.
data/README.markdown CHANGED
@@ -8,6 +8,7 @@ Set things temporarily and declaratively. Best way to test.
8
8
  * Set values of instance variables.
9
9
  * Set values of class variables.
10
10
  * Set values of globals.
11
+ * Set definitions of methods.
11
12
  * Set a temporary directory.
12
13
 
13
14
  Do it for the length of a test, or within a specific block in your
@@ -35,6 +36,7 @@ Here's the full list of methods you can use:
35
36
  use_instance_variable_value(object, :name, value)
36
37
  use_class_variable_value(object, :name, value)
37
38
  use_global_value(:name, value)
39
+ use_method_definition(module, :name, ->(*args){defintion})
38
40
 
39
41
  Sigils in the `name` are unnecessary in the last 3 (unlike
40
42
  `instance_variable_get`, for instance).
@@ -73,6 +75,10 @@ You may also set the temporary for the duration of a particular block:
73
75
  ...
74
76
  end
75
77
 
78
+ with_method_definition module, :name, ->(*args){definition} do
79
+ ...
80
+ end
81
+
76
82
  with_temporary_directory path do
77
83
  # `tmp' refers to the directory.
78
84
  end
@@ -100,35 +100,35 @@ module Temporaries
100
100
  end
101
101
 
102
102
  mod.class_eval <<-EOS, __FILE__, __LINE__ + 1
103
- def push_#{name}_value(#{signature}, value)
103
+ def push_#{name}(#{signature}, value)
104
104
  #{save}
105
105
  push_temporary(#{stack_key}, original_value)
106
106
  #{set}
107
107
  end
108
108
 
109
- def pop_#{name}_value(#{signature})
109
+ def pop_#{name}(#{signature})
110
110
  value = pop_temporary(#{stack_key})
111
111
  #{restore}
112
112
  end
113
113
 
114
- def with_#{name}_value(#{signature}, value)
115
- push_#{name}_value(#{signature}, value)
114
+ def with_#{name}(#{signature}, value)
115
+ push_#{name}(#{signature}, value)
116
116
  begin
117
117
  yield
118
118
  ensure
119
- pop_#{name}_value(#{signature})
119
+ pop_#{name}(#{signature})
120
120
  end
121
121
  end
122
122
  EOS
123
123
 
124
124
  mod::ClassMethods.module_eval <<-EOS, __FILE__, __LINE__ + 1
125
- def use_#{name}_value(#{signature}, value)
125
+ def use_#{name}(#{signature}, value)
126
126
  temporaries_adapter.before do
127
- push_#{name}_value(#{signature}, value)
127
+ push_#{name}(#{signature}, value)
128
128
  end
129
129
 
130
130
  temporaries_adapter.after do
131
- pop_#{name}_value(#{signature})
131
+ pop_#{name}(#{signature})
132
132
  end
133
133
  end
134
134
  EOS
@@ -148,7 +148,7 @@ module Temporaries
148
148
  helpers.define(self)
149
149
  end
150
150
 
151
- define_helpers_for :constant do
151
+ define_helpers_for :constant_value do
152
152
  signature 'mod, constant'
153
153
  exists 'mod.const_defined?(constant)'
154
154
  get 'mod.const_get(constant)'
@@ -159,13 +159,13 @@ module Temporaries
159
159
  remove 'mod.send :remove_const, constant'
160
160
  end
161
161
 
162
- define_helpers_for :attribute do
162
+ define_helpers_for :attribute_value do
163
163
  signature 'object, attribute'
164
164
  get 'object.send(attribute)'
165
165
  set 'object.send("#{attribute}=", value)'
166
166
  end
167
167
 
168
- define_helpers_for :hash do
168
+ define_helpers_for :hash_value do
169
169
  signature 'hash, key'
170
170
  exists 'hash.key?(key)'
171
171
  get 'hash[key]'
@@ -173,7 +173,7 @@ module Temporaries
173
173
  remove 'hash.delete(key)'
174
174
  end
175
175
 
176
- define_helpers_for :instance_variable do
176
+ define_helpers_for :instance_variable_value do
177
177
  signature 'object, name'
178
178
  exists 'object.instance_variable_defined?("@#{name}")'
179
179
  get 'object.instance_variable_get "@#{name}"'
@@ -181,7 +181,7 @@ module Temporaries
181
181
  remove 'object.send :remove_instance_variable, "@#{name}"'
182
182
  end
183
183
 
184
- define_helpers_for :class_variable do
184
+ define_helpers_for :class_variable_value do
185
185
  signature 'klass, name'
186
186
  exists 'klass.class_variable_defined?("@@#{name}")'
187
187
  get 'klass.send :class_variable_get, "@@#{name}"'
@@ -189,10 +189,18 @@ module Temporaries
189
189
  remove 'klass.send :remove_class_variable, "@@#{name}"'
190
190
  end
191
191
 
192
- define_helpers_for :global do
192
+ define_helpers_for :global_value do
193
193
  signature 'name'
194
194
  get 'eval("$#{name}")'
195
195
  set 'eval("$#{name} = value")'
196
196
  end
197
+
198
+ define_helpers_for :method_definition do
199
+ signature 'klass, name'
200
+ exists 'klass.method_defined?(name) && (method = klass.instance_method(name)) && method.owner.equal?(klass)'
201
+ get 'method'
202
+ set 'klass.__send__(:define_method, name, value)'
203
+ remove 'klass.__send__(:remove_method, name)'
204
+ end
197
205
  end
198
206
  end
@@ -1,5 +1,5 @@
1
1
  module Temporaries
2
- VERSION = [0, 1, 0]
2
+ VERSION = [0, 2, 0]
3
3
 
4
4
  class << VERSION
5
5
  include Comparable
@@ -531,6 +531,96 @@ describe Temporaries::Values do
531
531
  $variable.should == 2
532
532
  end
533
533
  end
534
+
535
+ describe "#push_method_definition and #pop_method_definition" do
536
+ before do
537
+ @klass = Class.new
538
+ @instance = @klass.new
539
+ end
540
+
541
+ describe "when the method already exists" do
542
+ before do
543
+ @klass.send(:define_method, :meth) { 2 }
544
+ end
545
+
546
+ it "should set the given module's method to the pushed definition until it is popped" do
547
+ @instance.meth.should == 2
548
+ @context.push_method_definition @klass, :meth, lambda{3}
549
+ @instance.meth.should == 3
550
+ @context.pop_method_definition @klass, :meth
551
+ @instance.meth.should == 2
552
+ end
553
+
554
+ it "should be nestable" do
555
+ @instance.meth.should == 2
556
+ @context.push_method_definition @klass, :meth, lambda{3}
557
+ @instance.meth.should == 3
558
+ @context.push_method_definition @klass, :meth, lambda{5}
559
+ @instance.meth.should == 5
560
+ @context.pop_method_definition @klass, :meth
561
+ @instance.meth.should == 3
562
+ @context.pop_method_definition @klass, :meth
563
+ @instance.meth.should == 2
564
+ end
565
+ end
566
+
567
+ describe "when the method does not already exist" do
568
+ it "should set the given module's method to the pushed definition, and remove it when popped" do
569
+ @klass.method_defined?(:meth).should be_false
570
+ @context.push_method_definition @klass, :meth, lambda{3}
571
+ @instance.meth.should == 3
572
+ @context.pop_method_definition @klass, :meth
573
+ @klass.method_defined?(:meth).should be_false
574
+ end
575
+ end
576
+ end
577
+
578
+ describe "#with_method_definition" do
579
+ before do
580
+ @klass = Class.new{def meth; 2; end}
581
+ @instance = @klass.new
582
+ end
583
+
584
+ it "should set the given module's method to the given definition only during the given block" do
585
+ @instance.meth.should == 2
586
+ block_run = false
587
+ @context.with_method_definition @klass, :meth, lambda{3} do
588
+ block_run = true
589
+ @instance.meth.should == 3
590
+ end
591
+ block_run.should be_true
592
+ @instance.meth.should == 2
593
+ end
594
+
595
+ it "should be nestable" do
596
+ @instance.meth.should == 2
597
+ blocks_run = []
598
+ @context.with_method_definition @klass, :meth, lambda{3} do
599
+ blocks_run << 1
600
+ @instance.meth.should == 3
601
+ @context.with_method_definition @klass, :meth, lambda{5} do
602
+ blocks_run << 2
603
+ @instance.meth.should == 5
604
+ end
605
+ @instance.meth.should == 3
606
+ end
607
+ blocks_run.should == [1, 2]
608
+ @instance.meth.should == 2
609
+ end
610
+
611
+ it "should handle nonlocal exits" do
612
+ exception_class = Class.new(Exception)
613
+ @instance.meth.should == 2
614
+ begin
615
+ @context.with_method_definition @klass, :meth, lambda{3} do
616
+ @instance.meth.should == 3
617
+ raise exception_class, 'boom'
618
+ end
619
+ rescue exception_class => e
620
+ end
621
+ @instance.meth.should == 2
622
+ end
623
+ end
534
624
  end
535
625
 
536
626
  describe Temporaries::Values do
@@ -680,4 +770,28 @@ describe Temporaries::Values do
680
770
  $variable.should == 2
681
771
  end
682
772
  end
773
+
774
+ describe ".use_method_definition" do
775
+ before do
776
+ @klass = klass = Class.new { def meth; 2; end }
777
+ @instance = @klass.new
778
+
779
+ @context_class = Class.new(TestContext) do
780
+ include Temporaries::Values
781
+ use_method_definition klass, :meth, lambda{3}
782
+ end
783
+ @context = @context_class.new
784
+ end
785
+
786
+ it "should set the given module's constant to the given value for the duration of the run" do
787
+ @instance.meth.should == 2
788
+ block_run = false
789
+ @context.run do
790
+ block_run = true
791
+ @instance.meth.should == 3
792
+ end
793
+ block_run.should be_true
794
+ @instance.meth.should == 2
795
+ end
796
+ end
683
797
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: temporaries
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-06 00:00:00.000000000 Z
12
+ date: 2012-06-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ritual
@@ -107,7 +107,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
107
  version: '0'
108
108
  segments:
109
109
  - 0
110
- hash: 2522047447244818612
110
+ hash: -3674253645093316834
111
111
  required_rubygems_version: !ruby/object:Gem::Requirement
112
112
  none: false
113
113
  requirements:
@@ -116,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  version: '0'
117
117
  segments:
118
118
  - 0
119
- hash: 2522047447244818612
119
+ hash: -3674253645093316834
120
120
  requirements: []
121
121
  rubyforge_project:
122
122
  rubygems_version: 1.8.24