theorem 0.0.3 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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