rspec-situations 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.
- data/Gemfile +13 -0
- data/Guardfile +12 -0
- data/MIT-LICENSE +20 -0
- data/README.md +31 -0
- data/lib/rspec/situations/class_extensions.rb +65 -0
- data/lib/rspec/situations/configure.rb +6 -0
- data/lib/rspec/situations/instance_extensions.rb +31 -0
- data/lib/rspec/situations/situation.rb +15 -0
- data/lib/rspec/situations/version.rb +13 -0
- data/lib/rspec/situations.rb +10 -0
- metadata +104 -0
data/Gemfile
ADDED
data/Guardfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011, 2012, 2013 by Brett Richardson
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
Using Rspec Situations
|
2
|
+
======================
|
3
|
+
|
4
|
+
Using Rspec Situations is super simple.
|
5
|
+
|
6
|
+
|
7
|
+
Define a situation with the 'situation' method.
|
8
|
+
Add a symbol key to identify the situation, and add an optional description if you like, and pass in a block creating the situation.
|
9
|
+
|
10
|
+
|
11
|
+
Describe a set of 1 or more situations with the 'describe_situation' method, and treat it just like a normal describe call.
|
12
|
+
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
describe Apple do
|
16
|
+
subject( :apple ){ create :apple }
|
17
|
+
|
18
|
+
situation( :bought ){ subject.bought_by = create :user }
|
19
|
+
situation( :red ){ subject.color = :Red }
|
20
|
+
|
21
|
+
situation( :1yr_old, 'a year old' ){ subject.created_at = 2.years.ago }
|
22
|
+
|
23
|
+
describe_situation :stolen, :red do
|
24
|
+
it{ should be_tasty }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe_situation :stolen, :1yr_old do
|
28
|
+
it{ should_not be_tasty }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
```
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'rspec/situations/situation'
|
2
|
+
|
3
|
+
module RSpec::Situations
|
4
|
+
module ClassExtensions
|
5
|
+
|
6
|
+
# Public API method for defining a situation
|
7
|
+
def situation( key, description = nil, &block ) # RSpec extention method to add a Situation object to the hash cache
|
8
|
+
_rsits_hash[key] = Situation.new( key, description, &block )
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
# Public API method for describing a set of situations
|
13
|
+
def describe_situation( *keys, &block ) # Describe and invoke all relevant situations
|
14
|
+
if keys.last.kind_of? String # If the last argument is a string
|
15
|
+
description = keys.last # Use it as the description
|
16
|
+
keys = keys[0..-1]
|
17
|
+
else
|
18
|
+
description = _rsits_describe_name *keys # Otherwise, generate a description
|
19
|
+
end
|
20
|
+
|
21
|
+
describe description do
|
22
|
+
before do
|
23
|
+
_rsits( *keys ).each do |situation| # For each situation we request,
|
24
|
+
example.instance_eval &situation.block # Execute its block in the context of an example
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
instance_eval &block # Execute the describe block in the current context
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
# Get situations defined by the given keys
|
34
|
+
def _rsits( *keys ) # Array of all situation objects pertaining to current context
|
35
|
+
if keys.length > 0
|
36
|
+
_rsits_combined_hash.select{ |k,v| keys.include? k }
|
37
|
+
else
|
38
|
+
_rsits_combined_hash
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# Combine each situation's description into a string
|
44
|
+
def _rsits_describe_name( *keys )
|
45
|
+
'when ' + _rsits( *keys ).map{ |k,v| v.description }.join( ' and ' )
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
# ========================================================================
|
50
|
+
private
|
51
|
+
# ========================================================================
|
52
|
+
|
53
|
+
|
54
|
+
def _rsits_combined_hash
|
55
|
+
_rsits_hash # TODO: Combine with parents, not needed until you want parent and local situations to interact directly with each other.
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
# Getter / setter for the hash that stores all our situations
|
60
|
+
def _rsits_hash # Cache by key of all situations in the current describe/context block.
|
61
|
+
@_rsits_hash ||= {}
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RSpec::Situations::InstanceExtensions
|
2
|
+
|
3
|
+
# Generate a string for describe_situation call
|
4
|
+
def _rsits_describe_name
|
5
|
+
self.class._rsits_describe_name
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
# Get an array of situations (from the combined hash) depending on the keys we provide
|
10
|
+
def _rsits( *keys ) # Go up the example parents and get the situations requested, whereever they may be defined
|
11
|
+
_rsits_combined_hash.select do |key, _|
|
12
|
+
keys.include? key # Then filter out only the keys we are using
|
13
|
+
end.map{ |_, situation| situation } # Now return an array of situations instead of a hash
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
# ===========================================================================
|
18
|
+
private
|
19
|
+
# ===========================================================================
|
20
|
+
|
21
|
+
|
22
|
+
# A hash of the current context, merged with parent contexts
|
23
|
+
def _rsits_combined_hash
|
24
|
+
self.class.instance_variable_get(
|
25
|
+
:@parent_groups # For each item in @parent_groups
|
26
|
+
).reduce( {} ) do |final, pg|
|
27
|
+
final.merge pg._rsits # Merge the _rsits hash into 'final'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module RSpec::Situations
|
2
|
+
|
3
|
+
class Situation
|
4
|
+
attr_reader :description, :block
|
5
|
+
|
6
|
+
def initialize( key, description = nil, &block )
|
7
|
+
@key = key
|
8
|
+
@description = description || key.to_s
|
9
|
+
@block = block
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_s; @description; end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rspec-situations
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Brett Richardson
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: Adds a super simple method to describe RSpec situations in terms of smaller
|
63
|
+
situation blocks.
|
64
|
+
email:
|
65
|
+
- Brett.Richardson.NZ@gmail.com
|
66
|
+
executables: []
|
67
|
+
extensions: []
|
68
|
+
extra_rdoc_files: []
|
69
|
+
files:
|
70
|
+
- lib/rspec/situations/class_extensions.rb
|
71
|
+
- lib/rspec/situations/configure.rb
|
72
|
+
- lib/rspec/situations/instance_extensions.rb
|
73
|
+
- lib/rspec/situations/situation.rb
|
74
|
+
- lib/rspec/situations/version.rb
|
75
|
+
- lib/rspec/situations.rb
|
76
|
+
- Gemfile
|
77
|
+
- Guardfile
|
78
|
+
- MIT-LICENSE
|
79
|
+
- README.md
|
80
|
+
homepage: http://www.dablweb.com
|
81
|
+
licenses: []
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ! '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 1.8.25
|
101
|
+
signing_key:
|
102
|
+
specification_version: 3
|
103
|
+
summary: Situations for chained Rspec conditions
|
104
|
+
test_files: []
|