dataview 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/lib/data_view.rb +27 -14
- data/test/tc_data_view.rb +39 -4
- metadata +1 -1
data/lib/data_view.rb
CHANGED
@@ -33,7 +33,7 @@ class DataView
|
|
33
33
|
end
|
34
34
|
public
|
35
35
|
include Enumerable
|
36
|
-
attr_reader :fields, :titles, :
|
36
|
+
attr_reader :fields, :titles, :values, :value_transforms
|
37
37
|
# Initializes the DataView.
|
38
38
|
# ===Model
|
39
39
|
# The DataView supports a model that contains an array of hashes. The keys in these hashes much be symbols of the field names. This is based off of the ActiveRecord interface.
|
@@ -46,11 +46,12 @@ class DataView
|
|
46
46
|
# ====:values
|
47
47
|
# A hash of Procs that get nondefault values of a field in a particular row. By default, the value is taken by looking at the field in the model. The Proc must accept a Hash of parameters and return the transformed value. The Hash contains the following keys:
|
48
48
|
# * :sender - The DataView sending the call
|
49
|
+
# * :model - The Model of the DataView
|
49
50
|
# * :row_index - The Index of the current row.
|
50
51
|
# * :column_index - The Index of the current column.
|
51
52
|
# * :field - The field of the current value.
|
52
53
|
# ====:value_transforms
|
53
|
-
# A Hash of the
|
54
|
+
# A Hash of the value_transforms that will process the values. The field symbol is the key, and the Proc or array of Procs to transform the value. The Proc must accept a Hash of parameters and return the transformed value. The Hash contains the following keys:
|
54
55
|
# * :sender - The DataView sending the call
|
55
56
|
# * :row_index - The Index of the current row.
|
56
57
|
# * :column_index - The Index of the current column.
|
@@ -116,25 +117,37 @@ class DataView
|
|
116
117
|
view_row_values = []
|
117
118
|
@fields.each_with_index do |field, field_index|
|
118
119
|
if @values.include?(field)
|
119
|
-
actual_value = @values[field].call(
|
120
|
+
actual_value = @values[field].call(
|
121
|
+
{
|
122
|
+
:sender => self,
|
123
|
+
:model => @model,
|
124
|
+
:row_index => row_index,
|
125
|
+
:column_index => field_index,
|
126
|
+
:field => field
|
127
|
+
}
|
128
|
+
)
|
120
129
|
else
|
121
130
|
actual_value = model_row[field]
|
122
131
|
end
|
123
132
|
view_value = actual_value
|
124
133
|
|
125
134
|
if @value_transforms.include?(field)
|
126
|
-
|
127
|
-
|
128
|
-
|
135
|
+
transform_value = actual_value
|
136
|
+
|
137
|
+
transforms = @value_transforms[field]
|
138
|
+
transforms = [transforms] unless transforms.respond_to?(:each)
|
139
|
+
transforms.each do |transform|
|
140
|
+
next unless transform
|
141
|
+
transform_params = {
|
129
142
|
:sender => self,
|
130
143
|
:row_index => row_index,
|
131
144
|
:column_index => field_index,
|
132
|
-
:value =>
|
145
|
+
:value => transform_value,
|
133
146
|
:field => field
|
134
147
|
}
|
135
|
-
|
148
|
+
transform_value = transform.call(transform_params)
|
136
149
|
end
|
137
|
-
view_value =
|
150
|
+
view_value = transform_value
|
138
151
|
end
|
139
152
|
view_row_values << view_value
|
140
153
|
end
|
@@ -144,14 +157,14 @@ class DataView
|
|
144
157
|
return nil if param == nil
|
145
158
|
return param[key]
|
146
159
|
end
|
147
|
-
def format_value_transforms(
|
148
|
-
|
149
|
-
|
150
|
-
|
160
|
+
def format_value_transforms(value_transforms)
|
161
|
+
value_transforms.each do |k, *items|
|
162
|
+
value_transforms[k] = items.flatten
|
163
|
+
value_transforms[k].each do |d|
|
151
164
|
raise ":delegate must respond to call" unless d.respond_to?(:call)
|
152
165
|
end
|
153
166
|
end
|
154
|
-
|
167
|
+
value_transforms
|
155
168
|
end
|
156
169
|
end
|
157
170
|
|
data/test/tc_data_view.rb
CHANGED
@@ -25,6 +25,19 @@ class DataViewTest < Test::Unit::TestCase
|
|
25
25
|
assert_equal(mock_model.length, get_data_view(mock_model).length)
|
26
26
|
assert_equal(1, get_data_view(singular_mock_model).length)
|
27
27
|
end
|
28
|
+
def test_value_transforms_accessor
|
29
|
+
data_view = get_data_view(mock_model)
|
30
|
+
data_view.value_transforms[:field1] = nil
|
31
|
+
assert_equal(mock_model[0][:field1], data_view[0][:field1])
|
32
|
+
|
33
|
+
test_transform = lambda { |h|
|
34
|
+
'test ' << h[:value].to_s
|
35
|
+
}
|
36
|
+
data_view.value_transforms[:field1] = test_transform
|
37
|
+
|
38
|
+
expected_transform_value = test_transform.call({:value => mock_model[0][:field1]})
|
39
|
+
assert_equal(expected_transform_value, data_view[0][:field1])
|
40
|
+
end
|
28
41
|
private
|
29
42
|
def do_test_brackets(model)
|
30
43
|
data_view = get_data_view(model)
|
@@ -32,7 +45,11 @@ class DataViewTest < Test::Unit::TestCase
|
|
32
45
|
test_model = model.respond_to?(:each_index) ? model : [model]
|
33
46
|
test_model.each_with_index do |r, i|
|
34
47
|
fields.each_with_index do |f, j|
|
35
|
-
|
48
|
+
if f != :model_value_field
|
49
|
+
v = r[f]
|
50
|
+
else
|
51
|
+
v = get_model_value({:sender => self, :model => model, :row_index => i, :field => f})
|
52
|
+
end
|
36
53
|
assert_equal(expected_altered_value(v), data_view[i][f])
|
37
54
|
end
|
38
55
|
end
|
@@ -44,7 +61,9 @@ class DataViewTest < Test::Unit::TestCase
|
|
44
61
|
assert_equal(expected_row.length, row.to_a.length)
|
45
62
|
|
46
63
|
expected_row.each do |k, expected_value|
|
47
|
-
|
64
|
+
if k == :model_value_field
|
65
|
+
expected_value = get_model_value({:sender => self, :model => model, :row_index => i, :field => k})
|
66
|
+
end
|
48
67
|
assert_equal(expected_altered_value(expected_value), row[k])
|
49
68
|
end
|
50
69
|
end
|
@@ -82,8 +101,24 @@ class DataViewTest < Test::Unit::TestCase
|
|
82
101
|
return @get_model_value_method if defined?(@get_model_value_method)
|
83
102
|
@get_model_value_method = method(:get_model_value)
|
84
103
|
end
|
85
|
-
def get_model_value(
|
86
|
-
|
104
|
+
def get_model_value(params)
|
105
|
+
test_sender = params[:sender]
|
106
|
+
test_model = params[:model]
|
107
|
+
test_row_index = params[:row_index]
|
108
|
+
test_column_index = params[:column_index]
|
109
|
+
test_field = params[:field]
|
110
|
+
|
111
|
+
unless test_sender == self
|
112
|
+
assert_equal(DataView, test_sender.class)
|
113
|
+
unless mock_model == test_model
|
114
|
+
assert_equal(singular_mock_model, test_model[0])
|
115
|
+
end
|
116
|
+
assert((0..2).include?(test_row_index))
|
117
|
+
assert(fields.include?(test_field))
|
118
|
+
fi = fields.index(test_field)
|
119
|
+
assert_equal(fi, test_column_index)
|
120
|
+
end
|
121
|
+
test_row_index.to_s << ' : Custom ' << test_field.to_s
|
87
122
|
end
|
88
123
|
def fields
|
89
124
|
return @fields if defined?(@fields)
|
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: dataview
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
6
|
+
version: 0.1.1
|
7
7
|
date: 2005-07-25 00:00:00 -07:00
|
8
8
|
summary: Data View is a library that creates a view of a data model. The view can transform the data of the data model without changing the data. Supports ActiveRecord models and other data models that have a similar interface.
|
9
9
|
require_paths:
|