spies 0.1.0 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bce479180515db93df27766da5049ae9752c616c
4
- data.tar.gz: 963ef385fabc59bc17ab292b66bd495976b092cf
3
+ metadata.gz: 89291a4e20caa35e1a7315e244bf97f8c24912e0
4
+ data.tar.gz: 6a695fbb4d361366d3bff0d05abfb49841c77a1b
5
5
  SHA512:
6
- metadata.gz: 88e3a9cd2ba728ef51ed4308add96e58085223d9ea831bd23758ca7fe113afa0a358f3009c0e7347e6f1e4291589724c4e932056660d598f22f4d03a19bb6dff
7
- data.tar.gz: 8f261270a1589669fbbfcfec3d81dccc3f4eec2f3e63a17a98a0241db1a5387b840ba3c40de17acdfb60dd7731dc7b6d60327955fa66a35b37cd91720851f8c6
6
+ metadata.gz: 5e69fa38537a2d76b70b6ba66b2db62d5f0b83b4035db86bbbf543ae6d5a25f2105d0e042c637c6960a73dd54897c67ef43004045c947d1356935df6b4084ac0
7
+ data.tar.gz: 40e7ef09c780259cb68cfbebe6ca59a2d8bec128f139c4957c452730b6cbf233e36d80f1332bc97d7ea43ce206641b41bee57ab72c6c113018ffd0dfea915709
@@ -0,0 +1 @@
1
+ --markup markdown
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # Ruby Spy [![Build Status](https://travis-ci.org/patbenatar/ruby-spy.svg?branch=master)](https://travis-ci.org/patbenatar/ruby-spy) [![Coverage Status](https://coveralls.io/repos/github/patbenatar/ruby-spy/badge.svg?branch=master)](https://coveralls.io/github/patbenatar/ruby-spy?branch=master)
1
+ # Ruby Spy [![Build Status](https://travis-ci.org/patbenatar/ruby-spy.svg?branch=master)](https://travis-ci.org/patbenatar/ruby-spy) [![Coverage Status](https://coveralls.io/repos/github/patbenatar/ruby-spy/badge.svg?branch=master)](https://coveralls.io/github/patbenatar/ruby-spy?branch=master) [![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](http://www.rubydoc.info/github/patbenatar/ruby-spy/master)
2
2
 
3
3
  Test spies for Ruby. Why? For fun.
4
4
 
5
5
  ## Installation
6
6
 
7
- ```
7
+ ```ruby
8
8
  gem 'spies', require: 'spy'
9
9
  ```
10
10
 
data/lib/spy.rb CHANGED
@@ -6,6 +6,12 @@ class Spy
6
6
 
7
7
  THREAD_LOCAL_ACTIVE_SPIES_KEY = 'ruby_spy_active_spies'.freeze
8
8
 
9
+ ##
10
+ # Active spies in the current thread.
11
+ #
12
+ # @return [Array<Spy>] instances of `Spy` that have active method spies on
13
+ # their target obj
14
+ #
9
15
  def self.active_spies
10
16
  Thread.current[THREAD_LOCAL_ACTIVE_SPIES_KEY] ||= []
11
17
  end
@@ -18,10 +24,32 @@ class Spy
18
24
  active_spies.delete(spy)
19
25
  end
20
26
 
27
+ ##
28
+ # Spy on an instance, class, or module.
29
+ #
30
+ # By default, this will spy on all user-defined methods (not methods defined
31
+ # on Ruby's base Class).
32
+ #
33
+ # @param obj [Object] the instance, class, or module to spy on
34
+ # @param method_name [Symbol] optionally limit spying to a single method
35
+ #
36
+ # @return [Spy] an active instance of `Spy` for the given `obj`
37
+ #
21
38
  def self.on(obj, method_name = nil)
22
39
  spy_with_options(obj, method_name)
23
40
  end
24
41
 
42
+ ##
43
+ # Spy on all instances of a class.
44
+ #
45
+ # By default, this will spy on all user-defined methods (not methods defined
46
+ # on Ruby's base Class).
47
+ #
48
+ # @param obj [Object] the class to spy on
49
+ # @param method_name [Symbol] optionally limit spying to a single method
50
+ #
51
+ # @return [Spy] an active instance of `Spy` for the given `obj`
52
+ #
25
53
  def self.on_all_instances_of(obj, method_name = nil)
26
54
  spy_with_options(obj, method_name, all_instances: true)
27
55
  end
@@ -33,6 +61,13 @@ class Spy
33
61
  end
34
62
  end
35
63
 
64
+ ##
65
+ # Remove all active Spy instances in the current thread and restore their
66
+ # spied methods to the original state.
67
+ #
68
+ # @yield Optionally provide a block, and spies created within the block will
69
+ # be cleaned, leaving the outer scope untouched. Blocks can be nested.
70
+ #
36
71
  def self.clean
37
72
  if block_given?
38
73
  outer_active_spies = active_spies
@@ -45,10 +80,17 @@ class Spy
45
80
  Thread.current[THREAD_LOCAL_ACTIVE_SPIES_KEY] = outer_active_spies
46
81
  end
47
82
  else
48
- active_spies.dup.each(&:clean)
83
+ active_spies.dup.each do |spy|
84
+ rspec_mock?(spy) ? unregister(spy) : spy.clean
85
+ end
49
86
  end
50
87
  end
51
88
 
89
+ def self.rspec_mock?(obj)
90
+ defined?(RSpec::Mocks::Double) && obj.is_a?(RSpec::Mocks::Double)
91
+ end
92
+
93
+ # @return [Object] the instance, class, or module being spied on by this spy
52
94
  attr_reader :obj
53
95
 
54
96
  def initialize(obj, all_instances: false)
@@ -58,16 +100,38 @@ class Spy
58
100
  @spied_methods_map = {}
59
101
  end
60
102
 
103
+ ##
104
+ # Spy on all user-defined methods on `obj`
105
+ #
106
+ # @return [Spy] self
107
+ #
61
108
  def on_all
62
109
  all_methods.each { |m| spy_on(m) }
63
110
  Spy.register(self)
111
+ self
64
112
  end
65
113
 
114
+ ##
115
+ # Spy on a single method on `obj`
116
+ #
117
+ # @param method_name [Symbol] the method to spy on
118
+ #
119
+ # @return [Spy] self
120
+ #
66
121
  def on(method_name)
67
122
  spy_on(method_name)
68
123
  Spy.register(self)
124
+ self
69
125
  end
70
126
 
127
+ ##
128
+ # Information about the calls received by this spy
129
+ #
130
+ # @param method_name [Symbol] optionally filter results to the given method
131
+ #
132
+ # @return [Array<Call>] set of `Call` objects containing information about
133
+ # each method call since the spy was activated.
134
+ #
71
135
  def calls(method_name = nil)
72
136
  if method_name
73
137
  @calls.select { |c| c.method_name == method_name }
@@ -76,11 +140,22 @@ class Spy
76
140
  end
77
141
  end
78
142
 
143
+ ##
144
+ # Remove spy and return spied methods on `obj` to the original state.
145
+ #
146
+ # @return [Spy] self
147
+ #
79
148
  def clean
80
149
  spied_methods_map.keys.each { |m| remove_spy(m) }
81
150
  Spy.unregister(self)
151
+ self
82
152
  end
83
153
 
154
+ ##
155
+ # Check if spy is actively spying on any methods on `obj`
156
+ #
157
+ # @return [Boolean] dirty state
158
+ #
84
159
  def dirty?
85
160
  spied_methods_map.keys.any?
86
161
  end
@@ -1,5 +1,15 @@
1
1
  class Spy::Call
2
- attr_reader :receiver, :method_name, :args, :block
2
+ # @return [Object] object that received the method call
3
+ attr_reader :receiver
4
+
5
+ # @return [Symbol] name of the method called
6
+ attr_reader :method_name
7
+
8
+ # @return [Array<Object>] arguments given to the method call
9
+ attr_reader :args
10
+
11
+ # @return [Proc] block given to the method call, if present
12
+ attr_reader :block
3
13
 
4
14
  def initialize(receiver, method_name, args, block)
5
15
  @receiver = receiver
@@ -1,3 +1,3 @@
1
1
  class Spy
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.1.1'.freeze
3
3
  end
@@ -30,4 +30,6 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'pry-byebug', '~> 3.4'
31
31
  spec.add_development_dependency 'rubocop', '~> 0.41.2'
32
32
  spec.add_development_dependency 'coveralls'
33
+ spec.add_development_dependency 'yard'
34
+ spec.add_development_dependency 'redcarpet'
33
35
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spies
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Giancola
@@ -114,6 +114,34 @@ dependencies:
114
114
  - - ">="
115
115
  - !ruby/object:Gem::Version
116
116
  version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: yard
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: redcarpet
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
117
145
  description: Ruby test spies
118
146
  email:
119
147
  - nick@philosophie.is
@@ -125,6 +153,7 @@ files:
125
153
  - ".rspec"
126
154
  - ".rubocop.yml"
127
155
  - ".travis.yml"
156
+ - ".yardopts"
128
157
  - Gemfile
129
158
  - Guardfile
130
159
  - LICENSE.txt