# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require 'rubygems'
require 'echoe'
VERSION = File.open('../../share/VERSION.txt').read.sub('-SNAPSHOT', '.pre1').chomp
Echoe.new('avro', VERSION) do |p|
  p.author = "Apache Software Foundation"
  p.email = "dev@avro.apache.org"
  p.summary = "Apache Avro for Ruby"
  p.description = "Avro is a data serialization and RPC format"
  p.url = "http://avro.apache.org/"
  p.runtime_dependencies = %w[multi_json]
  p.licenses = ["Apache License 2.0 (Apache-2.0)"]
end

t = Rake::TestTask.new(:interop)
t.pattern = 'interop/test*.rb'

task :generate_interop do
  $:.unshift(HERE + '/lib')
  $:.unshift(HERE + '/test')
  require 'avro'
  require 'random_data'

  schema = Avro::Schema.parse(File.read(SCHEMAS + '/interop.avsc'))
  r = RandomData.new(schema, ENV['SEED'])
  f = File.open(BUILD + '/interop/data/ruby.avro', 'w')
  writer = Avro::DataFile::Writer.new(f, Avro::IO::DatumWriter.new(schema), schema)
  begin
    writer << r.next
    writer << r.next
  ensure
    writer.close
  end

  Avro::DataFile.open(BUILD + '/interop/data/ruby_deflate.avro', 'w', schema.to_s, :deflate) do |writer|
    20.times { writer << r.next }
  end
end


HERE = File.expand_path(File.dirname(__FILE__))
SHARE = HERE + '/../../share'
SCHEMAS = SHARE + '/test/schemas'
BUILD = HERE + '/../../build'

task :dist => [:gem] do
  mkdir_p "../../dist/ruby"
  cp "pkg/avro-#{VERSION}.gem", "../../dist/ruby"
end
