rspec_fixtures 0.0.1 → 0.0.2

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
  SHA1:
3
- metadata.gz: 4f1f2d6588eaf7ebb37981b9f5aa5e55dd85fad0
4
- data.tar.gz: 4b4987f63e870117de3c36b8362d78ddd88ac96f
3
+ metadata.gz: 48ef174e72d1e605f279b0d5ae0eedbf5b596fef
4
+ data.tar.gz: 075e93191e3acbf083ddf892cb6a1a46caba54b2
5
5
  SHA512:
6
- metadata.gz: 783f4e3c8625d4bb2592e9b2df79a87363176f38ed147b413067206c853106b244a8dfbeab18c1cf65abd016af0dd76a5d4492e96e4ca0c418183384ff4aafba
7
- data.tar.gz: 5d38f2e562d12c44ccce09df8ec13678cacee5a1bbc06bb5698372a8fbc61c13c122a8537d74089a29d43c8800e2133cbb0c43b0d060f81d95ef4034d6357c32
6
+ metadata.gz: 51fed96a9aca2abec950e09ddc47e6c9429f690ea4ab0f7e9864773aac82ed614b45bcd002842828fb6c31031efca6757cf151394c43e7202b80445d0731c15e
7
+ data.tar.gz: 9373abab432d93d9f8d823c7cbb77a21352ee94d5041e53e4fe23913bcc9fa4a84dbce932280a43cd2227a658637ebf3c1a082cd2c6cd9170043054d0f8266b2
data/README.md CHANGED
@@ -3,9 +3,19 @@ RSpec Fixtures
3
3
 
4
4
  [![Gem](https://img.shields.io/gem/v/rspec_fixtures.svg?style=flat-square)](https://rubygems.org/gems/rspec_fixtures)
5
5
  [![Travis](https://img.shields.io/travis/DannyBen/rspec_fixtures.svg?style=flat-square)](https://travis-ci.org/DannyBen/rspec_fixtures)
6
- [![Code Climate](https://img.shields.io/codeclimate/github/DannyBen/rspec_fixtures.svg?style=flat-square)](https://codeclimate.com/github/DannyBen/rspec_fixtures)
6
+ [![Maintainability](https://img.shields.io/codeclimate/maintainability/DannyBen/rspec_fixtures.svg?style=flat-square)](https://codeclimate.com/github/DannyBen/rspec_fixtures)
7
+ [![Issues](https://img.shields.io/codeclimate/issues/github/DannyBen/rspec_fixtures.svg?style=flat-square)](https://codeclimate.com/github/DannyBen/rspec_fixtures)
7
8
  [![Gemnasium](https://img.shields.io/gemnasium/DannyBen/rspec_fixtures.svg?style=flat-square)](https://gemnasium.com/DannyBen/rspec_fixtures)
8
9
 
10
+ ---
11
+
12
+ RSpec Fixtures allows you to interactively review and approve testable
13
+ content.
14
+
15
+ ![Demo](/demo.gif)
16
+
17
+ ---
18
+
9
19
 
10
20
  Install
11
21
  --------------------------------------------------
@@ -21,3 +31,72 @@ gem 'rspec_fixtures'
21
31
  ```
22
32
 
23
33
 
34
+ Usage
35
+ --------------------------------------------------
36
+
37
+ Require the gem in your spec helper:
38
+
39
+ ```ruby
40
+ # spec/spec_helper.rb
41
+ require 'rspec_fixtures'
42
+ ```
43
+
44
+ And use any of the matchers in your specs.
45
+
46
+ ```ruby
47
+ describe 'ls' do
48
+ it "works" do
49
+ expect(`ls`).to match_fixture('ls_fixture')
50
+ end
51
+ end
52
+ ```
53
+
54
+ Matchers
55
+ --------------------------------------------------
56
+
57
+ ### `match_fixture`
58
+
59
+ Compare a string with a pre-approved fixture.
60
+
61
+ ```ruby
62
+ expect('some string').to match_fixture('fixture_filename')
63
+ ```
64
+
65
+ ### `output_fixture`
66
+
67
+ Compare an output (stdout or stderr) with a pre-approved fixture.
68
+
69
+ ```ruby
70
+ expect{ puts "hello" }.to output_fixture('fixture_filename')
71
+ expect{ puts "hello" }.to output_fixture('fixture_filename').to_stdout
72
+ expect{ $stderr.puts "hello" }.to output_fixture('fixture_filename').to_stderr
73
+
74
+ # The first two are the same, as the default stream is stdout.
75
+ ```
76
+
77
+
78
+ Configuration
79
+ --------------------------------------------------
80
+
81
+ ### `interactive_fixtures`
82
+
83
+ By default, interactive approvals are enabled in any environment that
84
+ does not define the `CI` environment variable. You can change this by
85
+ adding this to your `spec_helper`
86
+
87
+ ```ruby
88
+ RSpec.configure do |config|
89
+ config.interactive_fixtures = false # or any logic
90
+ end
91
+ ```
92
+
93
+ ### `fixtures_path`
94
+
95
+ By default, fixtures are stored in `spec/fixtures`. To change the path,
96
+ add this to your `spec_helper`.
97
+
98
+ ```ruby
99
+ RSpec.configure do |config|
100
+ config.fixtures_path = 'spec/anywhere/else'
101
+ end
102
+ ```
@@ -1,5 +1,10 @@
1
1
  require 'rspec_fixtures/version'
2
2
  require 'rspec_fixtures/colors'
3
+
4
+ require 'rspec_fixtures/stream_capturer'
5
+ require 'rspec_fixtures/approval_handler'
6
+ require 'rspec_fixtures/matchers/base'
3
7
  require 'rspec_fixtures/matchers/match_fixture'
4
- require 'rspec_fixtures/rspec_config'
8
+ require 'rspec_fixtures/matchers/output_fixture'
5
9
 
10
+ require 'rspec_fixtures/rspec_config'
@@ -0,0 +1,31 @@
1
+ module RSpecFixtures
2
+ class ApprovalHandler
3
+ include Colors
4
+
5
+ def run(expected, actual, fixture_file)
6
+ puts "%{blue}--- Approval Needed ---%{reset}\n" % colors
7
+ if expected.empty?
8
+ puts actual
9
+ else
10
+ puts "--- New (Actual) ------%{reset}\n#{actual}" % colors
11
+ puts "--- Old (Fixture) -----%{reset}\n#{expected}" % colors
12
+ end
13
+ print "%{blue}--- Approve? (y/N): --> %{reset}" % colors
14
+
15
+ if get_user_answer == "y"
16
+ puts "%{green}Approved%{reset}" % colors
17
+ File.write fixture_file, actual
18
+ true
19
+ else
20
+ puts "%{red}Not Approved%{reset}" % colors
21
+ false
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def get_user_answer
28
+ $stdin.getch
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ module RSpecFixtures
2
+ module Matchers
3
+
4
+ class Base
5
+ attr_reader :fixture_name, :actual
6
+
7
+ def initialize(fixture_name=nil)
8
+ @fixture_name = fixture_name
9
+ end
10
+
11
+ def matches?(actual)
12
+ @actual = actual
13
+ false
14
+ end
15
+
16
+ def expected
17
+ @expected ||= expected!
18
+ end
19
+
20
+ def failure_message
21
+ "expected #{actual}\nto match #{expected}"
22
+ end
23
+
24
+ def diffable?
25
+ true
26
+ end
27
+
28
+ def interactive?
29
+ RSpec.configuration.interactive_fixtures
30
+ end
31
+
32
+ def fixtures_dir
33
+ RSpec.configuration.fixtures_path
34
+ end
35
+
36
+ def fixture_file
37
+ "#{fixtures_dir}/#{fixture_name}"
38
+ end
39
+
40
+ protected
41
+
42
+ def approve_fixture
43
+ approval_handler = ApprovalHandler.new
44
+ approval_handler.run expected, actual, fixture_file
45
+ end
46
+
47
+ def expected!
48
+ Dir.mkdir fixtures_dir unless Dir.exist? fixtures_dir
49
+ File.write fixture_file, nil unless File.exist? fixture_file
50
+ File.read fixture_file
51
+ end
52
+ end
53
+
54
+ end
55
+ end
@@ -4,15 +4,7 @@ module RSpecFixtures
4
4
  MatchFixture.new expected
5
5
  end
6
6
 
7
- class MatchFixture
8
- include Colors
9
-
10
- attr_reader :fixture_name, :actual
11
-
12
- def initialize(fixture_name=nil)
13
- @fixture_name = fixture_name
14
- end
15
-
7
+ class MatchFixture < Base
16
8
  def matches?(actual)
17
9
  @actual = actual
18
10
  if actual == expected or !interactive?
@@ -21,58 +13,7 @@ module RSpecFixtures
21
13
  approve_fixture
22
14
  end
23
15
  end
24
-
25
- def expected
26
- @expected ||= expected!
27
- end
28
-
29
- def failure_message
30
- "expected #{actual}\nto match #{expected}"
31
- end
32
-
33
- def diffable?
34
- true
35
- end
36
-
37
- private
38
-
39
- def interactive?
40
- RSpec.configuration.interactive_fixtures
41
- end
42
-
43
- def fixtures_dir
44
- RSpec.configuration.fixtures_path
45
- end
46
-
47
- def fixture_file
48
- "#{fixtures_dir}/#{fixture_name}"
49
- end
50
-
51
- def approve_fixture
52
- puts "%{blue}--- Approval Needed ---%{reset}\n" % colors
53
- if expected.empty?
54
- puts actual
55
- else
56
- puts "--- New (Actual) ------%{reset}\n#{actual}" % colors
57
- puts "--- Old (Fixture) -----%{reset}\n#{expected}" % colors
58
- end
59
- print "%{blue}--- Approve? (y/N): --> %{reset}" % colors
60
-
61
- if $stdin.getch == "y"
62
- puts "%{green}Approved%{reset}" % colors
63
- File.write fixture_file, actual
64
- true
65
- else
66
- puts "%{red}Not Approved%{reset}" % colors
67
- actual == expected
68
- end
69
- end
70
-
71
- def expected!
72
- Dir.mkdir fixtures_dir unless Dir.exist? fixtures_dir
73
- File.write fixture_file, nil unless File.exist? fixture_file
74
- File.read fixture_file
75
- end
76
16
  end
17
+
77
18
  end
78
19
  end
@@ -0,0 +1,39 @@
1
+ module RSpecFixtures
2
+ module Matchers
3
+ def output_fixture(expected)
4
+ OutputFixture.new expected
5
+ end
6
+
7
+ class OutputFixture < Base
8
+ def matches?(block)
9
+ return false unless block.is_a? Proc
10
+ @actual = stream_capturer.capture block
11
+
12
+ if actual == expected or !interactive?
13
+ actual == expected
14
+ else
15
+ approve_fixture
16
+ end
17
+ end
18
+
19
+ def supports_block_expectations?
20
+ true
21
+ end
22
+
23
+ def to_stdout
24
+ @stream_capturer = CaptureStdout
25
+ self
26
+ end
27
+
28
+ def to_stderr
29
+ @stream_capturer = CaptureStderr
30
+ self
31
+ end
32
+
33
+ def stream_capturer
34
+ @stream_capturer ||= CaptureStdout
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,33 @@
1
+ module RSpecFixtures
2
+ # These methods are borrowed from rspec's built in matchers
3
+ # https://github.com/rspec/rspec-expectations/blob/add9b271ecb1d65f7da5bc8a9dd8c64d81d92303/lib/rspec/matchers/built_in/output.rb
4
+ module CaptureStdout
5
+ def self.capture(block)
6
+ captured_stream = StringIO.new
7
+
8
+ original_stream = $stdout
9
+ $stdout = captured_stream
10
+
11
+ block.call
12
+
13
+ captured_stream.string
14
+ ensure
15
+ $stdout = original_stream
16
+ end
17
+ end
18
+
19
+ module CaptureStderr
20
+ def self.capture(block)
21
+ captured_stream = StringIO.new
22
+
23
+ original_stream = $stderr
24
+ $stderr = captured_stream
25
+
26
+ block.call
27
+
28
+ captured_stream.string
29
+ ensure
30
+ $stderr = original_stream
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module RSpecFixtures
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec_fixtures
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Danny Ben Shitrit
@@ -102,9 +102,13 @@ extra_rdoc_files: []
102
102
  files:
103
103
  - README.md
104
104
  - lib/rspec_fixtures.rb
105
+ - lib/rspec_fixtures/approval_handler.rb
105
106
  - lib/rspec_fixtures/colors.rb
107
+ - lib/rspec_fixtures/matchers/base.rb
106
108
  - lib/rspec_fixtures/matchers/match_fixture.rb
109
+ - lib/rspec_fixtures/matchers/output_fixture.rb
107
110
  - lib/rspec_fixtures/rspec_config.rb
111
+ - lib/rspec_fixtures/stream_capturer.rb
108
112
  - lib/rspec_fixtures/version.rb
109
113
  homepage: https://github.com/DannyBen/rspec_fixtures
110
114
  licenses: