common_repository_model 0.0.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.
- data/.gitignore +17 -0
- data/.rvmrc +55 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +14 -0
- data/README.md +29 -0
- data/Rakefile +9 -0
- data/common_repository_model.gemspec +30 -0
- data/lib/common_repository_model/area.rb +18 -0
- data/lib/common_repository_model/collection.rb +95 -0
- data/lib/common_repository_model/data.rb +28 -0
- data/lib/common_repository_model/file_datastream.rb +6 -0
- data/lib/common_repository_model/persistence_base.rb +5 -0
- data/lib/common_repository_model/version.rb +3 -0
- data/lib/common_repository_model.rb +5 -0
- data/lib/generators/common_repository_model/collection/USAGE +9 -0
- data/lib/generators/common_repository_model/collection/collection_generator.rb +17 -0
- data/lib/generators/common_repository_model/collection/templates/collection.rb.erb +35 -0
- data/lib/generators/common_repository_model/collection/templates/collection_spec.rb.erb +4 -0
- data/spec/common_respository_model/area_spec.rb +34 -0
- data/spec/common_respository_model/collection_spec.rb +72 -0
- data/spec/common_respository_model/data_spec.rb +53 -0
- data/spec/common_respository_model/file_datastream_spec.rb +6 -0
- data/spec/common_respository_model/integration_spec.rb +255 -0
- data/spec/common_respository_model/persistence_base_spec.rb +8 -0
- data/spec/config/fedora.yml +4 -0
- data/spec/config/predicate_mappings.yml +62 -0
- data/spec/config/solr.yml +10 -0
- data/spec/spec_helper.rb +32 -0
- metadata +179 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
|
4
|
+
# development environment upon cd'ing into the directory
|
|
5
|
+
|
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
|
|
7
|
+
environment_id="ruby-1.9.3-p286@common_repository_model"
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Uncomment following line if you want options to be set only for given project.
|
|
11
|
+
#
|
|
12
|
+
# PROJECT_JRUBY_OPTS=( --1.9 )
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# First we attempt to load the desired environment directly from the environment
|
|
16
|
+
# file. This is very fast and efficient compared to running through the entire
|
|
17
|
+
# CLI and selector. If you want feedback on which environment was used then
|
|
18
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
|
19
|
+
#
|
|
20
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
|
21
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
|
22
|
+
then
|
|
23
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
|
24
|
+
|
|
25
|
+
if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
|
|
26
|
+
then
|
|
27
|
+
. "${rvm_path:-$HOME/.rvm}/hooks/after_use"
|
|
28
|
+
fi
|
|
29
|
+
else
|
|
30
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
|
31
|
+
if ! rvm --create use "$environment_id"
|
|
32
|
+
then
|
|
33
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
|
|
40
|
+
# it be automatically loaded. Uncomment the following and adjust the filename if
|
|
41
|
+
# necessary.
|
|
42
|
+
#
|
|
43
|
+
# filename=".gems"
|
|
44
|
+
# if [[ -s "$filename" ]]
|
|
45
|
+
# then
|
|
46
|
+
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
|
|
47
|
+
# fi
|
|
48
|
+
|
|
49
|
+
# If you use bundler, this might be useful to you:
|
|
50
|
+
if command -v bundle && [[ -s Gemfile ]]
|
|
51
|
+
then
|
|
52
|
+
bundle
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
##########################################################################
|
|
2
|
+
# Copyright 2012 University of Notre Dame
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
data/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# CommonRepositoryModel
|
|
2
|
+
|
|
3
|
+
Notre Dame's Common Fedora Repository Model
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
gem 'common_repository_model'
|
|
10
|
+
|
|
11
|
+
And then execute:
|
|
12
|
+
|
|
13
|
+
$ bundle
|
|
14
|
+
|
|
15
|
+
Or install it yourself as:
|
|
16
|
+
|
|
17
|
+
$ gem install common_repository_model
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
TODO: Write usage instructions here
|
|
22
|
+
|
|
23
|
+
## Contributing
|
|
24
|
+
|
|
25
|
+
1. Fork it
|
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'common_repository_model/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |gem|
|
|
7
|
+
gem.name = "common_repository_model"
|
|
8
|
+
gem.version = CommonRepositoryModel::VERSION
|
|
9
|
+
gem.authors = [
|
|
10
|
+
"Jeremy Friesen"
|
|
11
|
+
]
|
|
12
|
+
gem.email = [
|
|
13
|
+
"jeremy.n.friesen@gmail.com"
|
|
14
|
+
]
|
|
15
|
+
gem.description = %q{Notre Dame's Common Fedora Repository Model}
|
|
16
|
+
gem.summary = %q{Notre Dame's Common Fedora Repository Model}
|
|
17
|
+
gem.homepage = "https://github.com/ndlib/common_repository_model"
|
|
18
|
+
|
|
19
|
+
gem.files = `git ls-files`.split($/)
|
|
20
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
|
21
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
22
|
+
gem.require_paths = ["lib"]
|
|
23
|
+
|
|
24
|
+
gem.add_dependency "activesupport", "~>3.2"
|
|
25
|
+
gem.add_dependency "activemodel", "~>3.2"
|
|
26
|
+
gem.add_dependency "builder", "~>3.0"
|
|
27
|
+
gem.add_runtime_dependency "minitest"
|
|
28
|
+
gem.add_runtime_dependency "minitest-matchers"
|
|
29
|
+
gem.add_runtime_dependency "active-fedora"
|
|
30
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require_relative './persistence_base'
|
|
2
|
+
require_relative './collection'
|
|
3
|
+
module CommonRepositoryModel
|
|
4
|
+
class Area < PersistenceBase
|
|
5
|
+
|
|
6
|
+
has_many(
|
|
7
|
+
:collections,
|
|
8
|
+
class_name: 'CommonRepositoryModel::Collection',
|
|
9
|
+
property: :is_member_of_area
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
has_metadata(name: "properties",type: ActiveFedora::SimpleDatastream) do |m|
|
|
13
|
+
m.field 'area_name', :string
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
delegate_to 'properties', [:area_name], unique: true
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
require_relative './persistence_base'
|
|
2
|
+
require_relative './area'
|
|
3
|
+
require_relative './data'
|
|
4
|
+
require 'set'
|
|
5
|
+
|
|
6
|
+
module CommonRepositoryModel
|
|
7
|
+
class MembershipRegistry
|
|
8
|
+
def initialize
|
|
9
|
+
@has_members = Set.new
|
|
10
|
+
@is_member_of = Set.new
|
|
11
|
+
end
|
|
12
|
+
attr_reader :has_members, :is_member_of
|
|
13
|
+
end
|
|
14
|
+
class Collection < PersistenceBase
|
|
15
|
+
|
|
16
|
+
def self.membership_registry
|
|
17
|
+
@membership_registry ||= MembershipRegistry.new
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def membership_registry
|
|
21
|
+
self.class.membership_registry
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.has_members(method_name, options = {})
|
|
25
|
+
membership_registry.has_members << method_name
|
|
26
|
+
has_many(method_name, options)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Creates the :break_relation_with_<macro_name> method which is useful for
|
|
30
|
+
# managing both the ActiveFedora association and relationship.
|
|
31
|
+
#
|
|
32
|
+
# NOTE: I believe this is actually masking an ActiveFedora bug, at some
|
|
33
|
+
# point, I would imagine that the :break_relation_with method would be
|
|
34
|
+
# deprecated and ultimately be an alias for
|
|
35
|
+
# object.<association_name>.delete(obj1,obj2)
|
|
36
|
+
def self.is_member_of(method_name, options = {})
|
|
37
|
+
membership_registry.is_member_of << method_name
|
|
38
|
+
define_method "break_relation_with_#{method_name}" do |*args|
|
|
39
|
+
send(method_name).delete(*args)
|
|
40
|
+
args.each do |obj|
|
|
41
|
+
remove_relationship(options[:property], obj)
|
|
42
|
+
remove_relationship(:is_member_of, obj)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
has_and_belongs_to_many(method_name, options)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def save
|
|
49
|
+
collected_has_members = membership_registry.has_members.
|
|
50
|
+
collect do |association_name|
|
|
51
|
+
public_send(association_name)
|
|
52
|
+
end.flatten
|
|
53
|
+
self.child_collections = collected_has_members
|
|
54
|
+
|
|
55
|
+
collected_is_member_of = membership_registry.is_member_of.
|
|
56
|
+
collect do |association_name|
|
|
57
|
+
public_send(association_name)
|
|
58
|
+
end.flatten
|
|
59
|
+
|
|
60
|
+
self.parent_collections = collected_is_member_of
|
|
61
|
+
|
|
62
|
+
super
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
belongs_to(
|
|
66
|
+
:area,
|
|
67
|
+
class_name:'CommonRepositoryModel::Area',
|
|
68
|
+
property: :is_member_of_area
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
has_many(
|
|
72
|
+
:child_collections,
|
|
73
|
+
class_name: 'CommonRepositoryModel::Collection',
|
|
74
|
+
property: :is_member_of
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
has_and_belongs_to_many(
|
|
78
|
+
:parent_collections,
|
|
79
|
+
class_name: 'CommonRepositoryModel::Collection',
|
|
80
|
+
property: :is_member_of
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
has_many(
|
|
84
|
+
:data,
|
|
85
|
+
class_name: 'CommonRepositoryModel::Data',
|
|
86
|
+
property: :is_part_of
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def find_or_build_data_for_given_slot_names(slot_names)
|
|
90
|
+
slot_names.collect { |name|
|
|
91
|
+
data.detect { |d| d.slot_name == name } || data.build(slot_name: name)
|
|
92
|
+
}
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require_relative './persistence_base'
|
|
2
|
+
require_relative './collection'
|
|
3
|
+
require_relative './file_datastream'
|
|
4
|
+
|
|
5
|
+
class CommonRepositoryModel::Data < CommonRepositoryModel::PersistenceBase
|
|
6
|
+
belongs_to(
|
|
7
|
+
:collection,
|
|
8
|
+
class_name: 'CommonRepositoryModel::Collection',
|
|
9
|
+
property: :is_part_of
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
has_file_datastream(
|
|
13
|
+
name: "content",
|
|
14
|
+
type: CommonRepositoryModel::FileDatastream
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
has_metadata name: "properties", type: ActiveFedora::SimpleDatastream do |m|
|
|
18
|
+
m.field :slot_name, :string
|
|
19
|
+
m.field :md5_checksum, :string
|
|
20
|
+
end
|
|
21
|
+
delegate :slot_name, unique: true, to: :properties
|
|
22
|
+
delegate :md5_checksum, unique: true, to: :properties
|
|
23
|
+
validates :slot_name, presence: true
|
|
24
|
+
|
|
25
|
+
def content=(file)
|
|
26
|
+
add_file_datastream(file, dsid: "content")
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'rails/generators'
|
|
2
|
+
class CommonRepositoryModel::Collection < Rails::Generators::NamedBase
|
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
|
4
|
+
|
|
5
|
+
def create_collection
|
|
6
|
+
template(
|
|
7
|
+
'collection.rb.erb',
|
|
8
|
+
File.join('app/repository_models/', "#{file_name}.rb")
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
def create_service_spec
|
|
12
|
+
template(
|
|
13
|
+
'collection_spec.rb.erb',
|
|
14
|
+
File.join('spec/repository_models/', "#{file_name}_spec.rb")
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Generated via
|
|
2
|
+
# `rails generate common_repository_model::collection <%= class_name %>`
|
|
3
|
+
require 'common_repository_model/collection'
|
|
4
|
+
class <%= class_name %> < CommonRepositoryModel::Collection
|
|
5
|
+
|
|
6
|
+
# ***************************************************************************
|
|
7
|
+
# ***************************************************************************
|
|
8
|
+
# NOTE: When managing associations, there is a bug in the underlying
|
|
9
|
+
# has_and_belongs_to_many. To remove an item from the association, you
|
|
10
|
+
# will presently need to operate on the child object – that is the object
|
|
11
|
+
# with the RELS-EXT entry.
|
|
12
|
+
# use `object.remove_from_containers(a_container)`
|
|
13
|
+
# ***************************************************************************
|
|
14
|
+
# ***************************************************************************
|
|
15
|
+
#
|
|
16
|
+
# EXAMPLE OF .has_members && .is_member_of
|
|
17
|
+
# Creates a relationship in which the RELS-EXT entries are stored in the
|
|
18
|
+
# "child" object. By using the has_members and is_member_of, the RELS-EXT
|
|
19
|
+
# also has an "isMemberOf" entry. In this way, we can generically walk the
|
|
20
|
+
# document tree as we know a related object exists.
|
|
21
|
+
#
|
|
22
|
+
# has_members :children, type: "<%= class_name %>" , property: 'is_named_member_of'
|
|
23
|
+
# is_member_of :parents, type: "<%= class_name %>" , property: 'is_named_member_of'
|
|
24
|
+
#
|
|
25
|
+
# In this case, a Page object would have the RELS-EXT entry
|
|
26
|
+
# has_members :pages, type: "Page", property: "is_page_of"
|
|
27
|
+
#
|
|
28
|
+
# In this case, the <%= class_name %> object would have the RELS-EXT entry
|
|
29
|
+
# is_member_of :containers, type: "Container", property: "is_contained_in"
|
|
30
|
+
#
|
|
31
|
+
# For Examples Specs:
|
|
32
|
+
# https://github.com/ndlib/common_respository_model/blob/master/spec/common_respository_model/integration_spec.rb
|
|
33
|
+
#
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require_relative '../spec_helper'
|
|
2
|
+
require 'common_repository_model/area'
|
|
3
|
+
require 'common_repository_model/collection'
|
|
4
|
+
|
|
5
|
+
describe CommonRepositoryModel::Area do
|
|
6
|
+
|
|
7
|
+
subject { CommonRepositoryModel::Area.new(area_name: area_name) }
|
|
8
|
+
let(:area_name) { 'My Area Name'}
|
|
9
|
+
|
|
10
|
+
it 'should have #area_name' do
|
|
11
|
+
subject.area_name.must_equal area_name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe 'has_many #collections' do
|
|
15
|
+
it 'should build #collections' do
|
|
16
|
+
subject.collections.build.
|
|
17
|
+
must_be_kind_of(CommonRepositoryModel::Collection)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe 'integration' do
|
|
22
|
+
let(:collection) { CommonRepositoryModel::Collection.new }
|
|
23
|
+
it 'should save' do
|
|
24
|
+
# Before we can add a collection, the containing object
|
|
25
|
+
# must be saved
|
|
26
|
+
subject.save.must_equal true
|
|
27
|
+
subject.collections << collection
|
|
28
|
+
subject.save.must_equal true
|
|
29
|
+
new_subject = subject.class.find(subject.pid)
|
|
30
|
+
|
|
31
|
+
new_subject.collections.size.must_equal 1
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require_relative '../spec_helper'
|
|
2
|
+
require 'common_repository_model/collection'
|
|
3
|
+
|
|
4
|
+
describe CommonRepositoryModel::Collection do
|
|
5
|
+
|
|
6
|
+
subject { CommonRepositoryModel::Collection.new }
|
|
7
|
+
|
|
8
|
+
it 'should belong_to #area' do
|
|
9
|
+
subject.must_respond_to(:area)
|
|
10
|
+
subject.must_respond_to(:area=)
|
|
11
|
+
subject.must_respond_to(:area_id)
|
|
12
|
+
subject.must_respond_to(:area_id=)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe '#find_or_build_data_for_given_slot_names' do
|
|
16
|
+
it 'yields an existing data node if the slot name exists' do
|
|
17
|
+
slot_name = 'AnotherThing'
|
|
18
|
+
initial_object = subject.data.build(slot_name: slot_name)
|
|
19
|
+
object = subject.find_or_build_data_for_given_slot_names([slot_name]).first
|
|
20
|
+
object.must_equal initial_object
|
|
21
|
+
end
|
|
22
|
+
it 'yields a newly built data node if the slot name does not exist' do
|
|
23
|
+
slot_name = 'Chicken'
|
|
24
|
+
object = subject.find_or_build_data_for_given_slot_names([slot_name]).first
|
|
25
|
+
object.slot_name.must_equal slot_name
|
|
26
|
+
object.persisted?.must_equal false
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'has many data' do
|
|
31
|
+
subject.data.build.must_be_kind_of(CommonRepositoryModel::Data)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe 'has_many #child_collections' do
|
|
35
|
+
it 'should build #child_collections' do
|
|
36
|
+
subject.child_collections.build.
|
|
37
|
+
must_be_kind_of(CommonRepositoryModel::Collection)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe 'has_and_belongs_to_many #parent_collections' do
|
|
42
|
+
it 'should be an Array' do
|
|
43
|
+
subject.parent_collections.must_be_kind_of Array
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
describe 'integration' do
|
|
49
|
+
let(:child_collection) { CommonRepositoryModel::Collection.new }
|
|
50
|
+
it 'should handle parent/child collection' do
|
|
51
|
+
# Before we can add a collection, the containing object
|
|
52
|
+
# must be saved
|
|
53
|
+
subject.save.must_equal true
|
|
54
|
+
subject.child_collections << child_collection
|
|
55
|
+
subject.save.must_equal true
|
|
56
|
+
@collection = subject.class.find(subject.pid)
|
|
57
|
+
@child_collection = child_collection.class.find(child_collection.pid)
|
|
58
|
+
|
|
59
|
+
# We shouldn't store any child relations
|
|
60
|
+
assert_rels_ext(@collection, :has_members, [])
|
|
61
|
+
assert_active_fedora_has_many(
|
|
62
|
+
@collection, :child_collections, [@child_collection]
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
assert_rels_ext(@child_collection, :is_member_of, [@collection])
|
|
66
|
+
assert_active_fedora_has_many(
|
|
67
|
+
@child_collection, :parent_collections, [@collection]
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require_relative '../spec_helper'
|
|
2
|
+
require 'common_repository_model/data'
|
|
3
|
+
|
|
4
|
+
describe CommonRepositoryModel::Data do
|
|
5
|
+
|
|
6
|
+
subject {
|
|
7
|
+
CommonRepositoryModel::Data.new(
|
|
8
|
+
slot_name: '1234',
|
|
9
|
+
md5_checksum: 'abcdefg'
|
|
10
|
+
)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
describe 'integration' do
|
|
14
|
+
let(:collection) { CommonRepositoryModel::Collection.new }
|
|
15
|
+
let(:file_1) { File.new(__FILE__) }
|
|
16
|
+
let(:file_2) {
|
|
17
|
+
File.new(File.join(File.dirname(__FILE__), '../spec_helper.rb'))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
it 'should have #slot_name' do
|
|
21
|
+
subject.must_respond_to :slot_name
|
|
22
|
+
subject.must_respond_to :slot_name=
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'should have #md5_checksum' do
|
|
26
|
+
subject.must_respond_to :md5_checksum
|
|
27
|
+
subject.must_respond_to :md5_checksum=
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it 'should have content versions' do
|
|
31
|
+
subject.content = file_1
|
|
32
|
+
subject.save
|
|
33
|
+
subject.content.content.must_equal file_1.read
|
|
34
|
+
subject.content = file_2
|
|
35
|
+
subject.save
|
|
36
|
+
subject.content.content.must_equal file_2.read
|
|
37
|
+
subject.content.versions.count.must_equal 2
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'should save' do
|
|
41
|
+
# Before we can add a collection, the containing object
|
|
42
|
+
# must be saved
|
|
43
|
+
collection.save
|
|
44
|
+
subject.collection = collection
|
|
45
|
+
subject.save
|
|
46
|
+
|
|
47
|
+
@subject = subject.class.find(subject.pid)
|
|
48
|
+
|
|
49
|
+
assert_rels_ext(@subject, :is_part_of, [collection])
|
|
50
|
+
assert_active_fedora_belongs_to(@subject, :collection, collection)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
require_relative '../spec_helper'
|
|
2
|
+
require 'common_repository_model/collection'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Clothing < CommonRepositoryModel::Data
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
class Job < CommonRepositoryModel::Collection
|
|
9
|
+
has_and_belongs_to_many(
|
|
10
|
+
:people,
|
|
11
|
+
class_name: 'Person',
|
|
12
|
+
property: :has_workers,
|
|
13
|
+
inverse_of: :is_working_as
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class Family < CommonRepositoryModel::Collection
|
|
18
|
+
has_members(
|
|
19
|
+
:family_members,
|
|
20
|
+
class_name: 'Person',
|
|
21
|
+
property: :is_family_member_of
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class Person < CommonRepositoryModel::Collection
|
|
26
|
+
|
|
27
|
+
is_member_of(
|
|
28
|
+
:parents,
|
|
29
|
+
class_name: 'Person',
|
|
30
|
+
property: :is_child_of
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
has_members(
|
|
34
|
+
:children,
|
|
35
|
+
class_name: 'Person',
|
|
36
|
+
property: :is_child_of
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# People can be part of multiple families
|
|
40
|
+
is_member_of(
|
|
41
|
+
:families,
|
|
42
|
+
class_name: 'Family',
|
|
43
|
+
property: :is_family_member_of
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
has_and_belongs_to_many(
|
|
47
|
+
:jobs,
|
|
48
|
+
class_name: 'Job',
|
|
49
|
+
property: :is_working_as,
|
|
50
|
+
inverse_of: :has_workers
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe CommonRepositoryModel::Collection do
|
|
56
|
+
|
|
57
|
+
let(:family) { Family.new }
|
|
58
|
+
let(:lawyer) { Job.new }
|
|
59
|
+
let(:doctor) { Job.new }
|
|
60
|
+
let(:heathcliff) { Person.new }
|
|
61
|
+
let(:claire) { Person.new }
|
|
62
|
+
let(:theo) { Person.new }
|
|
63
|
+
let(:vanessa) { Person.new }
|
|
64
|
+
let(:rudy) { Person.new }
|
|
65
|
+
let(:dress) { Clothing.new(slot_name: 'outerwear') }
|
|
66
|
+
|
|
67
|
+
before(:all) do
|
|
68
|
+
family.save
|
|
69
|
+
|
|
70
|
+
lawyer.save
|
|
71
|
+
doctor.save
|
|
72
|
+
|
|
73
|
+
heathcliff.save
|
|
74
|
+
claire.save
|
|
75
|
+
theo.save
|
|
76
|
+
vanessa.save
|
|
77
|
+
rudy.save
|
|
78
|
+
|
|
79
|
+
dress.save
|
|
80
|
+
|
|
81
|
+
claire.children = [theo,vanessa,rudy]
|
|
82
|
+
claire.jobs << lawyer
|
|
83
|
+
claire.families << family
|
|
84
|
+
claire.data << dress
|
|
85
|
+
claire.save
|
|
86
|
+
|
|
87
|
+
heathcliff.children = [theo,vanessa,rudy]
|
|
88
|
+
heathcliff.jobs << doctor
|
|
89
|
+
heathcliff.families << family
|
|
90
|
+
heathcliff.save
|
|
91
|
+
|
|
92
|
+
theo.families << family
|
|
93
|
+
theo.save
|
|
94
|
+
vanessa.families << family
|
|
95
|
+
vanessa.save
|
|
96
|
+
rudy.families << family
|
|
97
|
+
rudy.save
|
|
98
|
+
|
|
99
|
+
family.family_members = [claire,heathcliff,theo,vanessa,rudy]
|
|
100
|
+
family.save.must_equal true
|
|
101
|
+
|
|
102
|
+
@dress = dress.class.find(dress.pid)
|
|
103
|
+
@theo = theo.class.find(theo.pid)
|
|
104
|
+
@family = family.class.find(family.pid)
|
|
105
|
+
@claire = claire.class.find(claire.pid)
|
|
106
|
+
@rudy = rudy.class.find(rudy.pid)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it 'verifies complicated relationships' do
|
|
110
|
+
# verify_initial_relations_for_family
|
|
111
|
+
# verify_initial_relations_for_theo
|
|
112
|
+
# verify_initial_relations_for_claire
|
|
113
|
+
# verify_initial_relations_for_dress
|
|
114
|
+
|
|
115
|
+
# verify_claire_adding_a_child
|
|
116
|
+
|
|
117
|
+
# verify_claire_losing_a_child
|
|
118
|
+
|
|
119
|
+
verify_rudy_losing_a_parent
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
protected
|
|
123
|
+
def verify_initial_relations_for_family
|
|
124
|
+
# We are not storing the RELS-EXT entry on the "container" collection
|
|
125
|
+
assert_rels_ext(
|
|
126
|
+
@family,
|
|
127
|
+
:has_family_members,
|
|
128
|
+
[]
|
|
129
|
+
)
|
|
130
|
+
assert_rels_ext(
|
|
131
|
+
@family,
|
|
132
|
+
:has_members,
|
|
133
|
+
[]
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# However, we do have access to Family#family_members
|
|
137
|
+
assert_active_fedora_has_many(
|
|
138
|
+
@family,
|
|
139
|
+
:family_members,
|
|
140
|
+
[@theo,@claire, heathcliff,rudy, vanessa]
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
assert_active_fedora_has_many(
|
|
144
|
+
@family,
|
|
145
|
+
:child_collections,
|
|
146
|
+
[@theo,@claire, heathcliff,rudy, vanessa]
|
|
147
|
+
)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def verify_initial_relations_for_theo
|
|
151
|
+
assert_rels_ext @theo, :is_child_of, [@claire, heathcliff]
|
|
152
|
+
assert_rels_ext @theo, :is_member_of, [@claire, family, heathcliff]
|
|
153
|
+
|
|
154
|
+
assert_active_fedora_has_many(@theo, :jobs, [])
|
|
155
|
+
assert_active_fedora_has_many(@theo, :families, [family])
|
|
156
|
+
assert_active_fedora_has_many(@theo, :parents, [heathcliff,claire])
|
|
157
|
+
assert_active_fedora_has_many(@theo, :child_collections, [])
|
|
158
|
+
assert_active_fedora_has_many(
|
|
159
|
+
@theo, :parent_collections, [heathcliff,claire,family]
|
|
160
|
+
)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def verify_initial_relations_for_dress
|
|
164
|
+
assert_rels_ext(@dress, :is_part_of, [@claire])
|
|
165
|
+
assert_active_fedora_belongs_to(@dress, :collection, @claire)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def verify_initial_relations_for_claire
|
|
169
|
+
assert_rels_ext @claire, :is_parent_of, []
|
|
170
|
+
assert_rels_ext @claire, :is_child_of, []
|
|
171
|
+
assert_rels_ext @claire, :is_family_member_of, [family]
|
|
172
|
+
assert_rels_ext @claire, :is_member_of, [family]
|
|
173
|
+
|
|
174
|
+
assert_active_fedora_has_many(@claire,:data,[@dress])
|
|
175
|
+
assert_active_fedora_has_many(@claire,:jobs,[lawyer])
|
|
176
|
+
assert_active_fedora_has_many(@claire,:families,[family])
|
|
177
|
+
assert_active_fedora_has_many(@claire,:children,[theo, rudy, vanessa])
|
|
178
|
+
assert_active_fedora_has_many(
|
|
179
|
+
@claire,:child_collections,[theo, rudy, vanessa]
|
|
180
|
+
)
|
|
181
|
+
assert_active_fedora_has_many(@claire,:parent_collections,[family])
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def verify_claire_adding_a_child
|
|
185
|
+
sandra = Person.new
|
|
186
|
+
sandra.save
|
|
187
|
+
@claire.children << sandra
|
|
188
|
+
@claire.save
|
|
189
|
+
@claire = @claire.class.find(@claire.pid)
|
|
190
|
+
|
|
191
|
+
assert_rels_ext @claire, :is_parent_of, []
|
|
192
|
+
assert_rels_ext @claire, :is_child_of, []
|
|
193
|
+
|
|
194
|
+
assert_active_fedora_has_many(@claire,:parents,[])
|
|
195
|
+
assert_active_fedora_has_many(@claire,:children,[theo, rudy, vanessa,sandra])
|
|
196
|
+
assert_active_fedora_has_many(
|
|
197
|
+
@claire,:child_collections,[theo, rudy, vanessa, sandra]
|
|
198
|
+
)
|
|
199
|
+
assert_active_fedora_has_many(
|
|
200
|
+
@claire,:parent_collections,[family]
|
|
201
|
+
)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def verify_claire_losing_a_child
|
|
205
|
+
@claire.children = [theo,rudy]
|
|
206
|
+
@claire.save
|
|
207
|
+
|
|
208
|
+
assert_active_fedora_has_many(@claire,:children,[theo, rudy])
|
|
209
|
+
assert_active_fedora_has_many(
|
|
210
|
+
@claire,:child_collections,[theo, rudy]
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
reloaded_vanessa = vanessa.class.find(vanessa.pid)
|
|
214
|
+
|
|
215
|
+
# Note, just because we said Claire was not Vanessa's parent, Vanessa did
|
|
216
|
+
# not update
|
|
217
|
+
assert_rels_ext reloaded_vanessa, :is_child_of, [claire, heathcliff]
|
|
218
|
+
assert_rels_ext(
|
|
219
|
+
reloaded_vanessa, :is_member_of, [claire, heathcliff, family]
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
assert_active_fedora_has_many(
|
|
223
|
+
reloaded_vanessa, :parents, [claire, heathcliff]
|
|
224
|
+
)
|
|
225
|
+
assert_active_fedora_has_many(
|
|
226
|
+
reloaded_vanessa, :parent_collections, [claire,heathcliff, family]
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def verify_rudy_losing_a_parent
|
|
232
|
+
assert_rels_ext @rudy, :is_child_of, [heathcliff,claire]
|
|
233
|
+
assert_rels_ext @rudy, :is_member_of, [heathcliff,claire,family]
|
|
234
|
+
assert_active_fedora_has_many @rudy, :parents, [heathcliff,claire]
|
|
235
|
+
assert_active_fedora_has_many(
|
|
236
|
+
@rudy, :parent_collections, [heathcliff,claire,family]
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
@rudy.break_relation_with_parents(heathcliff)
|
|
240
|
+
@rudy.save.must_equal true
|
|
241
|
+
|
|
242
|
+
assert_active_fedora_has_many(@rudy, :parents, [claire])
|
|
243
|
+
assert_active_fedora_has_many(@rudy, :parent_collections, [claire, family])
|
|
244
|
+
assert_rels_ext @rudy, :is_child_of, [claire]
|
|
245
|
+
assert_rels_ext @rudy, :is_member_of, [claire, family]
|
|
246
|
+
|
|
247
|
+
@rudy = @rudy.class.find(@rudy.pid)
|
|
248
|
+
|
|
249
|
+
assert_rels_ext @rudy, :is_child_of, [claire]
|
|
250
|
+
assert_rels_ext @rudy, :is_member_of, [claire, family]
|
|
251
|
+
|
|
252
|
+
assert_active_fedora_has_many(@rudy, :parents, [claire])
|
|
253
|
+
assert_active_fedora_has_many(@rudy, :parent_collections, [claire, family])
|
|
254
|
+
end
|
|
255
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# The default namespace maps to the default namespace for generating rels_ext from solr
|
|
2
|
+
:default_namespace: info:fedora/fedora-system:def/relations-external#
|
|
3
|
+
|
|
4
|
+
# namespace mappings---
|
|
5
|
+
# you can add specific mappings for your institution by providing the following:
|
|
6
|
+
# namespace_uri:
|
|
7
|
+
# :relationship_symbol: relationship_identifier
|
|
8
|
+
#
|
|
9
|
+
# For example, if you have the following element in your rels_ext:
|
|
10
|
+
#
|
|
11
|
+
# <oai:itemID>oai:example.edu:changeme:500</oai:itemID>
|
|
12
|
+
#
|
|
13
|
+
# With the last two lines of this file uncommented, the relationships hash of your object will include:
|
|
14
|
+
# :oai_item_id => ["info:fedora/oai:example.edu:changeme:500"]
|
|
15
|
+
#
|
|
16
|
+
:predicate_mapping:
|
|
17
|
+
info:common_repository_model#:
|
|
18
|
+
:is_member_of_area: isMemberOfArea
|
|
19
|
+
:has_members: hasMembers
|
|
20
|
+
:is_parent_of: isParentOf
|
|
21
|
+
:is_child_of: isChildOf
|
|
22
|
+
:is_family_member_of: isFamilyMemberOf
|
|
23
|
+
:has_family_members: hasFamilyMembers
|
|
24
|
+
:is_working_as: isWorkingAs
|
|
25
|
+
:has_workers: hasWorkers
|
|
26
|
+
info:fedora/fedora-system:def/relations-external#:
|
|
27
|
+
:conforms_to: conformsTo
|
|
28
|
+
:has_annotation: hasAnnotation
|
|
29
|
+
:has_collection_member: hasCollectionMember
|
|
30
|
+
:has_constituent: hasConstituent
|
|
31
|
+
:has_dependent: hasDependent
|
|
32
|
+
:has_derivation: hasDerivation
|
|
33
|
+
:has_description: hasDescription
|
|
34
|
+
:has_equivalent: hasEquivalent
|
|
35
|
+
:has_metadata: hasMetadata
|
|
36
|
+
:has_member: hasMember
|
|
37
|
+
:has_model: hasModel
|
|
38
|
+
:has_part: hasPart
|
|
39
|
+
:has_subset: hasSubset
|
|
40
|
+
:is_annotation_of: isAnnotationOf
|
|
41
|
+
:is_constituent_of: isConstituentOf
|
|
42
|
+
:is_dependent_of: isDependentOf
|
|
43
|
+
:is_derivation_of: isDerivationOf
|
|
44
|
+
:is_description_of: isDescriptionOf
|
|
45
|
+
:is_member_of: isMemberOf
|
|
46
|
+
:is_member_of_collection: isMemberOfCollection
|
|
47
|
+
:is_metadata_for: isMetadataFor
|
|
48
|
+
:is_part_of: isPartOf
|
|
49
|
+
:is_subset_of: isSubsetOf
|
|
50
|
+
:is_topic_of: isTopicOf
|
|
51
|
+
info:fedora/fedora-system:def/model#:
|
|
52
|
+
:is_contractor_of: isContractorOf
|
|
53
|
+
:is_deployment_of: isDeploymentOf
|
|
54
|
+
:has_service: hasService
|
|
55
|
+
:has_model: hasModel
|
|
56
|
+
http://www.openarchives.org/OAI/2.0/:
|
|
57
|
+
:oai_item_id: itemID
|
|
58
|
+
http://projecthydra.org/ns/relations#:
|
|
59
|
+
:is_governed_by: isGovernedBy
|
|
60
|
+
:is_image_of: isImageOf
|
|
61
|
+
:has_image: hasImage
|
|
62
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# This is a sample config file that does not have multiple solr instances. You will also need to be sure to
|
|
2
|
+
# edit the fedora.yml file to match the solr URL for active-fedora.
|
|
3
|
+
development:
|
|
4
|
+
url: http://localhost:8983/solr/development
|
|
5
|
+
test: &TEST
|
|
6
|
+
url: http://127.0.0.1:8983/solr/test
|
|
7
|
+
cucumber:
|
|
8
|
+
<<: *TEST
|
|
9
|
+
production:
|
|
10
|
+
url: http://localhost:80/solr/
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
|
2
|
+
require 'minitest/autorun'
|
|
3
|
+
require 'active_fedora'
|
|
4
|
+
ActiveFedora.init(
|
|
5
|
+
fedora_config_path: File.join(File.dirname(__FILE__),"config/fedora.yml"),
|
|
6
|
+
solr_config_path: File.join(File.dirname(__FILE__),"config/solr.yml"),
|
|
7
|
+
environment: :test
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MiniTest::Unit::TestCase
|
|
12
|
+
def assert_rels_ext(subject, predicate, objects = [])
|
|
13
|
+
assert_equal objects.count, subject.relationships(predicate).count
|
|
14
|
+
objects.each do |object|
|
|
15
|
+
internal_uri = object.respond_to?(:internal_uri) ?
|
|
16
|
+
object.internal_uri : object
|
|
17
|
+
assert subject.relationships(predicate).include?(internal_uri)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def assert_active_fedora_belongs_to(subject, method_name, object)
|
|
22
|
+
subject.send(method_name).must_equal object
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def assert_active_fedora_has_many(subject, method_name, objects)
|
|
26
|
+
association = subject.send(method_name)
|
|
27
|
+
assert_equal objects.count, association.count
|
|
28
|
+
objects.each do |object|
|
|
29
|
+
assert association.include?(object)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: common_repository_model
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- Jeremy Friesen
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2012-11-14 00:00:00.000000000 Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: activesupport
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
|
+
none: false
|
|
18
|
+
requirements:
|
|
19
|
+
- - ~>
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '3.2'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ~>
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '3.2'
|
|
30
|
+
- !ruby/object:Gem::Dependency
|
|
31
|
+
name: activemodel
|
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
|
33
|
+
none: false
|
|
34
|
+
requirements:
|
|
35
|
+
- - ~>
|
|
36
|
+
- !ruby/object:Gem::Version
|
|
37
|
+
version: '3.2'
|
|
38
|
+
type: :runtime
|
|
39
|
+
prerelease: false
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ~>
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '3.2'
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: builder
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
none: false
|
|
50
|
+
requirements:
|
|
51
|
+
- - ~>
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '3.0'
|
|
54
|
+
type: :runtime
|
|
55
|
+
prerelease: false
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
none: false
|
|
58
|
+
requirements:
|
|
59
|
+
- - ~>
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '3.0'
|
|
62
|
+
- !ruby/object:Gem::Dependency
|
|
63
|
+
name: minitest
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
65
|
+
none: false
|
|
66
|
+
requirements:
|
|
67
|
+
- - ! '>='
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
70
|
+
type: :runtime
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - ! '>='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '0'
|
|
78
|
+
- !ruby/object:Gem::Dependency
|
|
79
|
+
name: minitest-matchers
|
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
|
81
|
+
none: false
|
|
82
|
+
requirements:
|
|
83
|
+
- - ! '>='
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '0'
|
|
86
|
+
type: :runtime
|
|
87
|
+
prerelease: false
|
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
+
none: false
|
|
90
|
+
requirements:
|
|
91
|
+
- - ! '>='
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: '0'
|
|
94
|
+
- !ruby/object:Gem::Dependency
|
|
95
|
+
name: active-fedora
|
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
|
97
|
+
none: false
|
|
98
|
+
requirements:
|
|
99
|
+
- - ! '>='
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: '0'
|
|
102
|
+
type: :runtime
|
|
103
|
+
prerelease: false
|
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
105
|
+
none: false
|
|
106
|
+
requirements:
|
|
107
|
+
- - ! '>='
|
|
108
|
+
- !ruby/object:Gem::Version
|
|
109
|
+
version: '0'
|
|
110
|
+
description: Notre Dame's Common Fedora Repository Model
|
|
111
|
+
email:
|
|
112
|
+
- jeremy.n.friesen@gmail.com
|
|
113
|
+
executables: []
|
|
114
|
+
extensions: []
|
|
115
|
+
extra_rdoc_files: []
|
|
116
|
+
files:
|
|
117
|
+
- .gitignore
|
|
118
|
+
- .rvmrc
|
|
119
|
+
- Gemfile
|
|
120
|
+
- LICENSE.txt
|
|
121
|
+
- README.md
|
|
122
|
+
- Rakefile
|
|
123
|
+
- common_repository_model.gemspec
|
|
124
|
+
- lib/common_repository_model.rb
|
|
125
|
+
- lib/common_repository_model/area.rb
|
|
126
|
+
- lib/common_repository_model/collection.rb
|
|
127
|
+
- lib/common_repository_model/data.rb
|
|
128
|
+
- lib/common_repository_model/file_datastream.rb
|
|
129
|
+
- lib/common_repository_model/persistence_base.rb
|
|
130
|
+
- lib/common_repository_model/version.rb
|
|
131
|
+
- lib/generators/common_repository_model/collection/USAGE
|
|
132
|
+
- lib/generators/common_repository_model/collection/collection_generator.rb
|
|
133
|
+
- lib/generators/common_repository_model/collection/templates/collection.rb.erb
|
|
134
|
+
- lib/generators/common_repository_model/collection/templates/collection_spec.rb.erb
|
|
135
|
+
- spec/common_respository_model/area_spec.rb
|
|
136
|
+
- spec/common_respository_model/collection_spec.rb
|
|
137
|
+
- spec/common_respository_model/data_spec.rb
|
|
138
|
+
- spec/common_respository_model/file_datastream_spec.rb
|
|
139
|
+
- spec/common_respository_model/integration_spec.rb
|
|
140
|
+
- spec/common_respository_model/persistence_base_spec.rb
|
|
141
|
+
- spec/config/fedora.yml
|
|
142
|
+
- spec/config/predicate_mappings.yml
|
|
143
|
+
- spec/config/solr.yml
|
|
144
|
+
- spec/spec_helper.rb
|
|
145
|
+
homepage: https://github.com/ndlib/common_repository_model
|
|
146
|
+
licenses: []
|
|
147
|
+
post_install_message:
|
|
148
|
+
rdoc_options: []
|
|
149
|
+
require_paths:
|
|
150
|
+
- lib
|
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
|
+
none: false
|
|
153
|
+
requirements:
|
|
154
|
+
- - ! '>='
|
|
155
|
+
- !ruby/object:Gem::Version
|
|
156
|
+
version: '0'
|
|
157
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
|
+
none: false
|
|
159
|
+
requirements:
|
|
160
|
+
- - ! '>='
|
|
161
|
+
- !ruby/object:Gem::Version
|
|
162
|
+
version: '0'
|
|
163
|
+
requirements: []
|
|
164
|
+
rubyforge_project:
|
|
165
|
+
rubygems_version: 1.8.24
|
|
166
|
+
signing_key:
|
|
167
|
+
specification_version: 3
|
|
168
|
+
summary: Notre Dame's Common Fedora Repository Model
|
|
169
|
+
test_files:
|
|
170
|
+
- spec/common_respository_model/area_spec.rb
|
|
171
|
+
- spec/common_respository_model/collection_spec.rb
|
|
172
|
+
- spec/common_respository_model/data_spec.rb
|
|
173
|
+
- spec/common_respository_model/file_datastream_spec.rb
|
|
174
|
+
- spec/common_respository_model/integration_spec.rb
|
|
175
|
+
- spec/common_respository_model/persistence_base_spec.rb
|
|
176
|
+
- spec/config/fedora.yml
|
|
177
|
+
- spec/config/predicate_mappings.yml
|
|
178
|
+
- spec/config/solr.yml
|
|
179
|
+
- spec/spec_helper.rb
|