ladder 0.1.1 → 0.1.2

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
  SHA1:
3
- metadata.gz: c7375d4f5b507945381d998d3965f4cdcc8e585e
4
- data.tar.gz: 01b3d742e5457614366c60d083715fea84b09cc4
3
+ metadata.gz: eae01f78a4a1a7f0b6a81fdae649c7b8afff280e
4
+ data.tar.gz: d5ea2050c1d1b9972b46c8edb5a0e37d1f9ec206
5
5
  SHA512:
6
- metadata.gz: dbca5ae82c1668d8faa094d75b4a09f1c63bc882af0f057231ecf228d79044895f9b8a813b962a3f981ff974f9cf20855146fd0126c1a31c9abcc4872f9106db
7
- data.tar.gz: 5981572185f3939e1f25843e50b9306d1bb3ec8937e16d11ad90d08e28027e5b755023294965ce8de7d9a8574cc395e7e5f4e2b6b4c7bff4e5a420624e169733
6
+ metadata.gz: 1715db5f2296eaf36139f553fefdbb5a3d071c578c7fc3ef132cf61023a8641740b4fff28bce5dbf85486067ff5e2e25e71fd8821360bc03834b4791df3812ff
7
+ data.tar.gz: 7aaf433f31b7edf78f752f374830e6b4dac9c7f54707c1ffba731fda7b4a918783e64b5d5269a0b163a5ac72c7ec35be397fea0df8c73759e6d2ef492eb6653e
@@ -1 +1 @@
1
- 2.1.2
1
+ 2.1.5
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
- ![Ladder logo](https://github.com/mjsuhonos/ladder/blob/master/logo.png)
2
- [![Gem Version](http://img.shields.io/gem/v/ladder.svg)](https://rubygems.org/gems/ladder) [![Build Status](https://travis-ci.org/mjsuhonos/ladder.svg)](https://travis-ci.org/mjsuhonos/ladder)
1
+ ![Ladder logo](https://github.com/ladder/ladder/blob/master/logo.png)
2
+
3
+ [![Gem Version](http://img.shields.io/gem/v/ladder.svg)](https://rubygems.org/gems/ladder) [![Build Status](https://travis-ci.org/ladder/ladder.svg)](https://travis-ci.org/ladder/ladder)
3
4
 
4
5
  # Ladder
5
6
 
@@ -13,9 +14,9 @@ Ladder is a dynamic, scalable metadata framework written in Ruby using well-know
13
14
 
14
15
  Ladder was loosely conceived over the course of several years prior to 2011. In early 2012, Ladder began existence as an opportunity to escape from a decade of LAMP development and become familiar with Ruby. From 2012 to late 2013, a closed prototype was built under the auspices of [Deliberate Data](http://deliberatedata.com) as a proof-of-concept to test the feasibility of the design.
15
16
 
16
- From mid-2014, Ladder is being re-architected as a series of Ruby modules that can be used individually and incorporated within existing Ruby frameworks (eg. [Project Hydra](http://projecthydra.org)), or used together as a comprehensive stack. Ladder is intended to encourage the LAM community to think less dogmatically about our established (often monolithic and/or niche) toolsets and instead embrace a broader vision of using non-LAM specific technologies.
17
+ From mid-2014, Ladder is being re-architected as a series of Ruby modules that can be used individually and incorporated within existing Ruby frameworks (eg. [Project Hydra](http://projecthydra.org)), or used together as a comprehensive stack. Ladder is intended to encourage the [LAM](http://en.wikipedia.org/wiki/GLAM_(industry_sector)) community to think less dogmatically about our established (often monolithic and/or niche) toolsets and instead embrace a broader vision of adopting more widely-used technologies.
17
18
 
18
- For those interested in the historical code, the original [prototype](https://github.com/mjsuhonos/ladder/tree/prototype) branch is available, as is an [experimental](https://github.com/mjsuhonos/ladder/tree/l2) branch.
19
+ For those interested in the historical code, the original [prototype](https://github.com/ladder/ladder/tree/prototype) branch is available, as is an [experimental](https://github.com/ladder/ladder/tree/l2) branch.
19
20
 
20
21
  ## Installation
21
22
 
@@ -581,7 +582,7 @@ es.as_indexed_json
581
582
 
582
583
  Anyone and everyone is welcome to contribute. Go crazy.
583
584
 
584
- 1. Fork it ( https://github.com/mjsuhonos/ladder/fork )
585
+ 1. Fork it ( https://github.com/ladder/ladder/fork )
585
586
  2. Create your feature branch (`git checkout -b my-new-feature`)
586
587
  3. Commit your changes (`git commit -am 'Add some feature'`)
587
588
  4. Push to the branch (`git push origin my-new-feature`)
@@ -598,4 +599,4 @@ Many thanks to Christopher Knight [@NomadicKnight](https://twitter.com/Nomadic_K
598
599
  ## License
599
600
 
600
601
  Apache License Version 2.0
601
- http://apache.org/licenses/LICENSE-2.0.txt
602
+ http://apache.org/licenses/LICENSE-2.0.txt
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  spec.email = "mj@suhonos.ca"
12
12
  spec.summary = %q{Opinionated ActiveModel framework.}
13
13
  spec.description = %q{Ladder is a metadata framework for RDF modelling, persistence, and full-text indexing.}
14
- spec.homepage = "https://github.com/mjsuhonos/ladder"
14
+ spec.homepage = "https://github.com/ladder/ladder"
15
15
  spec.license = "APACHE2"
16
16
  spec.required_ruby_version = '>= 1.9.3'
17
17
 
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.require_paths = ["lib"]
22
22
 
23
23
  spec.add_dependency "mongoid", "~> 4.0"
24
- spec.add_dependency "active-triples", "~> 0.3"
24
+ spec.add_dependency "active-triples", "~> 0.4"
25
25
  spec.add_dependency "elasticsearch-model", "~> 0.1"
26
26
 
27
27
  spec.add_development_dependency "bundler", "~> 1.7"
@@ -30,4 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "rspec", "~> 3.1"
31
31
  spec.add_development_dependency "rake", "~> 10.3"
32
32
  spec.add_development_dependency "yard", "~> 0.8"
33
+ spec.add_development_dependency "simplecov", "~> 0.9"
33
34
  end
@@ -32,16 +32,14 @@ module Ladder::Resource
32
32
  end
33
33
 
34
34
  ##
35
- # Overload ActiveTriples #update_resource
36
- #
37
- # @see ActiveTriples::Identifiable
35
+ # Populate resource properties from ActiveModel
38
36
  def update_resource(opts = {})
39
- super() do |name, prop|
40
- value = update_from_field(name) if fields[name] # this is a literal property
41
- value = update_from_relation(name, opts) if relations[name] # this is a relation property
37
+ resource_class.properties.each do |name, property|
38
+ value = update_from_field(name) if fields[name]
39
+ value = update_from_relation(name, opts) if relations[name]
42
40
 
43
41
  cast_uri = RDF::URI.new(value)
44
- resource.set_value(prop.predicate, cast_uri.valid? ? cast_uri : value) if value
42
+ resource.set_value(property.predicate, cast_uri.valid? ? cast_uri : value) if value
45
43
  end
46
44
 
47
45
  resource
@@ -26,49 +26,6 @@ module Ladder::Resource::Dynamic
26
26
 
27
27
  resource
28
28
  end
29
-
30
- def <<(data)
31
- # ActiveTriples::Resource expects: RDF::Statement, Hash, or Array
32
- data = RDF::Statement.from(data) unless data.is_a? RDF::Statement
33
-
34
- # Define predicate on object unless it's defined on the class
35
- if resource_class.properties.values.map(&:predicate).include? data.predicate
36
- field_name = resource_class.properties.select { |name, term| term.predicate == data.predicate }.keys.first.to_sym
37
- else
38
- qname = data.predicate.qname
39
-
40
- if respond_to? qname.last or :name == qname.last
41
- field_name = qname.join('_').to_sym
42
- else
43
- field_name = qname.last
44
- end
45
-
46
- property field_name, predicate: data.predicate
47
- end
48
-
49
- # Set the value in Mongoid
50
- value = case data.object
51
- when RDF::Literal
52
- data.object.object
53
- when RDF::URI
54
- data.object.to_s
55
- else
56
- data.object
57
- end
58
-
59
- self.send("#{field_name}=", value)
60
- end
61
-
62
- private
63
-
64
- ##
65
- # Overload ActiveTriples #resource_class
66
- #
67
- # @see ActiveTriples::Identifiable
68
- def resource_class
69
- @modified_resource_class ||= self.class.resource_class.clone
70
- end
71
-
72
29
  end
73
30
 
74
31
  ##
@@ -76,11 +33,45 @@ module Ladder::Resource::Dynamic
76
33
  def property(field_name, *opts)
77
34
  # Store context information
78
35
  self._context ||= Hash.new(nil)
36
+
37
+ # Ensure new field name is unique
38
+ field_name = opts.first[:predicate].qname.join('_').to_sym if respond_to? field_name or :name == field_name
39
+
79
40
  self._context[field_name] = opts.first[:predicate].to_s
80
41
 
81
42
  apply_context
82
43
  end
83
44
 
45
+ def <<(data)
46
+ # ActiveTriples::Resource expects: RDF::Statement, Hash, or Array
47
+ data = RDF::Statement.from(data) unless data.is_a? RDF::Statement
48
+
49
+ # Define predicate on object unless it's defined on the class
50
+ if resource_class.properties.values.map(&:predicate).include? data.predicate
51
+ field_name = resource_class.properties.select { |name, term| term.predicate == data.predicate }.keys.first.to_sym
52
+ else
53
+ qname = data.predicate.qname
54
+
55
+ if respond_to? qname.last or :name == qname.last
56
+ field_name = qname.join('_').to_sym
57
+ else
58
+ field_name = qname.last
59
+ end
60
+
61
+ property field_name, predicate: data.predicate
62
+ end
63
+
64
+ # Set the value in Mongoid
65
+ value = case data.object
66
+ when RDF::Literal
67
+ data.object.object
68
+ else
69
+ data.object.to_s
70
+ end
71
+
72
+ self.send("#{field_name}=", value)
73
+ end
74
+
84
75
  private
85
76
 
86
77
  ##
@@ -112,4 +103,19 @@ module Ladder::Resource::Dynamic
112
103
  end
113
104
  end
114
105
 
106
+ public
107
+
108
+ module ClassMethods
109
+
110
+ private
111
+
112
+ ##
113
+ # Overload ActiveTriples #resource_class
114
+ #
115
+ # @see ActiveTriples::Identifiable
116
+ def resource_class
117
+ @modified_resource_class ||= self.class.resource_class.clone
118
+ end
119
+ end
120
+
115
121
  end
@@ -1,3 +1,3 @@
1
1
  module Ladder
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -18,8 +18,154 @@ describe Ladder::Resource::Dynamic do
18
18
  end
19
19
 
20
20
  it_behaves_like 'a Resource'
21
+
22
+ shared_context 'with data' do
23
+ let(:subject) { Thing.new }
24
+
25
+ before do
26
+ # non-localized literal
27
+ subject.class.field :alt
28
+ subject.class.property :alt, :predicate => RDF::DC.alternative
29
+ subject.alt = 'Mumintrollet pa kometjakt'
30
+
31
+ # localized literal
32
+ subject.class.property :title, :predicate => RDF::DC.title
33
+ subject.title = 'Comet in Moominland'
34
+ end
35
+ end
36
+
37
+ describe '#property' do
38
+ include_context 'with data'
39
+
40
+ context 'with undefined property' do
41
+ before do
42
+ subject.property :description, :predicate => RDF::DC.description
43
+ subject.description = "Second in Tove Jansson's series of Moomin books"
44
+ end
45
+
46
+ it 'should create a context' do
47
+ expect(subject._context).to eq({:description => RDF::DC.description.to_uri.to_s})
48
+ end
49
+
50
+ it 'should build an accessor' do
51
+ expect(subject.description).to eq "Second in Tove Jansson's series of Moomin books"
52
+ end
53
+ end
54
+
55
+ context 'with conflicting property' do
56
+ before do
57
+ subject.property :title, :predicate => RDF::DC11.title
58
+ subject.dc11_title = "Kometjakten"
59
+ end
60
+
61
+ it 'should create a context' do
62
+ expect(subject._context).to eq({:dc11_title => RDF::DC11.title.to_uri.to_s})
63
+ end
64
+
65
+ it 'should build an accessor' do
66
+ expect(subject.dc11_title).to eq "Kometjakten"
67
+ end
68
+ end
69
+ end
70
+
71
+ describe '#<<' do
72
+ include_context 'with data'
73
+
74
+ context 'with defined field' do
75
+ before do
76
+ subject << RDF::Statement(nil, RDF::DC.title, 'Kometen kommer')
77
+ end
78
+
79
+ it 'should not create a context' do
80
+ expect(subject._context).to be nil
81
+ end
82
+
83
+ it 'should update existing values' do
84
+ expect(subject.title).to eq 'Kometen kommer'
85
+ end
86
+ end
87
+
88
+ context 'with undefined field' do
89
+ before do
90
+ subject << RDF::Statement(nil, RDF::DC.description, "Second in Tove Jansson's series of Moomin books")
91
+ end
92
+
93
+ it 'should create a context' do
94
+ expect(subject._context).to eq({:description => RDF::DC.description.to_uri.to_s})
95
+ end
96
+
97
+ it 'should build an accessor' do
98
+ expect(subject.description).to eq "Second in Tove Jansson's series of Moomin books"
99
+ end
100
+ end
101
+
102
+ context 'with conflicting field' do
103
+ before do
104
+ subject << RDF::Statement(nil, RDF::DC11.title, "Kometjakten")
105
+ end
106
+
107
+ it 'should create a context' do
108
+ expect(subject._context).to eq({:dc11_title => RDF::DC11.title.to_uri.to_s})
109
+ end
110
+
111
+ it 'should build an accessor' do
112
+ expect(subject.dc11_title).to eq "Kometjakten"
113
+ end
114
+ end
115
+
116
+
117
+ context 'with a URI value' do
118
+ before do
119
+ subject << RDF::Statement(nil, RDF::DC.identifier, RDF::URI('http://some.uri'))
120
+ subject.update_resource
121
+ end
122
+
123
+ it 'should store the URI as a string' do
124
+ expect(subject.identifier).to eq 'http://some.uri'
125
+ end
126
+
127
+ it 'should cast a URI into the resource' do
128
+ query = subject.resource.query(:subject => subject.rdf_subject, :predicate => RDF::DC.identifier)
129
+ expect(query.count).to eq 1
130
+ expect(query.first_object).to be_a_kind_of RDF::URI
131
+ end
132
+ end
133
+
134
+ end
21
135
 
22
- # TODO: Add specs
136
+ describe '#update_resource' do
137
+ include_context 'with data'
138
+
139
+ before do
140
+ # undefined property
141
+ subject.property :description, :predicate => RDF::DC.description
142
+ subject.description = "Second in Tove Jansson's series of Moomin books"
143
+
144
+ # conflicting property
145
+ subject.property :title, :predicate => RDF::DC11.title
146
+ subject.dc11_title = "Kometjakten"
147
+
148
+ # defined field
149
+ subject << RDF::Statement(nil, RDF::DC.title, 'Kometen kommer')
150
+
151
+ # conflicting field
152
+ subject << RDF::Statement(nil, RDF::DC.alternative, "Kometjakten")
153
+
154
+ # URI value
155
+ subject << RDF::Statement(nil, RDF::DC.identifier, RDF::URI('http://some.uri'))
156
+
157
+ subject.update_resource
158
+ end
159
+
160
+ it 'should have updated values' do
161
+ expect(subject.resource.statements.count).to eq 5
162
+ expect(subject.resource.query(:predicate => RDF::DC.description, :object => "Second in Tove Jansson's series of Moomin books").count).to eq 1
163
+ expect(subject.resource.query(:predicate => RDF::DC11.title, :object => "Kometjakten").count).to eq 1
164
+ expect(subject.resource.query(:predicate => RDF::DC.title, :object => RDF::Literal.new('Kometen kommer', :language => :en)).count).to eq 1
165
+ expect(subject.resource.query(:predicate => RDF::DC.alternative, :object => "Kometjakten").count).to eq 1
166
+ expect(subject.resource.query(:predicate => RDF::DC.identifier, :object => RDF::URI('http://some.uri')).count).to eq 1
167
+ end
168
+ end
23
169
 
24
170
  after do
25
171
  Object.send(:remove_const, :LADDER_BASE_URI) if Object
@@ -3,8 +3,23 @@ shared_examples 'a Resource' do
3
3
  let(:person) { Person.new }
4
4
 
5
5
  shared_context 'with data' do
6
+ before do
7
+ # non-localized literal
8
+ subject.class.field :alt
9
+ subject.class.property :alt, :predicate => RDF::DC.alternative
10
+ subject.alt = 'Mumintrollet pa kometjakt'
11
+
12
+ # localized literal
13
+ subject.class.property :title, :predicate => RDF::DC.title
14
+ subject.title = 'Comet in Moominland'
15
+ end
16
+ end
17
+
18
+ shared_context 'with relations' do
6
19
  let(:concept) { Concept.new }
7
20
  let(:part) { Part.new }
21
+
22
+ include_context 'with data'
8
23
 
9
24
  before do
10
25
  class Concept
@@ -15,15 +30,6 @@ shared_examples 'a Resource' do
15
30
  include Ladder::Resource
16
31
  end
17
32
 
18
- # non-localized literal
19
- subject.class.field :alt
20
- subject.class.property :alt, :predicate => RDF::DC.alternative
21
- subject.alt = 'Mumintrollet pa kometjakt'
22
-
23
- # localized literal
24
- subject.class.property :title, :predicate => RDF::DC.title
25
- subject.title = 'Comet in Moominland'
26
-
27
33
  # many-to-many
28
34
  person.class.property :things, :predicate => RDF::DC.relation, :class_name => 'Thing'
29
35
  subject.class.property :people, :predicate => RDF::DC.creator, :class_name => 'Person'
@@ -70,11 +76,7 @@ shared_examples 'a Resource' do
70
76
 
71
77
  describe '#property' do
72
78
  context 'with non-localized literal' do
73
- before do
74
- subject.class.field :alt
75
- subject.class.property :alt, :predicate => RDF::DC.alternative
76
- subject.alt = 'Mumintrollet pa kometjakt'
77
- end
79
+ include_context 'with data'
78
80
 
79
81
  it 'should return non-localized value' do
80
82
  expect(subject.alt).to eq 'Mumintrollet pa kometjakt'
@@ -95,10 +97,7 @@ shared_examples 'a Resource' do
95
97
  end
96
98
 
97
99
  context 'with localized literal' do
98
- before do
99
- subject.class.property :title, :predicate => RDF::DC.title
100
- subject.title = 'Comet in Moominland'
101
- end
100
+ include_context 'with data'
102
101
 
103
102
  it 'should return localized value' do
104
103
  expect(subject.title).to eq 'Comet in Moominland'
@@ -119,12 +118,7 @@ shared_examples 'a Resource' do
119
118
  end
120
119
 
121
120
  context 'with many-to-many' do
122
- before do
123
- subject.class.property :people, :predicate => RDF::DC.creator, :class_name => 'Person'
124
- person.class.property :things, :predicate => RDF::DC.relation, :class_name => 'Thing'
125
- subject.people << person
126
- subject.save
127
- end
121
+ include_context 'with relations'
128
122
 
129
123
  it 'should have a relation' do
130
124
  expect(subject.relations['people'].relation).to eq (Mongoid::Relations::Referenced::ManyToMany)
@@ -146,28 +140,24 @@ shared_examples 'a Resource' do
146
140
  end
147
141
 
148
142
  context 'with one-sided has-many' do
149
- before do
150
- subject.class.has_and_belongs_to_many :people, inverse_of: nil
151
- subject.class.property :people, :predicate => RDF::DC.creator, :class_name => 'Person'
152
- subject.people << person
153
- end
143
+ include_context 'with relations'
154
144
 
155
145
  it 'should have a relation' do
156
- expect(subject.relations['people'].relation).to eq (Mongoid::Relations::Referenced::ManyToMany)
157
- expect(subject.people.to_a).to include person
146
+ expect(subject.relations['concepts'].relation).to eq (Mongoid::Relations::Referenced::ManyToMany)
147
+ expect(subject.concepts.to_a).to include concept
158
148
  end
159
149
 
160
150
  it 'should not have an inverse relation' do
161
- expect(subject.relations['people'].inverse_of).to be nil
162
- expect(person.relations).to be_empty
151
+ expect(subject.relations['concepts'].inverse_of).to be nil
152
+ expect(concept.relations).to be_empty
163
153
  end
164
154
 
165
155
  it 'should have a valid predicate' do
166
- expect(subject.class.properties['people'].predicate).to eq RDF::DC.creator
156
+ expect(subject.class.properties['concepts'].predicate).to eq RDF::DC.subject
167
157
  end
168
158
 
169
159
  it 'should not have an inverse predicate' do
170
- expect(person.class.properties).to be_empty
160
+ expect(concept.class.properties).to be_empty
171
161
  end
172
162
  end
173
163
 
@@ -203,9 +193,8 @@ shared_examples 'a Resource' do
203
193
  end
204
194
 
205
195
  describe '#update_resource' do
206
-
207
196
  context 'without related: true' do
208
- include_context 'with data'
197
+ include_context 'with relations'
209
198
 
210
199
  before do
211
200
  subject.update_resource
@@ -248,7 +237,7 @@ shared_examples 'a Resource' do
248
237
  end
249
238
 
250
239
  context 'with related: true' do
251
- include_context 'with data'
240
+ include_context 'with relations'
252
241
 
253
242
  before do
254
243
  subject.update_resource(:related => true)
@@ -314,7 +303,7 @@ shared_examples 'a Resource' do
314
303
  end
315
304
 
316
305
  context 'with related and then without related' do
317
- include_context 'with data'
306
+ include_context 'with relations'
318
307
 
319
308
  before do
320
309
  subject.update_resource(:related => true)
@@ -344,11 +333,20 @@ shared_examples 'a Resource' do
344
333
  end
345
334
 
346
335
  describe '#as_jsonld' do
347
- include_context 'with data'
336
+ include_context 'with relations'
348
337
 
349
338
  it 'should output a valid jsonld representation of itself' do
350
339
  g = RDF::Graph.new << JSON::LD::API.toRdf(subject.as_jsonld)
351
340
  expect(subject.resource.to_hash == g.to_hash).to be true
352
341
  end
353
342
  end
343
+
344
+ describe '#rdf_label' do
345
+ include_context 'with data'
346
+
347
+ it 'should return the default label' do
348
+ expect(subject.rdf_label.to_a).to eq ['Comet in Moominland']
349
+ end
350
+ end
351
+
354
352
  end
@@ -3,6 +3,8 @@ Bundler.setup
3
3
 
4
4
  require 'ladder'
5
5
  require 'pry'
6
+ require 'simplecov'
7
+ SimpleCov.start
6
8
 
7
9
  Dir['./spec/shared/**/*.rb'].each { |f| require f }
8
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ladder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - MJ Suhonos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-19 00:00:00.000000000 Z
11
+ date: 2014-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.3'
33
+ version: '0.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.3'
40
+ version: '0.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: elasticsearch-model
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0.8'
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.9'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.9'
139
153
  description: Ladder is a metadata framework for RDF modelling, persistence, and full-text
140
154
  indexing.
141
155
  email: mj@suhonos.ca
@@ -165,7 +179,7 @@ files:
165
179
  - spec/shared/resource.rb
166
180
  - spec/shared/searchable.rb
167
181
  - spec/spec_helper.rb
168
- homepage: https://github.com/mjsuhonos/ladder
182
+ homepage: https://github.com/ladder/ladder
169
183
  licenses:
170
184
  - APACHE2
171
185
  metadata: {}