fix 0.18.2 → 0.20
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 +2 -2
- data/README.md +384 -84
- data/lib/fix/builder.rb +101 -0
- data/lib/fix/doc.rb +59 -0
- data/lib/fix/dsl.rb +139 -0
- data/lib/fix/error/invalid_specification_name.rb +12 -0
- data/lib/fix/error/missing_specification_block.rb +14 -0
- data/lib/fix/error/missing_subject_block.rb +15 -0
- data/lib/fix/error/specification_not_found.rb +12 -0
- data/lib/fix/matcher.rb +76 -0
- data/lib/fix/requirement.rb +119 -0
- data/lib/fix/run.rb +88 -0
- data/lib/fix/set.rb +210 -0
- data/lib/fix.rb +85 -20
- data/lib/kernel.rb +49 -0
- metadata +42 -153
- data/.gitignore +0 -11
- data/.rubocop.yml +0 -1
- data/.rubocop_todo.yml +0 -25
- data/.travis.yml +0 -28
- data/.yardopts +0 -1
- data/CODE_OF_CONDUCT.md +0 -13
- data/Gemfile +0 -5
- data/Rakefile +0 -23
- data/VERSION.semver +0 -1
- data/bin/console +0 -8
- data/bin/setup +0 -6
- data/checksum/fix-0.0.1.pre.gem.sha512 +0 -1
- data/checksum/fix-0.1.0.gem.sha512 +0 -1
- data/checksum/fix-0.1.0.pre.gem.sha512 +0 -1
- data/checksum/fix-0.10.0.gem.sha512 +0 -1
- data/checksum/fix-0.11.0.gem.sha512 +0 -1
- data/checksum/fix-0.11.1.gem.sha512 +0 -1
- data/checksum/fix-0.12.0.gem.sha512 +0 -1
- data/checksum/fix-0.12.1.gem.sha512 +0 -1
- data/checksum/fix-0.12.2.gem.sha512 +0 -1
- data/checksum/fix-0.12.3.gem.sha512 +0 -1
- data/checksum/fix-0.13.0.gem.sha512 +0 -1
- data/checksum/fix-0.14.0.gem.sha512 +0 -1
- data/checksum/fix-0.14.1.gem.sha512 +0 -1
- data/checksum/fix-0.15.0.gem.sha512 +0 -1
- data/checksum/fix-0.15.2.gem.sha512 +0 -1
- data/checksum/fix-0.16.0.gem.sha512 +0 -1
- data/checksum/fix-0.17.0.gem.sha512 +0 -1
- data/checksum/fix-0.17.1.gem.sha512 +0 -1
- data/checksum/fix-0.17.2.gem.sha512 +0 -1
- data/checksum/fix-0.18.0.gem.sha512 +0 -1
- data/checksum/fix-0.18.1.gem.sha512 +0 -1
- data/checksum/fix-0.2.0.gem.sha512 +0 -1
- data/checksum/fix-0.3.0.gem.sha512 +0 -1
- data/checksum/fix-0.4.0.gem.sha512 +0 -1
- data/checksum/fix-0.5.0.gem.sha512 +0 -1
- data/checksum/fix-0.6.0.gem.sha512 +0 -1
- data/checksum/fix-0.6.1.gem.sha512 +0 -1
- data/checksum/fix-0.7.0.gem.sha512 +0 -1
- data/checksum/fix-0.8.0.gem.sha512 +0 -1
- data/checksum/fix-0.9.0.gem.sha512 +0 -1
- data/checksum/fix-0.9.1.gem.sha512 +0 -1
- data/fix.gemspec +0 -29
- data/lib/fix/it.rb +0 -41
- data/lib/fix/on.rb +0 -139
- data/lib/fix/report.rb +0 -120
- data/lib/fix/test.rb +0 -89
- data/pkg_checksum +0 -12
data/lib/fix/set.rb
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "doc"
|
4
|
+
require_relative "run"
|
5
|
+
require_relative "error/missing_subject_block"
|
6
|
+
|
7
|
+
module Fix
|
8
|
+
# Collection of specifications that can be executed as a test suite.
|
9
|
+
#
|
10
|
+
# The Set class is a central component in Fix's architecture that handles:
|
11
|
+
# - Loading and organizing test specifications
|
12
|
+
# - Managing test execution and isolation
|
13
|
+
# - Reporting test results
|
14
|
+
# - Handling process management for test isolation
|
15
|
+
#
|
16
|
+
# It supports both named specifications (loaded via Fix[name]) and anonymous
|
17
|
+
# specifications (created directly via Fix blocks).
|
18
|
+
#
|
19
|
+
# @example Running a simple named specification
|
20
|
+
# Fix[:Calculator].test { Calculator.new }
|
21
|
+
#
|
22
|
+
# @example Running a complex specification with multiple contexts
|
23
|
+
# Fix[:UserSystem] do
|
24
|
+
# with(role: "admin") do
|
25
|
+
# on :access?, :settings do
|
26
|
+
# it MUST be_true
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# with(role: "guest") do
|
31
|
+
# on :access?, :settings do
|
32
|
+
# it MUST be_false
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
# end.test { UserSystem.new(role:) }
|
36
|
+
#
|
37
|
+
# @example Using match? for conditional testing
|
38
|
+
# if Fix[:EmailValidator].match? { email }
|
39
|
+
# puts "Email is valid"
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# @api private
|
43
|
+
class Set
|
44
|
+
# List of specifications to be tested.
|
45
|
+
# Each specification is an array containing:
|
46
|
+
# - The test environment
|
47
|
+
# - The source location (file:line)
|
48
|
+
# - The requirement (MUST, SHOULD, or MAY)
|
49
|
+
# - The challenges to apply
|
50
|
+
#
|
51
|
+
# @return [Array] List of specifications
|
52
|
+
attr_reader :expected
|
53
|
+
|
54
|
+
class << self
|
55
|
+
# Loads specifications from a registered constant name.
|
56
|
+
#
|
57
|
+
# This method retrieves previously registered specifications and creates
|
58
|
+
# a new Set instance ready for testing. It's typically used in conjunction
|
59
|
+
# with Fix[name] syntax.
|
60
|
+
#
|
61
|
+
# @param name [String, Symbol] The constant name of the specifications
|
62
|
+
# @return [Set] A new Set instance containing the loaded specifications
|
63
|
+
# @raise [Fix::Error::SpecificationNotFound] If specification doesn't exist
|
64
|
+
#
|
65
|
+
# @example Loading a named specification
|
66
|
+
# Fix::Set.load(:Calculator)
|
67
|
+
#
|
68
|
+
# @example Loading and testing in one go
|
69
|
+
# Fix::Set.load(:EmailValidator).test { email }
|
70
|
+
#
|
71
|
+
# @api public
|
72
|
+
def load(name)
|
73
|
+
new(*Doc.fetch(name))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Initialize a new Set with the given contexts.
|
78
|
+
#
|
79
|
+
# @param contexts [Array<Fix::Dsl>] List of specification contexts
|
80
|
+
#
|
81
|
+
# @example Creating a set with a single context
|
82
|
+
# Fix::Set.new(calculator_context)
|
83
|
+
#
|
84
|
+
# @example Creating a set with multiple contexts
|
85
|
+
# Fix::Set.new(base_context, admin_context, guest_context)
|
86
|
+
def initialize(*contexts)
|
87
|
+
@expected = randomize_specs(Doc.extract_specifications(*contexts))
|
88
|
+
end
|
89
|
+
|
90
|
+
# Checks if the subject matches all specifications without exiting.
|
91
|
+
#
|
92
|
+
# Unlike #test, this method:
|
93
|
+
# - Returns a boolean instead of exiting
|
94
|
+
# - Can be used in conditional logic
|
95
|
+
#
|
96
|
+
# @yield The block of code to be tested
|
97
|
+
# @yieldreturn [Object] The result of the code being tested
|
98
|
+
# @return [Boolean] true if all tests pass, false otherwise
|
99
|
+
#
|
100
|
+
# @example Basic usage
|
101
|
+
# set.match? { Calculator.new } #=> true
|
102
|
+
#
|
103
|
+
# @example Conditional usage
|
104
|
+
# if set.match? { user_input }
|
105
|
+
# save_to_database(user_input)
|
106
|
+
# end
|
107
|
+
#
|
108
|
+
# @api public
|
109
|
+
def match?(&subject)
|
110
|
+
raise Error::MissingSubjectBlock unless subject
|
111
|
+
|
112
|
+
expected.all? { |spec| run_spec(*spec, &subject) }
|
113
|
+
end
|
114
|
+
|
115
|
+
# Runs the test suite against the provided subject.
|
116
|
+
#
|
117
|
+
# This method:
|
118
|
+
# - Executes all specifications in random order
|
119
|
+
# - Runs each test in isolation using process forking
|
120
|
+
# - Reports results for each specification
|
121
|
+
# - Exits with failure if any test fails
|
122
|
+
#
|
123
|
+
# @yield The block of code to be tested
|
124
|
+
# @yieldreturn [Object] The result of the code being tested
|
125
|
+
# @return [Boolean] true if all tests pass
|
126
|
+
# @raise [SystemExit] When any test fails (exit code: 1)
|
127
|
+
#
|
128
|
+
# @example Basic usage
|
129
|
+
# set.test { Calculator.new }
|
130
|
+
#
|
131
|
+
# @example Testing with parameters
|
132
|
+
# set.test { Game.new(south_variant:, north_variant:) }
|
133
|
+
#
|
134
|
+
# @api public
|
135
|
+
def test(&subject)
|
136
|
+
match?(&subject) || exit_with_failure
|
137
|
+
end
|
138
|
+
|
139
|
+
# Returns a string representing the matcher.
|
140
|
+
#
|
141
|
+
# @return [String] a human-readable description of the matcher
|
142
|
+
#
|
143
|
+
# @api public
|
144
|
+
def to_s
|
145
|
+
"fix #{expected.inspect}"
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
# Randomizes the order of specifications for better isolation
|
151
|
+
#
|
152
|
+
# @param specifications [Array] The specifications to randomize
|
153
|
+
# @return [Array] Randomized specifications
|
154
|
+
def randomize_specs(specifications)
|
155
|
+
specifications.shuffle
|
156
|
+
end
|
157
|
+
|
158
|
+
# Runs a single specification in a forked process
|
159
|
+
#
|
160
|
+
# @param env [Fix::Dsl] The test environment
|
161
|
+
# @param location [String] The source location of the spec
|
162
|
+
# @param requirement [Object] The test requirement
|
163
|
+
# @param challenges [Array] The test challenges
|
164
|
+
# @yield The subject block to test against
|
165
|
+
# @return [Boolean] true if spec passed
|
166
|
+
def run_spec(env, location, requirement, challenges, &subject)
|
167
|
+
child_pid = ::Process.fork { execute_spec(env, location, requirement, challenges, &subject) }
|
168
|
+
_pid, process_status = ::Process.wait2(child_pid)
|
169
|
+
process_status.success?
|
170
|
+
end
|
171
|
+
|
172
|
+
# Executes a specification in its own process
|
173
|
+
#
|
174
|
+
# @param env [Fix::Dsl] The test environment
|
175
|
+
# @param location [String] The source location of the spec
|
176
|
+
# @param requirement [Object] The test requirement
|
177
|
+
# @param challenges [Array] The test challenges
|
178
|
+
# @yield The subject block to test against
|
179
|
+
def execute_spec(env, location, requirement, challenges, &subject)
|
180
|
+
result = Run.new(env, requirement, *challenges).test(&subject)
|
181
|
+
report_result(location, result)
|
182
|
+
exit_with_status(result.passed?)
|
183
|
+
end
|
184
|
+
|
185
|
+
# Reports the result of a specification
|
186
|
+
#
|
187
|
+
# @param location [String] The source location of the spec
|
188
|
+
# @param result [Object] The test result
|
189
|
+
def report_result(location, result)
|
190
|
+
puts "#{location} #{result.colored_string}"
|
191
|
+
end
|
192
|
+
|
193
|
+
# Exits the process with a failure status
|
194
|
+
#
|
195
|
+
# @return [void]
|
196
|
+
# @raise [SystemExit] Always
|
197
|
+
def exit_with_failure
|
198
|
+
::Kernel.exit(false)
|
199
|
+
end
|
200
|
+
|
201
|
+
# Exits the process with the given status
|
202
|
+
#
|
203
|
+
# @param status [Boolean] The exit status
|
204
|
+
# @return [void]
|
205
|
+
# @raise [SystemExit] Always
|
206
|
+
def exit_with_status(status)
|
207
|
+
::Kernel.exit(status)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
data/lib/fix.rb
CHANGED
@@ -1,28 +1,93 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "fix/doc"
|
4
|
+
require_relative "fix/error/specification_not_found"
|
5
|
+
require_relative "fix/set"
|
6
|
+
require_relative "kernel"
|
7
|
+
|
3
8
|
# Namespace for the Fix framework.
|
4
9
|
#
|
5
|
-
#
|
10
|
+
# Provides core functionality for managing and running test specifications.
|
11
|
+
# Fix supports two modes of operation:
|
12
|
+
# 1. Named specifications that can be referenced later
|
13
|
+
# 2. Anonymous specifications for immediate testing
|
14
|
+
#
|
15
|
+
# @example Creating and running a named specification
|
16
|
+
# Fix :Answer do
|
17
|
+
# it MUST equal 42
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# Fix[:Answer].test { 42 }
|
6
21
|
#
|
22
|
+
# @example Creating and running an anonymous specification
|
23
|
+
# Fix do
|
24
|
+
# it MUST be_positive
|
25
|
+
# end.test { 42 }
|
26
|
+
#
|
27
|
+
# @see Fix::Set
|
28
|
+
# @see Fix::Builder
|
29
|
+
#
|
30
|
+
# @api public
|
7
31
|
module Fix
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
32
|
+
class << self
|
33
|
+
# Retrieves and loads a built specification for testing.
|
34
|
+
#
|
35
|
+
# @example Run a named specification
|
36
|
+
# Fix[:Answer].test { 42 }
|
37
|
+
#
|
38
|
+
# @param name [String, Symbol] The constant name of the specification
|
39
|
+
# @return [Fix::Set] The loaded specification set ready for testing
|
40
|
+
# @raise [Fix::Error::SpecificationNotFound] If the named specification doesn't exist
|
41
|
+
def [](name)
|
42
|
+
name = normalize_name(name)
|
43
|
+
validate_specification_exists!(name)
|
44
|
+
Set.load(name)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Lists all defined specification names.
|
48
|
+
#
|
49
|
+
# @example Get all specification names
|
50
|
+
# Fix.specification_names #=> [:Answer, :Calculator, :UserProfile]
|
51
|
+
#
|
52
|
+
# @return [Array<Symbol>] Sorted array of specification names
|
53
|
+
def specification_names
|
54
|
+
Doc.constants.sort
|
55
|
+
end
|
56
|
+
|
57
|
+
# Checks if a specification is defined.
|
58
|
+
#
|
59
|
+
# @example Check for specification existence
|
60
|
+
# Fix.spec_defined?(:Answer) #=> true
|
61
|
+
#
|
62
|
+
# @param name [String, Symbol] Name of the specification to check
|
63
|
+
# @return [Boolean] true if specification exists, false otherwise
|
64
|
+
def spec_defined?(name)
|
65
|
+
specification_names.include?(normalize_name(name))
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# Converts any specification name into a symbol.
|
71
|
+
# This allows for consistent name handling regardless of input type.
|
72
|
+
#
|
73
|
+
# @param name [String, Symbol] The name to normalize
|
74
|
+
# @return [Symbol] The normalized name
|
75
|
+
# @example
|
76
|
+
# normalize_name("Answer") #=> :Answer
|
77
|
+
# normalize_name(:Answer) #=> :Answer
|
78
|
+
def normalize_name(name)
|
79
|
+
String(name).to_sym
|
80
|
+
end
|
81
|
+
|
82
|
+
# Verifies the existence of a specification and raises an error if not found.
|
83
|
+
# This ensures early failure when attempting to use undefined specifications.
|
84
|
+
#
|
85
|
+
# @param name [Symbol] The specification name to validate
|
86
|
+
# @raise [Fix::Error::SpecificationNotFound] If specification doesn't exist
|
87
|
+
def validate_specification_exists!(name)
|
88
|
+
return if spec_defined?(name)
|
89
|
+
|
90
|
+
raise Error::SpecificationNotFound, name
|
91
|
+
end
|
25
92
|
end
|
26
93
|
end
|
27
|
-
|
28
|
-
require_relative File.join('fix', 'test')
|
data/lib/kernel.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "fix/builder"
|
4
|
+
|
5
|
+
# Extension of the global Kernel module to provide the Fix method.
|
6
|
+
# This allows Fix to be called from anywhere in the application
|
7
|
+
# without explicit namespace qualification.
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
module Kernel
|
11
|
+
# rubocop:disable Naming/MethodName
|
12
|
+
|
13
|
+
# This rule is disabled because Fix is intentionally capitalized to act as
|
14
|
+
# both a namespace and a method name, following Ruby conventions for DSLs.
|
15
|
+
|
16
|
+
# Defines a new test specification or creates an anonymous specification set.
|
17
|
+
# When a name is provided, the specification is registered globally and can
|
18
|
+
# be referenced later using Fix[name]. Anonymous specifications are executed
|
19
|
+
# immediately and cannot be referenced later.
|
20
|
+
#
|
21
|
+
# @example Creating a named specification for later use
|
22
|
+
# Fix :Calculator do
|
23
|
+
# on(:add, 2, 3) do
|
24
|
+
# it MUST equal 5
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# # Later in the code:
|
29
|
+
# Fix[:Calculator].test { Calculator.new }
|
30
|
+
#
|
31
|
+
# @example Creating and immediately testing an anonymous specification
|
32
|
+
# Fix do
|
33
|
+
# it MUST be_positive
|
34
|
+
# end.test { 42 }
|
35
|
+
#
|
36
|
+
# @param name [String, Symbol, nil] The constant name for the specification
|
37
|
+
# @yield The specification definition block
|
38
|
+
# @yieldreturn [void]
|
39
|
+
# @return [Fix::Set] A collection of specifications ready for testing
|
40
|
+
#
|
41
|
+
# @see Fix::Builder
|
42
|
+
# @see Fix::Set
|
43
|
+
# @see Fix::Dsl
|
44
|
+
def Fix(name = nil, &)
|
45
|
+
::Fix::Builder.build(name, &)
|
46
|
+
end
|
47
|
+
|
48
|
+
# rubocop:enable Naming/MethodName
|
49
|
+
end
|
metadata
CHANGED
@@ -1,204 +1,93 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.20'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyril Kato
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: defi
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1
|
19
|
+
version: 3.0.1
|
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: 0.1
|
26
|
+
version: 3.0.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: matchi
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.1
|
33
|
+
version: 4.1.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.1
|
40
|
+
version: 4.1.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: spectus
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.0.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
version: '2.0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '2.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '13.0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '13.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: rubocop
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0.75'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0.75'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: rubocop-performance
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '1.5'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '1.5'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: simplecov
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0.17'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0.17'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: yard
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - "~>"
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0.9'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - "~>"
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0.9'
|
139
|
-
description: Specing framework for Ruby.
|
140
|
-
email:
|
141
|
-
- contact@cyril.email
|
54
|
+
version: 5.0.2
|
55
|
+
description: |
|
56
|
+
Fix is a modern Ruby testing framework built around a key architectural principle:
|
57
|
+
the complete separation between specifications and tests. It allows you to write
|
58
|
+
pure specification documents that define expected behaviors, and then independently
|
59
|
+
challenge any implementation against these specifications.
|
60
|
+
email: contact@cyril.email
|
142
61
|
executables: []
|
143
62
|
extensions: []
|
144
63
|
extra_rdoc_files: []
|
145
64
|
files:
|
146
|
-
- ".gitignore"
|
147
|
-
- ".rubocop.yml"
|
148
|
-
- ".rubocop_todo.yml"
|
149
|
-
- ".travis.yml"
|
150
|
-
- ".yardopts"
|
151
|
-
- CODE_OF_CONDUCT.md
|
152
|
-
- Gemfile
|
153
65
|
- LICENSE.md
|
154
66
|
- README.md
|
155
|
-
- Rakefile
|
156
|
-
- VERSION.semver
|
157
|
-
- bin/console
|
158
|
-
- bin/setup
|
159
|
-
- checksum/fix-0.0.1.pre.gem.sha512
|
160
|
-
- checksum/fix-0.1.0.gem.sha512
|
161
|
-
- checksum/fix-0.1.0.pre.gem.sha512
|
162
|
-
- checksum/fix-0.10.0.gem.sha512
|
163
|
-
- checksum/fix-0.11.0.gem.sha512
|
164
|
-
- checksum/fix-0.11.1.gem.sha512
|
165
|
-
- checksum/fix-0.12.0.gem.sha512
|
166
|
-
- checksum/fix-0.12.1.gem.sha512
|
167
|
-
- checksum/fix-0.12.2.gem.sha512
|
168
|
-
- checksum/fix-0.12.3.gem.sha512
|
169
|
-
- checksum/fix-0.13.0.gem.sha512
|
170
|
-
- checksum/fix-0.14.0.gem.sha512
|
171
|
-
- checksum/fix-0.14.1.gem.sha512
|
172
|
-
- checksum/fix-0.15.0.gem.sha512
|
173
|
-
- checksum/fix-0.15.2.gem.sha512
|
174
|
-
- checksum/fix-0.16.0.gem.sha512
|
175
|
-
- checksum/fix-0.17.0.gem.sha512
|
176
|
-
- checksum/fix-0.17.1.gem.sha512
|
177
|
-
- checksum/fix-0.17.2.gem.sha512
|
178
|
-
- checksum/fix-0.18.0.gem.sha512
|
179
|
-
- checksum/fix-0.18.1.gem.sha512
|
180
|
-
- checksum/fix-0.2.0.gem.sha512
|
181
|
-
- checksum/fix-0.3.0.gem.sha512
|
182
|
-
- checksum/fix-0.4.0.gem.sha512
|
183
|
-
- checksum/fix-0.5.0.gem.sha512
|
184
|
-
- checksum/fix-0.6.0.gem.sha512
|
185
|
-
- checksum/fix-0.6.1.gem.sha512
|
186
|
-
- checksum/fix-0.7.0.gem.sha512
|
187
|
-
- checksum/fix-0.8.0.gem.sha512
|
188
|
-
- checksum/fix-0.9.0.gem.sha512
|
189
|
-
- checksum/fix-0.9.1.gem.sha512
|
190
|
-
- fix.gemspec
|
191
67
|
- lib/fix.rb
|
192
|
-
- lib/fix/
|
193
|
-
- lib/fix/
|
194
|
-
- lib/fix/
|
195
|
-
- lib/fix/
|
196
|
-
-
|
197
|
-
|
68
|
+
- lib/fix/builder.rb
|
69
|
+
- lib/fix/doc.rb
|
70
|
+
- lib/fix/dsl.rb
|
71
|
+
- lib/fix/error/invalid_specification_name.rb
|
72
|
+
- lib/fix/error/missing_specification_block.rb
|
73
|
+
- lib/fix/error/missing_subject_block.rb
|
74
|
+
- lib/fix/error/specification_not_found.rb
|
75
|
+
- lib/fix/matcher.rb
|
76
|
+
- lib/fix/requirement.rb
|
77
|
+
- lib/fix/run.rb
|
78
|
+
- lib/fix/set.rb
|
79
|
+
- lib/kernel.rb
|
80
|
+
homepage: https://fixrb.dev/
|
198
81
|
licenses:
|
199
82
|
- MIT
|
200
|
-
metadata:
|
201
|
-
|
83
|
+
metadata:
|
84
|
+
bug_tracker_uri: https://github.com/fixrb/fix/issues
|
85
|
+
changelog_uri: https://github.com/fixrb/fix/blob/main/CHANGELOG.md
|
86
|
+
documentation_uri: https://rubydoc.info/gems/fix
|
87
|
+
homepage_uri: https://fixrb.dev
|
88
|
+
source_code_uri: https://github.com/fixrb/fix
|
89
|
+
rubygems_mfa_required: 'true'
|
90
|
+
post_install_message:
|
202
91
|
rdoc_options: []
|
203
92
|
require_paths:
|
204
93
|
- lib
|
@@ -206,15 +95,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
206
95
|
requirements:
|
207
96
|
- - ">="
|
208
97
|
- !ruby/object:Gem::Version
|
209
|
-
version:
|
98
|
+
version: 3.1.0
|
210
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
211
100
|
requirements:
|
212
101
|
- - ">="
|
213
102
|
- !ruby/object:Gem::Version
|
214
103
|
version: '0'
|
215
104
|
requirements: []
|
216
|
-
rubygems_version: 3.
|
217
|
-
signing_key:
|
105
|
+
rubygems_version: 3.3.27
|
106
|
+
signing_key:
|
218
107
|
specification_version: 4
|
219
|
-
summary:
|
108
|
+
summary: Happy Path to Ruby Testing
|
220
109
|
test_files: []
|
data/.gitignore
DELETED
data/.rubocop.yml
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
# This configuration was generated by
|
2
|
-
# `rubocop --auto-gen-config`
|
3
|
-
# on 2019-10-09 00:10:57 +0200 using RuboCop version 0.75.0.
|
4
|
-
# The point is for the user to remove these configuration records
|
5
|
-
# one by one as the offenses are removed from the code base.
|
6
|
-
# Note that changes in the inspected code, or installation of new
|
7
|
-
# versions of RuboCop, may require this file to be generated again.
|
8
|
-
|
9
|
-
# Offense count: 14
|
10
|
-
Style/MixinUsage:
|
11
|
-
Exclude:
|
12
|
-
- 'test/examples/duck/test_app.rb'
|
13
|
-
- 'test/examples/empty/test_app.rb'
|
14
|
-
- 'test/examples/isolation/test_app_with_isolation_1.rb'
|
15
|
-
- 'test/examples/isolation/test_app_with_isolation_2.rb'
|
16
|
-
- 'test/examples/isolation/test_app_with_isolation_3.rb'
|
17
|
-
- 'test/examples/isolation/test_app_with_isolation_4.rb'
|
18
|
-
- 'test/examples/isolation/test_app_with_isolation_5.rb'
|
19
|
-
- 'test/examples/isolation/test_app_without_isolation_1.rb'
|
20
|
-
- 'test/examples/isolation/test_app_without_isolation_2.rb'
|
21
|
-
- 'test/examples/isolation/test_app_without_isolation_3.rb'
|
22
|
-
- 'test/examples/let/test_let.rb'
|
23
|
-
- 'test/examples/operation/test_app_1.rb'
|
24
|
-
- 'test/examples/operation/test_app_2.rb'
|
25
|
-
- 'test/test_exit_status.rb'
|