fix 0.18.2 → 0.19
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/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 +67 -0
- data/lib/fix.rb +85 -20
- data/lib/kernel.rb +49 -0
- metadata +41 -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
@@ -1 +0,0 @@
|
|
1
|
-
bdf94bb8790d1d0b5524f6ef0e7ac9a2f682cdd3248c52ef069acabbdc17ea685f050d737fa4fc121e9d7688641e2a8cd831b76537e58a6ebb5d169524f961e1
|
@@ -1 +0,0 @@
|
|
1
|
-
1acbc3c942908b08c055c50f0191f7e16681bb60388cb154bb3ca86ded0764e40438a0c296b651a8a13c4d62f1006b69c17cc69b8b6b963535be02e5fafd0d54
|
@@ -1 +0,0 @@
|
|
1
|
-
c1529ea230a72517e4d15da268661f0c06c0294f456e2bec9dcb455fd85febda7de4237466414d02a662e3a2b370471d20852138f45fc3fbb5d8fef270d9e356
|
data/fix.gemspec
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
Gem::Specification.new do |spec|
|
4
|
-
spec.name = 'fix'
|
5
|
-
spec.version = File.read('VERSION.semver').chomp
|
6
|
-
spec.authors = ['Cyril Kato']
|
7
|
-
spec.email = ['contact@cyril.email']
|
8
|
-
|
9
|
-
spec.summary = 'Specing framework.'
|
10
|
-
spec.description = 'Specing framework for Ruby.'
|
11
|
-
spec.homepage = 'https://github.com/fixrb/fix'
|
12
|
-
spec.license = 'MIT'
|
13
|
-
|
14
|
-
spec.files =
|
15
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^test/}) }
|
16
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
17
|
-
spec.require_paths = ['lib']
|
18
|
-
|
19
|
-
spec.add_dependency 'aw', '~> 0.1.6'
|
20
|
-
spec.add_dependency 'defi', '~> 1.1.5'
|
21
|
-
spec.add_dependency 'spectus', '~> 3.0.9'
|
22
|
-
|
23
|
-
spec.add_development_dependency 'bundler', '~> 2.0'
|
24
|
-
spec.add_development_dependency 'rake', '~> 13.0'
|
25
|
-
spec.add_development_dependency 'rubocop', '~> 0.75'
|
26
|
-
spec.add_development_dependency 'rubocop-performance', '~> 1.5'
|
27
|
-
spec.add_development_dependency 'simplecov', '~> 0.17'
|
28
|
-
spec.add_development_dependency 'yard', '~> 0.9'
|
29
|
-
end
|
data/lib/fix/it.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spectus/expectation_target'
|
4
|
-
require 'spectus/matchers'
|
5
|
-
|
6
|
-
module Fix
|
7
|
-
# Wraps the target of an expectation.
|
8
|
-
#
|
9
|
-
# @api private
|
10
|
-
#
|
11
|
-
class It < ::Spectus::ExpectationTarget
|
12
|
-
include ::Spectus::Matchers
|
13
|
-
|
14
|
-
# Create a new expection target
|
15
|
-
#
|
16
|
-
# @param subject [BasicObject] The front object.
|
17
|
-
# @param challenges [Array] The list of challenges.
|
18
|
-
# @param helpers [Hash] The list of helpers.
|
19
|
-
def initialize(subject, challenges, helpers)
|
20
|
-
@subject = subject
|
21
|
-
@challenges = challenges
|
22
|
-
|
23
|
-
helpers.each do |method_name, method_block|
|
24
|
-
define_singleton_method(method_name) do
|
25
|
-
method_block.call
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Verify the expectation.
|
31
|
-
#
|
32
|
-
# @param spec [Proc] A spec to compare against the computed actual value.
|
33
|
-
#
|
34
|
-
# @return [::Spectus::Result::Pass, ::Spectus::Result::Fail] Pass or fail.
|
35
|
-
def verify(&spec)
|
36
|
-
instance_eval(&spec)
|
37
|
-
rescue ::Spectus::Result::Fail => e
|
38
|
-
e
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
data/lib/fix/on.rb
DELETED
@@ -1,139 +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
|
-
#
|
9
|
-
# @api private
|
10
|
-
#
|
11
|
-
class On
|
12
|
-
# Initialize the on class.
|
13
|
-
#
|
14
|
-
# @param described [#object_id] The front object of the test.
|
15
|
-
# @param results [Array] The list of collected results.
|
16
|
-
# @param challenges [Array] The list of challenges to apply.
|
17
|
-
# @param helpers [Hash] The list of helpers.
|
18
|
-
# @param configuration [Hash] Settings.
|
19
|
-
def initialize(described, results, challenges, helpers, configuration)
|
20
|
-
@described = described
|
21
|
-
@results = results
|
22
|
-
@challenges = challenges
|
23
|
-
@helpers = helpers
|
24
|
-
@configuration = configuration
|
25
|
-
end
|
26
|
-
|
27
|
-
# @!attribute [r] described
|
28
|
-
#
|
29
|
-
# @return [#object_id] The front object of the test.
|
30
|
-
attr_reader :described
|
31
|
-
|
32
|
-
# @!attribute [r] results
|
33
|
-
#
|
34
|
-
# @return [Array] The list of collected results.
|
35
|
-
attr_reader :results
|
36
|
-
|
37
|
-
# @!attribute [r] challenges
|
38
|
-
#
|
39
|
-
# @return [Array] The list of challenges to apply.
|
40
|
-
attr_reader :challenges
|
41
|
-
|
42
|
-
# @!attribute [r] helpers
|
43
|
-
#
|
44
|
-
# @return [Hash] The list of helpers.
|
45
|
-
attr_reader :helpers
|
46
|
-
|
47
|
-
# @!attribute [r] configuration
|
48
|
-
#
|
49
|
-
# @return [Hash] Settings.
|
50
|
-
attr_reader :configuration
|
51
|
-
|
52
|
-
# Add it method to the DSL.
|
53
|
-
#
|
54
|
-
# @api public
|
55
|
-
#
|
56
|
-
# @example It must eql "FOO"
|
57
|
-
# it { MUST equal 'FOO' }
|
58
|
-
#
|
59
|
-
# @param spec [Proc] A spec to compare against the computed actual value.
|
60
|
-
#
|
61
|
-
# @return [Array] List of results.
|
62
|
-
def it(*, &spec)
|
63
|
-
i = It.new(described, challenges, helpers)
|
64
|
-
|
65
|
-
result = i.verify(&spec)
|
66
|
-
|
67
|
-
if configuration.fetch(:verbose, true)
|
68
|
-
print result.to_char(configuration.fetch(:color, false))
|
69
|
-
end
|
70
|
-
|
71
|
-
results << result
|
72
|
-
end
|
73
|
-
|
74
|
-
# Add on method to the DSL.
|
75
|
-
#
|
76
|
-
# @api public
|
77
|
-
#
|
78
|
-
# @example On +2, it must equal 44.
|
79
|
-
# on(:+, 2) do
|
80
|
-
# it { MUST equal 44 }
|
81
|
-
# end
|
82
|
-
#
|
83
|
-
# @param method_name [Symbol] The identifier of a method.
|
84
|
-
# @param args [Array] A list of arguments.
|
85
|
-
# @param block [Proc] A spec to compare against the computed value.
|
86
|
-
#
|
87
|
-
# @return [Array] List of results.
|
88
|
-
def on(method_name, *args, &block)
|
89
|
-
o = On.new(described,
|
90
|
-
results,
|
91
|
-
(challenges + [::Defi.send(method_name, *args)]),
|
92
|
-
helpers.dup,
|
93
|
-
configuration)
|
94
|
-
|
95
|
-
o.instance_eval(&block)
|
96
|
-
end
|
97
|
-
|
98
|
-
# Add let method to the DSL, to define memoized helper methods.
|
99
|
-
#
|
100
|
-
# @api public
|
101
|
-
#
|
102
|
-
# @example Let's define the answer to the Ultimate Question of Life, the
|
103
|
-
# Universe, and Everything.
|
104
|
-
#
|
105
|
-
# let(:answer) { 42 }
|
106
|
-
#
|
107
|
-
# @param method_name [Symbol] The identifier of a method.
|
108
|
-
# @param block [Proc] A spec to compare against the computed value.
|
109
|
-
#
|
110
|
-
# @return [#object_id] List of results.
|
111
|
-
def let(method_name, &block)
|
112
|
-
helpers.update(method_name => block)
|
113
|
-
end
|
114
|
-
|
115
|
-
# Add context method to the DSL, to build an isolated scope.
|
116
|
-
#
|
117
|
-
# @api public
|
118
|
-
#
|
119
|
-
# @example Context when logged in.
|
120
|
-
# context 'when logged in' do
|
121
|
-
# it { MUST equal 200 }
|
122
|
-
# end
|
123
|
-
#
|
124
|
-
# @param block [Proc] A block of specs to test in isolation.
|
125
|
-
#
|
126
|
-
# @return [Array] List of results.
|
127
|
-
def context(*, &block)
|
128
|
-
o = On.new(described,
|
129
|
-
[],
|
130
|
-
challenges,
|
131
|
-
helpers.dup,
|
132
|
-
configuration)
|
133
|
-
|
134
|
-
results.concat(::Aw.fork! { o.instance_eval(&block) })
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
require_relative 'it'
|
data/lib/fix/report.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Fix
|
4
|
-
# The class that is responsible for reporting the result of the test.
|
5
|
-
#
|
6
|
-
# @api private
|
7
|
-
#
|
8
|
-
class Report
|
9
|
-
# Initialize the report class.
|
10
|
-
#
|
11
|
-
# @param test [Test] The test.
|
12
|
-
def initialize(test)
|
13
|
-
@test = test
|
14
|
-
end
|
15
|
-
|
16
|
-
# @!attribute [r] test
|
17
|
-
#
|
18
|
-
# @return [Test] The results of the test.
|
19
|
-
attr_reader :test
|
20
|
-
|
21
|
-
# The report in plain text.
|
22
|
-
#
|
23
|
-
# @return [String] The report in plain text.
|
24
|
-
def to_s
|
25
|
-
[maybe_thematic_break, maybe_alerts, total_time, statistics].join
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
|
30
|
-
# @private
|
31
|
-
def maybe_thematic_break
|
32
|
-
test.results.any? && test.configuration.fetch(:verbose) ? "\n\n" : ''
|
33
|
-
end
|
34
|
-
|
35
|
-
# @private
|
36
|
-
def total_time
|
37
|
-
"Ran #{test.results.length} tests in #{test.total_time} seconds\n"
|
38
|
-
end
|
39
|
-
|
40
|
-
# @private
|
41
|
-
def alerts
|
42
|
-
test.results.reject { |r| r.to_sym.equal?(:success) }
|
43
|
-
end
|
44
|
-
|
45
|
-
# @private
|
46
|
-
def maybe_alerts
|
47
|
-
alerts.any? ? "#{results.join("\n")}\n" : ''
|
48
|
-
end
|
49
|
-
|
50
|
-
# @private
|
51
|
-
def results
|
52
|
-
alerts.map.with_index(1) do |r, i|
|
53
|
-
maybe_results_color("#{i}. #{r.message}\n" + maybe_backtrace(r), r)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
# @private
|
58
|
-
def maybe_results_color(string, result)
|
59
|
-
return string unless test.configuration.fetch(:color)
|
60
|
-
|
61
|
-
color = send("#{result.to_sym}_color")
|
62
|
-
"\e[#{color}m#{string}\e[0m"
|
63
|
-
end
|
64
|
-
|
65
|
-
# @private
|
66
|
-
def maybe_backtrace(result)
|
67
|
-
result.respond_to?(:backtrace) ? " #{result.backtrace.first}\n" : ''
|
68
|
-
end
|
69
|
-
|
70
|
-
# @private
|
71
|
-
def statistics
|
72
|
-
if test.configuration.fetch(:color)
|
73
|
-
statistics_color(statistics_text, test.statistics)
|
74
|
-
else
|
75
|
-
statistics_text
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# @private
|
80
|
-
def statistics_text
|
81
|
-
"#{test.statistics.fetch(:pass_percent)}% compliant - " \
|
82
|
-
"#{test.statistics.fetch(:total_infos)} infos, " \
|
83
|
-
"#{test.statistics.fetch(:total_failures)} failures, " \
|
84
|
-
"#{test.statistics.fetch(:total_errors)} errors\n"
|
85
|
-
end
|
86
|
-
|
87
|
-
# @private
|
88
|
-
def statistics_color(string, stats)
|
89
|
-
if stats.fetch(:total_errors).positive?
|
90
|
-
"\e[#{error_color}m#{string}\e[0m"
|
91
|
-
elsif stats.fetch(:total_failures).positive?
|
92
|
-
"\e[#{failure_color}m#{string}\e[0m"
|
93
|
-
elsif stats.fetch(:total_infos).positive?
|
94
|
-
"\e[#{info_color}m#{string}\e[0m"
|
95
|
-
else
|
96
|
-
"\e[#{success_color}m#{string}\e[0m"
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
# @private
|
101
|
-
def error_color
|
102
|
-
31
|
103
|
-
end
|
104
|
-
|
105
|
-
# @private
|
106
|
-
def failure_color
|
107
|
-
35
|
108
|
-
end
|
109
|
-
|
110
|
-
# @private
|
111
|
-
def info_color
|
112
|
-
33
|
113
|
-
end
|
114
|
-
|
115
|
-
# @private
|
116
|
-
def success_color
|
117
|
-
32
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
data/lib/fix/test.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Fix
|
4
|
-
# Wraps the target of the specs document.
|
5
|
-
#
|
6
|
-
# @api private
|
7
|
-
#
|
8
|
-
class Test
|
9
|
-
# Initialize the test class.
|
10
|
-
#
|
11
|
-
# @param front_object [BasicObject] The front object of the test.
|
12
|
-
# @param options [Hash] Some options.
|
13
|
-
# @param specs [Proc] The specs to test against the object.
|
14
|
-
def initialize(front_object, verbose: true, color: true, **options, &specs)
|
15
|
-
@configuration = options.merge(
|
16
|
-
verbose: verbose,
|
17
|
-
color: color
|
18
|
-
)
|
19
|
-
|
20
|
-
start_time = ::Time.now
|
21
|
-
|
22
|
-
g = On.new(front_object, [], [], {}, @configuration)
|
23
|
-
g.instance_eval(&specs)
|
24
|
-
|
25
|
-
@results = g.results
|
26
|
-
@total_time = ::Time.now - start_time
|
27
|
-
end
|
28
|
-
|
29
|
-
# @!attribute [r] configuration
|
30
|
-
#
|
31
|
-
# @return [Hash] The settings.
|
32
|
-
attr_reader :configuration
|
33
|
-
|
34
|
-
# @!attribute [r] results
|
35
|
-
#
|
36
|
-
# @return [Array] The results.
|
37
|
-
attr_reader :results
|
38
|
-
|
39
|
-
# @!attribute [r] total_time
|
40
|
-
#
|
41
|
-
# @return [Float] The total time.
|
42
|
-
attr_reader :total_time
|
43
|
-
|
44
|
-
# Some statistics.
|
45
|
-
#
|
46
|
-
# @return [Hash] Some statistics.
|
47
|
-
def statistics
|
48
|
-
{
|
49
|
-
pass_percent: pass_percent,
|
50
|
-
total_infos: results.count { |r| r.to_sym.equal?(:info) },
|
51
|
-
total_failures: results.count { |r| r.to_sym.equal?(:failure) },
|
52
|
-
total_errors: results.count { |r| r.to_sym.equal?(:error) }
|
53
|
-
}
|
54
|
-
end
|
55
|
-
|
56
|
-
# The report of the test.
|
57
|
-
#
|
58
|
-
# @return [Report] The report of the test.
|
59
|
-
def report
|
60
|
-
Report.new(self)
|
61
|
-
end
|
62
|
-
|
63
|
-
# The state of the test.
|
64
|
-
#
|
65
|
-
# @return [Boolean] Return true if the test pass.
|
66
|
-
def pass?
|
67
|
-
results.all?(&:result?)
|
68
|
-
end
|
69
|
-
|
70
|
-
# @return [Boolean] Return false if the test fail.
|
71
|
-
def fail?
|
72
|
-
!pass?
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
# @private
|
78
|
-
#
|
79
|
-
# @return [Fixnum] Return the percentage of passing specs.
|
80
|
-
def pass_percent
|
81
|
-
return 100 if results.empty?
|
82
|
-
|
83
|
-
(results.count(&:result?) / results.length.to_f * 100).round
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
require_relative 'on'
|
89
|
-
require_relative 'report'
|
data/pkg_checksum
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require 'digest/sha2'
|
5
|
-
|
6
|
-
gemname = :fix
|
7
|
-
ARGV[0] = File.read('VERSION.semver').chomp if ARGV[0].nil?
|
8
|
-
built_gem_path = "pkg/#{gemname}-#{ARGV[0]}.gem"
|
9
|
-
checksum = Digest::SHA512.new.hexdigest(File.read(built_gem_path))
|
10
|
-
checksum_path = "checksum/#{gemname}-#{ARGV[0]}.gem.sha512"
|
11
|
-
|
12
|
-
File.open(checksum_path, 'w') { |f| f.write("#{checksum}\n") }
|