theorem 0.0.3 → 1.2.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 +4 -4
- data/bin/theorize +5 -2
- data/src/experiment.rb +2 -2
- data/src/harness.rb +5 -7
- data/src/stdout_reporter.rb +1 -1
- data/src/theorem/completed_test.rb +6 -1
- data/src/theorem/harness.rb +5 -3
- data/src/theorem/hypothesis.rb +10 -0
- data/src/theorem/notation.rb +33 -0
- data/src/theorem/registry.rb +16 -0
- data/src/theorem/test.rb +36 -13
- data/src/theorem.rb +5 -3
- metadata +3 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 433696da9dd29c04e52b86d753dbbc73aba33fdb3e2a14a1c7e03dc4f7f1c2c9
|
4
|
+
data.tar.gz: 42f41fc806176cecbcce43441ace89126e751bed7ab23b103b91477451b243c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 336ef51f1a4b3bfe1b34da109e8ab193a10aff873a3e4151c4d3a754be479bec455aae731886f8a35c769effc1f89b439ef66055b6a62b096b5fa53ec966c3a4
|
7
|
+
data.tar.gz: e5454f1c81f833480f2b5eccbe9f516f9a4826c7ae743f47c1e4112123b0c558220b2dde81eb918929622aca286ba67b8679f3a3cc1a71dee14313a80e8f1b9c
|
data/bin/theorize
CHANGED
@@ -6,13 +6,16 @@ require_relative '../src/theorem'
|
|
6
6
|
opts = Slop.parse do |o|
|
7
7
|
o.array '--require', 'files to require', delimiter: ','
|
8
8
|
o.string '-m', '--module', 'module (default: Theorem::Hypothesis)', default: 'Theorem::Hypothesis'
|
9
|
-
o.string '-h', '--harness', 'harness (default: Theorem::
|
9
|
+
o.string '-h', '--harness', 'harness (default: Theorem::Harness)', default: 'Theorem::Harness'
|
10
10
|
o.array '-p', '--publisher', 'publishers (default: Theorem::StdoutReporter)', delimiter: ',', default: ['Theorem::StdoutReporter']
|
11
11
|
o.string '-d', '--directory', 'directory to load tests (default: ".")', default: '.'
|
12
|
+
o.array '-i', '--include', 'tags to specify what tests should be included (default: wont filter)', default: []
|
13
|
+
o.array '-e', '--exclude', 'tags the specify what tests should be excluded (default: wont filter)', default: []
|
14
|
+
o.string '--meta', 'string of metadata to pass to the harness', default: ''
|
12
15
|
o.on '--help' do
|
13
16
|
puts o
|
14
17
|
exit
|
15
18
|
end
|
16
19
|
end
|
17
20
|
|
18
|
-
Theorem.run! opts
|
21
|
+
Theorem.run! opts.to_h
|
data/src/experiment.rb
CHANGED
@@ -9,9 +9,9 @@ module Theorem
|
|
9
9
|
@tests << { name: name, block: block }
|
10
10
|
end
|
11
11
|
|
12
|
-
def tests(**opts)
|
12
|
+
def tests(_experiment_namespace: to_s, **opts)
|
13
13
|
@tests.map do |hash|
|
14
|
-
Control::Test.new(hash[:name],
|
14
|
+
Control::Test.new(hash[:name], _experiment_namespace, **opts, &hash[:block])
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/src/harness.rb
CHANGED
@@ -1,21 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative './theorem/harness'
|
4
|
-
require 'parallel'
|
5
4
|
|
6
5
|
# harness
|
7
6
|
module Theorem
|
8
7
|
# default test harness
|
9
8
|
module Harness
|
10
9
|
include Control::Harness
|
11
|
-
end
|
12
10
|
|
13
|
-
|
14
|
-
|
15
|
-
include Control::Harness
|
11
|
+
load_tests do |options|
|
12
|
+
directory = options[:directory] || '.'
|
16
13
|
|
17
|
-
|
18
|
-
|
14
|
+
ExtendedDir.require_all("./#{directory}")
|
15
|
+
|
16
|
+
filtered_registry(options)
|
19
17
|
end
|
20
18
|
end
|
21
19
|
|
data/src/stdout_reporter.rb
CHANGED
@@ -63,7 +63,7 @@ module Theorem
|
|
63
63
|
|
64
64
|
def report_failures(tests)
|
65
65
|
tests.each do |failure|
|
66
|
-
puts "Failure in #{failure.full_name}\nError: #{failure.error.to_s.red}\nBacktrace:\n------\n#{failure.error.backtrace.map(&:red).join("\n")}"
|
66
|
+
puts "Failure in #{failure.full_name}\nError: #{failure.error.message.to_s.red}\nBacktrace:\n------\n#{failure.error.backtrace.map(&:red).join("\n")}"
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -6,9 +6,14 @@ module Theorem
|
|
6
6
|
class CompletedTest
|
7
7
|
attr_reader :test, :error
|
8
8
|
|
9
|
-
def initialize(test, error = nil)
|
9
|
+
def initialize(test, error = nil, notary:)
|
10
10
|
@test = test
|
11
11
|
@error = error
|
12
|
+
@notary = notary
|
13
|
+
end
|
14
|
+
|
15
|
+
def notary
|
16
|
+
@notary
|
12
17
|
end
|
13
18
|
|
14
19
|
def full_name
|
data/src/theorem/harness.rb
CHANGED
@@ -9,8 +9,8 @@ module Theorem
|
|
9
9
|
def self.included(mod)
|
10
10
|
mod.extend(ClassMethods)
|
11
11
|
mod.define_singleton_method :included do |inner|
|
12
|
-
inner.define_singleton_method :run! do |
|
13
|
-
tests = inner.instance_exec
|
12
|
+
inner.define_singleton_method :run! do |options: {}|
|
13
|
+
tests = inner.instance_exec options, &mod.test_loader
|
14
14
|
results = inner.instance_exec tests, options, &mod.run_loader
|
15
15
|
inner.completed_suite_subscribers.each do |subscriber|
|
16
16
|
subscriber.call(results)
|
@@ -22,7 +22,9 @@ module Theorem
|
|
22
22
|
|
23
23
|
# harness helpers
|
24
24
|
module ClassMethods
|
25
|
-
DEFAULT_LOADER = ->(
|
25
|
+
DEFAULT_LOADER = ->(options) do
|
26
|
+
directory = options[:directory] || '.'
|
27
|
+
|
26
28
|
ExtendedDir.require_all("./#{directory}")
|
27
29
|
|
28
30
|
registry
|
data/src/theorem/hypothesis.rb
CHANGED
@@ -15,6 +15,16 @@ module Theorem
|
|
15
15
|
mod
|
16
16
|
end
|
17
17
|
|
18
|
+
klass.attr_reader :notary
|
19
|
+
|
20
|
+
klass.define_method :initialize do
|
21
|
+
@notary = Notation.new
|
22
|
+
end
|
23
|
+
|
24
|
+
klass.define_method :notate do |&block|
|
25
|
+
block.call(@notary)
|
26
|
+
end
|
27
|
+
|
18
28
|
klass.extend ClassMethods
|
19
29
|
klass.instance_eval do
|
20
30
|
@before_all ||= Beaker.new
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Theorem
|
4
|
+
module Control
|
5
|
+
class Notation
|
6
|
+
def initialize(state = {})
|
7
|
+
@state = state
|
8
|
+
end
|
9
|
+
|
10
|
+
def write(key, value)
|
11
|
+
@state[key] = value
|
12
|
+
end
|
13
|
+
|
14
|
+
def read(key)
|
15
|
+
@state[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def dump
|
19
|
+
@state
|
20
|
+
end
|
21
|
+
|
22
|
+
def merge(notary)
|
23
|
+
Notation.new(@state.merge(notary.dump))
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit(key, &block)
|
27
|
+
data = read(key)
|
28
|
+
block.call(data)
|
29
|
+
write(key, data)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/src/theorem/registry.rb
CHANGED
@@ -8,6 +8,22 @@ module Theorem
|
|
8
8
|
@registry ||= []
|
9
9
|
end
|
10
10
|
|
11
|
+
def filtered_registry(options)
|
12
|
+
registry.each do |test_class|
|
13
|
+
if options[:include]&.any?
|
14
|
+
test_class.tests.select! do |test|
|
15
|
+
test.metadata[:tags]&.intersection(options[:include])&.any?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
next unless options[:exclude]&.any?
|
20
|
+
|
21
|
+
test_class.tests.reject! do |test|
|
22
|
+
test.metadata[:tags]&.intersection(options[:include])&.any?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
11
27
|
def add_to_registry(klass)
|
12
28
|
registry << klass
|
13
29
|
end
|
data/src/theorem/test.rb
CHANGED
@@ -1,23 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require_relative './beaker'
|
3
|
+
require_relative 'notation'
|
3
4
|
|
4
5
|
module Theorem
|
5
6
|
module Control
|
6
7
|
# test new
|
7
8
|
class Test
|
8
|
-
def initialize(name, namespace, **
|
9
|
+
def initialize(name, namespace, arguments: {}, **metadata, &block)
|
9
10
|
@name = name
|
10
11
|
@namespace = namespace
|
11
12
|
@block = block
|
12
|
-
@arguments =
|
13
|
+
@arguments = arguments
|
14
|
+
@metadata = metadata
|
15
|
+
@notary = Notation.new
|
13
16
|
end
|
14
17
|
|
15
|
-
attr_reader :block, :name, :arguments, :namespace
|
18
|
+
attr_reader :block, :name, :arguments, :namespace, :metadata, :notary
|
16
19
|
|
17
20
|
def full_name
|
18
21
|
"#{namespace} #{name}"
|
19
22
|
end
|
20
23
|
|
24
|
+
def notate(&block)
|
25
|
+
block.call(notary)
|
26
|
+
end
|
27
|
+
|
21
28
|
def run!(ctx)
|
22
29
|
ctx.instance_exec self, **arguments, &block
|
23
30
|
end
|
@@ -67,8 +74,8 @@ module Theorem
|
|
67
74
|
obj = Class.new
|
68
75
|
obj.include(control)
|
69
76
|
obj.instance_eval &block if block
|
70
|
-
obj.instance_exec klass, opts do |experiment_klass, params|
|
71
|
-
@tests.concat experiment_klass.tests(
|
77
|
+
obj.instance_exec self, klass, opts do |consumer, experiment_klass, params|
|
78
|
+
@tests.concat experiment_klass.tests(_experiment_namespace: consumer.to_s, arguments: params)
|
72
79
|
end
|
73
80
|
end
|
74
81
|
|
@@ -92,34 +99,50 @@ module Theorem
|
|
92
99
|
@after_all
|
93
100
|
end
|
94
101
|
|
95
|
-
def test(name, &block)
|
96
|
-
@tests << Test.new(name, to_s, &block)
|
102
|
+
def test(name, **hargs, &block)
|
103
|
+
@tests << Test.new(name, to_s, **hargs, &block)
|
97
104
|
end
|
98
105
|
|
99
106
|
def run!
|
100
107
|
test_case = new
|
101
108
|
|
109
|
+
# run before all beakers to create state in test case
|
102
110
|
before_failures = run_before_all_beakers(test_case)
|
111
|
+
|
103
112
|
if before_failures.any?
|
104
113
|
return before_failures
|
105
114
|
end
|
106
115
|
|
116
|
+
# duplicate the before_all arrangement for the after all hook
|
117
|
+
duplicate_test_case = test_case.clone
|
118
|
+
|
107
119
|
results = []
|
108
120
|
@tests.each do |test|
|
109
121
|
error ||= run_before_each_beakers(test_case)
|
110
|
-
|
111
|
-
|
122
|
+
before_test_case = test_case.clone
|
123
|
+
|
124
|
+
error ||= run_test(test, before_test_case)
|
112
125
|
|
113
|
-
|
126
|
+
error ||= run_after_each_beakers(before_test_case)
|
127
|
+
|
128
|
+
notary = test_case.notary.merge(test.notary)
|
129
|
+
|
130
|
+
completed_test = CompletedTest.new(test, error, notary: notary.dump)
|
114
131
|
publish_test_completion(completed_test)
|
115
132
|
results << completed_test
|
116
133
|
end
|
117
134
|
|
118
|
-
after_failures = run_after_all_beakers(
|
135
|
+
after_failures = run_after_all_beakers(duplicate_test_case)
|
136
|
+
|
119
137
|
if after_failures.any?
|
120
138
|
return after_failures
|
121
139
|
end
|
122
140
|
|
141
|
+
results.each do |completed_test|
|
142
|
+
# merge any after_all notations
|
143
|
+
completed_test.notary.merge!(duplicate_test_case.notary.dump)
|
144
|
+
end
|
145
|
+
|
123
146
|
results
|
124
147
|
end
|
125
148
|
|
@@ -152,7 +175,7 @@ module Theorem
|
|
152
175
|
Theorem.handle_exception(error)
|
153
176
|
|
154
177
|
@tests.map do |test|
|
155
|
-
CompletedTest.new(test, error)
|
178
|
+
CompletedTest.new(test, error, notary: test_case.notary)
|
156
179
|
end
|
157
180
|
end
|
158
181
|
|
@@ -191,7 +214,7 @@ module Theorem
|
|
191
214
|
Theorem.handle_exception(error)
|
192
215
|
|
193
216
|
@tests.map do |test|
|
194
|
-
CompletedTest.new(test, error)
|
217
|
+
CompletedTest.new(test, error, notary: test_case.notary)
|
195
218
|
end
|
196
219
|
end
|
197
220
|
|
data/src/theorem.rb
CHANGED
@@ -2,6 +2,8 @@ require_relative 'theorem/hypothesis'
|
|
2
2
|
require_relative 'harness'
|
3
3
|
require_relative 'experiment'
|
4
4
|
require_relative 'stdout_reporter'
|
5
|
+
|
6
|
+
require_relative 'theorem/harness'
|
5
7
|
require 'json'
|
6
8
|
|
7
9
|
module Theorem
|
@@ -20,7 +22,7 @@ module Theorem
|
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
23
|
-
def self.run!(
|
25
|
+
def self.run!(options)
|
24
26
|
options[:require].each do |file|
|
25
27
|
require file
|
26
28
|
end
|
@@ -40,7 +42,7 @@ module Theorem
|
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
43
|
-
mod.run!(
|
45
|
+
mod.run!(options: options)
|
44
46
|
end
|
45
47
|
|
46
48
|
module JsonReporter
|
@@ -50,7 +52,7 @@ module Theorem
|
|
50
52
|
results = results.map do |result|
|
51
53
|
{ name: result.full_name, failed: result.failed? }
|
52
54
|
end
|
53
|
-
puts results
|
55
|
+
puts results.to_json
|
54
56
|
puts "\n\n"
|
55
57
|
end
|
56
58
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: theorem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Gregory
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: parallel
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
83
|
description: simple and extensible test library toolkit
|
98
84
|
email: sean.christopher.gregory@gmail.com
|
99
85
|
executables:
|
@@ -110,6 +96,7 @@ files:
|
|
110
96
|
- src/theorem/completed_test.rb
|
111
97
|
- src/theorem/harness.rb
|
112
98
|
- src/theorem/hypothesis.rb
|
99
|
+
- src/theorem/notation.rb
|
113
100
|
- src/theorem/registry.rb
|
114
101
|
- src/theorem/reporter.rb
|
115
102
|
- src/theorem/test.rb
|
@@ -133,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
120
|
- !ruby/object:Gem::Version
|
134
121
|
version: '0'
|
135
122
|
requirements: []
|
136
|
-
rubygems_version: 3.2.
|
123
|
+
rubygems_version: 3.2.31
|
137
124
|
signing_key:
|
138
125
|
specification_version: 4
|
139
126
|
summary: simple and extensible test library toolkit
|