clean-mock 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.version +1 -0
- data/lib/clean-mock.rb +2 -0
- data/lib/clean-mock/base.rb +96 -0
- data/lib/clean-mock/global.rb +20 -0
- metadata +47 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1306823d00dc26a9c0aa3c26e0d5596e45dcb2d7968a49430b5dca26a06161bb
|
4
|
+
data.tar.gz: f200b3a4cb2a3f12ac4fa9c07ce20328be4d5abbdeddab65f81215ac46878f1b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c289dbf175cd53ef97a84ac44f85de9b5315ebba0f057f2c8b243124efadf816e24020beaf85fb0367657fb014fc2f84f72f992eb0b8780f50fa4cf5d684655e
|
7
|
+
data.tar.gz: 21d616edc288a3edb4e477bdf371ab8884e89232ea2f6cc4a7928042b0ee8df5db6bb46e413b386e77d5ef31758d8cf68911670df7b512d43ae30acd7969a0a3
|
data/.version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/clean-mock.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
class CleanMock
|
2
|
+
attr_reader :object
|
3
|
+
|
4
|
+
@@fetched ||= {}
|
5
|
+
@@mock_data ||= {}
|
6
|
+
@@sequence ||= {}
|
7
|
+
@@classes ||= {}
|
8
|
+
|
9
|
+
class << self
|
10
|
+
# defined mocked object
|
11
|
+
def define name, opts={}, &block
|
12
|
+
@@mock_data[name] = [block, opts]
|
13
|
+
end
|
14
|
+
|
15
|
+
def attributes_for *args
|
16
|
+
build(*args).attributes.select{ |k,v| v.present? }
|
17
|
+
end
|
18
|
+
|
19
|
+
# create a new object, no save
|
20
|
+
def build *args
|
21
|
+
new(*args).object
|
22
|
+
end
|
23
|
+
|
24
|
+
# save if possible
|
25
|
+
def create *args
|
26
|
+
build(*args).tap do |object|
|
27
|
+
object.save if object.respond_to?(:save)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# create only once
|
32
|
+
def fetch *args, &block
|
33
|
+
code = Digest::SHA1.hexdigest(args.to_s)
|
34
|
+
@@fetched[code] ||= create(*args, &block)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
###
|
39
|
+
|
40
|
+
def initialize *args
|
41
|
+
opts = args.last.is_a?(Hash) ? args.pop : {}
|
42
|
+
@kind = args.shift
|
43
|
+
@traits = args
|
44
|
+
|
45
|
+
block, mock_opts = @@mock_data[@kind] || raise(ArgumentError, 'Mock object "%s" not defined' % @kind)
|
46
|
+
|
47
|
+
@object =
|
48
|
+
case mock_opts[:class]
|
49
|
+
when FalseClass
|
50
|
+
# define :foo, class: false
|
51
|
+
nil
|
52
|
+
when NilClass
|
53
|
+
# define :foo
|
54
|
+
@kind.to_s.classify.constantize.new
|
55
|
+
when Symbol
|
56
|
+
# define :foo, class: foo
|
57
|
+
name = mock_opts[:class].to_s.classify
|
58
|
+
|
59
|
+
if Object.const_defined?(name)
|
60
|
+
name.constantize.new
|
61
|
+
else
|
62
|
+
Object.const_set(name, Class.new).new
|
63
|
+
end
|
64
|
+
else
|
65
|
+
# define :foo, class: FooBar
|
66
|
+
mock_opts[:class].new
|
67
|
+
end
|
68
|
+
|
69
|
+
if @object
|
70
|
+
instance_exec @object, opts, &block
|
71
|
+
else
|
72
|
+
@object = instance_exec opts, &block
|
73
|
+
end
|
74
|
+
|
75
|
+
raise 'Trait [%s] not found' % @traits.join(', ') if @traits.first
|
76
|
+
end
|
77
|
+
|
78
|
+
# block to execute and modify object
|
79
|
+
def trait name, &block
|
80
|
+
if @traits.delete(name)
|
81
|
+
instance_exec(@object, &block)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# define or overlod current instance method
|
86
|
+
def func name, &block
|
87
|
+
@object.define_singleton_method(name, &block)
|
88
|
+
end
|
89
|
+
|
90
|
+
# simple sequence generator by name
|
91
|
+
def sequence name=nil, start=nil
|
92
|
+
name ||= :seq
|
93
|
+
@@sequence[name] ||= start || 0
|
94
|
+
@@sequence[name] += 1
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# mock do
|
2
|
+
# define :org do |o|
|
3
|
+
# o.name = 'Org %s' % sequence
|
4
|
+
# end
|
5
|
+
# end
|
6
|
+
# mock.define :user do ...
|
7
|
+
# mock :user do ...
|
8
|
+
unless respond_to?(:mock)
|
9
|
+
Object.class_eval do
|
10
|
+
def mock *args, &block
|
11
|
+
if args.first
|
12
|
+
CleanMock.define *args, &block
|
13
|
+
elsif block_given?
|
14
|
+
CleanMock.instance_exec &block
|
15
|
+
else
|
16
|
+
CleanMock
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: clean-mock
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dino Reic
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-10-03 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Clean and efficient ruby testing object creation helper/mocking library
|
14
|
+
with interface similar to FactoryBot
|
15
|
+
email: reic.dino@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- "./.version"
|
21
|
+
- "./lib/clean-mock.rb"
|
22
|
+
- "./lib/clean-mock/base.rb"
|
23
|
+
- "./lib/clean-mock/global.rb"
|
24
|
+
homepage: https://github.com/dux/clean-mock
|
25
|
+
licenses:
|
26
|
+
- MIT
|
27
|
+
metadata: {}
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
requirements: []
|
43
|
+
rubygems_version: 3.0.6
|
44
|
+
signing_key:
|
45
|
+
specification_version: 4
|
46
|
+
summary: Ruby testing object creation helper/mocking lib
|
47
|
+
test_files: []
|