uspec 1.0.1 → 1.1.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
  SHA256:
3
- metadata.gz: 11c5e0a54306aeafdf5547c71c02c3ed64fabc60f068bff1d6d395cc1fac11b3
4
- data.tar.gz: 918d6e06e01c9c0541a410d9ecc5aad0a7c7f416c0532d533f461383dfad70d4
3
+ metadata.gz: 8d937f702b24f432fa7a241bd2fdd4f01a6119f6da79f98f1efd3e5f726cba22
4
+ data.tar.gz: 297733864622a5a0032918a9c6d83bac21e90df4b141c5898e7309a248cb1982
5
5
  SHA512:
6
- metadata.gz: 46c2d5c8833632e28692a834c664a3947e21f8a0049133b99b409282eecaafa7d4e2ce2b6247e24bd625d8924f80634f6343c2013ce1b73789fcdd631ecd7075
7
- data.tar.gz: 79fc6300bf5e09df01a0cfce23aca9514d58e571f222a0843f9e68c948a48550add600eb75fd429eefeccaeb81d48ca95cb3da2ee7f66fcb3eed3b28e962e903
6
+ metadata.gz: e6bb5da0e65a04f60292ee4b74184e02081571eaf942c915eb239a9b98b7bb9f420d7a4da0b2fbacb9f370fb0769b2336deee1686fe250c5793953fe7ba8ed41
7
+ data.tar.gz: 6c1a3721ed8a8d41bc65583812a9abafeacf251dba910867b3567addb412c646237f64c68971a0cbc87e38f0abdaaeb8b652139c9f0b8a412e92dfae9c4e5609
data/.circleci/config.yml CHANGED
@@ -1,21 +1,23 @@
1
1
  version: 2.1
2
2
  orbs:
3
- ruby: circleci/ruby@0.1.2
3
+ ruby: circleci/ruby@2.0.0
4
4
 
5
5
  jobs:
6
6
  build:
7
7
  docker:
8
- - image: circleci/ruby:2.6.3-stretch-node
9
- executor: ruby/default
8
+ - image: cimg/ruby:3.1.2
9
+
10
+ working_directory: ~/repo
11
+
10
12
  steps:
11
13
  - checkout
12
14
  - run:
13
- name: Which bundler?
14
- command: bundle -v
15
- - ruby/bundle-install
16
- test:
17
- executor: ruby/default
18
- steps:
15
+ name: install dependencies
16
+ command: |
17
+ bundle install --jobs=4 --retry=3 --path vendor/bundle
18
+
19
+ # run tests!
19
20
  - run:
20
- name: Uspec tests
21
- command: bundle exec uspec
21
+ name: run tests
22
+ command:
23
+ bundle exec uspec
data/.gitignore CHANGED
@@ -15,3 +15,6 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+
19
+ tags
20
+ TAGS
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.3.7
1
+ 3.3.0
data/README.markdown CHANGED
@@ -24,7 +24,7 @@ This also means *no monkey patching* core classes!
24
24
  Uspec's output is in beautiful ansi technicolor,
25
25
  with red for failures, green for successes, and yellow for pending specs. Here's a screenshot:
26
26
 
27
- ![Screenshot!](http://i.imgur.com/M2F5YvO.png)
27
+ ![Screenshot!](https://i.imgur.com/Baqggck.png)
28
28
 
29
29
  Uspec is tiny, painless, and easy to use. Download it and give it a try!
30
30
 
@@ -90,7 +90,7 @@ A brief explanation of `uspec`'s output to show you what it can do!
90
90
 
91
91
  ### Success
92
92
 
93
- If a spec passes:
93
+ If a spec passes (returns true):
94
94
 
95
95
  ```
96
96
  -- AwesomeMcCoolname.generate creates a cool name: true
@@ -98,7 +98,7 @@ If a spec passes:
98
98
 
99
99
  ### Failure
100
100
 
101
- If a spec fails:
101
+ If a spec fails (returns false):
102
102
 
103
103
  ```
104
104
  -- AwesomeMcCoolname.generate creates a cool name: false
@@ -106,13 +106,13 @@ If a spec fails:
106
106
 
107
107
  ### Exception
108
108
 
109
- If the spec throws an error:
109
+ If the spec encounters an error (raises an Exception):
110
110
 
111
111
  ```
112
112
  -- AwesomeMcCoolname.generate creates a cool name: Exception
113
113
 
114
114
  Encountered an Exception while running spec
115
- at uspec/awesome_mc_coolname_spec.rb:3: in `<main>'
115
+ in spec at uspec/awesome_mc_coolname_spec.rb:3: in `<main>'
116
116
 
117
117
  RuntimeError < StandardError: 'wtf'
118
118
 
@@ -130,13 +130,13 @@ spec 'AwesomeMcCoolname.generate creates a cool name' do
130
130
  end
131
131
  ```
132
132
 
133
- Then Uspec will let you know:
133
+ Then Uspec will let you know so you can debug it:
134
134
 
135
135
  ```ruby
136
- -- AwesomeMcCoolname.generate creates a badass name: Unknown Result
136
+ -- AwesomeMcCoolname.generate creates a badass name: Failed
137
137
 
138
138
  Spec did not return a boolean value
139
- at uspec/awesome_mc_coolname_spec.rb:6: in `<main>'
139
+ in spec at uspec/awesome_mc_coolname_spec.rb:6: in `<main>'
140
140
 
141
141
  Integer < Numeric: 5
142
142
  ```
@@ -206,45 +206,6 @@ Mocks, Spies, Stubs, and More!
206
206
 
207
207
  Since `uspec` is a very straight forward testing utility it is easy to use any of the standard Ruby mocking frameworks with it. However, the [Impasta gem](https://github.com/acook/impasta) was made specifically for simple but comprehensive mocking, stubbing, and spying.
208
208
 
209
- Assertions & Debugging
210
- ----------------------
211
-
212
- You can also use `uspec` to track assertions in an application or any object you want. Every spec block you use will be tracked and recorded. It's really no problem at all to do.
213
-
214
- You can load Uspec's features directly into a class and use its DSL:
215
-
216
- ```ruby
217
- require 'uspec'
218
-
219
- class MyFoo
220
- extend Uspec::DSL
221
-
222
- def assert
223
- spec 'foo is valid' do
224
- false
225
- end
226
- end
227
- end
228
-
229
- MyFoo.new.assert
230
- ```
231
-
232
- Assertions will be displayed as they occur, success or failure along with any informative output.
233
- If there are any specs that fail, when your application exits its error code will equal the number of failures.
234
-
235
- ```
236
- $ ruby foo.rb
237
- -- foo is valid: false
238
- $ echo $?
239
- 1
240
- ```
241
-
242
- Uspec is just Ruby
243
- ------------------
244
-
245
- If for some reason you don't want to use the `uspec` command, you can `require 'uspec'` and `extend Uspec::DSL`.
246
- From there you can just run the file with ruby: `ruby my_test_spec.rb`
247
-
248
209
  Contributing
249
210
  ------------
250
211
 
@@ -257,4 +218,4 @@ Contributing
257
218
  Author
258
219
  ------
259
220
 
260
- > Anthony M. Cook 2013-2020
221
+ > Anthony M. Cook 2013-2021
data/lib/uspec/dsl.rb CHANGED
@@ -2,6 +2,10 @@ require_relative "result"
2
2
 
3
3
  module Uspec
4
4
  class DSL
5
+ USPEC_CLI_BLOCK = -> { @__uspec_dsl.__uspec_cli }
6
+ USPEC_STAT_BLOCK = -> { @__uspec_dsl.__uspec_cli.stats }
7
+ USPEC_SPEC_BLOCK = ->(description, &block) { @__uspec_dsl.spec description, &block }
8
+
5
9
  def initialize cli
6
10
  @__uspec_cli = cli
7
11
  end
@@ -14,32 +18,49 @@ module Uspec
14
18
  @__uspec_cli.stats
15
19
  end
16
20
 
17
- def spec description
21
+ def __uspec_eval block
22
+ o = Object.new
23
+ o.define_singleton_method :__uspec_stats, USPEC_STAT_BLOCK
24
+ o.define_singleton_method :__uspec_cli, USPEC_CLI_BLOCK
25
+ o.instance_variable_set :@__uspec_cli, @__uspec_cli
26
+ o.instance_variable_set :@__uspec_dsl, self
27
+ o.define_singleton_method :spec, USPEC_SPEC_BLOCK
28
+ o.define_singleton_method :spec_block, &block
29
+ o.spec_block
30
+ end
31
+
32
+ def spec description, &block
33
+ state = 0
18
34
  print ' -- ', description
19
35
 
20
- if block_given? then
36
+ if block then
21
37
  begin
22
- raw_result = yield
38
+ state = 1
39
+ raw_result = __uspec_eval block
40
+ state = 2
23
41
  rescue Exception => raw_result
42
+ state = 3
24
43
  end
25
44
  end
26
45
 
27
46
  result = Result.new description, raw_result, caller
28
47
 
29
- unless block_given? then
48
+ unless block then
49
+ state = 4
30
50
  result.pending!
31
51
  end
32
52
 
33
53
  if result.success?
34
54
  __uspec_stats.success << result
35
55
  elsif result.pending?
36
- stats.pending << result
56
+ __uspec_stats.pending << result
37
57
  else
38
58
  __uspec_stats.failure << result
39
59
  end
40
60
 
41
61
  print ': ', result.pretty, "\n"
42
62
  rescue => error
63
+ state = 5
43
64
  message = <<-MSG
44
65
  #{error.class} : #{error.message}
45
66
 
@@ -50,6 +71,8 @@ module Uspec
50
71
  puts
51
72
  warn message
52
73
  __uspec_stats.failure << Uspec::Result.new(message, error, caller)
74
+ ensure
75
+ return [state, error, result, raw_result]
53
76
  end
54
77
  end
55
78
  end
data/lib/uspec/result.rb CHANGED
@@ -5,6 +5,8 @@ module Uspec
5
5
  class Result
6
6
  include Terminal
7
7
 
8
+ PREFIX = "#{Terminal.newline}#{Terminal.yellow}>\t#{Terminal.normal}"
9
+
8
10
  def initialize spec, raw, source
9
11
  @spec = spec
10
12
  @raw = raw
@@ -33,7 +35,7 @@ module Uspec
33
35
  red('Failed'), vspace,
34
36
  hspace, 'Spec did not return a boolean value ', newline,
35
37
  hspace, 'in spec at ', source.first, vspace,
36
- hspace, red(subklassinfo), inspector, newline
38
+ hspace, red(subklassinfo), inspector, (Class === raw ? ' Class' : ''), newline
37
39
  ].join
38
40
  end
39
41
  end
@@ -56,11 +58,9 @@ module Uspec
56
58
  def inspector
57
59
  if String === raw && raw.include?(?\n) then
58
60
  # if object is a multiline string, display it unescaped
61
+
59
62
  [
60
- vspace,
61
- hspace, yellow('"""'), newline,
62
- raw, normal, newline,
63
- hspace, yellow('"""')
63
+ raw.split(newline).unshift(newline).join(PREFIX), normal, newline,
64
64
  ].join
65
65
  else
66
66
  handler.inspector!
data/lib/uspec/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Uspec
2
- VERSION = '1.0.1'
2
+ VERSION = '1.1.0'
3
3
  end
data/uspec/cli_spec.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require_relative 'uspec_helper'
2
- require 'open3'
3
2
 
4
3
  spec 'shows usage' do
5
4
  output = capture do
@@ -9,6 +8,8 @@ spec 'shows usage' do
9
8
  output.include? 'usage'
10
9
  end
11
10
 
11
+ spec 'pending test doesn\'t crash'
12
+
12
13
  spec 'runs a path of specs' do
13
14
  output = capture do
14
15
  path = Pathname.new(__FILE__).parent.parent.join('example_specs').to_s
@@ -0,0 +1,21 @@
1
+ require_relative "uspec_helper"
2
+
3
+ spec 'when return used in spec, capture it as an error' do
4
+ path = Pathname.new(__FILE__).parent.join('test_specs', 'return_spec')
5
+
6
+ output = capture do
7
+ exec "bin/uspec #{path}"
8
+ end
9
+
10
+ output.include?('Invalid return') || output.include?('Spec did not return a boolean value') || output
11
+ end
12
+
13
+ spec 'when break used in spec, capture it as an error' do
14
+ path = Pathname.new(__FILE__).parent.join('test_specs', 'break_spec')
15
+
16
+ output = capture do
17
+ exec "bin/uspec #{path}"
18
+ end
19
+
20
+ output.include?('Invalid break') || output.include?('Spec did not return a boolean value') || output
21
+ end
data/uspec/result_spec.rb CHANGED
@@ -13,7 +13,7 @@ end
13
13
  class ::TestObject < BasicObject; end
14
14
  obj = TestObject.new
15
15
 
16
- spec "ensure BasicObject subclasses work" do
16
+ spec "ensure BasicObject subclass instances work" do
17
17
  result = Uspec::Result.new "BasicObject Subclass Result", obj, []
18
18
  expected = "#<BasicObject/TestObject:"
19
19
  actual = result.pretty
@@ -22,7 +22,7 @@ end
22
22
 
23
23
  spec "display basic info about Object" do
24
24
  result = Uspec::Result.new "Object Result", Object.new, []
25
- expected = "Object < BasicObject"
25
+ expected = "Object < BasicObject: \e[0m#<Object:"
26
26
  actual = result.pretty
27
27
  actual.include?(expected) || result.pretty
28
28
  end
@@ -36,8 +36,7 @@ end
36
36
 
37
37
  spec "display basic info about Array class" do
38
38
  result = Uspec::Result.new "Array Class Result", Array, []
39
- #expected = "Class < ???" # TODO: Make classes display nicer in TOISB
40
- expected = "#<Class:Object> < #<Class:BasicObject>: \e[0mArray"
39
+ expected = "Class < Module: \e[0mArray Class"
41
40
  actual = result.pretty
42
41
  actual.include?(expected) || result.pretty
43
42
  end
@@ -62,9 +61,9 @@ spec "display a useful error message when a user-defined inspect method fails" d
62
61
  end
63
62
 
64
63
  spec "display strings more like their actual contents" do
65
- expected = "this string:\nshould display \e[42;2mproperly"
66
- result = Uspec::Result.new "Inspect Fail Result", expected, []
64
+ string = "this string:\nshould display \e\[42;2mproperly"
65
+ expected = /this string:\n.*should display \e\[42;2mproperly/
66
+ result = Uspec::Result.new "Inspect Fail Result", string, []
67
67
  actual = result.pretty
68
- actual.include?(expected) || result.inspector
68
+ actual.match?(expected) || result.inspector
69
69
  end
70
-
@@ -0,0 +1,3 @@
1
+ spec "break spec" do
2
+ break 12345
3
+ end
@@ -0,0 +1,6 @@
1
+
2
+ require_relative "../uspec_helper"
3
+
4
+ spec "why is this broken??"
5
+
6
+
@@ -0,0 +1,3 @@
1
+ spec "return spec" do
2
+ return 12345
3
+ end
@@ -0,0 +1,3 @@
1
+ spec 'non-boolean value spec' do
2
+ "abcdef"
3
+ end
@@ -1,3 +1,5 @@
1
+ require 'pry'
2
+
1
3
  require_relative '../lib/uspec'
2
4
  extend Uspec
3
5
 
@@ -17,4 +19,3 @@ def capture
17
19
 
18
20
  output
19
21
  end
20
-
data/uspec/uspec_spec.rb CHANGED
@@ -7,7 +7,7 @@ spec 'catches errors' do
7
7
  end
8
8
  end
9
9
 
10
- output.include? 'Exception'
10
+ output.include?('Exception') || output
11
11
  end
12
12
 
13
13
  spec 'catches even non-StandardError-subclass exceptions' do
@@ -17,7 +17,7 @@ spec 'catches even non-StandardError-subclass exceptions' do
17
17
  end
18
18
  end
19
19
 
20
- output.include? 'Exception'
20
+ output.include?('Exception') || output
21
21
  end
22
22
 
23
23
  spec 'complains when spec block returns non boolean' do
@@ -27,7 +27,7 @@ spec 'complains when spec block returns non boolean' do
27
27
  end
28
28
  end
29
29
 
30
- output.include? 'Failed'
30
+ output.include?('Failed') || output
31
31
  end
32
32
 
33
33
  spec 'marks test as pending when no block supplied' do
@@ -35,7 +35,7 @@ spec 'marks test as pending when no block supplied' do
35
35
  spec 'pending test'
36
36
  end
37
37
 
38
- output.include? 'pending'
38
+ output.include?('pending') || output
39
39
  end
40
40
 
41
41
  spec 'should not define DSL methods on arbitrary objects' do
@@ -57,11 +57,11 @@ spec 'exit code is the number of failures' do
57
57
  end
58
58
  actual = $?.exitstatus
59
59
 
60
- actual == expected || puts("", output) || $?
60
+ actual == expected || output
61
61
  end
62
62
 
63
- spec 'if more than 255 failures, exit status is 255' do
64
- capture do
63
+ spec 'when more than 255 failures, exit status is 255' do
64
+ output = capture do
65
65
  __uspec_stats.clear_results! # because we're forking, we will have a copy of the current results
66
66
 
67
67
  500.times do
@@ -73,5 +73,5 @@ spec 'if more than 255 failures, exit status is 255' do
73
73
  exit __uspec_cli.exit_code
74
74
  end
75
75
 
76
- $?.exitstatus == 255 || $?
76
+ $?.exitstatus == 255 || [$?, output]
77
77
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anthony M. Cook
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-25 00:00:00.000000000 Z
11
+ date: 2024-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: that_object_is_so_basic
@@ -84,15 +84,20 @@ files:
84
84
  - lib/uspec/version.rb
85
85
  - uspec.gemspec
86
86
  - uspec/cli_spec.rb
87
+ - uspec/jump_spec.rb
87
88
  - uspec/result_spec.rb
89
+ - uspec/test_specs/break_spec
88
90
  - uspec/test_specs/broken_require_spec
91
+ - uspec/test_specs/pending_spec
92
+ - uspec/test_specs/return_spec
93
+ - uspec/test_specs/value_spec
89
94
  - uspec/uspec_helper.rb
90
95
  - uspec/uspec_spec.rb
91
96
  homepage: http://github.com/acook/uspec#readme
92
97
  licenses:
93
98
  - MIT
94
99
  metadata: {}
95
- post_install_message:
100
+ post_install_message:
96
101
  rdoc_options: []
97
102
  require_paths:
98
103
  - lib
@@ -107,8 +112,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
112
  - !ruby/object:Gem::Version
108
113
  version: '0'
109
114
  requirements: []
110
- rubygems_version: 3.0.4
111
- signing_key:
115
+ rubygems_version: 3.5.3
116
+ signing_key:
112
117
  specification_version: 4
113
118
  summary: a shiny little spec framework for your apps!
114
119
  test_files: []