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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3451c37e94f11e1fed722a6ab987454f8ccaa7d52edcc906ef0635cb92d177b
4
- data.tar.gz: 544bcaef77540b26c750741bffd35ef363c331e155f1ca49c99696959ff21eae
3
+ metadata.gz: 433696da9dd29c04e52b86d753dbbc73aba33fdb3e2a14a1c7e03dc4f7f1c2c9
4
+ data.tar.gz: 42f41fc806176cecbcce43441ace89126e751bed7ab23b103b91477451b243c5
5
5
  SHA512:
6
- metadata.gz: 9963c7729eeaedbf7b9ec575931d2918630d04244eecd0c6d9b5178636edc20ec1867f4bf2a33e30527481cb76ee3e56dd140124ffd279e808d977bee25edd6b
7
- data.tar.gz: c2224d035456e70630851b8f1d8acf1e4519b7310c1805ce1ec45c98689138b5ae0cea04cb582e4ec8aad67db376d42a68235394516589813c4264321aed7aa0
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::Hypothesis)', default: 'Theorem::Harness'
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[:directory], 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], to_s, **opts, &hash[:block])
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
- # parallel harness
14
- module ParallelHarness
15
- include Control::Harness
11
+ load_tests do |options|
12
+ directory = options[:directory] || '.'
16
13
 
17
- on_run do |tests|
18
- Parallel.map(tests, in_threads: 6, &:run!).flatten
14
+ ExtendedDir.require_all("./#{directory}")
15
+
16
+ filtered_registry(options)
19
17
  end
20
18
  end
21
19
 
@@ -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
@@ -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 |directory, options = {}|
13
- tests = inner.instance_exec directory, options, &mod.test_loader
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 = ->(directory, tags) do
25
+ DEFAULT_LOADER = ->(options) do
26
+ directory = options[:directory] || '.'
27
+
26
28
  ExtendedDir.require_all("./#{directory}")
27
29
 
28
30
  registry
@@ -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
@@ -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, **opts, &block)
9
+ def initialize(name, namespace, arguments: {}, **metadata, &block)
9
10
  @name = name
10
11
  @namespace = namespace
11
12
  @block = block
12
- @arguments = opts
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(**params)
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
- error ||= run_test(test, test_case)
111
- error ||= run_after_each_beakers(test_case)
122
+ before_test_case = test_case.clone
123
+
124
+ error ||= run_test(test, before_test_case)
112
125
 
113
- completed_test = CompletedTest.new(test, error)
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(test_case)
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!(directory, options)
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!(directory, options)
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: 0.0.3
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.22
123
+ rubygems_version: 3.2.31
137
124
  signing_key:
138
125
  specification_version: 4
139
126
  summary: simple and extensible test library toolkit