key_struct 0.1.1 → 0.1.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.rdoc +29 -9
- data/lib/key_struct.rb +3 -4
- data/lib/key_struct/version.rb +1 -1
- metadata +9 -9
data/README.rdoc
CHANGED
@@ -18,7 +18,7 @@ Then you can create an instance of the class using keywords for the parameters:
|
|
18
18
|
|
19
19
|
name = Name.new(:first => "Jack", :last => "Ripper")
|
20
20
|
|
21
|
-
and you have the usal readers and writers
|
21
|
+
and you have the usal readers and writers
|
22
22
|
|
23
23
|
name.first # --> "Jack"
|
24
24
|
name.last # --> "Ripper"
|
@@ -26,13 +26,28 @@ and you have the usal readers and writers:
|
|
26
26
|
name.last # --> "Sprat"
|
27
27
|
name.to_s # --> "Sprat, Jack" for the enhanced class example
|
28
28
|
|
29
|
-
== Readers and Writers
|
30
29
|
|
31
|
-
|
30
|
+
== Readers, Writers, and Instance Variables
|
31
|
+
|
32
|
+
As per above, the normal behavior is to get readers and writers. But, by analogy with +attr_reader+ vs +attr_accessor+, you can choose whether you want read/write or just read:
|
32
33
|
|
33
34
|
Writeable = KeyStruct.accesor(:first, :last) # aliased as KeyStruct[]
|
34
35
|
Readonly = KeyStruct.reader(:first, :last) # class has readers but not writers
|
35
36
|
|
37
|
+
The analogy is not just skin deep: +KeyStruct+ actually uses
|
38
|
+
+attr_accessor+ or +attr_reader+ to define the accessors for the generated class.
|
39
|
+
This means that you also get the corresponding instance variables:
|
40
|
+
|
41
|
+
name.instance_variable_get("@last") # --> "Sprat"
|
42
|
+
name.instance_variable_set("@last", "Sparrow")
|
43
|
+
name.last # --> "Sparrow"
|
44
|
+
|
45
|
+
The instance variables can be useful of course when using KeyStruct to define an anonymous
|
46
|
+
base class for your own classes, as shown for the +to_s+ example above.
|
47
|
+
|
48
|
+
(This is one way that +KeyStruct+ differs from ruby's built-in +Struct+:
|
49
|
+
built-in +Struct+ does not define instance variables.)
|
50
|
+
|
36
51
|
== Default values
|
37
52
|
|
38
53
|
If you leave off a keyword when instantiating, normally the member value is nil:
|
@@ -40,7 +55,8 @@ If you leave off a keyword when instantiating, normally the member value is nil:
|
|
40
55
|
name = Name.new(:first => "Jack")
|
41
56
|
name.last # --> nil
|
42
57
|
|
43
|
-
But the class
|
58
|
+
But when you define the class you can specify defaults that will be filled in by
|
59
|
+
the class initializer. For example:
|
44
60
|
|
45
61
|
Name = KeyStruct[:first, :last => "Doe"]
|
46
62
|
|
@@ -48,11 +64,15 @@ But the class definition can specify defaults, e.g.
|
|
48
64
|
name.first # --> "John"
|
49
65
|
name.last # --> "Doe"
|
50
66
|
|
67
|
+
name = Name.new(:first => "John", :last => "Deere")
|
68
|
+
name.first # --> "John"
|
69
|
+
name.last # --> "Deere"
|
70
|
+
|
51
71
|
== Argument Checking
|
52
72
|
|
53
73
|
The struct initializer checks for invalid arguments:
|
54
74
|
|
55
|
-
name = Name.new(:
|
75
|
+
name = Name.new(:this_is_a_typo => "Xavier") # --> raises ArgumentError
|
56
76
|
|
57
77
|
== Equaltiy
|
58
78
|
|
@@ -77,17 +97,17 @@ Requires ruby >= 1.9.2. (Has been tested on MRI 1.9.2 and MRI 1.9.3)
|
|
77
97
|
|
78
98
|
== History
|
79
99
|
|
100
|
+
Past: There was some discussion around this idea in this thread:
|
101
|
+
http://www.ruby-forum.com/topic/138124 in 2008.
|
102
|
+
|
80
103
|
Future: I hope that this gem will be obviated in future versions of ruby.
|
81
104
|
|
82
105
|
== Note on Patches/Pull Requests
|
83
106
|
|
84
107
|
* Fork the project.
|
85
108
|
* Make your feature addition or bug fix.
|
86
|
-
* Add tests for it.
|
87
|
-
future version unintentionally. Make sure that the coverage report
|
109
|
+
* Add tests for it. Make sure that the coverage report
|
88
110
|
(generated automatically when you run rspec) is at 100%
|
89
|
-
* Commit, do not mess with Rakefile, version, or history.
|
90
|
-
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
91
111
|
* Send me a pull request.
|
92
112
|
|
93
113
|
== Copyright
|
data/lib/key_struct.rb
CHANGED
@@ -17,23 +17,22 @@ module KeyStruct
|
|
17
17
|
private
|
18
18
|
|
19
19
|
def self.define_key_struct(access, keys)
|
20
|
-
|
21
|
-
klass.class_eval do
|
20
|
+
Class.new.class_eval do
|
22
21
|
keyvalues = Hash[*keys.map{|key| (Hash === key) ? key.to_a : [key, nil]}.flatten(2)]
|
23
22
|
keys = keyvalues.keys
|
24
23
|
send access, *keys
|
25
24
|
define_method(:initialize) do |args={}|
|
26
25
|
args = keyvalues.merge(args)
|
27
26
|
keys.each do |key|
|
28
|
-
instance_variable_set("@#{key}", args.delete(key))
|
27
|
+
instance_variable_set("@#{key}".to_sym, args.delete(key))
|
29
28
|
end
|
30
29
|
raise ArgumentError, "Invalid argument(s): #{args.keys.map(&:inspect).join(' ')}; KeyStruct accepts #{keys.map(&:inspect).join(' ')}" if args.any?
|
31
30
|
end
|
32
31
|
define_method(:==) do |other|
|
33
32
|
keys.all?{|key| self.send(key) == other.send(key)}
|
34
33
|
end
|
34
|
+
self
|
35
35
|
end
|
36
|
-
klass
|
37
36
|
end
|
38
37
|
|
39
38
|
end
|
data/lib/key_struct/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: key_struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-11-
|
12
|
+
date: 2011-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70161596448140 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70161596448140
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: simplecov
|
27
|
-
requirement: &
|
27
|
+
requirement: &70161596447560 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70161596447560
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: simplecov-gem-adapter
|
38
|
-
requirement: &
|
38
|
+
requirement: &70161596438560 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70161596438560
|
47
47
|
description: Defines KeyStruct analogous to Struct, but constructor takes keyword
|
48
48
|
arguments
|
49
49
|
email:
|
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
84
|
version: '0'
|
85
85
|
requirements: []
|
86
86
|
rubyforge_project:
|
87
|
-
rubygems_version: 1.8.
|
87
|
+
rubygems_version: 1.8.10
|
88
88
|
signing_key:
|
89
89
|
specification_version: 3
|
90
90
|
summary: Defines KeyStruct analogous to Struct, but constructor takes keyword arguments
|