active-triples 0.10.2 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
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