module RDF::Vocabulary::VocabFormatExtensions

Public Instance Methods

cli_commands() click to toggle source

Hash of CLI commands appropriate for this format @return [Hash{Symbol => Lambda(Array, Hash)}]

Calls superclass method
# File lib/rdf/vocab/extensions.rb, line 502
def cli_commands
  super.merge({
    "gen-vocab": {
      description: "Generate a vocabulary using a special serialization.",
      parse: false,  # Only parse if there are input files, otherwise, uses vocabulary
      help: "gen-vocab --uri <vocabulary-URI> [--output-format ttl|jsonld|html] [options] [files]\nGenerate a vocabulary from repository using a special serialization.",
      lambda: ->(files, **options) do
        $stdout.puts "Generate Vocabulary"
        raise ArgumentError, "Must specify vocabulary URI" unless options[:base_uri]

        # Parse input graphs, if repository is not already created
        if RDF::CLI.repository.empty? && !files.empty?
          RDF::CLI.parse(files, **options) do |reader|
            RDF::CLI.repository << reader
          end
        end

        # Lookup vocabulary, or generate a new vocabulary from this URI
        vocab = RDF::Vocabulary.find(options[:base_uri]) || begin
          raise ArgumentError, "Must specify vocabulary prefix if vocabulary not built-in" unless options[:prefix]
          RDF::Vocabulary.from_graph(RDF::CLI.repository, url: options[:base_uri], class_name: options[:prefix].to_s.upcase)
        end

        prefixes = {}
        prefixes[options[:prefix]] = options[:base_uri] if options[:prefix]
        out = options[:output] || $stdout
        case options[:output_format]
        when :ttl, nil then out.write vocab.to_ttl(graph: RDF::CLI.repository, prefixes: prefixes)
        when :jsonld then out.write vocab.to_jsonld(graph: RDF::CLI.repository, prefixes: prefixes)
        when :html then out.write vocab.to_html(graph: RDF::CLI.repository, prefixes: prefixes, template: options[:template])
        else
          # Use whatever writer we find
          writer = RDF::Writer.for(options[:output_format]) || RDF::NTriples::Writer
          writer.new(out, **options) do |w|
            if RDF::CLI.repository.empty?
              vocab.each_statement {|s| w << s}
            else
              w << RDF::CLI.repository
            end
          end
        end
      end,
      options: [
        RDF::CLI::Option.new(
          symbol: :prefix,
          datatype: String,
          on: ["--prefix PREFIX"],
          description: "Prefix associated with vocabulary, if not built-in."),
        RDF::CLI::Option.new(
          symbol: :template,
          datatype: String,
          on: ["--template TEMPLATE"],
          description: "Path to local template for generating HTML, either Haml or ERB, depending on file extension.\n" +
                      "See https://github.com/ruby-rdf/rdf-vocab/tree/develop/etc for built-in templates."),
      ]
    }
  })
end