typed_accessors 0.1 → 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/README +26 -6
- data/Rakefile +55 -21
- data/docs/typed_accessors/classes/Class.html +260 -0
- data/docs/typed_accessors/created.rid +1 -0
- data/docs/typed_accessors/files/COPYING.html +133 -0
- data/docs/typed_accessors/files/README.html +156 -0
- data/docs/typed_accessors/files/lib/typed_accessors_rb.html +123 -0
- data/docs/typed_accessors/fr_class_index.html +27 -0
- data/docs/typed_accessors/fr_file_index.html +29 -0
- data/docs/typed_accessors/fr_method_index.html +30 -0
- data/docs/typed_accessors/index.html +24 -0
- data/docs/typed_accessors/rdoc-style.css +208 -0
- data/lib/typed_accessors.rb +33 -26
- data/test/basic_test.rb +118 -0
- metadata +21 -5
data/lib/typed_accessors.rb
CHANGED
@@ -1,19 +1,46 @@
|
|
1
|
+
# Typed accessors works as a Mixin on Class. It creates a set of
|
2
|
+
# functions that are used in the class definition which eval and
|
3
|
+
# create new accessor methods at class eval time (so little
|
4
|
+
# performance penalty). For now, this is limitted to built in types,
|
5
|
+
# float, int, boolean, and date, though this approach could clearly be
|
6
|
+
# expanded.
|
7
|
+
#
|
8
|
+
# Example of a class definition
|
9
|
+
#
|
10
|
+
# class MyClass
|
11
|
+
# float_accessor :distance
|
12
|
+
# int_accessor :count
|
13
|
+
# bool_yn_accessor :onfire
|
14
|
+
# date_accessor :day
|
15
|
+
# end
|
16
|
+
|
1
17
|
class Class
|
18
|
+
|
19
|
+
# Creates a boolean accessor. It will convert and incoming string
|
20
|
+
# to a true / false value. If the string is "y" or "yes" it will be
|
21
|
+
# true, otherwise false.
|
2
22
|
def bool_yn_accessor( *symbols )
|
3
23
|
attr_reader( *symbols )
|
4
24
|
bool_yn_writer( *symbols )
|
5
25
|
end
|
6
26
|
|
27
|
+
|
28
|
+
# Creates a float accessor, using built in .to_f functions on
|
29
|
+
# objects. Any object that has a .to_f is supported.
|
7
30
|
def float_accessor( *symbols )
|
8
|
-
|
31
|
+
attr_reader( *symbols )
|
9
32
|
float_writer( *symbols )
|
10
33
|
end
|
11
34
|
|
35
|
+
# Creates an int accessor, using built in .to_i functions on
|
36
|
+
# objects. Any object that has a .to_i is supported.
|
12
37
|
def int_accessor( *symbols )
|
13
|
-
|
38
|
+
attr_reader( *symbols )
|
14
39
|
int_writer( *symbols )
|
15
40
|
end
|
16
41
|
|
42
|
+
# Creates a data accessor using the Date parse function on
|
43
|
+
# strings. Not defined for other input types.
|
17
44
|
def date_accessor( *symbols )
|
18
45
|
attr_reader( *symbols )
|
19
46
|
date_writer( *symbols )
|
@@ -25,7 +52,7 @@ class Class
|
|
25
52
|
symbols.each do |symbol|
|
26
53
|
class_eval(<<-EOS, __FILE__, __LINE__)
|
27
54
|
def #{symbol}=(val)
|
28
|
-
if val.
|
55
|
+
if val.is_a? String
|
29
56
|
instance_variable_set("@#{symbol}", Date.parse(val))
|
30
57
|
else
|
31
58
|
instance_variable_set("@#{symbol}", val)
|
@@ -39,7 +66,7 @@ class Class
|
|
39
66
|
symbols.each do |symbol|
|
40
67
|
class_eval(<<-EOS, __FILE__, __LINE__)
|
41
68
|
def #{symbol}=(val)
|
42
|
-
if val.
|
69
|
+
if (val.is_a? String and val =~ /^(y(es)?|t(rue)?)$/i) or val == true then
|
43
70
|
instance_variable_set("@#{symbol}", true)
|
44
71
|
else
|
45
72
|
instance_variable_set("@#{symbol}", false)
|
@@ -49,42 +76,22 @@ class Class
|
|
49
76
|
end
|
50
77
|
end
|
51
78
|
|
52
|
-
def float_reader( *symbols )
|
53
|
-
symbols.each do |symbol|
|
54
|
-
class_eval(<<-EOS, __FILE__, __LINE__)
|
55
|
-
def #{symbol}
|
56
|
-
instance_variable_get("@#{symbol}")
|
57
|
-
end
|
58
|
-
EOS
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
79
|
def float_writer( *symbols )
|
63
80
|
symbols.each do |symbol|
|
64
81
|
class_eval(<<-EOS, __FILE__, __LINE__)
|
65
82
|
def #{symbol}=(val)
|
66
|
-
if !val.respond_to?('to_f') then raise ArgumentError, "#{symbol} must be
|
83
|
+
if !val.respond_to?('to_f') then raise ArgumentError, "#{symbol} must be Float" end
|
67
84
|
instance_variable_set("@#{symbol}", val.to_f)
|
68
85
|
end
|
69
86
|
EOS
|
70
87
|
end
|
71
88
|
end
|
72
89
|
|
73
|
-
def int_reader( *symbols )
|
74
|
-
symbols.each do |symbol|
|
75
|
-
class_eval(<<-EOS, __FILE__, __LINE__)
|
76
|
-
def #{symbol}
|
77
|
-
instance_variable_get("@#{symbol}")
|
78
|
-
end
|
79
|
-
EOS
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
90
|
def int_writer( *symbols )
|
84
91
|
symbols.each do |symbol|
|
85
92
|
class_eval(<<-EOS, __FILE__, __LINE__)
|
86
93
|
def #{symbol}=(val)
|
87
|
-
if !val.respond_to?('to_i') then raise ArgumentError, "#{symbol} must be
|
94
|
+
if !val.respond_to?('to_i') then raise ArgumentError, "#{symbol} must be Integer" end
|
88
95
|
instance_variable_set("@#{symbol}", val.to_i)
|
89
96
|
end
|
90
97
|
EOS
|
data/test/basic_test.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'date'
|
5
|
+
require 'typed_accessors'
|
6
|
+
|
7
|
+
class TypedExample
|
8
|
+
float_accessor :dollars
|
9
|
+
int_accessor :count
|
10
|
+
bool_yn_accessor :onfire
|
11
|
+
date_accessor :day
|
12
|
+
end
|
13
|
+
|
14
|
+
class TestTypedAccessors < Test::Unit::TestCase
|
15
|
+
|
16
|
+
def test_date
|
17
|
+
t = TypedExample.new
|
18
|
+
t.day = Date.today
|
19
|
+
assert_instance_of Date, t.day
|
20
|
+
assert_equal Date.today, t.day
|
21
|
+
|
22
|
+
t.day = Date.today.strftime("%Y-%m-%d")
|
23
|
+
assert_instance_of Date, t.day
|
24
|
+
assert_equal Date.today, t.day
|
25
|
+
|
26
|
+
# this might fail depending on locale, need to figure out a
|
27
|
+
# better way to handle that
|
28
|
+
t.day = Date.today.strftime("%m/%d/%Y")
|
29
|
+
assert_instance_of Date, t.day
|
30
|
+
assert_equal Date.today, t.day
|
31
|
+
|
32
|
+
assert_raise ArgumentError do
|
33
|
+
t.day = Date.today.strftime("foo")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_float
|
38
|
+
t = TypedExample.new
|
39
|
+
|
40
|
+
t.dollars = "54"
|
41
|
+
assert_instance_of Float, t.dollars
|
42
|
+
assert_equal 54.0, t.dollars
|
43
|
+
|
44
|
+
t.dollars = "54.200000"
|
45
|
+
assert_instance_of Float, t.dollars
|
46
|
+
assert_equal 54.2, t.dollars
|
47
|
+
|
48
|
+
t.dollars = 54
|
49
|
+
assert_instance_of Float, t.dollars
|
50
|
+
assert_equal 54.0, t.dollars
|
51
|
+
|
52
|
+
t.dollars = "foo"
|
53
|
+
assert_instance_of Float, t.dollars
|
54
|
+
assert_equal 0.0, t.dollars
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_int
|
59
|
+
t = TypedExample.new
|
60
|
+
|
61
|
+
t.count = "54"
|
62
|
+
assert_instance_of Fixnum, t.count
|
63
|
+
assert_equal 54, t.count
|
64
|
+
|
65
|
+
t.count = "54.200000"
|
66
|
+
assert_instance_of Fixnum, t.count
|
67
|
+
assert_equal 54, t.count
|
68
|
+
|
69
|
+
t.count = 54.0
|
70
|
+
assert_instance_of Fixnum, t.count
|
71
|
+
assert_equal 54, t.count
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_bool
|
75
|
+
t = TypedExample.new
|
76
|
+
|
77
|
+
t.onfire = "Y"
|
78
|
+
assert_instance_of TrueClass, t.onfire
|
79
|
+
assert_equal true, t.onfire
|
80
|
+
|
81
|
+
t.onfire = "54.200000"
|
82
|
+
assert_instance_of FalseClass, t.onfire
|
83
|
+
assert_equal false, t.onfire
|
84
|
+
|
85
|
+
t.onfire = "y"
|
86
|
+
assert_instance_of TrueClass, t.onfire
|
87
|
+
assert_equal true, t.onfire
|
88
|
+
|
89
|
+
t.onfire = "yes"
|
90
|
+
assert_instance_of TrueClass, t.onfire
|
91
|
+
assert_equal true, t.onfire
|
92
|
+
|
93
|
+
t.onfire = "yessir"
|
94
|
+
assert_instance_of FalseClass, t.onfire
|
95
|
+
assert_equal false, t.onfire
|
96
|
+
|
97
|
+
t.onfire = "t"
|
98
|
+
assert_instance_of TrueClass, t.onfire
|
99
|
+
assert_equal true, t.onfire
|
100
|
+
|
101
|
+
t.onfire = "TRUE"
|
102
|
+
assert_instance_of TrueClass, t.onfire
|
103
|
+
assert_equal true, t.onfire
|
104
|
+
|
105
|
+
t.onfire = "truth"
|
106
|
+
assert_instance_of FalseClass, t.onfire
|
107
|
+
assert_equal false, t.onfire
|
108
|
+
|
109
|
+
t.onfire = false
|
110
|
+
assert_instance_of FalseClass, t.onfire
|
111
|
+
assert_equal false, t.onfire
|
112
|
+
|
113
|
+
t.onfire = true
|
114
|
+
assert_instance_of TrueClass, t.onfire
|
115
|
+
assert_equal true, t.onfire
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
metadata
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typed_accessors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "0.
|
4
|
+
version: "0.2"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Sean Dague
|
8
8
|
autorequire: typed_accessors
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-03-
|
12
|
+
date: 2009-03-29 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: Defines easy to use additional functions to creating typed accessors, which auto convert the attributes to non string types
|
17
|
-
email:
|
17
|
+
email: sean@dague.net
|
18
18
|
executables: []
|
19
19
|
|
20
20
|
extensions: []
|
@@ -23,7 +23,22 @@ extra_rdoc_files:
|
|
23
23
|
- README
|
24
24
|
- COPYING
|
25
25
|
files:
|
26
|
+
- test/basic_test.rb
|
26
27
|
- lib/typed_accessors.rb
|
28
|
+
- docs/typed_accessors
|
29
|
+
- docs/typed_accessors/created.rid
|
30
|
+
- docs/typed_accessors/rdoc-style.css
|
31
|
+
- docs/typed_accessors/classes
|
32
|
+
- docs/typed_accessors/classes/Class.html
|
33
|
+
- docs/typed_accessors/fr_method_index.html
|
34
|
+
- docs/typed_accessors/fr_class_index.html
|
35
|
+
- docs/typed_accessors/fr_file_index.html
|
36
|
+
- docs/typed_accessors/index.html
|
37
|
+
- docs/typed_accessors/files
|
38
|
+
- docs/typed_accessors/files/COPYING.html
|
39
|
+
- docs/typed_accessors/files/README.html
|
40
|
+
- docs/typed_accessors/files/lib
|
41
|
+
- docs/typed_accessors/files/lib/typed_accessors_rb.html
|
27
42
|
- Rakefile
|
28
43
|
- README
|
29
44
|
- COPYING
|
@@ -33,6 +48,7 @@ post_install_message:
|
|
33
48
|
rdoc_options:
|
34
49
|
- --main
|
35
50
|
- README
|
51
|
+
- --accessor int_accessor="RW int" --accessor int_reader="R int" --accessor int_writer="W int" --accessor float_accessor="RW float" --accessor float_reader="R float" --accessor float_writer="W float" --accessor bool_yn_accessor="RW bool" --accessor bool_yn_reader="R bool" --accessor bool_yn_writer="W bool"
|
36
52
|
require_paths:
|
37
53
|
- lib
|
38
54
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -49,7 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
49
65
|
version:
|
50
66
|
requirements: []
|
51
67
|
|
52
|
-
rubyforge_project:
|
68
|
+
rubyforge_project: http://rubyforge.org/projects/sdaguegems
|
53
69
|
rubygems_version: 1.3.1
|
54
70
|
signing_key:
|
55
71
|
specification_version: 2
|