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.
@@ -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: []