quick_attr 0.0.1

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.
Files changed (3) hide show
  1. data/lib/quick_attr.rb +56 -0
  2. data/test/test_quick_attr.rb +146 -0
  3. metadata +78 -0
data/lib/quick_attr.rb ADDED
@@ -0,0 +1,56 @@
1
+ module QuickAttr
2
+ #QUICK_ATTR_NIL = "QUICK_ATTR_NIL".freeze
3
+ def quick_attr (*args)
4
+ args.each {|var|
5
+ ivar = "@#{var}"
6
+ # send :define_method, var, proc {|arg|
7
+ # return send (:instance_variable_get, ivar) if arg.nil?
8
+ # send (:instance_variable_set, ivar, arg)
9
+ # self
10
+ # }
11
+ class_eval "def #{var} (*arg,&block)
12
+ raise \"cannot call #{var} with block and (#{args.join(',')}\" if arg.length > 0 and block
13
+ arg[0] = block if block
14
+ return #{ivar} if arg.length == 0
15
+ #{ivar} = arg[0] if arg.length == 1
16
+ #{ivar} = arg if arg.length > 1
17
+ self
18
+ end"
19
+
20
+ #class_eval "def #{var} (arg=(QUICK_ATTR_NIL = \"\"))
21
+ # return #{ivar} if arg.object_id == QUICK_ATTR_NIL.object_id
22
+ # #{ivar} = arg
23
+ # self
24
+ #end"
25
+ }
26
+ end
27
+
28
+ def quick_klass (*args)
29
+ unless args.first.is_a? Class then
30
+ raise "quick_klass's first argument must be a class, was #{args.first}, try Hash, or Array for example"
31
+ end
32
+ klass = args.shift
33
+ args.each {|var|
34
+ ivar = "@#{var}"
35
+ class_eval "def #{var} (*arg)
36
+ if arg.length == 0 then
37
+ return #{ivar} = #{ivar} || #{klass.name}.new
38
+ else
39
+ #{ivar} = arg.is_a?(#{klass}) ? arg : #{klass}.new(arg)
40
+ self
41
+ end
42
+ end"
43
+
44
+ }
45
+
46
+ end
47
+
48
+ def quick_array (*args)
49
+ quick_klass(Array,*args)
50
+ end
51
+ def quick_hash (*args)
52
+ quick_klass(Hash,*args)
53
+ end
54
+ end
55
+
56
+
@@ -0,0 +1,146 @@
1
+ require 'lib/quick_attr'
2
+ require 'test/unit'
3
+
4
+ class TestQuickAttr < Test::Unit::TestCase
5
+ include Test::Unit
6
+
7
+ class Hello
8
+ extend QuickAttr
9
+ #include QuickAttr
10
+ end
11
+
12
+ def test_simple
13
+ Hello.quick_attr :one,:two,:three
14
+
15
+ h = Hello.new.one("A").two("B").three("C")
16
+ assert_equal "A", h.one
17
+ assert_equal "B", h.two
18
+ assert_equal "C", h.three
19
+
20
+ assert_equal -1,h.method(:one).arity
21
+ assert_equal -1,h.method(:two).arity
22
+ assert_equal -1,h.method(:three).arity
23
+ end
24
+
25
+
26
+ def test_simple2
27
+ Hello.quick_attr :one,:two,:three
28
+ h = Hello.new.one(100).two(200).three(300)
29
+ assert_equal 100, h.one
30
+ assert_equal 200, h.two
31
+ assert_equal 300, h.three
32
+
33
+ assert_equal -1,h.method(:one).arity
34
+ assert_equal -1,h.method(:two).arity
35
+ assert_equal -1,h.method(:three).arity
36
+ end
37
+
38
+ def test_nil_or_empty
39
+ Hello.quick_attr :_nil,:_empty,:_false
40
+ h = Hello.new._nil(nil)._empty("")._false(false)
41
+ assert_equal nil, h._nil
42
+ assert_equal "", h._empty
43
+ assert_equal false, h._false
44
+
45
+ assert_equal -1,h.method(:_nil).arity
46
+ assert_equal -1,h.method(:_empty).arity
47
+ assert_equal -1,h.method(:_false).arity
48
+ end
49
+
50
+ def test_arrays
51
+ Hello.quick_attr :one,:two,:three
52
+ h = Hello.new.one([]).two(1,2,3,4,5).three(nil)
53
+
54
+ assert_equal [], h.one
55
+ assert_equal [1,2,3,4,5], h.two
56
+ assert_equal nil, h.three
57
+ end
58
+
59
+ def test_proc
60
+ Hello.quick_attr :one,:two
61
+ h = Hello.new.one{true}.two(proc {3})
62
+ assert_equal true, h.one.call
63
+ assert_equal 3, h.two.call
64
+ begin
65
+ h.one ("args") {"fashl"}
66
+ fail "set either a block or a value... not both"
67
+ rescue; end
68
+ end
69
+
70
+ def test_class_space
71
+ Hello.quick_attr :one,:two
72
+ h = Hello.new.one(100).two(200)
73
+ puts h.instance_eval( "one + two")
74
+ assert_equal 300, h.instance_eval( "one + two")
75
+
76
+ end
77
+
78
+ class Hello2
79
+ extend QuickAttr
80
+ quick_attr :one,:two
81
+ quick_array :several
82
+ def three
83
+ one + two
84
+ end
85
+ end
86
+
87
+ def dont_test_class_space2
88
+
89
+ h = Hello2.new.one(111).two(222)
90
+ puts h.three
91
+ assert_equal 333,h.three
92
+ one = 10
93
+ two = 10
94
+ three = 10
95
+
96
+ b = h.instance_eval("proc do one + two + three end")
97
+ assert_equal 666, b.call
98
+ end
99
+
100
+ def test_quick_array
101
+ h = Hello2.new.several(:a,:b)
102
+ assert_equal [:a,:b],h.several
103
+ h.several(:a)
104
+ assert_equal [:a],h.several
105
+ end
106
+
107
+ def test_quick_array2
108
+ h = Hello2.new
109
+ h.several << :a
110
+ h.several << :b
111
+
112
+ assert_equal [:a,:b],h.several
113
+ h.several(:a)
114
+ assert_equal [:a],h.several
115
+ end
116
+
117
+ class NewArray < Array
118
+
119
+ end
120
+ class Hello3
121
+ extend QuickAttr
122
+ quick_attr :one,:two
123
+ quick_klass NewArray,:several
124
+ def three
125
+ one + two
126
+ end
127
+ end
128
+
129
+ def test_quick_array_with_class
130
+ h = Hello3.new
131
+ h.several << :a
132
+ h.several << :b
133
+
134
+ assert_equal [:a,:b],h.several
135
+ assert h.several.is_a?(NewArray), "Expected NewArray"
136
+ h.several(:a)
137
+ assert h.several.is_a?(NewArray), "Expected NewArray"
138
+ assert_equal [:a],h.several
139
+ assert h.several.is_a?(NewArray), "Expected NewArray"
140
+ end
141
+
142
+ end
143
+
144
+
145
+
146
+
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: quick_attr
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Dominic Tarr
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-10 00:00:00 +12:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: "\t\tusage:\n\
23
+ \t\trequire 'quick_attr'\n\
24
+ \t\tclass C\n\
25
+ \t\t\textend QuickAttr\n\
26
+ \t\t\tquick_attr :name, :smell\n\
27
+ \t\tend\n\n\
28
+ \t\t#set attr by passing value\n\
29
+ \t\tc = C.new.name(\"bobaloba ding-dong\").smell(\"fishy\")\n\n\
30
+ \t\t#get attr by calling without args...\n\
31
+ \t\tputs c.name\t# bobaloba ding-dong\n\
32
+ \t\tputs c.smell\t# fishy\n"
33
+ email: dominic.tarr@gmail.com
34
+ executables: []
35
+
36
+ extensions: []
37
+
38
+ extra_rdoc_files: []
39
+
40
+ files:
41
+ - lib/quick_attr.rb
42
+ - test/test_quick_attr.rb
43
+ has_rdoc: true
44
+ homepage: http://github.com/dominictarr/quick_attr
45
+ licenses: []
46
+
47
+ post_install_message:
48
+ rdoc_options: []
49
+
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ hash: 3
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ requirements: []
71
+
72
+ rubyforge_project:
73
+ rubygems_version: 1.3.7
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: chain attr methods
77
+ test_files: []
78
+