muack 1.1.2 → 1.2.0
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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -3
- data/CHANGES.md +4 -0
- data/Gemfile +3 -0
- data/README.md +39 -7
- data/lib/muack/mock.rb +1 -1
- data/lib/muack/stub.rb +7 -0
- data/lib/muack/version.rb +1 -1
- data/muack.gemspec +4 -4
- data/task/gemgem.rb +104 -51
- data/test/test_from_readme.rb +11 -2
- data/test/test_stub.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2536a6bd8291b8510a652b7e8102c44e4d204586
|
4
|
+
data.tar.gz: b4ad06b8093fa3f241145a5586c07feb37487bc2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6c120cfe1b64fe2aa6a842de612c49eb7ec04166a1ac083fdc69f44deb6093fdc5e21a651faed82f76de70b8b25f25a94071311e61ef3a7d8a09700b91019ee
|
7
|
+
data.tar.gz: 692d50e023c30fa16a1906b18233d9c25a32839617c6a5ef951a7056ffced8ed5ed6173b6913e8824605e34aa8e4c26fa6e6832539e1183053f849b5b15b4273
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
before_install: 'git submodule update --init'
|
2
|
-
script: 'ruby -r bundler/setup -S rake test'
|
3
1
|
|
2
|
+
language: ruby
|
4
3
|
rvm:
|
5
|
-
- 1.9
|
6
4
|
- 2.0
|
7
5
|
- 2.1
|
6
|
+
- 2.2
|
8
7
|
- rbx-2
|
9
8
|
- jruby
|
9
|
+
|
10
|
+
install: 'bundle install --retry=3'
|
11
|
+
script: 'ruby -r bundler/setup -S rake test'
|
data/CHANGES.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Muack [](http://travis-ci.org/godfat/muack)
|
1
|
+
# Muack [](http://travis-ci.org/godfat/muack) [](https://coveralls.io/r/godfat/muack?branch=master)
|
2
2
|
|
3
3
|
by Lin Jen-Shin ([godfat](http://godfat.org))
|
4
4
|
|
@@ -461,8 +461,8 @@ p obj.name # 2
|
|
461
461
|
p Muack.verify # true
|
462
462
|
```
|
463
463
|
|
464
|
-
Note that this does not apply to stubs because stubs never run out,
|
465
|
-
|
464
|
+
Note that this does not apply to stubs because stubs never run out. Instead,
|
465
|
+
the latter stub would overwrite the previous one.
|
466
466
|
|
467
467
|
``` ruby
|
468
468
|
obj = Object.new
|
@@ -471,9 +471,9 @@ stub(obj) do |m|
|
|
471
471
|
m.name{ 1 }
|
472
472
|
m.name{ 2 }
|
473
473
|
end
|
474
|
-
p obj.name #
|
475
|
-
p obj.name #
|
476
|
-
p obj.name #
|
474
|
+
p obj.name # 2
|
475
|
+
p obj.name # 2
|
476
|
+
p obj.name # 2
|
477
477
|
p Muack.verify # true
|
478
478
|
```
|
479
479
|
|
@@ -1078,6 +1078,38 @@ verifiers details.
|
|
1078
1078
|
[dm-core]: https://github.com/datamapper/dm-core
|
1079
1079
|
[ruby-lint]: https://github.com/YorickPeterse/ruby-lint
|
1080
1080
|
|
1081
|
+
#### Why didn't mocks nor stubs check if the injected method exists before?
|
1082
|
+
|
1083
|
+
Long story short. I can't find a set of good APIs along with good
|
1084
|
+
implementation. My ideal APIs would be that for mocks and stubs, they
|
1085
|
+
do check if the injected methods exist before, and if we don't want
|
1086
|
+
that check, we use `fake` instead of `mock` or `stub`.
|
1087
|
+
|
1088
|
+
However, how do we specify if `fake` should act like `mock` or `stub`?
|
1089
|
+
Introducing yet another name would make the terms even more confusing
|
1090
|
+
(which are already fairly confusing!), and I don't want something like:
|
1091
|
+
`fake.mock` or `mock.fake` or `fake_mock` or `mock_fake`. Using an option
|
1092
|
+
would also raise the other questions.
|
1093
|
+
|
1094
|
+
What if we make `mock.with_any_times` work exactly like `stub` then?
|
1095
|
+
Then we could have `fake.with_any_times` and that would be the stub
|
1096
|
+
version of fake. This should greatly reduce the complexity and confusion.
|
1097
|
+
However this won't work well because stub is not just mock without times.
|
1098
|
+
They are different in:
|
1099
|
+
|
1100
|
+
* Mocked methods are called in FIFO (queue) order
|
1101
|
+
* Stubbed methods are called in FILO (stack) order
|
1102
|
+
* Stubbed methods could do some pattern matching
|
1103
|
+
|
1104
|
+
Of course we could break them though, but do we really have to, just for
|
1105
|
+
this simple feature? Also, it could be pretty challenging to implement
|
1106
|
+
existing method checking for `any_instance_of`.
|
1107
|
+
|
1108
|
+
If you could find a good set of APIs while implementing it nicely, please
|
1109
|
+
do let me know. Compatibility is not an issue. We could always bump the
|
1110
|
+
major number to inform this incompatibility. I am open to breaking legacy.
|
1111
|
+
Or, I am happy to break legacy.
|
1112
|
+
|
1081
1113
|
## USERS:
|
1082
1114
|
|
1083
1115
|
* [Rib][]
|
@@ -1092,7 +1124,7 @@ verifiers details.
|
|
1092
1124
|
|
1093
1125
|
Apache License 2.0
|
1094
1126
|
|
1095
|
-
Copyright (c) 2013-
|
1127
|
+
Copyright (c) 2013-2015, Lin Jen-Shin (godfat)
|
1096
1128
|
|
1097
1129
|
Licensed under the Apache License, Version 2.0 (the "License");
|
1098
1130
|
you may not use this file except in compliance with the License.
|
data/lib/muack/mock.rb
CHANGED
@@ -181,7 +181,7 @@ module Muack
|
|
181
181
|
# used for __mock_dispatch_call
|
182
182
|
def __mock_block_call context, block, actual_args, actual_block, splat
|
183
183
|
return unless block
|
184
|
-
# for AnyInstanceOf, we don't have
|
184
|
+
# for AnyInstanceOf, we don't have the actual context at the time
|
185
185
|
# we're defining it, so we update it here
|
186
186
|
block.context = context if block.kind_of?(Block)
|
187
187
|
if splat
|
data/lib/muack/stub.rb
CHANGED
@@ -6,6 +6,13 @@ module Muack
|
|
6
6
|
# used for Muack::Session#verify
|
7
7
|
def __mock_verify; true; end
|
8
8
|
|
9
|
+
# used for Muack::Modifier#times
|
10
|
+
def __mock_defis_push defi
|
11
|
+
# since stubs never wear out, the reverse ordering would make more sense
|
12
|
+
# so that the latter wins over the previous one (overwrite)
|
13
|
+
__mock_defis[defi.msg].unshift(defi)
|
14
|
+
end
|
15
|
+
|
9
16
|
# used for mocked object to dispatch mocked method
|
10
17
|
def __mock_dispatch msg, actual_args
|
11
18
|
if defi = __mock_defis[msg].find{ |d|
|
data/lib/muack/version.rb
CHANGED
data/muack.gemspec
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: muack 1.
|
2
|
+
# stub: muack 1.2.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "muack"
|
6
|
-
s.version = "1.
|
6
|
+
s.version = "1.2.0"
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib"]
|
10
10
|
s.authors = ["Lin Jen-Shin (godfat)"]
|
11
|
-
s.date = "
|
11
|
+
s.date = "2015-03-10"
|
12
12
|
s.description = "Muack -- A fast, small, yet powerful mocking library.\n\nInspired by [RR][], and it's 32x times faster (750s vs 23s) than RR\nfor running [Rib][] tests.\n\n[RR]: https://github.com/rr/rr\n[Rib]: https://github.com/godfat/rib"
|
13
13
|
s.email = ["godfat (XD) godfat.org"]
|
14
14
|
s.files = [
|
@@ -48,7 +48,7 @@ Gem::Specification.new do |s|
|
|
48
48
|
"test/test_stub.rb"]
|
49
49
|
s.homepage = "https://github.com/godfat/muack"
|
50
50
|
s.licenses = ["Apache License 2.0"]
|
51
|
-
s.rubygems_version = "2.4.
|
51
|
+
s.rubygems_version = "2.4.6"
|
52
52
|
s.summary = "Muack -- A fast, small, yet powerful mocking library."
|
53
53
|
s.test_files = [
|
54
54
|
"test/test_any_instance_of.rb",
|
data/task/gemgem.rb
CHANGED
@@ -38,6 +38,103 @@ module Gemgem
|
|
38
38
|
self.spec = spec
|
39
39
|
end
|
40
40
|
|
41
|
+
def gem_install
|
42
|
+
require 'rubygems/commands/install_command'
|
43
|
+
# read ~/.gemrc
|
44
|
+
Gem.use_paths(Gem.configuration[:gemhome], Gem.configuration[:gempath])
|
45
|
+
Gem::Command.extra_args = Gem.configuration[:gem]
|
46
|
+
|
47
|
+
# setup install options
|
48
|
+
cmd = Gem::Commands::InstallCommand.new
|
49
|
+
cmd.handle_options([])
|
50
|
+
|
51
|
+
# install
|
52
|
+
install = Gem::Installer.new(gem_path, cmd.options)
|
53
|
+
install.install
|
54
|
+
puts "\e[35mGem installed: \e[33m#{strip_path(install.gem_dir)}\e[0m"
|
55
|
+
end
|
56
|
+
|
57
|
+
def gem_spec
|
58
|
+
create
|
59
|
+
write
|
60
|
+
end
|
61
|
+
|
62
|
+
def gem_build
|
63
|
+
require 'fileutils'
|
64
|
+
require 'rubygems/package'
|
65
|
+
gem = nil
|
66
|
+
Dir.chdir(dir) do
|
67
|
+
gem = Gem::Package.build(Gem::Specification.load(spec_path))
|
68
|
+
FileUtils.mkdir_p(pkg_dir)
|
69
|
+
FileUtils.mv(gem, pkg_dir) # gem is relative path, but might be ok
|
70
|
+
end
|
71
|
+
puts "\e[35mGem built: \e[33m#{strip_path("#{pkg_dir}/#{gem}")}\e[0m"
|
72
|
+
end
|
73
|
+
|
74
|
+
def gem_release
|
75
|
+
sh_git('tag', gem_tag)
|
76
|
+
sh_git('push')
|
77
|
+
sh_git('push', '--tags')
|
78
|
+
sh_gem('push', gem_path)
|
79
|
+
end
|
80
|
+
|
81
|
+
def gem_check
|
82
|
+
ver = spec.version.to_s
|
83
|
+
|
84
|
+
if ENV['VERSION'].nil?
|
85
|
+
puts("\e[35mExpected " \
|
86
|
+
"\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
|
87
|
+
exit(1)
|
88
|
+
|
89
|
+
elsif ENV['VERSION'] != ver
|
90
|
+
puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
|
91
|
+
"\e[35mbut got\n " \
|
92
|
+
"\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
|
93
|
+
exit(2)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def test
|
98
|
+
return if test_files.empty?
|
99
|
+
|
100
|
+
if ENV['COV'] || ENV['CI']
|
101
|
+
require 'simplecov'
|
102
|
+
if ENV['CI']
|
103
|
+
begin
|
104
|
+
require 'coveralls'
|
105
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
106
|
+
rescue LoadError => e
|
107
|
+
puts "Cannot load coveralls, skip: #{e}"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
SimpleCov.start do
|
111
|
+
add_filter('test/')
|
112
|
+
add_filter('test.rb')
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
test_files.each{ |file| require "#{dir}/#{file[0..-4]}" }
|
117
|
+
end
|
118
|
+
|
119
|
+
def clean
|
120
|
+
return if ignored_files.empty?
|
121
|
+
|
122
|
+
require 'fileutils'
|
123
|
+
trash = File.expand_path("~/.Trash/#{spec.name}")
|
124
|
+
puts "Move the following files into: \e[35m#{strip_path(trash)}\e[33m"
|
125
|
+
|
126
|
+
ignored_files.each do |file|
|
127
|
+
from = "#{dir}/#{file}"
|
128
|
+
to = "#{trash}/#{File.dirname(file)}"
|
129
|
+
puts strip_path(from)
|
130
|
+
|
131
|
+
FileUtils.mkdir_p(to)
|
132
|
+
FileUtils.mv(from, to)
|
133
|
+
end
|
134
|
+
|
135
|
+
print "\e[0m"
|
136
|
+
end
|
137
|
+
|
41
138
|
def write
|
42
139
|
File.open(spec_path, 'w'){ |f| f << split_lines(spec.to_ruby) }
|
43
140
|
end
|
@@ -173,82 +270,38 @@ namespace :gem do
|
|
173
270
|
|
174
271
|
desc 'Install gem'
|
175
272
|
task :install => [:build] do
|
176
|
-
Gemgem.
|
273
|
+
Gemgem.gem_install
|
177
274
|
end
|
178
275
|
|
179
276
|
desc 'Build gem'
|
180
277
|
task :build => [:spec] do
|
181
|
-
|
182
|
-
require 'rubygems/package'
|
183
|
-
gem = nil
|
184
|
-
Dir.chdir(Gemgem.dir) do
|
185
|
-
gem = Gem::Package.build(Gem::Specification.load(Gemgem.spec_path))
|
186
|
-
FileUtils.mkdir_p(Gemgem.pkg_dir)
|
187
|
-
FileUtils.mv(gem, Gemgem.pkg_dir) # gem is relative path, but might be ok
|
188
|
-
end
|
189
|
-
puts "\e[35mGem built: \e[33m" \
|
190
|
-
"#{Gemgem.strip_path("#{Gemgem.pkg_dir}/#{gem}")}\e[0m"
|
278
|
+
Gemgem.gem_build
|
191
279
|
end
|
192
280
|
|
193
281
|
desc 'Generate gemspec'
|
194
282
|
task :spec do
|
195
|
-
Gemgem.
|
196
|
-
Gemgem.write
|
283
|
+
Gemgem.gem_spec
|
197
284
|
end
|
198
285
|
|
199
286
|
desc 'Release gem'
|
200
287
|
task :release => [:spec, :check, :build] do
|
201
|
-
Gemgem.
|
202
|
-
sh_git('tag', Gemgem.gem_tag)
|
203
|
-
sh_git('push')
|
204
|
-
sh_git('push', '--tags')
|
205
|
-
sh_gem('push', Gemgem.gem_path)
|
206
|
-
end
|
288
|
+
Gemgem.gem_release
|
207
289
|
end
|
208
290
|
|
209
291
|
task :check do
|
210
|
-
|
211
|
-
|
212
|
-
if ENV['VERSION'].nil?
|
213
|
-
puts("\e[35mExpected " \
|
214
|
-
"\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
|
215
|
-
exit(1)
|
216
|
-
|
217
|
-
elsif ENV['VERSION'] != ver
|
218
|
-
puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
|
219
|
-
"\e[35mbut got\n " \
|
220
|
-
"\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
|
221
|
-
exit(2)
|
222
|
-
end
|
292
|
+
Gemgem.gem_check
|
223
293
|
end
|
224
294
|
|
225
295
|
end # of gem namespace
|
226
296
|
|
227
297
|
desc 'Run tests'
|
228
298
|
task :test do
|
229
|
-
|
230
|
-
Gemgem.test_files.each{ |file| require "#{Gemgem.dir}/#{file[0..-4]}" }
|
299
|
+
Gemgem.test
|
231
300
|
end
|
232
301
|
|
233
302
|
desc 'Trash ignored files'
|
234
303
|
task :clean => ['gem:spec'] do
|
235
|
-
|
236
|
-
|
237
|
-
require 'fileutils'
|
238
|
-
trash = File.expand_path("~/.Trash/#{Gemgem.spec.name}")
|
239
|
-
puts "Move the following files into:" \
|
240
|
-
" \e[35m#{Gemgem.strip_path(trash)}\e[33m"
|
241
|
-
|
242
|
-
Gemgem.ignored_files.each do |file|
|
243
|
-
from = "#{Gemgem.dir}/#{file}"
|
244
|
-
to = "#{trash}/#{File.dirname(file)}"
|
245
|
-
puts Gemgem.strip_path(from)
|
246
|
-
|
247
|
-
FileUtils.mkdir_p(to)
|
248
|
-
FileUtils.mv(from, to)
|
249
|
-
end
|
250
|
-
|
251
|
-
print "\e[0m"
|
304
|
+
Gemgem.clean
|
252
305
|
end
|
253
306
|
|
254
307
|
task :default do
|
data/test/test_from_readme.rb
CHANGED
@@ -9,7 +9,12 @@ describe 'from README.md' do
|
|
9
9
|
after{ Muack.reset }
|
10
10
|
|
11
11
|
Context = Module.new{
|
12
|
-
include
|
12
|
+
include Muack::API
|
13
|
+
|
14
|
+
def describe desc, &block
|
15
|
+
@executor.describe(desc, &block)
|
16
|
+
@executor.execute(@stat)
|
17
|
+
end
|
13
18
|
|
14
19
|
def results; @results ||= []; end
|
15
20
|
def p res ; results << res ; end
|
@@ -29,7 +34,11 @@ describe 'from README.md' do
|
|
29
34
|
|
30
35
|
codes.each.with_index do |code, index|
|
31
36
|
would 'pass from README.md #%02d' % index do
|
32
|
-
|
37
|
+
executor, stat = Class.new(self.class){ init }, pork_stat
|
38
|
+
context = Module.new do
|
39
|
+
extend Context
|
40
|
+
@executor, @stat = executor, stat
|
41
|
+
end
|
33
42
|
begin
|
34
43
|
context.instance_eval(code, 'README.md', 0)
|
35
44
|
rescue Muack::Failure => e
|
data/test/test_stub.rb
CHANGED
@@ -109,7 +109,7 @@ describe Muack::Stub do
|
|
109
109
|
stub(Obj).say(0){ 'boo' }
|
110
110
|
stub(Obj).say(1){ 'moo' }
|
111
111
|
e = should.raise(Muack::Unexpected){ Obj.say(false) }
|
112
|
-
e.expected.should.eq "obj.say(
|
112
|
+
e.expected.should.eq "obj.say(1)\n or: obj.say(0)"
|
113
113
|
e.was .should.eq 'obj.say(false)'
|
114
114
|
e.message .should.eq "\nExpected: #{e.expected}\n but was: #{e.was}"
|
115
115
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: muack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lin Jen-Shin (godfat)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |-
|
14
14
|
Muack -- A fast, small, yet powerful mocking library.
|
@@ -78,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
78
|
version: '0'
|
79
79
|
requirements: []
|
80
80
|
rubyforge_project:
|
81
|
-
rubygems_version: 2.4.
|
81
|
+
rubygems_version: 2.4.6
|
82
82
|
signing_key:
|
83
83
|
specification_version: 4
|
84
84
|
summary: Muack -- A fast, small, yet powerful mocking library.
|