ruby-tables 0.1.0 → 0.1.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.
- data/README.rdoc +3 -1
- data/Rakefile +3 -3
- data/lib/table.rb +98 -21
- data/ruby-tables.gemspec +4 -4
- data/spec/table_spec.rb +18 -0
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -10,7 +10,9 @@ Any methods from the Enumerable module should work and will treat the table as a
|
|
10
10
|
ignoring any pairs inside it.
|
11
11
|
|
12
12
|
= Caveats
|
13
|
-
|
13
|
+
Like a hash, the order for paired objects is not guaranteed.
|
14
|
+
|
15
|
+
Also, as in lua, hash keys cannot be numeric indices. If you intend to use numeric hash keys,
|
14
16
|
they should be inside an array, such as:
|
15
17
|
Table[ [ 2 ] => 4 ]
|
16
18
|
|
data/Rakefile
CHANGED
@@ -4,10 +4,10 @@ require 'rake'
|
|
4
4
|
begin
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.version = "0.1.
|
7
|
+
gem.version = "0.1.1"
|
8
8
|
gem.name = "ruby-tables"
|
9
|
-
gem.summary = %Q{
|
10
|
-
gem.description = %Q{A table data structure implemented in
|
9
|
+
gem.summary = %Q{Lua tables for Ruby}
|
10
|
+
gem.description = %Q{A table data structure implemented in Ruby}
|
11
11
|
gem.email = "nick.loves.rails@gmail.com"
|
12
12
|
gem.homepage = "http://github.com/Abica/ruby-tables"
|
13
13
|
gem.authors = [ "Nicholas Wright" ]
|
data/lib/table.rb
CHANGED
@@ -1,11 +1,40 @@
|
|
1
|
-
#
|
1
|
+
#
|
2
|
+
# A table is a basically a combination of an array and a hash.
|
3
|
+
#
|
4
|
+
# Actually a possibly easier way to think of them would be as
|
5
|
+
# Arrays that have some metadata in the form of a hash.
|
6
|
+
#
|
7
|
+
# You can also access symbolized hash keys with dot notation, making them
|
8
|
+
# really convenient for a lot of things.
|
9
|
+
#
|
10
|
+
# For instance:
|
11
|
+
#
|
12
|
+
# t = Table[ 1, 2, 3, 4, { :a => "1", :b => "2" }, 7, 8 ]
|
13
|
+
# t #=> Table[1, 2, 3, 4, 7, 8, {:b=>"2", :a=>"1"}]
|
14
|
+
#
|
15
|
+
# t.size #=> 8
|
16
|
+
# t.b #=> "2"
|
17
|
+
#
|
18
|
+
# t.b = Table[ 255, 0, 0, { :color => "red" } ]
|
19
|
+
# t.b.color #=> "red"
|
20
|
+
# r, b, g = *t.b
|
21
|
+
# print r, g, b #=> 25500
|
22
|
+
#
|
23
|
+
# t #=> Table[1, 2, 3, 4, 7, 8, {:b=>Table[255, 0, 0, {:color=>"red"}], :a=>"1", :c=>"3"}]
|
24
|
+
#
|
25
|
+
# t << %{ a b c d }
|
26
|
+
# t.last #=> ["a", "b", "c", "d"]
|
27
|
+
# t[ -3 ] #=> 7
|
28
|
+
#
|
29
|
+
# t #=> Table[1, 2, 3, 4, 7, 8, ["a", "b", "c", "d"], {:b=>Table[255, 0, 0, {:color=>"red"}], :a=>"1", :c=>"3"}]
|
30
|
+
#
|
2
31
|
class Table
|
3
32
|
include Enumerable
|
4
33
|
|
5
34
|
# takes a comma separated list of arrays and hashes and returns a table
|
6
35
|
#
|
7
|
-
#
|
8
|
-
# Table[
|
36
|
+
# t = Table[ 1, 2, 3, 4, { :a => 3, :b => 5 }, 7, 8, { :c => 33 } ]
|
37
|
+
# t #=> Table[1, 2, 3, 4, 7, 8, {:a=>3, :b=>5, :c=>33}]
|
9
38
|
def self.[] *args
|
10
39
|
new *args
|
11
40
|
end
|
@@ -26,11 +55,16 @@ class Table
|
|
26
55
|
#
|
27
56
|
# t.a #=> 4
|
28
57
|
# t.b #=> 5
|
29
|
-
def [] key
|
30
|
-
if
|
31
|
-
|
32
|
-
|
33
|
-
|
58
|
+
def [] key, *rest
|
59
|
+
return @values.slice( key, *rest ) if rest.any?
|
60
|
+
|
61
|
+
case key
|
62
|
+
when Range
|
63
|
+
@values.slice key
|
64
|
+
when Integer
|
65
|
+
@values[ key ]
|
66
|
+
else
|
67
|
+
@records[ key ]
|
34
68
|
end
|
35
69
|
end
|
36
70
|
|
@@ -38,8 +72,10 @@ class Table
|
|
38
72
|
# if no entry exists for the given key or index then one is created
|
39
73
|
#
|
40
74
|
# t = Table[ :a => "abcde", :b => 44332211 ]
|
75
|
+
#
|
41
76
|
# t[ :a ] = 43
|
42
77
|
# t[ :a ] #=> 43
|
78
|
+
#
|
43
79
|
# t[ 0 ] = 54
|
44
80
|
# t.first #=> 54
|
45
81
|
#
|
@@ -62,17 +98,25 @@ class Table
|
|
62
98
|
end
|
63
99
|
end
|
64
100
|
|
65
|
-
#
|
101
|
+
# adds a hash or value to a table
|
66
102
|
#
|
67
103
|
# t = Table[ 1, 2, 3 ]
|
104
|
+
#
|
68
105
|
# t << { :a => 4, :b => 4 }
|
106
|
+
# t.pairs #=> { :a => 4, :b => 4 }
|
107
|
+
#
|
108
|
+
# t << 40000
|
109
|
+
# t.to_a #=> [ 1, 2, 3, 40000 ]
|
69
110
|
def << arg
|
70
111
|
process arg
|
71
112
|
end
|
72
113
|
|
73
114
|
# combines 2 tables
|
74
115
|
#
|
75
|
-
# Table[ :a => 4, :b => 5 ] + Table[ 1, 2, 3, 4, { :c => 4 } ]
|
116
|
+
# t = Table[ :a => 4, :b => 5 ] + Table[ 1, 2, 3, 4, { :c => 4 } ]
|
117
|
+
#
|
118
|
+
# t.pairs #=> { :a => 4, :b => 5, :c => 4 }
|
119
|
+
# t.to_a #=> [ 1, 2, 3, 4 ]
|
76
120
|
def + other
|
77
121
|
values = self.to_a + other.to_a
|
78
122
|
Table[ self.pairs, other.pairs, *values ]
|
@@ -117,12 +161,30 @@ class Table
|
|
117
161
|
@values.sort &block
|
118
162
|
end
|
119
163
|
|
164
|
+
# slice a table like an array
|
165
|
+
#
|
166
|
+
# t = Table[ 2, 23, 54, { :a => 4 }, 49 ]
|
167
|
+
# t[ 2..4 ] #=> [ 54, 49 ]
|
168
|
+
def slice *args
|
169
|
+
@values.slice *args
|
170
|
+
end
|
171
|
+
|
120
172
|
# iterate through the key => value pairs in the table
|
173
|
+
#
|
174
|
+
# t = Table[ 1, 2, { :a => "cat", :b => "dog" } ]
|
175
|
+
#
|
176
|
+
# t.each_pair { | k, v | print k, v }
|
177
|
+
# #=> bdogacat
|
121
178
|
def each_pair &block
|
122
179
|
@records.each_pair &block
|
123
180
|
end
|
124
181
|
|
125
182
|
# iterate through the hash keys in the table
|
183
|
+
#
|
184
|
+
# t = Table[ 1, 2, { :a => "cat", :b => "dog" } ]
|
185
|
+
#
|
186
|
+
# t.each_key { | k | print k }
|
187
|
+
# #=> ab
|
126
188
|
def each_key &block
|
127
189
|
@records.each_key &block
|
128
190
|
end
|
@@ -151,7 +213,18 @@ class Table
|
|
151
213
|
@records.values
|
152
214
|
end
|
153
215
|
|
216
|
+
def inspect
|
217
|
+
hsh = pairs
|
218
|
+
str = []
|
219
|
+
|
220
|
+
str << map { | item | item.inspect } if any?
|
221
|
+
str << "{#{ hsh.map { | key, val | "#{ key.inspect }=>#{ val.inspect }" } }}" if hsh.any?
|
222
|
+
|
223
|
+
"Table[#{ str.join( ", " ) }]"
|
224
|
+
end
|
225
|
+
|
154
226
|
private
|
227
|
+
# adds +args+ into the table
|
155
228
|
def process *args
|
156
229
|
args.each do | arg |
|
157
230
|
if arg.is_a? Hash
|
@@ -162,23 +235,27 @@ class Table
|
|
162
235
|
end
|
163
236
|
end
|
164
237
|
|
238
|
+
# adds a hash entries to the table and creates
|
239
|
+
# setters and getters for them if the keys are symbolized
|
240
|
+
#
|
241
|
+
# any keys that are numeric are wrapped in an array so as
|
242
|
+
# not to overlap array indices which could get confusing
|
165
243
|
def process_hash hsh
|
166
244
|
hsh.each do | key, value |
|
167
245
|
key = [ key ] if key.is_a? Integer
|
168
246
|
@records[ key ] = value
|
169
247
|
|
170
|
-
|
171
|
-
|
248
|
+
if key.is_a? Symbol and not respond_to? "#{ key }="
|
249
|
+
instance_eval <<-EOM
|
250
|
+
def #{ key }
|
251
|
+
@records[ :#{ key } ]
|
252
|
+
end
|
172
253
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
def #{ key }= value
|
179
|
-
@records[ :#{ key } ] = value
|
180
|
-
end
|
181
|
-
EOM
|
254
|
+
def #{ key }= value
|
255
|
+
@records[ :#{ key } ] = value
|
256
|
+
end
|
257
|
+
EOM
|
258
|
+
end
|
182
259
|
end
|
183
260
|
end
|
184
261
|
|
data/ruby-tables.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ruby-tables}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Nicholas Wright"]
|
12
|
-
s.date = %q{2010-02-
|
13
|
-
s.description = %q{A table data structure implemented in
|
12
|
+
s.date = %q{2010-02-14}
|
13
|
+
s.description = %q{A table data structure implemented in Ruby}
|
14
14
|
s.email = %q{nick.loves.rails@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"README.rdoc"
|
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.rdoc_options = ["--charset=UTF-8"]
|
30
30
|
s.require_paths = ["lib"]
|
31
31
|
s.rubygems_version = %q{1.3.5}
|
32
|
-
s.summary = %q{
|
32
|
+
s.summary = %q{Lua tables for Ruby}
|
33
33
|
s.test_files = [
|
34
34
|
"spec/spec_helper.rb",
|
35
35
|
"spec/table_spec.rb"
|
data/spec/table_spec.rb
CHANGED
@@ -26,6 +26,14 @@ describe Table do
|
|
26
26
|
@table[ :k ].should == @args[ 5 ][ :k ]
|
27
27
|
@table[ :v ].should == @args[ 8 ][ :v ]
|
28
28
|
end
|
29
|
+
|
30
|
+
it "returns an array when sliced with a range" do
|
31
|
+
@table[ 1..3 ].should == @array_vals[ 1..3 ]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "returns an array when sliced with a start and length" do
|
35
|
+
@table[ 4, 5 ].should == @array_vals[ 4, 5 ]
|
36
|
+
end
|
29
37
|
end
|
30
38
|
|
31
39
|
describe "#[]=" do
|
@@ -143,6 +151,16 @@ describe Table do
|
|
143
151
|
end
|
144
152
|
end
|
145
153
|
|
154
|
+
describe "#slice" do
|
155
|
+
it "returns a sub array based on a range" do
|
156
|
+
@table.slice( 1..3 ).should == @array_vals.slice( 1..3 )
|
157
|
+
end
|
158
|
+
|
159
|
+
it "returns a sub array based on a start and length" do
|
160
|
+
@table.slice( 4, 5 ).should == @array_vals.slice( 4, 5 )
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
146
164
|
describe "#pairs" do
|
147
165
|
it "returns a hash of all of the key => value pairs" do
|
148
166
|
pairs = @table.pairs
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-tables
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Wright
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-14 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -22,7 +22,7 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 1.2.2
|
24
24
|
version:
|
25
|
-
description: A table data structure implemented in
|
25
|
+
description: A table data structure implemented in Ruby
|
26
26
|
email: nick.loves.rails@gmail.com
|
27
27
|
executables: []
|
28
28
|
|
@@ -66,7 +66,7 @@ rubyforge_project:
|
|
66
66
|
rubygems_version: 1.3.5
|
67
67
|
signing_key:
|
68
68
|
specification_version: 3
|
69
|
-
summary:
|
69
|
+
summary: Lua tables for Ruby
|
70
70
|
test_files:
|
71
71
|
- spec/spec_helper.rb
|
72
72
|
- spec/table_spec.rb
|