module JSON::LD::StreamingWriter
Streaming writer interface.
Writes an array of statements serialized in expanded JSON-LD. No provision for turning rdf:first/rest into @list encodings. @author [Gregg Kellogg](greggkellogg.net/)
Public Instance Methods
Complete open statements @return [void] `self`
# File lib/json/ld/streaming_writer.rb, line 77 def stream_epilogue #log_debug("epilogue") {"state: #{@state.inspect}"} end_graph if context @output.puts "\n]}" else @output.puts "\n]" end self end
Write out array start, and note not to prepend node-separating ',' @return [void] `self`
# File lib/json/ld/streaming_writer.rb, line 12 def stream_prologue # If we were provided a context, or prefixes, use them to compact the output @context = case @options[:context] when nil then nil when Context then @options[:context] else Context.parse(@options[:context]) end #log_debug("prologue") {"context: #{context.inspect}"} if context @output.puts %({"@context": #{context.serialize['@context'].to_json}, "@graph": [) else @output.puts "[" end self end
Write a statement, creating a current node definition, if necessary.
Once a new/first statement is seen, terminate the current node definition and compact if provided a context.
Also expects all statements in the same context to be contained in a block including all subjects in a block (except for list elements)
Note that if list elements are not received in order using the same subject and property, this may cause a bad serialization.
@return [void] `self`
# File lib/json/ld/streaming_writer.rb, line 40 def stream_statement(statement) #log_debug("ss") {"state: #{@state.inspect}, stmt: #{statement}"} if @current_graph != statement.graph_name end_graph start_graph(statement.graph_name) end # If we're writing a list @current_node_def ||= {'@id' => statement.subject.to_s} if statement.subject.to_s != @current_node_def['@id'] end_node @current_node_def = {'@id' => statement.subject.to_s} end if statement.predicate == RDF.type (@current_node_def['@type'] ||= []) << statement.object.to_s else pd = (@current_node_def[statement.predicate.to_s] ||= []) pd << if statement.object.resource? {'@id' => statement.object.to_s} elsif statement.object.datatype == RDF::URI(RDF.to_uri + "JSON") {"@value" => MultiJson.load(statement.object.to_s), "@type" => "@json"} else lit = {"@value" => statement.object.to_s} lit["@type"] = statement.object.datatype.to_s if statement.object.datatype? lit["@language"] = statement.object.language.to_s if statement.object.language? lit end end self end
Private Instance Methods
# File lib/json/ld/streaming_writer.rb, line 100 def end_graph #log_debug("end_graph") {"state: #{@state.inspect}, ctx: #{@current_graph}"} end_node if @current_graph @output.write %(]}) @state = :wrote_graph end end
# File lib/json/ld/streaming_writer.rb, line 109 def end_node #log_debug("end_node") {"state: #{@state.inspect}, node: #{@current_node_def.to_json}"} @output.puts(",") if %i(wrote_node wrote_graph).include?(@state) if @current_node_def node_def = if context compacted = JSON::LD::API.compact(@current_node_def, context, rename_bnodes: false, **@options) compacted.delete('@context') compacted else @current_node_def end @output.write node_def.to_json @state = :wrote_node @current_node_def = nil end end
# File lib/json/ld/streaming_writer.rb, line 90 def start_graph(resource) #log_debug("start_graph") {"state: #{@state.inspect}, resource: #{resource}"} if resource @output.puts(",") if %i(wrote_node wrote_graph).include?(@state) @output.puts %({"@id": "#{resource}", "@graph": [) @state = :in_graph end @current_graph = resource end