active-triples 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -9
  3. data/CHANGES.md +69 -0
  4. data/Gemfile +0 -2
  5. data/Guardfile +1 -2
  6. data/active-triples.gemspec +3 -3
  7. data/lib/active/triples.rb +1 -0
  8. data/lib/active_triples.rb +4 -0
  9. data/lib/active_triples/configurable.rb +3 -1
  10. data/lib/active_triples/configuration.rb +1 -0
  11. data/lib/active_triples/configuration/item.rb +1 -0
  12. data/lib/active_triples/configuration/item_factory.rb +1 -0
  13. data/lib/active_triples/configuration/merge_item.rb +5 -2
  14. data/lib/active_triples/extension_strategy.rb +1 -0
  15. data/lib/active_triples/identifiable.rb +1 -0
  16. data/lib/active_triples/list.rb +2 -0
  17. data/lib/active_triples/nested_attributes.rb +1 -1
  18. data/lib/active_triples/node_config.rb +5 -3
  19. data/lib/active_triples/persistable.rb +1 -0
  20. data/lib/active_triples/persistence_strategies/parent_strategy.rb +104 -29
  21. data/lib/active_triples/persistence_strategies/persistence_strategy.rb +15 -7
  22. data/lib/active_triples/persistence_strategies/repository_strategy.rb +26 -22
  23. data/lib/active_triples/properties.rb +84 -6
  24. data/lib/active_triples/property.rb +35 -4
  25. data/lib/active_triples/property_builder.rb +38 -4
  26. data/lib/active_triples/rdf_source.rb +225 -75
  27. data/lib/active_triples/reflection.rb +42 -3
  28. data/lib/active_triples/relation.rb +330 -73
  29. data/lib/active_triples/repositories.rb +4 -2
  30. data/lib/active_triples/resource.rb +1 -0
  31. data/lib/active_triples/schema.rb +1 -0
  32. data/lib/active_triples/undefined_property_error.rb +27 -0
  33. data/lib/active_triples/version.rb +2 -1
  34. data/spec/active_triples/configurable_spec.rb +3 -2
  35. data/spec/active_triples/configuration_spec.rb +2 -1
  36. data/spec/active_triples/extension_strategy_spec.rb +2 -1
  37. data/spec/active_triples/identifiable_spec.rb +7 -11
  38. data/spec/active_triples/list_spec.rb +1 -4
  39. data/spec/active_triples/nested_attributes_spec.rb +4 -3
  40. data/spec/active_triples/persistable_spec.rb +4 -1
  41. data/spec/active_triples/persistence_strategies/parent_strategy_spec.rb +141 -11
  42. data/spec/active_triples/persistence_strategies/persistence_strategy_spec.rb +1 -0
  43. data/spec/active_triples/persistence_strategies/repository_strategy_spec.rb +32 -17
  44. data/spec/active_triples/properties_spec.rb +68 -33
  45. data/spec/active_triples/property_builder_spec.rb +36 -0
  46. data/spec/active_triples/property_spec.rb +15 -1
  47. data/spec/active_triples/rdf_source_spec.rb +544 -6
  48. data/spec/active_triples/reflection_spec.rb +78 -0
  49. data/spec/active_triples/relation_spec.rb +505 -3
  50. data/spec/active_triples/repositories_spec.rb +3 -1
  51. data/spec/active_triples/resource_spec.rb +90 -147
  52. data/spec/active_triples/schema_spec.rb +3 -2
  53. data/spec/active_triples_spec.rb +1 -0
  54. data/spec/integration/dummies/dummy_resource_a.rb +6 -0
  55. data/spec/integration/dummies/dummy_resource_b.rb +6 -0
  56. data/spec/integration/parent_persistence_spec.rb +18 -0
  57. data/spec/integration/reciprocal_properties_spec.rb +69 -0
  58. data/spec/pragmatic_context_spec.rb +10 -8
  59. data/spec/spec_helper.rb +5 -0
  60. data/spec/support/active_model_lint.rb +4 -6
  61. data/spec/support/dummies/basic_persistable.rb +2 -11
  62. data/spec/support/matchers.rb +11 -0
  63. data/spec/support/shared_examples/persistence_strategy.rb +3 -16
  64. metadata +20 -13
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveTriples
2
3
  ##
3
4
  # Defines module methods for registering an RDF::Repository for
@@ -26,9 +27,10 @@ module ActiveTriples
26
27
  #
27
28
  # @return [RDF::Repository] gives the original repository on success
28
29
  #
29
- # @raise [RuntimeError] raised if the repository is not an `RDF::Repository`
30
+ # @raise [ArgumentError] raised if the repository is not an `RDF::Repository`
30
31
  def add_repository(name, repo)
31
- raise "Repositories must be an RDF::Repository" unless repo.kind_of? RDF::Repository
32
+ raise ArgumentError, "Repositories must be an RDF::Repository" unless
33
+ repo.kind_of? RDF::Repository
32
34
  repositories[name] = repo
33
35
  end
34
36
  module_function :add_repository
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'deprecation'
2
3
 
3
4
  module ActiveTriples
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveTriples
2
3
  ##
3
4
  # Super class which provides a simple property DSL for defining property ->
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module ActiveTriples
3
+ ##
4
+ # An error class to be raised when attempting to reflect on an undefined
5
+ # property.
6
+ #
7
+ # @example
8
+ # begin
9
+ # my_source.set_value(:fake_property, 'blah')
10
+ # rescue ActiveTriples::UndefinedPropertyError => e
11
+ # e.property => 'fake_property'
12
+ # e.klass => 'MySourceClass'
13
+ # end
14
+ #
15
+ class UndefinedPropertyError < ArgumentError
16
+ attr_reader :property, :klass
17
+
18
+ def initialize(property, klass)
19
+ @property = property
20
+ @klass = klass
21
+ end
22
+
23
+ def message
24
+ "The property `#{@property}` is not defined on class '#{@klass}'"
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ActiveTriples
2
- VERSION = "0.8.1".freeze
3
+ VERSION = "0.8.2".freeze
3
4
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe ActiveTriples::Configurable do
@@ -22,7 +23,7 @@ describe ActiveTriples::Configurable do
22
23
 
23
24
  describe '#configure' do
24
25
  before do
25
- DummyConfigurable.configure base_uri: "http://example.org/base", type: RDF::RDFS.Class, rdf_label: RDF::DC.title
26
+ DummyConfigurable.configure base_uri: "http://example.org/base", type: RDF::RDFS.Class, rdf_label: RDF::Vocab::DC.title
26
27
  end
27
28
 
28
29
  it 'should set a base uri' do
@@ -35,7 +36,7 @@ describe ActiveTriples::Configurable do
35
36
  end
36
37
 
37
38
  it 'should set an rdf_label' do
38
- expect(DummyConfigurable.rdf_label).to eq RDF::DC.title
39
+ expect(DummyConfigurable.rdf_label).to eq RDF::Vocab::DC.title
39
40
  end
40
41
 
41
42
  it 'should set a type' do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe ActiveTriples::Configuration do
@@ -43,7 +44,7 @@ RSpec.describe ActiveTriples::Configuration do
43
44
  describe "#merge" do
44
45
  let(:starting_hash) do
45
46
  {
46
- :rdf_label => RDF::SKOS.prefLabel,
47
+ :rdf_label => RDF::Vocab::SKOS.prefLabel,
47
48
  :type => RDF::RDFS.Class
48
49
  }
49
50
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe ActiveTriples::ExtensionStrategy do
@@ -6,7 +7,7 @@ RSpec.describe ActiveTriples::ExtensionStrategy do
6
7
  describe ".apply" do
7
8
  it "should copy the property to the asset" do
8
9
  asset = build_asset
9
- property = build_property("name", {:predicate => RDF::DC.title})
10
+ property = build_property("name", {:predicate => RDF::Vocab::DC.title})
10
11
 
11
12
  subject.apply(asset, property)
12
13
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'active_model'
3
4
 
@@ -19,12 +20,12 @@ describe ActiveTriples::Identifiable do
19
20
  before do
20
21
  class MyResource
21
22
  include ActiveTriples::RDFSource
22
- property :relation, predicate: RDF::DC.relation, class_name: 'ActiveExample'
23
+ property :relation, predicate: RDF::Vocab::DC.relation, class_name: 'ActiveExample'
23
24
  end
24
25
 
25
- klass.property :title, predicate: RDF::DC.title
26
- klass.property :identifier, predicate: RDF::DC.identifier
27
- klass.property :description, predicate: RDF::DC.description
26
+ klass.property :title, predicate: RDF::Vocab::DC.title
27
+ klass.property :identifier, predicate: RDF::Vocab::DC.identifier
28
+ klass.property :description, predicate: RDF::Vocab::DC.description
28
29
 
29
30
  subject.resource.title = 'Moomin Valley in November'
30
31
  subject.resource.identifier = 'moomvember'
@@ -84,7 +85,7 @@ describe ActiveTriples::Identifiable do
84
85
 
85
86
  describe '::properties' do
86
87
  before do
87
- klass.property :title, :predicate => RDF::DC.title
88
+ klass.property :title, :predicate => RDF::Vocab::DC.title
88
89
  end
89
90
  it 'can be set' do
90
91
  expect(klass.properties).to include 'title'
@@ -116,7 +117,7 @@ describe ActiveTriples::Identifiable do
116
117
  end
117
118
 
118
119
  it 'does not effect other classes' do
119
- klass.property :identifier, :predicate => RDF::DC.identifier
120
+ klass.property :identifier, :predicate => RDF::Vocab::DC.identifier
120
121
  expect(ActiveExampleTwo.properties).to be_empty
121
122
  end
122
123
  end
@@ -140,11 +141,6 @@ describe ActiveTriples::Identifiable do
140
141
  it 'has a parent' do
141
142
  expect(parent.relation.first.parent).to eq parent
142
143
  end
143
-
144
- it 'has a parent after reload' do
145
- parent.relation.node_cache = {}
146
- expect(parent.relation.first.parent).to eq parent
147
- end
148
144
  end
149
145
  end
150
146
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'nokogiri'
3
4
  require 'linkeddata'
@@ -31,10 +32,6 @@ describe ActiveTriples::List do
31
32
  expect(subject.subject).not_to eq RDF.nil
32
33
  end
33
34
 
34
- it 'has a non-nil subject' do
35
- expect(subject.subject).not_to eq RDF.nil
36
- end
37
-
38
35
  it 'has type of rdf:List' do
39
36
  expect(subject.type.first).to eq RDF.List
40
37
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe "nesting attribute behavior" do
@@ -28,7 +29,7 @@ describe "nesting attribute behavior" do
28
29
  include ActiveTriples::RDFSource
29
30
  property :topic, predicate: DummyMADS.Topic, class_name: "Topic"
30
31
  property :personalName, predicate: DummyMADS.PersonalName, class_name: "PersonalName"
31
- property :title, predicate: RDF::DC.title
32
+ property :title, predicate: RDF::Vocab::DC.title
32
33
 
33
34
 
34
35
  accepts_nested_attributes_for :topic, :personalName
@@ -149,12 +150,12 @@ describe "nesting attribute behavior" do
149
150
  before do
150
151
  class SpecResource
151
152
  include ActiveTriples::RDFSource
152
- property :parts, predicate: RDF::DC.hasPart, :class_name=>'Component'
153
+ property :parts, predicate: RDF::Vocab::DC.hasPart, :class_name=>'Component'
153
154
  accepts_nested_attributes_for :parts, allow_destroy: true
154
155
 
155
156
  class Component
156
157
  include ActiveTriples::RDFSource
157
- property :label, predicate: RDF::DC.title
158
+ property :label, predicate: RDF::Vocab::DC.title
158
159
  end
159
160
  end
160
161
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe ActiveTriples::Persistable do
@@ -5,7 +6,9 @@ describe ActiveTriples::Persistable do
5
6
 
6
7
  let(:klass) { Class.new { include ActiveTriples::Persistable } }
7
8
 
8
- let(:statement) { RDF::Statement(RDF::Node.new, RDF::DC.title, 'Moomin') }
9
+ let(:statement) do
10
+ RDF::Statement(RDF::Node.new, RDF::Vocab::DC.title, 'Moomin')
11
+ end
9
12
 
10
13
  it 'raises an error with no #graph implementation' do
11
14
  expect { subject << statement }.to raise_error(NameError, /graph/)
@@ -1,25 +1,121 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe ActiveTriples::ParentStrategy do
4
5
  subject { described_class.new(rdf_source) }
5
6
  let(:rdf_source) { BasicPersistable.new }
6
-
7
+
7
8
  shared_context 'with a parent' do
9
+ let(:parent) { BasicPersistable.new }
10
+
8
11
  before do
9
12
  subject.parent = parent
10
- end
11
13
 
12
- let(:parent) { BasicPersistable.new }
14
+ rdf_source.set_persistence_strategy(described_class)
15
+ rdf_source.persistence_strategy.parent = parent
16
+ end
13
17
  end
14
18
 
15
19
  context 'with a parent' do
16
20
  include_context 'with a parent'
17
21
  it_behaves_like 'a persistence strategy'
22
+
23
+ describe '#persisted?' do
24
+ context 'before persist!' do
25
+ it 'returns false' do
26
+ expect(subject).not_to be_persisted
27
+ end
28
+ end
29
+
30
+ context 'after persist!' do
31
+ context "when the parent is not persisted" do
32
+ before { subject.persist! }
33
+ it { is_expected.not_to be_persisted }
34
+ end
35
+
36
+ context "when the parent is persisted" do
37
+ before do
38
+ allow(parent).to receive(:persisted?).and_return(true)
39
+ subject.persist!
40
+ end
41
+ it { is_expected.to be_persisted }
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ describe '#destroy' do
48
+ include_context 'with a parent'
49
+
50
+ before do
51
+ rdf_source.insert(*statements)
52
+ subject.persist!
53
+ end
54
+
55
+ let(:statements) do
56
+ [RDF::Statement(subject.source.rdf_subject, RDF::Vocab::DC.title, 'moomin'),
57
+ RDF::Statement(:node, RDF::Vocab::DC.relation, subject.source.rdf_subject),
58
+ RDF::Statement(:node, RDF::Vocab::DC.relation, :other_node)]
59
+ end
60
+
61
+ it 'removes graph from the parent' do
62
+ subject.destroy
63
+
64
+ statements.each do |statement|
65
+ expect(subject.parent.statements).not_to have_statement statement
66
+ end
67
+ end
68
+
69
+ it 'removes subjects from parent' do
70
+ subject.destroy
71
+ expect(subject.parent).not_to have_subject(rdf_source)
72
+ end
73
+
74
+ it 'removes objects from parent' do
75
+ subject.destroy
76
+ expect(subject.parent).not_to have_object(rdf_source)
77
+ end
78
+ end
79
+
80
+ describe '#ancestors' do
81
+ it 'raises NilParentError when enumerating' do
82
+ expect { subject.ancestors.next }
83
+ .to raise_error described_class::NilParentError
84
+ end
85
+
86
+ context 'with parent' do
87
+ include_context 'with a parent'
88
+
89
+ it 'gives the parent' do
90
+ expect(subject.ancestors).to contain_exactly(parent)
91
+ end
92
+
93
+ context 'and nested parents' do
94
+ let(:parents) do
95
+ [double('second', persistence_strategy: double('strategy2')),
96
+ double('third', persistence_strategy: double('strategy3'))]
97
+ end
98
+ let(:last) { double('last', persistence_strategy: double('last_strategy')) }
99
+
100
+ it 'gives all ancestors' do
101
+ allow(parent.persistence_strategy)
102
+ .to receive(:parent).and_return(parents.first)
103
+ allow(parents.first.persistence_strategy)
104
+ .to receive(:parent).and_return(parents[1])
105
+ allow(parents[1].persistence_strategy)
106
+ .to receive(:parent).and_return(last)
107
+
108
+ expect(subject.ancestors)
109
+ .to contain_exactly(*(parents << parent << last))
110
+ end
111
+ end
112
+ end
18
113
  end
19
114
 
20
115
  describe '#final_parent' do
21
116
  it 'raises an error with no parent' do
22
- expect { subject.final_parent }.to raise_error described_class::NilParentError
117
+ expect { subject.final_parent }
118
+ .to raise_error described_class::NilParentError
23
119
  end
24
120
 
25
121
  context 'with single parent' do
@@ -32,22 +128,20 @@ describe ActiveTriples::ParentStrategy do
32
128
 
33
129
  context 'with parent chain' do
34
130
  include_context 'with a parent'
35
- let(:last) { double('last') }
131
+ let(:last) { double('last', persistence_strategy: nil) }
36
132
 
37
133
  it 'gives last parent terminating when no futher parents given' do
38
- allow(parent).to receive(:parent).and_return(last)
134
+ allow(parent.persistence_strategy).to receive(:parent).and_return(last)
39
135
  expect(subject.final_parent).to eq last
40
136
  end
41
137
 
42
138
  it 'gives last parent terminating parent is nil' do
43
- allow(parent).to receive(:parent).and_return(last)
44
- allow(last).to receive(:parentt).and_return(nil)
139
+ allow(parent.persistence_strategy).to receive(:parent).and_return(last)
45
140
  expect(subject.final_parent).to eq last
46
141
  end
47
142
 
48
143
  it 'gives last parent terminating parent is same as current' do
49
- allow(parent).to receive(:parent).and_return(last)
50
- allow(last).to receive(:parentt).and_return(last)
144
+ allow(parent.persistence_strategy).to receive(:parent).and_return(last)
51
145
  expect(subject.final_parent).to eq last
52
146
  end
53
147
  end
@@ -83,7 +177,8 @@ describe ActiveTriples::ParentStrategy do
83
177
  include_context 'with a parent'
84
178
 
85
179
  it 'writes to #final_parent graph' do
86
- rdf_source << RDF::Statement.new(RDF::Node.new, RDF::DC.title, 'moomin')
180
+ rdf_source << [RDF::Node.new, RDF::Vocab::DC.title, 'moomin']
181
+
87
182
  subject.persist!
88
183
  expect(subject.final_parent.statements)
89
184
  .to contain_exactly *rdf_source.statements
@@ -91,3 +186,38 @@ describe ActiveTriples::ParentStrategy do
91
186
  end
92
187
  end
93
188
  end
189
+
190
+ describe ActiveTriples::ParentStrategy::Ancestors do
191
+ subject { described_class.new(rdf_source) }
192
+
193
+ let(:rdf_source) { BasicPersistable.new }
194
+
195
+ describe '#each' do
196
+ it 'raises NilParentError' do
197
+ expect { subject.each }
198
+ .to raise_error ActiveTriples::ParentStrategy::NilParentError
199
+ end
200
+
201
+ context 'with parents' do
202
+ let(:parent) { BasicPersistable.new }
203
+ let(:last) { BasicPersistable.new }
204
+
205
+ before do
206
+ parent.set_persistence_strategy(ActiveTriples::ParentStrategy)
207
+ parent.persistence_strategy.parent = last
208
+ rdf_source.set_persistence_strategy(ActiveTriples::ParentStrategy)
209
+ rdf_source.persistence_strategy.parent = parent
210
+ end
211
+
212
+ it { expect(subject.each).to be_a Enumerator }
213
+
214
+ it 'enumerates ancestors' do
215
+ expect(subject.each).to contain_exactly(parent, last)
216
+ end
217
+
218
+ it 'yields ancestors' do
219
+ expect { |b| subject.each(&b) }.to yield_successive_args(parent, last)
220
+ end
221
+ end
222
+ end
223
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe ActiveTriples::PersistenceStrategy do
@@ -1,19 +1,40 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  describe ActiveTriples::RepositoryStrategy do
4
5
  subject { described_class.new(rdf_source) }
5
- let(:rdf_source) { ActiveTriples::Resource.new }
6
+ let(:source_class) { class MySource; include ActiveTriples::RDFSource; end }
7
+ let(:rdf_source) { source_class.new }
6
8
 
7
9
  let(:statement) do
8
- RDF::Statement.new(rdf_source.to_term, RDF::DC.title, 'moomin')
10
+ RDF::Statement.new(rdf_source.to_term, RDF::Vocab::DC.title, 'moomin')
9
11
  end
10
12
 
11
13
  it_behaves_like 'a persistence strategy'
12
14
 
15
+
16
+ describe '#persisted?' do
17
+ context 'before persist!' do
18
+ it 'returns false' do
19
+ expect(subject).not_to be_persisted
20
+ end
21
+ end
22
+
23
+ context 'after persist!' do
24
+ it 'returns true' do
25
+ subject.persist!
26
+ expect(subject).to be_persisted
27
+ end
28
+ end
29
+ end
30
+
13
31
  shared_context 'with repository' do
32
+ let(:repo) { RDF::Repository.new }
14
33
  before do
15
- allow(subject.obj.singleton_class).to receive(:repository)
16
- .and_return(:my_repo)
34
+ source_class.configure repository: :my_repo
35
+
36
+ allow(ActiveTriples::Repositories.repositories)
37
+ .to receive(:[]).with(:my_repo).and_return(repo)
17
38
  end
18
39
  end
19
40
 
@@ -33,7 +54,7 @@ describe ActiveTriples::RepositoryStrategy do
33
54
 
34
55
  it 'leaves other resources unchanged' do
35
56
  subject.repository <<
36
- RDF::Statement(RDF::Node.new, RDF::DC.title, 'snorkmaiden')
57
+ RDF::Statement(RDF::Node.new, RDF::Vocab::DC.title, 'snorkmaiden')
37
58
  expect { subject.destroy }
38
59
  .not_to change { subject.repository.count }
39
60
  end
@@ -45,7 +66,7 @@ describe ActiveTriples::RepositoryStrategy do
45
66
 
46
67
  context 'with subjects' do
47
68
  before do
48
- subject.obj.set_subject! RDF::URI('http://example.org/moomin')
69
+ subject.source.set_subject! RDF::URI('http://example.org/moomin')
49
70
  end
50
71
 
51
72
  include_examples 'destroy resource'
@@ -80,13 +101,7 @@ describe ActiveTriples::RepositoryStrategy do
80
101
 
81
102
  context 'with unknown content in repo' do
82
103
  include_context 'with repository' do
83
- before do
84
- allow(ActiveTriples::Repositories.repositories)
85
- .to receive(:[]).with(:my_repo).and_return(repo)
86
- repo << statement
87
- end
88
-
89
- let(:repo) { RDF::Repository.new }
104
+ before { repo << statement }
90
105
  end
91
106
  end
92
107
  end
@@ -103,16 +118,16 @@ describe ActiveTriples::RepositoryStrategy do
103
118
  context 'with repository configured' do
104
119
  include_context 'with repository'
105
120
 
106
- let(:repo) { double('repo') }
107
-
108
121
  it 'when repository is not registered raises an error' do
122
+ source_class.configure repository: :no_repo
123
+
124
+ allow(ActiveTriples::Repositories.repositories)
125
+ .to receive(:[]).with(:no_repo).and_call_original
109
126
  expect { subject.repository }
110
127
  .to raise_error ActiveTriples::RepositoryNotFoundError
111
128
  end
112
129
 
113
130
  it 'gets repository' do
114
- allow(ActiveTriples::Repositories.repositories)
115
- .to receive(:[]).with(:my_repo).and_return(repo)
116
131
  expect(subject.repository).to eq repo
117
132
  end
118
133
  end