class Avro::Builder::Rake::AvroGenerateTask

Attributes

dependencies[RW]
filetype[RW]
load_paths[RW]
name[RW]
root[RW]
task_desc[RW]
task_namespace[RW]

Public Class Methods

new(name: :generate, dependencies: []) { |self| ... } click to toggle source
Calls superclass method
# File lib/avro/builder/rake/avro_generate_task.rb, line 14
def initialize(name: :generate, dependencies: [])
  super()
  @name = name
  @task_namespace = :avro
  @task_desc = 'Generate Avro schema files from Avro::Builder DSL'
  @load_paths = []
  @root = "#{Rails.root}/avro/dsl" if defined?(Rails)
  @dependencies = dependencies
  @filetype = 'avsc'

  yield self if block_given?

  define
end

Private Instance Methods

define() click to toggle source

Define the rake task

# File lib/avro/builder/rake/avro_generate_task.rb, line 32
def define
  namespace task_namespace do
    desc task_desc
    task(name.to_sym => dependencies) do
      raise '"root" must be specified for Avro DSL files' unless root

      Avro::Builder.add_load_path(*[root, load_paths].flatten)
      Dir["#{root}/**/*.rb"].each do |dsl_file|
        puts "Generating Avro schema from #{dsl_file}"
        output_file = dsl_file.sub('/dsl/', '/schema/').sub(/\.rb$/, ".#{filetype}")
        dsl = Avro::Builder.build_dsl(filename: dsl_file)
        if dsl.abstract?
          if File.exist?(output_file)
            puts "... Removing #{output_file} for abstract type"
            FileUtils.rm(output_file)
          end
        else
          schema = dsl.to_json
          FileUtils.mkdir_p(File.dirname(output_file))
          File.write(output_file, schema.end_with?("\n") ? schema : schema << "\n")
        end
      end
    end
  end
end