Skip to content

Commit 08af646

Browse files
committed
Added Context#reverse_term to find a term definition reversed from that requested.
Make Context#mappings, #mapping, and #languages private (used only in tests). Make Context#alias and #coerce protected.
1 parent bd5c64d commit 08af646

File tree

2 files changed

+212
-97
lines changed

2 files changed

+212
-97
lines changed

lib/json/ld/context.rb

Lines changed: 106 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ def to_context_definition(context)
8484
def inspect
8585
v = %w([TD)
8686
v << "id=#{@id}"
87+
v << "term=#{@term}"
8788
v << "rev" if reverse_property
8889
v << "container=#{container_mapping}" if container_mapping
8990
v << "lang=#{language_mapping.inspect}" unless language_mapping.nil?
@@ -602,8 +603,7 @@ def from_vocabulary(graph)
602603
when RDF::XSD.boolean, RDF::SCHEMA.Boolean, RDF::XSD.date, RDF::SCHEMA.Date,
603604
RDF::XSD.dateTime, RDF::SCHEMA.DateTime, RDF::XSD.time, RDF::SCHEMA.Time,
604605
RDF::XSD.duration, RDF::SCHEMA.Duration, RDF::XSD.decimal, RDF::SCHEMA.Number,
605-
RDF::XSD.float, RDF::SCHEMA.Float, RDF::XSD.integer, RDF::SCHEMA.Integer,
606-
RDF::XSD.anyURI
606+
RDF::XSD.float, RDF::SCHEMA.Float, RDF::XSD.integer, RDF::SCHEMA.Integer
607607
td.type_mapping = r
608608
td.simple = false
609609
else
@@ -616,29 +616,6 @@ def from_vocabulary(graph)
616616
self
617617
end
618618

619-
## FIXME: this should go away
620-
# Retrieve term mappings
621-
#
622-
# @return [Array<RDF::URI>]
623-
# @deprecated
624-
def mappings
625-
term_definitions.inject({}) do |memo, (t,td)|
626-
memo[t] = td ? td.id : nil
627-
memo
628-
end
629-
end
630-
631-
## FIXME: this should go away
632-
# Retrieve term mapping
633-
#
634-
# @param [String, #to_s] term
635-
#
636-
# @return [RDF::URI, String]
637-
# @deprecated
638-
def mapping(term)
639-
term_definitions[term] ? term_definitions[term].id : nil
640-
end
641-
642619
# Set term mapping
643620
#
644621
# @param [#to_s] term
@@ -658,83 +635,57 @@ def set_mapping(term, value)
658635
term_definitions[term]
659636
end
660637

661-
## FIXME: this should go away
662-
# Reverse term mapping, typically used for finding aliases for keys.
663-
#
664-
# Returns either the original value, or a mapping for this value.
665-
#
666-
# @example
667-
# {"@context": {"id": "@id"}, "@id": "foo"} => {"id": "foo"}
668-
#
669-
# @param [RDF::URI, String] value
670-
# @return [String]
671-
# @deprecated
672-
def alias(value)
673-
iri_to_term.fetch(value, value)
674-
end
675-
676-
##
677-
# Retrieve term coercion
678-
#
679-
# @param [String] property in unexpanded form
680-
#
681-
# @return [RDF::URI, '@id']
682-
def coerce(property)
683-
# Map property, if it's not an RDF::Value
684-
# @type is always is an IRI
685-
return '@id' if [RDF.type, '@type'].include?(property)
686-
term_definitions[property] && term_definitions[property].type_mapping
687-
end
688-
protected :coerce
689-
690638
##
691639
# Retrieve container mapping, add it if `value` is provided
692640
#
693-
# @param [String] property in unexpanded form
641+
# @param [Term, #to_s] term in unexpanded form
694642
# @return [String]
695-
def container(property)
696-
return '@set' if property == '@graph'
697-
return property if KEYWORDS.include?(property)
698-
term_definitions[property] && term_definitions[property].container_mapping
699-
end
700-
701-
## FIXME: this should go away
702-
# Retrieve language mappings
703-
#
704-
# @return [Array<String>]
705-
# @deprecated
706-
def languages
707-
term_definitions.inject({}) do |memo, (t,td)|
708-
memo[t] = td.language_mapping
709-
memo
710-
end
643+
def container(term)
644+
return '@set' if term == '@graph'
645+
return term if KEYWORDS.include?(term)
646+
term = term_definitions[term.to_s] unless term.is_a?(TermDefinition)
647+
term && term.container_mapping
711648
end
712649

713650
##
714-
# Retrieve the language associated with a property, or the default language otherwise
651+
# Retrieve the language associated with a term, or the default language otherwise
652+
# @param [Term, #to_s] term in unexpanded form
715653
# @return [String]
716-
def language(property)
717-
lang = term_definitions[property] && term_definitions[property].language_mapping
654+
def language(term)
655+
term = term_definitions[term.to_s] unless term.is_a?(TermDefinition)
656+
lang = term && term.language_mapping
718657
lang.nil? ? @default_language : lang
719658
end
720659

721660
##
722661
# Is this a reverse term
662+
# @param [Term, #to_s] term in unexpanded form
723663
# @return [Boolean]
724-
def reverse?(property)
725-
term_definitions[property] && term_definitions[property].reverse_property
664+
def reverse?(term)
665+
term = term_definitions[term.to_s] unless term.is_a?(TermDefinition)
666+
term && term.reverse_property
726667
end
727668

728669
##
729-
# Determine if `term` is a suitable term.
730-
# Term may be any valid JSON string.
670+
# Given a term or IRI, find a reverse term definition matching that term. If the term is already reversed, find a non-reversed version.
731671
#
732-
# @param [String] term
733-
# @return [Boolean]
734-
def term_valid?(term)
735-
term.is_a?(String)
672+
# @param [Term, #to_s] term
673+
# @return [Term] related term definition
674+
def reverse_term(term)
675+
# Direct lookup of term
676+
term = term_definitions[term.to_s] if term_definitions.has_key?(term.to_s) && !term.is_a?(TermDefinition)
677+
678+
# Lookup term, assuming term is an IRI
679+
unless term.is_a?(TermDefinition)
680+
td = term_definitions.values.detect {|t| t.id == term.to_s}
681+
682+
# Otherwise create a temporary term definition
683+
term = td || TermDefinition.new(term.to_s, expand_iri(term, vocab:true))
684+
end
685+
686+
# Now, return a term, which reverses this term
687+
term_definitions.values.detect {|t| t.id == term.id && t.reverse_property != term.reverse_property}
736688
end
737-
protected :term_valid?
738689

739690
##
740691
# Expand an IRI. Relative IRIs are expanded against any document base.
@@ -1155,7 +1106,45 @@ def dup
11551106
ec
11561107
end
11571108

1158-
private
1109+
protected
1110+
1111+
##
1112+
# Retrieve term coercion
1113+
#
1114+
# @param [String] property in unexpanded form
1115+
#
1116+
# @return [RDF::URI, '@id']
1117+
def coerce(property)
1118+
# Map property, if it's not an RDF::Value
1119+
# @type is always is an IRI
1120+
return '@id' if [RDF.type, '@type'].include?(property)
1121+
term_definitions[property] && term_definitions[property].type_mapping
1122+
end
1123+
1124+
##
1125+
# Determine if `term` is a suitable term.
1126+
# Term may be any valid JSON string.
1127+
#
1128+
# @param [String] term
1129+
# @return [Boolean]
1130+
def term_valid?(term)
1131+
term.is_a?(String)
1132+
end
1133+
1134+
# Reverse term mapping, typically used for finding aliases for keys.
1135+
#
1136+
# Returns either the original value, or a mapping for this value.
1137+
#
1138+
# @example
1139+
# {"@context": {"id": "@id"}, "@id": "foo"} => {"id": "foo"}
1140+
#
1141+
# @param [RDF::URI, String] value
1142+
# @return [String]
1143+
def alias(value)
1144+
iri_to_term.fetch(value, value)
1145+
end
1146+
1147+
private
11591148

11601149
def uri(value)
11611150
case value.to_s
@@ -1288,5 +1277,38 @@ def remove_base(iri)
12881277
end
12891278
iri
12901279
end
1280+
1281+
## Used for testing
1282+
# Retrieve term mappings
1283+
#
1284+
# @return [Array<RDF::URI>]
1285+
def mappings
1286+
term_definitions.inject({}) do |memo, (t,td)|
1287+
memo[t] = td ? td.id : nil
1288+
memo
1289+
end
1290+
end
1291+
1292+
## Used for testing
1293+
# Retrieve term mapping
1294+
#
1295+
# @param [String, #to_s] term
1296+
#
1297+
# @return [RDF::URI, String]
1298+
def mapping(term)
1299+
term_definitions[term] ? term_definitions[term].id : nil
1300+
end
1301+
1302+
## Used for testing
1303+
# Retrieve language mappings
1304+
#
1305+
# @return [Array<String>]
1306+
# @deprecated
1307+
def languages
1308+
term_definitions.inject({}) do |memo, (t,td)|
1309+
memo[t] = td.language_mapping
1310+
memo
1311+
end
1312+
end
12911313
end
12921314
end

0 commit comments

Comments
 (0)