matchi-fix 2.1.1 → 3.0.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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.md +1 -1
  3. data/README.md +45 -27
  4. data/lib/matchi/fix.rb +97 -59
  5. metadata +26 -128
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 40d7531073da5b8a4303fc9c3cae6b9caae05084ab3d9522a8e1f5c5e7f1fe18
4
- data.tar.gz: 6886e9b0c8339f4270522436eab1ed9df61a8ad98eea7486733afe4c113d849e
3
+ metadata.gz: 3b42bc77b68d62f4c3bed7bf25c7a78dbc48968db05bcdfb234f96ec0e903310
4
+ data.tar.gz: f508566e09920d7a88aabc3588350a4679eac62f4e605c35c00db29334fa63bb
5
5
  SHA512:
6
- metadata.gz: 6c884e1a53abe424c671cc9a2b9f66584422a045ae92c72009431c41c15bf7e970806ea09e6cbff6e447f362fd24e830bdac58a755d30700809d701d649dfe04
7
- data.tar.gz: 6d053108ce76597356f41122a4718432cb78bd508c728ebdfa6f002382ae65f6cab6fbb6f87a8ecc783d821fdce6bc5a44e5ee2fb3a4d80c5667a47493b8b010
6
+ metadata.gz: b019c450b570dd51b99e0202b3d44a26943f743e0c676fc044a7125cfbc68a1c43b23d540971dec16456d2acf05b0685c9c0e1186f8a455a5e31fa05e34647e4
7
+ data.tar.gz: 7b0dcaaa92f49aff5eba4604b112b57c18fe038098d477dbac459b4065c1a400f758f18d2e5078d70aef2d464558ec80a7d0f18c926533e6d9b82f6fef15744b
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2021 Cyril Kato
3
+ Copyright (c) 2015-2025 Cyril Kato
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -2,11 +2,9 @@
2
2
 
3
3
  [![Version](https://img.shields.io/github/v/tag/fixrb/matchi-fix?label=Version&logo=github)](https://github.com/fixrb/matchi-fix/releases)
4
4
  [![Yard documentation](https://img.shields.io/badge/Yard-documentation-blue.svg?logo=github)](https://rubydoc.info/github/fixrb/matchi-fix/main)
5
- [![CI](https://github.com/fixrb/matchi-fix/workflows/CI/badge.svg?branch=main)](https://github.com/fixrb/matchi-fix/actions?query=workflow%3Aci+branch%3Amain)
6
- [![RuboCop](https://github.com/fixrb/matchi-fix/workflows/RuboCop/badge.svg?branch=main)](https://github.com/fixrb/matchi-fix/actions?query=workflow%3Arubocop+branch%3Amain)
7
5
  [![License](https://img.shields.io/github/license/fixrb/matchi-fix?label=License&logo=github)](https://github.com/fixrb/matchi-fix/raw/main/LICENSE.md)
8
6
 
9
- > A [Fix](https://github.com/fixrb/fix) specifications matcher compatible with [Matchi](https://github.com/fixrb/matchi).
7
+ [Matchi](https://github.com/fixrb/matchi)-compatible matcher for testing implementations against [Fix](https://github.com/fixrb/fix) specifications.
10
8
 
11
9
  ## Installation
12
10
 
@@ -18,16 +16,24 @@ gem "matchi-fix"
18
16
 
19
17
  And then execute:
20
18
 
21
- ```sh
22
- bundle
19
+ ```shell
20
+ bundle install
23
21
  ```
24
22
 
25
- Or install it yourself as:
23
+ Or install it yourself:
26
24
 
27
- ```sh
25
+ ```shell
28
26
  gem install matchi-fix
29
27
  ```
30
28
 
29
+ ## Description
30
+
31
+ A Matchi-compatible matcher that allows testing objects against Fix specifications.
32
+ Enables verification of implementation conformance to Fix test specifications
33
+ across different testing frameworks like Minitest and RSpec. Integrates seamlessly
34
+ with the Fix testing framework's powerful specification system while maintaining
35
+ Matchi's clean matcher interface.
36
+
31
37
  ## Usage
32
38
 
33
39
  To make __Matchi::Fix__ available:
@@ -36,30 +42,47 @@ To make __Matchi::Fix__ available:
36
42
  require "matchi/fix"
37
43
  ```
38
44
 
39
- All examples here assume that this has been done.
45
+ The Fix matcher allows testing values against Fix specifications. After requiring `matchi-fix`, you can use the `Fix` matcher in your tests through anonymous specification:
46
+
47
+ ```ruby
48
+ Matchi::Fix.new { it MUST be 42 }.match? { 42 } # => true
49
+ ```
40
50
 
41
- ### With a block of specifications
51
+ or through registered specification by name:
42
52
 
43
53
  ```ruby
44
- matcher = Matchi::Fix.new { it MUST be 42 }
54
+ # First, define a Fix specification
55
+ Fix :Calculator do
56
+ on(:add, 2, 3) do
57
+ it MUST eq 5
58
+ end
59
+
60
+ on(:multiply, 2, 3) do
61
+ it MUST eq 6
62
+ end
63
+ end
64
+
65
+ # Then use the matcher to test implementations
66
+ calculator = MyCalculator.new
45
67
 
46
- matcher.expected # => #<Fix::Set:0x00007fd96915dc28 ...>
47
- matcher.matches? { 42 } # => true
68
+ # Using direct matcher syntax
69
+ Matchi::Fix.new(:Calculator).matches?(calculator) #=> true/false
48
70
  ```
49
71
 
50
- ### With the constant name of the specifications
72
+ ### Error Handling
51
73
 
52
- If specifications have been defined and named, they can be mentioned:
74
+ On missing specifications:
53
75
 
54
76
  ```ruby
55
- Fix :Answer do
56
- it MUST be 42
57
- end
77
+ Matchi::Fix.new(:NonExistent)
78
+ # => KeyError
79
+ ```
58
80
 
59
- matcher = Matchi::Fix.new(:Answer)
81
+ On passing both specification name and specification code:
60
82
 
61
- matcher.expected # => #<Fix::Set:0x00007fd96915dc28 ...>
62
- matcher.matches? { 42 } # => true
83
+ ```ruby
84
+ Matchi::Fix.new(:SpecName) { "Spec block" }
85
+ # => ArgumentError
63
86
  ```
64
87
 
65
88
  ## Contact
@@ -74,11 +97,6 @@ __Matchi::Fix__ follows [Semantic Versioning 2.0](https://semver.org/).
74
97
 
75
98
  The [gem](https://rubygems.org/gems/matchi-fix) is available as open source under the terms of the [MIT License](https://github.com/fixrb/matchi-fix/raw/main/LICENSE.md).
76
99
 
77
- ***
100
+ ## Sponsors
78
101
 
79
- <p>
80
- This project is sponsored by:<br />
81
- <a href="https://sashite.com/"><img
82
- src="https://github.com/fixrb/matchi-fix/raw/main/img/sashite.png"
83
- alt="Sashite" /></a>
84
- </p>
102
+ This project is sponsored by [Sashité](https://sashite.com/)
data/lib/matchi/fix.rb CHANGED
@@ -2,89 +2,127 @@
2
2
 
3
3
  require "fix"
4
4
 
5
- # Namespace for the Matchi library.
6
5
  module Matchi
7
- # **Fix** matcher.
6
+ # Specification conformance matcher that verifies objects against Fix test specifications.
7
+ #
8
+ # This matcher allows testing objects against Fix specifications, enabling verification
9
+ # of implementation conformance across different testing frameworks. It supports both
10
+ # anonymous specifications defined inline and named specifications registered with Fix.
11
+ # The matcher provides a bridge between Matchi's matcher interface and Fix's powerful
12
+ # specification system.
13
+ #
14
+ # @example Basic usage with anonymous specification
15
+ # matcher = Matchi::Fix.new { it MUST be 42 }
16
+ # matcher.match? { 42 } # => true
17
+ # matcher.match? { 41 } # => false
18
+ #
19
+ # @example Using named specifications
20
+ # # Define a Fix specification
21
+ # Fix :Calculator do
22
+ # on(:add, 2, 3) do
23
+ # it MUST eq 5
24
+ # end
25
+ #
26
+ # on(:multiply, 2, 3) do
27
+ # it MUST eq 6
28
+ # end
29
+ # end
30
+ #
31
+ # # Test implementations
32
+ # calculator = Calculator.new
33
+ # matcher = Matchi::Fix.new(:Calculator)
34
+ # matcher.match? { calculator } # => true if calculator meets spec
35
+ #
36
+ # @example Complex specifications
37
+ # Fix :UserValidator do
38
+ # on(:validate, name: "Alice", age: 30) do
39
+ # it MUST be true
40
+ # end
41
+ #
42
+ # on(:validate, name: "", age: -1) do
43
+ # it MUST be false
44
+ # end
45
+ # end
46
+ #
47
+ # validator = UserValidator.new
48
+ # matcher = Matchi::Fix.new(:UserValidator)
49
+ # matcher.match? { validator } # => true if validation logic is correct
50
+ #
51
+ # @see https://github.com/fixrb/fix
52
+ # @see https://github.com/fixrb/matchi
8
53
  class Fix
9
- # @return [#against] A set of specifications.
10
- attr_reader :expected
11
-
12
- # Initialize the matcher with a behavioral definition.
54
+ # Initialize the matcher with either a name or a specification block.
13
55
  #
14
- # @example With a block of specifications
15
- # require "matchi/fix"
56
+ # @api public
16
57
  #
17
- # Matchi::Fix.new { it MUST be 42 }
58
+ # @param name [Symbol, nil] The name of a registered Fix specification
59
+ # @param block [Proc, nil] A block containing the specification
18
60
  #
19
- # @example With the constant name of the specifications
20
- # require "matchi/fix"
61
+ # @raise [ArgumentError] if neither name nor block is provided
62
+ # @raise [ArgumentError] if both name and block are provided
63
+ # @raise [KeyError] if the named specification doesn't exist
21
64
  #
22
- # Fix :Answer do
23
- # it MUST be 42
24
- # end
65
+ # @return [Fix] a new instance of the matcher
25
66
  #
26
- # Matchi::Fix.new(:Answer)
67
+ # @example With anonymous specification
68
+ # Fix.new { it MUST be_positive }
27
69
  #
28
- # @param name [String, Symbol] The constant name of the specifications.
29
- # @param block [Proc] A block of specifications.
70
+ # @example With named specification
71
+ # Fix.new(:Calculator)
30
72
  def initialize(name = nil, &block)
31
- @expected = if name.nil?
32
- raise ::ArgumentError, "Pass either an argument or a block" unless block
73
+ raise ::ArgumentError, "a name or a block must be provided" if name.nil? && block.nil?
74
+ raise ::ArgumentError, "a name or a block must be provided" if !name.nil? && !block.nil?
33
75
 
34
- Fix(&block)
35
- else
36
- raise ::ArgumentError, "Can't pass both an argument and a block" if block
37
-
38
- @name = name
39
- ::Fix[name]
40
- end
76
+ @expected = name.nil? ? ::Fix.spec(&block) : ::Fix[name]
41
77
  end
42
78
 
43
- # Boolean comparison between an actual value and the expected specs.
79
+ # Checks if the yielded object satisfies the Fix specification.
44
80
  #
45
- # @example With a block of specifications
46
- # require "matchi/fix"
81
+ # This method executes the Fix specification against the provided object,
82
+ # verifying that all specified behaviors and conditions are met. It works
83
+ # with both anonymous and named specifications.
47
84
  #
48
- # matcher = Matchi::Fix.new { it MUST be 42 }
85
+ # @api public
49
86
  #
50
- # matcher.expected # => #<Fix::Set:0x00007fd96915dc28 ...>
51
- # matcher.matches? { 42 } # => true
87
+ # @yield [] Block that returns the object to verify
88
+ # @yieldreturn [Object] The object to check against the specification
52
89
  #
53
- # @example With the constant name of the specifications
54
- # require "matchi/fix"
90
+ # @return [Boolean] true if the object satisfies the specification
55
91
  #
56
- # Fix :Answer do
57
- # it MUST be 42
58
- # end
92
+ # @raise [ArgumentError] if no block is provided
59
93
  #
60
- # matcher = Matchi::Fix.new(:Answer)
94
+ # @example With anonymous specification
95
+ # matcher = Fix.new { it MUST be_zero }
96
+ # matcher.match? { 0 } # => true
97
+ # matcher.match? { 1 } # => false
61
98
  #
62
- # matcher.expected # => #<Fix::Set:0x00007fd96915dc28 ...>
63
- # matcher.matches? { 42 } # => true
64
- #
65
- # @yieldreturn [#object_id] The value to be compared to the specifications.
99
+ # @example With named specification
100
+ # Fix :Sortable do
101
+ # on(:sort) do
102
+ # it MUST be_kind_of(Array)
103
+ # it MUST be_sorted
104
+ # end
105
+ # end
66
106
  #
67
- # @return [Boolean] Determines whether the test has passed or failed.
68
- def matches?(&block)
69
- expected.against(log_level: 0, &block)
70
- rescue ::SystemExit => e
71
- e.success?
72
- end
107
+ # matcher = Fix.new(:Sortable)
108
+ # matcher.match? { [1, 2, 3] } # => true if array meets spec
109
+ def match?
110
+ raise ::ArgumentError, "a block must be provided" unless block_given?
73
111
 
74
- # A string containing a human-readable representation of the matcher.
75
- def inspect
76
- "#{self.class}(#{parameter})"
112
+ @expected.match?(yield)
77
113
  end
78
114
 
79
- # Returns a string representing the matcher.
115
+ # Returns a human-readable description of the matcher.
116
+ #
117
+ # @api public
118
+ #
119
+ # @return [String] A string describing what this matcher verifies
120
+ #
121
+ # @example
122
+ # Fix.new(:Calculator).to_s # => "fix Calculator"
123
+ # Fix.new { it MUST be 42 }.to_s # => "fix #<Fix::Spec:...>"
80
124
  def to_s
81
- "fix #{parameter}"
82
- end
83
-
84
- private
85
-
86
- def parameter
87
- @name.nil? ? "&specs" : ":#{@name}"
125
+ "fix #{@expected.inspect}"
88
126
  end
89
127
  end
90
128
  end
metadata CHANGED
@@ -1,156 +1,50 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: matchi-fix
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 3.0.0
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: 2021-07-30 00:00:00.000000000 Z
11
+ date: 2025-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fix
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0.beta8
19
+ version: '0.21'
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: 1.0.0.beta8
26
+ version: '0.21'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: matchi
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.2'
33
+ version: '4.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: '3.2'
41
- - !ruby/object:Gem::Dependency
42
- name: bundler
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: rake
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: rubocop-md
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rubocop-performance
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
- - !ruby/object:Gem::Dependency
98
- name: rubocop-rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rubocop-thread_safety
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: simplecov
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: yard
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'
153
- description: A Fix specifications matcher compatible with Matchi.
40
+ version: '4.1'
41
+ description: 'A Matchi-compatible matcher that allows testing objects against Fix
42
+ specifications. Enables verification of implementation conformance to Fix test specifications
43
+ across different testing frameworks like Minitest and RSpec. Integrates seamlessly
44
+ with the Fix testing framework''s powerful specification system while maintaining
45
+ Matchi''s clean matcher interface.
46
+
47
+ '
154
48
  email: contact@cyril.email
155
49
  executables: []
156
50
  extensions: []
@@ -162,8 +56,12 @@ files:
162
56
  homepage: https://github.com/fixrb/matchi-fix
163
57
  licenses:
164
58
  - MIT
165
- metadata: {}
166
- post_install_message:
59
+ metadata:
60
+ bug_tracker_uri: https://github.com/fixrb/matchi-fix/issues
61
+ documentation_uri: https://rubydoc.info/gems/matchi-fix
62
+ source_code_uri: https://github.com/fixrb/matchi-fix
63
+ rubygems_mfa_required: 'true'
64
+ post_install_message:
167
65
  rdoc_options: []
168
66
  require_paths:
169
67
  - lib
@@ -171,15 +69,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
171
69
  requirements:
172
70
  - - ">="
173
71
  - !ruby/object:Gem::Version
174
- version: 2.7.0
72
+ version: 3.1.0
175
73
  required_rubygems_version: !ruby/object:Gem::Requirement
176
74
  requirements:
177
75
  - - ">="
178
76
  - !ruby/object:Gem::Version
179
77
  version: '0'
180
78
  requirements: []
181
- rubygems_version: 3.1.6
182
- signing_key:
79
+ rubygems_version: 3.3.27
80
+ signing_key:
183
81
  specification_version: 4
184
- summary: Fix specifications matcher.
82
+ summary: Matcher for testing implementations against Fix specifications.
185
83
  test_files: []