rdf 3.1.8 → 3.1.13

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: d2becf1b8beb0505402d0b4d2a6f7795cca3657bc579ffac31f3b6037d34e550
4
- data.tar.gz: 14b57058dab38a7f7a23df435b83ce8e45c56c51ef718a107e1f1fedb6939a63
3
+ metadata.gz: 0a8a5a69a203cf83628099c927675bbc4abe122bd8568bb69fa06bae0cbcb94b
4
+ data.tar.gz: eba5377c635a6b05c25cd2b88107521c494d557dbfde6c0de5dbe52646ee1401
5
5
  SHA512:
6
- metadata.gz: 685797b5318d90aeba5755a88cc4aa0acc37b69bcc209d579d52910f0940cdf93d2b453cb3b60a0779cfadda80a2bc050afad2d18b276d973b21e6f1e3f79317
7
- data.tar.gz: a13b21146dfa64967464026e99d80bff9f6b472f4ef7d8079ee53a7e80d80f8577b4b7deee9b60643697354e6b42d093b4229d21978f93b5c65b4a2fa050270f
6
+ metadata.gz: 51af08617cb541333344b88a968c2d5699439baa7a4263154f7ccbdce06b635491b1cb93b9fb0e4dbca8711d9b71926ff22b60ab92f3f0cad9e205f86d1a3177
7
+ data.tar.gz: 8abc461f8937d46d3e75634764bc8bbaaf6f54ba07e39fa94c1400b62a59f20436ffd07c50a428aea7c2a01e292acbedb8f94bd5d07560e2523a00fef19174d1
data/README.md CHANGED
@@ -7,9 +7,29 @@ This is a pure-Ruby library for working with [Resource Description Framework
7
7
 
8
8
  [![Gem Version](https://badge.fury.io/rb/rdf.png)](https://badge.fury.io/rb/rdf)
9
9
  [![Build Status](https://github.com/ruby-rdf/rdf/workflows/CI/badge.svg?branch=develop)](https://github.com/ruby-rdf/rdf/actions?query=workflow%3ACI)
10
- [![Coverage Status](https://coveralls.io/repos/ruby-rdf/rdf/badge.svg)](https://coveralls.io/github/ruby-rdf/rdf)
10
+ [![Coverage Status](https://coveralls.io/repos/ruby-rdf/rdf/badge.svg?branch=develop)](https://coveralls.io/github/ruby-rdf/rdf?branch=develop)
11
11
  [![Gitter chat](https://badges.gitter.im/ruby-rdf/rdf.png)](https://gitter.im/ruby-rdf/rdf)
12
12
 
13
+ ## Table of contents
14
+
15
+ 1. [Features](#features)
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)
32
+
13
33
  ## Features
14
34
 
15
35
  * 100% pure Ruby with minimal dependencies and no bloat.
@@ -41,7 +61,7 @@ middleware.
41
61
 
42
62
  See {RDF::Util::File} for configuring other mechanisms for retrieving resources.
43
63
 
44
- ### Term caching and configuration.
64
+ ### Term caching and configuration
45
65
 
46
66
  RDF.rb uses a weak-reference cache for storing internalized versions of URIs and Nodes. This is particularly useful for Nodes as two nodes are equivalent only if they're the same node.
47
67
 
@@ -76,7 +96,7 @@ the 1.1 release of RDF.rb:
76
96
  * {RDF::Util::File.open\_file} now performs redirects and manages `base_uri` based on W3C recommendations:
77
97
  * `base_uri` is set to the original URI if a status 303 is provided, otherwise any other redirect will set `base_uri` to the redirected location.
78
98
  * `base_uri` is set to the content of the `Location` header if status is _success_.
79
- * Additionally, {RDF::Util::File.open\_file} sets the result encoding from `charset` if provided, defaulting to `UTF-8`. Other access methods include `last_modified` and `content_type`,
99
+ * Additionally, {RDF::Util::File.open\_file} sets the result encoding from `charset` if provided, defaulting to `UTF-8`. Other access methods include `last_modified` and `content_type`,
80
100
  * {RDF::StrictVocabulary} added with an easy way to keep vocabulary definitions up to date based on their OWL or RDFS definitions. Most vocabularies are now StrictVocabularies meaning that an attempt to resolve a particular term in that vocabulary will error if the term is not defined in the vocabulary.
81
101
  * New vocabulary definitions have been added for [ICal](http://www.w3.org/2002/12/cal/icaltzd#), [Media Annotations (MA)](http://www.w3.org/ns/ma-ont#), [Facebook OpenGraph (OG)](http://ogp.me/ns#), [PROV](http://www.w3.org/ns/prov#), [SKOS-XL (SKOSXL)](http://www.w3.org/2008/05/skos-xl#), [Data Vocabulary (V)](http://rdf.data-vocabulary.org/), [VCard](http://www.w3.org/2006/vcard/ns#), [VOID](http://rdfs.org/ns/void#http://rdfs.org/ns/void#), [Powder-S (WDRS)](http://www.w3.org/2007/05/powder-s#), and [XHV](http://www.w3.org/1999/xhtml/vocab#).
82
102
 
@@ -89,6 +109,7 @@ Notably, {RDF::Queryable#query} and {RDF::Query#execute} are now completely symm
89
109
  * [Getting started with RDF and SPARQL using 4store and RDF.rb](https://www.jenitennison.com/blog/node/152)
90
110
 
91
111
  ## Command Line
112
+
92
113
  When installed, RDF.rb includes a `rdf` shell script which acts as a wrapper to perform a number of different
93
114
  operations on RDF files using available readers and writers.
94
115
 
@@ -112,7 +133,7 @@ Different RDF gems will augment the `rdf` script with more capabilities, which m
112
133
  require 'rdf/ntriples'
113
134
  graph = RDF::Graph.new << [:hello, RDF::RDFS.label, "Hello, world!"]
114
135
  graph.dump(:ntriples)
115
-
136
+
116
137
  or
117
138
 
118
139
  RDF::Writer.open("hello.nt") { |writer| writer << graph }
@@ -121,7 +142,7 @@ or
121
142
 
122
143
  require 'rdf/ntriples'
123
144
  graph = RDF::Graph.load("https://ruby-rdf.github.com/rdf/etc/doap.nt")
124
-
145
+
125
146
  or
126
147
 
127
148
  RDF::Reader.open("https://ruby-rdf.github.com/rdf/etc/doap.nt") do |reader|
@@ -131,19 +152,20 @@ or
131
152
  end
132
153
 
133
154
  ### Reading RDF data in other formats
155
+
134
156
  {RDF::Reader.open} and {RDF::Repository.load} use a number of mechanisms to determine the appropriate reader
135
157
  to use when loading a file. The specific format to use can be forced using, e.g. `format: :ntriples`
136
158
  option where the specific format symbol is determined by the available readers. Both also use
137
159
  MimeType or file extension, where available.
138
160
 
139
161
  require 'rdf/nquads'
140
-
162
+
141
163
  graph = RDF::Graph.load("https://ruby-rdf.github.com/rdf/etc/doap.nq", format: :nquads)
142
164
 
143
165
  A specific sub-type of Reader can also be invoked directly:
144
166
 
145
167
  require 'rdf/nquads'
146
-
168
+
147
169
  RDF::NQuads::Reader.open("https://ruby-rdf.github.com/rdf/etc/doap.nq") do |reader|
148
170
  reader.each_statement do |statement|
149
171
  puts statement.inspect
@@ -157,6 +179,7 @@ be detected from filename or other options, or that more than one format is iden
157
179
  match will be used to read the input.
158
180
 
159
181
  ### Writing RDF data using other formats
182
+
160
183
  {RDF::Writer.open}, {RDF::Enumerable#dump}, {RDF::Writer.dump} take similar options to {RDF::Reader.open} to determine the
161
184
  appropriate writer to use.
162
185
 
@@ -176,6 +199,7 @@ A specific sub-type of Writer can also be invoked directly:
176
199
  File.open("hello.nq", "w") {|f| f << repo.dump(:nquads)}
177
200
 
178
201
  ## Reader/Writer convenience methods
202
+
179
203
  {RDF::Enumerable} implements `to_{format}` for each available instance of {RDF::Reader}.
180
204
  For example, if `rdf/turtle` is loaded, this allows the following:
181
205
 
@@ -195,7 +219,7 @@ Note that no prefixes are loaded automatically, however they can be provided as
195
219
  ### Querying RDF data using basic graph patterns (BGPs)
196
220
 
197
221
  require 'rdf/ntriples'
198
-
222
+
199
223
  graph = RDF::Graph.load("https://ruby-rdf.github.com/rdf/etc/doap.nt")
200
224
  query = RDF::Query.new({
201
225
  person: {
@@ -204,7 +228,7 @@ Note that no prefixes are loaded automatically, however they can be provided as
204
228
  FOAF.mbox => :email,
205
229
  }
206
230
  }, **{})
207
-
231
+
208
232
  query.execute(graph) do |solution|
209
233
  puts "name=#{solution.name} email=#{solution.email}"
210
234
  end
@@ -451,7 +475,6 @@ This repository uses [Git Flow](https://github.com/nvie/gitflow) to mange develo
451
475
  which you will be asked to agree to on the first commit to a repo within the organization.
452
476
  Note that the agreement applies to all repos in the [Ruby RDF](https://github.com/ruby-rdf/) organization.
453
477
 
454
-
455
478
  ## License
456
479
 
457
480
  This is free and unencumbered public domain software. For more information,
@@ -492,4 +515,4 @@ see <https://unlicense.org/> or the accompanying {file:UNLICENSE} file.
492
515
  [JSON::LD]: https://ruby-rdf.github.com/json-ld
493
516
  [RestClient]: https://rubygems.org/gems/rest-client
494
517
  [RestClient Components]: https://rubygems.org/gems/rest-client-components
495
- [Rack::Cache]: https://rtomayko.github.io/rack-cache/
518
+ [Rack::Cache]: https://rtomayko.github.io/rack-cache/
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.1.8
1
+ 3.1.13
data/lib/rdf/cli.rb CHANGED
@@ -8,9 +8,26 @@ begin
8
8
  require 'linkeddata'
9
9
  rescue LoadError
10
10
  # Silently load without linkeddata, but try some others
11
- %w(microdata n3 rdfa rdfxml reasoner tabular trig trix turtle vocab xsd json/ld ld/patch).each do |ser|
11
+ %w(
12
+ json/ld
13
+ ld/patch
14
+ rdf/microdata
15
+ rdf/n3
16
+ rdf/ordered_repo
17
+ rdf/rdfa
18
+ rdf/rdfxml
19
+ rdf/reasoner
20
+ rdf/tabular
21
+ rdf/trig
22
+ rdf/trix
23
+ rdf/turtle
24
+ rdf/vocab
25
+ rdf/xsd
26
+ shacl
27
+ shex
28
+ ).each do |ser|
12
29
  begin
13
- require ser.include?('/') ? ser : "rdf/#{ser}"
30
+ require ser
14
31
  rescue LoadError
15
32
  end
16
33
  end
@@ -239,8 +256,7 @@ module RDF
239
256
  lambda: ->(argv, opts) do
240
257
  writer_class = RDF::Writer.for(opts[:output_format]) || RDF::NTriples::Writer
241
258
  out = opts[:output]
242
- opts = opts.merge(prefixes: {})
243
- writer_opts = opts.merge(standard_prefixes: true)
259
+ writer_opts = {prefixes: {}, standard_prefixes: true}.merge(opts)
244
260
  writer_class.new(out, **writer_opts) do |writer|
245
261
  writer << repository
246
262
  end
@@ -316,7 +332,7 @@ module RDF
316
332
 
317
333
  # Add format-specific reader options
318
334
  reader.options.each do |cli_opt|
319
- next if options.options.has_key?(cli_opt.symbol)
335
+ next if options.options.key?(cli_opt.symbol)
320
336
  on_args = cli_opt.on || []
321
337
  on_args << cli_opt.description if cli_opt.description
322
338
  options.on(*on_args) do |opt_arg|
@@ -338,7 +354,7 @@ module RDF
338
354
 
339
355
  # Add format-specific writer options
340
356
  writer.options.each do |cli_opt|
341
- next if options.options.has_key?(cli_opt.symbol)
357
+ next if options.options.key?(cli_opt.symbol)
342
358
  on_args = cli_opt.on || []
343
359
  on_args << cli_opt.description if cli_opt.description
344
360
  options.on(*on_args) do |opt_arg|
@@ -402,7 +418,7 @@ module RDF
402
418
  end
403
419
 
404
420
  cli_opts.each do |cli_opt|
405
- next if opts.has_key?(cli_opt.symbol)
421
+ next if opts.key?(cli_opt.symbol)
406
422
  on_args = cli_opt.on || []
407
423
  on_args << cli_opt.description if cli_opt.description
408
424
  options.on(*on_args) do |arg|
@@ -457,7 +473,7 @@ module RDF
457
473
  # @param [Array<String>] args
458
474
  # @param [IO] output
459
475
  # @param [OptionParser] option_parser
460
- # @param [Hash{Symbol => Hash{Symbol => Array[String]}}] messages used for confeying non primary-output which is structured.
476
+ # @param [Hash{Symbol => Hash{Symbol => Array[String]}}] messages used for conveying non primary-output which is structured.
461
477
  # @param [Hash{Symbol => Object}] options
462
478
  # @return [Boolean]
463
479
  def self.exec(args, output: $stdout, option_parser: nil, messages: {}, **options)
@@ -506,10 +522,12 @@ module RDF
506
522
  options[:output_format] = options[:output_format].to_sym if options[:output_format]
507
523
 
508
524
  # Allow repository to be set via option.
509
- @repository = options[:repository] ||
510
- (options[:ordered] ?
511
- [].extend(RDF::Enumerable, RDF::Queryable) :
512
- RDF::Repository.new)
525
+ # If RDF::OrderedRepo is present, use it if the `ordered` option is specified, otherwise extend an Array.
526
+ @repository = options[:repository] || case
527
+ when RDF.const_defined?(:OrderedRepo) then RDF::OrderedRepo.new
528
+ when options[:ordered] then [].extend(RDF::Enumerable, RDF::Queryable)
529
+ else RDF::Repository.new
530
+ end
513
531
 
514
532
  # Parse input files if any command requires it
515
533
  if cmds.any? {|c| COMMANDS[c.to_sym][:parse]}
@@ -517,6 +535,8 @@ module RDF
517
535
  count = 0
518
536
  self.parse(args, **options) do |reader|
519
537
  reader.each_statement {|st| @repository << st}
538
+ # Remember prefixes from reading
539
+ options[:prefixes] ||= reader.prefixes
520
540
  end
521
541
  secs = Time.new - start
522
542
  options[:logger].info "Parsed #{repository.count} statements with #{@readers.join(', ')} in #{secs} seconds @ #{count/secs} statements/second."
@@ -12,15 +12,15 @@ module RDF
12
12
  # enumerable.count
13
13
  #
14
14
  # @example Checking whether a specific statement exists
15
- # enumerable.has_statement?(RDF::Statement(subject, predicate, object))
16
- # enumerable.has_triple?([subject, predicate, object])
17
- # enumerable.has_quad?([subject, predicate, object, graph_name])
15
+ # enumerable.statement?(RDF::Statement(subject, predicate, object))
16
+ # enumerable.triple?([subject, predicate, object])
17
+ # enumerable.quad?([subject, predicate, object, graph_name])
18
18
  #
19
19
  # @example Checking whether a specific value exists
20
- # enumerable.has_subject?(RDF::URI("https://rubygems.org/gems/rdf"))
21
- # enumerable.has_predicate?(RDF::RDFS.label)
22
- # enumerable.has_object?(RDF::Literal("A Ruby library for working with Resource Description Framework (RDF) data.", language: :en))
23
- # enumerable.has_graph?(RDF::URI("http://ar.to/#self"))
20
+ # enumerable.subject?(RDF::URI("https://rubygems.org/gems/rdf"))
21
+ # enumerable.predicate?(RDF::RDFS.label)
22
+ # enumerable.object?(RDF::Literal("A Ruby library for working with Resource Description Framework (RDF) data.", language: :en))
23
+ # enumerable.graph?(RDF::URI("http://ar.to/#self"))
24
24
  #
25
25
  # @example Enumerating all statements
26
26
  # enumerable.each_statement do |statement|
@@ -127,14 +127,25 @@ module RDF
127
127
  end
128
128
 
129
129
  ##
130
- # Returns `true` if `self` contains the given RDF statement.
130
+ # @overload statement?
131
+ # Returns `false` indicating this is not an RDF::Statemenet.
132
+ # @return [Boolean]
133
+ # @see RDF::Value#statement?
134
+ # @overload statement?(statement)
135
+ # Returns `true` if `self` contains the given RDF statement.
131
136
  #
132
- # @param [RDF::Statement] statement
133
- # @return [Boolean]
134
- def has_statement?(statement)
135
- !enum_statement.find { |s| s.eql?(statement) }.nil?
137
+ # @param [RDF::Statement] statement
138
+ # @return [Boolean]
139
+ def statement?(*args)
140
+ case args.length
141
+ when 0 then false
142
+ when 1
143
+ args.first && !enum_statement.find { |s| s.eql?(args.first) }.nil?
144
+ else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
145
+ end
136
146
  end
137
- alias_method :include?, :has_statement?
147
+ alias_method :has_statement?, :statement?
148
+ alias_method :include?, :statement?
138
149
 
139
150
  ##
140
151
  # Iterates the given block for each RDF statement.
@@ -194,9 +205,10 @@ module RDF
194
205
  #
195
206
  # @param [Array(RDF::Resource, RDF::URI, RDF::Term)] triple
196
207
  # @return [Boolean]
197
- def has_triple?(triple)
208
+ def triple?(triple)
198
209
  triples.include?(triple)
199
210
  end
211
+ alias_method :has_triple?, :triple?
200
212
 
201
213
  ##
202
214
  # Iterates the given block for each RDF triple.
@@ -255,9 +267,10 @@ module RDF
255
267
  #
256
268
  # @param [Array(RDF::Resource, RDF::URI, RDF::Term, RDF::Resource)] quad
257
269
  # @return [Boolean]
258
- def has_quad?(quad)
270
+ def quad?(quad)
259
271
  quads.include?(quad)
260
272
  end
273
+ alias_method :has_quad?, :quad?
261
274
 
262
275
  ##
263
276
  # Iterates the given block for each RDF quad.
@@ -321,9 +334,10 @@ module RDF
321
334
  #
322
335
  # @param [RDF::Resource] value
323
336
  # @return [Boolean]
324
- def has_subject?(value)
337
+ def subject?(value)
325
338
  enum_subject.include?(value)
326
339
  end
340
+ alias_method :has_subject?, :subject?
327
341
 
328
342
  ##
329
343
  # Iterates the given block for each unique RDF subject term.
@@ -386,9 +400,10 @@ module RDF
386
400
  #
387
401
  # @param [RDF::URI] value
388
402
  # @return [Boolean]
389
- def has_predicate?(value)
403
+ def predicate?(value)
390
404
  enum_predicate.include?(value)
391
405
  end
406
+ alias_method :has_predicate?, :predicate?
392
407
 
393
408
  ##
394
409
  # Iterates the given block for each unique RDF predicate term.
@@ -451,9 +466,10 @@ module RDF
451
466
  #
452
467
  # @param [RDF::Term] value
453
468
  # @return [Boolean]
454
- def has_object?(value)
469
+ def object?(value)
455
470
  enum_object.include?(value)
456
471
  end
472
+ alias_method :has_object?, :object?
457
473
 
458
474
  ##
459
475
  # Iterates the given block for each unique RDF object term.
@@ -511,7 +527,7 @@ module RDF
511
527
  def terms(unique: true)
512
528
  unless unique
513
529
  enum_statement.
514
- map(&:to_quad).
530
+ map(&:terms).
515
531
  flatten.
516
532
  compact
517
533
  else
@@ -520,14 +536,24 @@ module RDF
520
536
  end
521
537
 
522
538
  ##
523
- # Returns `true` if `self` contains the given RDF subject term.
539
+ # @overload term?
540
+ # Returns `false` indicating this is not an RDF::Statemenet.
541
+ # @see RDF::Value#statement?
542
+ # @return [Boolean]
543
+ # @overload term?(value)
544
+ # Returns `true` if `self` contains the given RDF subject term.
524
545
  #
525
- # @param [RDF::Resource] value
526
- # @return [Boolean]
527
- # @since 2.0
528
- def has_term?(value)
529
- enum_term.include?(value)
546
+ # @param [RDF::Resource] value
547
+ # @return [Boolean]
548
+ # @since 2.0
549
+ def term?(*args)
550
+ case args.length
551
+ when 0 then super
552
+ when 1 then args.first && enum_term.include?(args.first)
553
+ else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
554
+ end
530
555
  end
556
+ alias_method :has_term?, :term?
531
557
 
532
558
  ##
533
559
  # Iterates the given block for each unique RDF term (subject, predicate, object, or graph_name).
@@ -551,8 +577,8 @@ module RDF
551
577
  if block_given?
552
578
  values = {}
553
579
  each_statement do |statement|
554
- statement.to_quad.each do |value|
555
- unless value.nil? || values.include?(value.hash)
580
+ statement.terms.each do |value|
581
+ unless values.include?(value.hash)
556
582
  values[value.hash] = true
557
583
  yield value
558
584
  end
@@ -595,9 +621,10 @@ module RDF
595
621
  # @param [RDF::Resource, false] graph_name
596
622
  # Use value `false` to query for the default graph_name
597
623
  # @return [Boolean]
598
- def has_graph?(graph_name)
624
+ def graph?(graph_name)
599
625
  enum_statement.any? {|s| s.graph_name == graph_name}
600
626
  end
627
+ alias_method :has_graph?, :graph?
601
628
 
602
629
  ##
603
630
  # Limits statements to be from a specific graph.
@@ -122,7 +122,7 @@ module RDF
122
122
 
123
123
  statements.each do |statement|
124
124
  if (statement = Statement.from(statement))
125
- if statement.has_object?
125
+ if statement.object?
126
126
  delete_insert([[statement.subject, statement.predicate, nil]], [statement])
127
127
  else
128
128
  delete([statement.subject, statement.predicate, nil])
@@ -104,7 +104,7 @@ module RDF
104
104
  # @private
105
105
  # @see RDF::Enumerable#supports?
106
106
  def supports?(feature)
107
- return true if [:graph_name, :rdfstar].include?(feature)
107
+ return true if %i(graph_name rdfstar).include?(feature)
108
108
  super
109
109
  end
110
110