mods_display 1.0.0.alpha3 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +42 -0
  3. data/.rubocop_todo.yml +72 -401
  4. data/Gemfile +4 -1
  5. data/Rakefile +8 -6
  6. data/app/components/mods_display/field_component.rb +2 -0
  7. data/app/components/mods_display/list_field_component.rb +2 -0
  8. data/app/components/mods_display/record_component.rb +2 -0
  9. data/app/helpers/mods_display/record_helper.rb +4 -7
  10. data/app/models/mods_display/record.rb +2 -1
  11. data/config.ru +2 -2
  12. data/lib/mods_display/country_codes.rb +2 -1
  13. data/lib/mods_display/fields/abstract.rb +2 -0
  14. data/lib/mods_display/fields/access_condition.rb +12 -12
  15. data/lib/mods_display/fields/audience.rb +2 -0
  16. data/lib/mods_display/fields/cartographics.rb +8 -1
  17. data/lib/mods_display/fields/collection.rb +6 -2
  18. data/lib/mods_display/fields/contact.rb +2 -0
  19. data/lib/mods_display/fields/contents.rb +2 -0
  20. data/lib/mods_display/fields/description.rb +3 -2
  21. data/lib/mods_display/fields/extent.rb +3 -0
  22. data/lib/mods_display/fields/field.rb +6 -9
  23. data/lib/mods_display/fields/form.rb +3 -0
  24. data/lib/mods_display/fields/genre.rb +2 -0
  25. data/lib/mods_display/fields/geo.rb +5 -2
  26. data/lib/mods_display/fields/identifier.rb +20 -17
  27. data/lib/mods_display/fields/imprint.rb +168 -217
  28. data/lib/mods_display/fields/language.rb +5 -1
  29. data/lib/mods_display/fields/location.rb +4 -1
  30. data/lib/mods_display/fields/name.rb +35 -19
  31. data/lib/mods_display/fields/nested_related_item.rb +18 -2
  32. data/lib/mods_display/fields/note.rb +9 -7
  33. data/lib/mods_display/fields/related_item.rb +12 -9
  34. data/lib/mods_display/fields/resource_type.rb +2 -0
  35. data/lib/mods_display/fields/sub_title.rb +2 -0
  36. data/lib/mods_display/fields/subject.rb +17 -50
  37. data/lib/mods_display/fields/title.rb +37 -26
  38. data/lib/mods_display/fields/values.rb +2 -0
  39. data/lib/mods_display/html.rb +4 -3
  40. data/lib/mods_display/related_item_concerns.rb +4 -2
  41. data/lib/mods_display/relator_codes.rb +2 -0
  42. data/lib/mods_display/version.rb +3 -1
  43. data/lib/mods_display.rb +5 -3
  44. data/mods_display.gemspec +1 -1
  45. metadata +14 -8
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  ##
3
5
  # This class will hopefully take over for related item support more broadly.
@@ -21,7 +23,12 @@ module ModsDisplay
21
23
  def to_html(view_context = ApplicationController.renderer)
22
24
  helpers = view_context.respond_to?(:simple_format) ? view_context : ApplicationController.new.view_context
23
25
 
24
- component = ModsDisplay::ListFieldComponent.with_collection(fields, value_transformer: ->(value) { helpers.link_urls_and_email(value.to_s) }, list_html_attributes: { class: 'mods_display_nested_related_items' }, list_item_html_attributes: { class: 'mods_display_nested_related_item open' })
26
+ component = ModsDisplay::ListFieldComponent.with_collection(
27
+ fields,
28
+ value_transformer: ->(value) { helpers.link_urls_and_email(value.to_s) },
29
+ list_html_attributes: { class: 'mods_display_nested_related_items' },
30
+ list_item_html_attributes: { class: 'mods_display_nested_related_item open' }
31
+ )
25
32
 
26
33
  view_context.render component, layout: false
27
34
  end
@@ -29,7 +36,15 @@ module ModsDisplay
29
36
  private
30
37
 
31
38
  def related_item_mods_object(value)
32
- mods = ::Stanford::Mods::Record.new.tap { |r| r.from_str("<mods>#{value.children.to_xml}</mods>", false) }
39
+ mods = ::Stanford::Mods::Record.new.tap do |r|
40
+ # dup'ing the value adds the appropriate namespaces, but...
41
+ munged_node = value.dup.tap do |x|
42
+ # ... the mods gem also expects the root of the document to have the root tag <mods>
43
+ x.name = 'mods'
44
+ end
45
+
46
+ r.from_nk_node(munged_node)
47
+ end
33
48
  related_item = ModsDisplay::HTML.new(mods)
34
49
 
35
50
  ModsDisplay::Values.new(
@@ -42,6 +57,7 @@ module ModsDisplay
42
57
  body = related_item.body
43
58
 
44
59
  return if body == '<dl></dl>'
60
+
45
61
  body
46
62
  end
47
63
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  class Note < Field
3
5
  def fields
@@ -25,20 +27,20 @@ module ModsDisplay
25
27
  if element.attributes['type'].respond_to?(:value)
26
28
  return note_labels[element.attributes['type'].value] || "#{element.attributes['type'].value.capitalize}:"
27
29
  end
30
+
28
31
  I18n.t('mods_display.note')
29
32
  end
30
33
 
31
34
  def note_labels
32
35
  { 'statement of responsibility' => I18n.t('mods_display.statement_of_responsibility'),
33
36
  'date/sequential designation' => I18n.t('mods_display.date_sequential_designation'),
34
- 'publications' => I18n.t('mods_display.publications'),
35
- 'references' => I18n.t('mods_display.references'),
36
- 'bibliography' => I18n.t('mods_display.bibliography'),
37
- 'preferred citation' => I18n.t('mods_display.preferred_citation'),
38
- 'biographical/historical' => I18n.t('mods_display.biographical_historical'),
37
+ 'publications' => I18n.t('mods_display.publications'),
38
+ 'references' => I18n.t('mods_display.references'),
39
+ 'bibliography' => I18n.t('mods_display.bibliography'),
40
+ 'preferred citation' => I18n.t('mods_display.preferred_citation'),
41
+ 'biographical/historical' => I18n.t('mods_display.biographical_historical'),
39
42
  'creation/production credits' => I18n.t('mods_display.creation_production_credits'),
40
- 'citation/reference' => I18n.t('mods_display.citation_reference')
41
- }
43
+ 'citation/reference' => I18n.t('mods_display.citation_reference') }
42
44
  end
43
45
  end
44
46
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  class RelatedItem < Field
3
5
  include ModsDisplay::RelatedItemConcerns
@@ -6,10 +8,10 @@ module ModsDisplay
6
8
  return_fields = @values.map do |value|
7
9
  next if related_item_is_a_collection?(value)
8
10
  next if render_nested_related_item?(value)
9
- case
10
- when related_item_is_a_location?(value)
11
+
12
+ if related_item_is_a_location?(value)
11
13
  process_location value
12
- when related_item_is_a_reference?(value)
14
+ elsif related_item_is_a_reference?(value)
13
15
  process_reference value
14
16
  else
15
17
  process_related_item(value)
@@ -33,12 +35,13 @@ module ModsDisplay
33
35
  end
34
36
 
35
37
  def process_related_item(item)
36
- return unless item.titleInfo.length > 0
38
+ return unless item.titleInfo.length.positive?
39
+
37
40
  title = item.titleInfo.text.strip
38
41
  return_text = title
39
42
  location = nil
40
- location = item.location.url.text if item.location.length > 0 &&
41
- item.location.url.length > 0
43
+ location = item.location.url.text if item.location.length.positive? &&
44
+ item.location.url.length.positive?
42
45
  return_text = "<a href='#{location}'>#{title}</a>" if location && !title.empty?
43
46
 
44
47
  ModsDisplay::Values.new(label: related_item_label(item), values: [return_text]) unless return_text.empty?
@@ -54,8 +57,8 @@ module ModsDisplay
54
57
  def related_item_is_a_location?(item)
55
58
  !related_item_is_a_collection?(item) &&
56
59
  !related_item_is_a_reference?(item) &&
57
- item.location.length > 0 &&
58
- item.titleInfo.length < 1
60
+ item.location.length.positive? &&
61
+ item.titleInfo.empty?
59
62
  end
60
63
 
61
64
  def related_item_is_a_reference?(item)
@@ -66,7 +69,7 @@ module ModsDisplay
66
69
 
67
70
  def related_item_label(item)
68
71
  if displayLabel(item)
69
- return displayLabel(item)
72
+ displayLabel(item)
70
73
  else
71
74
  case
72
75
  when related_item_is_a_location?(item)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  class ResourceType < Field
3
5
  def fields
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  class SubTitle < ModsDisplay::Title
3
5
  def initialize(values)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  class Subject < Field
3
5
  def fields
@@ -7,23 +9,19 @@ module ModsDisplay
7
9
  label = displayLabel(value) || I18n.t('mods_display.subject')
8
10
  return_text = []
9
11
  selected_subjects(value).each do |child|
10
- if self.respond_to?(:"process_#{child.name}")
12
+ if respond_to?(:"process_#{child.name}")
11
13
  method_send = send(:"process_#{child.name}", child)
12
14
  return_text << method_send unless method_send.to_s.empty?
15
+ elsif child.text.include?('--')
16
+ return_text << child.text.split('--').map(&:strip)
13
17
  else
14
- if child.text.include?('--')
15
- return_text << child.text.split('--').map(&:strip)
16
- else
17
- return_text << child.text unless child.text.empty?
18
- end
18
+ return_text << child.text unless child.text.empty?
19
19
  end
20
20
  end
21
21
  return_values << return_text.flatten unless return_text.empty?
22
- unless return_values.empty?
23
- return_fields << ModsDisplay::Values.new(label: label, values: return_values)
24
- end
22
+ return_fields << ModsDisplay::Values.new(label: label, values: return_values) unless return_values.empty?
25
23
  end
26
- collapse_subjects return_fields
24
+ collapse_fields return_fields
27
25
  end
28
26
 
29
27
  # Would really like to clean this up, but it works and is tested for now.
@@ -44,7 +42,7 @@ module ModsDisplay
44
42
  def process_name(element)
45
43
  name = ModsDisplay::Name.new([element]).fields.first
46
44
 
47
- name.values.first if name
45
+ name&.values&.first
48
46
  end
49
47
 
50
48
  private
@@ -56,54 +54,23 @@ module ModsDisplay
56
54
  def values_from_subjects(element)
57
55
  return_values = []
58
56
  selected_subjects(element).each do |child|
59
- if child.text.include?('--')
60
- return_values << child.text.split('--').map(&:strip)
61
- else
62
- return_values << child.text.strip
63
- end
57
+ return_values << if child.text.include?('--')
58
+ child.text.split('--').map(&:strip)
59
+ else
60
+ child.text.strip
61
+ end
64
62
  end
65
63
  return_values
66
64
  end
67
65
 
68
66
  def selected_subjects(element = @value)
69
- element.children.select do |child|
70
- !omit_elements.include?(child.name.to_sym)
67
+ element.children.reject do |child|
68
+ omit_elements.include?(child.name.to_sym)
71
69
  end
72
70
  end
73
71
 
74
72
  def omit_elements
75
- [:cartographics, :geographicCode, :text]
76
- end
77
-
78
- # Providing subject specific collapsing method so we can
79
- # collapse the labels w/o flattening all the subject fields.
80
- def collapse_subjects(display_fields)
81
- return_values = []
82
- current_label = nil
83
- prev_label = nil
84
- buffer = []
85
- display_fields.each_with_index do |field, index|
86
- current_label = field.label
87
- current_values = field.values
88
- if display_fields.length == 1
89
- return_values << ModsDisplay::Values.new(label: current_label, values: current_values)
90
- elsif index == (display_fields.length - 1)
91
- # need to deal w/ when we have a last element but we have separate labels in the buffer.
92
- if current_label != prev_label
93
- return_values << ModsDisplay::Values.new(label: prev_label, values: [buffer.flatten(1)])
94
- return_values << ModsDisplay::Values.new(label: current_label, values: current_values)
95
- else
96
- buffer.concat(current_values)
97
- return_values << ModsDisplay::Values.new(label: current_label, values: buffer.flatten(0))
98
- end
99
- elsif prev_label && (current_label != prev_label)
100
- return_values << ModsDisplay::Values.new(label: prev_label, values: buffer.flatten(0))
101
- buffer = []
102
- end
103
- buffer.concat(current_values)
104
- prev_label = current_label
105
- end
106
- return_values
73
+ %i[cartographics geographicCode text]
107
74
  end
108
75
  end
109
76
  end
@@ -1,14 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  class Title < Field
3
5
  def fields
4
6
  return_values = []
5
- if @values
6
- @values.each do |value|
7
- return_values << ModsDisplay::Values.new(
8
- label: displayLabel(value) || title_label(value),
9
- values: [assemble_title(value)]
10
- )
11
- end
7
+ @values&.each do |value|
8
+ return_values << ModsDisplay::Values.new(
9
+ label: displayLabel(value) || title_label(value),
10
+ values: [assemble_title(value)]
11
+ )
12
12
  end
13
13
  collapse_fields(return_values)
14
14
  end
@@ -20,8 +20,6 @@ module ModsDisplay
20
20
  end
21
21
 
22
22
  def assemble_title(element)
23
- return displayForm(element) if displayForm(element)
24
-
25
23
  title = ''
26
24
  previous_element = nil
27
25
 
@@ -29,20 +27,21 @@ module ModsDisplay
29
27
  str = value.text.strip
30
28
  next if str.empty?
31
29
 
32
- delimiter = case
33
- when title.empty?, title.end_with?(' ')
34
- nil
35
- when title.end_with?('.', ',', ':', ';')
36
- ' '
37
- when value.name == 'subTitle'
38
- ' : '
39
- when value.name == 'partName' && previous_element.name == 'partNumber'
40
- ', '
41
- when value.name == 'partNumber', value.name == 'partName'
42
- '. '
43
- else
44
- ' '
45
- end
30
+ delimiter = if title.empty? || title.end_with?(' ')
31
+ nil
32
+ elsif previous_element&.name == 'nonSort' && title.end_with?('-', '\'')
33
+ nil
34
+ elsif title.end_with?('.', ',', ':', ';')
35
+ ' '
36
+ elsif value.name == 'subTitle'
37
+ ' : '
38
+ elsif value.name == 'partName' && previous_element.name == 'partNumber'
39
+ ', '
40
+ elsif value.name == 'partNumber' || value.name == 'partName'
41
+ '. '
42
+ else
43
+ ' '
44
+ end
46
45
 
47
46
  title += delimiter if delimiter
48
47
  title += str
@@ -50,7 +49,18 @@ module ModsDisplay
50
49
  previous_element = value
51
50
  end
52
51
 
53
- title
52
+ if element['type'] == 'uniform' && element['nameTitleGroup'].present?
53
+ [uniform_title_name_part(element), title].compact.join('. ')
54
+ else
55
+ title
56
+ end
57
+ end
58
+
59
+ def uniform_title_name_part(element)
60
+ names = element.xpath("//m:name[@nameTitleGroup=\"#{element['nameTitleGroup']}\"]", **Mods::Record::NS_HASH)
61
+ names = element.xpath("//name[@nameTitleGroup=\"#{element['nameTitleGroup']}\"]") if names.empty?
62
+
63
+ ModsDisplay::Name.new(names).fields.first&.values&.first&.to_s
54
64
  end
55
65
 
56
66
  def title_parts
@@ -62,14 +72,15 @@ module ModsDisplay
62
72
  title_labels.key?(element.attributes['type'].value)
63
73
  return title_labels[element.attributes['type'].value]
64
74
  end
75
+
65
76
  I18n.t('mods_display.title')
66
77
  end
67
78
 
68
79
  def title_labels
69
80
  { 'abbreviated' => I18n.t('mods_display.abbreviated_title'),
70
- 'translated' => I18n.t('mods_display.translated_title'),
81
+ 'translated' => I18n.t('mods_display.translated_title'),
71
82
  'alternative' => I18n.t('mods_display.alternative_title'),
72
- 'uniform' => I18n.t('mods_display.uniform_title') }
83
+ 'uniform' => I18n.t('mods_display.uniform_title') }
73
84
  end
74
85
  end
75
86
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  class Values
3
5
  attr_accessor :label, :values
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  class HTML
3
5
  MODS_DISPLAY_FIELD_MAPPING = {
@@ -33,9 +35,8 @@ module ModsDisplay
33
35
  end
34
36
 
35
37
  def title
36
- unless mods_field(:title).fields.empty?
37
- return mods_field(:title).fields.first.values
38
- end
38
+ return mods_field(:title).fields.first.values unless mods_field(:title).fields.empty?
39
+
39
40
  ''
40
41
  end
41
42
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  module RelatedItemConcerns
3
5
  private
@@ -16,12 +18,12 @@ module ModsDisplay
16
18
 
17
19
  def related_item_is_a_constituent?(item)
18
20
  item.attributes['type'].respond_to?(:value) &&
19
- item.attributes['type'].value == 'constituent'
21
+ item.attributes['type'].value == 'constituent'
20
22
  end
21
23
 
22
24
  def related_item_is_host?(item)
23
25
  item.attributes['type'].respond_to?(:value) &&
24
- item.attributes['type'].value == 'host'
26
+ item.attributes['type'].value == 'host'
25
27
  end
26
28
  end
27
29
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
4
  module RelatorCodes
3
5
  def relator_codes
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ModsDisplay
2
- VERSION = '1.0.0.alpha3'
4
+ VERSION = '1.0.0'
3
5
  end
data/lib/mods_display.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mods_display/version'
2
4
  require 'mods_display/html'
3
5
  require 'mods_display/country_codes'
@@ -34,14 +36,14 @@ require 'stanford-mods'
34
36
 
35
37
  require 'i18n'
36
38
  require 'i18n/backend/fallbacks'
37
- I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
38
- I18n.load_path += Dir["#{File.expand_path('../..', __FILE__)}/config/locales/*.yml"]
39
+ I18n::Backend::Simple.include I18n::Backend::Fallbacks
40
+ I18n.load_path += Dir["#{File.expand_path('..', __dir__)}/config/locales/*.yml"]
39
41
  I18n.backend.load_translations
40
42
 
41
43
  begin
42
44
  require 'rails'
43
45
  rescue LoadError
44
- #do nothing
46
+ # do nothing
45
47
  end
46
48
 
47
49
  require 'mods_display/engine' if defined?(Rails)
data/mods_display.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |gem|
21
21
  gem.executables = gem.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
22
22
  gem.require_paths = ["lib"]
23
23
 
24
- gem.add_dependency 'stanford-mods', '~> 2.1'
24
+ gem.add_dependency 'stanford-mods', '>= 3.0.0.alpha1', '< 4'
25
25
  gem.add_dependency 'i18n'
26
26
  gem.add_dependency 'view_component'
27
27
 
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mods_display
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.alpha3
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jessie Keck
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-18 00:00:00.000000000 Z
11
+ date: 2022-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: stanford-mods
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.1'
19
+ version: 3.0.0.alpha1
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '4'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0.alpha1
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: '2.1'
32
+ version: '4'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: i18n
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -235,9 +241,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
241
  version: '0'
236
242
  required_rubygems_version: !ruby/object:Gem::Requirement
237
243
  requirements:
238
- - - ">"
244
+ - - ">="
239
245
  - !ruby/object:Gem::Version
240
- version: 1.3.1
246
+ version: '0'
241
247
  requirements: []
242
248
  rubygems_version: 3.2.32
243
249
  signing_key: