fix 1.0.0.beta2 → 1.0.0.beta6
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/LICENSE.md +1 -1
- data/README.md +54 -38
- data/lib/fix.rb +15 -16
- data/lib/fix/console.rb +24 -0
- data/lib/fix/doc.rb +7 -0
- data/lib/fix/dsl.rb +164 -0
- data/lib/fix/test.rb +51 -0
- data/lib/kernel.rb +25 -2
- metadata +92 -33
- data/lib/fix/context.rb +0 -147
- data/lib/fix/expectation_result_not_found_error.rb +0 -5
- data/lib/fix/it.rb +0 -31
- data/lib/fix/suspicious_success_error.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 361429a943a5149aeea4da4dd83150360db392275ec4d9d98e76969e60768dce
|
4
|
+
data.tar.gz: 6df8aaff424652d4e73cb163cc1dfd973c9a4a03ec2e2d6e351db5f87b0674a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 24a1c58a8e0db0ef62d97881eabc8a4ff0596d82c96f1dee40fc68edffdc17f0206c6d45aa11040e3b11af35038df58ee7bca1f6190330f91b1b384304dcc304
|
7
|
+
data.tar.gz: 0a5ff783abf6bce80c8ff4a3e3f2e938c004bf5cd02e8300f56650e6312638e911638ed41c9293047aa757ae73048cd412bae5b6cc031e43bab82a2f4b92e41c
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -1,31 +1,37 @@
|
|
1
1
|
# Fix
|
2
2
|
|
3
|
-
[](https://fixrb.dev/)
|
4
|
+
[](https://github.com/fixrb/fix/releases)
|
5
|
+
[](https://rubydoc.info/github/fixrb/fix/main)
|
6
|
+
[](https://github.com/fixrb/fix/actions?query=workflow%3Aci+branch%3Amain)
|
7
|
+
[](https://github.com/fixrb/fix/actions?query=workflow%3Arubocop+branch%3Amain)
|
8
|
+
[](https://github.com/fixrb/fix/raw/main/LICENSE.md)
|
9
9
|
|
10
|
-
|
10
|
+
⚠️ This project is still in the experimental phase. May be used at your own risk.
|
11
|
+
|
12
|
+

|
11
13
|
|
12
14
|
## Installation
|
13
15
|
|
14
16
|
Add this line to your application's Gemfile:
|
15
17
|
|
16
18
|
```ruby
|
17
|
-
gem
|
19
|
+
gem "fix", ">= 1.0.0.beta6"
|
18
20
|
```
|
19
21
|
|
20
22
|
And then execute:
|
21
23
|
|
22
|
-
|
24
|
+
```sh
|
25
|
+
bundle
|
26
|
+
```
|
23
27
|
|
24
28
|
Or install it yourself as:
|
25
29
|
|
26
|
-
|
30
|
+
```sh
|
31
|
+
gem install fix --pre
|
32
|
+
```
|
27
33
|
|
28
|
-
##
|
34
|
+
## Example
|
29
35
|
|
30
36
|
Given this app:
|
31
37
|
|
@@ -33,59 +39,76 @@ Given this app:
|
|
33
39
|
# examples/duck/app.rb
|
34
40
|
class Duck
|
35
41
|
def walks
|
36
|
-
|
42
|
+
"Klop klop!"
|
37
43
|
end
|
38
44
|
|
39
45
|
def swims
|
40
|
-
|
46
|
+
"Swoosh..."
|
41
47
|
end
|
42
48
|
|
43
49
|
def quacks
|
44
|
-
puts
|
50
|
+
puts "Quaaaaaack!"
|
45
51
|
end
|
46
52
|
end
|
47
53
|
```
|
48
54
|
|
49
|
-
|
55
|
+
And this fixed behavior:
|
50
56
|
|
51
57
|
```ruby
|
52
58
|
# examples/duck/fix.rb
|
53
|
-
require_relative 'app'
|
54
|
-
require_relative '../../lib/fix'
|
55
59
|
|
56
|
-
|
60
|
+
relative "fix"
|
61
|
+
|
62
|
+
Fix :Duck do
|
63
|
+
it MUST be_an_instance_of :Duck
|
57
64
|
|
58
|
-
Fix(@bird) do
|
59
65
|
on :swims do
|
60
|
-
it
|
66
|
+
it MUST eql "Swoosh..."
|
61
67
|
end
|
62
68
|
|
63
69
|
on :speaks do
|
64
|
-
it
|
70
|
+
it MUST raise_exception NoMethodError
|
65
71
|
end
|
66
72
|
|
67
73
|
on :sings do
|
68
|
-
it
|
74
|
+
it MAY eql "♪... ♫..."
|
69
75
|
end
|
70
76
|
end
|
71
77
|
```
|
72
78
|
|
73
|
-
|
79
|
+
When I run this test:
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
# examples/duck/test.rb
|
83
|
+
|
84
|
+
require_relative "app"
|
85
|
+
require_relative "fix"
|
86
|
+
|
87
|
+
Fix[:Duck].test { Duck.new }
|
88
|
+
```
|
74
89
|
|
75
90
|
```sh
|
76
|
-
ruby examples/duck/
|
91
|
+
ruby examples/duck/test.rb
|
77
92
|
```
|
78
93
|
|
94
|
+
I should see this output:
|
95
|
+
|
79
96
|
```txt
|
80
|
-
|
81
|
-
|
82
|
-
|
97
|
+
NoMethodError: undefined method `sings' for #<Duck:0x00007fc5289bcf68>.
|
98
|
+
Success: expected to eql "Swoosh...".
|
99
|
+
Success: undefined method `speaks' for #<Duck:0x00007fc5289bcf68>.
|
83
100
|
```
|
84
101
|
|
102
|
+
## Test suite
|
103
|
+
|
104
|
+
__Fix__'s specifications will be [fixed here](https://github.com/fixrb/fix/blob/main/fix/) and will be tested against __Fix__'s codebase executing [test/*](https://github.com/fixrb/fix/blob/main/test/)'s files.
|
105
|
+
|
85
106
|
## Contact
|
86
107
|
|
87
|
-
* Home page: https://fixrb.dev/
|
88
|
-
* Source code: https://github.com/fixrb/fix/
|
108
|
+
* Home page: [https://fixrb.dev/](https://fixrb.dev/)
|
109
|
+
* Source code: [https://github.com/fixrb/fix](https://github.com/fixrb/fix)
|
110
|
+
* API Doc: [https://rubydoc.info/gems/fix](https://rubydoc.info/gems/fix)
|
111
|
+
* Twitter: [https://twitter.com/fix\_rb](https://twitter.com/fix\_rb)
|
89
112
|
|
90
113
|
## Versioning
|
91
114
|
|
@@ -93,20 +116,13 @@ __Fix__ follows [Semantic Versioning 2.0](https://semver.org/).
|
|
93
116
|
|
94
117
|
## License
|
95
118
|
|
96
|
-
The gem is available as open source under the terms of the [MIT License](https://
|
119
|
+
The [gem](https://rubygems.org/gems/fix) is available as open source under the terms of the [MIT License](https://github.com/fixrb/fix/raw/main/LICENSE.md).
|
97
120
|
|
98
121
|
***
|
99
122
|
|
100
123
|
<p>
|
101
124
|
This project is sponsored by:<br />
|
102
125
|
<a href="https://sashite.com/"><img
|
103
|
-
src="https://github.com/fixrb/fix/raw/
|
126
|
+
src="https://github.com/fixrb/fix/raw/main/img/sashite.png"
|
104
127
|
alt="Sashite" /></a>
|
105
128
|
</p>
|
106
|
-
|
107
|
-
[travis]: https://travis-ci.org/fixrb/fix
|
108
|
-
[codeclimate]: https://codeclimate.com/github/fixrb/fix
|
109
|
-
[gem]: https://rubygems.org/gems/fix
|
110
|
-
[inchpages]: https://inch-ci.org/github/fixrb/fix
|
111
|
-
[rubydoc]: https://rubydoc.info/gems/fix/frames
|
112
|
-
[gitter]: https://gitter.im/fixrb/fix?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
|
data/lib/fix.rb
CHANGED
@@ -1,25 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative File.join("fix", "doc")
|
4
|
+
require_relative File.join("fix", "test")
|
5
|
+
|
6
|
+
require_relative "kernel"
|
7
|
+
|
3
8
|
# Namespace for the Fix framework.
|
4
|
-
#
|
5
9
|
module Fix
|
6
|
-
#
|
10
|
+
# Test a built specification.
|
7
11
|
#
|
8
|
-
# @example
|
9
|
-
#
|
10
|
-
# it { MUST equal 42 }
|
11
|
-
# end
|
12
|
+
# @example Run _Answer_ specification against `42`.
|
13
|
+
# Fix[:Answer].call(42)
|
12
14
|
#
|
13
|
-
# @
|
14
|
-
#
|
15
|
-
# @param specs [Proc] The set of specs.
|
15
|
+
# @example Test _Answer_ specification against `42`.
|
16
|
+
# Fix[:Answer].matches? { 42 }
|
16
17
|
#
|
17
|
-
# @
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
# @param name [String, Symbol] The name of the specification document.
|
19
|
+
#
|
20
|
+
# @return [::Fix::Dsl] The specification document.
|
21
|
+
def self.[](name)
|
22
|
+
Test.new(*Doc.const_get(name).const_get(:CONTEXTS))
|
21
23
|
end
|
22
24
|
end
|
23
|
-
|
24
|
-
require_relative 'kernel'
|
25
|
-
require_relative File.join('fix', 'context')
|
data/lib/fix/console.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fix
|
4
|
+
# Send log messages to the console.
|
5
|
+
module Console
|
6
|
+
# @param report [::Expresenter::Pass] Passed expectation result presenter.
|
7
|
+
#
|
8
|
+
# @see https://github.com/fixrb/expresenter
|
9
|
+
#
|
10
|
+
# @return [nil] Add a colored message to `$stdout`.
|
11
|
+
def self.passed_spec(report)
|
12
|
+
puts report.colored_string
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param report [::Expresenter::Fail] Failed expectation result presenter.
|
16
|
+
#
|
17
|
+
# @see https://github.com/fixrb/expresenter
|
18
|
+
#
|
19
|
+
# @raise [SystemExit] Terminate execution immediately with colored message.
|
20
|
+
def self.failed_spec(report)
|
21
|
+
abort report.colored_string
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/fix/doc.rb
ADDED
data/lib/fix/dsl.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "defi"
|
4
|
+
require "matchi/helper"
|
5
|
+
require "spectus"
|
6
|
+
|
7
|
+
require_relative "test"
|
8
|
+
|
9
|
+
module Fix
|
10
|
+
# Abstract class for handling the domain-specific language.
|
11
|
+
class Dsl
|
12
|
+
include ::Matchi::Helper
|
13
|
+
|
14
|
+
# Sets a user-defined property.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
# require "fix"
|
18
|
+
#
|
19
|
+
# Fix do
|
20
|
+
# let(:name) { "Bob" }
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# @param name [String, Symbol] The name of the property.
|
24
|
+
# @param block [Proc] The content of the method to define.
|
25
|
+
#
|
26
|
+
# @return [Symbol] A private method that define the block content.
|
27
|
+
#
|
28
|
+
# @api public
|
29
|
+
def self.let(name, &block)
|
30
|
+
private define_method(name, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Defines an example group with user-defined properties that describes a
|
34
|
+
# unit to be tested.
|
35
|
+
#
|
36
|
+
# @example
|
37
|
+
# require "fix"
|
38
|
+
#
|
39
|
+
# Fix do
|
40
|
+
# with :password, "secret" do
|
41
|
+
# it MUST equal true
|
42
|
+
# end
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# @param kwargs [Hash] The list of propreties.
|
46
|
+
# @param block [Proc] The block to define the specs.
|
47
|
+
#
|
48
|
+
# @api public
|
49
|
+
def self.with(**kwargs, &block)
|
50
|
+
klass = ::Class.new(self)
|
51
|
+
klass.const_get(:CONTEXTS) << klass
|
52
|
+
kwargs.each { |name, value| klass.let(name) { value } }
|
53
|
+
klass.instance_eval(&block)
|
54
|
+
klass
|
55
|
+
end
|
56
|
+
|
57
|
+
# Defines an example group that describes a unit to be tested.
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# require "fix"
|
61
|
+
#
|
62
|
+
# Fix do
|
63
|
+
# on :+, 2 do
|
64
|
+
# it MUST be 42
|
65
|
+
# end
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# @param method_name [String, Symbol] The method to send to the subject.
|
69
|
+
# @param block [Proc] The block to define the specs.
|
70
|
+
#
|
71
|
+
# @api public
|
72
|
+
def self.on(method_name, *args, **kwargs, &block)
|
73
|
+
klass = ::Class.new(self)
|
74
|
+
klass.const_get(:CONTEXTS) << klass
|
75
|
+
|
76
|
+
const_set("Child#{block.object_id}", klass)
|
77
|
+
|
78
|
+
klass.define_singleton_method(:challenges) do
|
79
|
+
super() + [::Defi.send(method_name, *args, **kwargs)]
|
80
|
+
end
|
81
|
+
|
82
|
+
def klass.initialize
|
83
|
+
if subject.raised?
|
84
|
+
subject
|
85
|
+
else
|
86
|
+
challenge = ::Defi.send(method_name, *args, **kwargs)
|
87
|
+
challenge.to(subject.call)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
klass.instance_eval(&block)
|
92
|
+
klass
|
93
|
+
end
|
94
|
+
|
95
|
+
# Defines a concrete spec definition.
|
96
|
+
#
|
97
|
+
# @example
|
98
|
+
# require "fix"
|
99
|
+
#
|
100
|
+
# Fix { it MUST equal 42 }
|
101
|
+
#
|
102
|
+
# @api public
|
103
|
+
def self.it(requirement)
|
104
|
+
define_method("test_#{requirement.object_id}") { requirement }
|
105
|
+
end
|
106
|
+
|
107
|
+
# @todo Move this method inside "fix-its" gem.
|
108
|
+
def self.its(method_name, requirement)
|
109
|
+
klass = ::Class.new(self)
|
110
|
+
klass.const_get(:CONTEXTS) << klass
|
111
|
+
|
112
|
+
const_set("Child#{requirement.object_id}", klass)
|
113
|
+
|
114
|
+
klass.define_singleton_method(:challenges) do
|
115
|
+
super() + [::Defi.send(method_name)]
|
116
|
+
end
|
117
|
+
|
118
|
+
def klass.initialize
|
119
|
+
if subject.raised?
|
120
|
+
subject
|
121
|
+
else
|
122
|
+
challenge = ::Defi.send(method_name, *args, **kwargs)
|
123
|
+
challenge.to(subject.call)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
klass.it(requirement)
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.challenges
|
131
|
+
[]
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.test(&subject)
|
135
|
+
Test.new(self).test(&subject)
|
136
|
+
end
|
137
|
+
|
138
|
+
private_class_method :challenges
|
139
|
+
|
140
|
+
private
|
141
|
+
|
142
|
+
attr_reader :subject
|
143
|
+
|
144
|
+
def initialize(&subject)
|
145
|
+
@subject = ::Defi::Value.new(&subject)
|
146
|
+
end
|
147
|
+
|
148
|
+
::Matchi::Matcher.constants.each do |matcher_const|
|
149
|
+
next if matcher_const.equal?(:Base)
|
150
|
+
|
151
|
+
matcher_klass = ::Matchi::Matcher.const_get(matcher_const)
|
152
|
+
|
153
|
+
define_singleton_method(matcher_klass.to_sym) do |*args|
|
154
|
+
matcher_klass.new(*args)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
::Spectus.methods(false).each do |method_name|
|
159
|
+
define_singleton_method(method_name.upcase) do |matcher|
|
160
|
+
::Spectus.public_send(method_name, matcher)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
data/lib/fix/test.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "expresenter/fail"
|
4
|
+
|
5
|
+
require_relative "console"
|
6
|
+
require_relative "doc"
|
7
|
+
|
8
|
+
module Fix
|
9
|
+
# Module for testing spec documents.
|
10
|
+
class Test
|
11
|
+
attr_reader :contexts
|
12
|
+
|
13
|
+
def initialize(*contexts)
|
14
|
+
@contexts = contexts
|
15
|
+
end
|
16
|
+
|
17
|
+
def test(&block)
|
18
|
+
requirements(&block)
|
19
|
+
exit(true)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def requirements(&block)
|
25
|
+
contexts.flat_map do |context|
|
26
|
+
sandbox = context.new
|
27
|
+
sandbox.public_methods(false).shuffle.map do |public_method|
|
28
|
+
definition = sandbox.public_send(public_method)
|
29
|
+
|
30
|
+
report = begin
|
31
|
+
definition.call do
|
32
|
+
front_object = instance_eval(&block)
|
33
|
+
|
34
|
+
context.send(:challenges).inject(front_object) do |object, challenge|
|
35
|
+
challenge.to(object).call
|
36
|
+
end
|
37
|
+
end
|
38
|
+
rescue ::Expresenter::Fail => e
|
39
|
+
e
|
40
|
+
end
|
41
|
+
|
42
|
+
if report.passed?
|
43
|
+
Console.passed_spec report
|
44
|
+
else
|
45
|
+
Console.failed_spec report
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/kernel.rb
CHANGED
@@ -1,9 +1,32 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative File.join("fix", "doc")
|
4
|
+
require_relative File.join("fix", "dsl")
|
5
|
+
require_relative File.join("fix", "test")
|
6
|
+
|
7
|
+
# The Kernel module.
|
3
8
|
module Kernel
|
9
|
+
# Specifications are built with this method.
|
10
|
+
#
|
11
|
+
# @example Fix 42 such as it must be equal to 42.
|
12
|
+
# Fix :Answer do
|
13
|
+
# it { MUST equal 42 }
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# @param name [String, Symbol] The name of the specification document.
|
17
|
+
# @param block [Proc] The specifications.
|
18
|
+
#
|
19
|
+
# @return [Class] The specification document.
|
20
|
+
#
|
4
21
|
# rubocop:disable Naming/MethodName
|
5
|
-
def Fix(
|
6
|
-
::
|
22
|
+
def Fix(name = nil, &block)
|
23
|
+
klass = ::Class.new(::Fix::Dsl)
|
24
|
+
klass.const_set(:CONTEXTS, [klass])
|
25
|
+
klass.instance_eval(&block)
|
26
|
+
|
27
|
+
::Fix::Doc.const_set(name, klass) unless name.nil?
|
28
|
+
|
29
|
+
::Fix::Test.new(*klass.const_get(:CONTEXTS))
|
7
30
|
end
|
8
31
|
# rubocop:enable Naming/MethodName
|
9
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyril Kato
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: defi
|
@@ -16,70 +16,84 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0.
|
19
|
+
version: 2.0.5
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.0.
|
26
|
+
version: 2.0.5
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: matchi
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.2.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.2.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: spectus
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - "~>"
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
47
|
+
version: 4.0.0
|
34
48
|
type: :runtime
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
52
|
- - "~>"
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
54
|
+
version: 4.0.0
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: bundler
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- - "
|
59
|
+
- - ">="
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- - "
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: rake
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - "
|
73
|
+
- - ">="
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
75
|
+
version: '0'
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - "
|
80
|
+
- - ">="
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name: rubocop
|
84
|
+
name: rubocop-md
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
|
-
- - "
|
87
|
+
- - ">="
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0
|
89
|
+
version: '0'
|
76
90
|
type: :development
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
|
-
- - "
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rubocop-performance
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,34 +108,76 @@ dependencies:
|
|
94
108
|
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop-thread_safety
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
97
153
|
- !ruby/object:Gem::Dependency
|
98
154
|
name: simplecov
|
99
155
|
requirement: !ruby/object:Gem::Requirement
|
100
156
|
requirements:
|
101
|
-
- - "
|
157
|
+
- - ">="
|
102
158
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0
|
159
|
+
version: '0'
|
104
160
|
type: :development
|
105
161
|
prerelease: false
|
106
162
|
version_requirements: !ruby/object:Gem::Requirement
|
107
163
|
requirements:
|
108
|
-
- - "
|
164
|
+
- - ">="
|
109
165
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0
|
166
|
+
version: '0'
|
111
167
|
- !ruby/object:Gem::Dependency
|
112
168
|
name: yard
|
113
169
|
requirement: !ruby/object:Gem::Requirement
|
114
170
|
requirements:
|
115
|
-
- - "
|
171
|
+
- - ">="
|
116
172
|
- !ruby/object:Gem::Version
|
117
|
-
version: '0
|
173
|
+
version: '0'
|
118
174
|
type: :development
|
119
175
|
prerelease: false
|
120
176
|
version_requirements: !ruby/object:Gem::Requirement
|
121
177
|
requirements:
|
122
|
-
- - "
|
178
|
+
- - ">="
|
123
179
|
- !ruby/object:Gem::Version
|
124
|
-
version: '0
|
180
|
+
version: '0'
|
125
181
|
description: Specing framework for Ruby.
|
126
182
|
email: contact@cyril.email
|
127
183
|
executables: []
|
@@ -131,16 +187,19 @@ files:
|
|
131
187
|
- LICENSE.md
|
132
188
|
- README.md
|
133
189
|
- lib/fix.rb
|
134
|
-
- lib/fix/
|
135
|
-
- lib/fix/
|
136
|
-
- lib/fix/
|
137
|
-
- lib/fix/
|
190
|
+
- lib/fix/console.rb
|
191
|
+
- lib/fix/doc.rb
|
192
|
+
- lib/fix/dsl.rb
|
193
|
+
- lib/fix/test.rb
|
138
194
|
- lib/kernel.rb
|
139
195
|
homepage: https://fixrb.dev/
|
140
196
|
licenses:
|
141
197
|
- MIT
|
142
198
|
metadata:
|
199
|
+
bug_tracker_uri: https://github.com/fixrb/fix/issues
|
200
|
+
documentation_uri: https://rubydoc.info/gems/r_spec-clone
|
143
201
|
source_code_uri: https://github.com/fixrb/fix
|
202
|
+
wiki_uri: https://github.com/fixrb/fix/wiki
|
144
203
|
post_install_message:
|
145
204
|
rdoc_options: []
|
146
205
|
require_paths:
|
@@ -149,14 +208,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
149
208
|
requirements:
|
150
209
|
- - ">="
|
151
210
|
- !ruby/object:Gem::Version
|
152
|
-
version: 2.
|
211
|
+
version: 2.7.0
|
153
212
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
213
|
requirements:
|
155
214
|
- - ">"
|
156
215
|
- !ruby/object:Gem::Version
|
157
216
|
version: 1.3.1
|
158
217
|
requirements: []
|
159
|
-
rubygems_version: 3.1.
|
218
|
+
rubygems_version: 3.1.6
|
160
219
|
signing_key:
|
161
220
|
specification_version: 4
|
162
221
|
summary: Specing framework for Ruby.
|
data/lib/fix/context.rb
DELETED
@@ -1,147 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'aw'
|
4
|
-
require 'defi'
|
5
|
-
|
6
|
-
module Fix
|
7
|
-
# Wraps the target of challenge.
|
8
|
-
class Context
|
9
|
-
RESERVED_KEYWORDS = %i[
|
10
|
-
alias
|
11
|
-
and
|
12
|
-
begin
|
13
|
-
break
|
14
|
-
case
|
15
|
-
catch
|
16
|
-
class
|
17
|
-
def
|
18
|
-
defined?
|
19
|
-
do
|
20
|
-
else
|
21
|
-
elsif
|
22
|
-
end
|
23
|
-
ensure
|
24
|
-
fail
|
25
|
-
false
|
26
|
-
for
|
27
|
-
if
|
28
|
-
in
|
29
|
-
module
|
30
|
-
next
|
31
|
-
nil
|
32
|
-
not
|
33
|
-
or
|
34
|
-
raise
|
35
|
-
redo
|
36
|
-
rescue
|
37
|
-
retry
|
38
|
-
return
|
39
|
-
self
|
40
|
-
super
|
41
|
-
then
|
42
|
-
throw
|
43
|
-
true
|
44
|
-
undef
|
45
|
-
unless
|
46
|
-
until
|
47
|
-
when
|
48
|
-
while
|
49
|
-
yield
|
50
|
-
].freeze
|
51
|
-
|
52
|
-
attr_reader :callable
|
53
|
-
|
54
|
-
def initialize(subject, challenge, before_hooks_counter = 0, *hooks, **lets)
|
55
|
-
@subject = subject
|
56
|
-
@callable = challenge.to(subject)
|
57
|
-
@before_hooks = hooks[0, before_hooks_counter]
|
58
|
-
@after_hooks = hooks[before_hooks_counter..-1]
|
59
|
-
@lets = lets
|
60
|
-
end
|
61
|
-
|
62
|
-
def before(&block)
|
63
|
-
@before_hooks << block
|
64
|
-
end
|
65
|
-
|
66
|
-
def after(&block)
|
67
|
-
@after_hooks << block
|
68
|
-
end
|
69
|
-
|
70
|
-
def let(name, &block)
|
71
|
-
raise ::TypeError, "expected a Symbol, got #{name.class}" unless name.is_a?(::Symbol)
|
72
|
-
raise ::NameError, "wrong method name `#{name}'" unless name.match(/\A[a-z][a-z0-9_]+[?!]?\z/)
|
73
|
-
raise ::NameError, "reserved keyword name `#{name}'" if RESERVED_KEYWORDS.include?(name)
|
74
|
-
raise ::NameError, "reserved method name `#{name}'" if respond_to?(name, true) && !@lets.key?(name)
|
75
|
-
|
76
|
-
@lets.update(name => block.call)
|
77
|
-
rescue ::SystemExit => e
|
78
|
-
raise SuspiciousSuccessError, "attempt `#{name}' to bypass the tests" if e.success?
|
79
|
-
raise e
|
80
|
-
end
|
81
|
-
|
82
|
-
def let!(name, &block)
|
83
|
-
raise ::TypeError, "expected a Symbol, got #{name.class}" unless name.is_a?(::Symbol)
|
84
|
-
raise ::NameError, "wrong method name `#{name}'" unless name.match(/\A[a-z][a-z0-9_]+[?!]?\z/)
|
85
|
-
raise ::NameError, "reserved keyword name `#{name}'" if RESERVED_KEYWORDS.include?(name)
|
86
|
-
raise ::NameError, "reserved method name `#{name}'" if respond_to?(name, true) && !@lets.key?(name)
|
87
|
-
|
88
|
-
@lets.update(name => ::Aw.fork! { block.call })
|
89
|
-
rescue ::SystemExit => e
|
90
|
-
raise SuspiciousSuccessError, "attempt `#{name}' to bypass the tests" if e.success?
|
91
|
-
raise e
|
92
|
-
end
|
93
|
-
|
94
|
-
# Verify the expectation.
|
95
|
-
#
|
96
|
-
# @param block [Proc] A spec to compare against the computed actual value.
|
97
|
-
#
|
98
|
-
# @return [::Spectus::Result::Pass, ::Spectus::Result::Fail] Pass or fail.
|
99
|
-
def it(_message = nil, &block)
|
100
|
-
print "#{block.source_location.join(':')}: "
|
101
|
-
i = It.new(callable, **@lets)
|
102
|
-
@before_hooks.each { |hook| i.instance_eval(&hook) }
|
103
|
-
result = i.instance_eval(&block)
|
104
|
-
puts result.colored_string
|
105
|
-
rescue ::Spectus::Result::Fail => result
|
106
|
-
abort result.colored_string
|
107
|
-
ensure
|
108
|
-
@after_hooks.each { |hook| i.instance_eval(&hook) }
|
109
|
-
raise ExpectationResultNotFoundError unless result.is_a?(::Spectus::Result::Common)
|
110
|
-
end
|
111
|
-
|
112
|
-
def on(name, *args, **options, &block)
|
113
|
-
if callable.raised?
|
114
|
-
actual = callable
|
115
|
-
challenge = ::Defi.send(:call)
|
116
|
-
else
|
117
|
-
actual = callable.object
|
118
|
-
challenge = ::Defi.send(name, *args, **options)
|
119
|
-
end
|
120
|
-
|
121
|
-
o = Context.new(actual, challenge, @before_hooks.length, *@before_hooks + @after_hooks, **@lets)
|
122
|
-
o.instance_eval(&block)
|
123
|
-
end
|
124
|
-
|
125
|
-
def with(_message = nil, **new_lets, &block)
|
126
|
-
actual = callable.object
|
127
|
-
challenge = ::Defi.send(:itself)
|
128
|
-
|
129
|
-
c = Context.new(actual, challenge, @before_hooks.length, *@before_hooks + @after_hooks, **@lets.merge(new_lets))
|
130
|
-
c.instance_eval(&block)
|
131
|
-
end
|
132
|
-
|
133
|
-
private
|
134
|
-
|
135
|
-
def method_missing(name, *args, &block)
|
136
|
-
@lets.fetch(name) { super }
|
137
|
-
end
|
138
|
-
|
139
|
-
def respond_to_missing?(name, include_private = false)
|
140
|
-
@lets.key?(name) || super
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
require_relative 'it'
|
146
|
-
require_relative 'expectation_result_not_found_error'
|
147
|
-
require_relative 'suspicious_success_error'
|
data/lib/fix/it.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spectus/expectation_target'
|
4
|
-
require 'matchi/helper'
|
5
|
-
|
6
|
-
module Fix
|
7
|
-
# Wraps the target of an expectation.
|
8
|
-
class It < ::Spectus::ExpectationTarget
|
9
|
-
include ::Matchi::Helper
|
10
|
-
|
11
|
-
# Create a new expection target
|
12
|
-
#
|
13
|
-
# @param callable [#call] The object to test.
|
14
|
-
def initialize(callable, **lets)
|
15
|
-
raise unless callable.respond_to?(:call)
|
16
|
-
|
17
|
-
@callable = callable
|
18
|
-
@lets = lets
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def method_missing(name, *args, &block)
|
24
|
-
@lets.fetch(name) { super }
|
25
|
-
end
|
26
|
-
|
27
|
-
def respond_to_missing?(name, include_private = false)
|
28
|
-
@lets.key?(name) || super
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|