play_doh 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/lib/meta.rb +35 -0
  2. data/lib/mock.rb +11 -0
  3. data/lib/play_doh.rb +56 -0
  4. data/lib/stub.rb +37 -0
  5. metadata +48 -0
data/lib/meta.rb ADDED
@@ -0,0 +1,35 @@
1
+ module Meta
2
+
3
+ DATA_TYPES = [
4
+ String, Symbol, Regexp,
5
+ Float, Fixnum, Bignum,
6
+ TrueClass, FalseClass,
7
+ Array, Hash,
8
+ Exception
9
+ ]
10
+
11
+ def instance_methods
12
+ @sut.public_methods(false)
13
+ .reject { |m| is_property? m }
14
+ .map &:to_sym
15
+ end
16
+
17
+ def is_dependency?(object)
18
+ object != @sut and
19
+ not DATA_TYPES.include? object.class
20
+ end
21
+
22
+ def is_property?(name)
23
+ @sut.instance_variables.
24
+ include? property_for_method name
25
+ end
26
+
27
+ def property_for_method(name)
28
+ "@#{name.to_s}".to_sym
29
+ end
30
+
31
+ def method_for_property(name)
32
+ name.to_s[1..-1].to_sym
33
+ end
34
+
35
+ end
data/lib/mock.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'rr'
2
+
3
+ module Mock
4
+
5
+ extend RR::Adapters::RRMethods
6
+
7
+ def self.reset(sut, method)
8
+ RR::Space.instance.reset_double sut, method
9
+ end
10
+
11
+ end
data/lib/play_doh.rb ADDED
@@ -0,0 +1,56 @@
1
+ def play_doh(sut=nil)
2
+ return sut if sut.is_a? Playdoh
3
+ Playdoh.new sut
4
+ end
5
+
6
+ require_relative 'mock'
7
+ require_relative 'stub'
8
+
9
+ class Playdoh
10
+
11
+ include Stub
12
+
13
+ def initialize(sut=nil)
14
+ @sut = sut || Object.new
15
+ stub_methods
16
+ stub_dependencies
17
+ default_operation
18
+ end
19
+
20
+ def operation
21
+ @operation = -> method, *args { yield method, *args }
22
+ self
23
+ end
24
+
25
+ def default_operation
26
+ operation do |method, *args|
27
+ @sut.send method, *args
28
+ end
29
+ end
30
+
31
+ def method_missing(method, *args)
32
+ @operation.call method, *args
33
+ ensure
34
+ default_operation
35
+ end
36
+
37
+ def reset(method)
38
+ Mock.reset @sut, method
39
+ end
40
+
41
+ def given
42
+ Mock.stub @sut
43
+ end
44
+
45
+ def when
46
+ operation do |method, *args|
47
+ reset method
48
+ @sut.send method, *args
49
+ end
50
+ end
51
+
52
+ def verify
53
+ Mock.mock @sut
54
+ end
55
+
56
+ end
data/lib/stub.rb ADDED
@@ -0,0 +1,37 @@
1
+ require_relative 'mock'
2
+ require_relative 'meta'
3
+
4
+ module Stub
5
+
6
+ include Meta
7
+
8
+ def stub(method, value=nil)
9
+ Mock.stub(@sut, method).returns(value)
10
+ end
11
+
12
+ def stub_methods
13
+ instance_methods.each { |m| stub m }
14
+ stub_method_missing
15
+ end
16
+
17
+ def stub_method_missing
18
+ def @sut.method_missing(method, *args)
19
+ nil
20
+ end
21
+ end
22
+
23
+ def stub_dependencies
24
+ @sut.instance_variables.each { |v| stub_dependency v }
25
+ end
26
+
27
+ def stub_dependency(name)
28
+ current_value = @sut.instance_variable_get name
29
+ return unless is_dependency? current_value
30
+
31
+ stubbed_value = play_doh current_value
32
+
33
+ @sut.instance_variable_set name, stubbed_value
34
+ stub method_for_property(name), stubbed_value
35
+ end
36
+
37
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: play_doh
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - limadelic
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-15 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: partial mocks on rr
15
+ email: limadelic@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/meta.rb
21
+ - lib/mock.rb
22
+ - lib/play_doh.rb
23
+ - lib/stub.rb
24
+ homepage: https://github.com/limadelic/play_doh
25
+ licenses: []
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.24
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: malleable mocks
48
+ test_files: []