named_let 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.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in named_let.gemspec
4
+ gemspec
5
+ gem 'rspec'
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Tomohito Ozaki
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,122 @@
1
+ named_let
2
+ ==================================
3
+
4
+ The `named_let can be used to make the rspec's output easier to read.
5
+ It's wrapper function of `let`.
6
+
7
+ `named_let(:name){ obj }` changes the value which returns 'obj#to_s' and
8
+ 'obj#inspect' to :name, then output message of 'rspec -format d' be improved more readable.
9
+
10
+ # Usage
11
+
12
+ describe 'named_let' do
13
+ context 'symbol only' do
14
+ named_let(:foo) { Object.new }
15
+ it { foo.to_s should == "foo" }
16
+ it { foo.inspect.should == "foo" }
17
+ end
18
+
19
+ context 'with label strings' do
20
+ named_let(:foo,"label for display"){ Object.new }
21
+ it { foo.to_s should == "label for display" }
22
+ it { foo.inspect.should == "label for display" }
23
+ end
24
+ end
25
+
26
+ You can use `name_let!` to force the method's invocation before each example, like original `let!`.
27
+
28
+ # Why named_let?
29
+
30
+ RSpec uses 'Object#inspect' for generating output message from value of specified by `let`.
31
+ This will generates unexpected output like 'should == #<Object:0x2aaaaf8a0870A>', it's not human readable.
32
+
33
+ Now let's use `named_let` instead of `let`.The generaed output will be more readable like 'should == "label for display'.
34
+
35
+ # Example
36
+
37
+ For Example, now writing specs for CanCan like bellow,
38
+
39
+ require 'spec_helper'
40
+ require "cancan/matchers"
41
+
42
+ describe Ability do
43
+ context 'an user' do
44
+ let(:user) { Factory.create(:user) }
45
+
46
+ let(:article) { Factory.create(:article) }
47
+ let(:own_article) { Factory.create(:article, :user => user) }
48
+
49
+ subject { Ability.new(user) }
50
+
51
+ it { should be_able_to(:read, article) }
52
+ it { should be_able_to(:update, own_article) }
53
+ end
54
+ end
55
+
56
+
57
+ This specs generates outputs is ...
58
+
59
+
60
+ $ bundle exec rspec -c --format d spec/models/ability_spec.rb
61
+
62
+ Ability
63
+ an user
64
+ should be able to :read #<Article id: 44, title: "The Test Article 1", body: "This is test article!!", created_at: "2012-02-23 14:19:26", updated_at: "2012-02-23 14:19:26", user_id: nil>
65
+ should be able to :update #<Article id: 45, title: "The Test Article 2", body: "This is test article!!", created_at: "2012-02-23 14:19:26", updated_at: "2012-02-23 14:19:26", user_id: 31>
66
+
67
+ Finished in 0.26158 seconds
68
+ 2 examples, 0 failures
69
+
70
+
71
+ OMG, It's not human readable. so,let's change `let` to `named_let`.
72
+
73
+ named_let(:article) { Factory.create(:article) }
74
+ named_let(:own_article) { Factory.create(:article, :user => user) }
75
+
76
+
77
+ again, execute `rspec --format d ...`
78
+
79
+
80
+ $ bundle exec rspec -c --format d spec/models/ability_spec.rb
81
+
82
+ Ability
83
+ an user
84
+ should be able to :read article
85
+ should be able to :update own article
86
+
87
+ Finished in 0.25375 seconds
88
+ 2 examples, 0 failures
89
+
90
+
91
+ okay, it's readable!!!
92
+
93
+ # For debugging
94
+
95
+ If the specs is fail, You will want to know original outputs of 'Object#inspect'.
96
+ But named_let hides actual outputs of "Object#inspect".
97
+
98
+ Failures:
99
+
100
+ 1) Ability an user
101
+ Failure/Error: it { should_not be_able_to(:update, own_article) }
102
+ expected not to be able to :update own article
103
+
104
+
105
+ For debugging spec, if given `-d` option to rspec command or `$DEBUG` flag is true,
106
+ named_let append orignal result of `Object#inspect` to returns value.
107
+
108
+
109
+ given `-d` option, then...
110
+
111
+ Failures:
112
+
113
+ 1) Ability an user
114
+ Failure/Error: it { should_not be_able_to(:update, own_article) }
115
+ expected not to be able to :update own article (#<Article id: 113, title: "The Test Article 3", body: "This is test article!!", created_at: "2012-02-24 05:53:17", updated_at: "2012-02-24 05:53:17", user_id: 90>)
116
+
117
+
118
+ NOTE:
119
+
120
+ Requires `ruby-debug` to using `-d` option.
121
+ run `gem install ruby-debug`.
122
+ If your Ruby-Runtime is 1.9+, see "https://github.com/mark-moseley/ruby-debug".
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ module NamedLet
2
+ VERSION = "0.1.0"
3
+ end
data/lib/named_let.rb ADDED
@@ -0,0 +1,72 @@
1
+ # -------------------------------------------------------------------------------------------------
2
+ #
3
+ # named_let can be used to make the rspec's output easier to read.
4
+ #
5
+ # `named_let(:name){ obj }` changes the value which returns 'obj#to_s' and
6
+ # 'obj#inspect' to givne :name,
7
+ # then output of 'rspec -format d' will be improved more readable.
8
+ #
9
+ # -------------------------------------------------------------------------------------------------
10
+ #
11
+ # rspecのlet(:name)で定義したオブジェクトのto_sとinspectの値を、:nameに変更する
12
+ #
13
+ # named_let(:foo){ Object.new } ってやると、
14
+ # foo.to_sが"foo"になる
15
+ #
16
+ # named_let(:foo,"label for display"){ ... } って第二引数に別名を渡すと、
17
+ # その別名が、to_s/inspectの値になる
18
+ #
19
+ # subject should == fooとか書いたときの出力が
20
+ # ふつうは
21
+ # should == #<Object:0x2aaaaf8a0870>
22
+ # とかで汚いけど、これをつかうと
23
+ # should == "label for display"
24
+ # のようにキレイになる
25
+ #
26
+ # -------------------------------------------------------------------------------------------------
27
+
28
+ require "named_let/version"
29
+
30
+ module NamedLet
31
+ # In RSpec 2.8, RSpec::Core::Let::ExampleGroupMethods
32
+ if RSpec::Core::Version::STRING < "2.8.0"
33
+ klass = RSpec::Core::Let::ClassMethods
34
+ else
35
+ klass = RSpec::Core::Let::ExampleGroupMethods
36
+ end
37
+
38
+ klass.class_eval do
39
+ def named_let(name, label = nil, &block)
40
+ define_method(name) do
41
+ __memoized.fetch(name) {|k| __memoized[k] = instance_eval(&block).tap{|o|
42
+ return o if o.nil?
43
+
44
+ the_name = label || name
45
+
46
+ # if given -d/--debug option, append calling original ones.(ruby-debug required)
47
+ call_super = begin ;$DEBUG or Debugger.started? rescue LoadError; nil; end
48
+
49
+ inject_code = lambda{|obj, code| begin; obj.instance_eval code; rescue TypeError; end }
50
+ escape = lambda{|str| str.gsub(/\"/, '\\"')}
51
+
52
+ genereate_wrapper_code = lambda{|obj, method|
53
+ original_result = escape.call(obj.send(method)) if call_super
54
+ code = "def #{method}; \"#{the_name}\" #{call_super ? " + \" (#{original_result})\"" : ''} ;end"
55
+ }
56
+
57
+ to_s_code = genereate_wrapper_code.call(o, :to_s)
58
+ inspect_code = genereate_wrapper_code.call(o, :inspect)
59
+
60
+ inject_code.call(o, to_s_code)
61
+ inject_code.call(o, inspect_code)
62
+ o
63
+ }}
64
+ end
65
+ end
66
+
67
+ def named_let!(name, label = nil, &block)
68
+ named_let(name, label, &block)
69
+ before { __send__(name) }
70
+ end
71
+ end
72
+ end
data/named_let.gemspec ADDED
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "named_let/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "named_let"
7
+ s.version = NamedLet::VERSION
8
+ s.authors = ["Tomohito Ozaki"]
9
+ s.email = ["ozaki@yuroyoro.com"]
10
+ s.homepage = "https://github.com/yuroyoro/named_let"
11
+ s.summary = %q{named_let can be used to make the rspec's output easier to read.}
12
+ s.description = %q{'named_let(:name){ obj }' changes the value which returns 'obj#to_s' and 'obj#inspect' to :name, then output of 'rspec -format d' be improved more readable.}
13
+
14
+ s.rubyforge_project = "named_let"
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
+ # dependencies
22
+ s.add_development_dependency "rspec"
23
+ s.add_runtime_dependency "rspec-core", ">= 0"
24
+ end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: named_let
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Tomohito Ozaki
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-02-24 00:00:00 +09:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rspec
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rspec-core
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ description: "'named_let(:name){ obj }' changes the value which returns 'obj#to_s' and 'obj#inspect' to :name, then output of 'rspec -format d' be improved more readable."
50
+ email:
51
+ - ozaki@yuroyoro.com
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ extra_rdoc_files: []
57
+
58
+ files:
59
+ - .gitignore
60
+ - Gemfile
61
+ - LICENSE
62
+ - README.md
63
+ - Rakefile
64
+ - lib/named_let.rb
65
+ - lib/named_let/version.rb
66
+ - named_let.gemspec
67
+ has_rdoc: true
68
+ homepage: https://github.com/yuroyoro/named_let
69
+ licenses: []
70
+
71
+ post_install_message:
72
+ rdoc_options: []
73
+
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ hash: 3
82
+ segments:
83
+ - 0
84
+ version: "0"
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ hash: 3
91
+ segments:
92
+ - 0
93
+ version: "0"
94
+ requirements: []
95
+
96
+ rubyforge_project: named_let
97
+ rubygems_version: 1.5.2
98
+ signing_key:
99
+ specification_version: 3
100
+ summary: named_let can be used to make the rspec's output easier to read.
101
+ test_files: []
102
+