its 0.1.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.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ *.swp
4
+ Gemfile.lock
5
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --backtrace
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.2
5
+ - 1.9.3
6
+ - jruby
7
+ - rbx-18mode
8
+ - rbx-19mode
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in its.gemspec
4
+ gemspec
@@ -0,0 +1,62 @@
1
+ "Its" makes testing methods with multiple arguments much easier
2
+ ==================================================
3
+
4
+
5
+ ![Build Status](https://secure.travis-ci.org/dnagir/its.png)
6
+
7
+
8
+ Have you ever written something like this in your specs?
9
+
10
+ ```ruby
11
+ it "should be US currency" do
12
+ subject.currency(:us).should == 'US dollar'
13
+ end
14
+
15
+ it "should be AU currency" do
16
+ subject.currency(:us).should == 'AU dollar'
17
+ end
18
+
19
+ it "should be UK currency" do
20
+ subject.currency(:uk).should == 'UK pound'
21
+ end
22
+ ```
23
+
24
+ If yes, then this what you really wanted:
25
+
26
+ ```ruby
27
+ its(:currency, :us) { should == 'US dollar' }
28
+ its(:currency, :au) { should == 'AU dollar' }
29
+ its(:currency, :uk) { should == 'UK pound' }
30
+ ```
31
+
32
+ That's what this gem is for!
33
+
34
+ Installation and use
35
+ ==================================================
36
+
37
+ Add to your `Gemfile`:
38
+
39
+ ```ruby
40
+ gem 'its'
41
+ ```
42
+
43
+ Then require it somewhere:
44
+
45
+ ```ruby
46
+ require 'its'
47
+ ```
48
+
49
+ And you are done.
50
+
51
+
52
+ Help
53
+ ==================================================
54
+
55
+ Please report any issues here or better submit a Pull Request.
56
+
57
+
58
+
59
+ License:
60
+ ==================================================
61
+
62
+ MIT by me and RSpec guys where this code was extracted from.
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new("spec")
5
+
6
+ task :default => 'spec'
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "its/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "its"
7
+ s.version = Its::VERSION
8
+ s.authors = ["Dmytrii Nagirniak"]
9
+ s.email = ["dnagir@gmail.com"]
10
+ s.homepage = "https://github.com/dnagir/its"
11
+ s.summary = %q{Testing methods with multiple arguments much easier with RSpec}
12
+ s.description = %q{You can write `its(:currency, :us) \{ should == 'US dollars' \}`}
13
+
14
+ s.rubyforge_project = "its"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_runtime_dependency "rspec-core", "~> 2.8"
22
+ s.add_development_dependency "rspec-mocks"
23
+ s.add_development_dependency "rspec-expectations"
24
+ end
@@ -0,0 +1,102 @@
1
+ require "its/version"
2
+ require "rspec/core"
3
+
4
+ module Its
5
+ module ExampleGroupMethods
6
+
7
+ # Creates a nested example group named by the submitted +attribute+,
8
+ # and then generates an example using the submitted block.
9
+ #
10
+ # # This ...
11
+ # describe Array do
12
+ # its(:size) { should eq(0) }
13
+ # end
14
+ #
15
+ # # ... generates the same runtime structure as this:
16
+ # describe Array do
17
+ # describe "size" do
18
+ # it "should eq(0)" do
19
+ # subject.size.should eq(0)
20
+ # end
21
+ # end
22
+ # end
23
+ #
24
+ # The attribute can be a +Symbol+ or a +String+. Given a +String+
25
+ # with dots, the result is as though you concatenated that +String+
26
+ # onto the subject in an expression.
27
+ #
28
+ # describe Person do
29
+ # subject do
30
+ # Person.new.tap do |person|
31
+ # person.phone_numbers << "555-1212"
32
+ # end
33
+ # end
34
+ #
35
+ # its("phone_numbers.first") { should eq("555-1212") }
36
+ # end
37
+ #
38
+ # When the subject is a +Hash+, you can refer to the Hash keys by
39
+ # specifying a +Symbol+ or +String+ in an array.
40
+ #
41
+ # describe "a configuration Hash" do
42
+ # subject do
43
+ # { :max_users => 3,
44
+ # 'admin' => :all_permissions }
45
+ # end
46
+ #
47
+ # its([:max_users]) { should eq(3) }
48
+ # its(['admin']) { should eq(:all_permissions) }
49
+ #
50
+ # # You can still access to its regular methods this way:
51
+ # its(:keys) { should include(:max_users) }
52
+ # its(:count) { should eq(2) }
53
+ # end
54
+ #
55
+ # You can also pass any additional arguments the target method can accept:
56
+ #
57
+ # describe Person do
58
+ # subject do
59
+ # Person.new.tap do |person|
60
+ # person.phone_numbers << "123-123"
61
+ # person.phone_numbers << "234-234"
62
+ # person.phone_numbers << "xxx-xxx"
63
+ # end
64
+ # end
65
+ #
66
+ # its("phone_numbers.first", 2) { should == ["123-123", "234-234"]
67
+ # end
68
+ #
69
+ #
70
+ # This is extraction for the RSpec Core.
71
+ # For reference, see:
72
+ # - https://github.com/rspec/rspec-core/blob/7ce078e4948e8f0d1745a50bb83dd87a68b2e50e/lib/rspec/core/subject.rb#L120
73
+ # This modifies the following behaviour:
74
+ # - calls the target with arguments passed it
75
+ # - changes the description to include the args (if any)
76
+ def its(attribute, *args, &block)
77
+ desc = attribute.to_s
78
+ desc += "(#{args.map{|a| a.nil? ? 'nil' : a.to_s}.join(', ')})" unless args.empty?
79
+
80
+ describe(desc) do
81
+ example do
82
+ self.class.class_eval do
83
+ define_method(:subject) do
84
+ @_subject ||= if attribute.is_a?(Array)
85
+ super()[*attribute]
86
+ else
87
+ attribute.to_s.split('.').inject(super()) do |target, method|
88
+ target.send(method, *args)
89
+ end
90
+ end
91
+ end
92
+ end
93
+ instance_eval(&block)
94
+ end
95
+ end
96
+ end
97
+
98
+ end
99
+
100
+ end
101
+
102
+ RSpec.configure { |c| c.extend Its::ExampleGroupMethods }
@@ -0,0 +1,3 @@
1
+ module Its
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,97 @@
1
+ require 'its'
2
+
3
+ describe "#its" do
4
+ subject do
5
+ Class.new do
6
+ def initialize
7
+ @call_count = 0
8
+ end
9
+
10
+ def call_count
11
+ @call_count += 1
12
+ end
13
+ end.new
14
+ end
15
+
16
+ context "with a call counter" do
17
+ its(:call_count) { should eq(1) }
18
+ end
19
+
20
+ context "with nil value" do
21
+ subject do
22
+ Class.new do
23
+ def nil_value
24
+ nil
25
+ end
26
+ end.new
27
+ end
28
+ its(:nil_value) { should be_nil }
29
+ end
30
+
31
+ context "with nested attributes" do
32
+ subject do
33
+ Class.new do
34
+ def name
35
+ "John"
36
+ end
37
+ end.new
38
+ end
39
+ its("name") { should eq("John") }
40
+ its("name.size") { should eq(4) }
41
+ its("name.size.class") { should eq(Fixnum) }
42
+ end
43
+
44
+ context "when it responds to #[]" do
45
+ subject do
46
+ Class.new do
47
+ def [](*objects)
48
+ objects.map do |object|
49
+ "#{object.class}: #{object.to_s}"
50
+ end.join("; ")
51
+ end
52
+
53
+ def name
54
+ "George"
55
+ end
56
+ end.new
57
+ end
58
+ its([:a]) { should eq("Symbol: a") }
59
+ its(['a']) { should eq("String: a") }
60
+ its([:b, 'c', 4]) { should eq("Symbol: b; String: c; Fixnum: 4") }
61
+ its(:name) { should eq("George") }
62
+ context "when referring to an attribute without the proper array syntax" do
63
+ context "it raises an error" do
64
+ its(:age) do
65
+ expect do
66
+ should eq(64)
67
+ end.to raise_error(NoMethodError)
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ context "when it does not respond to #[]" do
74
+ subject { Object.new }
75
+
76
+ context "it raises an error" do
77
+ its([:a]) do
78
+ expect do
79
+ should eq("Symbol: a")
80
+ end.to raise_error(NoMethodError)
81
+ end
82
+ end
83
+ end
84
+
85
+ context "with arguments passed in" do
86
+ subject do
87
+ Class.new do
88
+ def currency(code)
89
+ "$#{code}"
90
+ end
91
+ end.new
92
+ end
93
+ its(:currency, :us) { should eq("$us") }
94
+ its(:currency, :uk) { should eq("$uk") }
95
+ its(:currency, :ua) { should eq("$ua") }
96
+ end
97
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: its
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Dmytrii Nagirniak
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec-core
16
+ requirement: &70343863742980 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '2.8'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70343863742980
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec-mocks
27
+ requirement: &70343863741980 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70343863741980
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec-expectations
38
+ requirement: &70343863741000 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70343863741000
47
+ description: You can write `its(:currency, :us) { should == 'US dollars' }`
48
+ email:
49
+ - dnagir@gmail.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - .rspec
56
+ - .travis.yml
57
+ - Gemfile
58
+ - README.md
59
+ - Rakefile
60
+ - its.gemspec
61
+ - lib/its.rb
62
+ - lib/its/version.rb
63
+ - spec/its_spec.rb
64
+ homepage: https://github.com/dnagir/its
65
+ licenses: []
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project: its
84
+ rubygems_version: 1.8.10
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: Testing methods with multiple arguments much easier with RSpec
88
+ test_files:
89
+ - spec/its_spec.rb
90
+ has_rdoc: