rdf 3.2.12 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 909c6e55ee44ff73c0903c7af21ebd39ee82e317f0bf53a355b75f2e57ebb8b7
4
- data.tar.gz: 7ccabf50046101ba51548cb8fe0da82989d039935428876f3b2f5edb51cd04ad
3
+ metadata.gz: c90d17f92036ca2959a7be98c9cf5322374c0f0a623d4b44782bde2478eb2a65
4
+ data.tar.gz: ce40842adb100ff6d2ec068cc20b0320a30dab85b5a1a47056823e10fac59302
5
5
  SHA512:
6
- metadata.gz: 5e23d2176b0593e396b7f07af60b91e60849f2f2c7b7431fbe58245567bd084c8610431a1438465b67c647088dac839e8337a1d27faf06705d97f1541bbf3616
7
- data.tar.gz: 41ca7cc45458e926a1883f1b97f4024396180f745ca9f164267878fb3a42d0fbd9c8ec921047ba27097bac5b8c5eb988761da3fc52df67df906d9a992f0b2d14
6
+ metadata.gz: 4ac4099d5eadff8676d0d692433d1dc3f9875032cf6617f7e0da53a559a53a88afbd6191be491c28204ca5475d007813858beefef2ac4b51f3a13c572b83aecb
7
+ data.tar.gz: 48688b3f9da835d74fed96bca2f60063da209db8567fb29932d878ab252c85fe0b4f08413ed627bd6cf95ec08ffc6447828c8f353ef897e055bbf5b786204a18
data/README.md CHANGED
@@ -14,26 +14,28 @@ This is a pure-Ruby library for working with [Resource Description Framework
14
14
 
15
15
  1. [Features](#features)
16
16
  2. [Differences between RDF 1.0 and RDF 1.1](#differences-between-rdf-1-0-and-rdf-1-1)
17
- 3. [Tutorials](#tutorials)
18
- 4. [Command Line](#command-line)
19
- 5. [Examples](#examples)
20
- 6. [Reader/Writer convenience methods](#reader/writer-convenience-methods)
21
- 7. [RDF* (RDFStar)](#rdf*-(rdfstar))
22
- 8. [Documentation](#documentation)
23
- 9. [Dependencies](#dependencies)
24
- 10. [Installation](#installation)
25
- 11. [Download](#download)
26
- 12. [Resources](#resources)
27
- 13. [Mailing List](#mailing-list)
28
- 14. [Authors](#authors)
29
- 15. [Contributors](#contributors)
30
- 16. [Contributing](#contributing)
31
- 17. [License](#license)
17
+ 3. [Differences between RDF 1.1 and RDF 1.2](#differences-between-rdf-1-1-and-rdf-1-2)
18
+ 4. [Tutorials](#tutorials)
19
+ 5. [Command Line](#command-line)
20
+ 6. [Examples](#examples)
21
+ 7. [Reader/Writer convenience methods](#reader/writer-convenience-methods)
22
+ 8. [RDF 1.2](#rdf\_12)
23
+ 9. [Documentation](#documentation)
24
+ 10. [Dependencies](#dependencies)
25
+ 11. [Installation](#installation)
26
+ 12. [Download](#download)
27
+ 13. [Resources](#resources)
28
+ 14. [Mailing List](#mailing-list)
29
+ 15. [Authors](#authors)
30
+ 16. [Contributors](#contributors)
31
+ 17. [Contributing](#contributing)
32
+ 18. [License](#license)
32
33
 
33
34
  ## Features
34
35
 
35
36
  * 100% pure Ruby with minimal dependencies and no bloat.
36
37
  * Fully compatible with [RDF 1.1][] specifications.
38
+ * Provisional support for [RDF 1.2][] specifications.
37
39
  * 100% free and unencumbered [public domain](https://unlicense.org/) software.
38
40
  * Provides a clean, well-designed RDF object model and related APIs.
39
41
  * Supports parsing and serializing [N-Triples][] and [N-Quads][] out of the box, with more
@@ -45,11 +47,10 @@ This is a pure-Ruby library for working with [Resource Description Framework
45
47
  not modify any of Ruby's core classes or standard library.
46
48
  * Based entirely on Ruby's autoloading, meaning that you can generally make
47
49
  use of any one part of the library without needing to load up the rest.
48
- * Compatible with Ruby Ruby >= 2.4, Rubinius and JRuby 9.0+.
49
- * Note, changes in mapping hashes to keyword arguments for Ruby 2.7+ may require that arguments be passed more explicitly, especially when the first argument is a Hash and there are optional keyword arguments. In this case, Hash argument may need to be explicitly included within `{}` and the optional keyword arguments may need to be specified using `**{}` if there are no keyword arguments.
50
+ * Compatible with Ruby Ruby >= 3.0, Rubinius and JRuby 9.0+.
51
+ * Note, changes in mapping hashes to keyword arguments for Ruby 3+ may require that arguments be passed more explicitly, especially when the first argument is a Hash and there are optional keyword arguments. In this case, Hash argument may need to be explicitly included within `{}` and the optional keyword arguments may need to be specified using `**{}` if there are no keyword arguments.
50
52
  * Performs auto-detection of input to select appropriate Reader class if one
51
53
  cannot be determined from file characteristics.
52
- * Provisional support for [RDF*][].
53
54
 
54
55
  ### HTTP requests
55
56
 
@@ -102,6 +103,10 @@ the 1.1 release of RDF.rb:
102
103
 
103
104
  Notably, {RDF::Queryable#query} and {RDF::Query#execute} are now completely symmetric; this allows an implementation of {RDF::Queryable} to optimize queries using implementation-specific logic, allowing for substantial performance improvements when executing BGP queries.
104
105
 
106
+ ## Differences between RDF 1.1 and RDF 1.2
107
+ * {RDF::Literal} has an optional `direction` property for directional language-tagged strings.
108
+ * Removes support for legacy `text/plain` (as an alias for `application/n-triples`) and `text/x-nquads` (as an alias for `application/n-quads`)
109
+
105
110
  ## Tutorials
106
111
 
107
112
  * [Getting data from the Semantic Web using Ruby and RDF.rb](https://semanticweb.org/wiki/Getting_data_from_the_Semantic_Web_%28Ruby%29)
@@ -260,15 +265,16 @@ A separate [SPARQL][SPARQL doc] gem builds on basic BGP support to provide full
260
265
  foaf[:name] #=> RDF::URI("http://xmlns.com/foaf/0.1/name")
261
266
  foaf['mbox'] #=> RDF::URI("http://xmlns.com/foaf/0.1/mbox")
262
267
 
263
- ## RDF* (RDFStar)
268
+ ## RDF 1.2
264
269
 
265
- [RDF.rb][] includes provisional support for [RDF*][] with an N-Triples/N-Quads syntax extension that uses inline statements in the _subject_ or _object_ position.
270
+ [RDF.rb][] includes provisional support for [RDF 1.2][] with an N-Triples/N-Quads syntax for quoted triples in the _subject_ or _object_ position.
271
+ [RDF.rb][] includes provisional support for [RDF 1.2][] directional language-tagged strings, which are literals of type `rdf:dirLangString` having both a `language` and `direction`.
266
272
 
267
273
  Internally, an `RDF::Statement` is treated as another resource, along with `RDF::URI` and `RDF::Node`, which allows an `RDF::Statement` to have a `#subject` or `#object` which is also an `RDF::Statement`.
268
274
 
269
275
  **Note: This feature is subject to change or elimination as the standards process progresses.**
270
276
 
271
- ### Serializing a Graph containing embedded statements
277
+ ### Serializing a Graph containing quoted triples
272
278
 
273
279
  require 'rdf/ntriples'
274
280
  statement = RDF::Statement(RDF::URI('bob'), RDF::Vocab::FOAF.age, RDF::Literal(23))
@@ -276,7 +282,7 @@ Internally, an `RDF::Statement` is treated as another resource, along with `RDF:
276
282
  graph.dump(:ntriples, validate: false)
277
283
  # => '<<<bob> <http://xmlns.com/foaf/0.1/age> "23"^^<http://www.w3.org/2001/XMLSchema#integer>>> <ex:certainty> "0.9"^^<http://www.w3.org/2001/XMLSchema#double> .'
278
284
 
279
- ### Reading a Graph containing embedded statements
285
+ ### Reading a Graph containing quoted triples
280
286
 
281
287
  By default, the N-Triples reader will reject a document containing a subject resource.
282
288
 
@@ -286,13 +292,6 @@ By default, the N-Triples reader will reject a document containing a subject res
286
292
  end
287
293
  # => RDF::ReaderError
288
294
 
289
- Readers support a boolean valued `rdfstar` option.
290
-
291
- graph = RDF::Graph.new do |graph|
292
- RDF::NTriples::Reader.new(nt, rdfstar: true) {|reader| graph << reader}
293
- end
294
- graph.count #=> 1
295
-
296
295
  ## Documentation
297
296
 
298
297
  <https://ruby-rdf.github.io/rdf>
@@ -398,8 +397,9 @@ from BNode identity (i.e., they each entail the other)
398
397
 
399
398
  ## Dependencies
400
399
 
401
- * [Ruby](https://ruby-lang.org/) (>= 2.6)
400
+ * [Ruby](https://ruby-lang.org/) (>= 3.0)
402
401
  * [LinkHeader][] (>= 0.0.8)
402
+ * [bcp47_spec][] ( ~> 0.2)
403
403
  * Soft dependency on [RestClient][] (>= 2.1)
404
404
 
405
405
  ## Installation
@@ -407,7 +407,7 @@ from BNode identity (i.e., they each entail the other)
407
407
  The recommended installation method is via [RubyGems](https://rubygems.org/).
408
408
  To install the latest official release of RDF.rb, do:
409
409
 
410
- % [sudo] gem install rdf # Ruby 2.6+
410
+ % [sudo] gem install rdf # Ruby 3+
411
411
 
412
412
  ## Download
413
413
 
@@ -481,8 +481,10 @@ This is free and unencumbered public domain software. For more information,
481
481
  see <https://unlicense.org/> or the accompanying {file:UNLICENSE} file.
482
482
 
483
483
  [RDF]: https://www.w3.org/RDF/
484
- [N-Triples]: https://www.w3.org/TR/n-triples/
485
- [N-Quads]: https://www.w3.org/TR/n-quads/
484
+ [LinkHeader]: https://github.com/asplake/link_header
485
+ [bcp47_spec]: https://github.com/dadah89/bcp47_spec
486
+ [N-Triples]: https://www.w3.org/TR/rdf-n-triples/
487
+ [N-Quads]: https://www.w3.org/TR/rdf-n-quads/
486
488
  [YARD]: https://yardoc.org/
487
489
  [YARD-GS]: https://rubydoc.info/docs/yard/file/docs/GettingStarted.md
488
490
  [PDD]: https://unlicense.org/#unlicensing-contributions
@@ -496,6 +498,7 @@ see <https://unlicense.org/> or the accompanying {file:UNLICENSE} file.
496
498
  [SPARQL doc]: https://ruby-rdf.github.io/sparql
497
499
  [RDF 1.0]: https://www.w3.org/TR/2004/REC-rdf-concepts-20040210/
498
500
  [RDF 1.1]: https://www.w3.org/TR/rdf11-concepts/
501
+ [RDF 1.2]: https://www.w3.org/TR/rdf12-concepts/
499
502
  [SPARQL 1.1]: https://www.w3.org/TR/sparql11-query/
500
503
  [RDF.rb]: https://ruby-rdf.github.io/
501
504
  [RDF::DO]: https://ruby-rdf.github.io/rdf-do
@@ -510,7 +513,6 @@ see <https://unlicense.org/> or the accompanying {file:UNLICENSE} file.
510
513
  [RDF::TriX]: https://ruby-rdf.github.io/rdf-trix
511
514
  [RDF::Turtle]: https://ruby-rdf.github.io/rdf-turtle
512
515
  [RDF::Raptor]: https://ruby-rdf.github.io/rdf-raptor
513
- [RDF*]: https://w3c.github.io/rdf-star/rdf-star-cg-spec.html
514
516
  [LinkedData]: https://ruby-rdf.github.io/linkeddata
515
517
  [JSON::LD]: https://ruby-rdf.github.io/json-ld
516
518
  [RestClient]: https://rubygems.org/gems/rest-client
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.2.12
1
+ 3.3.0
data/lib/rdf/cli.rb CHANGED
@@ -60,7 +60,7 @@ module RDF
60
60
  # RDF::CLI::Option.new(
61
61
  # symbol: :canonicalize,
62
62
  # on: ["--canonicalize"],
63
- # description: "Canonicalize input/output.") {true},
63
+ # description: "Canonicalize URI/literal forms.") {true},
64
64
  # RDF::CLI::Option.new(
65
65
  # symbol: :uri,
66
66
  # on: ["--uri STRING"],
@@ -83,7 +83,8 @@ module RDF
83
83
  # * `:literal_equality' preserves [term-equality](https://www.w3.org/TR/rdf11-concepts/#dfn-literal-term-equality) for literals. Literals are equal only if their lexical values and datatypes are equal, character by character. Literals may be "inlined" to value-space for efficiency only if `:literal_equality` is `false`.
84
84
  # * `:validity` allows a concrete Enumerable implementation to indicate that it does or does not support valididty checking. By default implementations are assumed to support validity checking.
85
85
  # * `:skolemize` supports [Skolemization](https://www.w3.org/wiki/BnodeSkolemization) of an `Enumerable`. Implementations supporting this feature must implement a `#skolemize` method, taking a base URI used for minting URIs for BNodes as stable identifiers and a `#deskolemize` method, also taking a base URI used for turning URIs having that prefix back into the same BNodes which were originally skolemized.
86
- # * `:rdfstar` supports RDF* where statements may be subjects or objects of other statements.
86
+ # * `:quoted_triples` supports RDF 1.2 quoted triples.
87
+ # * `:base_direction` supports RDF 1.2 directional language-tagged strings.
87
88
  #
88
89
  # @param [Symbol, #to_sym] feature
89
90
  # @return [Boolean]
@@ -720,13 +721,33 @@ module RDF
720
721
  end
721
722
  alias_method :enum_graphs, :enum_graph
722
723
 
724
+ ##
725
+ # Enumerates each statement using its canonical representation.
726
+ #
727
+ # @note This is updated by `RDF::Normalize` to also canonicalize blank nodes.
728
+ #
729
+ # @return [RDF::Enumerable]
730
+ def canonicalize
731
+ this = self
732
+ Enumerable::Enumerator.new do |yielder|
733
+ this.send(:each_statement) {|y| yielder << y.canonicalize}
734
+ end
735
+ end
736
+
737
+ ##
738
+ # Mutating canonicalization not supported
739
+ #
740
+ # @raise NotImplementedError
741
+ def canonicalize!
742
+ raise NotImplementedError, "Canonicalizing enumerables not supported"
743
+ end
744
+
723
745
  ##
724
746
  # Returns all RDF statements in `self` as an array.
725
747
  #
726
748
  # Mixes in `RDF::Enumerable` into the returned object.
727
749
  #
728
750
  # @return [Array]
729
- # @since 0.2.0
730
751
  def to_a
731
752
  super.extend(RDF::Enumerable)
732
753
  end
@@ -140,7 +140,7 @@ module RDF
140
140
  # method in order to provide for storage-specific optimized triple
141
141
  # pattern matching.
142
142
  #
143
- # ## RDFStar (RDF*)
143
+ # ## RDF-star
144
144
  #
145
145
  # Statements may have embedded statements as either a subject or object, recursively.
146
146
  #
@@ -127,8 +127,11 @@ module RDF
127
127
  def insert_statements(statements)
128
128
  each = statements.respond_to?(:each_statement) ? :each_statement : :each
129
129
  statements.__send__(each) do |statement|
130
- if statement.embedded? && respond_to?(:supports?) && !supports?(:rdfstar)
131
- raise ArgumentError, "Wriable does not support embedded statements"
130
+ if statement.embedded? && respond_to?(:supports?) && !supports?(:quoted_triples)
131
+ raise ArgumentError, "Writable does not support quoted triples"
132
+ end
133
+ if statement.object && statement.object.literal? && statement.object.direction? && !supports?(:base_direction)
134
+ raise ArgumentError, "Writable does not support directional languaged-tagged strings"
132
135
  end
133
136
  insert_statement(statement)
134
137
  end
@@ -104,7 +104,7 @@ module RDF
104
104
  # @private
105
105
  # @see RDF::Enumerable#supports?
106
106
  def supports?(feature)
107
- return true if %i(graph_name rdfstar).include?(feature)
107
+ return true if %i(graph_name quoted_triples).include?(feature)
108
108
  super
109
109
  end
110
110
 
@@ -305,8 +305,11 @@ module RDF
305
305
  # @private
306
306
  # @see RDF::Mutable#insert
307
307
  def insert_statement(statement)
308
- if statement.embedded? && !@data.supports?(:rdfstar)
309
- raise ArgumentError, "Graph does not support embedded statements"
308
+ if statement.embedded? && !@data.supports?(:quoted_triples)
309
+ raise ArgumentError, "Graph does not support quoted triples"
310
+ end
311
+ if statement.object && statement.object.literal? && statement.object.direction? && !@data.supports?(:base_direction)
312
+ raise ArgumentError, "Graph does not support directional languaged-tagged strings"
310
313
  end
311
314
  statement = statement.dup
312
315
  statement.graph_name = graph_name
@@ -26,7 +26,7 @@ module RDF; class Literal
26
26
  when value.is_a?(::Numeric) then BigDecimal(value)
27
27
  else
28
28
  value = value.to_s
29
- value += "0" if value.end_with?(".") # Normalization required in Ruby 2.4
29
+ value += "0" if value.end_with?(".")
30
30
  BigDecimal(value) rescue BigDecimal(0)
31
31
  end
32
32
  end
@@ -1,4 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
+
3
+ require 'bcp47_spec'
4
+
2
5
  module RDF
3
6
  ##
4
7
  # An RDF literal.
@@ -9,7 +12,9 @@ module RDF
9
12
  #
10
13
  # Specific typed literals may have behavior different from the default implementation. See the following defined sub-classes for specific documentation. Additional sub-classes may be defined, and will interoperate by defining `DATATYPE` and `GRAMMAR` constants, in addition other required overrides of RDF::Literal behavior.
11
14
  #
12
- # In RDF 1.1, all literals are typed, including plain literals and language tagged literals. Internally, plain literals are given the `xsd:string` datatype and language tagged literals are given the `rdf:langString` datatype. Creating a plain literal, without a datatype or language, will automatically provide the `xsd:string` datatype; similar for language tagged literals. Note that most serialization formats will remove this datatype. Code which depends on a literal having the `xsd:string` datatype being different from a plain literal (formally, without a datatype) may break. However note that the `#has\_datatype?` will continue to return `false` for plain or language-tagged literals.
15
+ # In RDF 1.1, all literals are typed, including plain literals and language-tagged strings. Internally, plain literals are given the `xsd:string` datatype and language-tagged strings are given the `rdf:langString` datatype. Creating a plain literal, without a datatype or language, will automatically provide the `xsd:string` datatype; similar for language-tagged strings. Note that most serialization formats will remove this datatype. Code which depends on a literal having the `xsd:string` datatype being different from a plain literal (formally, without a datatype) may break. However note that the `#has\_datatype?` will continue to return `false` for plain or language-tagged strings.
16
+ #
17
+ # RDF 1.2 adds **directional language-tagged strings** which are effectively a subclass of **language-tagged strings** contining an additional **direction** component with value either **ltr** or **rtl** for Left-to-Right or Right-to-Left. This determines the general direction of a string when presented in n a user agent, where it might be in conflict with the inherent direction of the leading Unicode code points. Directional language-tagged strings are given the `rdf:langString` datatype.
13
18
  #
14
19
  # * {RDF::Literal::Boolean}
15
20
  # * {RDF::Literal::Date}
@@ -23,16 +28,23 @@ module RDF
23
28
  # value = RDF::Literal.new("Hello, world!")
24
29
  # value.plain? #=> true`
25
30
  #
26
- # @example Creating a language-tagged literal (1)
31
+ # @example Creating a language-tagged string (1)
27
32
  # value = RDF::Literal.new("Hello!", language: :en)
28
33
  # value.language? #=> true
29
34
  # value.language #=> :en
30
35
  #
31
- # @example Creating a language-tagged literal (2)
36
+ # @example Creating a language-tagged string (2)
32
37
  # RDF::Literal.new("Wazup?", language: :"en-US")
33
38
  # RDF::Literal.new("Hej!", language: :sv)
34
39
  # RDF::Literal.new("¡Hola!", language: :es)
35
40
  #
41
+ # @example Creating a directional language-tagged string
42
+ # value = RDF::Literal.new("Hello!", language: :en, direction: :ltr)
43
+ # value.language? #=> true
44
+ # value.language #=> :en
45
+ # value.direction? #=> true
46
+ # value.direction #=> :ltr
47
+ #
36
48
  # @example Creating an explicitly datatyped literal
37
49
  # value = RDF::Literal.new("2009-12-31", datatype: RDF::XSD.date)
38
50
  # value.datatype? #=> true
@@ -105,8 +117,14 @@ module RDF
105
117
 
106
118
  ##
107
119
  # @private
108
- def self.new(value, language: nil, datatype: nil, lexical: nil, validate: false, canonicalize: false, **options)
109
- raise ArgumentError, "datatype with language must be rdf:langString" if language && (datatype || RDF.langString).to_s != RDF.langString.to_s
120
+ def self.new(value, language: nil, datatype: nil, direction: nil, lexical: nil, validate: false, canonicalize: false, **options)
121
+ if language && direction
122
+ raise ArgumentError, "datatype with language and direction must be rdf:dirLangString" if (datatype || RDF.dirLangString).to_s != RDF.dirLangString.to_s
123
+ elsif language
124
+ raise ArgumentError, "datatype with language must be rdf:langString" if (datatype || RDF.langString).to_s != RDF.langString.to_s
125
+ else
126
+ raise ArgumentError, "datatype not compatible with language or direction" if language || direction
127
+ end
110
128
 
111
129
  klass = case
112
130
  when !self.equal?(RDF::Literal)
@@ -128,7 +146,7 @@ module RDF
128
146
  end
129
147
  end
130
148
  literal = klass.allocate
131
- literal.send(:initialize, value, language: language, datatype: datatype, **options)
149
+ literal.send(:initialize, value, language: language, datatype: datatype, direction: direction, **options)
132
150
  literal.validate! if validate
133
151
  literal.canonicalize! if canonicalize
134
152
  literal
@@ -137,18 +155,24 @@ module RDF
137
155
  TRUE = RDF::Literal.new(true)
138
156
  FALSE = RDF::Literal.new(false)
139
157
  ZERO = RDF::Literal.new(0)
158
+ XSD_STRING = RDF::URI("http://www.w3.org/2001/XMLSchema#string")
140
159
 
141
- # @return [Symbol] The language tag (optional).
160
+ # @return [Symbol] The language-tag (optional). Implies `datatype` is `rdf:langString`.
142
161
  attr_accessor :language
143
162
 
163
+ # @return [Symbol] The base direction (optional). Implies `datatype` is `rdf:dirLangString`.
164
+ attr_accessor :direction
165
+
144
166
  # @return [URI] The XML Schema datatype URI (optional).
145
167
  attr_accessor :datatype
146
168
 
147
169
  ##
148
- # Literals without a datatype are given either xsd:string or rdf:langString
149
- # depending on if there is language
170
+ # Literals without a datatype are given either `xsd:string`, `rdf:langString`, or `rdf:dirLangString`,
171
+ # depending on if there is `language` and/or `direction`.
150
172
  #
151
173
  # @param [Object] value
174
+ # @param [Symbol] direction (nil)
175
+ # Initial text direction.
152
176
  # @param [Symbol] language (nil)
153
177
  # Language is downcased to ensure proper matching
154
178
  # @param [String] lexical (nil)
@@ -163,16 +187,24 @@ module RDF
163
187
  # @see http://www.w3.org/TR/rdf11-concepts/#section-Graph-Literal
164
188
  # @see http://www.w3.org/TR/rdf11-concepts/#section-Datatypes
165
189
  # @see #to_s
166
- def initialize(value, language: nil, datatype: nil, lexical: nil, validate: false, canonicalize: false, **options)
190
+ def initialize(value, language: nil, datatype: nil, direction: nil, lexical: nil, validate: false, canonicalize: false, **options)
167
191
  @object = value.freeze
168
192
  @string = lexical if lexical
169
193
  @string = value if !defined?(@string) && value.is_a?(String)
170
194
  @string = @string.encode(Encoding::UTF_8).freeze if instance_variable_defined?(:@string)
171
195
  @object = @string if instance_variable_defined?(:@string) && @object.is_a?(String)
172
196
  @language = language.to_s.downcase.to_sym if language
197
+ @direction = direction.to_s.downcase.to_sym if direction
173
198
  @datatype = RDF::URI(datatype).freeze if datatype
174
199
  @datatype ||= self.class.const_get(:DATATYPE) if self.class.const_defined?(:DATATYPE)
175
- @datatype ||= instance_variable_defined?(:@language) && @language ? RDF.langString : RDF::URI("http://www.w3.org/2001/XMLSchema#string")
200
+ @datatype ||= if instance_variable_defined?(:@language) && @language &&
201
+ instance_variable_defined?(:@direction) && @direction
202
+ RDF.dirLangString
203
+ elsif instance_variable_defined?(:@language) && @language
204
+ RDF.langString
205
+ else
206
+ XSD_STRING
207
+ end
176
208
  end
177
209
 
178
210
  ##
@@ -202,8 +234,8 @@ module RDF
202
234
  #
203
235
  # Compatibility of two arguments is defined as:
204
236
  # * The arguments are simple literals or literals typed as xsd:string
205
- # * The arguments are plain literals with identical language tags
206
- # * The first argument is a plain literal with language tag and the second argument is a simple literal or literal typed as xsd:string
237
+ # * The arguments are plain literals with identical language-tags and directions
238
+ # * The first argument is a plain literal with language-tag and the second argument is a simple literal or literal typed as xsd:string
207
239
  #
208
240
  # @example
209
241
  # compatible?("abc" "b") #=> true
@@ -224,11 +256,11 @@ module RDF
224
256
  return false unless other.literal? && plain? && other.plain?
225
257
 
226
258
  # * The arguments are simple literals or literals typed as xsd:string
227
- # * The arguments are plain literals with identical language tags
228
- # * The first argument is a plain literal with language tag and the second argument is a simple literal or literal typed as xsd:string
229
- language? ?
230
- (language == other.language || other.datatype == RDF::URI("http://www.w3.org/2001/XMLSchema#string")) :
231
- other.datatype == RDF::URI("http://www.w3.org/2001/XMLSchema#string")
259
+ # * The arguments are plain literals with identical language-tags
260
+ # * The first argument is a plain literal with language-tag and the second argument is a simple literal or literal typed as xsd:string
261
+ language? || direction? ?
262
+ (language == other.language && direction == other.direction || other.datatype == XSD_STRING) :
263
+ other.datatype == XSD_STRING
232
264
  end
233
265
 
234
266
  ##
@@ -236,7 +268,7 @@ module RDF
236
268
  #
237
269
  # @return [Integer]
238
270
  def hash
239
- @hash ||= [to_s, datatype, language].hash
271
+ @hash ||= [to_s, datatype, language, direction].compact.hash
240
272
  end
241
273
 
242
274
 
@@ -270,6 +302,7 @@ module RDF
270
302
  self.value_hash == other.value_hash &&
271
303
  self.value.eql?(other.value) &&
272
304
  self.language.to_s.eql?(other.language.to_s) &&
305
+ self.direction.to_s.eql?(other.direction.to_s) &&
273
306
  self.datatype.eql?(other.datatype))
274
307
  end
275
308
 
@@ -290,7 +323,10 @@ module RDF
290
323
  case
291
324
  when self.eql?(other)
292
325
  true
293
- when self.language? && self.language.to_s == other.language.to_s
326
+ when self.direction? && self.direction == other.direction
327
+ # Literals with directions can compare if languages and directions are identical
328
+ self.value_hash == other.value_hash && self.value == other.value
329
+ when self.language? && self.language == other.language
294
330
  # Literals with languages can compare if languages are identical
295
331
  self.value_hash == other.value_hash && self.value == other.value
296
332
  when self.simple? && other.simple?
@@ -342,14 +378,18 @@ module RDF
342
378
 
343
379
  ##
344
380
  # Returns `true` if this is a plain literal. A plain literal
345
- # may have a language, but may not have a datatype. For
381
+ # may have a language and direction, but may not have a datatype. For
346
382
  # all practical purposes, this includes xsd:string literals
347
383
  # too.
348
384
  #
349
385
  # @return [Boolean] `true` or `false`
350
386
  # @see http://www.w3.org/TR/rdf-concepts/#dfn-plain-literal
351
387
  def plain?
352
- [RDF.langString, RDF::URI("http://www.w3.org/2001/XMLSchema#string")].include?(datatype)
388
+ [
389
+ RDF.langString,
390
+ RDF.dirLangString,
391
+ XSD_STRING
392
+ ].include?(datatype)
353
393
  end
354
394
 
355
395
  ##
@@ -359,19 +399,28 @@ module RDF
359
399
  # @return [Boolean] `true` or `false`
360
400
  # @see http://www.w3.org/TR/sparql11-query/#simple_literal
361
401
  def simple?
362
- datatype == RDF::URI("http://www.w3.org/2001/XMLSchema#string")
402
+ datatype == XSD_STRING
363
403
  end
364
404
 
365
405
  ##
366
- # Returns `true` if this is a language-tagged literal.
406
+ # Returns `true` if this is a language-tagged string.
367
407
  #
368
408
  # @return [Boolean] `true` or `false`
369
- # @see http://www.w3.org/TR/rdf-concepts/#dfn-plain-literal
409
+ # @see https://www.w3.org/TR/rdf-concepts/#dfn-language-tagged-string
370
410
  def language?
371
- datatype == RDF.langString
411
+ [RDF.langString, RDF.dirLangString].include?(datatype)
372
412
  end
373
413
  alias_method :has_language?, :language?
374
414
 
415
+ ##
416
+ # Returns `true` if this is a directional language-tagged string.
417
+ #
418
+ # @return [Boolean] `true` or `false`
419
+ # @see https://www.w3.org/TR/rdf-concepts/#dfn-dir-lang-string
420
+ def direction?
421
+ datatype == RDF.dirLangString
422
+ end
423
+
375
424
  ##
376
425
  # Returns `true` if this is a datatyped literal.
377
426
  #
@@ -380,7 +429,7 @@ module RDF
380
429
  # @return [Boolean] `true` or `false`
381
430
  # @see http://www.w3.org/TR/rdf-concepts/#dfn-typed-literal
382
431
  def datatype?
383
- !plain? && !language?
432
+ !plain? && !language? && !direction?
384
433
  end
385
434
  alias_method :has_datatype?, :datatype?
386
435
  alias_method :typed?, :datatype?
@@ -393,10 +442,13 @@ module RDF
393
442
  # @return [Boolean] `true` or `false`
394
443
  # @since 0.2.1
395
444
  def valid?
396
- return false if language? && language.to_s !~ /^[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*$/
445
+ BCP47.parse(language.to_s) if language?
446
+ return false if direction? && !%i{ltr rtl}.include?(direction)
397
447
  return false if datatype? && datatype.invalid?
398
448
  grammar = self.class.const_get(:GRAMMAR) rescue nil
399
449
  grammar.nil? || value.match?(grammar)
450
+ rescue BCP47::InvalidLanguageTag
451
+ false
400
452
  end
401
453
 
402
454
  ##
@@ -536,12 +588,12 @@ module RDF
536
588
 
537
589
  ##
538
590
  # @overload #to_str
539
- # This method is implemented when the datatype is `xsd:string` or `rdf:langString`
591
+ # This method is implemented when the datatype is `xsd:string`, `rdf:langString`, or `rdf:dirLangString`
540
592
  # @return [String]
541
593
  def method_missing(name, *args)
542
594
  case name
543
595
  when :to_str
544
- return to_s if @datatype == RDF.langString || @datatype == RDF::URI("http://www.w3.org/2001/XMLSchema#string")
596
+ return to_s if [RDF.langString, RDF.dirLangString, XSD_STRING].include?(@datatype)
545
597
  end
546
598
  super
547
599
  end
@@ -549,7 +601,7 @@ module RDF
549
601
  def respond_to_missing?(name, include_private = false)
550
602
  case name
551
603
  when :to_str
552
- return true if @datatype == RDF.langString || @datatype == RDF::URI("http://www.w3.org/2001/XMLSchema#string")
604
+ return true if [RDF.langString, RDF.dirLangString, XSD_STRING].include?(@datatype)
553
605
  end
554
606
  super
555
607
  end
@@ -182,6 +182,7 @@ module RDF
182
182
  ##
183
183
  # Returns `true` if any element of the statement is, itself, a statement.
184
184
  #
185
+ # Note: Nomenclature is evolving, alternatives could include `#complex?` and `#nested?`
185
186
  # @return [Boolean]
186
187
  def embedded?
187
188
  subject && subject.statement? || object && object.statement?
@@ -410,7 +411,7 @@ module RDF
410
411
  end
411
412
 
412
413
  ##
413
- # Canonicalizes each unfrozen term in the statement
414
+ # Canonicalizes each unfrozen term in the statement.
414
415
  #
415
416
  # @return [RDF::Statement] `self`
416
417
  # @since 1.0.8
@@ -436,6 +437,18 @@ module RDF
436
437
  nil
437
438
  end
438
439
 
440
+ # New statement with duplicated components (other than blank nodes)
441
+ #
442
+ # @return [RDF::Statement]
443
+ def dup
444
+ options = Hash[@options]
445
+ options[:subject] = subject.is_a?(RDF::Node) ? subject : subject.dup
446
+ options[:predicate] = predicate.dup
447
+ options[:object] = object.is_a?(RDF::Node) ? object : object.dup
448
+ options[:graph_name] = graph_name.is_a?(RDF::Node) ? graph_name : graph_name.dup if graph_name
449
+ RDF::Statement.new(options)
450
+ end
451
+
439
452
  ##
440
453
  # Returns the terms of this statement as a `Hash`.
441
454
  #
data/lib/rdf/model/uri.rb CHANGED
@@ -160,7 +160,7 @@ module RDF
160
160
  # (see #initialize)
161
161
  # @return [RDF::URI] an immutable, frozen URI object
162
162
  def self.intern(str, *args, **options)
163
- (cache[(str = str.to_s).to_sym] ||= self.new(str.to_s, *args, **options)).freeze
163
+ (cache[(str = str.to_s).to_sym] ||= self.new(str, *args, **options)).freeze
164
164
  end
165
165
 
166
166
  ##
@@ -716,8 +716,8 @@ module RDF
716
716
  ##
717
717
  # @private
718
718
  def freeze
719
- @mutex.synchronize do
720
- unless frozen?
719
+ unless frozen?
720
+ @mutex.synchronize do
721
721
  # Create derived components
722
722
  authority; userinfo; user; password; host; port
723
723
  @value = value.freeze
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
@@ -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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdf
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.12
4
+ version: 3.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arto Bendiken
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-08-04 00:00:00.000000000 Z
13
+ date: 2023-08-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: link_header
@@ -33,13 +33,24 @@ dependencies:
33
33
  - !ruby/object:Gem::Version
34
34
  version: 0.0.8
35
35
  - !ruby/object:Gem::Dependency
36
- name: rdf-spec
36
+ name: bcp47_spec
37
37
  requirement: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '3.2'
42
- - - "<"
41
+ version: '0.2'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '0.2'
49
+ - !ruby/object:Gem::Dependency
50
+ name: rdf-spec
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
43
54
  - !ruby/object:Gem::Version
44
55
  version: '3.3'
45
56
  type: :development
@@ -47,9 +58,6 @@ dependencies:
47
58
  version_requirements: !ruby/object:Gem::Requirement
48
59
  requirements:
49
60
  - - "~>"
50
- - !ruby/object:Gem::Version
51
- version: '3.2'
52
- - - "<"
53
61
  - !ruby/object:Gem::Version
54
62
  version: '3.3'
55
63
  - !ruby/object:Gem::Dependency
@@ -57,9 +65,6 @@ dependencies:
57
65
  requirement: !ruby/object:Gem::Requirement
58
66
  requirements:
59
67
  - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '3.2'
62
- - - "<"
63
68
  - !ruby/object:Gem::Version
64
69
  version: '3.3'
65
70
  type: :development
@@ -67,9 +72,6 @@ dependencies:
67
72
  version_requirements: !ruby/object:Gem::Requirement
68
73
  requirements:
69
74
  - - "~>"
70
- - !ruby/object:Gem::Version
71
- version: '3.2'
72
- - - "<"
73
75
  - !ruby/object:Gem::Version
74
76
  version: '3.3'
75
77
  - !ruby/object:Gem::Dependency
@@ -77,9 +79,6 @@ dependencies:
77
79
  requirement: !ruby/object:Gem::Requirement
78
80
  requirements:
79
81
  - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '3.2'
82
- - - "<"
83
82
  - !ruby/object:Gem::Version
84
83
  version: '3.3'
85
84
  type: :development
@@ -87,9 +86,6 @@ dependencies:
87
86
  version_requirements: !ruby/object:Gem::Requirement
88
87
  requirements:
89
88
  - - "~>"
90
- - !ruby/object:Gem::Version
91
- version: '3.2'
92
- - - "<"
93
89
  - !ruby/object:Gem::Version
94
90
  version: '3.3'
95
91
  - !ruby/object:Gem::Dependency
@@ -97,12 +93,6 @@ dependencies:
97
93
  requirement: !ruby/object:Gem::Requirement
98
94
  requirements:
99
95
  - - "~>"
100
- - !ruby/object:Gem::Version
101
- version: '3.2'
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: 3.2.1
105
- - - "<"
106
96
  - !ruby/object:Gem::Version
107
97
  version: '3.3'
108
98
  type: :development
@@ -110,12 +100,6 @@ dependencies:
110
100
  version_requirements: !ruby/object:Gem::Requirement
111
101
  requirements:
112
102
  - - "~>"
113
- - !ruby/object:Gem::Version
114
- version: '3.2'
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: 3.2.1
118
- - - "<"
119
103
  - !ruby/object:Gem::Version
120
104
  version: '3.3'
121
105
  - !ruby/object:Gem::Dependency
@@ -160,40 +144,20 @@ dependencies:
160
144
  - - "~>"
161
145
  - !ruby/object:Gem::Version
162
146
  version: '1.3'
163
- - !ruby/object:Gem::Dependency
164
- name: sxp
165
- requirement: !ruby/object:Gem::Requirement
166
- requirements:
167
- - - "~>"
168
- - !ruby/object:Gem::Version
169
- version: '1.2'
170
- - - "<"
171
- - !ruby/object:Gem::Version
172
- version: '1.3'
173
- type: :development
174
- prerelease: false
175
- version_requirements: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - "~>"
178
- - !ruby/object:Gem::Version
179
- version: '1.2'
180
- - - "<"
181
- - !ruby/object:Gem::Version
182
- version: '1.3'
183
147
  - !ruby/object:Gem::Dependency
184
148
  name: webmock
185
149
  requirement: !ruby/object:Gem::Requirement
186
150
  requirements:
187
151
  - - "~>"
188
152
  - !ruby/object:Gem::Version
189
- version: '3.18'
153
+ version: '3.19'
190
154
  type: :development
191
155
  prerelease: false
192
156
  version_requirements: !ruby/object:Gem::Requirement
193
157
  requirements:
194
158
  - - "~>"
195
159
  - !ruby/object:Gem::Version
196
- version: '3.18'
160
+ version: '3.19'
197
161
  - !ruby/object:Gem::Dependency
198
162
  name: yard
199
163
  requirement: !ruby/object:Gem::Requirement
@@ -331,14 +295,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
331
295
  requirements:
332
296
  - - ">="
333
297
  - !ruby/object:Gem::Version
334
- version: '2.6'
298
+ version: '3.0'
335
299
  required_rubygems_version: !ruby/object:Gem::Requirement
336
300
  requirements:
337
301
  - - ">="
338
302
  - !ruby/object:Gem::Version
339
303
  version: '0'
340
304
  requirements: []
341
- rubygems_version: 3.2.33
305
+ rubygems_version: 3.4.19
342
306
  signing_key:
343
307
  specification_version: 4
344
308
  summary: A Ruby library for working with Resource Description Framework (RDF) data.