ntable 0.1.4 → 0.1.5
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/History.rdoc +8 -0
- data/Version +1 -1
- data/lib/ntable/construction.rb +30 -9
- data/lib/ntable/structure.rb +25 -0
- data/lib/ntable/table.rb +10 -1
- data/test/tc_decompose.rb +7 -0
- data/test/tc_nested_object.rb +9 -1
- metadata +1 -1
data/History.rdoc
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
=== 0.1.5 / 2012-09-24
|
2
|
+
|
3
|
+
* INCOMPATIBLE CHANGE: Renamed :postprocess option in NTable.from_nested_object to :postprocess_labels.
|
4
|
+
* NTable.from_nested_object learned :postprocess_range, which postprocesses a range for an IndexedAxis.
|
5
|
+
* NTable.from_nested_object raised NoSuchCellError if you used :postprocess_label to remove a label accessed in the data. Now the data is just thrown away silently.
|
6
|
+
* Calling decompose on a "shared" table (i.e. a slice previously obtained from decompose or shared_slice) yielded the wrong table. (The offset into the original table was incorrect.) Fixed.
|
7
|
+
* Implemented a slightly nicer inspect for each type.
|
8
|
+
|
1
9
|
=== 0.1.4 / 2012-09-24
|
2
10
|
|
3
11
|
* NTable::Structure and NTable::AxisInfo are now Enumerable, letting you iterate over the axes and labels, respectively.
|
data/Version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
data/lib/ntable/construction.rb
CHANGED
@@ -119,13 +119,25 @@ module NTable
|
|
119
119
|
# proc is provided, the resulting axis will be a LabeledAxis.
|
120
120
|
# You can also pass true instead of a Proc; this will create an
|
121
121
|
# LabeledAxis and make the conversion a simple to_s.
|
122
|
-
# [<tt>:
|
123
|
-
# An optional Proc that postprocesses the final labels array
|
124
|
-
#
|
125
|
-
#
|
126
|
-
#
|
122
|
+
# [<tt>:postprocess_labels</tt>]
|
123
|
+
# An optional Proc that postprocesses the final labels array, if
|
124
|
+
# a LabeledAxis or an ObjectAxis is being generated.
|
125
|
+
# It should take an array of labels and return the desired array.
|
126
|
+
# You may modify the array in place and return the original.
|
127
|
+
# This is called after any sort has been completed.
|
127
128
|
# You can use this, for example, to "fill in" labels that were
|
128
129
|
# not present in the original data.
|
130
|
+
# WARNING: if you remove labels from the array, any data in those
|
131
|
+
# locations will silently be lost.
|
132
|
+
# [<tt>:postprocess_range</tt>]
|
133
|
+
# An optional Proc that postprocesses the final integer range, if
|
134
|
+
# an IndexedAxis is being generated.
|
135
|
+
# It should take a Range of integer as an argument, and return
|
136
|
+
# either the original or a different Range.
|
137
|
+
# You can use this, for example, to extend the range of this axis
|
138
|
+
# beyond that for which data exists.
|
139
|
+
# WARNING: if you remove values from the range, any data in those
|
140
|
+
# locations will silently be lost.
|
129
141
|
#
|
130
142
|
# The third argument is an optional hash of miscellaneous options.
|
131
143
|
# The following keys are recognized:
|
@@ -195,11 +207,17 @@ module NTable
|
|
195
207
|
end
|
196
208
|
labels_.sort!(&func_)
|
197
209
|
end
|
198
|
-
postprocess_ = field_[:
|
199
|
-
labels_ = postprocess_.call(labels_) if postprocess_.respond_to?(:call)
|
210
|
+
postprocess_ = field_[:postprocess_labels]
|
211
|
+
labels_ = postprocess_.call(labels_) || labels_ if postprocess_.respond_to?(:call)
|
200
212
|
axis_ = klass_.new(labels_)
|
201
213
|
when ::Array
|
202
|
-
|
214
|
+
range_ = ((ai_[0].to_i)...(ai_[1].to_i))
|
215
|
+
postprocess_ = field_[:postprocess_range]
|
216
|
+
range_ = postprocess_.call(range_) || range_ if postprocess_.respond_to?(:call)
|
217
|
+
ai_[0] = range_.first.to_i
|
218
|
+
ai_[1] = range_.last.to_i
|
219
|
+
ai_[1] += 1 unless range_.exclude_end?
|
220
|
+
axis_ = IndexedAxis.new(ai_[1] - ai_[0], ai_[0])
|
203
221
|
end
|
204
222
|
struct_.add(axis_, name_) if axis_
|
205
223
|
end
|
@@ -250,7 +268,10 @@ module NTable
|
|
250
268
|
|
251
269
|
def _populate_nested_values(table_, path_, axis_data_, obj_) # :nodoc:
|
252
270
|
if path_.size == table_.dim
|
253
|
-
|
271
|
+
begin
|
272
|
+
table_.set!(*path_, obj_)
|
273
|
+
rescue NoSuchCellError
|
274
|
+
end
|
254
275
|
else
|
255
276
|
case obj_
|
256
277
|
when ::Hash
|
data/lib/ntable/structure.rb
CHANGED
@@ -75,6 +75,14 @@ module NTable
|
|
75
75
|
end
|
76
76
|
|
77
77
|
|
78
|
+
# Basic output.
|
79
|
+
|
80
|
+
def inspect
|
81
|
+
"#<#{self.class}:0x#{object_id.to_s(16)} #{@axis_name}:#{@axis_object.class.name.sub('NTable::', '')}>"
|
82
|
+
end
|
83
|
+
alias_method :to_s, :inspect
|
84
|
+
|
85
|
+
|
78
86
|
# The underlying axis implementation
|
79
87
|
attr_reader :axis_object
|
80
88
|
|
@@ -178,6 +186,14 @@ module NTable
|
|
178
186
|
end
|
179
187
|
|
180
188
|
|
189
|
+
# Basic output.
|
190
|
+
|
191
|
+
def inspect
|
192
|
+
"#<#{self.class}:0x#{object_id.to_s(16)} #{coord_array.inspect}>"
|
193
|
+
end
|
194
|
+
alias_method :to_s, :inspect
|
195
|
+
|
196
|
+
|
181
197
|
# Standard equality check
|
182
198
|
|
183
199
|
def eql?(obj_)
|
@@ -280,6 +296,15 @@ module NTable
|
|
280
296
|
end
|
281
297
|
|
282
298
|
|
299
|
+
# Basic output.
|
300
|
+
|
301
|
+
def inspect
|
302
|
+
axes_ = @indexes.map{ |a_| "#{a_.axis_name}:#{a_.axis_object.class.name.sub('NTable::', '')}" }
|
303
|
+
"#<#{self.class}:0x#{object_id.to_s(16)} #{axes_.join(', ')}#{@parent ? ' (sub)' : ''}>"
|
304
|
+
end
|
305
|
+
alias_method :to_s, :inspect
|
306
|
+
|
307
|
+
|
283
308
|
# Returns true if the two structures are equivalent, both in the
|
284
309
|
# axes and in the parentage. The structure of a shared slice is not
|
285
310
|
# equivalent, in this sense, to the "same" structure created from
|
data/lib/ntable/table.rb
CHANGED
@@ -84,6 +84,15 @@ module NTable
|
|
84
84
|
end
|
85
85
|
|
86
86
|
|
87
|
+
# Basic output.
|
88
|
+
|
89
|
+
def inspect
|
90
|
+
axes_ = @structure.all_axes.map{ |a_| "#{a_.axis_name}:#{a_.axis_object.class.name.sub('NTable::', '')}" }
|
91
|
+
"#<#{self.class}:0x#{object_id.to_s(16)} #{axes_.join(', ')}#{@parent ? ' (sub)' : ''} #{@vals.inspect}>"
|
92
|
+
end
|
93
|
+
alias_method :to_s, :inspect
|
94
|
+
|
95
|
+
|
87
96
|
# Returns true if the two tables are equivalent, both in the data
|
88
97
|
# and in the parentage. The structure of a shared slice is not
|
89
98
|
# equivalent, in this sense, to the "same" table created from
|
@@ -525,7 +534,7 @@ module NTable
|
|
525
534
|
vec_ = ::Array.new(outer_struct_.dim, 0)
|
526
535
|
tables_ = (0...outer_struct_.size).map do |i_|
|
527
536
|
t_ = Table.new(inner_struct_, :acquire => @vals,
|
528
|
-
:offset => outer_struct_._compute_offset_for_vector(vec_),
|
537
|
+
:offset => @offset + outer_struct_._compute_offset_for_vector(vec_),
|
529
538
|
:parent => self)
|
530
539
|
outer_struct_._inc_vector(vec_)
|
531
540
|
t_
|
data/test/tc_decompose.rb
CHANGED
@@ -98,6 +98,13 @@ module NTable
|
|
98
98
|
end
|
99
99
|
|
100
100
|
|
101
|
+
def test_decompose_after_decompose
|
102
|
+
t1_ = Table.new(@structure_2d, :load => (2..21).to_a)
|
103
|
+
t2_ = t1_.decompose([1]).get(2).decompose([0]).get
|
104
|
+
assert_equal(Table.new(@structure_row, :load => [4, 5]), t2_)
|
105
|
+
end
|
106
|
+
|
107
|
+
|
101
108
|
end
|
102
109
|
|
103
110
|
end
|
data/test/tc_nested_object.rb
CHANGED
@@ -140,6 +140,14 @@ module NTable
|
|
140
140
|
end
|
141
141
|
|
142
142
|
|
143
|
+
def test_from_level_1_start_1_indexed_with_postprocess
|
144
|
+
obj_ = (1..12).to_a
|
145
|
+
t1_ = Table.from_nested_object(obj_,
|
146
|
+
[{:postprocess_range => ->(r_){ (1..10) }}])
|
147
|
+
assert_equal(Table.new(Structure.add(@indexed_axis_10), :load => (2..11).to_a), t1_)
|
148
|
+
end
|
149
|
+
|
150
|
+
|
143
151
|
def test_from_level_2_indexed
|
144
152
|
obj_ = [[nil, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], []]
|
145
153
|
t1_ = Table.from_nested_object(obj_)
|
@@ -219,7 +227,7 @@ module NTable
|
|
219
227
|
def test_from_level_1_labeled_with_objectify_and_postprocess
|
220
228
|
obj_ = {:one => 1, :two => 2}
|
221
229
|
t1_ = Table.from_nested_object(obj_,
|
222
|
-
[{:sort => true, :objectify => true, :
|
230
|
+
[{:sort => true, :objectify => true, :postprocess_labels => ->(labels_){ labels_ << :three }}],
|
223
231
|
:fill => 0)
|
224
232
|
assert_equal(Table.new(Structure.add(@object_axis_3), :load => [1,2,0]), t1_)
|
225
233
|
end
|