Module: Compendium::DSL

Included in:
Report
Defined in:
lib/compendium/dsl.rb

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object

Allow defined queries to be redefined by name, eg: query :main_query main_query { collect_records_here }



71
72
73
74
75
76
77
78
79
80
# File 'lib/compendium/dsl.rb', line 71

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

Class Method Details

.extended(klass) ⇒ Object



8
9
10
11
# 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]
end

Instance Method Details

#filter(*query_names, &block) ⇒ Object



52
53
54
55
56
57
# File 'lib/compendium/dsl.rb', line 52

def filter(*query_names, &block)
  query_names.each do |query_name|
    raise ArgumentError, "query #{query_name} is not defined" unless queries.key?(query_name)
    queries[query_name].add_filter(block)
  end
end

#metric(name, *args, &block) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/compendium/dsl.rb', line 34

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) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/compendium/dsl.rb', line 19

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_classObject

Each Report will have its own descendant of Params in order to safely add validations



60
61
62
# File 'lib/compendium/dsl.rb', line 60

def params_class
  @params_class ||= Class.new(Params)
end

#params_class=(klass) ⇒ Object



64
65
66
# File 'lib/compendium/dsl.rb', line 64

def params_class=(klass)
  @params_class = klass
end

#query(name, opts = {}, &block) ⇒ Object Also known as: chart, data



13
14
15
# File 'lib/compendium/dsl.rb', line 13

def query(name, opts = {}, &block)
  define_query(name, opts, &block)
end

#respond_to_missing?(name, *args) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
85
# File 'lib/compendium/dsl.rb', line 82

def respond_to_missing?(name, *args)
  return true if queries.keys.include?(name)
  super
end