rspec-versioned 1.0.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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MTYxOGQ0MTBmOTVlZjNjYmI5NzU5MDc0YWEwNDcyODg1YThkNDVmMQ==
5
+ data.tar.gz: !binary |-
6
+ MTMwNzYzNmJlY2EwYjZmOTZiZThhMzA1YmRkOGFiYzhiZjYwZGU3ZA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YTg3YzkyMmFiNjFkZTI4MmJlZGVjOGRlNDhhMGUyOTNiMmQ2NDAzY2I5NGJi
10
+ MTFhMDgwOWU2ODVjNGM5OGY0NDQ0ZThlMGFiYzBmZTczZGE2YTlmNTQzZDg0
11
+ ZGU4OGMwYzdjNGMwNmVmY2JjZGYyMWQ0ZjFjOGFiMzVjMjU4ZTI=
12
+ data.tar.gz: !binary |-
13
+ YWQzMTdhNjBlMzk2NWZhNTBlZWFkZGEyZWNmMDEyYjMyNGFjYjA4MzFmZjQy
14
+ MTNmM2FjOTZlZjNjNjgwZjZhM2Q5MTNmYTY1MTY1MWZhMmU3MTEyMzljZDg5
15
+ NzllNjYxMjU0ODI4NTI5ZGRmMDcxNWQzMGYwMDRlZGZhMjE5NmQ=
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rspec-versioned.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 ddayal-fiksu
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # RSpec::Versioned
2
+
3
+ Inspired by [RSpec::Retry](https://github.com/y310/rspec-retry), Rspec::Versioned allows RSpec examples and example groups to easily be repeated over different API versions using the [versioned_blocks](https://github.com/devend711/versioned_blocks) gem. Just add the `:versions` option to an example:
4
+
5
+ it 'tests multiple API versions', versions:{from:2, to:4} do |example|
6
+ expect(example.version.uri).to include example.version.number.to_s
7
+ end
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'rspec-versioned'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install rspec-versioned
22
+
23
+ ## Usage
24
+
25
+ See [versioned_blocks' documentation](https://github.com/devend711/versioned_blocks) for info about how to set a base URI and define ranges for the versions you want to test. Simply pass those options to an RSpec example group or a specific example, like this:
26
+
27
+ VersionedBlocks.base_uri = 'http://www.api.com'
28
+
29
+ it 'tests multiple API versions', versions:{to:3} do |example|
30
+ ...
31
+
32
+ context 'when the API version is between 2 and 4', versions:{from:2, to:4} do
33
+ it 'tests multiple API versions' do |example|
34
+ ...
35
+
36
+ it 'tests a different base URI', versions:{only:1, base_uri:'http://www.api2.com', override:true} do |example|
37
+ ...
38
+
39
+ Examples returned from the block will respond to `version.number` and a `version.uri` where `version.uri` will be the string `"#{VersionedBlocks.base_uri}/v#{version.number}"`
40
+
41
+ Rspec::Versioned can add the version it's currently testing to RSpec's output messages. Just add this line to your RSpec config:
42
+
43
+ config.notify_version_number = true
44
+
45
+ ## Contributing
46
+
47
+ 1. Fork it ( https://github.com/[my-github-username]/rspec-versioned/fork )
48
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
49
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
50
+ 4. Push to the branch (`git push origin my-new-feature`)
51
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,5 @@
1
+ module Rspec
2
+ module Versioned
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,103 @@
1
+ require "rspec/versioned/version"
2
+ require 'rspec/core'
3
+ require 'rspec_ext/rspec_ext'
4
+ require 'versioned_blocks'
5
+
6
+ module RSpec
7
+ class Versioned
8
+ def self.apply
9
+ RSpec.configure do |config|
10
+ config.add_setting :notify_version_number, :default => false
11
+ config.add_setting :clear_lets_on_failure, :default => true
12
+
13
+ fetch_current_example = RSpec.respond_to?(:current_example) ?
14
+ proc { RSpec.current_example } : proc { |context| context.example }
15
+
16
+ config.around(:each) do |ex| # ex is a Procsy
17
+ notify_version_number = ex.metadata[:notify_version_number] || RSpec.configuration.notify_version_number
18
+
19
+ example = fetch_current_example.call(self)
20
+ example.new_version_info
21
+
22
+ run_example = Proc.new do |v, uri|
23
+ example.clear_exception
24
+ example.version.set(v, uri)
25
+ ex.run
26
+ RSpec.configuration.reporter.message("RSpec::Versioned testing /v#{v}") if notify_version_number
27
+ end
28
+
29
+ if ex.metadata.has_key?(:versions)
30
+ if ex.metadata[:versions][:base_uri] || (VersionedBlocks.base_uri && VersionedBlocks.base_uri!='') # we have a URI
31
+ versioned_block(ex.metadata[:versions]) do |v, uri|
32
+ run_example.call v,uri
33
+ end
34
+ else # we don't have a URI
35
+ versioned_block(ex.metadata[:versions]) do |v|
36
+ run_example.call v
37
+ end
38
+ end
39
+ else # didn't specify any versions...just run the test!
40
+ ex.run
41
+ end
42
+ self.clear_lets if clear_lets
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ module HasVersionInfo
50
+ def new_version_info
51
+ @version_info = VersionInfoHolder.new
52
+ end
53
+
54
+ def version
55
+ @version_info
56
+ end
57
+
58
+ def clear_exception
59
+ @exception = nil
60
+ end
61
+ end
62
+
63
+ module RSpec
64
+ module Core
65
+ class Example
66
+ @version_info
67
+
68
+ include HasVersionInfo
69
+
70
+ class Procsy
71
+ @version_info
72
+
73
+ include HasVersionInfo
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ class VersionInfoHolder
80
+ attr_reader :number
81
+
82
+ def uri
83
+ return @uri if !@uri.nil?
84
+ raise VersionedBlocksException, "Undefined URI!"
85
+ end
86
+
87
+ def set(v_number, uri=nil)
88
+ @number = v_number
89
+ @uri = uri
90
+ end
91
+ end
92
+
93
+ module RSpec
94
+ module Core
95
+ class ExampleGroup
96
+ def clear_lets
97
+ @__memoized = {}
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ RSpec::Versioned.apply
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rspec/versioned/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rspec-versioned"
8
+ spec.version = Rspec::Versioned::VERSION
9
+ spec.authors = ["devend711"]
10
+ spec.email = ["devend711@gmail.com"]
11
+ spec.summary = "Run tests over whatever API versions you want"
12
+ #spec.description = %q{TODO: Write a longer description. Optional.}
13
+ spec.homepage = "https://github.com/devend711/rspec-versioned"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "versioned_blocks"
24
+ end
@@ -0,0 +1,8 @@
1
+ require 'rspec'
2
+ require_relative '../lib/rspec/versioned'
3
+
4
+ RSpec.configure do |config|
5
+ config.color = true
6
+ config.notify_version_number = true
7
+ config.formatter = 'documentation'
8
+ end
@@ -0,0 +1,74 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'rspec/versioned' do
4
+ it 'can run a normal example' do
5
+ expect(1).to eq 1
6
+ end
7
+
8
+ context 'without asking for URI' do
9
+ before :all do
10
+ @count = 1
11
+ end
12
+
13
+ it 'can run an example and get a version number', versions:{only:1} do |ex|
14
+ expect(ex.version.number).to eq 1
15
+ end
16
+
17
+ it 'can run an example and get version numbers for a range of versions', versions:{to:3} do |ex|
18
+ expect(ex.version.number).to eq(@count)
19
+ @count += 1
20
+ end
21
+ end
22
+
23
+ context 'after setting a URI' do
24
+ before :all do
25
+ @count = 1
26
+ VersionedBlocks.base_uri = "http://api.com"
27
+ end
28
+
29
+ it 'can run an example and get a version number', versions:{only:1} do |ex|
30
+ expect(ex.version.uri).to include ex.version.number.to_s
31
+ end
32
+
33
+ it 'can override base_uri', versions:{only:1, base_uri:'http://api2.com', override:true} do |ex|
34
+ expect(ex.version.uri).to include 'http://api2.com'
35
+ end
36
+
37
+ it 'can run an example and get version numbers and URIs for a range of versions', versions:{to:3} do |ex|
38
+ expect(ex.version.uri).to include('api.com')
39
+ expect(ex.version.uri).to include(ex.version.number.to_s)
40
+ expect(ex.version.number).to eq(@count)
41
+ @count += 1
42
+ end
43
+ end
44
+
45
+ context 'nested examples' do
46
+ before :all do
47
+ @outer_count = 1
48
+ @always_1 = 1
49
+ end
50
+
51
+ context 'nested', versions:{from:2, to:4} do
52
+ it 'runs the correct amount of times' do |ex|
53
+ @outer_count += 1
54
+ expect(@outer_count).to eq ex.version.number
55
+ end
56
+
57
+ it 'only runs once for this one', versions:{only:1} do
58
+ expect(@always_1).to eq 1
59
+ @always_1 += 1
60
+ end
61
+
62
+ context 'another nested' do
63
+ before :all do
64
+ @inner_count = 1
65
+ end
66
+
67
+ it 'runs the correct amount of times' do |ex|
68
+ @inner_count += 1
69
+ expect(@inner_count).to eq ex.version.number
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rspec-versioned
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - devend711
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: versioned_blocks
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email:
57
+ - devend711@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - .gitignore
63
+ - Gemfile
64
+ - LICENSE.txt
65
+ - README.md
66
+ - Rakefile
67
+ - lib/rspec/versioned.rb
68
+ - lib/rspec/versioned/version.rb
69
+ - rspec-versioned.gemspec
70
+ - spec/spec_helper.rb
71
+ - spec/versioned_spec.rb
72
+ homepage: https://github.com/devend711/rspec-versioned
73
+ licenses:
74
+ - MIT
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 2.2.2
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Run tests over whatever API versions you want
96
+ test_files:
97
+ - spec/spec_helper.rb
98
+ - spec/versioned_spec.rb