uspec 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f6a6363a2a59ed141811ddbd906b6a47a1494a0b
4
+ data.tar.gz: 5d21b182f77d0d4101d4a4236775e527aa05972d
5
+ SHA512:
6
+ metadata.gz: 28cd24aed39ea930141a5f0e72ed86c02221610ab610d8b8359e46d4002898b578a554bbf903b5f524e9552edf441f559ce004c356b4abd259215d3720f8df6b
7
+ data.tar.gz: e54033546d92f8f89651e49df226c293d973952d77d4fd6d9bda32fb3f8f876d6d54cd14e7f7306ca266f6d83d9812f3d7ca9d036c8a7e3baa8fa25e5549df56
@@ -0,0 +1 @@
1
+ uspec
@@ -0,0 +1 @@
1
+ ruby-2.2.3
@@ -1,11 +1,23 @@
1
1
  language: ruby
2
+
2
3
  rvm:
4
+ - 2.2.3
5
+ - 2.0.0
3
6
  - 1.9.3
4
7
  - 1.9.2
5
- - rbx-19mode
8
+
9
+ - jruby-19mode
6
10
  - ruby-head
7
- script: bundle exec ruby uspec/uspec_spec.rb
11
+
8
12
  before_install:
9
13
  - gem update bundler
10
14
  before_script:
11
15
  - bundle exec gem list
16
+ script: bundle exec uspec
17
+
18
+ matrix:
19
+ allow_failures:
20
+ - rvm: ruby-head
21
+ - rvm: jruby-19mode
22
+
23
+ sudo: false
@@ -3,34 +3,76 @@ Uspec
3
3
 
4
4
  Uspec is a shiny little testing framework for your apps!
5
5
 
6
- Anthony M. Cook 2013
7
-
8
6
  [![Build Status](https://travis-ci.org/acook/uspec.png?branch=master)](https://travis-ci.org/acook/uspec)
9
7
  [![Code Climate](https://codeclimate.com/github/acook/uspec.png)](https://codeclimate.com/github/acook/uspec)
10
- [![Still Maintained](http://stillmaintained.com/acook/uspec.png)](http://stillmaintained.com/acook/uspec)
11
8
 
12
9
  Philosophy / Why Uspec?
13
10
  -----------------------
14
11
 
15
- Unlike other testing frameworks there's no need for special matchers, there can only be one assertion per test, and you never have to worry that your tests lack assertions.
12
+ > Uspec is just Ruby!
13
+
14
+ Unlike other testing frameworks there's no need for special matchers,
15
+ there can only be one assertion per test,
16
+ and you never have to worry that your tests lack assertions.
17
+
18
+ That's because when the `spec` block is evaluated the return value is used (in a very ruby-like way)
19
+ to determine the validity of the statement. Standard Ruby comparisons are your friend!
20
+ No more digging around in your test framework's documentation to figure out what matcher you're supposed to use.
21
+ This also means *no monkey patching* core classes!
22
+
23
+ Uspec's output is in beautiful ansi technicolor,
24
+ with red for failures, green for successes, and yellow for pending specs. Here's a screenshot:
25
+
26
+ ![Screenshot!](http://i.imgur.com/M2F5YvO.png)
27
+
28
+ Uspec is tiny, painless, and easy to use. Download it and give it a shot. :)
29
+
30
+ Installation
31
+ ------------
32
+
33
+ Add this line to your application's Gemfile:
34
+
35
+ gem 'uspec'
36
+
37
+ And then execute:
38
+
39
+ $ bundle
40
+
41
+ Or install it yourself as:
42
+
43
+ $ gem install uspec
44
+
45
+
46
+ Quickstart
47
+ ----------
16
48
 
17
- That's because when the `spec` block is evaluated the return value is used (in a very ruby-like way) to determine the validity of the statement. Standard Ruby comparisons are your friend! No more digging around in your test framework's documentation to figure out what matcher you're supposed to use.
49
+ 0. Create a `spec` directory to keep your specs in.
50
+ 1. Name your specs ending with `_spec.rb`.
51
+ 2. Write some specs in Ruby using the `spec` method.
52
+ 2. Use the included `uspec` executable to run your specs.
18
53
 
19
- You can't tell here in the docs, but Uspec's output is in beautiful ansi technicolor, with red for failures, green for successes, and yellow for pending specs. Download it and give it a show, its painless and uber easy to use. :)
54
+ **Hint:** A lot of people also put `require_relative 'spec_helper'` in their tests for global start up code.
20
55
 
21
56
  Usage
22
57
  -----
23
58
 
24
- I suggest creating a `uspec` directory in your project folder to put your specs in. Then you'll need this incantation:
25
-
26
- ```ruby
27
- require 'uspec'
28
- extend Uspec
59
+ ```
60
+ $ uspec --help
61
+ uspec - minimalistic ruby testing framework
62
+ usage: uspec [<file_or_path>...]
29
63
  ```
30
64
 
31
- You can slot it in the top of your test file, or if you have other setup code you can put it in a `uspec_helper.rb` and `relative_require 'uspec_helper'` in them instead.
65
+ - Without arguments the `uspec` command will automatially look for `spec` directories and load any `*_spec.rb` files inside them.
66
+ - You can also pass in arbitrary files and it will attempt to run them as specs.
67
+ - If you pass in directories `uspec` will find and run any specs inside them.
68
+ - Uspec will return `0` if all specs pass and `255` if any fail.
69
+
70
+ Syntax
71
+ ------
32
72
 
33
- Then all you have to do is put in your specs:
73
+ Uspec is **just Ruby**. The DSL is minimal - there's only one method to remember!
74
+
75
+ Writing a spec is easy:
34
76
 
35
77
  ```ruby
36
78
  spec 'AwesomeMcCoolname.generate creates a cool name' do
@@ -38,19 +80,32 @@ spec 'AwesomeMcCoolname.generate creates a cool name' do
38
80
  end
39
81
  ```
40
82
 
41
- If it passes:
83
+ That's it!
84
+
85
+ Output
86
+ ------
87
+
88
+ Examples of Uspec's output below!
89
+
90
+ ### Success
91
+
92
+ If a spec passes:
42
93
 
43
94
  ```
44
95
  -- AwesomeMcCoolname.generate creates a cool name: true
45
96
  ```
46
97
 
47
- If it fails:
98
+ ### Failure
99
+
100
+ If a spec fails:
48
101
 
49
102
  ```
50
103
  -- AwesomeMcCoolname.generate creates a cool name: false
51
104
  ```
52
105
 
53
- If it throws an error:
106
+ ### Exception
107
+
108
+ If the spec throws an error:
54
109
 
55
110
  ```
56
111
  -- AwesomeMcCoolname.generate creates a cool name: Exception
@@ -64,6 +119,8 @@ If it throws an error:
64
119
  uspec/awesome_mc_coolname_spec.rb:4:in `block in <main>'
65
120
  ```
66
121
 
122
+ ### Non-boolean values
123
+
67
124
  If you create a spec that doesn't return a boolean value (`nil` doesn't count either!) like this:
68
125
 
69
126
  ```ruby
@@ -83,7 +140,28 @@ Then Uspec will let you know:
83
140
  Integer < Numeric: 5
84
141
  ```
85
142
 
86
- Instead of `=~` (which returns either index or nil) Ruby has the nifty `include?` method, which returns a boolean:
143
+ ### Pending
144
+
145
+ If you aren't ready to fill out a spec, maybe as a reminder to add functionality later, just leave off the block and it will be marked as `pending`:
146
+
147
+ ```ruby
148
+ spec 'a feature I have not implemented yet'
149
+ ```
150
+
151
+ When you run the test Uspec will helpfully display:
152
+
153
+ ```
154
+ -- a feature I have not implemented yet: pending
155
+ ```
156
+
157
+ Tips & Tricks
158
+ -------------
159
+
160
+ Because there's no matchers and only one method there's no reference documentation to look at, so here are some ideas to get you going!
161
+
162
+ ### String matching
163
+
164
+ Instead of `=~` (which returns either an `Integer` index or `nil`) Ruby has the nifty `include?` method, which returns a boolean:
87
165
 
88
166
  ```ruby
89
167
  spec 'AwesomeMcCoolname.generate creates a cool name' do
@@ -91,6 +169,8 @@ spec 'AwesomeMcCoolname.generate creates a cool name' do
91
169
  end
92
170
  ```
93
171
 
172
+ ### Regex matching
173
+
94
174
  If you really need to regex, you can always use Ruby's `!!` idiom to coerce a boolean out of any result,
95
175
  but its more precise to specify the index if you know it.
96
176
  And you can always toss in an `||` to drop in more information if a comparison fails too:
@@ -102,17 +182,7 @@ spec 'AwesomeMcCoolname.generate creates a cool name' do
102
182
  end
103
183
  ```
104
184
 
105
- If you aren't ready to fill out a spec, maybe as a reminder to add functionality later, just leave off the block and it will be marked as `pending`:
106
-
107
- ```ruby
108
- spec 'a feature I have not implemented yet'
109
- ```
110
-
111
- When you run the test Uspec will helpfully display:
112
-
113
- ```
114
- -- a feature I have not implemented yet: pending
115
- ```
185
+ ### Exceptions
116
186
 
117
187
  What if you want to test that an error has occured? Just use Ruby!
118
188
 
@@ -130,20 +200,43 @@ If there's no error, then Uspec will see the result of the method call (whatever
130
200
  If the wrong Exception is raised, then because of reraising (by just calling `raise` without parameters),
131
201
  Ruby will dutifully pass along the error for Uspec to display.
132
202
 
133
- Installation
134
- ------------
203
+ Assertions & Debugging
204
+ ----------------------
135
205
 
136
- Add this line to your application's Gemfile:
206
+ 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.
137
207
 
138
- gem 'uspec'
208
+ You can load Uspec's features directly into a class and use its DSL:
139
209
 
140
- And then execute:
210
+ ```ruby
211
+ require 'uspec'
141
212
 
142
- $ bundle
213
+ class MyFoo
214
+ extend Uspec::DSL
215
+
216
+ def assert
217
+ spec 'foo is valid' do
218
+ false
219
+ end
220
+ end
221
+ end
143
222
 
144
- Or install it yourself as:
223
+ MyFoo.new.assert
224
+ ```
145
225
 
146
- $ gem install uspec
226
+ If there are any specs that fail, your application will exit with a `255``.
227
+
228
+ ```
229
+ $ ruby foo.rb
230
+ -- foo is valid: false
231
+ $ echo $?
232
+ 255
233
+ ```
234
+
235
+ Uspec is just Ruby
236
+ ------------------
237
+
238
+ If for some reason you don't want to use the `uspec` command, you can `require 'uspec'` and `extend Uspec::DSL`.
239
+ From there you can just run the file with ruby: `ruby my_test_spec.rb`
147
240
 
148
241
  Contributing
149
242
  ------------
@@ -153,3 +246,8 @@ Contributing
153
246
  3. Commit your changes (`git commit -am 'Add some feature'`)
154
247
  4. Push to the branch (`git push origin my-new-feature`)
155
248
  5. Create new Pull Request
249
+
250
+ Author
251
+ ------
252
+
253
+ > Anthony M. Cook 2013-2016
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/uspec/exec'
4
+
5
+ if (ARGV & %w{-h --help -? /? /help}).empty? then
6
+ Uspec::Exec.run_specs ARGV
7
+ else
8
+ Uspec::Exec.usage
9
+ end
@@ -6,7 +6,7 @@ require_relative 'uspec/stats'
6
6
  module Uspec
7
7
  def self.included object
8
8
  warn 'Use extend instead of include.'
9
- exit
9
+ exit 2
10
10
  end
11
11
 
12
12
  def self.extended object
@@ -1,5 +1,6 @@
1
1
  module Uspec
2
2
  module DSL
3
+ module_function
3
4
  def spec description
4
5
  formatter = Uspec::Formatter.new
5
6
 
@@ -0,0 +1,51 @@
1
+ require 'pathname'
2
+ require_relative '../uspec'
3
+
4
+ class Uspec::Exec
5
+ class << self
6
+ def usage
7
+ warn "uspec - minimalistic ruby testing framework"
8
+ warn "usage: #{File.basename $0} [<file_or_path>...]"
9
+ end
10
+
11
+ def run_specs paths
12
+ uspec_exec = self.new paths
13
+ uspec_exec.run_paths
14
+ end
15
+ end
16
+
17
+ def initialize paths
18
+ @paths = paths
19
+ @pwd = Pathname.pwd.freeze
20
+ end
21
+
22
+ def paths
23
+ if @paths.empty? then
24
+ ['spec', 'uspec', 'test'].each do |path|
25
+ @paths << path if Pathname.new(path).directory?
26
+ end
27
+ end
28
+
29
+ @paths
30
+ end
31
+
32
+ def run_paths
33
+ paths.each do |path|
34
+ run @pwd.join path
35
+ end
36
+ end
37
+
38
+ def run path
39
+ if path.directory? then
40
+ Pathname.glob(path.join('**', '**_spec.rb')).each do |spec|
41
+ run spec
42
+ end
43
+ elsif path.exist? then
44
+ puts "#{path.basename path.extname}:"
45
+ Uspec::DSL.instance_eval(path.read, path.to_s)
46
+ else
47
+ warn "path not found: #{path}"
48
+ end
49
+ end
50
+
51
+ end
@@ -14,7 +14,8 @@ module Uspec
14
14
  end
15
15
 
16
16
  def exit_code
17
- results.all?{|result| result == true} ? 0 : 255
17
+ failures = results.count{|result| !result }
18
+ failures > 255 ? 255 : failures
18
19
  end
19
20
  end
20
21
  end
@@ -1,3 +1,3 @@
1
1
  module Uspec
2
- VERSION = '0.0.3'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -0,0 +1,27 @@
1
+ require_relative 'uspec_helper'
2
+
3
+ spec 'shows usage' do
4
+ output = capture do
5
+ exec 'bin/uspec -h'
6
+ end
7
+
8
+ output.include? 'usage'
9
+ end
10
+
11
+ spec 'runs a path of specs' do
12
+ output = capture do
13
+ path = Pathname.new(__FILE__).parent.parent.join('example_specs').to_s
14
+ Uspec::Exec.run_specs Array(path)
15
+ end
16
+
17
+ output.include? 'I love passing tests'
18
+ end
19
+
20
+ spec 'runs an individual spec' do
21
+ output = capture do
22
+ path = Pathname.new(__FILE__).parent.parent.join('example_specs', 'example_spec.rb').to_s
23
+ Uspec::Exec.run_specs Array(path)
24
+ end
25
+
26
+ output.include? 'I love passing tests'
27
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../lib/uspec'
2
+ extend Uspec
3
+
4
+ def capture
5
+ readme, writeme = IO.pipe
6
+ pid = fork do
7
+ $stdout.reopen writeme
8
+ $stderr.reopen writeme
9
+ readme.close
10
+
11
+ yield
12
+ end
13
+
14
+ writeme.close
15
+ output = readme.read
16
+ Process.waitpid(pid)
17
+
18
+ output
19
+ end
20
+
@@ -1,21 +1,4 @@
1
- require_relative '../lib/uspec'
2
- extend Uspec
3
-
4
- def capture
5
- readme, writeme = IO.pipe
6
- pid = fork do
7
- $stdout.reopen writeme
8
- readme.close
9
-
10
- yield
11
- end
12
-
13
- writeme.close
14
- output = readme.read
15
- Process.waitpid(pid)
16
-
17
- output
18
- end
1
+ require_relative 'uspec_helper'
19
2
 
20
3
  spec 'catches errors' do
21
4
  output = capture do
@@ -48,3 +31,27 @@ end
48
31
  spec 'should not define DSL methods on arbitrary objects' do
49
32
  !(Array.respond_to? :spec)
50
33
  end
34
+
35
+ spec 'exit code is the number of failures' do
36
+ capture do
37
+ 50.times do
38
+ spec 'fail' do
39
+ false
40
+ end
41
+ end
42
+ end
43
+
44
+ $?.exitstatus == 50 || $?
45
+ end
46
+
47
+ spec 'if more than 255 failures, exit status is 255' do
48
+ capture do
49
+ 500.times do
50
+ spec 'fail' do
51
+ false
52
+ end
53
+ end
54
+ end
55
+
56
+ $?.exitstatus == 255 || $?
57
+ end
metadata CHANGED
@@ -1,62 +1,68 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Anthony Cook
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-08 00:00:00.000000000 Z
11
+ date: 2016-12-22 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: Uspec is a shiny little spec framework for your apps! Unlike other testing
15
14
  frameworks there's no need for matchers, there can only be one assertion per test,
16
15
  and you never have to worry that your tests lack assertions.
17
16
  email:
18
17
  - anthonymichaelcook@gmail.com
19
- executables: []
18
+ executables:
19
+ - uspec
20
20
  extensions: []
21
21
  extra_rdoc_files: []
22
22
  files:
23
- - .gitignore
24
- - .travis.yml
23
+ - ".gitignore"
24
+ - ".ruby-gemset"
25
+ - ".ruby-version"
26
+ - ".travis.yml"
25
27
  - Gemfile
26
28
  - LICENSE.txt
27
29
  - README.markdown
28
30
  - Rakefile
31
+ - bin/uspec
29
32
  - example_specs/example_spec.rb
30
33
  - example_specs/spec_helper.rb
31
34
  - lib/uspec.rb
32
35
  - lib/uspec/dsl.rb
36
+ - lib/uspec/exec.rb
33
37
  - lib/uspec/formatter.rb
34
38
  - lib/uspec/stats.rb
35
39
  - lib/uspec/version.rb
36
40
  - uspec.gemspec
41
+ - uspec/exec_spec.rb
42
+ - uspec/uspec_helper.rb
37
43
  - uspec/uspec_spec.rb
38
44
  homepage: http://github.com/acook/uspec#readme
39
45
  licenses: []
46
+ metadata: {}
40
47
  post_install_message:
41
48
  rdoc_options: []
42
49
  require_paths:
43
50
  - lib
44
51
  required_ruby_version: !ruby/object:Gem::Requirement
45
- none: false
46
52
  requirements:
47
- - - ! '>='
53
+ - - ">="
48
54
  - !ruby/object:Gem::Version
49
55
  version: '0'
50
56
  required_rubygems_version: !ruby/object:Gem::Requirement
51
- none: false
52
57
  requirements:
53
- - - ! '>='
58
+ - - ">="
54
59
  - !ruby/object:Gem::Version
55
60
  version: '0'
56
61
  requirements: []
57
62
  rubyforge_project:
58
- rubygems_version: 1.8.25
63
+ rubygems_version: 2.6.8
59
64
  signing_key:
60
- specification_version: 3
65
+ specification_version: 4
61
66
  summary: a shiny little spec framework for your apps!
62
67
  test_files: []
68
+ has_rdoc: