57 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
require "json"
 | 
						|
 | 
						|
class RepoMetadata
 | 
						|
  attr_accessor :data
 | 
						|
 | 
						|
  def initialize data
 | 
						|
    @data = data
 | 
						|
    normalize_data!
 | 
						|
  end
 | 
						|
 | 
						|
  def allowed_fields
 | 
						|
    [
 | 
						|
      "name", "version", "language", "distribution-name",
 | 
						|
      "product-page", "github-repository", "issue-tracker"
 | 
						|
    ]
 | 
						|
  end
 | 
						|
 | 
						|
  def build output_directory
 | 
						|
    fields = @data.to_a.map { |kv| "--#{kv[0]} #{kv[1]}" }
 | 
						|
    Dir.chdir output_directory do
 | 
						|
      cmd "python3 -m docuploader create-metadata #{fields.join ' '}"
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def normalize_data!
 | 
						|
    @data.delete_if { |k, _| !allowed_fields.include?(k) }
 | 
						|
  end
 | 
						|
 | 
						|
  def [] key
 | 
						|
    data[key]
 | 
						|
  end
 | 
						|
 | 
						|
  def []= key, value
 | 
						|
    @data[key] = value
 | 
						|
  end
 | 
						|
 | 
						|
  def cmd line
 | 
						|
    puts line
 | 
						|
    output = `#{line}`
 | 
						|
    puts output
 | 
						|
    output
 | 
						|
  end
 | 
						|
 | 
						|
  def self.from_source source
 | 
						|
    if source.is_a? RepoMetadata
 | 
						|
      data = source.data
 | 
						|
    elsif source.is_a? Hash
 | 
						|
      data = source
 | 
						|
    elsif File.file? source
 | 
						|
      data = JSON.parse File.read(source)
 | 
						|
    else
 | 
						|
      raise "Source must be a path, hash, or RepoMetadata instance"
 | 
						|
    end
 | 
						|
    RepoMetadata.new data
 | 
						|
  end
 | 
						|
end
 |