m-spec 0.1.8 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ce2fb3d3541770936da294b63f3815faea69904333bc06c63403ad76a25dfe7
4
- data.tar.gz: 3ae0e86750afbb3458fd8f33cdac13c1ae72ac5a6f771de746e5967a963a7bb2
3
+ metadata.gz: f055e58c3c0edff2cede566c4eb387246d69b4ee536773ad95addb2b52e6074b
4
+ data.tar.gz: 58c017bc787dbeefc2411e4131b0681ca1be035ec1bc1d0c9b08765d1e010588
5
5
  SHA512:
6
- metadata.gz: fe13e5509c611618d7e215c77e799a44f3bc4939afe92e7d09de5404000e7e1bae2af3839f2760dd0d9c43ecf9fb610a057d84878d373d64c3586b864d926783
7
- data.tar.gz: 8bed6188d906066b77d945d0e296320febf31488266661ef04994a737a51230db3a5394a0461231047a2c9d7576ca4344a28d728c5d932a8f9ba478c2346b976
6
+ metadata.gz: 2a4861aebb496805aa16426fa16c6d1fb0fd1f555aa2118946eb03ee5227eece185f0e528eb4433cd9ce81d64bd3c61ccfc0e1bb581d253b9fb6a1b1a5ceba03
7
+ data.tar.gz: '082a188d2374df2fb7af946b27e346828b26990166edd2dfbf655ed300dd1d2910559adcaff0f6cb71dc350e8ce7d11bc6c2e85b60dca9f6e8d04ad5b106bd21'
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Mspec
2
2
 
3
- The lightest-weight spec framework in ruby. Built for learning at [Makers](https://makers.tech). You have one matcher, the comparison matcher, and test setup and teardown is your responsibility. For additional features, you must extend the gem.
3
+ The lightest-weight spec framework in ruby. Built for learning at [Makers](https://makers.tech). You have two matchers, an equality matcher and an output matcher, and test setup and teardown is your responsibility. For additional features, you must extend the gem.
4
4
 
5
5
  ## Installation
6
6
 
@@ -43,19 +43,32 @@ describe 'The Animal' do
43
43
  end
44
44
  end
45
45
 
46
- describe 'stubbing' do
47
- it 'we can mock too!' do
46
+ describe 'test doubles' do
47
+ it 'can be stubbed' do
48
48
  mock = test_double
49
49
  allow(mock).to receive(:speak) { 'Hello!' }
50
50
  expect(mock.speak).to eq 'Hello!'
51
51
  end
52
+ it 'can have optional names' do
53
+ mock = test_double('a name')
54
+ allow(mock).to receive(:speak) { 'Hello!' }
55
+ expect(mock.speak).to eq 'Hello!'
56
+ end
57
+ end
58
+
59
+ describe 'testing output' do
60
+ it 'captures strings' do
61
+ expect { puts('hello') }.to output("hello\n")
62
+ end
52
63
  end
53
64
  ```
54
65
 
55
- To run your specs, pass the spec file directly as an argument. You have to run individual spec files.
66
+ To run your specs, pass the spec file directly as an argument. You have to run individual spec files, or create a file that requires your specs.
56
67
 
57
68
  ```sh
58
69
  $ m-spec ./spec/animal_spec.rb
70
+ # or
71
+ $ m-spec ./spec_runner.rb
59
72
  ```
60
73
 
61
74
  ```
@@ -67,6 +80,11 @@ The Animal
67
80
  # /path/to/directory/spec/animal_spec.rb:11:in `block (2 levels) in <top (required)>'
68
81
  stubbing
69
82
  we can mock too!
83
+
84
+ Inspecting 3 files
85
+ ...
86
+
87
+ 3 files inspected, no offenses detected
70
88
  ```
71
89
 
72
90
  It's got simple one-level indentation, simple colour coding for test passes and failures, and simple failure messages with expected and actual values and the failing spec file path and line number.
data/exe/m-spec CHANGED
@@ -2,16 +2,33 @@
2
2
  require 'm-spec'
3
3
 
4
4
  def run_rubocop!
5
- config = "$GEM_HOME/gems/m-spec-#{Mspec::VERSION}/.rubocop.yml"
6
- system("bundle exec rubocop --config #{config}")
5
+ # needs default
6
+ if File.exists?('.rubocop.yml')
7
+ puts "\n---Readability Tests---\n\n"
8
+ system("bundle exec rubocop")
9
+ else
10
+ puts "ERROR: No '.rubocop.yml' found, please create one at your project root or re-initialize m-spec with `m-spec --init`"
11
+ end
7
12
  end
8
13
 
9
14
  def run_specs!
10
15
  spec_file = ARGV[0]
11
- require spec_file
16
+ Mspec::Specs.new(spec_file).run!
12
17
  end
13
18
 
14
- if File.exists?('./.m-spec')
19
+ if ARGV[0] == '--init'
20
+ contents = File.read("#{ENV['GEM_HOME']}/gems/m-spec-#{Mspec::VERSION}/.rubocop.yml")
21
+ File.open('.rubocop.yml', 'w') do |file|
22
+ file.write(contents)
23
+ end
24
+ puts 'created: .rubocop.yml'
25
+
26
+ contents = "# This has been auto-generated. Feel free to delete these comments.\n#\n# Try adding options below: '--no-rubocop' or '--only-rubocop' without the quotes."
27
+ File.open('.m-spec', 'w') do |file|
28
+ file.write(contents)
29
+ end
30
+ puts 'created: .m-spec'
31
+ elsif File.exists?('./.m-spec')
15
32
  File.open('./.m-spec', 'r') do |file|
16
33
  options = file.read.split
17
34
  if options.include?('--only-rubocop')
@@ -5,6 +5,8 @@ require "m-spec/version"
5
5
  require "m-spec/core/expect"
6
6
  require "m-spec/core/spec_error"
7
7
  require "m-spec/core/spec_result"
8
+ require "m-spec/core/spec_example"
9
+ require "m-spec/core/specs"
8
10
  require "m-spec/core/matchers/equal"
9
11
  require "m-spec/core/matchers/output"
10
12
  require "m-spec/core/helpers/readable"
@@ -9,16 +9,18 @@ def describe(str)
9
9
  yield
10
10
  end
11
11
 
12
- def it(str)
13
- spec_result = yield
14
- if spec_result.success?
12
+ def it(str, specs = Mspec::Specs.instance)
13
+ spec_example = Mspec::SpecExample.new(str, yield)
14
+ specs.add(spec_example)
15
+
16
+ if spec_example.success?
15
17
  puts " \e[#{COLOUR_CODES[:green]}m#{str}\e[0m"
16
18
  else
17
19
  puts " \e[#{COLOUR_CODES[:red]}m#{str}\e[0m"
18
- spec_result.failure_message.each do |line|
20
+ spec_example.failure_message.each do |line|
19
21
  puts " \e[#{COLOUR_CODES[:red]}m#{line}\e[0m"
20
22
  end
21
- puts " \e[#{COLOUR_CODES[:light_blue]}m# #{spec_result.trace}\e[0m"
23
+ puts " \e[#{COLOUR_CODES[:light_blue]}m# #{spec_example.trace}\e[0m"
22
24
  end
23
25
  end
24
26
 
@@ -0,0 +1,26 @@
1
+ module Mspec
2
+ class SpecExample
3
+ attr_reader :description, :result
4
+
5
+ def initialize(description, result)
6
+ @description = description
7
+ @result = result
8
+ end
9
+
10
+ def success?
11
+ @result.success?
12
+ end
13
+
14
+ def failure?
15
+ !success?
16
+ end
17
+
18
+ def failure_message
19
+ @result.failure_message
20
+ end
21
+
22
+ def trace
23
+ @result.trace
24
+ end
25
+ end
26
+ end
@@ -12,8 +12,8 @@ module Mspec
12
12
 
13
13
  def failure_message
14
14
  [
15
- "Expected: #{@expected_result.value.inspect}",
16
- "Got: #{test_code_result.inspect}",
15
+ "Expected: ".rjust(9) + "#{@expected_result.value.inspect}",
16
+ "Got: ".rjust(9) + "#{test_code_result.inspect}",
17
17
  ]
18
18
  end
19
19
 
@@ -0,0 +1,35 @@
1
+ module Mspec
2
+ class Specs
3
+ attr_reader :data
4
+
5
+ def initialize(file)
6
+ @file = file
7
+ @data = []
8
+ @@instance = self
9
+ end
10
+
11
+ def run!
12
+ require(@file)
13
+ summary
14
+ end
15
+
16
+ def add(spec)
17
+ @data << spec
18
+ end
19
+
20
+ def self.instance
21
+ @@instance
22
+ end
23
+
24
+ def summary
25
+ puts "\n---Summary---\n\n"
26
+ puts "#{@data.length} examples found"
27
+ failures = @data.select(&:failure?)
28
+
29
+ puts "#{failures.length} failures"
30
+ failures.each_with_index do |spec, index|
31
+ puts " \e[#{COLOUR_CODES[:red]}m#{index+1}. #{spec.trace}\e[0m"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,3 +1,3 @@
1
1
  module Mspec
2
- VERSION = "0.1.8"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: m-spec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edward Withers
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-11 00:00:00.000000000 Z
11
+ date: 2020-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -77,7 +77,9 @@ files:
77
77
  - lib/m-spec/core/matchers/equal.rb
78
78
  - lib/m-spec/core/matchers/output.rb
79
79
  - lib/m-spec/core/spec_error.rb
80
+ - lib/m-spec/core/spec_example.rb
80
81
  - lib/m-spec/core/spec_result.rb
82
+ - lib/m-spec/core/specs.rb
81
83
  - lib/m-spec/mocks/allow.rb
82
84
  - lib/m-spec/mocks/helpers/readable.rb
83
85
  - lib/m-spec/mocks/mock.rb