Class: Resque::Reports::BaseReport

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Extensions
Defined in:
lib/resque/reports/base_report.rb

Overview

Class describes base report class for inheritance. BaseReport successor must implement “write(io, force)” method and may specify file extension with “extension” method call example:

class CustomTypeReport < Resque::Reports::BaseReport
  extension :type # specify that report file must ends
                  # with '.type', e.g. 'abc.type'

  # Method specifies how to output report data
  def write(io, force)
    io << 'Hello World!'
  end
end

BaseReport provides followed DSL, example:

class CustomReport < CustomTypeReport
  queue :custom_reports # Resque queue name
  source :select_data # method called to retrieve report data
  encoding UTF8 # file encoding

  # Specify in which directory to keep this type files
  directory File.join(Dir.tmpdir, 'resque-reports')

  # Describe table using 'column' method
  table do |element|
    column 'Column 1 Header', :decorate_one
    column 'Column 2 Header', decorate_two(element[1])
    column 'Column 3 Header', 'Column 3 Cell'
  end

  # Class initialize
  # NOTE: must be used instead of define 'initialize' method
  create do |param|
    @main_param = param
  end

  # decorate method, called by symbol-name
  def decorate_one(element)
    "decorate_one: #{element[0]}"
  end

  # decorate method, called directly when filling cell
  def decorate_two(text)
    "decorate_two: #{text}"
  end

  # method returns report data Enumerable
  def select_data
    [[0, 'text0'], [1, 'text1']]
  end
end

Direct Known Subclasses

CsvReport

Constant Summary collapse

DEFAULT_EXTENSION =

– Constants # ++

'txt'
DEFAULT_QUEUE =
:base

Instance Method Summary collapse

Methods included from Extensions

included

Constructor Details

#initialize(*args) ⇒ BaseReport

– Public instance methods ++



139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/resque/reports/base_report.rb', line 139

def initialize(*args)
  # TODO: Check consistance, fail if user initialized wrong object
  set_instance(self)

  if create_block
    define_singleton_method(:create_dispatch, create_block)
    create_dispatch(*args)
  end

  @args = args

  init_cache_file
  init_table
end

Instance Method Details

#bg_build(force = false) ⇒ Object

Builds report in background, returns job_id, to watch progress



162
163
164
165
166
167
168
169
170
171
172
# File 'lib/resque/reports/base_report.rb', line 162

def bg_build(force = false)
  report_class = self.class.to_s

  args_json = [*@args, force].to_json

  # Check report if it already in progress and tring return its job_id...
  job_id = ReportJob.enqueued?(report_class, args_json).try(:meta_id)

  # ...and start new job otherwise
  job_id || ReportJob.enqueue_to(job_queue || DEFAULT_QUEUE, report_class, args_json).try(:meta_id)
end

#build(force = false) ⇒ Object

Builds report synchronously



155
156
157
158
159
# File 'lib/resque/reports/base_report.rb', line 155

def build(force = false)
  init_table if force

  @cache_file.open(force) { |file| write(file, force) }
end