class Compendium::Report
Attributes
context[RW]
params[RW]
results[RW]
Public Class Methods
inherited(report)
click to toggle source
# File lib/compendium/report.rb, line 19 def inherited(report) Compendium.reports << report # Each Report object has its own Params class so that validations can be added without affecting other # reports. However, validations also need to be inherited, so when inheriting a report, subclass its # params_class report.params_class = Class.new(self.params_class) report.params_class.class_eval %Q{ def self.model_name ActiveModel::Name.new(Compendium::Params, Compendium, "compendium.params.#{report.name.underscore rescue 'report'}") end } end
method_missing(name, *args, &block)
click to toggle source
Define predicate methods for getting the report type ie. r.spending? checks that r == SpendingReport
Calls superclass method
# File lib/compendium/report.rb, line 44 def method_missing(name, *args, &block) prefix = name.to_s.gsub(/[?!]\z/, '') report_class = "#{prefix}_report".classify.constantize rescue nil return self == report_class if name.to_s.end_with?('?') && Compendium.reports.include?(report_class) super end
new(params = {})
click to toggle source
# File lib/compendium/report.rb, line 74 def initialize(params = {}) @params = self.class.params_class.new(params, options) # When creating a new report, map each query back to the report queries.each { |q| q.report = self } end
report_name()
click to toggle source
# File lib/compendium/report.rb, line 33 def report_name name.underscore.gsub(/_report$/,'').to_sym end
respond_to_missing?(name, include_private = false)
click to toggle source
Calls superclass method
# File lib/compendium/report.rb, line 53 def respond_to_missing?(name, include_private = false) prefix = name.to_s.gsub(/[?!]\z/, '') report_class = "#{prefix}_report".classify.constantize rescue nil return true if name.to_s.end_with?('?') && Compendium.reports.include?(report_class) super end
url(params = {})
click to toggle source
Get a URL for this report (format: :json set by default)
# File lib/compendium/report.rb, line 38 def url(params = {}) path_helper(params) end
Private Class Methods
path_helper(params)
click to toggle source
# File lib/compendium/report.rb, line 63 def path_helper(params) raise ActionController::RoutingError, "compendium_reports_run_path must be defined" unless route_helper_defined? Rails.application.routes.url_helpers.compendium_reports_run_path(self.report_name, params.reverse_merge(format: :json)) end
route_helper_defined?()
click to toggle source
# File lib/compendium/report.rb, line 68 def route_helper_defined? @route_helpers ||= Module.new { include Rails.application.routes.url_helpers } @route_helpers.method_defined?(:compendium_reports_run_path) end
Public Instance Methods
exports?(type)
click to toggle source
# File lib/compendium/report.rb, line 108 def exports?(type) return exporters[type.to_sym] end
metrics()
click to toggle source
# File lib/compendium/report.rb, line 104 def metrics Collection[Metric, queries.map{ |q| q.metrics.to_a }.flatten] end
run(context = nil, options = {})
click to toggle source
# File lib/compendium/report.rb, line 81 def run(context = nil, options = {}) self.context = context self.results = {} only = Array.wrap(options.delete(:only)).compact except = Array.wrap(options.delete(:except)).compact raise ArgumentError, 'cannot specify only and except options at the same time' if !only.empty? && !except.empty? (only + except).flatten.each { |q| raise ArgumentError, "invalid query #{q}" unless queries.include?(q) } queries_to_run = if !only.empty? queries.slice(*only) elsif !except.empty? queries.except(*except) else queries end queries_to_run.each{ |q| self.results[q.name] = q.run(params, ContextWrapper.wrap(context, self)) } self end
Private Instance Methods
method_missing(name, *args, &block)
click to toggle source
Calls superclass method
# File lib/compendium/report.rb, line 116 def method_missing(name, *args, &block) prefix = name.to_s.sub(/(?:_results|\?)\Z/, '').to_sym return queries[name] if queries.keys.include?(name) return results[prefix] if name.to_s.end_with?('_results') && queries.keys.include?(prefix) return params[name] if options.keys.include?(name) return !!params[prefix] if name.to_s.end_with?('?') && options.keys.include?(prefix) super end
respond_to_missing?(name, include_private = false)
click to toggle source
Calls superclass method
# File lib/compendium/report.rb, line 126 def respond_to_missing?(name, include_private = false) prefix = name.to_s.sub(/_results\Z/, '').to_sym return true if queries.keys.include?(name) return true if name.to_s.end_with?('_results') && queries.keys.include?(prefix) super end