clean-mock 0.1.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 +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: []
|