bulkrax 5.1.0 → 5.2.0
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.
- checksums.yaml +4 -4
- data/app/controllers/bulkrax/importers_controller.rb +3 -4
- data/app/helpers/bulkrax/validation_helper.rb +4 -4
- data/app/jobs/bulkrax/create_relationships_job.rb +3 -0
- data/app/jobs/bulkrax/import_work_job.rb +20 -7
- data/app/jobs/bulkrax/importer_job.rb +1 -1
- data/app/jobs/bulkrax/schedule_relationships_job.rb +2 -1
- data/app/matchers/bulkrax/application_matcher.rb +1 -0
- data/app/models/bulkrax/csv_entry.rb +93 -24
- data/app/models/bulkrax/exporter.rb +3 -12
- data/app/models/bulkrax/importer.rb +1 -1
- data/app/models/bulkrax/pending_relationship.rb +1 -1
- data/app/models/concerns/bulkrax/dynamic_record_lookup.rb +1 -1
- data/app/models/concerns/bulkrax/export_behavior.rb +6 -4
- data/app/models/concerns/bulkrax/has_matchers.rb +1 -0
- data/app/models/concerns/bulkrax/import_behavior.rb +6 -3
- data/app/models/concerns/bulkrax/importer_exporter_behavior.rb +9 -1
- data/app/parsers/bulkrax/application_parser.rb +14 -16
- data/app/parsers/bulkrax/bagit_parser.rb +5 -16
- data/app/parsers/bulkrax/csv_parser.rb +43 -111
- data/app/parsers/bulkrax/oai_dc_parser.rb +2 -2
- data/app/parsers/bulkrax/parser_export_record_set.rb +281 -0
- data/app/parsers/bulkrax/xml_parser.rb +9 -5
- data/app/services/bulkrax/remove_relationships_for_importer.rb +4 -2
- data/app/views/bulkrax/entries/show.html.erb +1 -1
- data/app/views/bulkrax/exporters/_form.html.erb +32 -33
- data/app/views/bulkrax/exporters/index.html.erb +2 -2
- data/app/views/bulkrax/exporters/show.html.erb +3 -3
- data/app/views/bulkrax/importers/_bagit_fields.html.erb +13 -12
- data/app/views/bulkrax/importers/_csv_fields.html.erb +13 -12
- data/app/views/bulkrax/importers/_oai_fields.html.erb +12 -10
- data/app/views/bulkrax/importers/_xml_fields.html.erb +12 -11
- data/app/views/bulkrax/importers/show.html.erb +18 -16
- data/app/views/bulkrax/shared/_collection_entries_tab.html.erb +6 -6
- data/app/views/bulkrax/shared/_file_set_entries_tab.html.erb +6 -6
- data/app/views/bulkrax/shared/_work_entries_tab.html.erb +6 -6
- data/config/locales/bulkrax.en.yml +26 -0
- data/lib/bulkrax/entry_spec_helper.rb +17 -0
- data/lib/bulkrax/version.rb +1 -1
- data/lib/bulkrax.rb +119 -46
- data/lib/generators/bulkrax/templates/config/initializers/bulkrax.rb +1 -1
- data/lib/tasks/reset.rake +1 -1
- metadata +7 -6
@@ -1,7 +1,7 @@
|
|
1
1
|
<% provide :page_header do %>
|
2
2
|
<h1><span class="fa fa-cloud-download" aria-hidden="true"></span> Exporters</h1>
|
3
3
|
<div class="pull-right">
|
4
|
-
<%= link_to new_exporter_path, class: 'btn btn-primary' do %>
|
4
|
+
<%= link_to new_exporter_path, class: 'btn btn-primary', data: { turbolinks: false } do %>
|
5
5
|
<span class="fa fa-edit" aria-hidden="true"></span> <%= t(:'helpers.action.exporter.new') %>
|
6
6
|
<% end %>
|
7
7
|
</div>
|
@@ -42,7 +42,7 @@
|
|
42
42
|
<% end%>
|
43
43
|
</td>
|
44
44
|
<td><%= link_to raw('<span class="glyphicon glyphicon-info-sign"></span>'), exporter_path(exporter) %></td>
|
45
|
-
<td><%= link_to raw('<span class="glyphicon glyphicon-pencil"></span>'), edit_exporter_path(exporter) %></td>
|
45
|
+
<td><%= link_to raw('<span class="glyphicon glyphicon-pencil"></span>'), edit_exporter_path(exporter), data: { turbolinks: false } %></td>
|
46
46
|
<td><%= link_to raw('<span class="glyphicon glyphicon-remove"></span>'), exporter, method: :delete, data: { confirm: 'Are you sure?' } %></td>
|
47
47
|
</tr>
|
48
48
|
<% end %>
|
@@ -96,9 +96,9 @@
|
|
96
96
|
<div class="bulkrax-nav-tab-bottom-margin">
|
97
97
|
<!-- Nav tabs -->
|
98
98
|
<ul class="bulkrax-nav-tab-top-margin tab-nav nav nav-tabs" role="tablist">
|
99
|
-
<li role="presentation" class='active'><a href="#work-entries" aria-controls="work-entries" role="tab" data-toggle="tab"
|
100
|
-
<li role="presentation"><a href="#collection-entries" aria-controls="collection-entries" role="tab" data-toggle="tab"
|
101
|
-
<li role="presentation"><a href="#file-set-entries" aria-controls="file-set-entries" role="tab" data-toggle="tab"
|
99
|
+
<li role="presentation" class='active'><a href="#work-entries" aria-controls="work-entries" role="tab" data-toggle="tab"><%= t('bulkrax.exporter.labels.work_entries') %></a></li>
|
100
|
+
<li role="presentation"><a href="#collection-entries" aria-controls="collection-entries" role="tab" data-toggle="tab"><%= t('bulkrax.exporter.labels.collection_entries') %></a></li>
|
101
|
+
<li role="presentation"><a href="#file-set-entries" aria-controls="file-set-entries" role="tab" data-toggle="tab"><%= t('bulkrax.exporter.labels.file_set_entries') %></a></li>
|
102
102
|
</ul>
|
103
103
|
<!-- Tab panes -->
|
104
104
|
<div class="tab-content outline">
|
@@ -24,17 +24,18 @@
|
|
24
24
|
input_html: { class: 'form-control' }
|
25
25
|
%>
|
26
26
|
|
27
|
-
<%
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
27
|
+
<% if defined?(::Hyrax) %>
|
28
|
+
<% rights_statements = Hyrax.config.rights_statement_service_class.new %>
|
29
|
+
<%= fi.input :rights_statement,
|
30
|
+
collection: rights_statements.select_active_options,
|
31
|
+
selected: importer.parser_fields['rights_statement'],
|
32
|
+
include_blank: true,
|
33
|
+
item_helper: rights_statements.method(:include_current_value),
|
34
|
+
input_html: { class: 'form-control' } ,
|
35
|
+
required: false
|
36
|
+
%>
|
37
|
+
<%= fi.input :override_rights_statement, as: :boolean, hint: 'If checked, always use the selected rights statment. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank.', input_html: { checked: (importer.parser_fields['override_rights_statement'] == "1") } %>
|
38
|
+
<% end %>
|
38
39
|
<h4>Bag or Bags to Import:</h4>
|
39
40
|
<p>File upload and Cloud File upload must be a Zip file containing a single BagIt Bag, or a folder containing multiple BagIt Bags.</p>
|
40
41
|
<p>The Server Path can point to a BagIt Bag, a folder containing BagIt Bags, or a zip file containing either.</p>
|
@@ -47,7 +48,7 @@
|
|
47
48
|
<%= fi.input :import_file_path, as: :string, input_html: { value: importer.parser_fields['import_file_path'] } %>
|
48
49
|
</div>
|
49
50
|
<div id='cloud'>
|
50
|
-
<% if Hyrax.config.browse_everything? %>
|
51
|
+
<% if defined?(::Hyrax) && Hyrax.config.browse_everything? %>
|
51
52
|
<%= render 'browse_everything', form: form %>
|
52
53
|
<% end %>
|
53
54
|
</div>
|
@@ -9,17 +9,18 @@
|
|
9
9
|
input_html: { class: 'form-control' }
|
10
10
|
%>
|
11
11
|
|
12
|
-
<%
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
<% if defined?(::Hyrax) %>
|
13
|
+
<% rights_statements = Hyrax.config.rights_statement_service_class.new %>
|
14
|
+
<%= fi.input :rights_statement,
|
15
|
+
collection: rights_statements.select_active_options,
|
16
|
+
selected: importer.parser_fields['rights_statement'],
|
17
|
+
include_blank: true,
|
18
|
+
item_helper: rights_statements.method(:include_current_value),
|
19
|
+
input_html: { class: 'form-control' },
|
20
|
+
required: false
|
21
|
+
%>
|
22
|
+
<%= fi.input :override_rights_statement, as: :boolean, hint: 'If checked, always use the selected rights statment. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank.', input_html: { checked: (importer.parser_fields['override_rights_statement'] == "1") } %>
|
23
|
+
<% end %>
|
23
24
|
<h4>Add CSV File to Import:</h4>
|
24
25
|
<%# accept a single file upload; data files and bags will need to be added another way %>
|
25
26
|
|
@@ -30,7 +31,7 @@
|
|
30
31
|
<div id='file_path'>
|
31
32
|
<%= fi.input :import_file_path, as: :string, input_html: { value: importer.parser_fields['import_file_path'] } %>
|
32
33
|
</div>
|
33
|
-
<% if Hyrax.config.browse_everything? %>
|
34
|
+
<% if defined?(::Hyrax) && Hyrax.config.browse_everything? %>
|
34
35
|
<h4>Add Files to Import:</h4>
|
35
36
|
<p>Choose files to upload. The filenames must be unique, and the filenames must be referenced in a column called 'file' in the accompanying CSV file.</p>
|
36
37
|
<%= render 'browse_everything', form: form %>
|
@@ -15,16 +15,18 @@
|
|
15
15
|
input_html: { class: 'form-control' }
|
16
16
|
%>
|
17
17
|
|
18
|
-
<%
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
18
|
+
<% if defined?(::Hyrax) %>
|
19
|
+
<% rights_statements = Hyrax.config.rights_statement_service_class.new %>
|
20
|
+
<%= fi.input :rights_statement,
|
21
|
+
collection: rights_statements.select_active_options,
|
22
|
+
selected: importer.parser_fields['rights_statement'],
|
23
|
+
include_blank: true,
|
24
|
+
item_helper: rights_statements.method(:include_current_value),
|
25
|
+
input_html: { class: 'form-control' },
|
26
|
+
required: false
|
27
|
+
%>
|
28
|
+
<%= fi.input :override_rights_statement, as: :boolean, hint: 'If checked, always use the selected rights statment. If unchecked, use dc:rights from the record and only use the provided value if dc:rights is blank.', input_html: { checked: (importer.parser_fields['override_rights_statement'] == "1") } %>
|
29
|
+
<% end %>
|
28
30
|
<%= fi.input :thumbnail_url, required: false, as: :string, input_html: { value: importer.parser_fields['thumbnail_url'] } %>
|
29
31
|
<div class="help-block well well-sm">
|
30
32
|
<p>
|
@@ -31,16 +31,17 @@
|
|
31
31
|
input_html: { class: 'form-control' }
|
32
32
|
%>
|
33
33
|
|
34
|
-
<%
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
34
|
+
<% if defined?(::Hyrax) %>
|
35
|
+
<% rights_statements = Hyrax.config.rights_statement_service_class.new %>
|
36
|
+
<%= fi.input :rights_statement,
|
37
|
+
collection: rights_statements.select_active_options,
|
38
|
+
selected: importer.parser_fields['rights_statement'],
|
39
|
+
include_blank: true,
|
40
|
+
item_helper: rights_statements.method(:include_current_value),
|
41
|
+
input_html: { class: 'form-control' },
|
42
|
+
required: false %>
|
43
|
+
<%= fi.input :override_rights_statement, as: :boolean, hint: 'If checked, always use the selected rights statment. If unchecked, use rights or rights_statement from the record and only use the provided value if dc:rights is blank.', input_html: { checked: (importer.parser_fields['override_rights_statement'] == "1") } %>
|
44
|
+
<% end %>
|
44
45
|
<h4>XML and files to Import:</h4>
|
45
46
|
<p>File upload and Cloud File upload MUST be a either a single XML file (for metadata only import) OR a Zip file containing the XML files and data files, each in a separate folder.</p>
|
46
47
|
<p>The Server Path can point to a folder containing XML files and data files to import, or direct to the XML file itself.</p>
|
@@ -53,7 +54,7 @@
|
|
53
54
|
<%= fi.input :import_file_path, as: :string, input_html: { value: importer.parser_fields['import_file_path'] } %>
|
54
55
|
</div>
|
55
56
|
<div id='cloud'>
|
56
|
-
<% if Hyrax.config.browse_everything? %>
|
57
|
+
<% if defined?(::Hyrax) && Hyrax.config.browse_everything? %>
|
57
58
|
<%= render 'browse_everything', form: form %>
|
58
59
|
<% end %>
|
59
60
|
</div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<div class="col-xs-12 main-header">
|
2
2
|
<h1><span class="fa fa-cloud-upload" aria-hidden="true"></span> Importer: <%= @importer.name %></h1>
|
3
|
-
<% if @importer.parser_klass == 'Bulkrax::CsvParser' && @work_entries.map
|
3
|
+
<% if @importer.parser_klass == 'Bulkrax::CsvParser' && @work_entries.map(&:failed?).any? %>
|
4
4
|
<div class="pull-right">
|
5
5
|
<%= link_to 'Export Errored Entries', importer_export_errors_path(@importer.id), class: 'btn btn-primary' %>
|
6
6
|
<%= link_to 'Upload Corrected Entries', importer_upload_corrected_entries_path(@importer.id), class: 'btn btn-primary' %>
|
@@ -10,27 +10,29 @@
|
|
10
10
|
<div class="panel panel-default bulkrax-align-text">
|
11
11
|
<div class="panel-body">
|
12
12
|
<p class="bulkrax-p-align">
|
13
|
-
<strong
|
13
|
+
<strong><%= t('bulkrax.importer.labels.name') %>:</strong>
|
14
14
|
<%= @importer.name %>
|
15
15
|
</p>
|
16
|
+
<% if defined?(::Hyrax) %>
|
17
|
+
<p class="bulkrax-p-align">
|
18
|
+
<strong><%= t('bulkrax.importer.labels.admin_set') %>:</strong>
|
19
|
+
<%= @importer.admin_set_id %>
|
20
|
+
</p>
|
21
|
+
<% end %>
|
16
22
|
<p class="bulkrax-p-align">
|
17
|
-
<strong
|
18
|
-
<%= @importer.admin_set_id %>
|
19
|
-
</p>
|
20
|
-
<p class="bulkrax-p-align">
|
21
|
-
<strong>User:</strong>
|
23
|
+
<strong><%= t('bulkrax.importer.labels.user') %>:</strong>
|
22
24
|
<%= @importer.user %>
|
23
25
|
</p>
|
24
26
|
<p class="bulkrax-p-align">
|
25
|
-
<strong
|
27
|
+
<strong><%= t('bulkrax.importer.labels.frequency') %>:</strong>
|
26
28
|
<%= @importer.frequency %>
|
27
29
|
</p>
|
28
30
|
<p class="bulkrax-p-align">
|
29
|
-
<strong
|
31
|
+
<strong><%= t('bulkrax.importer.labels.parser_klass') %>:</strong>
|
30
32
|
<%= @importer.parser_klass %>
|
31
33
|
</p>
|
32
34
|
<p class="bulkrax-p-align">
|
33
|
-
<strong
|
35
|
+
<strong><%= t('bulkrax.importer.labels.limit') %>:</strong>
|
34
36
|
<%= @importer.limit %>
|
35
37
|
</p>
|
36
38
|
|
@@ -57,26 +59,26 @@
|
|
57
59
|
<%= render partial: 'bulkrax/shared/bulkrax_field_mapping', locals: {item: @importer} %>
|
58
60
|
|
59
61
|
<p class="bulkrax-p-align" title="<%= @importer.last_run&.processed_works %> processed, <%= @importer.last_run&.failed_works %> failed">
|
60
|
-
<strong
|
62
|
+
<strong><%= t('bulkrax.importer.labels.total_work_entries') %>:</strong>
|
61
63
|
<%= @importer.last_run&.total_work_entries %>
|
62
64
|
</p>
|
63
65
|
|
64
66
|
<p class="bulkrax-p-align" title="<%= @importer.last_run&.processed_collections %> processed, <%= @importer.last_run&.failed_collections %> failed">
|
65
|
-
<strong
|
67
|
+
<strong><%= t('bulkrax.importer.labels.total_collections') %>:</strong>
|
66
68
|
<%= @importer.last_run&.total_collection_entries %>
|
67
69
|
</p>
|
68
70
|
|
69
71
|
<p class="bulkrax-p-align" title="<%= @importer.last_run&.processed_file_sets %> processed, <%= @importer.last_run&.failed_file_sets %> failed">
|
70
|
-
<strong
|
72
|
+
<strong><%= t('bulkrax.importer.labels.total_file_sets') %>:</strong>
|
71
73
|
<%= @importer.last_run&.total_file_set_entries %>
|
72
74
|
</p>
|
73
75
|
|
74
76
|
<div class="bulkrax-nav-tab-bottom-margin">
|
75
77
|
<!-- Nav tabs -->
|
76
78
|
<ul class="bulkrax-nav-tab-top-margin tab-nav nav nav-tabs" role="tablist">
|
77
|
-
<li role="presentation" class='active'><a href="#work-entries" aria-controls="work-entries" role="tab" data-toggle="tab"
|
78
|
-
<li role="presentation"><a href="#collection-entries" aria-controls="collection-entries" role="tab" data-toggle="tab"
|
79
|
-
<li role="presentation"><a href="#file-set-entries" aria-controls="file-set-entries" role="tab" data-toggle="tab"
|
79
|
+
<li role="presentation" class='active'><a href="#work-entries" aria-controls="work-entries" role="tab" data-toggle="tab"><%= t('bulkrax.importer.labels.work_entries') %></a></li>
|
80
|
+
<li role="presentation"><a href="#collection-entries" aria-controls="collection-entries" role="tab" data-toggle="tab"><%= t('bulkrax.importer.labels.collection_entries') %></a></li>
|
81
|
+
<li role="presentation"><a href="#file-set-entries" aria-controls="file-set-entries" role="tab" data-toggle="tab"><%= t('bulkrax.importer.labels.file_set_entries') %></a></li>
|
80
82
|
</ul>
|
81
83
|
<!-- Tab panes -->
|
82
84
|
<div class="tab-content outline">
|
@@ -2,12 +2,12 @@
|
|
2
2
|
<table class='table table-striped'>
|
3
3
|
<thead>
|
4
4
|
<tr>
|
5
|
-
<th
|
6
|
-
<th
|
7
|
-
<th
|
8
|
-
<th
|
9
|
-
<th
|
10
|
-
<th
|
5
|
+
<th><%= t('bulkrax.table_header.labels.identifier') %></th>
|
6
|
+
<th><%= t('bulkrax.table_header.labels.entry_id') %></th>
|
7
|
+
<th><%= t('bulkrax.table_header.labels.status') %></th>
|
8
|
+
<th><%= t('bulkrax.table_header.labels.errors') %></th>
|
9
|
+
<th><%= t('bulkrax.table_header.labels.status_set_at') %></th>
|
10
|
+
<th><%= t('bulkrax.table_header.labels.actions') %></th>
|
11
11
|
</tr>
|
12
12
|
</thead>
|
13
13
|
<tbody>
|
@@ -2,12 +2,12 @@
|
|
2
2
|
<table class='table table-striped'>
|
3
3
|
<thead>
|
4
4
|
<tr>
|
5
|
-
<th
|
6
|
-
<th
|
7
|
-
<th
|
8
|
-
<th
|
9
|
-
<th
|
10
|
-
<th
|
5
|
+
<th><%= t('bulkrax.table_header.labels.identifier') %></th>
|
6
|
+
<th><%= t('bulkrax.table_header.labels.entry_id') %></th>
|
7
|
+
<th><%= t('bulkrax.table_header.labels.status') %></th>
|
8
|
+
<th><%= t('bulkrax.table_header.labels.errors') %></th>
|
9
|
+
<th><%= t('bulkrax.table_header.labels.status_set_at') %></th>
|
10
|
+
<th><%= t('bulkrax.table_header.labels.actions') %></th>
|
11
11
|
</tr>
|
12
12
|
</thead>
|
13
13
|
<tbody>
|
@@ -2,12 +2,12 @@
|
|
2
2
|
<table class='table table-striped'>
|
3
3
|
<thead>
|
4
4
|
<tr>
|
5
|
-
<th
|
6
|
-
<th
|
7
|
-
<th
|
8
|
-
<th
|
9
|
-
<th
|
10
|
-
<th
|
5
|
+
<th><%= t('bulkrax.table_header.labels.identifier') %></th>
|
6
|
+
<th><%= t('bulkrax.table_header.labels.entry_id') %></th>
|
7
|
+
<th><%= t('bulkrax.table_header.labels.status') %></th>
|
8
|
+
<th><%= t('bulkrax.table_header.labels.errors') %></th>
|
9
|
+
<th><%= t('bulkrax.table_header.labels.status_set_at') %></th>
|
10
|
+
<th><%= t('bulkrax.table_header.labels.actions') %></th>
|
11
11
|
</tr>
|
12
12
|
</thead>
|
13
13
|
<tbody>
|
@@ -27,8 +27,12 @@ en:
|
|
27
27
|
start_date: Start Date
|
28
28
|
status: Status
|
29
29
|
total_work_entries: Total Works
|
30
|
+
total_entries: Total Entries
|
30
31
|
user: User
|
31
32
|
worktype: Work Type
|
33
|
+
work_entries: Work Entries
|
34
|
+
collection_entries: Collection Entries
|
35
|
+
file_set_entries: File Set Entries
|
32
36
|
workflow_status:
|
33
37
|
approved: "Approved"
|
34
38
|
deleted: "Deleted"
|
@@ -40,3 +44,25 @@ en:
|
|
40
44
|
hints:
|
41
45
|
include_thumbnails: "These exported fields currently cannot be imported."
|
42
46
|
generated_metadata: "These exported fields currently cannot be imported."
|
47
|
+
importer:
|
48
|
+
labels:
|
49
|
+
name: Name
|
50
|
+
user: User
|
51
|
+
admin_set: Admin set
|
52
|
+
frequency: Frequency
|
53
|
+
parser_klass: Parser klass
|
54
|
+
limit: Limit
|
55
|
+
total_work_entries: Total Works
|
56
|
+
total_collections: Total Collections
|
57
|
+
total_file_sets: Total File Sets
|
58
|
+
work_entries: Work Entries
|
59
|
+
collection_entries: Collection Entries
|
60
|
+
file_set_entries: File Set Entries
|
61
|
+
table_header:
|
62
|
+
labels:
|
63
|
+
identifier: Identifier
|
64
|
+
entry_id: Entry ID
|
65
|
+
status: Status
|
66
|
+
errors: Errors
|
67
|
+
status_set_at: Status Set At
|
68
|
+
actions: Actions
|
@@ -58,6 +58,23 @@ module Bulkrax
|
|
58
58
|
**options)
|
59
59
|
end
|
60
60
|
|
61
|
+
# @api public
|
62
|
+
#
|
63
|
+
# @param parser_class_name [String]
|
64
|
+
# @param parser_fields [Hash<String,Hash>]
|
65
|
+
#
|
66
|
+
# @return [Bulkrax::Exporter]
|
67
|
+
def self.exporter_for(parser_class_name:, parser_fields: {}, **options)
|
68
|
+
Bulkrax::Exporter.new(
|
69
|
+
name: options.fetch(:exporter_name, "Test importer for identifier"),
|
70
|
+
user: options.fetch(:exporter_user, User.new(email: "hello@world.com")),
|
71
|
+
limit: options.fetch(:exporter_limit, 1),
|
72
|
+
parser_klass: parser_class_name,
|
73
|
+
field_mapping: options.fetch(:exporter_field_mappings) { Bulkrax.field_mappings.fetch(parser_class_name) },
|
74
|
+
parser_fields: parser_fields
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
61
78
|
ENTRY_TYPE_TO_METHOD_NAME_MAP = {
|
62
79
|
entry: :entry_class,
|
63
80
|
collection: :collection_entry_class,
|
data/lib/bulkrax/version.rb
CHANGED
data/lib/bulkrax.rb
CHANGED
@@ -6,31 +6,91 @@ require 'active_support/all'
|
|
6
6
|
|
7
7
|
# rubocop:disable Metrics/ModuleLength
|
8
8
|
module Bulkrax
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
9
|
+
extend self # rubocop:disable Style/ModuleFunction
|
10
|
+
extend Forwardable
|
11
|
+
|
12
|
+
##
|
13
|
+
# @api public
|
14
|
+
class Configuration
|
15
|
+
attr_accessor :api_definition,
|
16
|
+
:curation_concerns,
|
17
|
+
:default_field_mapping,
|
18
|
+
:default_work_type,
|
19
|
+
:export_path,
|
20
|
+
:field_mappings,
|
21
|
+
:file_model_class,
|
22
|
+
:fill_in_blank_source_identifiers,
|
23
|
+
:generated_metadata_mapping,
|
24
|
+
:import_path,
|
25
|
+
:multi_value_element_join_on,
|
26
|
+
:multi_value_element_split_on,
|
27
|
+
:object_factory,
|
28
|
+
:parsers,
|
29
|
+
:qa_controlled_properties,
|
30
|
+
:related_children_field_mapping,
|
31
|
+
:related_parents_field_mapping,
|
32
|
+
:relationship_job_class,
|
33
|
+
:removed_image_path,
|
34
|
+
:required_elements,
|
35
|
+
:reserved_properties,
|
36
|
+
:server_name
|
37
|
+
end
|
38
|
+
|
39
|
+
def config
|
40
|
+
@config ||= Configuration.new
|
41
|
+
yield @config if block_given?
|
42
|
+
@config
|
43
|
+
end
|
44
|
+
alias setup config
|
45
|
+
|
46
|
+
def_delegators :@config,
|
47
|
+
:api_definition,
|
48
|
+
:api_definition=,
|
49
|
+
:curation_concerns,
|
50
|
+
:curation_concerns=,
|
51
|
+
:default_field_mapping,
|
52
|
+
:default_field_mapping=,
|
53
|
+
:default_work_type,
|
54
|
+
:default_work_type=,
|
55
|
+
:export_path,
|
56
|
+
:export_path=,
|
57
|
+
:field_mappings,
|
58
|
+
:field_mappings=,
|
59
|
+
:file_model_class,
|
60
|
+
:file_model_class=,
|
61
|
+
:fill_in_blank_source_identifiers,
|
62
|
+
:fill_in_blank_source_identifiers=,
|
63
|
+
:generated_metadata_mapping,
|
64
|
+
:generated_metadata_mapping=,
|
65
|
+
:import_path,
|
66
|
+
:import_path=,
|
67
|
+
:multi_value_element_join_on,
|
68
|
+
:multi_value_element_join_on=,
|
69
|
+
:multi_value_element_split_on,
|
70
|
+
:multi_value_element_split_on=,
|
71
|
+
:object_factory,
|
72
|
+
:object_factory=,
|
73
|
+
:parsers,
|
74
|
+
:parsers=,
|
75
|
+
:qa_controlled_properties,
|
76
|
+
:qa_controlled_properties=,
|
77
|
+
:related_children_field_mapping,
|
78
|
+
:related_children_field_mapping=,
|
79
|
+
:related_parents_field_mapping,
|
80
|
+
:related_parents_field_mapping=,
|
81
|
+
:relationship_job_class,
|
82
|
+
:relationship_job_class=,
|
83
|
+
:removed_image_path,
|
84
|
+
:removed_image_path=,
|
85
|
+
:required_elements,
|
86
|
+
:required_elements=,
|
87
|
+
:reserved_properties,
|
88
|
+
:reserved_properties=,
|
89
|
+
:server_name,
|
90
|
+
:server_name=
|
91
|
+
|
92
|
+
config do |conf|
|
93
|
+
conf.parsers = [
|
34
94
|
{ name: "OAI - Dublin Core", class_name: "Bulkrax::OaiDcParser", partial: "oai_fields" },
|
35
95
|
{ name: "OAI - Qualified Dublin Core", class_name: "Bulkrax::OaiQualifiedDcParser", partial: "oai_fields" },
|
36
96
|
{ name: "CSV - Comma Separated Values", class_name: "Bulkrax::CsvParser", partial: "csv_fields" },
|
@@ -38,16 +98,34 @@ module Bulkrax
|
|
38
98
|
{ name: "XML", class_name: "Bulkrax::XmlParser", partial: "xml_fields" }
|
39
99
|
]
|
40
100
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
101
|
+
conf.import_path = Bulkrax.import_path || 'tmp/imports'
|
102
|
+
conf.export_path = Bulkrax.export_path || 'tmp/exports'
|
103
|
+
conf.removed_image_path = Bulkrax::Engine.root.join('spec', 'fixtures', 'removed.png').to_s
|
104
|
+
conf.server_name = 'bulkrax@example.com'
|
105
|
+
conf.relationship_job_class = "Bulkrax::CreateRelationshipsJob"
|
106
|
+
conf.required_elements = ['title']
|
107
|
+
|
108
|
+
def conf.curation_concerns
|
109
|
+
@curation_concerns ||= defined?(::Hyrax) ? ::Hyrax.config.curation_concerns : []
|
110
|
+
end
|
111
|
+
|
112
|
+
def conf.curation_concerns=(val)
|
113
|
+
@curation_concerns = val
|
114
|
+
end
|
115
|
+
|
116
|
+
def conf.file_model_class
|
117
|
+
@file_model_class ||= defined?(::Hyrax) ? ::FileSet : File
|
118
|
+
end
|
119
|
+
|
120
|
+
def conf.file_model_class=(val)
|
121
|
+
@file_model_class = val
|
122
|
+
end
|
45
123
|
|
46
124
|
# Hash of Generic field_mappings for use in the view
|
47
|
-
# There must be one field_mappings hash per view
|
125
|
+
# There must be one field_mappings hash per view partial
|
48
126
|
# Based on Hyrax CoreMetadata && BasicMetadata
|
49
127
|
# Override at application level to change
|
50
|
-
|
128
|
+
conf.field_mappings = {
|
51
129
|
"Bulkrax::OaiDcParser" => {
|
52
130
|
"contributor" => { from: ["contributor"] },
|
53
131
|
# no appropriate mapping for coverage (based_near needs id)
|
@@ -95,7 +173,7 @@ module Bulkrax
|
|
95
173
|
}
|
96
174
|
|
97
175
|
# Lambda to set the default field mapping
|
98
|
-
|
176
|
+
conf.default_field_mapping = lambda do |field|
|
99
177
|
return if field.blank?
|
100
178
|
{
|
101
179
|
field.to_s =>
|
@@ -110,7 +188,7 @@ module Bulkrax
|
|
110
188
|
end
|
111
189
|
|
112
190
|
# Properties that should not be used in imports. They are reserved for use by Hyrax.
|
113
|
-
|
191
|
+
conf.reserved_properties = %w[
|
114
192
|
create_date
|
115
193
|
modified_date
|
116
194
|
date_modified
|
@@ -133,10 +211,10 @@ module Bulkrax
|
|
133
211
|
# List of Questioning Authority properties that are controlled via YAML files in
|
134
212
|
# the config/authorities/ directory. For example, the :rights_statement property
|
135
213
|
# is controlled by the active terms in config/authorities/rights_statements.yml
|
136
|
-
|
214
|
+
conf.qa_controlled_properties = %w[rights_statement license]
|
137
215
|
end
|
138
216
|
|
139
|
-
def
|
217
|
+
def api_definition
|
140
218
|
@api_definition ||= ActiveSupport::HashWithIndifferentAccess.new(
|
141
219
|
YAML.safe_load(
|
142
220
|
ERB.new(
|
@@ -149,9 +227,9 @@ module Bulkrax
|
|
149
227
|
DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON = ' | '
|
150
228
|
# Specify the delimiter for joining an attribute's multi-value array into a string.
|
151
229
|
#
|
152
|
-
# @note the specific
|
230
|
+
# @note the specific delimiter should likely be present in the multi_value_element_split_on
|
153
231
|
# expression.
|
154
|
-
def
|
232
|
+
def multi_value_element_join_on
|
155
233
|
@multi_value_element_join_on ||= DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON
|
156
234
|
end
|
157
235
|
|
@@ -161,7 +239,7 @@ module Bulkrax
|
|
161
239
|
#
|
162
240
|
# @note The "true" value is to preserve backwards compatibility.
|
163
241
|
# @see DEFAULT_MULTI_VALUE_ELEMENT_JOIN_ON
|
164
|
-
def
|
242
|
+
def multi_value_element_split_on
|
165
243
|
if @multi_value_element_join_on.is_a?(TrueClass)
|
166
244
|
DEFAULT_MULTI_VALUE_ELEMENT_SPLIT_ON
|
167
245
|
else
|
@@ -169,29 +247,24 @@ module Bulkrax
|
|
169
247
|
end
|
170
248
|
end
|
171
249
|
|
172
|
-
# this function maps the vars from your app into your engine
|
173
|
-
def self.setup
|
174
|
-
yield self
|
175
|
-
end
|
176
|
-
|
177
250
|
# Responsible for stripping hidden characters from the given string.
|
178
251
|
#
|
179
252
|
# @param value [#to_s]
|
180
253
|
# @return [String] with hidden characters removed
|
181
254
|
#
|
182
255
|
# @see https://github.com/samvera-labs/bulkrax/issues/688
|
183
|
-
def
|
256
|
+
def normalize_string(value)
|
184
257
|
# Removing [Byte Order Mark (BOM)](https://en.wikipedia.org/wiki/Byte_order_mark)
|
185
258
|
value.to_s.delete("\xEF\xBB\xBF")
|
186
259
|
end
|
187
260
|
|
188
|
-
def
|
261
|
+
def fallback_user_for_importer_exporter_processing
|
189
262
|
return User.batch_user if defined?(Hyrax) && User.respond_to?(:batch_user)
|
190
263
|
|
191
264
|
raise "We have no fallback user available for Bulkrax.fallback_user_for_importer_exporter_processing"
|
192
265
|
end
|
193
266
|
|
194
|
-
# This class confirms to the Active::Support.
|
267
|
+
# This class confirms to the Active::Support.serialize interface. It's job is to ensure that we
|
195
268
|
# don't have keys with the tricksy Byte Order Mark character.
|
196
269
|
#
|
197
270
|
# @see https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize
|