idgas 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ = I dont give a shit (idgas)
2
+
3
+ Inspired by groovys questionmark-syntax. 'I dont give a shit' tries to implement this behavior in ruby.
4
+
5
+ You can put a ? behind every method-call to ignore, weather it returns nil.
6
+
7
+ So chaining of calls within deep data-structures is painless:
8
+
9
+ some_data_that_might_contain_nil.order?.shoppingcart?.item?.second?.price?
10
+
11
+ This call would return the price of the second item in the shopping-cart or +nil+ if some of the objects in the data-structure is +nil+ itself.
12
+
13
+ == Install
14
+
15
+ $ gem install phoet-idgas -s http://gems.github.com
16
+
17
+ == How to use
18
+
19
+ Just require the gem and put it in a place where it can override the default behavior of your script.
20
+ You might put it as an initializer in your rails application or something like that.
21
+
22
+ $ irb -rubygems
23
+ require 'i_dont_give_a_shit'
24
+
25
+ nil.i?.dont?.give?.a?.shit?
26
+ => nil
@@ -0,0 +1,37 @@
1
+ # Open up Object to add handling of +?+.
2
+ class Object
3
+
4
+ # Save a reference to original +method_missing+.
5
+ alias m_m method_missing
6
+
7
+ # Catches all calls that were intended to go to the real object ending with +?+.
8
+ # The question-mark is stripped and the call is processed again.
9
+ # Calls without a question-mark are send to the original +method_missing+.
10
+ def method_missing(sym,*args, &block)
11
+ method_name = sym.to_s
12
+ if /.+\?$/ =~ method_name
13
+ puts "object '#{sym}' '#{args}' '#{block}'"
14
+ send(method_name[0..-2], *args, &block)
15
+ else
16
+ puts "object missing '#{sym}' '#{args}' '#{block}'"
17
+ m_m(sym,*args, &block)
18
+ end
19
+ end
20
+ end
21
+
22
+ # Open up Nil to add handling of +?+.
23
+ class NilClass
24
+
25
+ # Catches all calls that were put on nil references ending with +?+ returning nil again.
26
+ # Calls without a question-mark are send to original +method_missing+.
27
+ def method_missing(sym,*args, &block)
28
+ method_name = sym.to_s
29
+ if /.+\?$/ =~ method_name
30
+ puts "nil '#{sym}' '#{args}' '#{block}'"
31
+ self
32
+ else
33
+ puts "nil missing '#{sym}' '#{args}' '#{block}'"
34
+ super.m_m(sym,*args, &block)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,53 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),'..','..','lib')
2
+
3
+ require "test/unit"
4
+ require "i_dont_give_a_shit"
5
+
6
+ class TestIDontGiveAShit < Test::Unit::TestCase
7
+
8
+ def test_some_wired_stuff
9
+ assert_equal(nil.send(:' ?'), nil)
10
+ assert_equal(nil.blow?(nil).up?(nil, nil){}.now?(0,1,3), nil)
11
+ end
12
+
13
+ def test_nil_check_still_works
14
+ assert_equal(nil.nil?, true)
15
+ assert_equal(''.nil?, false)
16
+ end
17
+
18
+ def test_method_with_questionmark_does_not_blow_up
19
+ assert_raise(NoMethodError) { nil.blowup }
20
+ nil.blowup?
21
+ end
22
+
23
+ def test_chained_method_with_questionmark_does_not_blow_up
24
+ assert_raise(NoMethodError) { nil.blowup?.up?.now }
25
+ nil.blowup?.up?.now?
26
+ end
27
+
28
+ def test_call_for_tosomething_works
29
+ assert_equal("", nil.to_s)
30
+ assert_equal('', nil.is_it_empty?.to_s)
31
+ assert_equal(0, nil.is_it_zeor?.to_i)
32
+ end
33
+
34
+ def test_call_with_block_success_does_not_blow_up
35
+ nil.some?.block?{puts 'hi'}
36
+ nil.some?('a','b','c').block?{puts 'hi'}
37
+ end
38
+
39
+ class Blow
40
+ def up
41
+ 'NOT!'
42
+ end
43
+ def not
44
+ nil
45
+ end
46
+ end
47
+
48
+ def test_call_for_existing_methods_works
49
+ assert_equal('NOT!', Blow.new.up?.to_s)
50
+ assert_equal('', Blow.new?.not?.to_s)
51
+ end
52
+
53
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: idgas
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - "Peter Schr\xC3\xB6der"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-05 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Helper for handling nil-calls.
17
+ email: phoetmail@googlemail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - README.rdoc
26
+ - lib/i_dont_give_a_shit.rb
27
+ has_rdoc: true
28
+ homepage: http://github.com/phoet/idgas
29
+ licenses: []
30
+
31
+ post_install_message:
32
+ rdoc_options:
33
+ - -a
34
+ - --inline-source
35
+ - --charset=UTF-8
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: "0"
43
+ version:
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: "0"
49
+ version:
50
+ requirements: []
51
+
52
+ rubyforge_project: none
53
+ rubygems_version: 1.3.5
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: If you just dont give a shit about nil add a questionmark to your method-call.
57
+ test_files:
58
+ - test/test_i_dont_give_a_shit.rb