module Compendium::DSL
Public Class Methods
extended(klass)
click to toggle source
# File lib/compendium/dsl.rb, line 8 def self.extended(klass) klass.inheritable_attr :queries, default: ::Collection[Query] klass.inheritable_attr :options, default: ::Collection[Option] klass.inheritable_attr :exporters, default: {} end
Public Instance Methods
exports(type, *opts)
click to toggle source
Define any exports the report has
# File lib/compendium/dsl.rb, line 76 def exports(type, *opts) exporters[type] = if opts.empty? true elsif opts.length == 1 opts.first else opts end end
filter(*query_names, &block)
click to toggle source
Define a filter to modify the results from specified query (in this case :deliveries) For example, this can be useful to translate columns prior to rendering, as it will apply for all render types (table, chart, JSON) Multiple queries can be set up with the same filter
# File lib/compendium/dsl.rb, line 61 def filter(*query_names, &block) each_query(query_names) do |query| query.add_filter(block) end end
method_missing(name, *args, &block)
click to toggle source
Allow defined queries to be redefined by name, eg: query :main_query main_query { collect_records_here }
Calls superclass method
# File lib/compendium/dsl.rb, line 98 def method_missing(name, *args, &block) if queries.keys.include?(name.to_sym) query = queries[name.to_sym] query.proc = block if block_given? query.options = args.extract_options! return query end super end
metric(name, *args, &block)
click to toggle source
Define a metric from a query or implicitly A metric is a derived statistic from a report, for instance a count of rows
# File lib/compendium/dsl.rb, line 39 def metric(name, *args, &block) proc = args.first.is_a?(Proc) ? args.first : block opts = args.extract_options! if opts.key?(:through) [opts.delete(:through)].flatten.each do |query| raise ArgumentError, "query #{query} is not defined" unless queries.key?(query) queries[query].add_metric(name, proc, opts) end else # Allow metrics to define queries implicitly # ie. if you need a metric that counts a column, there's no need to explicitly create a query # and just pass it into a metric query = define_query("__metric_#{name}", {}, &block) query.add_metric(name, -> result { result.first }, opts) end end
option(name, *args)
click to toggle source
Define a parameter for the report
# File lib/compendium/dsl.rb, line 22 def option(name, *args) opts = args.extract_options! type = args.shift add_params_validations(name, opts.delete(:validates)) if options[name] options[name].type = type if type options[name].default = opts.delete(:default) if opts.key?(:default) options[name].merge!(opts) else options << Compendium::Option.new(opts.merge(name: name, type: type)) end end
params_class()
click to toggle source
params_class=(klass)
click to toggle source
# File lib/compendium/dsl.rb, line 91 def params_class=(klass) @params_class = klass end
query(name, opts = {}, &block)
click to toggle source
Define a query
# File lib/compendium/dsl.rb, line 15 def query(name, opts = {}, &block) define_query(name, opts, &block) end
respond_to_missing?(name, *args)
click to toggle source
Calls superclass method
# File lib/compendium/dsl.rb, line 109 def respond_to_missing?(name, *args) return true if queries.keys.include?(name) super end
table(*query_names, &block)
click to toggle source
Allow default table settings to be defined for a query. These settings are used when rendering a query to an HTML table or to CSV
# File lib/compendium/dsl.rb, line 69 def table(*query_names, &block) each_query(query_names) do |query| query.table_settings = block end end
Private Instance Methods
add_params_validations(name, validations)
click to toggle source
# File lib/compendium/dsl.rb, line 158 def add_params_validations(name, validations) return if validations.blank? self.params_class.validates name, validations end
define_query(name, opts, &block)
click to toggle source
# File lib/compendium/dsl.rb, line 123 def define_query(name, opts, &block) params = [name.to_sym, opts, block] query_type = Query if opts.key?(:collection) query_type = CollectionQuery elsif opts.key?(:through) # Ensure each through query is defined through = [opts[:through]].flatten through.each { |q| raise ArgumentError, "query #{q} is not defined" unless self.queries.include?(q.to_sym) } query_type = ThroughQuery params.insert(1, through) elsif opts.fetch(:count, false) query_type = CountQuery elsif opts.fetch(:sum, false) query_type = SumQuery params.insert(1, opts[:sum]) end query = query_type.new(*params) query.report = self metrics[name] = opts[:metric] if opts.key?(:metric) if queries[name] raise CannotRedefineQueryType unless queries[name].instance_of?(query_type) queries.delete(name) end queries << query query end
each_query(query_names) { |queries| ... }
click to toggle source
# File lib/compendium/dsl.rb, line 116 def each_query(query_names, &block) query_names.each do |query_name| raise ArgumentError, "query #{query_name} is not defined" unless queries.key?(query_name) yield queries[query_name] end end