evt-record_invocation 0.0.0.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: adfb4397c17f13ed1113c3691483dc177ab698453211159165fb18d6803dcfae
|
4
|
+
data.tar.gz: ed0b2e87651eb4e475ba5e40d7baa8bb7d9c77bb2f7fbaa2e465a4386fe4ff3b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4fef722f260ad10b9538f5a7d97c218141ebd3c4cd988dfd0e409d1276e473496520936c99673757fe3b1637483a0f95cc9eac163b197de14ae41ebc35ed3466
|
7
|
+
data.tar.gz: 2f28cd0c551e6bc8678419d2df04198d4de01da95dab2e6d441b3ec0865ee6845c46f46382e204bbe80ec291fe1d79e8e7fd6ffecfbbba39e9f0817d0cfb9fdc
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module RecordInvocation
|
2
|
+
module Controls
|
3
|
+
module Invocation
|
4
|
+
def self.example
|
5
|
+
parameters = {}
|
6
|
+
parameters[:some_parameter] = 1
|
7
|
+
parameters[:some_other_parameter] = 11
|
8
|
+
|
9
|
+
invocation = ::Invocation.new(method_name, parameters)
|
10
|
+
|
11
|
+
invocation
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.method_name
|
15
|
+
:some_method
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module RecordInvocation
|
2
|
+
module Controls
|
3
|
+
module Recorder
|
4
|
+
def self.example
|
5
|
+
Example.new
|
6
|
+
end
|
7
|
+
|
8
|
+
class Example
|
9
|
+
include ::RecordInvocation
|
10
|
+
|
11
|
+
def some_method
|
12
|
+
record_invocation(binding)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module RecordMacro
|
17
|
+
def self.example
|
18
|
+
Example.new
|
19
|
+
end
|
20
|
+
|
21
|
+
class Example
|
22
|
+
include ::RecordInvocation
|
23
|
+
|
24
|
+
record def some_recorded_method(
|
25
|
+
some_parameter,
|
26
|
+
some_optional_parameter=nil,
|
27
|
+
*some_multiple_assignment_parameter,
|
28
|
+
some_keyword_parameter:,
|
29
|
+
some_optional_keyword_parameter: nil,
|
30
|
+
**some_multiple_assignment_keyword_parameter,
|
31
|
+
&some_block
|
32
|
+
)
|
33
|
+
:some_result
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
module IgnoredParameters
|
38
|
+
def self.example
|
39
|
+
Example.new
|
40
|
+
end
|
41
|
+
|
42
|
+
class Example
|
43
|
+
include ::RecordInvocation
|
44
|
+
|
45
|
+
record def some_recorded_method(
|
46
|
+
*,
|
47
|
+
**,
|
48
|
+
&
|
49
|
+
)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
module RecordInvocation
|
2
|
+
Error = ::Class.new(RuntimeError)
|
3
|
+
|
4
|
+
def self.included(cls)
|
5
|
+
cls.class_exec do
|
6
|
+
extend Record
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def __records
|
11
|
+
@__records ||= []
|
12
|
+
end
|
13
|
+
alias :records :__records
|
14
|
+
|
15
|
+
def __record(invocation)
|
16
|
+
__records << invocation
|
17
|
+
records
|
18
|
+
end
|
19
|
+
alias :record :__record
|
20
|
+
|
21
|
+
def __record_invocation(invocation_or_binding)
|
22
|
+
if invocation_or_binding.is_a?(Binding)
|
23
|
+
invocation = Invocation.build(invocation_or_binding)
|
24
|
+
end
|
25
|
+
|
26
|
+
__record(invocation)
|
27
|
+
invocation
|
28
|
+
end
|
29
|
+
alias :record_invocation :__record_invocation
|
30
|
+
|
31
|
+
def __invocation(method_name, **parameters)
|
32
|
+
strict = parameters.delete(:strict)
|
33
|
+
strict ||= false
|
34
|
+
|
35
|
+
invocations = __invocations(method_name, **parameters)
|
36
|
+
|
37
|
+
if invocations.empty?
|
38
|
+
return nil
|
39
|
+
end
|
40
|
+
|
41
|
+
if strict && invocations.length > 1
|
42
|
+
raise Error, "More than one invocation record matches (Method Name: #{method_name.inspect}, Parameters: #{parameters.inspect})"
|
43
|
+
end
|
44
|
+
|
45
|
+
invocations.first
|
46
|
+
end
|
47
|
+
alias :invocation :__invocation
|
48
|
+
|
49
|
+
def __one_invocation(method_name, **parameters)
|
50
|
+
parameters[:strict] = true
|
51
|
+
__invocation(method_name, **parameters)
|
52
|
+
end
|
53
|
+
alias :one_invocation :__one_invocation
|
54
|
+
|
55
|
+
def __invocations(method_name=nil, **parameters)
|
56
|
+
if method_name.nil? && parameters.empty?
|
57
|
+
return __records
|
58
|
+
end
|
59
|
+
|
60
|
+
invocations = __records.select { |invocation| invocation.method_name == method_name }
|
61
|
+
|
62
|
+
if parameters.nil?
|
63
|
+
return invocations
|
64
|
+
end
|
65
|
+
|
66
|
+
if invocations.empty?
|
67
|
+
return []
|
68
|
+
end
|
69
|
+
|
70
|
+
invocations = invocations.select do |invocation|
|
71
|
+
parameters.all? do |match_parameter_name, match_parameter_value|
|
72
|
+
invocation_value = invocation.arguments[match_parameter_name]
|
73
|
+
|
74
|
+
invocation_value == match_parameter_value
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
invocations
|
79
|
+
end
|
80
|
+
alias :invocations :__invocations
|
81
|
+
|
82
|
+
def __invoked?(method_name=nil, **parameters)
|
83
|
+
if method_name.nil? && parameters.empty?
|
84
|
+
return !__records.empty?
|
85
|
+
end
|
86
|
+
|
87
|
+
if not parameters.key?(:strict)
|
88
|
+
parameters[:strict] = false
|
89
|
+
end
|
90
|
+
|
91
|
+
invocation = __invocation(method_name, **parameters)
|
92
|
+
!invocation.nil?
|
93
|
+
end
|
94
|
+
alias :invoked? :__invoked?
|
95
|
+
|
96
|
+
def __invoked_once?(method_name, **parameters)
|
97
|
+
parameters[:strict] = true
|
98
|
+
__invoked?(method_name, **parameters)
|
99
|
+
end
|
100
|
+
alias :invoked_once? :__invoked_once?
|
101
|
+
|
102
|
+
module Record
|
103
|
+
def record_module
|
104
|
+
@record_module ||= prepend_record_module
|
105
|
+
end
|
106
|
+
|
107
|
+
def prepend_record_module
|
108
|
+
mod = Module.new
|
109
|
+
prepend mod
|
110
|
+
mod
|
111
|
+
end
|
112
|
+
|
113
|
+
def record_macro(method_name, &blk)
|
114
|
+
record_module.define_method(method_name) do |*args, **kwargs, &block|
|
115
|
+
parameters = method(method_name).super_method.parameters
|
116
|
+
|
117
|
+
positional_arguments = args.dup
|
118
|
+
keyword_arguments = kwargs.dup
|
119
|
+
|
120
|
+
arguments = {}
|
121
|
+
|
122
|
+
parameters.each do |type, name|
|
123
|
+
case type
|
124
|
+
when :req, :opt
|
125
|
+
if positional_arguments.any?
|
126
|
+
arguments[name] = positional_arguments.shift
|
127
|
+
end
|
128
|
+
when :rest
|
129
|
+
if positional_arguments.any?
|
130
|
+
arguments[name] = positional_arguments
|
131
|
+
end
|
132
|
+
when :key, :keyreq
|
133
|
+
if keyword_arguments.key?(name)
|
134
|
+
arguments[name] = keyword_arguments.delete(name)
|
135
|
+
end
|
136
|
+
when :keyrest
|
137
|
+
arguments[name] = keyword_arguments
|
138
|
+
when :block
|
139
|
+
if not block.nil?
|
140
|
+
arguments[name] = block
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
invocation = Invocation.new(method_name, arguments)
|
146
|
+
__record(invocation)
|
147
|
+
|
148
|
+
super(*args, **kwargs, &block)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
alias :record :record_macro
|
152
|
+
end
|
153
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: evt-record_invocation
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Eventide Project
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-07-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: evt-invocation
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: test_bench
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: " "
|
42
|
+
email: opensource@eventide-project.org
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- lib/record_invocation.rb
|
48
|
+
- lib/record_invocation/controls.rb
|
49
|
+
- lib/record_invocation/controls/invocation.rb
|
50
|
+
- lib/record_invocation/controls/recorder.rb
|
51
|
+
- lib/record_invocation/record_invocation.rb
|
52
|
+
homepage: https://github.com/eventide-project/record-invocation
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '2.4'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubygems_version: 3.4.6
|
72
|
+
signing_key:
|
73
|
+
specification_version: 4
|
74
|
+
summary: Record method invocations, query method invocations, and use predicates to
|
75
|
+
verify a method's invocation
|
76
|
+
test_files: []
|