hets.rb revision 7bde6e1907fc17b0083a6bcfad10bb74be6e4bcd
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger attr_reader :path, :library_path, :stack_size, :env
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller yaml = YAML.load_file(File.join(Rails.root, 'config', 'hets.yml'))
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger @path = first_which_exists yaml['hets_path']
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger @library_path = first_which_exists yaml['hets_lib']
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger raise DeploymentError, 'Could not find hets' unless @path
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger raise DeploymentError, 'Hets library not found.' unless @library_path
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase check_validity_of_version(yaml['version_minimum_revision'])
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger # Set hets environment variables
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger %w( hets_lib hets_owl_tools ).each do |key|
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger @env[key.upcase] = first_which_exists yaml[key]
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale # Checks Hets installation compatibility by its version date
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase # * - +minimum_revision+ -> Minimum working hets version revision
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale # * *Returns* :
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase # * - true if hets version minimum revision smaller than or equal to actual hets version revision
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale # * - false otherwise
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase # Read Hets version minimum revision
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase raise ConfigDateFormatError, 'Could not read hets version minimum revision in YAML' unless minimum_revision
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale # Read Hets version date
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase # revision starts with r-char and ends with revision number.
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase raise InvalidHetsVersionFormatError, "format is not valid: <#{version}>"
40c5626383ebd5e8cf11a636f864023a2aafcd6bDaniel Couto Vale # Return true if minimum date is prior or equal to version date
d1860f0434d6460259d04f8952e55df38fe517f7Tim Reddehase return minimum_revision.to_i <= version_revision.to_i
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger paths.map { |path| File.expand_path path }.find do |path|
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase def check_validity_of_version(reference_version)
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase raise VersionOutdatedError, 'The installed version of Hets is too old'
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim ReddehaseThe Hets Version identifier was not recognized
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase(#{e.message}),
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehasewe expected it to be matchable by this regular expression:
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase#{VERSION_RE}.
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase Rails.logger.warn message
75c2a995e5c564f96cf5559145e59f89d6435ee1Tim Reddehase STDERR.puts message
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller # Runs hets with input_file and returns XML output file path.
519002bc41b20a069be1c669660e702f9bd4a593Eugen Kuksa def self.parse(input_file, url_catalog = [], output_path = nil, structure_only: false)
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger # Arguments to run the subprocess
881c5d2df3b2375b1ed2093781643873e424fe2cTim Reddehase args = [config.path, *%w( -o pp.xml -o xml --full-signatures -a none -v2 --full-theories )]
ac2169141f0b549fc8917a4b1d778f4ba3cab0bfJulian Kornberger if output_path
ac2169141f0b549fc8917a4b1d778f4ba3cab0bfJulian Kornberger FileUtils.mkdir_p output_path
aa056a2e5efb6505701a4e4a31bf2f7e71ff1738henning mueller args += ['-O', output_path]
519002bc41b20a069be1c669660e702f9bd4a593Eugen Kuksa args += ['-s'] if structure_only
aa056a2e5efb6505701a4e4a31bf2f7e71ff1738henning mueller args += ['-C', url_catalog.join(',')] unless url_catalog.empty?
aa056a2e5efb6505701a4e4a31bf2f7e71ff1738henning mueller # Configure stack size
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger args += ['+RTS', "-K#{config.stack_size}", '-RTS']
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger # add the path to the input file as last argument
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger args << input_file
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale # Executes command with low priority
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger Rails.logger.debug "Running hets with: #{args.inspect}"
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger output = Subprocess.run :nice, *args, config.env
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger if output.starts_with? '*** Error'
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger # some error occured
ee5342a8882c2fc7631fcffb5497e6597747887cTim Reddehase raise ExecutionError, output
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase elsif (files = written_files(output.lines)).any?
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger # successful execution
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger # we can not handle this response
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger raise ExecutionError, "Unexpected output:\n#{output}"
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger rescue Subprocess::Error => e
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger output = e.output
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger # Exclude usage message if exit status equals 2
a274d776b3371051dcdd74b598182ce113ca5135Julian Kornberger if e.status == 2 and output.include? 'Usage:'
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger raise ExecutionError, output.split("Usage:").first
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger raise ExecutionError, e.message
2e7a48951591a6eeda9a3ab4e14cd13012cb43eaJulian Kornberger def self.config
4952c0f2ffd64062becdc4efeb38446a904d7ec1Julian Kornberger @@config ||= Config.new
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase def self.written_files(lines)
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase lines.reduce([]) do |lines, line|
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase file = written_file(line)
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase lines << file if file
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase def self.written_file(line)
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase match = line.match(/Writing file: (?<file>.+)/)
6116d75120b5db0bcbc4a11abed8d0254ec85b8eTim Reddehase match[:file] if match