spectus 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e08a0c9d455c7e57dc73d412e7f1a1c6a470b954
4
- data.tar.gz: 19554aba37f38c6227b199498bb5b99df33a9896
3
+ metadata.gz: 5af3530d553018e8e3edb227a935720e3d059710
4
+ data.tar.gz: ba087a69cc7fdb7fa34b77f9533c613dfe212b1d
5
5
  SHA512:
6
- metadata.gz: 3c514e5429e220d6f8dd0954d7a6779951efb876d6cf0565ee4042f77618f2ef5127b6f2232de254f1133099393c53e4879611f41903d7ba6059ff601474dfcb
7
- data.tar.gz: 013b5b2aeb1507c74ba3fb4ec942cb56fde0a3ede1c3acc4d16027292991fc99dedf92ba7290f701737488e6728f15a795936415ea1677661edef32343a5fbe5
6
+ metadata.gz: 1e87dc18064518c251a502e63a719e8f8ae4e5646c1e9dfd2ebb468ba1188eda8a8e2a3418d61e3d430b94a6f8cd68754b72a7b291cca4294394cf7c4f893ae6
7
+ data.tar.gz: 5416775288db9e161101a4759e8aaad4ae600809ca90db34b5213303aa8c247f1b59a7fef1c7c83372295c5f64d1586c9142cf8a50d4d9aaafce344b007a0428
checksums.yaml.gz.sig CHANGED
Binary file
data/README.md CHANGED
@@ -30,6 +30,16 @@ To be sure the gem you install hasn't been tampered with, add my public key (if
30
30
 
31
31
  The `HighSecurity` trust profile will verify all gems. All of __Spectus__'s dependencies are signed.
32
32
 
33
+ Or add this line to your application's Gemfile:
34
+
35
+ ```ruby
36
+ gem 'spectus'
37
+ ```
38
+
39
+ And then execute:
40
+
41
+ $ bundle
42
+
33
43
  ## Expectation
34
44
 
35
45
  An expectation is an assertion that is either `true` or `false`.
@@ -58,7 +68,7 @@ Given the `"ルビー"` object, when it receives `valid_encoding?` method, then
58
68
 
59
69
  ```ruby
60
70
  Spectus.this { 'ルビー'.valid_encoding? }.MUST :BeTrue
61
- # => #<Spectus::Result::Pass:0x007fbbc12b9fd8 @subject=#<Proc:0x007fbbc12ba410@(irb):1>, @challenge=:call, @context=[], @actual=true, @expected=:BeTrue, @got=true, @error=nil, @level=:High, @negate=false, @valid=true>
71
+ # => #<Spectus::Result::Pass:0x007f9329c45090 @message="Pass: Expected true to be true.", @subject=#<Proc:0x007f9329c45d60@(irb):1>, @challenge=:call, @context=[], @actual=true, @expected=:BeTrue, @got=true, @error=nil, @level=:High, @negate=false, @valid=true>
62
72
  ```
63
73
 
64
74
  The result of the test shows that the spec passed.
@@ -69,7 +79,7 @@ Given the `"foo"` object, when it receives `length` method, then it **MUST NOT**
69
79
 
70
80
  ```ruby
71
81
  Spectus.this { 'foo'.length }.MUST_NOT RaiseException: NoMethodError
72
- # => #<Spectus::Result::Pass:0x007fbbc12a8e90 @subject=#<Proc:0x007fbbc12a95e8@(irb):2>, @challenge=:call, @context=[], @actual=3, @expected={:RaiseException=>NoMethodError}, @got=true, @error=nil, @level=:High, @negate=true, @valid=true>
82
+ # => #<Spectus::Result::Pass:0x007f9329c341f0 @message="Pass: Expected 3 not to raise exception NoMethodError.", @subject=#<Proc:0x007f9329c34da8@(irb):2>, @challenge=:call, @context=[], @actual=3, @expected={:RaiseException=>NoMethodError}, @got=true, @error=nil, @level=:High, @negate=true, @valid=true>
73
83
  ```
74
84
 
75
85
  The result of the test shows that the spec passed.
@@ -80,7 +90,7 @@ Given the `BasicObject` object, when it receives `superclass` method, then it **
80
90
 
81
91
  ```ruby
82
92
  Spectus.this { BasicObject.superclass }.SHOULD Equal: NilClass
83
- # => #<Spectus::Result::Pass:0x007fbbc1291ec0 @subject=#<Proc:0x007fbbc12923e8@(irb):3>, @challenge=:call, @context=[], @actual=nil, @expected={:Equal=>NilClass}, @got=false, @error=nil, @level=:Medium, @negate=false, @valid=false>
93
+ # => #<Spectus::Result::Pass:0x007f9329c1def0 @message="Info: Expected nil to equal NilClass.", @subject=#<Proc:0x007f9329c1e990@(irb):3>, @challenge=:call, @context=[], @actual=nil, @expected={:Equal=>NilClass}, @got=false, @error=nil, @level=:Medium, @negate=false, @valid=false>
84
94
  ```
85
95
 
86
96
  Instead of the expected `NilClass` class, its sole instance (which is `nil`) was returned.
@@ -92,7 +102,9 @@ Given the `"1"` object, when it receives `+(1)` method, then it **SHOULD NOT** r
92
102
 
93
103
  ```ruby
94
104
  Spectus.this { '1' + 1 }.SHOULD_NOT Eql: '11'
95
- # => raise #<Spectus::Result::Fail: failing spec> exception
105
+ # Spectus::Result::Fail: Error: no implicit conversion of Fixnum into String (TypeError).
106
+ # from (irb):4
107
+ # from ./bin/console:7:in `<main>'
96
108
  ```
97
109
 
98
110
  There was a `TypeError` exception, the result of the test shows that the spec failed.
@@ -103,7 +115,7 @@ Given the `"foo"` object, when it receives `blank?` method, then it **MAY** be `
103
115
 
104
116
  ```ruby
105
117
  Spectus.this { 'foo'.blank? }.MAY :BeFalse
106
- # => #<Spectus::Result::Pass:0x007fbbc1b7c238 @subject=#<Proc:0x007fbbc1b7c698@(irb):5>, @challenge=:call, @context=[], @actual=nil, @expected=:BeFalse, @got=nil, @error=#<NoMethodError: undefined method `blank?' for "foo":String>, @level=:Low, @negate=false, @valid=false>
118
+ # => #<Spectus::Result::Pass:0x007f932b91feb8 @message="Info: undefined method `blank?' for \"foo\":String (NoMethodError).", @subject=#<Proc:0x007f9329bfc5e8@(irb):5>, @challenge=:call, @context=[], @actual=nil, @expected=:BeFalse, @got=nil, @error=#<NoMethodError: undefined method `blank?' for "foo":String>, @level=:Low, @negate=false, @valid=false>
107
119
  ```
108
120
 
109
121
  The optional `blank?` method is not implemented (unlike in [Ruby on Rails](http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F), for instance), so the result of the test shows that the spec passed.
@@ -118,8 +130,8 @@ built Gem they can be used for basic integrity verification purposes.
118
130
  The checksum of a file can be checked using the `sha512sum` command. For
119
131
  example:
120
132
 
121
- $ sha512sum pkg/spectus-2.0.0.gem
122
- e00ef19cbae209816410c1b0e4b032a59ba70ab2e43367c934ad723d3e23a9c50c457c0963fab7d46743d82ab21f9482dbd8ceb7cab23617e37be26823d846cd pkg/spectus-2.0.0.gem
133
+ $ sha512sum pkg/spectus-2.3.0.gem
134
+ d12d7d9c2a4fdfe075cbb7a141fa5f2195175891e4098c7e1a28c8bca655ab44fb9d67b6a2e3991d0f852026c5e4537fdf7e314575c68d1c80b3a4b1eb1c041f pkg/spectus-2.3.0.gem
123
135
 
124
136
  ## Versioning
125
137
 
data/VERSION.semver CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.3.0
@@ -0,0 +1 @@
1
+ 0bf8cbdb18e983b524e5857af066f4d948ea6e2d70b2cb97d56cb37f5ccf8a33931f3e9786097f1aea6183be01106d6e3d40a97f1fbf58dfaf89eb9f01cab260
@@ -1,10 +1,10 @@
1
1
  module Spectus
2
- # This class evaluate the expectation with the passed block.
2
+ # This class contains a challenge to apply against an object.
3
3
  #
4
- # @api private
4
+ # @api public
5
5
  #
6
6
  class Challenge
7
- # A Query to the subject.
7
+ # Initialize the challenge class.
8
8
  #
9
9
  # @param [#to_sym] method_id the identifier of a method.
10
10
  # @param [Array] args the arguments of the method.
@@ -13,10 +13,14 @@ module Spectus
13
13
  @args = args
14
14
  end
15
15
 
16
- # @return [Symbol] the method to call on the subject.
16
+ # @!attribute [r] symbol
17
+ #
18
+ # @return [Symbol] The method to call on the subject.
17
19
  attr_reader :symbol
18
20
 
19
- # @return [Array] the parameters following the method.
21
+ # @!attribute [r] args
22
+ #
23
+ # @return [Array] The parameters following the method.
20
24
  attr_reader :args
21
25
  end
22
26
  end
@@ -17,10 +17,14 @@ module Spectus
17
17
  @challenge = Challenge.new(:call)
18
18
  end
19
19
 
20
- # @return [BasicObject] the front object to be tested.
20
+ # @!attribute [r] subject
21
+ #
22
+ # @return [BasicObject] The front object to be tested.
21
23
  attr_reader :subject
22
24
 
23
- # @return [Challenge] the challenge to call on the subject.
25
+ # @!attribute [r] challenge
26
+ #
27
+ # @return [Challenge] The challenge to call on the subject.
24
28
  attr_reader :challenge
25
29
 
26
30
  # This word, or the terms "REQUIRED" or "SHALL", mean that the
@@ -3,11 +3,13 @@ require_relative File.join '..', 'result', 'fail'
3
3
  require_relative File.join '..', 'result', 'pass'
4
4
 
5
5
  module Spectus
6
+ # Namespace for the requirement levels.
7
+ #
8
+ # @api private
9
+ #
6
10
  module RequirementLevel
7
11
  # Requirement level's base class.
8
12
  #
9
- # @api private
10
- #
11
13
  class Base
12
14
  # Initialize the requirement level class.
13
15
  #
@@ -29,14 +31,15 @@ module Spectus
29
31
  #
30
32
  # @return [Result::Pass] pass the spec.
31
33
  def pass!(state)
32
- Result::Pass.new(*result_signature(state))
34
+ Result::Pass.new(message(state, true), *result_signature(state))
33
35
  end
34
36
 
35
37
  # @param state [Sandbox] The sandbox that tested the code.
36
38
  #
37
39
  # @raise [Result::Fail] fail the spec.
38
40
  def fail!(state)
39
- fail Result::Fail.new(*result_signature(state)), 'failing spec'
41
+ fail Result::Fail.new(message(state, false), *result_signature(state)),
42
+ message(state, false), caller[2..-1]
40
43
  end
41
44
 
42
45
  # @param state [Sandbox] The sandbox that tested the code.
@@ -67,6 +70,70 @@ module Spectus
67
70
  Sandbox.new(@definition, @negate, @subject, @challenge.symbol,
68
71
  *@challenge.args)
69
72
  end
73
+
74
+ # @param state [Sandbox] The sandbox that tested the code.
75
+ # @param result [Boolean] The result of the test.
76
+ #
77
+ # @return [String] the message that describe the state.
78
+ def message(state, result)
79
+ "#{title(state, result)}: #{summary(state)}."
80
+ end
81
+
82
+ # The title of the state.
83
+ #
84
+ # @param state [Sandbox] The sandbox that tested the code.
85
+ # @param result [Boolean] The result of the test.
86
+ #
87
+ # @return [String] the title of the state.
88
+ def title(state, result)
89
+ if result
90
+ if state.got
91
+ 'Pass'
92
+ else
93
+ 'Info'
94
+ end
95
+ else
96
+ if state.exception.nil?
97
+ 'Failure'
98
+ else
99
+ 'Error'
100
+ end
101
+ end
102
+ end
103
+
104
+ # The summary of the state.
105
+ #
106
+ # @param state [Sandbox] The sandbox that tested the code.
107
+ #
108
+ # @return [String] the summary of the state.
109
+ def summary(state)
110
+ if state.valid? || state.exception.nil?
111
+ 'Expected ' + state.actual.inspect + (@negate ? ' not ' : ' ') +
112
+ 'to ' + if @definition.is_a?(Hash)
113
+ readable(@definition.keys.first.to_s) +
114
+ " #{@definition.values.first.inspect}"
115
+ else
116
+ readable(@definition.to_s)
117
+ end
118
+ else
119
+ state.exception.message
120
+ end + if state.exception.nil?
121
+ ''
122
+ else
123
+ " (#{state.exception.class})"
124
+ end
125
+ end
126
+
127
+ # @param string [String] A UpperCamelCase string.
128
+ #
129
+ # @return [String] the snake_case string.
130
+ def readable(string)
131
+ string.gsub(/::/, '/')
132
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
133
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
134
+ .tr('-_', ' ')
135
+ .downcase
136
+ end
70
137
  end
71
138
  end
72
139
  end
@@ -1,12 +1,15 @@
1
1
  module Spectus
2
+ # Namespace for the results.
3
+ #
4
+ # @api private
5
+ #
2
6
  module Result
3
7
  # Result base's module.
4
8
  #
5
- # @api public
6
- #
7
9
  module Base
8
10
  # Initialize the result class.
9
11
  #
12
+ # @param message [String] It is describing the actual/error value.
10
13
  # @param subject [#object_id] The untrusted object to be tested.
11
14
  # @param challenge [Symbol] The method to call on the subject.
12
15
  # @param context [Array] Parameters of the challenge.
@@ -20,9 +23,10 @@ module Spectus
20
23
  # @param level [:High, :Medium, :Low] The level of the expectation.
21
24
  # @param negate [Boolean] Evaluate to a negative assertion.
22
25
  # @param valid [Boolean] Report if the test was true or false.
23
- def initialize(subject, challenge, context, actual, expected, got, error,
24
- level, negate, valid)
26
+ def initialize(message, subject, challenge, context, actual, expected,
27
+ got, error, level, negate, valid)
25
28
 
29
+ @message = message
26
30
  @subject = subject
27
31
  @challenge = challenge
28
32
  @context = context
@@ -35,8 +39,47 @@ module Spectus
35
39
  @valid = valid
36
40
  end
37
41
 
38
- attr_reader :subject, :challenge, :context, :actual, :expected, :got,
39
- :error, :level
42
+ # @!attribute [r] subject
43
+ #
44
+ # @return [#object_id] The untrusted object to be tested.
45
+ attr_reader :subject
46
+
47
+ # @!attribute [r] challenge
48
+ #
49
+ # @return [Symbol] The method to call on the subject.
50
+ attr_reader :challenge
51
+
52
+ # @!attribute [r] context
53
+ #
54
+ # @return [Array] Parameters of the challenge.
55
+ attr_reader :context
56
+
57
+ # @!attribute [r] actual
58
+ #
59
+ # @return [#object_id] The value that the subject return through its
60
+ # challenge.
61
+ attr_reader :actual
62
+
63
+ # @!attribute [r] expected
64
+ #
65
+ # @return [Array, Hash, Symbol] The definition of the expected value.
66
+ attr_reader :expected
67
+
68
+ # @!attribute [r] got
69
+ #
70
+ # @return [#object_id] The result of the boolean comparison between the
71
+ # actual value and the expected value.
72
+ attr_reader :got
73
+
74
+ # @!attribute [r] error
75
+ #
76
+ # @return [#exception, nil] Any possible raised exception.
77
+ attr_reader :error
78
+
79
+ # @!attribute [r] level
80
+ #
81
+ # @return [:High, :Medium, :Low] The level of the expectation.
82
+ attr_reader :level
40
83
 
41
84
  # The value of the negate instance variable.
42
85
  #
@@ -53,9 +96,9 @@ module Spectus
53
96
  @valid
54
97
  end
55
98
 
56
- # Report the result.
99
+ # Properties of the result.
57
100
  #
58
- # @return [Symbol] the properties of the result.
101
+ # @return [Hash] the properties of the result.
59
102
  def to_h
60
103
  {
61
104
  subject: subject,
@@ -6,6 +6,11 @@ module Spectus
6
6
  class Pass
7
7
  include Base
8
8
 
9
+ # @!attribute [r] message
10
+ #
11
+ # @return [String] The message that describe the state.
12
+ attr_reader :message
13
+
9
14
  # The value of the expectation of the spec.
10
15
  #
11
16
  # @return [Boolean] the spec was true.
@@ -6,8 +6,6 @@ module Spectus
6
6
  # @api private
7
7
  #
8
8
  class Sandbox
9
- attr_reader :actual, :exception, :got
10
-
11
9
  # Execute the untested code from the passed block against the definition.
12
10
  #
13
11
  # @param [Array, Hash, Symbol] definition
@@ -23,6 +21,23 @@ module Spectus
23
21
  @exception = e
24
22
  end
25
23
 
24
+ # @!attribute [r] actual
25
+ #
26
+ # @return [#object_id] The value that the subject return through its
27
+ # challenge.
28
+ attr_reader :actual
29
+
30
+ # @!attribute [r] exception
31
+ #
32
+ # @return [#exception, nil] Any possible raised exception.
33
+ attr_reader :exception
34
+
35
+ # @!attribute [r] got
36
+ #
37
+ # @return [#object_id] The result of the boolean comparison between the
38
+ # actual value and the expected value.
39
+ attr_reader :got
40
+
26
41
  # Report to the spec's requirement level if the test is true or false.
27
42
  #
28
43
  # @return [Boolean] Report if the test was true or false.
data/lib/spectus.rb CHANGED
@@ -9,8 +9,6 @@ require_relative File.join 'spectus', 'expectation_target'
9
9
  module Spectus
10
10
  # Expectations are built with this method.
11
11
  #
12
- # @api public
13
- #
14
12
  # @example Absolute requirement definition
15
13
  # this { 42 }.MUST Equal: 42 # => #<Spectus::Result::Pass...>
16
14
  #
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spectus
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyril Wack
@@ -30,7 +30,7 @@ cert_chain:
30
30
  dzJvWzQ1+dJU6WQv75E9ddSkaQrK3nhdgQVu+/wgvGSrsMvOGNz+LXaSDxQqZuwX
31
31
  0KNQFuIukfrdk8URwRnHoAnvx4U93iUw
32
32
  -----END CERTIFICATE-----
33
- date: 2015-08-22 00:00:00.000000000 Z
33
+ date: 2015-08-23 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: matchi
@@ -146,6 +146,7 @@ files:
146
146
  - checksum/spectus-2.1.2.gem.sha512
147
147
  - checksum/spectus-2.1.3.gem.sha512
148
148
  - checksum/spectus-2.2.0.gem.sha512
149
+ - checksum/spectus-2.3.0.gem.sha512
149
150
  - lib/spectus.rb
150
151
  - lib/spectus/challenge.rb
151
152
  - lib/spectus/expectation_target.rb
metadata.gz.sig CHANGED
@@ -1,2 +1 @@
1
- �+�:A��鏡(�K9ҝ�d��䉨�Q��������%��O�o�UoZ$��S��ߋٹܪA�)�W1��rɴ�uh���+C���>�N�ޘ�_fSbf��HAZ��B�J��=�؍�ma���N��㤯W��
2
-  �({]���V��'�<Lt���Օ�0� ��he���|�q ��{��_�� Hxr����o�R�=� S`_��� �N�
1
+ �q����e ңM�O����x���Hл��z�өs����CW�G���ZAs�d����:�����Fk��8��8#�FZ�� ��X��("�Q��oΟ�I��Y\�9�*A `�MCV��MF_���B��q3��w��!���kF|�h�|�7�3����`��b齄�me���S�)� kO2��k:�S�������Jh`¬�i"㟪��5���=n��5��gЇ��eE�,<���Q���Af��