cornucopia 0.1.12
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.
- checksums.yaml +7 -0
- data/.gitignore +51 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +16 -0
- data/LICENSE.TXT +22 -0
- data/README.md +341 -0
- data/Rakefile +18 -0
- data/cornucopia.gemspec +39 -0
- data/lib/cornucopia.rb +18 -0
- data/lib/cornucopia/capybara/finder_diagnostics.rb +536 -0
- data/lib/cornucopia/capybara/finder_extensions.rb +89 -0
- data/lib/cornucopia/capybara/install_finder_extensions.rb +105 -0
- data/lib/cornucopia/capybara/install_matcher_extensions.rb +39 -0
- data/lib/cornucopia/capybara/matcher_extensions.rb +83 -0
- data/lib/cornucopia/capybara/page_diagnostics.rb +228 -0
- data/lib/cornucopia/cucumber_hooks.rb +38 -0
- data/lib/cornucopia/factory_girl/dynamic_association.rb +14 -0
- data/lib/cornucopia/rspec_hooks.rb +37 -0
- data/lib/cornucopia/site_prism/element_extensions.rb +273 -0
- data/lib/cornucopia/site_prism/install_element_extensions.rb +23 -0
- data/lib/cornucopia/site_prism/page_application.rb +126 -0
- data/lib/cornucopia/source_files/collapse.gif +0 -0
- data/lib/cornucopia/source_files/cornucopia.css +162 -0
- data/lib/cornucopia/source_files/expand.gif +0 -0
- data/lib/cornucopia/source_files/index_base.html +10 -0
- data/lib/cornucopia/source_files/index_contents.html +2 -0
- data/lib/cornucopia/source_files/more_info.js +87 -0
- data/lib/cornucopia/source_files/report_base.html +10 -0
- data/lib/cornucopia/source_files/report_contents.html +3 -0
- data/lib/cornucopia/spinach_hooks.rb +51 -0
- data/lib/cornucopia/util/configuration.rb +493 -0
- data/lib/cornucopia/util/configured_report.rb +520 -0
- data/lib/cornucopia/util/file_asset.rb +46 -0
- data/lib/cornucopia/util/generic_settings.rb +37 -0
- data/lib/cornucopia/util/log_capture.rb +97 -0
- data/lib/cornucopia/util/pretty_formatter.rb +580 -0
- data/lib/cornucopia/util/report_builder.rb +474 -0
- data/lib/cornucopia/util/report_formatters.rb +11 -0
- data/lib/cornucopia/util/report_table.rb +195 -0
- data/lib/cornucopia/version.rb +3 -0
- data/lib/tasks/cornucopia_tasks.rake +4 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/images/.keep +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/concerns/.keep +0 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.keep +0 -0
- data/spec/dummy/app/models/.keep +0 -0
- data/spec/dummy/app/models/concerns/.keep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +27 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/cucumber.yml +8 -0
- data/spec/dummy/config/database.yml +37 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +56 -0
- data/spec/dummy/db/schema.rb +16 -0
- data/spec/dummy/features/support/env.rb +66 -0
- data/spec/dummy/lib/assets/.keep +0 -0
- data/spec/dummy/lib/tasks/cucumber.rake +65 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/cucumber +10 -0
- data/spec/fixtures/sample_page.html +150 -0
- data/spec/lib/capybara/finder_diagnostics_spec.rb +517 -0
- data/spec/lib/capybara/finder_extensions_spec.rb +328 -0
- data/spec/lib/capybara/page_diagnostics_spec.rb +277 -0
- data/spec/lib/site_prism/element_extensions_spec.rb +290 -0
- data/spec/lib/site_prism/page_application_spec.rb +81 -0
- data/spec/lib/util/configuration_spec.rb +254 -0
- data/spec/lib/util/configured_report_spec.rb +1058 -0
- data/spec/lib/util/file_asset_spec.rb +86 -0
- data/spec/lib/util/generic_settings_spec.rb +48 -0
- data/spec/lib/util/log_capture_spec.rb +151 -0
- data/spec/lib/util/pretty_formatter_spec.rb +694 -0
- data/spec/lib/util/report_builder_spec.rb +983 -0
- data/spec/lib/util/report_formatters_spec.rb +13 -0
- data/spec/lib/util/report_table_exception_spec.rb +21 -0
- data/spec/lib/util/report_table_spec.rb +319 -0
- data/spec/pages/cornucopia_report_app.rb +10 -0
- data/spec/pages/google/email_page.rb +22 -0
- data/spec/pages/google/login_page.rb +25 -0
- data/spec/rails_helper.rb +43 -0
- data/spec/sample_report.rb +45 -0
- data/spec/spec_helper.rb +81 -0
- metadata +410 -0
|
@@ -0,0 +1,520 @@
|
|
|
1
|
+
require ::File.expand_path('report_builder', File.dirname(__FILE__))
|
|
2
|
+
require ::File.expand_path('report_table', File.dirname(__FILE__))
|
|
3
|
+
require ::File.expand_path('log_capture', File.dirname(__FILE__))
|
|
4
|
+
require ::File.expand_path('../capybara/page_diagnostics', File.dirname(__FILE__))
|
|
5
|
+
|
|
6
|
+
module Cornucopia
|
|
7
|
+
module Util
|
|
8
|
+
class ConfiguredReport
|
|
9
|
+
# ConfiguredReport outputs an error report based on symbol based configurations
|
|
10
|
+
#
|
|
11
|
+
# The configurations are as follows:
|
|
12
|
+
# min_fields
|
|
13
|
+
# more_info_fields
|
|
14
|
+
# expand_fields
|
|
15
|
+
# expand_inline_fields
|
|
16
|
+
# exclude_fields
|
|
17
|
+
# leaf_options
|
|
18
|
+
#
|
|
19
|
+
# min_field
|
|
20
|
+
# This is a list of the fields which are to be output at the top of the report
|
|
21
|
+
# such that they are always visible.
|
|
22
|
+
# Items in the min list which cannot be found will output an error.
|
|
23
|
+
#
|
|
24
|
+
# If any options are provided in a field that is a non-expanded leaf node, those options will
|
|
25
|
+
# be used instead of the leaf_options if any.
|
|
26
|
+
#
|
|
27
|
+
# more_info_fields
|
|
28
|
+
# This is a list of the fields which are to be output below the min fields
|
|
29
|
+
# in a section that is initially hidden. The user can expand these values
|
|
30
|
+
# If/when they need to.
|
|
31
|
+
# Items in the more info list which cannot be found will output an error.
|
|
32
|
+
#
|
|
33
|
+
# If any options are provided in a field that is a non-expanded leaf node, those options will
|
|
34
|
+
# be used instead of the leaf_options if any.
|
|
35
|
+
#
|
|
36
|
+
# expand_fields
|
|
37
|
+
# This is a list of the fields which are to be expanded when they are encountered.
|
|
38
|
+
# Expanded fields are shown in a sub-table of values so that the instance variables
|
|
39
|
+
# are then each output.
|
|
40
|
+
# items which are to be expanded may be explicitly or implicitly exported.
|
|
41
|
+
# items which are not encountered but are in the expand list will be ignored.
|
|
42
|
+
#
|
|
43
|
+
# If any options are provided here, these options will be applied to all expanded items which
|
|
44
|
+
# are leaf nodes that are not expanded.
|
|
45
|
+
#
|
|
46
|
+
# expand_inline_fields
|
|
47
|
+
# This is a list of the fields which are to be expanded, but unlike expanded fields
|
|
48
|
+
# when these items are expanded, they will be placed at the same level as the current
|
|
49
|
+
# items rather than in a sub-table.
|
|
50
|
+
#
|
|
51
|
+
# If any options are provided here, these options will be applied to all expanded items which
|
|
52
|
+
# are leaf nodes that are not expanded. If a field is specified in both expand and
|
|
53
|
+
# expand_inline, the options for expand will take precedence over expand_inline.
|
|
54
|
+
#
|
|
55
|
+
# exclude_fields
|
|
56
|
+
# This is a list of the fields which are not to be output when they are encountered.
|
|
57
|
+
# There are many implicit ways to output a field (such as the expanded fields).
|
|
58
|
+
# If a field is to be implicityly exported, it will not be exported if it is in this
|
|
59
|
+
# list. A field can always be explicitly exported. Items not encountered but
|
|
60
|
+
# in the exclude list will be ignored.
|
|
61
|
+
#
|
|
62
|
+
# If any options are provided here, they will be ignored.
|
|
63
|
+
#
|
|
64
|
+
# leaf_options
|
|
65
|
+
# When a leaf node is output, this set is checked to see if there are any options to be passed into the
|
|
66
|
+
# Cornucopia::Util::ReportTable.write_stats function.
|
|
67
|
+
# leaf_options is only useful if you provide options.
|
|
68
|
+
#
|
|
69
|
+
# Unlike the other nodes, leaf_options does not use the field names to specify a full path.
|
|
70
|
+
# Instead, the leaf options allows an arry of values in the report_element field to specify a list
|
|
71
|
+
# of leaf fields which all have the same options (if not overridden by the min or more_info lists).
|
|
72
|
+
#
|
|
73
|
+
# field names follow a set pattern:
|
|
74
|
+
# <object_name>__<function_property_or_hash_name>
|
|
75
|
+
#
|
|
76
|
+
# You can have as many following __<function_or_property_name> values as you need.
|
|
77
|
+
#
|
|
78
|
+
# OR
|
|
79
|
+
#
|
|
80
|
+
# { report_element: <field name>, report_options: {<options hash>} }
|
|
81
|
+
#
|
|
82
|
+
# Examples:
|
|
83
|
+
# self.exception.backtrace would be specified as: :self__exception__backtrace
|
|
84
|
+
# self.my_hash[:my_key] would be specified as: :self__my_hash__my_key
|
|
85
|
+
# self.to_s would be specified as: :self__to_s
|
|
86
|
+
# self.as_text_area may be specified as: { report_element: :self, report_options: { prevent_shrink: true } }
|
|
87
|
+
#
|
|
88
|
+
# There are a handful of special conditions:
|
|
89
|
+
# if the last_line is to_s, the label that is output will not be to_s, but the previous item level
|
|
90
|
+
#
|
|
91
|
+
# :logs
|
|
92
|
+
# This will output the logs using Cornucopia::Util::LogCapture.capture_logs
|
|
93
|
+
# Unlike normal items, if there are no logs to export, this will not generate an error.
|
|
94
|
+
#
|
|
95
|
+
# :capybara_page_diagnostics
|
|
96
|
+
# This will output Capybara infomration using
|
|
97
|
+
# Cornucopia::Capybara::Diagnostics.output_page_detail_section.
|
|
98
|
+
# NOTE: This option requres a parameter be passed into the report_options for :diagnostics_name
|
|
99
|
+
# Unlike normal items, if Capybara is not being used, this will not generate an error.
|
|
100
|
+
|
|
101
|
+
def initialize(options = {})
|
|
102
|
+
@min_fields = []
|
|
103
|
+
@more_info_fields = []
|
|
104
|
+
@expand_fields = []
|
|
105
|
+
@expand_inline_fields = []
|
|
106
|
+
@exclude_fields = []
|
|
107
|
+
@leaf_options = []
|
|
108
|
+
@report_objects = {}
|
|
109
|
+
|
|
110
|
+
self.min_fields = options[:min_fields]
|
|
111
|
+
self.more_info_fields = options[:more_info_fields]
|
|
112
|
+
self.expand_fields = options[:expand_fields]
|
|
113
|
+
self.expand_inline_fields = options[:expand_inline_fields]
|
|
114
|
+
self.exclude_fields = options[:exclude_fields]
|
|
115
|
+
self.leaf_options = options[:leaf_options]
|
|
116
|
+
@report = options[:report]
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def min_fields=(value)
|
|
120
|
+
@min_fields = split_field_symbols(value)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def more_info_fields=(value)
|
|
124
|
+
@more_info_fields = split_field_symbols(value)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def expand_fields=(value)
|
|
128
|
+
@expand_fields = split_field_symbols(value)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def expand_inline_fields=(value)
|
|
132
|
+
@expand_inline_fields = split_field_symbols(value)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def exclude_fields=(value)
|
|
136
|
+
@exclude_fields = split_field_symbols(value)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def leaf_options=(value)
|
|
140
|
+
@leaf_options = split_field_symbols(value)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def add_report_objects(report_object_hash)
|
|
144
|
+
@report_objects.merge! report_object_hash
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# This function generates the report.
|
|
148
|
+
#
|
|
149
|
+
# Options:
|
|
150
|
+
# report_table - If the report is to be run inside an already existing table, the table
|
|
151
|
+
# to output the values into.
|
|
152
|
+
# nested_table - If the report is running inside an existing table already, the table
|
|
153
|
+
# it is running in.
|
|
154
|
+
# NOTE: This value may not be
|
|
155
|
+
# diagnostics_name - The text to output when outputing capybara diagnostics if it is not expanded in-line.
|
|
156
|
+
def generate_report(report, options = {}, &block)
|
|
157
|
+
@report = (report ||= Cornucopia::Util::ReportBuilder.current_report)
|
|
158
|
+
|
|
159
|
+
options_report_table = options.delete(:report_table)
|
|
160
|
+
[@min_fields, @more_info_fields].each do |export_field_list|
|
|
161
|
+
if export_field_list
|
|
162
|
+
table_pre = nil
|
|
163
|
+
table_post = nil
|
|
164
|
+
|
|
165
|
+
if @min_fields != export_field_list && !options_report_table
|
|
166
|
+
options_report_table = nil
|
|
167
|
+
|
|
168
|
+
table_pre = "<div class=\"cornucopia-show-hide-section\">\n"
|
|
169
|
+
table_pre << " <div class=\"cornucopia-table\">\n"
|
|
170
|
+
table_pre << " <div class=\"cornucopia-row\">\n"
|
|
171
|
+
table_pre << " <div class=\"cornucopia-cell-data\">\n"
|
|
172
|
+
table_pre << " <a class =\"cornucopia-additional-details\" href=\"#\">More Details...</a>\n"
|
|
173
|
+
table_pre << " </div>\n"
|
|
174
|
+
table_pre << " </div>\n"
|
|
175
|
+
table_pre << " </div>\n"
|
|
176
|
+
table_pre << " <div class=\"cornucopia-additional-details hidden\">\n"
|
|
177
|
+
table_pre.html_safe
|
|
178
|
+
table_post = " </div>\n"
|
|
179
|
+
table_post << "</div>\n"
|
|
180
|
+
table_post.html_safe
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
report.within_table(table_prefix: table_pre,
|
|
184
|
+
table_postfix: table_post,
|
|
185
|
+
report_table: options_report_table,
|
|
186
|
+
nested_table: options.delete(:nested_table),
|
|
187
|
+
nested_table_label: options.delete(:nested_table_label),
|
|
188
|
+
not_a_table: table_pre,
|
|
189
|
+
suppress_blank_table: table_pre) do |outer_report_table|
|
|
190
|
+
Cornucopia::Util::ReportTable.new(
|
|
191
|
+
report_table: table_pre ? nil : outer_report_table,
|
|
192
|
+
nested_table: outer_report_table,
|
|
193
|
+
suppress_blank_table: table_pre) do |report_table|
|
|
194
|
+
export_field_list.each do |export_field|
|
|
195
|
+
if @report_objects[export_field[:report_element][0]] ||
|
|
196
|
+
export_field[:report_element][0] == :capybara_page_diagnostics ||
|
|
197
|
+
export_field[:report_element][0] == :logs
|
|
198
|
+
export_field_record(export_field,
|
|
199
|
+
@report_objects[export_field[:report_element][0]],
|
|
200
|
+
export_field[:report_element][0],
|
|
201
|
+
report_table,
|
|
202
|
+
0,
|
|
203
|
+
options.merge(report_object_set: true))
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
if block
|
|
208
|
+
if @min_fields != export_field_list
|
|
209
|
+
block.yield report, report_table
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def perform_expansion(export_field, level, sub_vars_report, options, sub_symbol_name, value)
|
|
219
|
+
sub_export_field = { report_element: export_field[:report_element].clone }
|
|
220
|
+
if level == sub_export_field[:report_element].length - 1
|
|
221
|
+
sub_export_field[:report_options] = export_field[:report_options]
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
if level == sub_export_field[:report_element].length - 1 ||
|
|
225
|
+
(level < sub_export_field[:report_element].length &&
|
|
226
|
+
sub_export_field[:report_element][level + 1] != sub_symbol_name.to_sym)
|
|
227
|
+
sub_export_field[:report_element] = sub_export_field[:report_element][0..level]
|
|
228
|
+
sub_export_field[:report_element] << sub_symbol_name.to_sym
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
export_field_record(sub_export_field,
|
|
232
|
+
value,
|
|
233
|
+
sub_symbol_name.to_sym,
|
|
234
|
+
sub_vars_report,
|
|
235
|
+
level + 1,
|
|
236
|
+
options.merge(report_object_set: true, expanded_field: true))
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def expand_field_object(export_field, expand_object, symbol_name, report_table, level, options = {})
|
|
240
|
+
expand_inline = options.delete(:expand_inline)
|
|
241
|
+
|
|
242
|
+
Cornucopia::Util::ReportTable.new(report_table: expand_inline ? report_table : nil,
|
|
243
|
+
nested_table: report_table,
|
|
244
|
+
nested_table_label: symbol_name,
|
|
245
|
+
suppress_blank_table: true) do |sub_vars_report|
|
|
246
|
+
if expand_object.is_a?(Hash)
|
|
247
|
+
expand_object.each do |sub_symbol_name, value|
|
|
248
|
+
perform_expansion(export_field, level, sub_vars_report, options, sub_symbol_name, value)
|
|
249
|
+
end
|
|
250
|
+
elsif expand_object.respond_to?(:members)
|
|
251
|
+
key_values = expand_object.members
|
|
252
|
+
|
|
253
|
+
key_values.each do |sub_symbol_name|
|
|
254
|
+
perform_expansion(export_field,
|
|
255
|
+
level,
|
|
256
|
+
sub_vars_report,
|
|
257
|
+
options,
|
|
258
|
+
sub_symbol_name,
|
|
259
|
+
expand_object.send(sub_symbol_name))
|
|
260
|
+
end
|
|
261
|
+
elsif expand_object.respond_to?(:each)
|
|
262
|
+
each_index = 0
|
|
263
|
+
expand_object.each do |value|
|
|
264
|
+
perform_expansion(export_field, level, sub_vars_report, options, each_index.to_s, value)
|
|
265
|
+
each_index += 1
|
|
266
|
+
end
|
|
267
|
+
else
|
|
268
|
+
expand_object.instance_variable_names.sort.each do |variable_name|
|
|
269
|
+
var_symbol_name = variable_name.to_s
|
|
270
|
+
while var_symbol_name[0] == "@"
|
|
271
|
+
var_symbol_name = var_symbol_name[1..-1]
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
# if level == sub_export_field[:report_element].length - 1 ||
|
|
275
|
+
# (level < sub_export_field[:report_element].length &&
|
|
276
|
+
# sub_export_field[:report_element][level + 1] != var_symbol_name.to_sym)
|
|
277
|
+
# sub_export_field[:report_options] = nil
|
|
278
|
+
# end
|
|
279
|
+
perform_expansion(export_field,
|
|
280
|
+
level,
|
|
281
|
+
sub_vars_report,
|
|
282
|
+
options,
|
|
283
|
+
var_symbol_name,
|
|
284
|
+
get_instance_variable(expand_object, variable_name, var_symbol_name))
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def instance_variables_contain(parent_object, variable_name)
|
|
291
|
+
found_name = nil
|
|
292
|
+
|
|
293
|
+
parent_object.instance_variable_names.any? do |instance_variable_name|
|
|
294
|
+
if instance_variable_name.to_sym == variable_name ||
|
|
295
|
+
instance_variable_name.to_sym == "@#{variable_name}".to_sym
|
|
296
|
+
found_name = instance_variable_name
|
|
297
|
+
true
|
|
298
|
+
end
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
found_name
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def export_field_record(export_field, parent_object, parent_object_name, report_table, level, options = {})
|
|
305
|
+
parent_expanded = options.delete(:expanded_field)
|
|
306
|
+
report_object = nil
|
|
307
|
+
|
|
308
|
+
if (options.delete(:report_object_set))
|
|
309
|
+
report_object = parent_object
|
|
310
|
+
else
|
|
311
|
+
if parent_object.respond_to?(export_field[:report_element][level]) &&
|
|
312
|
+
(!parent_object.methods.include?(export_field[:report_element][level]) ||
|
|
313
|
+
parent_object.method(export_field[:report_element][level]).parameters.empty?)
|
|
314
|
+
report_object = parent_object.send(export_field[:report_element][level])
|
|
315
|
+
elsif parent_object.respond_to?(:[])
|
|
316
|
+
key_value = export_field[:report_element][level]
|
|
317
|
+
if key_value.to_s =~ /^-?[0-9]+$/
|
|
318
|
+
key_value = key_value.to_s.to_i
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
report_object = parent_object.send(:[], key_value)
|
|
322
|
+
else
|
|
323
|
+
instance_variable_name = instance_variables_contain(parent_object, export_field[:report_element][level])
|
|
324
|
+
|
|
325
|
+
if instance_variable_name
|
|
326
|
+
report_object = parent_object.instance_variable_get(instance_variable_name)
|
|
327
|
+
else
|
|
328
|
+
report_object = nil
|
|
329
|
+
print_value = "Could not identify field: #{export_field[:report_element][0..level].join("__")} while exporting #{export_field[:report_element].join("__")}"
|
|
330
|
+
|
|
331
|
+
report_table.write_stats "ERROR", print_value
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
if (level == 0 || !report_object.nil?) &&
|
|
337
|
+
(level > 0 || export_field[:report_element][level] == parent_object_name)
|
|
338
|
+
if level < export_field[:report_element].length - 1
|
|
339
|
+
export_field_record(export_field,
|
|
340
|
+
report_object,
|
|
341
|
+
export_field[:report_element][level],
|
|
342
|
+
report_table,
|
|
343
|
+
level + 1,
|
|
344
|
+
options)
|
|
345
|
+
else
|
|
346
|
+
case export_field[:report_element][level]
|
|
347
|
+
when :logs
|
|
348
|
+
if Cornucopia::Util::Configuration.grab_logs
|
|
349
|
+
Cornucopia::Util::LogCapture.capture_logs report_table
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
when :capybara_page_diagnostics
|
|
353
|
+
Cornucopia::Capybara::PageDiagnostics.dump_details_in_table(@report, report_table)
|
|
354
|
+
|
|
355
|
+
else
|
|
356
|
+
suppress = exclude_variable?(export_field[:report_element][0..-2], export_field[:report_element][-1])
|
|
357
|
+
suppress &&= parent_expanded
|
|
358
|
+
|
|
359
|
+
if !suppress &&
|
|
360
|
+
expand_variable?(export_field[:report_element][0..-2], export_field[:report_element][-1])
|
|
361
|
+
expand_field_object(export_field,
|
|
362
|
+
report_object,
|
|
363
|
+
export_field[:report_element][-1],
|
|
364
|
+
report_table,
|
|
365
|
+
level,
|
|
366
|
+
options.merge({ expand_inline:
|
|
367
|
+
expand_variable_inline?(export_field[:report_element][0..-2],
|
|
368
|
+
export_field[:report_element][-1]) }))
|
|
369
|
+
else
|
|
370
|
+
print_field_object(export_field, report_object, report_table, parent_expanded, options)
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
rescue Exception => error
|
|
376
|
+
report_table.write_stats "Configured Report Error", "#{export_field}\nError:\n#{error.to_s}\n#{error.backtrace.join("\n")}"
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def print_field_object(export_field, report_object, report_table, parent_expanded, options)
|
|
380
|
+
unless parent_expanded &&
|
|
381
|
+
exclude_variable?(export_field[:report_element][0..-2], export_field[:report_element][-1])
|
|
382
|
+
if report_object == false ||
|
|
383
|
+
!(report_object.nil? || (report_object.respond_to?(:empty?) && (report_object.empty? rescue nil)))
|
|
384
|
+
if export_field[:report_element][-1] == :to_s
|
|
385
|
+
print_name = export_field[:report_element][-2]
|
|
386
|
+
else
|
|
387
|
+
print_name = export_field[:report_element][-1]
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
if export_field[:report_element].length >= 2
|
|
391
|
+
if print_name.to_s =~ /^-?[0-9]+$/
|
|
392
|
+
if !parent_expanded ||
|
|
393
|
+
expand_variable_inline?(export_field[:report_element][0..-3], export_field[:report_element][-2])
|
|
394
|
+
print_name = "#{export_field[:report_element][-2]}[#{export_field[:report_element][-1]}]"
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
|
|
399
|
+
print_options = export_field[:report_options]
|
|
400
|
+
print_options ||= find_leaf_options(print_name).try(:[], :report_options)
|
|
401
|
+
print_options ||= {}
|
|
402
|
+
|
|
403
|
+
if print_options[:label]
|
|
404
|
+
print_name = print_options[:label]
|
|
405
|
+
end
|
|
406
|
+
|
|
407
|
+
report_table.write_stats print_name, report_object, print_options
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def find_leaf_options(variable_name)
|
|
413
|
+
found_options = nil
|
|
414
|
+
|
|
415
|
+
if @leaf_options
|
|
416
|
+
@leaf_options.each do |leaf_option|
|
|
417
|
+
if leaf_option[:report_element].include?(variable_name)
|
|
418
|
+
found_options = leaf_option
|
|
419
|
+
break
|
|
420
|
+
end
|
|
421
|
+
end
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
found_options
|
|
425
|
+
end
|
|
426
|
+
|
|
427
|
+
def exclude_variable?(export_field, variable_name)
|
|
428
|
+
find_variable_in_set(@exclude_fields, export_field, variable_name)
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
def expand_variable?(export_field, variable_name)
|
|
432
|
+
find_variable_in_set(@expand_fields, export_field, variable_name) ||
|
|
433
|
+
find_variable_in_set(@expand_inline_fields, export_field, variable_name)
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
def expand_variable_inline?(export_field, variable_name)
|
|
437
|
+
find_variable_in_set(@expand_inline_fields, export_field, variable_name)
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
def find_variable_in_set(variable_set, export_field, variable_name)
|
|
441
|
+
found_item = nil
|
|
442
|
+
|
|
443
|
+
if variable_set
|
|
444
|
+
variable_set.any? do |exclusion_item|
|
|
445
|
+
found_item = nil
|
|
446
|
+
|
|
447
|
+
if exclusion_item[:report_element].length == export_field.length + 1
|
|
448
|
+
found_item = true
|
|
449
|
+
|
|
450
|
+
export_field.each_with_index do |export_name, export_index|
|
|
451
|
+
found_item &&= (exclusion_item[:report_element][export_index] == export_name ||
|
|
452
|
+
exclusion_item[:report_element][export_index] == "*".to_sym)
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
found_item &&= (exclusion_item[:report_element][export_field.length] == variable_name ||
|
|
456
|
+
exclusion_item[:report_element][export_field.length] == "*".to_sym)
|
|
457
|
+
|
|
458
|
+
if found_item
|
|
459
|
+
found_item = exclusion_item
|
|
460
|
+
else
|
|
461
|
+
found_item = nil
|
|
462
|
+
end
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
found_item
|
|
466
|
+
end
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
found_item
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
def split_field_symbols(full_report_element)
|
|
473
|
+
if full_report_element
|
|
474
|
+
full_report_element.map do |full_symbol|
|
|
475
|
+
return_value = {}
|
|
476
|
+
|
|
477
|
+
if full_symbol.is_a?(Hash)
|
|
478
|
+
return_value = full_symbol.clone
|
|
479
|
+
return_value[:report_element] = split_full_field_symbol(return_value[:report_element])
|
|
480
|
+
else
|
|
481
|
+
return_value[:report_element] = split_full_field_symbol(full_symbol)
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
return_value
|
|
485
|
+
end
|
|
486
|
+
else
|
|
487
|
+
[]
|
|
488
|
+
end
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
def split_full_field_symbol(full_symbol)
|
|
492
|
+
if full_symbol.is_a?(Array)
|
|
493
|
+
full_symbol
|
|
494
|
+
else
|
|
495
|
+
field_symbols = full_symbol.to_s.split("__")
|
|
496
|
+
|
|
497
|
+
field_symbols.reduce([]) do |array, symbol|
|
|
498
|
+
if (symbol.empty?)
|
|
499
|
+
array << nil
|
|
500
|
+
else
|
|
501
|
+
while (array.length > 0 && array[-1].blank?)
|
|
502
|
+
array.pop
|
|
503
|
+
symbol = "__#{symbol}"
|
|
504
|
+
end
|
|
505
|
+
array << symbol.to_sym
|
|
506
|
+
end
|
|
507
|
+
end
|
|
508
|
+
end
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
def get_instance_variable(the_object, instance_variable, variable_name)
|
|
512
|
+
if the_object.respond_to?(variable_name)
|
|
513
|
+
the_object.send(variable_name)
|
|
514
|
+
else
|
|
515
|
+
the_object.instance_variable_get(instance_variable)
|
|
516
|
+
end
|
|
517
|
+
end
|
|
518
|
+
end
|
|
519
|
+
end
|
|
520
|
+
end
|