clean-mock 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,2 @@
1
+ require_relative 'clean-mock/base'
2
+ require_relative 'clean-mock/global'
@@ -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: []