rdf 3.2.10 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/rdf/model/uri.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
  require 'cgi'
3
4
 
4
5
  module RDF
@@ -28,27 +29,27 @@ module RDF
28
29
  include RDF::Resource
29
30
 
30
31
  # IRI components
31
- UCSCHAR = Regexp.compile(<<-EOS.gsub(/\s+/, ''))
32
- [\\u00A0-\\uD7FF]|[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFEF]|
33
- [\\u{10000}-\\u{1FFFD}]|[\\u{20000}-\\u{2FFFD}]|[\\u{30000}-\\u{3FFFD}]|
34
- [\\u{40000}-\\u{4FFFD}]|[\\u{50000}-\\u{5FFFD}]|[\\u{60000}-\\u{6FFFD}]|
35
- [\\u{70000}-\\u{7FFFD}]|[\\u{80000}-\\u{8FFFD}]|[\\u{90000}-\\u{9FFFD}]|
36
- [\\u{A0000}-\\u{AFFFD}]|[\\u{B0000}-\\u{BFFFD}]|[\\u{C0000}-\\u{CFFFD}]|
37
- [\\u{D0000}-\\u{DFFFD}]|[\\u{E1000}-\\u{EFFFD}]
38
- EOS
39
- IPRIVATE = Regexp.compile("[\\uE000-\\uF8FF]|[\\u{F0000}-\\u{FFFFD}]|[\\u100000-\\u10FFFD]").freeze
32
+ UCSCHAR = %(
33
+ \\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF
34
+ \\u{10000}-\\u{1FFFD}\\u{20000}-\\u{2FFFD}\\u{30000}-\\u{3FFFD}
35
+ \\u{40000}-\\u{4FFFD}\\u{50000}-\\u{5FFFD}\\u{60000}-\\u{6FFFD}
36
+ \\u{70000}-\\u{7FFFD}\\u{80000}-\\u{8FFFD}\\u{90000}-\\u{9FFFD}
37
+ \\u{A0000}-\\u{AFFFD}\\u{B0000}-\\u{BFFFD}\\u{C0000}-\\u{CFFFD}
38
+ \\u{D0000}-\\u{DFFFD}\\u{E1000}-\\u{EFFFD}
39
+ ).gsub(/\s+/, '')
40
+ IPRIVATE = Regexp.compile("[\\uE000-\\uF8FF\\u{F0000}-\\u{FFFFD}\\u{100000}-\\u{10FFFD}]").freeze
40
41
  SCHEME = Regexp.compile("[A-Za-z](?:[A-Za-z0-9+-\.])*").freeze
41
42
  PORT = Regexp.compile("[0-9]*").freeze
42
43
  IP_literal = Regexp.compile("\\[[0-9A-Fa-f:\\.]*\\]").freeze # Simplified, no IPvFuture
43
44
  PCT_ENCODED = Regexp.compile("%[0-9A-Fa-f][0-9A-Fa-f]").freeze
44
- GEN_DELIMS = Regexp.compile("[:/\\?\\#\\[\\]@]").freeze
45
- SUB_DELIMS = Regexp.compile("[!\\$&'\\(\\)\\*\\+,;=]").freeze
46
- RESERVED = Regexp.compile("(?:#{GEN_DELIMS}|#{SUB_DELIMS})").freeze
45
+ GEN_DELIMS = Regexp.compile(%q{[:/\?\#\[\]@]}).freeze
46
+ SUB_DELIMS = Regexp.compile(%q{[!\$&'\(\)\*\+,;=]}).freeze
47
+ RESERVED = Regexp.union(GEN_DELIMS, SUB_DELIMS).freeze
47
48
  UNRESERVED = Regexp.compile("[A-Za-z0-9\._~-]").freeze
48
49
 
49
- IUNRESERVED = Regexp.compile("[A-Za-z0-9\._~-]|#{UCSCHAR}").freeze
50
+ IUNRESERVED = Regexp.union(UNRESERVED, Regexp.compile("[#{UCSCHAR}]")).freeze
50
51
 
51
- IPCHAR = Regexp.compile("(?:#{IUNRESERVED}|#{PCT_ENCODED}|#{SUB_DELIMS}|:|@)").freeze
52
+ IPCHAR = Regexp.union(IUNRESERVED, PCT_ENCODED, SUB_DELIMS, /[:|@]/).freeze
52
53
 
53
54
  IQUERY = Regexp.compile("(?:#{IPCHAR}|#{IPRIVATE}|/|\\?)*").freeze
54
55
 
@@ -65,7 +66,7 @@ module RDF
65
66
  IPATH_EMPTY = Regexp.compile("").freeze
66
67
 
67
68
  IREG_NAME = Regexp.compile("(?:(?:#{IUNRESERVED})|(?:#{PCT_ENCODED})|(?:#{SUB_DELIMS}))*").freeze
68
- IHOST = Regexp.compile("(?:#{IP_literal})|(?:#{IREG_NAME})").freeze
69
+ IHOST = Regexp.union(IP_literal, IREG_NAME).freeze
69
70
  IUSERINFO = Regexp.compile("(?:(?:#{IUNRESERVED})|(?:#{PCT_ENCODED})|(?:#{SUB_DELIMS})|:)*").freeze
70
71
  IAUTHORITY = Regexp.compile("(?:#{IUSERINFO}@)?#{IHOST}(?::#{PORT})?").freeze
71
72
 
@@ -116,7 +117,21 @@ module RDF
116
117
  # Note: not all reserved characters need to be escaped in SPARQL/Turtle, but they must be unescaped when encountered
117
118
  PN_ESCAPE_CHARS = /[~\.!\$&'\(\)\*\+,;=\/\?\#@%]/.freeze
118
119
  PN_ESCAPES = /\\#{Regexp.union(PN_ESCAPE_CHARS, /[\-_]/)}/.freeze
119
-
120
+
121
+ # For URI encoding
122
+ # iuserinfo = *( iunreserved / pct-encoded / sub-delims / ":" )
123
+ ENCODE_USER =
124
+ ENCODE_PASSWORD = Regexp.compile("[^A-Za-z0-9\._~#{UCSCHAR}!$&'\(\)\*\+,;=:-]").freeze
125
+ # isegment = *ipchar
126
+ # ipchar = iunreserved / pct-encoded / sub-delims / ":" / "@"
127
+ ENCODE_ISEGMENT = Regexp.compile("[^A-Za-z0-9\._~#{UCSCHAR}!$&'\(\)\*\+,;=:-]").freeze
128
+ # isegment-nz-nc = 1*( iunreserved / pct-encoded / sub-delims / "@" )
129
+ ENCODE_ISEGMENT_NC = Regexp.compile("[^A-Za-z0-9\._~#{UCSCHAR}!$&'\(\)\*\+,;=-]").freeze
130
+ # iquery = *( ipchar / iprivate / "/" / "?" )
131
+ ENCODE_IQUERY = Regexp.compile("[^A-Za-z0-9\._~#{UCSCHAR}\\uE000-\\uF8FF\\u{F0000}-\\u{FFFFD}\\u{100000}-\\u{10FFFD}/?=]").freeze
132
+ # ifragment = *( ipchar / "/" / "?" )
133
+ ENCODE_IFRAGMENT = Regexp.compile("[^A-Za-z0-9\._~#{UCSCHAR}/?]").freeze
134
+
120
135
  ##
121
136
  # Cache size may be set through {RDF.config} using `uri_cache_size`.
122
137
  #
@@ -170,7 +185,7 @@ module RDF
170
185
  # @return [String] normalized path
171
186
  # @see http://tools.ietf.org/html/rfc3986#section-5.2.4
172
187
  def self.normalize_path(path)
173
- output, input = "", path.to_s
188
+ output, input = String.new, path.to_s
174
189
  if input.encoding != Encoding::ASCII_8BIT
175
190
  input = input.dup.force_encoding(Encoding::ASCII_8BIT)
176
191
  end
@@ -353,7 +368,7 @@ module RDF
353
368
  # @return [Boolean] `true` or `false`
354
369
  # @since 0.3.9
355
370
  def valid?
356
- RDF::URI::IRI.match(to_s) || false
371
+ RDF::URI::IRI.match?(to_s) || false
357
372
  end
358
373
 
359
374
  ##
@@ -920,7 +935,7 @@ module RDF
920
935
  # Return normalized version of scheme, if any
921
936
  # @return [String]
922
937
  def normalized_scheme
923
- normalize_segment(scheme.strip, SCHEME, true) if scheme
938
+ scheme.strip.downcase if scheme
924
939
  end
925
940
 
926
941
  ##
@@ -946,7 +961,7 @@ module RDF
946
961
  # Normalized version of user
947
962
  # @return [String]
948
963
  def normalized_user
949
- URI.encode(CGI.unescape(user), /[^#{IUNRESERVED}|#{SUB_DELIMS}]/).force_encoding(Encoding::UTF_8) if user
964
+ URI.encode(CGI.unescape(user), ENCODE_USER).force_encoding(Encoding::UTF_8) if user
950
965
  end
951
966
 
952
967
  ##
@@ -972,7 +987,7 @@ module RDF
972
987
  # Normalized version of password
973
988
  # @return [String]
974
989
  def normalized_password
975
- URI.encode(CGI.unescape(password), /[^#{IUNRESERVED}|#{SUB_DELIMS}]/).force_encoding(Encoding::UTF_8) if password
990
+ URI.encode(CGI.unescape(password), ENCODE_PASSWORD).force_encoding(Encoding::UTF_8) if password
976
991
  end
977
992
 
978
993
  HOST_FROM_AUTHORITY_RE = /(?:[^@]+@)?([^:]+)(?::.*)?$/.freeze
@@ -1000,7 +1015,7 @@ module RDF
1000
1015
  # @return [String]
1001
1016
  def normalized_host
1002
1017
  # Remove trailing '.' characters
1003
- normalize_segment(host, IHOST, true).chomp('.') if host
1018
+ host.sub(/\.*$/, '').downcase if host
1004
1019
  end
1005
1020
 
1006
1021
  PORT_FROM_AUTHORITY_RE = /:(\d+)$/.freeze
@@ -1028,12 +1043,8 @@ module RDF
1028
1043
  # @return [String]
1029
1044
  def normalized_port
1030
1045
  if port
1031
- np = normalize_segment(port.to_s, PORT)
1032
- if PORT_MAPPING[normalized_scheme] == np.to_i
1033
- nil
1034
- else
1035
- np.to_i
1036
- end
1046
+ np = port.to_i
1047
+ PORT_MAPPING[normalized_scheme] != np ? np : nil
1037
1048
  end
1038
1049
  end
1039
1050
 
@@ -1064,30 +1075,36 @@ module RDF
1064
1075
  # Normalized version of path
1065
1076
  # @return [String]
1066
1077
  def normalized_path
1078
+ if normalized_scheme == "urn"
1079
+ # Special-case URI. Normalize the NID component only
1080
+ nid, p = path.to_s.split(':', 2)
1081
+ return "#{nid.downcase}:#{p}"
1082
+ end
1083
+
1067
1084
  segments = path.to_s.split('/', -1) # preserve null segments
1068
1085
 
1069
1086
  norm_segs = case
1070
1087
  when authority
1071
1088
  # ipath-abempty
1072
- segments.map {|s| normalize_segment(s, ISEGMENT)}
1089
+ segments.map {|s| normalize_segment(s, ENCODE_ISEGMENT)}
1073
1090
  when segments[0].nil?
1074
1091
  # ipath-absolute
1075
1092
  res = [nil]
1076
- res << normalize_segment(segments[1], ISEGMENT_NZ) if segments.length > 1
1077
- res += segments[2..-1].map {|s| normalize_segment(s, ISEGMENT)} if segments.length > 2
1093
+ res << normalize_segment(segments[1], ENCODE_ISEGMENT) if segments.length > 1
1094
+ res += segments[2..-1].map {|s| normalize_segment(s, ENCODE_ISEGMENT)} if segments.length > 2
1078
1095
  res
1079
1096
  when segments[0].to_s.index(':')
1080
1097
  # ipath-noscheme
1081
1098
  res = []
1082
- res << normalize_segment(segments[0], ISEGMENT_NZ_NC)
1083
- res += segments[1..-1].map {|s| normalize_segment(s, ISEGMENT)} if segments.length > 1
1099
+ res << normalize_segment(segments[0], ENCODE_ISEGMENT_NC)
1100
+ res += segments[1..-1].map {|s| normalize_segment(s, ENCODE_ISEGMENT)} if segments.length > 1
1084
1101
  res
1085
1102
  when segments[0]
1086
1103
  # ipath-rootless
1087
1104
  # ipath-noscheme
1088
1105
  res = []
1089
- res << normalize_segment(segments[0], ISEGMENT_NZ)
1090
- res += segments[1..-1].map {|s| normalize_segment(s, ISEGMENT)} if segments.length > 1
1106
+ res << normalize_segment(segments[0], ENCODE_ISEGMENT)
1107
+ res += segments[1..-1].map {|s| normalize_segment(s, ENCODE_ISEGMENT)} if segments.length > 1
1091
1108
  res
1092
1109
  else
1093
1110
  # Should be empty
@@ -1096,7 +1113,7 @@ module RDF
1096
1113
 
1097
1114
  res = self.class.normalize_path(norm_segs.join("/"))
1098
1115
  # Special rules for specific protocols having empty paths
1099
- normalize_segment(res.empty? ? (%w(http https ftp tftp).include?(normalized_scheme) ? '/' : "") : res, IHIER_PART)
1116
+ (res.empty? && %w(http https ftp tftp).include?(normalized_scheme)) ? '/' : res
1100
1117
  end
1101
1118
 
1102
1119
  ##
@@ -1120,7 +1137,7 @@ module RDF
1120
1137
  # Normalized version of query
1121
1138
  # @return [String]
1122
1139
  def normalized_query
1123
- normalize_segment(query, IQUERY) if query
1140
+ normalize_segment(query, ENCODE_IQUERY) if query
1124
1141
  end
1125
1142
 
1126
1143
  ##
@@ -1144,7 +1161,7 @@ module RDF
1144
1161
  # Normalized version of fragment
1145
1162
  # @return [String]
1146
1163
  def normalized_fragment
1147
- normalize_segment(fragment, IFRAGMENT) if fragment
1164
+ normalize_segment(fragment, ENCODE_IFRAGMENT) if fragment
1148
1165
  end
1149
1166
 
1150
1167
  ##
@@ -1274,7 +1291,7 @@ module RDF
1274
1291
  self.query = case value
1275
1292
  when Array, Hash
1276
1293
  value.map do |(k,v)|
1277
- k = normalize_segment(k.to_s, UNRESERVED)
1294
+ k = normalize_segment(k.to_s, /[^A-Za-z0-9\._~-]/)
1278
1295
  if v.nil?
1279
1296
  k
1280
1297
  else
@@ -1282,7 +1299,7 @@ module RDF
1282
1299
  if vv === TrueClass
1283
1300
  k
1284
1301
  else
1285
- "#{k}=#{normalize_segment(vv.to_s, UNRESERVED)}"
1302
+ "#{k}=#{normalize_segment(vv.to_s, /[^A-Za-z0-9\._~-]/)}"
1286
1303
  end
1287
1304
  end.join("&")
1288
1305
  end
@@ -1331,7 +1348,7 @@ module RDF
1331
1348
  # Normalize a segment using a character range
1332
1349
  #
1333
1350
  # @param [String] value
1334
- # @param [Regexp] expr
1351
+ # @param [Regexp] expr matches characters to be encoded
1335
1352
  # @param [Boolean] downcase
1336
1353
  # @return [String]
1337
1354
  def normalize_segment(value, expr, downcase = false)
@@ -1339,7 +1356,7 @@ module RDF
1339
1356
  value = value.dup.force_encoding(Encoding::UTF_8)
1340
1357
  decoded = CGI.unescape(value)
1341
1358
  decoded.downcase! if downcase
1342
- URI.encode(decoded, /[^(?:#{expr})]/).force_encoding(Encoding::UTF_8)
1359
+ URI.encode(decoded, expr).force_encoding(Encoding::UTF_8)
1343
1360
  end
1344
1361
  end
1345
1362
 
@@ -1364,7 +1381,7 @@ module RDF
1364
1381
  def self.encode(str, expr)
1365
1382
  str.gsub(expr) do
1366
1383
  us = $&
1367
- tmp = ''
1384
+ tmp = String.new
1368
1385
  us.each_byte do |uc|
1369
1386
  tmp << sprintf('%%%02X', uc)
1370
1387
  end
data/lib/rdf/nquads.rb CHANGED
@@ -22,7 +22,6 @@ module RDF
22
22
  class Format < RDF::Format
23
23
  content_type 'application/n-quads',
24
24
  extension: :nq,
25
- alias: 'text/x-nquads;q=0.2',
26
25
  uri: RDF::URI("http://www.w3.org/ns/formats/N-Quads")
27
26
  content_encoding 'utf-8'
28
27
 
@@ -18,7 +18,6 @@ module RDF::NTriples
18
18
  class Format < RDF::Format
19
19
  content_type 'application/n-triples',
20
20
  extension: :nt,
21
- alias: 'text/plain;q=0.2',
22
21
  uri: RDF::URI("http://www.w3.org/ns/formats/N-Triples")
23
22
  content_encoding 'utf-8'
24
23
 
@@ -28,7 +28,7 @@ module RDF::NTriples
28
28
  # end
29
29
  # end
30
30
  #
31
- # ** RDFStar (RDF*)
31
+ # ** RDF=star
32
32
  #
33
33
  # Supports statements as resources using `<<s p o>>`.
34
34
  #
@@ -60,24 +60,16 @@ module RDF::NTriples
60
60
  U_CHARS2 = Regexp.compile("\\u00B7|[\\u0300-\\u036F]|[\\u203F-\\u2040]").freeze
61
61
  IRI_RANGE = Regexp.compile("[[^<>\"{}\|\^`\\\\]&&[^\\x00-\\x20]]").freeze
62
62
 
63
- # 163s
64
63
  PN_CHARS_BASE = /[A-Z]|[a-z]|#{U_CHARS1}/.freeze
65
- # 164s
66
64
  PN_CHARS_U = /_|#{PN_CHARS_BASE}/.freeze
67
- # 166s
68
65
  PN_CHARS = /-|[0-9]|#{PN_CHARS_U}|#{U_CHARS2}/.freeze
69
- # 159s
70
66
  ECHAR = /\\[tbnrf"'\\]/.freeze
71
- # 18
67
+
72
68
  IRIREF = /<((?:#{IRI_RANGE}|#{UCHAR})*)>/.freeze
73
- # 141s
74
69
  BLANK_NODE_LABEL = /_:((?:[0-9]|#{PN_CHARS_U})(?:(?:#{PN_CHARS}|\.)*#{PN_CHARS})?)/.freeze
75
- # 144s
76
- LANGTAG = /@([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)/.freeze
77
- # 22
70
+ LANG_DIR = /@([a-zA-Z]+(?:-[a-zA-Z0-9]+)*(?:--[a-zA-Z]+)?)/.freeze
78
71
  STRING_LITERAL_QUOTE = /"((?:[^\"\\\n\r]|#{ECHAR}|#{UCHAR})*)"/.freeze
79
72
 
80
- # RDF*
81
73
  ST_START = /^<</.freeze
82
74
  ST_END = /^\s*>>/.freeze
83
75
 
@@ -86,7 +78,7 @@ module RDF::NTriples
86
78
  NODEID = /^#{BLANK_NODE_LABEL}/.freeze
87
79
  URIREF = /^#{IRIREF}/.freeze
88
80
  LITERAL_PLAIN = /^#{STRING_LITERAL_QUOTE}/.freeze
89
- LITERAL_WITH_LANGUAGE = /^#{STRING_LITERAL_QUOTE}#{LANGTAG}/.freeze
81
+ LITERAL_WITH_LANGUAGE = /^#{STRING_LITERAL_QUOTE}#{LANG_DIR}/.freeze
90
82
  LITERAL_WITH_DATATYPE = /^#{STRING_LITERAL_QUOTE}\^\^#{IRIREF}/.freeze
91
83
  DATATYPE_URI = /^\^\^#{IRIREF}/.freeze
92
84
  LITERAL = Regexp.union(LITERAL_WITH_LANGUAGE, LITERAL_WITH_DATATYPE, LITERAL_PLAIN).freeze
@@ -95,6 +87,9 @@ module RDF::NTriples
95
87
  OBJECT = Regexp.union(URIREF, NODEID, LITERAL).freeze
96
88
  END_OF_STATEMENT = /^\s*\.\s*(?:#.*)?$/.freeze
97
89
 
90
+ # LANGTAG is deprecated
91
+ LANGTAG = LANG_DIR
92
+
98
93
  ##
99
94
  # Reconstructs an RDF value from its serialized N-Triples
100
95
  # representation.
@@ -299,8 +294,10 @@ module RDF::NTriples
299
294
  if literal_str = match(LITERAL_PLAIN)
300
295
  literal_str = self.class.unescape(literal_str)
301
296
  literal = case
302
- when language = match(LANGTAG)
303
- RDF::Literal.new(literal_str, language: language)
297
+ when lang_dir = match(LANG_DIR)
298
+ language, direction = lang_dir.split('--')
299
+ raise ArgumentError if direction && !@options[:rdfstar]
300
+ RDF::Literal.new(literal_str, language: language, direction: direction)
304
301
  when datatype = match(/^(\^\^)/) # FIXME
305
302
  RDF::Literal.new(literal_str, datatype: read_uriref || fail_object)
306
303
  else
@@ -310,6 +307,10 @@ module RDF::NTriples
310
307
  literal.canonicalize! if canonicalize?
311
308
  literal
312
309
  end
310
+ rescue ArgumentError
311
+ v = literal_str
312
+ v += "@#{lang_dir}" if lang_dir
313
+ log_error("Invalid Literal (found: \"#{v}\")", lineno: lineno, token: "#v", exception: RDF::ReaderError)
313
314
  end
314
315
 
315
316
  ##
@@ -224,7 +224,7 @@ module RDF::NTriples
224
224
  end
225
225
 
226
226
  ##
227
- # Returns the N-Triples representation of an RDF* reified statement.
227
+ # Returns the N-Triples representation of an RDF-star quoted triple.
228
228
  #
229
229
  # @param [RDF::Statement] statement
230
230
  # @param [Hash{Symbol => Object}] options ({})
@@ -312,6 +312,7 @@ module RDF::NTriples
312
312
  # Note, escaping here is more robust than in Term
313
313
  text = quoted(escaped(literal.value))
314
314
  text << "@#{literal.language}" if literal.language?
315
+ text << "--#{literal.direction}" if literal.direction?
315
316
  text << "^^<#{uri_for(literal.datatype)}>" if literal.datatype?
316
317
  text
317
318
  else
data/lib/rdf/ntriples.rb CHANGED
@@ -8,14 +8,14 @@ module RDF
8
8
  # [Turtle](http://www.w3.org/TeamSubmission/turtle/) and
9
9
  # [Notation3](http://www.w3.org/TeamSubmission/n3/) (N3).
10
10
  #
11
- # The MIME content type for N-Triples files is `text/plain` and the
11
+ # The MIME content type for N-Triples files is `application/n-triples` and the
12
12
  # recommended file extension is `.nt`.
13
13
  #
14
14
  # An example of an RDF statement in N-Triples format:
15
15
  #
16
16
  # <https://rubygems.org/gems/rdf> <http://purl.org/dc/terms/title> "rdf" .
17
17
  #
18
- # ## RDFStar (RDF*)
18
+ # ## Quoted Triples
19
19
  #
20
20
  # Supports statements as resources using `<<s p o>>`.
21
21
  #
@@ -209,7 +209,7 @@ class RDF::Query
209
209
  # Merges the bindings from the given `other` query solution into this
210
210
  # one, overwriting any existing ones having the same name.
211
211
  #
212
- # ## RDFStar (RDF*)
212
+ # ## RDF-star
213
213
  #
214
214
  # If merging a binding for a statement to a pattern,
215
215
  # merge their embedded solutions.
data/lib/rdf/reader.rb CHANGED
@@ -133,7 +133,7 @@ module RDF
133
133
  on: ["--canonicalize"],
134
134
  control: :checkbox,
135
135
  default: false,
136
- description: "Canonicalize input/output.") {true},
136
+ description: "Canonicalize URI/literal forms") {true},
137
137
  RDF::CLI::Option.new(
138
138
  symbol: :encoding,
139
139
  datatype: Encoding,
@@ -163,7 +163,7 @@ module RDF
163
163
  datatype: TrueClass,
164
164
  control: :checkbox,
165
165
  on: ["--rdfstar"],
166
- description: "Parse RDF*."),
166
+ description: "Parse RDF-star for preliminary RDF 1.2 support."),
167
167
  RDF::CLI::Option.new(
168
168
  symbol: :validate,
169
169
  datatype: TrueClass,
@@ -271,13 +271,13 @@ module RDF
271
271
  # the base URI to use when resolving relative URIs (not supported by
272
272
  # all readers)
273
273
  # @param [Boolean] canonicalize (false)
274
- # whether to canonicalize parsed literals
274
+ # whether to canonicalize parsed URIs and Literals.
275
275
  # @param [Encoding] encoding (Encoding::UTF_8)
276
276
  # the encoding of the input stream
277
277
  # @param [Boolean] intern (true)
278
278
  # whether to intern all parsed URIs
279
279
  # @param [Boolean] rdfstar (false)
280
- # support parsing RDF* statement resources.
280
+ # Preliminary support for RDF 1.2.
281
281
  # @param [Hash] prefixes (Hash.new)
282
282
  # the prefix mappings to use (not supported by all readers)
283
283
  # @param [Hash{Symbol => Object}] options
@@ -608,7 +608,9 @@ module RDF
608
608
  end
609
609
 
610
610
  ##
611
- # Returns `true` if parsed values should be canonicalized.
611
+ # Returns `true` if parsed values should be in canonical form.
612
+ #
613
+ # @note This is for term canonicalization, for graph/dataset canonicalization use `RDF::Normalize`.
612
614
  #
613
615
  # @return [Boolean] `true` or `false`
614
616
  # @since 0.3.0
@@ -182,7 +182,8 @@ module RDF
182
182
  when :validity then @options.fetch(:with_validity, true)
183
183
  when :literal_equality then true
184
184
  when :atomic_write then false
185
- when :rdfstar then false
185
+ when :quoted_triples then false
186
+ when :base_direction then false
186
187
  when :snapshots then false
187
188
  else false
188
189
  end
@@ -269,7 +270,8 @@ module RDF
269
270
  when :validity then @options.fetch(:with_validity, true)
270
271
  when :literal_equality then true
271
272
  when :atomic_write then true
272
- when :rdfstar then true
273
+ when :quoted_triples then true
274
+ when :base_direction then true
273
275
  when :snapshots then true
274
276
  else false
275
277
  end
@@ -110,7 +110,7 @@ module RDF; module Util
110
110
 
111
111
  ##
112
112
  # This implementation uses the `WeakRef` class from Ruby's standard
113
- # library, and provides adequate performance on JRuby and on Ruby 2.x.
113
+ # library, and provides adequate performance on JRuby and on Ruby 3.x.
114
114
  #
115
115
  # @see http://ruby-doc.org/stdlib-2.2.0/libdoc/weakref/rdoc/WeakRef.html
116
116
  class WeakRefCache < Cache
@@ -127,7 +127,7 @@ module RDF; module Util
127
127
  def [](key)
128
128
  if (ref = @cache[key])
129
129
  if ref.weakref_alive?
130
- value = ref.__getobj__ rescue nil
130
+ ref.__getobj__ rescue nil
131
131
  else
132
132
  @cache.delete(key)
133
133
  nil
data/lib/rdf/util/uuid.rb CHANGED
@@ -22,11 +22,11 @@ module RDF; module Util
22
22
  begin
23
23
  require 'uuid'
24
24
  ::UUID.generate(format)
25
- rescue LoadError => e
25
+ rescue LoadError
26
26
  begin
27
27
  require 'uuidtools'
28
28
  ::UUIDTools::UUID.random_create.hexdigest
29
- rescue LoadError => e
29
+ rescue LoadError
30
30
  raise LoadError.new("no such file to load -- uuid or uuidtools")
31
31
  end
32
32
  end
@@ -92,6 +92,10 @@ module RDF
92
92
  # # @return [RDF::Vocabulary::Term]
93
93
  # # @attr_reader :langString
94
94
  #
95
+ # # The datatype of directional language-tagged string values.
96
+ # # @return [RDF::Vocabulary::Term]
97
+ # # @attr_reader :dirLangString
98
+ #
95
99
  # # RDF/XML node element.
96
100
  # # @return [RDF::Vocabulary::Term]
97
101
  # # @attr_reader :Description
@@ -283,6 +287,13 @@ module RDF
283
287
  "http://www.w3.org/2000/01/rdf-schema#seeAlso": %(http://www.w3.org/TR/rdf11-concepts/#section-Graph-Literal).freeze,
284
288
  subClassOf: "http://www.w3.org/2000/01/rdf-schema#Literal".freeze,
285
289
  type: "http://www.w3.org/2000/01/rdf-schema#Datatype".freeze
290
+ term :dirLangString,
291
+ comment: %(The datatype of directional language-tagged string values).freeze,
292
+ label: "dirLangString".freeze,
293
+ isDefinedBy: %(http://www.w3.org/1999/02/22-rdf-syntax-ns#).freeze,
294
+ "http://www.w3.org/2000/01/rdf-schema#seeAlso": %(http://www.w3.org/TR/rdf11-concepts/#section-Graph-Literal).freeze,
295
+ subClassOf: "http://www.w3.org/2000/01/rdf-schema#Literal".freeze,
296
+ type: "http://www.w3.org/2000/01/rdf-schema#Datatype".freeze
286
297
 
287
298
  # Extra definitions
288
299
  term :Description,
data/lib/rdf/writer.rb CHANGED
@@ -392,7 +392,9 @@ module RDF
392
392
  end
393
393
 
394
394
  ##
395
- # Returns `true` if terms should be canonicalized.
395
+ # Returns `true` if terms should be in canonical form.
396
+ #
397
+ # @note This is for term canonicalization, for graph/dataset canonicalization use `RDF::Normalize`.
396
398
  #
397
399
  # @return [Boolean] `true` or `false`
398
400
  # @since 1.0.8
data/lib/rdf.rb CHANGED
@@ -5,7 +5,6 @@ require 'time'
5
5
  require "ostruct"
6
6
 
7
7
  require 'rdf/version'
8
- require 'rdf/extensions'
9
8
 
10
9
  module RDF
11
10
  # RDF mixins