active-triples 0.10.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/.gitlab-ci.yml +47 -0
  3. data/.travis.yml +9 -7
  4. data/CHANGES.md +32 -13
  5. data/Gemfile +8 -1
  6. data/README.md +75 -42
  7. data/active-triples.gemspec +15 -14
  8. data/lib/active_triples/configurable.rb +6 -1
  9. data/lib/active_triples/configuration.rb +22 -11
  10. data/lib/active_triples/extension_strategy.rb +1 -1
  11. data/lib/active_triples/list.rb +1 -6
  12. data/lib/active_triples/nested_attributes.rb +10 -7
  13. data/lib/active_triples/node_config.rb +64 -8
  14. data/lib/active_triples/persistable.rb +12 -9
  15. data/lib/active_triples/persistence_strategies/parent_strategy.rb +57 -43
  16. data/lib/active_triples/persistence_strategies/persistence_strategy.rb +14 -1
  17. data/lib/active_triples/properties.rb +27 -12
  18. data/lib/active_triples/property.rb +36 -11
  19. data/lib/active_triples/property_builder.rb +4 -4
  20. data/lib/active_triples/rdf_source.rb +218 -188
  21. data/lib/active_triples/relation.rb +350 -180
  22. data/lib/active_triples/schema.rb +20 -1
  23. data/lib/active_triples/util/buffered_transaction.rb +126 -0
  24. data/lib/active_triples/util/extended_bounded_description.rb +75 -0
  25. data/lib/active_triples/version.rb +1 -1
  26. data/spec/active_triples/configurable_spec.rb +35 -7
  27. data/spec/active_triples/extension_strategy_spec.rb +12 -1
  28. data/spec/active_triples/identifiable_spec.rb +19 -6
  29. data/spec/active_triples/list_spec.rb +15 -7
  30. data/spec/active_triples/nested_attributes_spec.rb +12 -10
  31. data/spec/active_triples/node_config_spec.rb +54 -0
  32. data/spec/active_triples/persistable_spec.rb +0 -4
  33. data/spec/active_triples/persistence_strategies/parent_strategy_spec.rb +80 -26
  34. data/spec/active_triples/property_spec.rb +10 -0
  35. data/spec/active_triples/rdf_source_spec.rb +198 -177
  36. data/spec/active_triples/relation_spec.rb +628 -137
  37. data/spec/active_triples/resource_spec.rb +123 -23
  38. data/spec/active_triples/schema_spec.rb +6 -0
  39. data/spec/active_triples/util/buffered_transaction_spec.rb +187 -0
  40. data/spec/active_triples/util/extended_bounded_description_spec.rb +98 -0
  41. data/spec/integration/reciprocal_properties_spec.rb +10 -10
  42. data/spec/spec_helper.rb +2 -2
  43. data/spec/support/matchers.rb +13 -1
  44. metadata +90 -49
  45. data/spec/pragmatic_context_spec.rb +0 -57
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 81641abcbc05748cde5355e096ae5707b933247d
4
- data.tar.gz: 8700dd892403ce3907494e0ed4ab88375b914ccc
2
+ SHA256:
3
+ metadata.gz: b0ff972e1b4c29224d95c3b805194625adb62bd2e0b2f8e6bc10dce62fb048d0
4
+ data.tar.gz: b53c8cc0662587141709428bd6bb4aa522ddd24387d1b10807202c23a1e66554
5
5
  SHA512:
6
- metadata.gz: 210be0186ab5dc6e88714b1be1b789662f83246333289cfd3408ae831ad17b3032a037ba13b1068453fdca0eddb110d73fe61d4babf0fb1e76480c4d7670ea2c
7
- data.tar.gz: 7ed12d5c4348d46c6e3f70874e3067292e7ddda3edd63be388ab94b0a9c2abf6ce2e1a1c211dfbafdb598bd3e4a9a7c00aed109020d5a174186c685acbef3048
6
+ metadata.gz: 1cb53a7845d93423d84bdac4fa82b6470f28867ee5cf8c4bc04f8ba5a3046cc3b6c6f34f8ef2a04aa211c880a7c55700e68cbfc3a73729382a5e4409933b4dd6
7
+ data.tar.gz: 279c0e2236bf9ad69aefc7e8e3e41e697431b8b103e548cc75b0985eeac1237e598f5fe89da71f9e4d86bad92bec84d4ab94b51c1a0798eb149021b0068d350f
@@ -0,0 +1,47 @@
1
+ .rspec:
2
+ script:
3
+ - bundle exec rspec
4
+
5
+ .jruby:
6
+ extends: .rspec
7
+ before_script:
8
+ - apk add git
9
+ - ruby -v
10
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
11
+
12
+ before_script:
13
+ - ruby -v
14
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
15
+
16
+ stages:
17
+ - test
18
+
19
+ ruby-2-4:
20
+ image: ruby:2.4
21
+ extends: .rspec
22
+ stage: test
23
+
24
+ ruby-2-5:
25
+ image: ruby:2.4
26
+ extends: .rspec
27
+ stage: test
28
+
29
+ ruby-2-6:
30
+ image: ruby:2.5
31
+ extends: .rspec
32
+ stage: test
33
+
34
+ ruby-2-7:
35
+ image: ruby:2.6
36
+ extends: .rspec
37
+ stage: test
38
+
39
+ ruby-latest:
40
+ image: ruby:latest
41
+ extends: .rspec
42
+ stage: test
43
+
44
+ jruby-9:
45
+ image: jruby:9-alpine
46
+ extends: .jruby
47
+ stage: test
@@ -4,12 +4,14 @@ script: "bundle exec rspec spec"
4
4
  sudo: false
5
5
  cache: bundler
6
6
  rvm:
7
- - 2.1
8
- - 2.2.4
9
- - 2.3.1
10
- - jruby-9.0.4.0
11
- - rbx
7
+ - 2.2
8
+ - 2.3
9
+ - 2.4
10
+ - ruby-head
11
+ - jruby-9.1.9.0
12
+ - jruby-head
12
13
  matrix:
13
14
  allow_failures:
14
- - rvm: jruby-9.0.4.0
15
- - rvm: rbx
15
+ - rvm: jruby-9.1.9.0
16
+ - rvm: jruby-head
17
+ - rvm: ruby-head
data/CHANGES.md CHANGED
@@ -1,16 +1,35 @@
1
- 0.10.2
1
+ 1.1.1
2
2
  ----
3
- - Backports several performance optimizations from the upcoming 0.11.x
4
- release series.
5
- - Uses `#query` to find unregistered predicates, avoiding iterating through
6
- all statements.
7
- - Uses a transaction to batch commit changes when calling `#set_subject!`
8
- - Removes the `deprecation` gem as a runtime dependency
3
+ - Major performance improvements due to a minor change in how
4
+ properties are resolved.
9
5
 
10
- 0.10.1
6
+ 1.1.0
11
7
  ----
12
- - Remove dependency on the `linkeddata` metagem
13
-
8
+ - Add support for RDF.rb 3.0
9
+
10
+ 1.0.0
11
+ ----
12
+ - Finalize 1.0.0 APIs
13
+
14
+ 0.11.0
15
+ ----
16
+ - Reworks ParentStrategy to use an Transaction over a well defined
17
+ "extended bounded description".
18
+ - Converts Relation to an Enumerable for more efficient access to
19
+ property values.
20
+ - Cleans up .Relation equality and added `#|` & `#&` for Set style
21
+ comparison.
22
+ - Deprecates `Relation#first_or_create`.
23
+ - Removes dependency on the `linkeddata` gem. Users should require
24
+ individual RDF libraries as needed.
25
+ - Adds inheritance of configured types when subclassing an
26
+ `RDFSource`.
27
+ - Uses `URI#intern` to avoid repeated allocations of common URIs.
28
+ - Changes handling of language and datatyped Literals in
29
+ `Relation#each` & `#to_a`;
30
+ - now returns `RDF::Literal` for lanugage tagged strings and
31
+ for unknown datatypes.
32
+
14
33
  0.10.0
15
34
  ----
16
35
  - Fix Identifiable for ActiveFedora [Trey Pendragon]
@@ -104,12 +123,12 @@
104
123
 
105
124
  0.8.0
106
125
  -----
107
- - Adds RDF.rb interfaces to `RDFSource`, improving interoperability
126
+ - Adds RDF.rb interfaces to `RDFSource`, improving interoperability
108
127
  with other `ruby-rdf` packages.
109
- - Introduces a defined `Persistable` interface and
128
+ - Introduces a defined `Persistable` interface and
110
129
  `PersistenceStrategies`.
111
130
  - Changes `Relation`'s delete methods to remove all values, instead of
112
- trying to maintain a predicate -> class pair on the property
131
+ trying to maintain a predicate -> class pair on the property
113
132
  definitions in some cases. The previous functionality was unclear and
114
133
  unreliable.
115
134
  - Adds a `Schema` concept, for defining property definitions that are
data/Gemfile CHANGED
@@ -2,5 +2,12 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'activesupport', '< 5.0.0' if RUBY_VERSION =~ /2\.1\..*/
6
5
  gem 'pry-byebug' unless ENV["CI"]
6
+
7
+ group :test do
8
+ gem 'rdf-spec', github: 'ruby-rdf/rdf-spec', branch: 'develop'
9
+ gem 'simplecov', require: false
10
+ end
11
+
12
+ Encoding.default_external = Encoding::UTF_8
13
+ Encoding.default_internal = Encoding::UTF_8
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  Description
2
2
  -----------
3
3
 
4
- [![Build Status](https://travis-ci.org/ActiveTriples/ActiveTriples.png?branch=develop)](https://travis-ci.org/ActiveTriples/ActiveTriples)
5
- [![Coverage Status](https://coveralls.io/repos/ActiveTriples/ActiveTriples/badge.svg?branch=develop)](https://coveralls.io/r/ActiveTriples/ActiveTriples?branch=develop)
4
+ [![Pipeline Status](https://gitlab.com/no_reply/ActiveTriples/badges/develop/pipeline.svg)](https://gitlab.com/no_reply/ActiveTriples/commits/develop)
5
+ [![Coverage Report](https://gitlab.com/no_reply/ActiveTriples/badges/develop/coverage.svg)](https://gitlab.com/no_reply/ActiveTriples/commits/develop)
6
6
  [![Gem Version](https://badge.fury.io/rb/active-triples.svg)](http://badge.fury.io/rb/active-triples)
7
7
 
8
8
  An ActiveModel-like interface for RDF data. Models graphs as RDFSources with property/attribute configuration, accessors, and other methods to support Linked Data in a Ruby/Rails enviornment. See [RDF Concepts and Abstract Syntax](http://www.w3.org/TR/2014/REC-rdf11-concepts-20140225/#change-over-time) for an informal definition of an RDF Source.
@@ -23,36 +23,47 @@ The core module of `ActiveTriples` is `ActiveTriples::RDFSource`. You can use th
23
23
 
24
24
 
25
25
  ```ruby
26
+ require 'rdf/vocab'
27
+
26
28
  class Thing
27
29
  include ActiveTriples::RDFSource
28
- configure :type => RDF::OWL.Thing, :base_uri => 'http://example.org/things#'
29
- property :title, :predicate => RDF::DC.title
30
- property :description, :predicate => RDF::DC.description
30
+
31
+ configure type: RDF::OWL.Thing, base_uri: 'http://example.org/things#'
32
+
33
+ property :title, predicate: RDF::Vocab::DC.title
34
+ property :description, predicate: RDF::Vocab::DC.description
31
35
  end
32
36
 
33
- obj = Thing.new('123')
34
- obj.title = 'Resource'
37
+ obj = Thing.new('123')
38
+ obj.title = 'Resource'
35
39
  obj.description = 'A resource.'
40
+
36
41
  obj.dump :ntriples # => "<http://example.org/things#123> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .\n<http://example.org/things#123> <http://purl.org/dc/terms/title> \"Resource\" .\n<http://example.org/things#123> <http://purl.org/dc/terms/description> \"A resource.\" .\n"
37
42
  ```
43
+
38
44
  URI and bnode values are built out as generic Resources when accessed. A more specific model class can be configured on individual properties.
39
45
 
40
46
  ```ruby
41
- Thing.property :creator, :predicate => RDF::DC.creator, :class_name => 'Person'
47
+ Thing.property :creator, predicate: RDF::Vocab::DC.creator, class_name: 'Person'
42
48
 
43
49
  class Person
44
50
  include ActiveTriples::RDFSource
45
- configure :type => RDF::FOAF.Person, :base_uri => 'http://example.org/people#'
46
- property :name, :predicate => RDF::FOAF.name
51
+
52
+ configure type: RDF::Vocab::FOAF.Person,
53
+ base_uri: 'http://example.org/people#'
54
+
55
+ property :name, predicate: RDF::Vocab::FOAF.name
47
56
  end
48
57
 
49
- obj_2 = Thing.new('2')
58
+ obj_2 = Thing.new('2')
50
59
  obj_2.creator = Person.new
60
+
51
61
  obj_2.creator
52
62
  # => [#<Person:0x3fbe84ac9234(default)>]
53
63
 
54
64
  obj_2.creator.first.name = 'Herman Melville'
55
- obj_2.dump :ntriples # => "<http://example.org/things#2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .\n<http://example.org/things#2> <http://purl.org/dc/terms/creator> _:g70263220218800 .\n_:g70263220218800 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .\n_:g70263220218800 <http://xmlns.com/foaf/0.1/name> \"Herman Melville\" .\n"
65
+
66
+ obj_2.dump :ntriples # => "_:g47361345336040 <http://xmlns.com/foaf/0.1/name> \"Herman Melville\" .\n_:g47361345336040 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .\n<http://example.org/things#2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .\n<http://example.org/things#2> <http://purl.org/dc/terms/creator> _:g47361345336040 .\n"
56
67
  ```
57
68
 
58
69
  Open Model
@@ -63,23 +74,33 @@ An RDFSource lets you handle data as a graph, independent of whether it is defin
63
74
  ```ruby
64
75
  related = Thing.new
65
76
 
66
- related << RDF::Statement(related, RDF::DC.relation, obj)
67
- related << RDF::Statement(related, RDF::DC.subject, 'ActiveTriples')
77
+ related << RDF::Statement(related, RDF::Vocab::DC.relation, obj)
78
+ related << RDF::Statement(related, RDF::Vocab::DC.subject, 'ActiveTriples')
68
79
 
69
- related.query(:subject => related, :predicate => RDF::DC.relation).each_statement {|s,p,o| puts o}
70
- # => http://example.org/things#123
71
- related.query(:subject => related, :predicate => RDF::DC.subject).each_statement {|s,p,o| puts o}
80
+ related.query(subject: related,
81
+ predicate: RDF::Vocab::DC.relation).each_statement do |s,p,o|
82
+ puts o
83
+ end
72
84
  # => http://example.org/things#123
85
+
86
+ related.query(subject: related,
87
+ predicate: RDF::Vocab::DC.subject).each_statement do |s,p,o|
88
+ puts o
89
+ end
90
+ # => 'ActiveTriples'
73
91
  ```
74
92
 
75
93
  Any operation you can run against an RDF::Graph works with RDFSources, too. Or you can use generic setters and getters with URI predicates:
76
94
 
77
95
  ```ruby
78
- related.set_value(RDF::DC.relation, obj)
79
- related.set_value(RDF::DC.subject, 'ActiveTriples')
96
+ related.set_value(RDF::Vocab::DC.relation, obj)
97
+ related.set_value(RDF::Vocab::DC.subject, 'ActiveTriples')
98
+
99
+ related.get_values(RDF::Vocab::DC.relation)
100
+ # => [#<Thing:0x3f949c6a2294(default)>]
80
101
 
81
- related.get_values(RDF::DC.relation) # => [#<Thing:0x3f949c6a2294(default)>]
82
- related.get_values(RDF::DC.subject) # => ["ActiveTriples"]
102
+ related.get_values(RDF::Vocab::DC.subject)
103
+ # => ["ActiveTriples"]
83
104
  ```
84
105
 
85
106
  Some convienience methods provide support for handling data from web sources:
@@ -89,10 +110,13 @@ Some convienience methods provide support for handling data from web sources:
89
110
  ```ruby
90
111
  require 'linkeddata' # to support various serializations
91
112
 
92
- osu = ActiveTriples::Resource.new 'http://dbpedia.org/resource/Oregon_State_University'
113
+ uri = 'http://dbpedia.org/resource/Oregon_State_University'
114
+
115
+ osu = ActiveTriples::Resource.new uri
93
116
  osu.fetch
94
117
 
95
- osu.rdf_label # => ["Oregon State University", "Oregon State University", "Université d'État de l'Oregon", "Oregon State University", "Oregon State University", "オレゴン州立大学", "Universidad Estatal de Oregón", "Oregon State University", "俄勒岡州立大學", "Universidade do Estado do Oregon"]
118
+ osu.rdf_label
119
+ # => ["Oregon State University", "Oregon State University", "Université d'État de l'Oregon", "Oregon State University", "Oregon State University", "オレゴン州立大学", "Universidad Estatal de Oregón", "Oregon State University", "俄勒岡州立大學", "Universidade do Estado do Oregon"]
96
120
  ```
97
121
 
98
122
  Typed Data
@@ -101,9 +125,9 @@ Typed Data
101
125
  Typed literals are handled natively through Ruby types and [RDF::Literal](https://github.com/ruby-rdf/rdf/tree/develop/lib/rdf/model/literal). There is no need to register a specific type for a property, simply pass the setter the appropriate typed data. See the examples in the RDF::Literal documentation for futher information about supported datatypes.
102
126
 
103
127
  ```ruby
104
- Thing.property :date, :predicate => RDF::DC.date
128
+ Thing.property :date, predicate: RDF::Vocab::DC.date
105
129
 
106
- my_thing = Thing.new
130
+ my_thing = Thing.new
107
131
  my_thing.date = Date.today
108
132
 
109
133
  puts my_thing.dump :ntriples
@@ -143,38 +167,47 @@ Resources can persist to various databases and triplestores though integration w
143
167
  # RDF::Repository support persistence to (e.g.) triplestores & NoSQL
144
168
  # databases.
145
169
  ActiveTriples::Repositories.add_repository :default, RDF::Repository.new
146
- ActiveTriples::Repositories.add_repository :people, RDF::Repository.new
170
+ ActiveTriples::Repositories.add_repository :people, RDF::Repository.new
147
171
 
148
172
  class Person
149
173
  include ActiveTriples::RDFSource
150
- configure :type => RDF::FOAF.Person, :base_uri => 'http://example.org/people#', :repository => :people
151
- property :name, :predicate => RDF::FOAF.name
174
+
175
+ configure type: RDF::Vocab::FOAF.Person,
176
+ base_uri: 'http://example.org/people#',
177
+ repository: :people
178
+ property :name, predicate: RDF::Vocab::FOAF.name
152
179
  end
153
180
 
154
181
  class Thing
155
182
  include ActiveTriples::RDFSource
156
183
 
157
- configure :type => RDF::OWL.Thing, :base_uri => 'http://example.org/things#', :repository => :default
158
- property :title, :predicate => RDF::DC.title
159
- property :description, :predicate => RDF::DC.description
160
- property :creator, :predicate => RDF::DC.creator, :class_name => 'Person'
184
+ configure type: RDF::OWL.Thing,
185
+ base_uri: 'http://example.org/things#',
186
+ repository: :default
187
+
188
+ property :title, predicate: RDF::Vocab::DC.title
189
+ property :description, predicate: RDF::Vocab::DC.description
190
+ property :creator, predicate: RDF::Vocab::DC.creator, class_name: 'Person'
161
191
  end
162
192
 
163
- t = Thing.new('1')
164
- t.title = 'A Thing'
193
+ t = Thing.new('1')
194
+ t.title = 'A Thing'
165
195
  t.creator = Person.new('1')
196
+
166
197
  t.persisted? # => false
167
- t.creator.first.name = 'Tove'
168
- t.persist!
169
198
 
170
199
  ActiveTriples::Repositories.repositories[:default].dump :ntriples
171
- # => "<http://example.org/things#1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .\n<http://example.org/things#1> <http://purl.org/dc/terms/title> \"A Thing\" .\n<http://example.org/things#1> <http://purl.org/dc/terms/creator> <http://example.org/people#1> .\n"
200
+ # => ""
172
201
 
173
- t.creator.first.persisted? # => false
174
- t.creator.first.persist!
202
+ t.creator.first.name = 'Tove'
203
+ t.persist!
175
204
 
176
- ActiveTriples::Repositories.repositories[:people].dump :ntriples
177
- # => "<http://example.org/people#1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .\n<http://example.org/people#1> <http://xmlns.com/foaf/0.1/name> \"Tove\" .\n"
205
+ puts ActiveTriples::Repositories.repositories[:default].dump :ntriples
206
+ # <http://example.org/things#1> <http://purl.org/dc/terms/title> "A Thing" .
207
+ # <http://example.org/things#1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Thing> .
208
+ # <http://example.org/things#1> <http://purl.org/dc/terms/creator> <http://example.org/people#1> .
209
+ # <http://example.org/people#1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .
210
+ # <http://example.org/people#1> <http://xmlns.com/foaf/0.1/name> "Tove" .
178
211
  ```
179
212
 
180
213
  Contributing
@@ -182,7 +215,7 @@ Contributing
182
215
 
183
216
  Please observe the following guidelines:
184
217
 
185
- - Do your work in a feature branch based on ```master``` and rebase before submitting a pull request.
218
+ - Do your work in a feature branch based on ```develop``` and rebase before submitting a pull request.
186
219
  - Write tests for your contributions.
187
220
  - Document every method you add using YARD annotations. (_Note: Annotations are sparse in the existing codebase, help us fix that!_)
188
221
  - Organize your commits into logical units.
@@ -7,27 +7,28 @@ Gem::Specification.new do |s|
7
7
  s.version = ActiveTriples::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Tom Johnson", "Trey Terrell"]
10
- s.homepage = 'https://github.com/ActiveTriples/ActiveTriples'
11
- s.email = 'tom@dp.la'
10
+ s.homepage = 'https://gitlab.com/no_reply/ActiveTriples'
11
+ s.email = 'tom@curationexperts.com'
12
12
  s.summary = %q{RDF graphs in ActiveModel wrappers.}
13
13
  s.description = %q{ActiveTriples provides tools for modeling RDF as discrete resources.}
14
- s.license = "APACHE2"
14
+ s.license = 'Apache-2.0'
15
15
  s.required_ruby_version = '>= 2.1.0'
16
16
 
17
- s.add_dependency 'rdf', '~> 2.0', '>= 2.0.2'
18
- s.add_dependency 'rdf-vocab'
17
+ s.add_dependency 'rdf', '>= 2.0.2', '< 4.0'
18
+ s.add_dependency 'rdf-vocab', '>= 2.0', '< 4.0'
19
19
  s.add_dependency 'activemodel', '>= 3.0.0'
20
20
  s.add_dependency 'activesupport', '>= 3.0.0'
21
21
 
22
- s.add_development_dependency 'rdoc'
23
- s.add_development_dependency 'rspec'
24
- s.add_development_dependency 'rdf-spec', '~> 2.0'
25
- s.add_development_dependency 'rdf-rdfxml', '~> 2.0'
26
- s.add_development_dependency 'rdf-turtle', '~> 2.0'
27
- s.add_development_dependency 'json-ld', '~> 2.0'
28
- s.add_development_dependency 'coveralls'
29
- s.add_development_dependency 'webmock'
30
- s.add_development_dependency 'nokogiri'
22
+ s.add_development_dependency 'yard', '~> 0.9'
23
+ s.add_development_dependency 'rspec', '~> 3.6'
24
+ s.add_development_dependency 'guard-rspec', '~> 4.7'
25
+ s.add_development_dependency 'rdf-spec', '~> 3.0'
26
+ s.add_development_dependency 'rdf-rdfxml', '>= 2.0', '< 4.0'
27
+ s.add_development_dependency 'rdf-turtle', '>= 2.0', '< 4.0'
28
+ s.add_development_dependency 'json-ld', '>= 2.0', '< 4.0'
29
+ s.add_development_dependency 'coveralls', '~> 0.8'
30
+ s.add_development_dependency 'webmock', '~> 3.0'
31
+ s.add_development_dependency 'nokogiri', '~> 1.8'
31
32
  s.add_development_dependency 'pragmatic_context', '~> 0.1.2'
32
33
 
33
34
  s.files = `git ls-files`.split("\n")
@@ -14,6 +14,11 @@ module ActiveTriples
14
14
  #
15
15
  # Available properties are base_uri, rdf_label, type, and repository
16
16
  module Configurable
17
+ def inherited(child_class)
18
+ child_class.configure type: self.type
19
+ super
20
+ end
21
+
17
22
  def base_uri
18
23
  configuration[:base_uri]
19
24
  end
@@ -62,7 +67,7 @@ module ActiveTriples
62
67
 
63
68
  def transform_type(values)
64
69
  Array.wrap(values).map do |value|
65
- RDF::URI.new(value).tap do |uri|
70
+ RDF::URI.intern(value).tap do |uri|
66
71
  RDFSource.type_registry[uri] = self
67
72
  end
68
73
  end
@@ -3,15 +3,21 @@ module ActiveTriples
3
3
  require_relative 'configuration/item'
4
4
  require_relative 'configuration/merge_item'
5
5
  require_relative 'configuration/item_factory'
6
+
6
7
  ##
7
8
  # Class which contains configuration for RDFSources.
8
9
  class Configuration
9
10
  attr_accessor :inner_hash
11
+
12
+ ##
13
+ # @param item_factory [ItemFactory]
10
14
  # @param [Hash] options the configuration options.
11
- def initialize(options={})
12
- @inner_hash = Hash[options.to_a]
15
+ def initialize(item_factory: ItemFactory.new, **options)
16
+ @item_factory = item_factory
17
+ @inner_hash = Hash[options.to_a]
13
18
  end
14
19
 
20
+ ##
15
21
  # Merges this configuration with other configuration options. This uses
16
22
  # reflection setters to handle special cases like :type.
17
23
  #
@@ -19,13 +25,17 @@ module ActiveTriples
19
25
  # @return [ActiveTriples::Configuration] the configuration object which is a
20
26
  # result of merging.
21
27
  def merge(options)
22
- new_config = Configuration.new(options)
28
+ options = options.to_h
29
+ new_config = self.class.new(**options)
30
+
23
31
  new_config.items.each do |property, item|
24
32
  build_configuration_item(property).set item.value
25
33
  end
34
+
26
35
  self
27
36
  end
28
37
 
38
+ ##
29
39
  # Returns a hash with keys as the configuration property and values as
30
40
  # reflections which know how to set a new value to it.
31
41
  #
@@ -37,6 +47,7 @@ module ActiveTriples
37
47
  end
38
48
  end
39
49
 
50
+ ##
40
51
  # Returns the configured value for an option
41
52
  #
42
53
  # @return the configured value
@@ -44,30 +55,30 @@ module ActiveTriples
44
55
  to_h[value]
45
56
  end
46
57
 
58
+ ##
47
59
  # Returns the available configured options as a hash.
48
60
  #
49
61
  # This filters the options the class is initialized with.
50
62
  #
51
63
  # @return [Hash{Symbol => String, ::RDF::URI}]
52
64
  def to_h
53
- @inner_hash.slice(*valid_config_options)
65
+ inner_hash.slice(*valid_config_options)
54
66
  end
55
67
 
56
68
  protected
57
69
 
58
70
  def build_configuration_item(key)
59
- configuration_item_factory.new(self, key)
71
+ item_factory.new(self, key)
60
72
  end
61
73
 
62
74
  private
63
-
64
- def configuration_item_factory
65
- @configuration_item_factory ||= ItemFactory.new
66
- end
75
+
76
+ CONFIG_OPTIONS = [:base_uri, :rdf_label, :type, :repository].freeze
77
+
78
+ attr_reader :item_factory
67
79
 
68
80
  def valid_config_options
69
- [:base_uri, :rdf_label, :type, :repository]
81
+ CONFIG_OPTIONS
70
82
  end
71
83
  end
72
-
73
84
  end