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
 |