darlingtonia 1.1.0 → 1.2.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
  SHA256:
3
- metadata.gz: 4b822b291286cddbaf96726161ebfaf758f9491743d4b4daaf78a04182ef4ffe
4
- data.tar.gz: 2c0ff5b15a5e1875acf7586754e52c79495c388f2efdde899047f372a01ca778
3
+ metadata.gz: 3b768a91873e3babd0452c60bdae4ec16cdb9e4dd82ba11348da870cd2718caa
4
+ data.tar.gz: 838674e6713c47f02fd396cfa9d7e5a4c55bd224233480328cb7bd446e3d75d2
5
5
  SHA512:
6
- metadata.gz: 87891bbce7ba7f2c27d3f9a4394885ea0d8d142baf519daacd67ab2323b6b99da984458cf92457c3a469ebb137b8ff146f74f14e480ea6eeceb03f4842c58242
7
- data.tar.gz: 27d66a21d1f8600cf177e31289a866d864a6f2df1106be8af42ae7b7ef4adb641915085f19fc70ab666fd126cfa8f8f026c8b948f473e61e33750696dd212530
6
+ metadata.gz: daf5e4640835d53b20add56ee20831a2f72fcd35e1721ace5a5c1f4c61555be3b1108d06b64432d606db2f791551670650f820779a29603475ef217410c2ae48
7
+ data.tar.gz: 6ed73cc4f53109eb1424ebab19e7f8246eb248f99a7fd900cadd12f296f6fe22a09904f9438dbc32c7139b5166ca464845c6626e3b4f80a0864a6c38762f7a6f
@@ -9,12 +9,35 @@ Lint/HandleExceptions:
9
9
  - 'spec/**/*'
10
10
  - 'lib/darlingtonia/spec/**/*'
11
11
 
12
+ Metrics/AbcSize:
13
+ Exclude:
14
+ - 'spec/support/hyrax/basic_metadata.rb'
15
+
12
16
  Metrics/BlockLength:
13
17
  Exclude:
14
18
  - 'spec/**/*'
15
19
  - 'lib/darlingtonia/spec/**/*'
16
20
 
21
+ Metrics/LineLength:
22
+ Exclude:
23
+ - 'lib/darlingtonia/hyrax_basic_metadata_mapper.rb'
24
+
25
+ Metrics/MethodLength:
26
+ Exclude:
27
+ - 'spec/support/hyrax/basic_metadata.rb'
28
+ - 'lib/darlingtonia/hyrax_basic_metadata_mapper.rb'
29
+
17
30
  RSpec/DescribeClass:
18
31
  Exclude:
19
32
  - 'spec/integration/**/*'
20
33
  - 'spec/*_spec.rb'
34
+
35
+ RSpec/ExampleLength:
36
+ Exclude:
37
+ - 'spec/darlingtonia/hyrax_basic_metadata_mapper_spec.rb'
38
+ - 'spec/integration/import_hyrax_csv.rb'
39
+
40
+ RSpec/MultipleExpectations:
41
+ Exclude:
42
+ - 'spec/darlingtonia/hyrax_basic_metadata_mapper_spec.rb'
43
+ - 'spec/integration/import_hyrax_csv.rb'
@@ -4,11 +4,8 @@ cache: bundler
4
4
  dist: trusty
5
5
 
6
6
  rvm:
7
- - 2.3.4
8
- - 2.4
9
- - 2.5
7
+ - 2.3.8
8
+ - 2.4.5
9
+ - 2.5.3
10
10
  script:
11
11
  - bundle exec rake
12
- matrix:
13
- allow_failures:
14
- - rvm: 2.5
@@ -8,13 +8,12 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Darlingtonia::VERSION
9
9
  gem.platform = Gem::Platform::RUBY
10
10
  gem.authors = ['Tom Johnson', 'Data Curation Experts']
11
- gem.email = 'tom@curationexperts.com'
11
+ gem.email = ['administrator@curationexperts.com']
12
12
  gem.summary = 'Hyrax importers.'
13
13
  gem.license = 'Apache-2.0'
14
14
  gem.files = %w[AUTHORS CHANGELOG.md README.md LICENSE] +
15
15
  Dir.glob('lib/**/*.rb')
16
16
  gem.require_paths = %w[lib]
17
- gem.has_rdoc = false
18
17
 
19
18
  gem.required_ruby_version = '>= 2.3.4'
20
19
 
@@ -25,7 +24,7 @@ Gem::Specification.new do |gem|
25
24
  gem.add_development_dependency 'hyrax-spec', '~> 0.2'
26
25
  gem.add_development_dependency 'rspec', '~> 3.6'
27
26
  gem.add_development_dependency 'coveralls', '~> 0.8'
28
- gem.add_development_dependency 'solr_wrapper', '~> 0.3'
27
+ gem.add_development_dependency 'solr_wrapper', '~> 2.1'
29
28
  gem.add_development_dependency 'fcrepo_wrapper', '~> 0.9'
30
29
 
31
30
  gem.files = `git ls-files`.split("\n")
@@ -54,6 +54,7 @@ module Darlingtonia
54
54
  require 'darlingtonia/version'
55
55
  require 'darlingtonia/metadata_mapper'
56
56
  require 'darlingtonia/hash_mapper'
57
+ require 'darlingtonia/hyrax_basic_metadata_mapper'
57
58
 
58
59
  require 'darlingtonia/importer'
59
60
  require 'darlingtonia/record_importer'
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Darlingtonia
4
+ ##
5
+ # A mapper for Hyrax metadata.
6
+ #
7
+ # Maps from hash accessor syntax (`['title']`) to method call dot syntax (`.title`).
8
+ #
9
+ # The fields provided by this mapper are the same as the properties defined in `Hyrax::CoreMetadata` and `Hyrax::BasicMetadata`.
10
+ #
11
+ # @note This mapper allows you to set values for all the Hyrax fields, but depending on how you create the records, some of the values might get clobbered. For example, if you use Hyrax's actor stack to create records, it might overwrite fields like `date_modified` or `depositor`.
12
+ #
13
+ # @see HashMapper Parent class for more info and examples.
14
+ class HyraxBasicMetadataMapper < HashMapper
15
+ ##
16
+ # @return [Enumerable<Symbol>] The fields the mapper can process.
17
+ def fields
18
+ core_fields + basic_fields
19
+ end
20
+
21
+ # Properties defined with `multiple: false` in
22
+ # Hyrax should return a single value instead of
23
+ # an Array of values.
24
+ def depositor
25
+ metadata['depositor']
26
+ end
27
+
28
+ def date_uploaded
29
+ metadata['date_uploaded']
30
+ end
31
+
32
+ def date_modified
33
+ metadata['date_modified']
34
+ end
35
+
36
+ def label
37
+ metadata['label']
38
+ end
39
+
40
+ def relative_path
41
+ metadata['relative_path']
42
+ end
43
+
44
+ def import_url
45
+ metadata['import_url']
46
+ end
47
+
48
+ ##
49
+ # @return [String] The delimiter that will be used to split a metadata field into separate values.
50
+ # @example
51
+ # mapper = HyraxBasicMetadataMapper.new
52
+ # mapper.metadata = { 'language' => 'English|~|French|~|Japanese' }
53
+ # mapper.language = ['English', 'French', 'Japanese']
54
+ #
55
+ def delimiter
56
+ @delimiter ||= '|~|'
57
+ end
58
+ attr_writer :delimiter
59
+
60
+ ##
61
+ # @see MetadataMapper#map_field
62
+ def map_field(name)
63
+ Array(metadata[name.to_s]&.split(delimiter))
64
+ end
65
+
66
+ protected
67
+
68
+ # Properties defined in Hyrax::CoreMetadata
69
+ def core_fields
70
+ [:depositor, :title, :date_uploaded, :date_modified]
71
+ end
72
+
73
+ # Properties defined in Hyrax::BasicMetadata
74
+ def basic_fields
75
+ [:label, :relative_path, :import_url,
76
+ :resource_type, :creator, :contributor,
77
+ :description, :keyword, :license,
78
+ :rights_statement, :publisher, :date_created,
79
+ :subject, :language, :identifier,
80
+ :based_near, :related_url,
81
+ :bibliographic_citation, :source]
82
+ end
83
+ end
84
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Darlingtonia
4
- VERSION = '1.1.0'
4
+ VERSION = '1.2.2'
5
5
  end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ describe Darlingtonia::HyraxBasicMetadataMapper do
5
+ let(:mapper) { described_class.new }
6
+
7
+ # Properties defined in Hyrax::CoreMetadata
8
+ let(:core_fields) do
9
+ [:depositor, :title, :date_uploaded, :date_modified]
10
+ end
11
+
12
+ # Properties defined in Hyrax::BasicMetadata
13
+ let(:basic_fields) do
14
+ [:label, :relative_path, :import_url,
15
+ :resource_type, :creator, :contributor,
16
+ :description, :keyword, :license,
17
+ :rights_statement, :publisher, :date_created,
18
+ :subject, :language, :identifier, :based_near,
19
+ :related_url, :bibliographic_citation, :source]
20
+ end
21
+
22
+ it_behaves_like 'a Darlingtonia::Mapper' do
23
+ let(:metadata) do
24
+ { title: ['A Title for a Record'],
25
+ my_custom_field: ['This gets ignored'] }
26
+ end
27
+ let(:expected_fields) { core_fields + basic_fields }
28
+ end
29
+
30
+ context 'with metadata, but some missing fields' do
31
+ before { mapper.metadata = metadata }
32
+ let(:metadata) do
33
+ { 'depositor' => 'someone@example.org',
34
+ 'title' => 'A Title',
35
+ 'language' => 'English' }
36
+ end
37
+
38
+ it 'provides methods for the fields, even fields that aren\'t included in the metadata' do
39
+ expect(metadata).to include('title')
40
+ expect(mapper).to respond_to(:title)
41
+
42
+ expect(metadata).not_to include('label')
43
+ expect(mapper).to respond_to(:label)
44
+ end
45
+
46
+ it 'returns single values for single-value fields' do
47
+ expect(mapper.depositor).to eq 'someone@example.org'
48
+ expect(mapper.date_uploaded).to eq nil
49
+ expect(mapper.date_modified).to eq nil
50
+ expect(mapper.label).to eq nil
51
+ expect(mapper.relative_path).to eq nil
52
+ expect(mapper.import_url).to eq nil
53
+ end
54
+
55
+ it 'returns array values for multi-value fields' do
56
+ expect(mapper.title).to eq ['A Title']
57
+ expect(mapper.language).to eq ['English']
58
+ expect(mapper.keyword).to eq []
59
+ expect(mapper.subject).to eq []
60
+ end
61
+ end
62
+
63
+ context 'fields with multiple values' do
64
+ before { mapper.metadata = metadata }
65
+ let(:metadata) do
66
+ { 'title' => 'A Title',
67
+ 'language' => 'English|~|French|~|Japanese' }
68
+ end
69
+
70
+ it 'splits the values using the delimiter' do
71
+ expect(mapper.title).to eq ['A Title']
72
+ expect(mapper.language).to eq ['English', 'French', 'Japanese']
73
+ expect(mapper.keyword).to eq []
74
+ end
75
+
76
+ it 'can set a different delimiter' do
77
+ expect(mapper.delimiter).to eq '|~|'
78
+ mapper.delimiter = 'ಠ_ಠ'
79
+ expect(mapper.delimiter).to eq 'ಠ_ಠ'
80
+ end
81
+ end
82
+ end
@@ -17,6 +17,7 @@ describe Darlingtonia::RecordImporter, :clean do
17
17
  end
18
18
 
19
19
  context 'with a registered work type' do
20
+ load File.expand_path("../../support/shared_contexts/with_work_type.rb", __FILE__)
20
21
  include_context 'with a work type'
21
22
 
22
23
  it 'creates a work for record' do
@@ -0,0 +1,3 @@
1
+ title,depositor,date_uploaded,date_modified,label,relative_path,import_url,resource_type,creator,contributor,description,keyword,license,rights_statement,publisher,date_created,subject,language,identifier,based_near,related_url,bibliographic_citation,source
2
+ Work 1 Title,user@example.com,2018-12-21,2018-01-01,Work 1 Label,tmp/files,https://example.com,Work 1 Type,Work 1 creator,Work 1 contrib,Desc 1,Key 1,Lic 1,RS 1,Pub 1,2018-06-06,Subj 1,English|~|Japanese,Ident 1,Based 1,https://example.com/related,Bib 1,Source 1
3
+ Work 2 Title,,1970-12-21,,Work 2 Label,,,Work 2 Type,,,Desc 2,,,,Pub 2,,Subj 2
@@ -7,6 +7,7 @@ describe 'importing a csv batch', :clean do
7
7
  let(:parser) { Darlingtonia::CsvParser.new(file: file) }
8
8
  let(:file) { File.open('spec/fixtures/example.csv') }
9
9
 
10
+ load File.expand_path("../../support/shared_contexts/with_work_type.rb", __FILE__)
10
11
  include_context 'with a work type'
11
12
 
12
13
  it 'creates a record for each CSV line' do
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+
4
+ describe 'importing a CSV with Hyrax defaults', :clean do
5
+ subject(:importer) { Darlingtonia::Importer.new(parser: parser) }
6
+ let(:parser) { Darlingtonia::CsvParser.new(file: csv_file) }
7
+
8
+ let(:csv_file) { File.open('spec/fixtures/hyrax/example.csv') }
9
+ after { csv_file.close }
10
+
11
+ before do
12
+ # Force it to use the Hyrax mapper instead of the default mapper
13
+ allow(Darlingtonia::HashMapper).to receive(:new).and_return(Darlingtonia::HyraxBasicMetadataMapper.new)
14
+ end
15
+
16
+ load File.expand_path("../../support/shared_contexts/with_work_type.rb", __FILE__)
17
+ include_context 'with a work type'
18
+
19
+ it 'creates the record(s)' do
20
+ expect { importer.import }.to change { Work.count }.to 2
21
+
22
+ works = Work.all
23
+ work1 = works.find { |w| w.title == ['Work 1 Title'] }
24
+ work2 = works.find { |w| w.title == ['Work 2 Title'] }
25
+
26
+ # First Record
27
+ expect(work1.depositor).to eq 'user@example.com'
28
+ expect(work1.date_uploaded).to eq '2018-12-21'
29
+ expect(work1.date_modified).to eq '2018-01-01'
30
+ expect(work1.label).to eq 'Work 1 Label'
31
+ expect(work1.relative_path).to eq 'tmp/files'
32
+ expect(work1.import_url).to eq 'https://example.com'
33
+ expect(work1.resource_type).to eq ['Work 1 Type']
34
+ expect(work1.creator).to eq ['Work 1 creator']
35
+ expect(work1.contributor).to eq ['Work 1 contrib']
36
+ expect(work1.description).to eq ['Desc 1']
37
+ expect(work1.keyword).to eq ['Key 1']
38
+ expect(work1.license).to eq ['Lic 1']
39
+ expect(work1.rights_statement).to eq ['RS 1']
40
+ expect(work1.publisher).to eq ['Pub 1']
41
+ expect(work1.date_created).to eq ['2018-06-06']
42
+ expect(work1.subject).to eq ['Subj 1']
43
+
44
+ # An example with 2 values
45
+ expect(work1.language).to contain_exactly('English', 'Japanese')
46
+
47
+ expect(work1.identifier).to eq ['Ident 1']
48
+ expect(work1.based_near).to eq ['Based 1']
49
+ expect(work1.related_url).to eq ['https://example.com/related']
50
+ expect(work1.bibliographic_citation).to eq ['Bib 1']
51
+ expect(work1.source).to eq ['Source 1']
52
+
53
+ # Second Record
54
+ expect(work2.depositor).to be_nil
55
+ expect(work2.date_uploaded).to eq '1970-12-21'
56
+ expect(work2.date_modified).to be_nil
57
+ expect(work2.label).to eq 'Work 2 Label'
58
+ expect(work2.relative_path).to be_nil
59
+ expect(work2.import_url).to be_nil
60
+ expect(work2.resource_type).to eq ['Work 2 Type']
61
+ expect(work2.creator).to eq []
62
+ expect(work2.contributor).to eq []
63
+ expect(work2.description).to eq ['Desc 2']
64
+ expect(work2.keyword).to eq []
65
+ expect(work2.license).to eq []
66
+ expect(work2.rights_statement).to eq []
67
+ expect(work2.publisher).to eq ['Pub 2']
68
+ expect(work2.date_created).to eq []
69
+ expect(work2.subject).to eq ['Subj 2']
70
+ expect(work2.language).to eq []
71
+ expect(work2.identifier).to eq []
72
+ expect(work2.based_near).to eq []
73
+ expect(work2.related_url).to eq []
74
+ expect(work2.bibliographic_citation).to eq []
75
+ expect(work2.source).to eq []
76
+ end
77
+ end
@@ -9,8 +9,6 @@ require 'active_fedora/cleaner'
9
9
  require 'darlingtonia'
10
10
  require 'darlingtonia/spec'
11
11
 
12
- Dir['./spec/support/**/*.rb'].each { |f| require f }
13
-
14
12
  RSpec.configure do |config|
15
13
  config.filter_run focus: true
16
14
  config.run_all_when_everything_filtered = true
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hyrax
4
+ module BasicMetadata
5
+ def self.included(work)
6
+ work.property :label, predicate: ActiveFedora::RDF::Fcrepo::Model.downloadFilename, multiple: false
7
+ work.property :relative_path, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#relativePath'), multiple: false
8
+ work.property :import_url, predicate: ::RDF::URI.new('http://scholarsphere.psu.edu/ns#importUrl'), multiple: false
9
+ work.property :resource_type, predicate: ::RDF::Vocab::DC.type
10
+ work.property :creator, predicate: ::RDF::Vocab::DC11.creator
11
+ work.property :contributor, predicate: ::RDF::Vocab::DC11.contributor
12
+ work.property :description, predicate: ::RDF::Vocab::DC11.description
13
+ work.property :keyword, predicate: ::RDF::Vocab::DC11.relation
14
+ work.property :license, predicate: ::RDF::Vocab::DC.rights
15
+ work.property :rights_statement, predicate: ::RDF::Vocab::EDM.rights
16
+ work.property :publisher, predicate: ::RDF::Vocab::DC11.publisher
17
+ work.property :date_created, predicate: ::RDF::Vocab::DC.created
18
+ work.property :subject, predicate: ::RDF::Vocab::DC11.subject
19
+ work.property :language, predicate: ::RDF::Vocab::DC11.language
20
+ work.property :identifier, predicate: ::RDF::Vocab::DC.identifier
21
+
22
+ # Note: based_near is defined differently here than in Hyrax.
23
+ work.property :based_near, predicate: ::RDF::Vocab::FOAF.based_near
24
+
25
+ work.property :related_url, predicate: ::RDF::RDFS.seeAlso
26
+ work.property :bibliographic_citation, predicate: ::RDF::Vocab::DC.bibliographicCitation
27
+ work.property :source, predicate: ::RDF::Vocab::DC.source
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hyrax
4
+ module CoreMetadata
5
+ def self.included(work)
6
+ work.property :depositor, predicate: ::RDF::URI.new('http://id.loc.gov/vocabulary/relators/dpt'), multiple: false
7
+
8
+ work.property :title, predicate: ::RDF::Vocab::DC.title
9
+
10
+ work.property :date_uploaded, predicate: ::RDF::Vocab::DC.dateSubmitted, multiple: false
11
+
12
+ work.property :date_modified, predicate: ::RDF::Vocab::DC.modified, multiple: false
13
+ end
14
+ end
15
+ end
@@ -3,9 +3,12 @@
3
3
  shared_context 'with a work type' do
4
4
  # A work type must be defined for the default `RecordImporter` to save objects
5
5
  before do
6
+ load './spec/support/hyrax/core_metadata.rb'
7
+ load './spec/support/hyrax/basic_metadata.rb'
8
+
6
9
  class Work < ActiveFedora::Base
7
- property :title, predicate: ::RDF::URI('http://example.com/title')
8
- property :description, predicate: ::RDF::URI('http://example.com/description')
10
+ include ::Hyrax::CoreMetadata
11
+ include ::Hyrax::BasicMetadata
9
12
  end
10
13
 
11
14
  module Hyrax
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: darlingtonia
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Johnson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-12-18 00:00:00.000000000 Z
12
+ date: 2019-01-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: active-fedora
@@ -107,14 +107,14 @@ dependencies:
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.3'
110
+ version: '2.1'
111
111
  type: :development
112
112
  prerelease: false
113
113
  version_requirements: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '0.3'
117
+ version: '2.1'
118
118
  - !ruby/object:Gem::Dependency
119
119
  name: fcrepo_wrapper
120
120
  requirement: !ruby/object:Gem::Requirement
@@ -130,7 +130,8 @@ dependencies:
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0.9'
132
132
  description:
133
- email: tom@curationexperts.com
133
+ email:
134
+ - administrator@curationexperts.com
134
135
  executables: []
135
136
  extensions: []
136
137
  extra_rdoc_files: []
@@ -146,6 +147,7 @@ files:
146
147
  - lib/darlingtonia.rb
147
148
  - lib/darlingtonia/always_invalid_validator.rb
148
149
  - lib/darlingtonia/hash_mapper.rb
150
+ - lib/darlingtonia/hyrax_basic_metadata_mapper.rb
149
151
  - lib/darlingtonia/importer.rb
150
152
  - lib/darlingtonia/input_record.rb
151
153
  - lib/darlingtonia/metadata_mapper.rb
@@ -167,6 +169,7 @@ files:
167
169
  - spec/darlingtonia/csv_parser_spec.rb
168
170
  - spec/darlingtonia/formatted_message_stream_spec.rb
169
171
  - spec/darlingtonia/hash_mapper_spec.rb
172
+ - spec/darlingtonia/hyrax_basic_metadata_mapper_spec.rb
170
173
  - spec/darlingtonia/importer_spec.rb
171
174
  - spec/darlingtonia/input_record_spec.rb
172
175
  - spec/darlingtonia/parser_spec.rb
@@ -177,9 +180,13 @@ files:
177
180
  - spec/darlingtonia_spec.rb
178
181
  - spec/fixtures/bad_example.csv
179
182
  - spec/fixtures/example.csv
183
+ - spec/fixtures/hyrax/example.csv
180
184
  - spec/integration/import_csv_spec.rb
185
+ - spec/integration/import_hyrax_csv.rb
181
186
  - spec/spec_helper.rb
182
187
  - spec/stdout_stream_spec.rb
188
+ - spec/support/hyrax/basic_metadata.rb
189
+ - spec/support/hyrax/core_metadata.rb
183
190
  - spec/support/shared_contexts/with_work_type.rb
184
191
  homepage:
185
192
  licenses: