play_doh 0.0.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.
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: []