base_generator.rb revision c48b3d4873fe91e5c3bf792b5e634c3595275535
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainenrequire 'socket'
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainenrequire 'timeout'
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainenmodule FixturesGeneration
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen # This is an abstract class. Subclasses need to implement
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen # * files: the list of files to create fixtures to
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen # * perform: the actual action to create the fixtures
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen # * subdir: the subdirectory of the generated fixtures
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen class BaseGenerator
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen HETS_PATH = Settings.hets.executable_path
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen HETS_SERVER_ARGS =
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen YAML.load(File.open('config/hets.yml'))['hets']['server_options']
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def initialize
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen setup_vcr
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def call
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen on_outdated_cassettes do |file|
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen perform(file)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def outdated_cassettes
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen files.select do |file|
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen cassette = recorded_file(file)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen !FileUtils.uptodate?(cassette, Array(HETS_PATH))
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def with_running_hets(&block)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen with_running('hets',
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen "#{HETS_PATH} --server #{HETS_SERVER_ARGS.join(' ')}",
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen 8000, 1, &block)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen protected
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def setup_vcr
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen require 'vcr'
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen WebMock.enable!
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen unless VCR.configuration.cassette_library_dir
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen VCR.configure do |c|
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen c.cassette_library_dir = 'spec/fixtures/vcr'
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen c.hook_into :webmock
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def all_files_beneath(dir)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen globbed_files = Dir.glob(File.join(dir, '**/*'))
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen globbed_files.select { |file| !File.directory?(file) }
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def port_open?(ip, port, seconds=1)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen Timeout::timeout(seconds) do
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen begin
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen TCPSocket.new(ip, port).close
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen true
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen false
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen rescue Timeout::Error
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen false
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def with_running(name, command, port, expected_startup_time, &block)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen need_to_start_server = !port_open?('127.0.0.1', port)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen if need_to_start_server
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen puts "Starting #{name}"
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen pid = fork { exec(command) }
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen sleep expected_startup_time
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen block.call
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen ensure
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen if need_to_start_server
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen puts "Stopping #{name}"
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen Process.kill('INT', pid)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen Process.wait
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def absolute_filepath(file)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen Rails.root.join(file)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def cassette_file(file)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen # remove spec/fixtures/ontologies/ for cassette name
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen cassette_filepath = file.split('/')[3..-1].join('/')
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def hets_cassette_dir
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen File.join('hets-out', subdir)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def cassette_path_in_fixtures(file)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen File.join(hets_cassette_dir, cassette_file(file))
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def recorded_file(file)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen base = file.split('.')[0..-2].join('.')
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen old_extension = File.extname(file)[1..-1]
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen file = "#{base}_#{old_extension}.yml"
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen File.join('spec', 'fixtures', 'vcr', cassette_path_in_fixtures(file))
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen def on_outdated_cassettes(&block)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen outdated_cassettes.each do |file|
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen block.call(file)
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen end
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainenend
83942ac160cdfb922c3a2f29ddfae2a13ebf8b5dTimo Sirainen