Skip to content

Commit c680d21

Browse files
committed
Don't serialize when API methods are used internally.
1 parent 6cf3cd1 commit c680d21

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+68
-118
lines changed

README.md

Lines changed: 2 additions & 3 deletions

lib/json/ld.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ module LD
4646
# Default context when compacting without one being specified
4747
DEFAULT_CONTEXT = "http://schema.org"
4848

49+
# Acceptable MultiJson adapters
50+
MUTLI_JSON_ADAPTERS = %i(oj json_gem json_pure ok_json yajl nsjsonseerialization)
51+
4952
KEYWORDS = Set.new(%w(
5053
@annotation
5154
@base

lib/json/ld/api.rb

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ def initialize(input, context, **options, &block)
126126

127127
case remote_doc.document
128128
when String
129-
MultiJson.load(remote_doc.document, **options)
129+
mj_opts = options.keep_if {|k,v| k != :adapter || MUTLI_JSON_ADAPTERS.include?(v)}
130+
MultiJson.load(remote_doc.document, **mj_opts)
130131
else
131132
# Already parsed
132133
remote_doc.document
@@ -391,7 +392,8 @@ def self.frame(input, frame, expanded: false, serializer: nil, **options)
391392
requestProfile: 'http://www.w3.org/ns/json-ld#frame',
392393
**options)
393394
if remote_doc.document.is_a?(String)
394-
MultiJson.load(remote_doc.document)
395+
mj_opts = options.keep_if {|k,v| k != :adapter || MUTLI_JSON_ADAPTERS.include?(v)}
396+
MultiJson.load(remote_doc.document, **mj_opts)
395397
else
396398
remote_doc.document
397399
end
@@ -665,7 +667,8 @@ def self.loadRemoteDocument(url,
665667
end
666668
else
667669
validate_input(remote_doc.document, url: remote_doc.documentUrl) if validate
668-
MultiJson.load(remote_doc.document, **options)
670+
mj_opts = options.keep_if {|k,v| k != :adapter || MUTLI_JSON_ADAPTERS.include?(v)}
671+
MultiJson.load(remote_doc.document, **mj_opts)
669672
end
670673
end
671674

@@ -699,8 +702,8 @@ def self.documentLoader(url, extractAllScripts: false, profile: nil, requestProf
699702
base_uri ||= url.base_uri if url.respond_to?(:base_uri)
700703
content_type = options[:content_type]
701704
content_type ||= url.content_type if url.respond_to?(:content_type)
702-
context_url = if url.respond_to?(:links) && url.links
703-
(content_type == 'appliaction/json' || content_type.match?(%r(application/(^ld)+json)))
705+
context_url = if url.respond_to?(:links) && url.links &&
706+
(content_type == 'application/json' || content_type.match?(%r(application/(^ld)+json)))
704707
link = url.links.find_link(LINK_REL_CONTEXT)
705708
link.href if link
706709
end
@@ -776,7 +779,8 @@ def self.load_html(input, url:,
776779
raise JSON::LD::JsonLdError::LoadingDocumentFailed, "Script tag has type=#{element.attributes['type']}" unless element.attributes['type'].to_s.start_with?('application/ld+json')
777780
content = element.inner_html
778781
validate_input(content, url: url) if options[:validate]
779-
MultiJson.load(content, **options)
782+
mj_opts = options.keep_if {|k,v| k != :adapter || MUTLI_JSON_ADAPTERS.include?(v)}
783+
MultiJson.load(content, **mj_opts)
780784
elsif extractAllScripts
781785
res = []
782786
elements = if profile
@@ -790,7 +794,8 @@ def self.load_html(input, url:,
790794
elements.each do |element|
791795
content = element.inner_html
792796
validate_input(content, url: url) if options[:validate]
793-
r = MultiJson.load(content, **options)
797+
mj_opts = options.keep_if {|k,v| k != :adapter || MUTLI_JSON_ADAPTERS.include?(v)}
798+
r = MultiJson.load(content, **mj_opts)
794799
if r.is_a?(Hash)
795800
res << r
796801
elsif r.is_a?(Array)
@@ -805,7 +810,8 @@ def self.load_html(input, url:,
805810
raise JSON::LD::JsonLdError::LoadingDocumentFailed, "No script tag found" unless element
806811
content = element.inner_html
807812
validate_input(content, url: url) if options[:validate]
808-
MultiJson.load(content, **options)
813+
mj_opts = options.keep_if {|k,v| k != :adapter || MUTLI_JSON_ADAPTERS.include?(v)}
814+
MultiJson.load(content, **mj_opts)
809815
end
810816
rescue MultiJson::ParseError => e
811817
raise JSON::LD::JsonLdError::InvalidScriptElement, e.message

lib/json/ld/reader.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def self.options
5757
end
5858

5959
##
60-
# Initializes the RDF/JSON reader instance.
60+
# Initializes the JSON-LD reader instance.
6161
#
6262
# @param [IO, File, String] input
6363
# @param [Hash{Symbol => Object}] options

lib/json/ld/streaming_reader.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ def stream_statement(&block)
2626
unique_bnodes, rename_bnodes = @options[:unique_bnodes], @options.fetch(:rename_bnodes, true)
2727
# FIXME: document loader doesn't stream
2828
@base = RDF::URI(@options[:base] || base_uri)
29-
value = MultiJson.load(@doc, **@options)
29+
mj_opts = @options.keep_if {|k,v| k != :adapter || MUTLI_JSON_ADAPTERS.include?(v)}
30+
value = MultiJson.load(@doc, mj_opts)
3031
context_ref = @options[:expandContext]
3132
#context_ref = @options.fetch(:expandContext, remote_doc.contextUrl)
3233
context = Context.parse(context_ref, **@options)

lib/json/ld/writer.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,6 @@ class << self
186186
# @return [Boolean]
187187
# @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
188188
def accept?(accept_params)
189-
# Profiles that aren't specific IANA relations represent the URL
190-
# of a context or frame that may be subject to black- or white-listing
191-
profile = accept_params[:profile].to_s.split(/\s+/)
192-
193189
if block_given?
194190
yield(accept_params)
195191
else
@@ -303,7 +299,7 @@ def write_epilogue
303299
else
304300

305301
log_debug("writer") { "serialize #{@repo.count} statements, #{@options.inspect}"}
306-
result = API.fromRdf(@repo, **@options)
302+
result = API.fromRdf(@repo, **@options.merge(serializer: nil))
307303

308304
# Some options may be indicated from accept parameters
309305
profile = @options.fetch(:accept_params, {}).fetch(:profile, "").split(' ')
@@ -325,17 +321,17 @@ def write_epilogue
325321

326322
# Rename BNodes to uniquify them, if necessary
327323
if options[:unique_bnodes]
328-
result = API.flatten(result, context, **@options)
324+
result = API.flatten(result, context, **@options.merge(serializer: nil))
329325
end
330326

331327
if frame = @options[:frame]
332328
# Perform framing, if given a frame
333329
log_debug("writer") { "frame result"}
334-
result = API.frame(result, frame, **@options)
330+
result = API.frame(result, frame, **@options.merge(serializer: nil))
335331
elsif context
336332
# Perform compaction, if we have a context
337333
log_debug("writer") { "compact result"}
338-
result = API.compact(result, context, **@options)
334+
result = API.compact(result, context, **@options.merge(serializer: nil))
339335
end
340336

341337
@output.write(@serializer.call(result))

spec/api_spec.rb

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -48,77 +48,75 @@
4848
context "with MultiJson adapter #{adapter.inspect}" do
4949
Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), 'test-files/*-input.*'))) do |filename|
5050
test = File.basename(filename).sub(/-input\..*$/, '')
51-
frame = filename.sub(/-input\..*$/, '-frame.json')
52-
framed = filename.sub(/-input\..*$/, '-framed.json')
53-
compacted = filename.sub(/-input\..*$/, '-compacted.json')
54-
context = filename.sub(/-input\..*$/, '-context.json')
55-
expanded = filename.sub(/-input\..*$/, '-expanded.json')
51+
frame = filename.sub(/-input\..*$/, '-frame.jsonld')
52+
framed = filename.sub(/-input\..*$/, '-framed.jsonld')
53+
compacted = filename.sub(/-input\..*$/, '-compacted.jsonld')
54+
context = filename.sub(/-input\..*$/, '-context.jsonld')
55+
expanded = filename.sub(/-input\..*$/, '-expanded.jsonld')
5656
ttl = filename.sub(/-input\..*$/, '-rdf.ttl')
5757

5858
context test, skip: ("Not supported in JRuby" if RUBY_ENGINE == "jruby" && %w(oj yajl).include?(adapter.to_s)) do
59+
around do |example|
60+
@file = File.open(filename)
61+
case filename
62+
when /.jsonld$/
63+
@file.define_singleton_method(:content_type) {'application/ld+json'}
64+
end
65+
if context
66+
@ctx_io = File.open(context)
67+
case context
68+
when /.jsonld$/
69+
@ctx_io.define_singleton_method(:content_type) {'application/ld+json'}
70+
end
71+
end
72+
example.run
73+
@file.close
74+
@ctx_io.close if @ctx_io
75+
end
76+
5977
if File.exist?(expanded)
6078
it "expands" do
6179
options = {logger: logger, adapter: adapter}
62-
File.open(context) do |ctx_io|
63-
File.open(filename) do |file|
64-
options[:expandContext] = ctx_io if context
65-
jld = described_class.expand(file, **options)
66-
expect(jld).to produce_jsonld(JSON.parse(File.read(expanded)), logger)
67-
end
68-
end
80+
options[:expandContext] = @ctx_io if context
81+
jld = described_class.expand(@file, **options)
82+
expect(jld).to produce_jsonld(JSON.parse(File.read(expanded)), logger)
6983
end
7084

7185
it "expands with serializer" do
7286
options = {logger: logger, adapter: adapter}
73-
File.open(context) do |ctx_io|
74-
File.open(filename) do |file|
75-
options[:expandContext] = ctx_io if context
76-
jld = described_class.expand(file, serializer: JSON::LD::API.method(:serializer), **options)
77-
expect(jld).to be_a(String)
78-
expect(JSON.load(jld)).to produce_jsonld(JSON.parse(File.read(expanded)), logger)
79-
end
80-
end
87+
options[:expandContext] = @ctx_io if context
88+
jld = described_class.expand(@file, serializer: JSON::LD::API.method(:serializer), **options)
89+
expect(jld).to be_a(String)
90+
expect(JSON.load(jld)).to produce_jsonld(JSON.parse(File.read(expanded)), logger)
8191
end
8292
end
8393

8494
if File.exist?(compacted) && File.exist?(context)
8595
it "compacts" do
86-
File.open(context) do |ctx_io|
87-
File.open(filename) do |file|
88-
jld = described_class.compact(file, ctx_io, adapter: adapter, logger: logger)
89-
expect(jld).to produce_jsonld(JSON.parse(File.read(compacted)), logger)
90-
end
91-
end
96+
jld = described_class.compact(@file, @ctx_io, adapter: adapter, logger: logger)
97+
expect(jld).to produce_jsonld(JSON.parse(File.read(compacted)), logger)
9298
end
9399

94100
it "compacts with serializer" do
95-
File.open(context) do |ctx_io|
96-
File.open(filename) do |file|
97-
jld = described_class.compact(file, ctx_io, serializer: JSON::LD::API.method(:serializer), adapter: adapter, logger: logger)
98-
expect(jld).to be_a(String)
99-
expect(JSON.load(jld)).to produce_jsonld(JSON.parse(File.read(compacted)), logger)
100-
end
101-
end
101+
jld = described_class.compact(@file, @ctx_io, serializer: JSON::LD::API.method(:serializer), adapter: adapter, logger: logger)
102+
expect(jld).to be_a(String)
103+
expect(JSON.load(jld)).to produce_jsonld(JSON.parse(File.read(compacted)), logger)
102104
end
103105
end
104106

105107
if File.exist?(framed) && File.exist?(frame)
106108
it "frames" do
107109
File.open(frame) do |frame_io|
108-
File.open(filename) do |file|
109-
jld = described_class.frame(file, frame_io, adapter: adapter, logger: logger)
110-
expect(jld).to produce_jsonld(JSON.parse(File.read(framed)), logger)
111-
end
110+
jld = described_class.frame(@file, frame_io, adapter: adapter, logger: logger)
111+
expect(jld).to produce_jsonld(JSON.parse(File.read(framed)), logger)
112112
end
113113
end
114114

115115
it "frames with serializer" do
116116
File.open(frame) do |frame_io|
117-
File.open(filename) do |file|
118-
jld = described_class.frame(file, frame_io, serializer: JSON::LD::API.method(:serializer), adapter: adapter, logger: logger)
119-
expect(jld).to be_a(String)
120-
expect(JSON.load(jld)).to produce_jsonld(JSON.parse(File.read(framed)), logger)
121-
end
117+
jld = described_class.frame(@file, frame_io, serializer: JSON::LD::API.method(:serializer), adapter: adapter, logger: logger)
118+
expect(jld).to be_a(String)
119+
expect(JSON.load(jld)).to produce_jsonld(JSON.parse(File.read(framed)), logger)
122120
end
123121
end
124122
end

spec/format_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@
7373
describe ".cli_commands", skip: Gem.win_platform? do
7474
require 'rdf/cli'
7575
let(:ttl) {File.expand_path("../test-files/test-1-rdf.ttl", __FILE__)}
76-
let(:json) {File.expand_path("../test-files/test-1-input.json", __FILE__)}
77-
let(:context) {File.expand_path("../test-files/test-1-context.json", __FILE__)}
76+
let(:json) {File.expand_path("../test-files/test-1-input.jsonld", __FILE__)}
77+
let(:context) {File.expand_path("../test-files/test-1-context.jsonld", __FILE__)}
7878

7979
describe "#expand" do
8080
it "expands RDF" do

spec/test-files/test-1-normalized.json

Lines changed: 0 additions & 8 deletions
This file was deleted.

spec/test-files/test-2-normalized.json

Lines changed: 0 additions & 32 deletions
This file was deleted.

spec/test-files/test-3-normalized.json

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)