hypothesis-specs 0.3.0 → 0.7.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/CHANGELOG.md +36 -0
- data/Cargo.toml +2 -2
- data/README.markdown +1 -1
- data/Rakefile +17 -1
- data/lib/hypothesis.rb +29 -1
- data/lib/hypothesis/engine.rb +5 -5
- data/src/lib.rs +28 -5
- metadata +3 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b45927dcad934674c4626592af6a233a6a203e780bdf452a707393236f58539
|
4
|
+
data.tar.gz: 5a64bedf3e625575165520dc367241a3cd7e1355d43bf8d511fea96add531a1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 725eaad1d61b219f67bd0cd3eaad7510952e7dcaf820e6b53346bb7d132b51198246e4ad6856a89ff1fafecd5c3eefbfd563008367208e1595c6bede67ba4444
|
7
|
+
data.tar.gz: c25843124c218554533f0bba87632d43ee642652d36410067e213a63f5e5c8a592c0ce3082ceb25fe93e6cf178be58c54819c91d49eab92e533f18d7b73936d2
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,39 @@
|
|
1
|
+
# Hypothesis for Ruby 0.7.0 (2021-03-12)
|
2
|
+
|
3
|
+
Moves rake from being a a runtime dependency to being a development dependency. Rake is used to run tests but is not required for consumers of hypothesis-ruby.
|
4
|
+
|
5
|
+
# Hypothesis for Ruby 0.6.1 (2021-02-01)
|
6
|
+
|
7
|
+
This patch contains minor performance improvements for `HypothesisCoreIntegers` class instantiation.
|
8
|
+
|
9
|
+
# Hypothesis for Ruby 0.6.0 (2021-01-27)
|
10
|
+
|
11
|
+
Adds support for skipping shrinking. While shrinking is extremely helpful and important in general, it has the potential to be quite time consuming. It can be useful to observe a raw failure before choosing to allow the engine to try to shrink. [hypothesis-python](https://hypothesis.readthedocs.io/en/latest/settings.html#phases) already provides the ability to skip shrinking, so there is precedent for this being useful. While `hypothesis-ruby` does not have the concept of other "Phases" yet, we can still start off the API by using this concept.
|
12
|
+
|
13
|
+
Usage:
|
14
|
+
|
15
|
+
```
|
16
|
+
hypothesis(phases: Phase.excluding(:shrink)) do
|
17
|
+
# Failures here will be displayed directly and shrinking will be avoided
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
# Hypothesis for Ruby 0.5.0 (2021-01-25)
|
22
|
+
|
23
|
+
Adds support for skipping shrinking. While shrinking is extremely helpful and important in general, it has the potential to be quite time consuming. It can be useful to observe a raw failure before choosing to allow the engine to try to shrink. [hypothesis-python](https://hypothesis.readthedocs.io/en/latest/settings.html#phases) already provides the ability to skip shrinking, so there is precedent for this being useful. While `hypothesis-ruby` does not have the concept of other "Phases" yet, we can still start off the API by using this concept.
|
24
|
+
|
25
|
+
Usage:
|
26
|
+
|
27
|
+
```
|
28
|
+
hypothesis(phases: Phase.excluding(:shrink)) do
|
29
|
+
# Failures here will be displayed directly and shrinking will be avoided
|
30
|
+
end
|
31
|
+
```
|
32
|
+
|
33
|
+
# Hypothesis for Ruby 0.4.0 (2021-01-12)
|
34
|
+
|
35
|
+
This removes hypothesis-ruby's dependence on RSpec. Now, it can be used with any Ruby test runner.
|
36
|
+
|
1
37
|
# Hypothesis for Ruby 0.3.0 (2021-01-08)
|
2
38
|
|
3
39
|
This release converts Hypothesis for Ruby to use [RuTie](https://github.com/danielpclark/rutie)
|
data/Cargo.toml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
[package]
|
2
2
|
name = "hypothesis-ruby"
|
3
3
|
version = "0.1.0"
|
4
|
-
authors = ["David R. MacIver <david@drmaciver.com>", "Alex
|
4
|
+
authors = ["David R. MacIver <david@drmaciver.com>", "Alex Weisberger <alex.m.weisberger@gmail.com>"]
|
5
5
|
|
6
6
|
[lib]
|
7
7
|
name="hypothesis_ruby_core"
|
@@ -11,4 +11,4 @@ crate-type = ["cdylib"]
|
|
11
11
|
rutie = {version="0.8.1"}
|
12
12
|
lazy_static = "1.4.0"
|
13
13
|
rand = '0.3'
|
14
|
-
conjecture = '0.
|
14
|
+
conjecture = '0.7.0'
|
data/README.markdown
CHANGED
@@ -71,7 +71,7 @@ Right now this is really more to allow you to try it out and provide feedback th
|
|
71
71
|
The more feedback we get, the sooner it will get there!
|
72
72
|
|
73
73
|
Note that in order to use Hypothesis for Ruby, you will need a rust toolchain installed.
|
74
|
-
Please go to [https://www.rustup.rs](https://www.rustup.rs) and follow the instructions if you do not already have one.
|
74
|
+
Please go to [https://www.rustup.rs](https://www.rustup.rs) and follow the instructions if you do not already have one. You will most likely need to compile your Ruby executable with the `--enable-shared` option. See [here](https://github.com/danielpclark/rutie#dynamic-vs-static-builds).
|
75
75
|
|
76
76
|
## Project Status
|
77
77
|
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'date'
|
|
5
5
|
require 'open3'
|
6
6
|
|
7
7
|
task :build do
|
8
|
-
|
8
|
+
sh('cargo build --release')
|
9
9
|
end
|
10
10
|
|
11
11
|
begin
|
@@ -20,9 +20,25 @@ begin
|
|
20
20
|
end
|
21
21
|
|
22
22
|
task test: %i[build spec minitests]
|
23
|
+
task rspec: %i[build spec]
|
24
|
+
task minitest: %i[build without_rspec] do
|
25
|
+
begin
|
26
|
+
Rake::Task['minitests'].execute
|
27
|
+
ensure
|
28
|
+
Rake::Task['with_rspec'].execute
|
29
|
+
end
|
30
|
+
end
|
23
31
|
rescue LoadError
|
24
32
|
end
|
25
33
|
|
34
|
+
task :without_rspec do
|
35
|
+
sh('bundle config set without rspec')
|
36
|
+
end
|
37
|
+
|
38
|
+
task :with_rspec do
|
39
|
+
sh('bundle config unset without')
|
40
|
+
end
|
41
|
+
|
26
42
|
def rubocop(fix:)
|
27
43
|
sh "bundle exec rubocop #{'-a' if fix} lib spec minitests " \
|
28
44
|
'Rakefile hypothesis-specs.gemspec'
|
data/lib/hypothesis.rb
CHANGED
@@ -7,6 +7,28 @@ require_relative 'hypothesis/testcase'
|
|
7
7
|
require_relative 'hypothesis/engine'
|
8
8
|
require_relative 'hypothesis/world'
|
9
9
|
|
10
|
+
module Phase
|
11
|
+
SHRINK = :shrink
|
12
|
+
|
13
|
+
module_function
|
14
|
+
|
15
|
+
def all
|
16
|
+
[SHRINK]
|
17
|
+
end
|
18
|
+
|
19
|
+
def excluding(*phases)
|
20
|
+
unknown_phases = phases.reject { |phase| Phase.all.include?(phase) }
|
21
|
+
unless unknown_phases.empty?
|
22
|
+
raise(
|
23
|
+
ArgumentError,
|
24
|
+
"Attempting to exclude unknown phases: #{unknown_phases}"
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
all - phases
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
10
32
|
# This is the main module for using Hypothesis.
|
11
33
|
# It is expected that you will include this in your
|
12
34
|
# tests, but its methods are also available on the
|
@@ -201,7 +223,12 @@ module Hypothesis
|
|
201
223
|
# should store previously failing test cases. If it is nil, Hypothesis
|
202
224
|
# will use a default of .hypothesis/examples in the current directory.
|
203
225
|
# May also be set to false to disable the database functionality.
|
204
|
-
def hypothesis(
|
226
|
+
def hypothesis(
|
227
|
+
max_valid_test_cases: 200,
|
228
|
+
phases: Phase.all,
|
229
|
+
database: nil,
|
230
|
+
&block
|
231
|
+
)
|
205
232
|
unless World.current_engine.nil?
|
206
233
|
raise UsageError, 'Cannot nest hypothesis calls'
|
207
234
|
end
|
@@ -210,6 +237,7 @@ module Hypothesis
|
|
210
237
|
World.current_engine = Engine.new(
|
211
238
|
hypothesis_stable_identifier,
|
212
239
|
max_examples: max_valid_test_cases,
|
240
|
+
phases: phases,
|
213
241
|
database: database
|
214
242
|
)
|
215
243
|
World.current_engine.run(&block)
|
data/lib/hypothesis/engine.rb
CHANGED
@@ -2,14 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'rutie'
|
4
4
|
|
5
|
-
require 'rspec/expectations'
|
6
|
-
|
7
5
|
module Hypothesis
|
8
6
|
DEFAULT_DATABASE_PATH = File.join(Dir.pwd, '.hypothesis', 'examples')
|
9
7
|
|
10
8
|
class Engine
|
11
|
-
include RSpec::Matchers
|
12
|
-
|
13
9
|
attr_reader :current_source
|
14
10
|
attr_accessor :is_find
|
15
11
|
|
@@ -23,7 +19,11 @@ module Hypothesis
|
|
23
19
|
database = nil if database == false
|
24
20
|
|
25
21
|
@core_engine = HypothesisCoreEngine.new(
|
26
|
-
name,
|
22
|
+
name,
|
23
|
+
database,
|
24
|
+
seed,
|
25
|
+
options.fetch(:max_examples),
|
26
|
+
options.fetch(:phases)
|
27
27
|
)
|
28
28
|
|
29
29
|
@exceptions_to_tags = Hash.new { |h, k| h[k] = h.size }
|
data/src/lib.rs
CHANGED
@@ -4,15 +4,19 @@ extern crate rutie;
|
|
4
4
|
extern crate lazy_static;
|
5
5
|
extern crate conjecture;
|
6
6
|
|
7
|
+
use std::convert::TryFrom;
|
7
8
|
use std::mem;
|
8
9
|
|
9
|
-
use rutie::{
|
10
|
+
use rutie::{
|
11
|
+
AnyException, AnyObject, Array, Boolean, Class, Exception, Float, Integer, NilClass, Object,
|
12
|
+
RString, Symbol, VM,
|
13
|
+
};
|
10
14
|
|
11
15
|
use conjecture::data::{DataSource, Status, TestResult};
|
12
16
|
use conjecture::database::{BoxedDatabase, DirectoryDatabase, NoDatabase};
|
13
17
|
use conjecture::distributions;
|
14
18
|
use conjecture::distributions::Repeat;
|
15
|
-
use conjecture::engine::Engine;
|
19
|
+
use conjecture::engine::{Engine, Phase};
|
16
20
|
|
17
21
|
pub struct HypothesisCoreDataSourceStruct {
|
18
22
|
source: Option<DataSource>,
|
@@ -46,6 +50,7 @@ wrappable_struct!(
|
|
46
50
|
|
47
51
|
class!(HypothesisCoreDataSource);
|
48
52
|
|
53
|
+
#[rustfmt::skip]
|
49
54
|
methods!(
|
50
55
|
HypothesisCoreDataSource,
|
51
56
|
itself,
|
@@ -77,6 +82,7 @@ impl HypothesisCoreEngineStruct {
|
|
77
82
|
database_path: Option<String>,
|
78
83
|
seed: u64,
|
79
84
|
max_examples: u64,
|
85
|
+
phases: Vec<Phase>,
|
80
86
|
) -> HypothesisCoreEngineStruct {
|
81
87
|
let xs: [u32; 2] = [seed as u32, (seed >> 32) as u32];
|
82
88
|
let db: BoxedDatabase = match database_path {
|
@@ -85,7 +91,7 @@ impl HypothesisCoreEngineStruct {
|
|
85
91
|
};
|
86
92
|
|
87
93
|
HypothesisCoreEngineStruct {
|
88
|
-
engine: Engine::new(name, max_examples, &xs, db),
|
94
|
+
engine: Engine::new(name, max_examples, phases, &xs, db),
|
89
95
|
pending: None,
|
90
96
|
interesting_examples: Vec::new(),
|
91
97
|
}
|
@@ -144,6 +150,7 @@ wrappable_struct!(
|
|
144
150
|
|
145
151
|
class!(HypothesisCoreEngine);
|
146
152
|
|
153
|
+
#[rustfmt::skip]
|
147
154
|
methods!(
|
148
155
|
HypothesisCoreEngine,
|
149
156
|
itself,
|
@@ -151,13 +158,26 @@ methods!(
|
|
151
158
|
name: RString,
|
152
159
|
database_path: RString,
|
153
160
|
seed: Integer,
|
154
|
-
max_example: Integer
|
161
|
+
max_example: Integer,
|
162
|
+
phases: Array
|
155
163
|
) -> AnyObject {
|
164
|
+
let rust_phases = safe_access(phases)
|
165
|
+
.into_iter()
|
166
|
+
.map(|ruby_phase| {
|
167
|
+
let phase_sym = safe_access(ruby_phase.try_convert_to::<Symbol>());
|
168
|
+
let phase = Phase::try_from(phase_sym.to_str())
|
169
|
+
.map_err(|e| AnyException::new("ArgumentError", Some(&e)));
|
170
|
+
|
171
|
+
safe_access(phase)
|
172
|
+
})
|
173
|
+
.collect();
|
174
|
+
|
156
175
|
let core_engine = HypothesisCoreEngineStruct::new(
|
157
176
|
safe_access(name).to_string(),
|
158
177
|
database_path.ok().map(|p| p.to_string()),
|
159
178
|
safe_access(seed).to_u64(),
|
160
179
|
safe_access(max_example).to_u64(),
|
180
|
+
rust_phases,
|
161
181
|
);
|
162
182
|
|
163
183
|
Class::from_existing("HypothesisCoreEngine")
|
@@ -259,6 +279,7 @@ wrappable_struct!(
|
|
259
279
|
|
260
280
|
class!(HypothesisCoreIntegers);
|
261
281
|
|
282
|
+
#[rustfmt::skip]
|
262
283
|
methods!(
|
263
284
|
HypothesisCoreIntegers,
|
264
285
|
itself,
|
@@ -315,6 +336,7 @@ wrappable_struct!(
|
|
315
336
|
|
316
337
|
class!(HypothesisCoreRepeatValues);
|
317
338
|
|
339
|
+
#[rustfmt::skip]
|
318
340
|
methods!(
|
319
341
|
HypothesisCoreRepeatValues,
|
320
342
|
itself,
|
@@ -376,6 +398,7 @@ wrappable_struct!(
|
|
376
398
|
|
377
399
|
class!(HypothesisCoreBoundedIntegers);
|
378
400
|
|
401
|
+
#[rustfmt::skip]
|
379
402
|
methods!(
|
380
403
|
HypothesisCoreBoundedIntegers,
|
381
404
|
itself,
|
@@ -465,5 +488,5 @@ fn mark_child_status(
|
|
465
488
|
}
|
466
489
|
|
467
490
|
fn safe_access<T>(value: Result<T, AnyException>) -> T {
|
468
|
-
|
491
|
+
value.map_err(VM::raise_ex).unwrap()
|
469
492
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hypothesis-specs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David R. Maciver
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-03-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rutie
|
@@ -25,26 +25,6 @@ dependencies:
|
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 0.0.3
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: rake
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
31
|
-
requirements:
|
32
|
-
- - ">="
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: '10.0'
|
35
|
-
- - "<"
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: '13.0'
|
38
|
-
type: :runtime
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
requirements:
|
42
|
-
- - ">="
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version: '10.0'
|
45
|
-
- - "<"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '13.0'
|
48
28
|
description: 'Hypothesis is a powerful, flexible, and easy to use library for property-based
|
49
29
|
testing.
|
50
30
|
|
@@ -89,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
69
|
- !ruby/object:Gem::Version
|
90
70
|
version: '0'
|
91
71
|
requirements: []
|
92
|
-
rubygems_version: 3.2.
|
72
|
+
rubygems_version: 3.2.14
|
93
73
|
signing_key:
|
94
74
|
specification_version: 4
|
95
75
|
summary: Hypothesis is a powerful, flexible, and easy to use library for property-based
|