mods_display 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87d30cb62dd40cfbea25fee74bbc570a1ce43d0f
4
- data.tar.gz: b987e4fa1934888ee711883bbea27d77824eca33
3
+ metadata.gz: d059d0bb717d798e323ae91d62ac65420e0b7e34
4
+ data.tar.gz: bea28312f2984465139f312e585a315ec8de992f
5
5
  SHA512:
6
- metadata.gz: c9fc24d3da9650dbffc6c41cc8ccd6e38f37e5f078e53842c7452e3d58ab86dc2d2e019c4d0a2b2dbb9ba61e5d83fd2382a1f8a7827768c57df4db6f2124c744
7
- data.tar.gz: 907db93ea86278a194c8eb3fe0676e0a9842dcee22a413f89c5ca482898b9b8b41f5929e90ee258e7a61db49472b8a1ea2edbd023cacbb2abbe6fadb9d46ee8a
6
+ metadata.gz: a7f53d54b8fbbd9dee47ccbee7120e63725e63057602da3a3cd50f569fc1d3335ed38a326d0ae072a25457f207d4ccc7722aa79a28dab3f442b2bf78f81ea35a
7
+ data.tar.gz: 306dee0b66098f941dcfbb8c8f8138b001cf4f34b06b398b73a118c9f785b73c9ebab33f9e7b0233aa7cb6d8122034a0bc77f87ba355d5bc29fa45046ba6dca6
data/.travis.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  notifications:
2
2
  email: false
3
3
  rvm:
4
- - 2.2.3
5
- - 2.1.7
4
+ - 2.4.1
5
+ - 2.3.4
6
+ - 2.2.8
data/Gemfile CHANGED
@@ -2,3 +2,6 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in mods_display.gemspec
4
4
  gemspec
5
+
6
+ # Pin to activesupport 4.x for older versions of ruby
7
+ gem 'activesupport', '~> 4.2' if RUBY_VERSION < '2.2.2'
data/README.md CHANGED
@@ -21,7 +21,7 @@ And then execute:
21
21
  Or install it yourself as:
22
22
 
23
23
  $ gem install mods_display
24
-
24
+
25
25
  Include the `ModelExtension` into your model.
26
26
 
27
27
  class MyClass
@@ -32,11 +32,11 @@ Configure the source of the MODS XML in your model. You can pass a string of XM
32
32
 
33
33
  class MyClass
34
34
  ....
35
-
35
+
36
36
  mods_xml_source do |model|
37
37
  model.mods
38
38
  end
39
-
39
+
40
40
  end
41
41
 
42
42
  Include the `ControllerExtension` into your rails controller (or another class if not using rails).
@@ -44,7 +44,7 @@ Include the `ControllerExtension` into your rails controller (or another class i
44
44
  class MyController
45
45
  include ModsDisplay::ControllerExtension
46
46
  end
47
-
47
+
48
48
  Optionally configure the mods display gem (more on configuration later).
49
49
 
50
50
  class MyController
@@ -70,7 +70,7 @@ Both label_ and value_class accept strings to put in as a class.
70
70
 
71
71
  class MyController
72
72
  include ModsDisplay::ControllerExtension
73
-
73
+
74
74
  configure_mods_display do
75
75
  title do
76
76
  label_class "title-label"
@@ -85,7 +85,7 @@ In certain cases an application may need to explicitly remove a portion of the M
85
85
 
86
86
  class MyController
87
87
  include ModsDisplay::ControllerExtension
88
-
88
+
89
89
  configure_mods_display do
90
90
  contact do
91
91
  ignore!
@@ -111,13 +111,13 @@ The link configuration option takes 2 parameters. The first is a key that is a m
111
111
 
112
112
  class MyController
113
113
  include ModsDisplay::ControllerExtension
114
-
114
+
115
115
  configure_mods_display do
116
116
  format do
117
117
  link :format_path, '"%value%"'
118
118
  end
119
119
  end
120
-
120
+
121
121
  def format_path(format)
122
122
  "http://example.com/?f[format_field][]=#{format}"
123
123
  end
@@ -128,7 +128,7 @@ The link configuration option takes 2 parameters. The first is a key that is a m
128
128
  Depending on the implementation of subjects there may be different ways you would want to link them. The standard way of linking will just create a link passing the value to the href and the link text. However; in certain cases the subjects should be linked so that each subject to the right of a delimiter should have the values of all its preceding values in the href.
129
129
 
130
130
  [Country](http://example.com/?"Country") > [State](http://example.com/?"Country State") > [City](http://example.com/?"Country State City")
131
-
131
+
132
132
  This can be accomplished by setting the hierarchical_link configuration option to true for subjects
133
133
 
134
134
  configure_mods_display do
@@ -182,6 +182,15 @@ Given that this semantics that we're concerned with here are more about titles a
182
182
 
183
183
  ## Release/Upgrade Notes
184
184
 
185
+ #### v0.5.0
186
+ There are three major changes in this version.
187
+
188
+ 1. RelatedItem nodes with a type of `constituent` or `host` are now treated separately and will render the full MODS display of any nested metadata. If accessing the `ModsDisplay::Values` directly through their accessors (e.g. custom grouping), this new metadata is available under `.nested_related_items`.
189
+ * _**Note:** You may want to style and add some javascript toggling behavior (see exhibits for an example)._
190
+ 2. Name nodes are now grouped/labeled by their role. If you were iterating over the names and splitting them out by their labels, that will need to change.
191
+ 3. Table of contents/Summaries are now split on `--` and rendered as an unordered list.
192
+ * _**Note:** You may want to style this list._
193
+
185
194
  #### v0.3.0
186
195
 
187
196
  Labels now have internationalization support. We have added colons to the english labels due to certain languages' punctuation rules requiring different spacing between the label and colon.
@@ -4,12 +4,13 @@ en:
4
4
  abstract: "Abstract:"
5
5
  access_condition: "Access condition:"
6
6
  alternative_title: "Alternative title:"
7
- author_creator: "Author/Creator:"
7
+ associated_with: "Associated with:"
8
8
  bibliography: "Bibliography:"
9
9
  biographical_historical: "Biographical/Historical:"
10
10
  citation_reference: "Citation/Reference:"
11
11
  collection: "Collection:"
12
12
  contact: "Contact:"
13
+ constituent: "Contains:"
13
14
  contributor: "Contributor:"
14
15
  copyright: "Copyright:"
15
16
  copyright_date: "Copyright date:"
@@ -27,6 +28,7 @@ en:
27
28
  genre: "Genre:"
28
29
  geo_extension: 'Format:'
29
30
  handle: "Handle:"
31
+ host: "Appears in:"
30
32
  identifier: "Identifier:"
31
33
  imprint: "Imprint:"
32
34
  isbn: "ISBN:"
data/lib/mods_display.rb CHANGED
@@ -4,6 +4,7 @@ require 'mods_display/html'
4
4
  require 'mods_display/model_extension'
5
5
  require 'mods_display/country_codes'
6
6
  require 'mods_display/relator_codes'
7
+ require 'mods_display/related_item_concerns'
7
8
  require 'mods_display/configuration'
8
9
  require 'mods_display/configuration/base'
9
10
  require 'mods_display/configuration/access_condition'
@@ -32,6 +33,7 @@ require 'mods_display/fields/imprint'
32
33
  require 'mods_display/fields/language'
33
34
  require 'mods_display/fields/location'
34
35
  require 'mods_display/fields/name'
36
+ require 'mods_display/fields/nested_related_item'
35
37
  require 'mods_display/fields/note'
36
38
  require 'mods_display/fields/related_item'
37
39
  require 'mods_display/fields/resource_type'
@@ -70,6 +70,10 @@ module ModsDisplay
70
70
  @related_item ||= ModsDisplay::Configuration::RelatedItem.new(&related_item || proc {})
71
71
  end
72
72
 
73
+ def nested_related_item(&nested_related_item)
74
+ @nested_related_item ||= ModsDisplay::Configuration::Base.new(&nested_related_item || proc {})
75
+ end
76
+
73
77
  def subject(&subject)
74
78
  @subject ||= ModsDisplay::Configuration::Subject.new(&subject || proc {})
75
79
  end
@@ -1,5 +1,23 @@
1
1
  module ModsDisplay
2
2
  class Contents < Field
3
+ def to_html
4
+ return nil if fields.empty? || @config.ignore?
5
+ output = ''
6
+ fields.each do |field|
7
+ next unless field.values.any? { |f| f && !f.empty? }
8
+ output << "<dt#{label_class} #{sanitized_field_title(field.label)}>#{field.label}</dt>"
9
+ output << "<dd#{value_class}>"
10
+ output << '<ul><li>'
11
+ # compress all values into a "--"-delimited string then split them up
12
+ output << field.values.join('--').split('--').map(&:strip).map do |val|
13
+ @config.link ? link_to_value(val.to_s) : link_urls_and_email(val.to_s)
14
+ end.join('</li><li>')
15
+ output << '</li></ul>'
16
+ output << '</dd>'
17
+ end
18
+ output
19
+ end
20
+
3
21
  private
4
22
 
5
23
  def displayLabel(element)
@@ -3,16 +3,17 @@ module ModsDisplay
3
3
  include ModsDisplay::RelatorCodes
4
4
  def fields
5
5
  return_fields = @values.map do |value|
6
- roles = process_role(value)
7
- person = nil
8
- if value.displayForm.length > 0
9
- person = ModsDisplay::Name::Person.new(name: value.displayForm.text, roles: roles)
10
- elsif !name_parts(value).empty?
11
- person = ModsDisplay::Name::Person.new(name: name_parts(value), roles: roles)
6
+ person = if value.displayForm.length > 0
7
+ ModsDisplay::Name::Person.new(name: value.displayForm.text)
8
+ elsif !name_parts(value).empty?
9
+ ModsDisplay::Name::Person.new(name: name_parts(value))
10
+ end
11
+ # The person may have multiple roles, so we have to divide them up into an array
12
+ role_labels(value).collect do |role_label|
13
+ ModsDisplay::Values.new(label: displayLabel(value) || role_label, values: [person]) if person
12
14
  end
13
- ModsDisplay::Values.new(label: displayLabel(value) || name_label(value), values: [person]) if person
14
- end.compact
15
- collapse_fields(return_fields)
15
+ end.flatten.compact
16
+ collapse_roles(collapse_fields(return_fields))
16
17
  end
17
18
 
18
19
  def to_html
@@ -23,9 +24,7 @@ module ModsDisplay
23
24
  output << "<dd#{value_class}>"
24
25
  output << field.values.map do |val|
25
26
  if @config.link
26
- txt = link_to_value(val.name)
27
- txt << " (#{val.roles.join(', ')})" if val.roles
28
- txt
27
+ link_to_value(val.name)
29
28
  else
30
29
  val.to_s
31
30
  end
@@ -37,12 +36,21 @@ module ModsDisplay
37
36
 
38
37
  private
39
38
 
40
- def name_label(element)
41
- if !role?(element) || primary?(element) || author_or_creator_roles?(element)
42
- I18n.t('mods_display.author_creator')
43
- else
44
- I18n.t('mods_display.contributor')
45
- end
39
+ def collapse_roles(fields)
40
+ return [] if fields.blank?
41
+
42
+ label_order = fields.map(&:label)
43
+ results = consolidate_under_labels(fields)
44
+ label_keys = normalize_labels(label_order, results)
45
+ rebuild_fields_with_new_labels(label_keys, results)
46
+ end
47
+
48
+ def role_labels(element)
49
+ default_label = I18n.t('mods_display.associated_with')
50
+ return [default_label] unless element.role.present? && element.role.roleTerm.present?
51
+ element.role.roleTerm.collect do |role|
52
+ relator_codes[role.text.downcase] || role.text.capitalize || default_label
53
+ end.uniq
46
54
  end
47
55
 
48
56
  def role?(element)
@@ -54,12 +62,6 @@ module ModsDisplay
54
62
  element.attributes['usage'].value == 'primary'
55
63
  end
56
64
 
57
- def author_or_creator_roles?(element)
58
- ['author', 'aut', 'creator', 'cre', ''].include?(element.role.roleTerm.text.downcase)
59
- rescue
60
- false
61
- end
62
-
63
65
  def name_parts(element)
64
66
  output = ''
65
67
  output << [unqualified_name_parts(element),
@@ -100,22 +102,6 @@ module ModsDisplay
100
102
  end
101
103
  end
102
104
 
103
- def process_role(element)
104
- return unless element.role.length > 0 && element.role.roleTerm.length > 0
105
- if unencoded_role_term?(element)
106
- unencoded_role_term(element)
107
- else
108
- element.role.roleTerm.map do |term|
109
- next unless term.attributes['type'].respond_to?(:value) &&
110
- term.attributes['type'].value == 'code' &&
111
- term.attributes['authority'].respond_to?(:value) &&
112
- term.attributes['authority'].value == 'marcrelator' &&
113
- relator_codes.include?(term.text.strip)
114
- relator_codes[term.text.strip]
115
- end.compact
116
- end
117
- end
118
-
119
105
  def unencoded_role_term(element)
120
106
  roles = element.role.map do |role|
121
107
  role.roleTerm.find do |term|
@@ -138,17 +124,49 @@ module ModsDisplay
138
124
  end
139
125
  end
140
126
 
127
+ # Consolidate all names under label headings
128
+ def consolidate_under_labels(fields)
129
+ results = {}
130
+ fields.each do |mdv| # ModsDisplay::Values
131
+ results[mdv.label] ||= []
132
+ results[mdv.label] << mdv.values
133
+ results[mdv.label].flatten!
134
+ end
135
+ results
136
+ end
137
+
138
+ # Normalize label headings by filtering out some punctuation and ending in :
139
+ def normalize_labels(label_order, results)
140
+ label_order.uniq.map do |k|
141
+ label = k.tr('.', '').tr(':', '').strip + ':'
142
+ if label != k
143
+ results[label] = results[k]
144
+ results.delete(k)
145
+ end
146
+ label
147
+ end
148
+ end
149
+
150
+ def rebuild_fields_with_new_labels(label_keys, results)
151
+ # Build the new fields data, stripping out the roles within the Person classes
152
+ label_keys.uniq.map do |k|
153
+ mdv = ModsDisplay::Values.new({})
154
+ mdv.label = k
155
+ mdv.values = results[k].map do |person|
156
+ ModsDisplay::Name::Person.new(name: person.name)
157
+ end
158
+ mdv
159
+ end
160
+ end
161
+
141
162
  class Person
142
- attr_accessor :name, :roles
163
+ attr_accessor :name
143
164
  def initialize(data)
144
165
  @name = data[:name]
145
- @roles = data[:roles] && !data[:roles].empty? ? data[:roles] : nil
146
166
  end
147
167
 
148
168
  def to_s
149
- text = @name.dup
150
- text << " (#{@roles.join(', ')})" if @roles
151
- text
169
+ @name
152
170
  end
153
171
  end
154
172
  end
@@ -0,0 +1,60 @@
1
+ module ModsDisplay
2
+ ##
3
+ # This class will hopefully take over for related item support more broadly.
4
+ # Currently there is behavior in RelatedItem and Collection that would need
5
+ # to be accounted for when adding nested metadata support.
6
+ class NestedRelatedItem < Field
7
+ include ModsDisplay::RelatedItemConcerns
8
+
9
+ def fields
10
+ return_fields = @values.map do |value|
11
+ next if related_item_is_a_collection?(value)
12
+ next unless render_nested_related_item?(value)
13
+
14
+ related_item_mods_object(value)
15
+ end.compact
16
+ collapse_fields(return_fields)
17
+ end
18
+
19
+ def to_html
20
+ return nil if fields.empty? || @config.ignore?
21
+ output = ''
22
+ fields.each do |field|
23
+ next unless field.values.any? { |f| f && !f.empty? }
24
+ output << "<dt#{label_class} #{sanitized_field_title(field.label)}>#{field.label}</dt>"
25
+ output << "<dd#{value_class}>"
26
+ output << '<ul class="mods_display_nested_related_items">'
27
+ output << field.values.map do |val|
28
+ "<li class='mods_display_nested_related_item open'>#{link_urls_and_email(val.to_s)}</li>"
29
+ end.join
30
+ output << '</ul>'
31
+ output << '</dd>'
32
+ end
33
+ output
34
+ end
35
+
36
+ private
37
+
38
+ def related_item_mods_object(value)
39
+ mods = ::Stanford::Mods::Record.new.tap { |r| r.from_str("<mods>#{value.children.to_xml}</mods>", false) }
40
+ related_item = ModsDisplay::HTML.new(@config, mods, @klass)
41
+
42
+ ModsDisplay::Values.new(
43
+ label: related_item_label(value),
44
+ values: [[Array.wrap(related_item.title).first, related_item_body(related_item)].compact.join]
45
+ )
46
+ end
47
+
48
+ def related_item_body(related_item)
49
+ return if related_item.body == '<dl></dl>'
50
+ related_item.body
51
+ end
52
+
53
+ def related_item_label(item)
54
+ return displayLabel(item) if displayLabel(item)
55
+ return I18n.t('mods_display.constituent') if related_item_is_a_constituent?(item)
56
+
57
+ I18n.t('mods_display.host')
58
+ end
59
+ end
60
+ end
@@ -1,8 +1,11 @@
1
1
  module ModsDisplay
2
2
  class RelatedItem < Field
3
+ include ModsDisplay::RelatedItemConcerns
4
+
3
5
  def fields
4
6
  return_fields = @values.map do |value|
5
7
  next if related_item_is_a_collection?(value)
8
+ next if render_nested_related_item?(value)
6
9
  case
7
10
  when related_item_is_a_location?(value)
8
11
  process_location value
@@ -44,14 +47,6 @@ module ModsDisplay
44
47
  item.note].flatten.compact.map!(&:text).map!(&:strip).join(' ')
45
48
  end
46
49
 
47
- def related_item_is_a_collection?(item)
48
- item.respond_to?(:titleInfo) &&
49
- item.respond_to?(:typeOfResource) &&
50
- item.typeOfResource.attributes.length > 0 &&
51
- item.typeOfResource.attributes.first.key?('collection') &&
52
- item.typeOfResource.attributes.first['collection'].value == 'yes'
53
- end
54
-
55
50
  def related_item_is_a_location?(item)
56
51
  !related_item_is_a_collection?(item) &&
57
52
  !related_item_is_a_reference?(item) &&
@@ -45,17 +45,13 @@ module ModsDisplay
45
45
  end
46
46
  if @config.link && @config.hierarchical_link
47
47
  if val.is_a?(ModsDisplay::Name::Person)
48
- txt = link_to_value(val.name, buffer.join(' '))
49
- txt << " (#{val.roles.join(', ')})" if val.roles
50
- sub_parts << txt
48
+ sub_parts << link_to_value(val.name, buffer.join(' '))
51
49
  else
52
50
  sub_parts << link_to_value(val, buffer.join(' '))
53
51
  end
54
52
  elsif @config.link
55
53
  if val.is_a?(ModsDisplay::Name::Person)
56
- txt = link_to_value(val.name)
57
- txt << " (#{val.roles.join(', ')})" if val.roles
58
- sub_parts << txt
54
+ sub_parts << link_to_value(val.name)
59
55
  else
60
56
  sub_parts << link_to_value(val.to_s)
61
57
  end
@@ -89,6 +89,7 @@ module ModsDisplay
89
89
  :note,
90
90
  :contact,
91
91
  :collection,
92
+ :nestedRelatedItem,
92
93
  :relatedItem,
93
94
  :subject,
94
95
  :identifier,
@@ -116,6 +117,7 @@ module ModsDisplay
116
117
  note: :note,
117
118
  contact: :note,
118
119
  collection: :related_item,
120
+ nestedRelatedItem: :related_item,
119
121
  relatedItem: :related_item,
120
122
  subject: :subject,
121
123
  identifier: :identifier,
@@ -127,7 +129,8 @@ module ModsDisplay
127
129
  { subTitle: :sub_title,
128
130
  resourceType: :resource_type,
129
131
  relatedItem: :related_item,
130
- accessCondition: :access_condition
132
+ accessCondition: :access_condition,
133
+ nestedRelatedItem: :nested_related_item
131
134
  }
132
135
  end
133
136
  end
@@ -0,0 +1,27 @@
1
+ module ModsDisplay
2
+ module RelatedItemConcerns
3
+ private
4
+
5
+ def render_nested_related_item?(item)
6
+ related_item_is_a_constituent?(item) || related_item_is_host?(item)
7
+ end
8
+
9
+ def related_item_is_a_collection?(item)
10
+ item.respond_to?(:titleInfo) &&
11
+ item.respond_to?(:typeOfResource) &&
12
+ !item.typeOfResource.attributes.empty? &&
13
+ item.typeOfResource.attributes.first.key?('collection') &&
14
+ item.typeOfResource.attributes.first['collection'].value == 'yes'
15
+ end
16
+
17
+ def related_item_is_a_constituent?(item)
18
+ item.attributes['type'].respond_to?(:value) &&
19
+ item.attributes['type'].value == 'constituent'
20
+ end
21
+
22
+ def related_item_is_host?(item)
23
+ item.attributes['type'].respond_to?(:value) &&
24
+ item.attributes['type'].value == 'host'
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module ModsDisplay
2
- VERSION = '0.4.1'
2
+ VERSION = '0.5.0'
3
3
  end
data/mods_display.gemspec CHANGED
@@ -23,4 +23,6 @@ Gem::Specification.new do |gem|
23
23
  gem.add_development_dependency 'rake'
24
24
  gem.add_development_dependency 'rspec', '~> 3.0'
25
25
  gem.add_development_dependency 'rubocop'
26
+ gem.add_development_dependency 'capybara'
27
+ gem.add_development_dependency 'byebug'
26
28
  end
@@ -21,4 +21,19 @@ describe ModsDisplay::Contents do
21
21
  expect(mods_display_contents(@display_label).label).to eq('Special Label:')
22
22
  end
23
23
  end
24
+ context 'multi-valued contents' do
25
+ let(:toc) do
26
+ Stanford::Mods::Record.new.from_str(
27
+ '<mods><tableOfContents>Content Note 1 -- Content Note 2</tableOfContents></mods>', false
28
+ ).tableOfContents
29
+ end
30
+ it 'should have one value with "--" marker' do
31
+ mdc = mods_display_contents(toc)
32
+ expect(mdc.fields.first.values).to eq ['Content Note 1 -- Content Note 2']
33
+ end
34
+ it 'should render as a list' do
35
+ html = mods_display_contents(toc).to_html
36
+ expect(html).to include '<dd><ul><li>Content Note 1</li><li>Content Note 2</li></ul></dd>'
37
+ end
38
+ end
24
39
  end
@@ -19,6 +19,7 @@ describe ModsDisplay::Language do
19
19
  @name = Stanford::Mods::Record.new.from_str(simple_name_fixture, false).plain_name
20
20
  @blank_name = Stanford::Mods::Record.new.from_str(blank_name_fixture, false).plain_name
21
21
  @primary_name = Stanford::Mods::Record.new.from_str(primary_name_fixture, false).plain_name
22
+ @primary_name_solo = Stanford::Mods::Record.new.from_str(primary_name_solo_fixture, false).plain_name
22
23
  @contributor = Stanford::Mods::Record.new.from_str(contributor_fixture, false).plain_name
23
24
  @encoded_role = Stanford::Mods::Record.new.from_str(encoded_role_fixture, false).plain_name
24
25
  @mixed_role = Stanford::Mods::Record.new.from_str(mixed_role_fixture, false).plain_name
@@ -30,16 +31,27 @@ describe ModsDisplay::Language do
30
31
  @complex_roles = Stanford::Mods::Record.new.from_str(complex_role_name_fixture, false).plain_name
31
32
  @name_with_role = Stanford::Mods::Record.new.from_str(name_with_role_fixture, false).plain_name
32
33
  @multiple_roles = Stanford::Mods::Record.new.from_str(multiple_roles_fixture, false).plain_name
34
+ @author_role = Stanford::Mods::Record.new.from_str(author_role_fixture, false).plain_name
35
+ @many_roles_and_names = Stanford::Mods::Record.new.from_str(many_roles_and_names_fixture, false).plain_name
36
+ @names_with_code_and_text_roles = Stanford::Mods::Record.new.from_str(names_with_code_and_text_roles_fixture, false).plain_name
33
37
  end
38
+ let(:default_label) { 'Associated with:' }
39
+
34
40
  describe 'label' do
35
41
  it 'should default Author/Creator when no role is available' do
36
- expect(mods_display_name(@name).fields.first.label).to eq('Author/Creator:')
42
+ expect(mods_display_name(@name).fields.first.label).to eq(default_label)
43
+ end
44
+ it "should label as role for primary authors with a role" do
45
+ expect(mods_display_name(@primary_name).fields.first.label).to eq('Lithographer:')
37
46
  end
38
- it "should label 'Author/Creator' for primary authors" do
39
- expect(mods_display_name(@primary_name).fields.first.label).to eq('Author/Creator:')
47
+ it "should label 'Author/Creator' for non-role primary authors" do
48
+ expect(mods_display_name(@primary_name_solo).fields.first.label).to eq(default_label)
40
49
  end
41
- it 'should apply contributor labeling to all non blank/author/creator roles' do
42
- expect(mods_display_name(@contributor).fields.first.label).to eq('Contributor:')
50
+ it 'should apply role labeling with text' do
51
+ expect(mods_display_name(@contributor).fields.first.label).to eq('Lithographer:')
52
+ end
53
+ it 'should apply role labeling with code' do
54
+ expect(mods_display_name(@author_role).fields.first.label).to eq('Author:')
43
55
  end
44
56
  end
45
57
 
@@ -71,7 +83,7 @@ describe ModsDisplay::Language do
71
83
  it 'should collapse adjacent matching labels' do
72
84
  fields = mods_display_name(@collapse_label).fields
73
85
  expect(fields.length).to eq(1)
74
- expect(fields.first.label).to eq('Author/Creator:')
86
+ expect(fields.first.label).to eq(default_label)
75
87
  fields.first.values.each do |val|
76
88
  expect(['John Doe', 'Jane Doe']).to include val.to_s
77
89
  end
@@ -79,59 +91,64 @@ describe ModsDisplay::Language do
79
91
  it 'should perseve order and separation of non-adjesent matching labels' do
80
92
  fields = mods_display_name(@complex_labels).fields
81
93
 
82
- expect(fields.length).to eq(3)
83
- expect(fields.first.label).to eq('Author/Creator:')
84
- expect(fields.first.values.length).to eq(1)
85
- expect(fields.first.values.first.to_s).to eq('John Doe')
94
+ expect(fields.length).to eq(2)
95
+ expect(fields.first.label).to eq(default_label)
96
+ expect(fields.first.values.length).to eq(3)
97
+ expect(fields.first.values.map(&:to_s)).to include 'John Doe', 'Jane Dough', 'John Dough'
86
98
 
87
- expect(fields[1].label).to eq('Contributor:')
99
+ expect(fields[1].label).to eq('Lithographer:')
88
100
  expect(fields[1].values.length).to eq(1)
89
101
  expect(fields[1].values.first.name).to eq('Jane Doe')
90
- expect(fields[1].values.first.roles).to eq(['lithographer'])
91
-
92
- expect(fields.last.label).to eq('Author/Creator:')
93
- expect(fields.last.values.length).to eq(2)
94
- fields.last.values.each do |val|
95
- expect(['Jane Dough', 'John Dough']).to include val.to_s
96
- end
97
102
  end
98
103
  describe 'roles' do
99
104
  it 'should get the role when present' do
100
105
  fields = mods_display_name(@name_with_role).fields
101
106
  expect(fields.length).to eq(1)
107
+ expect(fields.first.label).to eq('Depicted:')
102
108
  expect(fields.first.values.length).to eq(1)
103
109
  expect(fields.first.values.first).to be_a(ModsDisplay::Name::Person)
104
- expect(fields.first.values.first.roles).to eq(['Depicted'])
105
110
  end
106
111
  it 'should decode encoded roleTerms when no text (or non-typed) roleTerm is available' do
107
112
  fields = mods_display_name(@encoded_role).fields
108
113
  expect(fields.length).to eq(1)
114
+ expect(fields.first.label).to eq('Lithographer:')
109
115
  expect(fields.first.values.length).to eq(1)
110
- expect(fields.first.values.first.to_s).to eq('John Doe (Lithographer)')
116
+ expect(fields.first.values.first.to_s).to eq('John Doe')
111
117
  end
112
118
  it "should get the type='text' role before an untyped role" do
113
119
  fields = mods_display_name(@mixed_role).fields
114
- expect(fields.length).to eq(1)
120
+ expect(fields.length).to eq(2)
121
+ expect(fields.first.label).to eq 'Publisher:'
122
+ expect(fields.last.label).to eq 'Engraver:'
115
123
  expect(fields.first.values.length).to eq(1)
116
- expect(fields.first.values.first.roles).to eq(['engraver'])
124
+ expect(fields.last.values.length).to eq(1)
125
+ expect(fields.first.values.first.name).to eq fields.last.values.first.name
117
126
  end
118
127
  it 'should be handled correctly when there are more than one' do
119
128
  fields = mods_display_name(@multiple_roles).fields
120
- expect(fields.length).to eq(1)
129
+ expect(fields.length).to eq 2
130
+ expect(fields.first.label).to eq 'Depicted:'
131
+ expect(fields.last.label).to eq 'Artist:'
121
132
  expect(fields.first.values.length).to eq(1)
122
- expect(fields.first.values.first.roles).to eq(%w(Depicted Artist))
133
+ expect(fields.last.values.length).to eq(1)
134
+ expect(fields.first.values.first.name).to eq fields.last.values.first.name
123
135
  end
124
136
  it 'should handle code and text roleTerms together correctly' do
125
137
  fields = mods_display_name(@complex_roles).fields
126
- expect(fields.length).to eq(1)
127
- expect(fields.first.values.length).to eq(1)
128
- expect(fields.first.values.first.roles).to eq(['Depicted'])
138
+ expect(fields.length).to eq 2
139
+ expect(fields.first.label).to eq 'Depicted:'
140
+ expect(fields.last.label).to eq 'Depositor:'
141
+ expect(fields.first.values.first.name).to eq fields.last.values.first.name
129
142
  end
130
- it 'should comma seperate multiple roles' do
131
- fields = mods_display_name(@multiple_roles).fields
132
- expect(fields.length).to eq(1)
133
- expect(fields.first.values.length).to eq(1)
134
- expect(fields.first.values.first.to_s).to eq('John Doe (Depicted, Artist)')
143
+ it 'should handle consolidation of many roles and names' do
144
+ fields = mods_display_name(@many_roles_and_names).fields
145
+ expect(fields.length).to eq 6
146
+ expect(fields.map(&:label)).to eq %w[Associated\ with: Surveyor: Cartographer: Editor: Electrotyper: Lithographer:]
147
+ end
148
+ it 'should handle consolidation of names with both code and text roleTerms' do
149
+ fields = mods_display_name(@names_with_code_and_text_roles).fields
150
+ expect(fields.length).to eq 3
151
+ expect(fields.map(&:label)).to eq %w[Author: Printer: Donor:]
135
152
  end
136
153
  end
137
154
  end
@@ -139,11 +156,11 @@ describe ModsDisplay::Language do
139
156
  describe 'to_html' do
140
157
  it 'should add the role to the name in parens' do
141
158
  html = mods_display_name(@name_with_role).to_html
142
- expect(html).to match(%r{<dd>John Doe \(Depicted\)</dd>})
159
+ expect(html).to match(%r{<dd>John Doe</dd>})
143
160
  end
144
- it 'should linke the name and not the role if requested' do
161
+ it 'should link the name and not the role if requested' do
145
162
  html = mods_display_name_link(@name_with_role).to_html
146
- expect(html).to match(%r{<dd><a href='.*\?John Doe'>John Doe</a> \(Depicted\)</dd>})
163
+ expect(html).to match(%r{<dd><a href='.*\?John Doe'>John Doe</a></dd>})
147
164
  end
148
165
  end
149
166
  end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe ModsDisplay::NestedRelatedItem do
4
+ include RelatedItemFixtures
5
+ include NestedRelatedItemFixtures
6
+
7
+ let(:nested_related_item) do
8
+ described_class.new(
9
+ Stanford::Mods::Record.new.from_str(mods, false).related_item,
10
+ ModsDisplay::Configuration::Base.new,
11
+ double('controller')
12
+ )
13
+ end
14
+
15
+ describe '#label' do
16
+ subject(:label) { nested_related_item.fields.first.label }
17
+
18
+ context 'when a constituent' do
19
+ let(:mods) { multi_constituent_fixture }
20
+
21
+ it { is_expected.to eq 'Contains:' }
22
+ end
23
+
24
+ context 'when a host' do
25
+ let(:mods) { related_item_host_fixture }
26
+
27
+ it { is_expected.to eq 'Appears in:' }
28
+ end
29
+ end
30
+
31
+ describe '#fields' do
32
+ subject(:fields) { nested_related_item.fields }
33
+
34
+ context 'when an element that should be nested' do
35
+ let(:mods) { multi_constituent_fixture }
36
+
37
+ it 'has a field for each related item' do
38
+ expect(fields.length).to eq 1
39
+ end
40
+ end
41
+
42
+ context 'when a collection' do
43
+ let(:mods) { related_item_host_fixture }
44
+
45
+ it 'is not included' do
46
+ expect(fields.length).to eq 1 # This fixture has two host related items one of which is a collection
47
+ expect(fields.first.values.to_s).not_to include 'A collection'
48
+ end
49
+ end
50
+
51
+ context 'when handled by another related_item class' do
52
+ let(:mods) { basic_related_item_fixture }
53
+
54
+ it { is_expected.to be_empty }
55
+ end
56
+ end
57
+
58
+ describe '#to_html' do
59
+ subject(:html) { Capybara.string(nested_related_item.to_html) }
60
+ let(:mods) { related_item_host_fixture }
61
+
62
+ it 'renders an unordered list with an embedded dl containing the metadata of the related item' do
63
+ within(html.first('dd')) do |dd|
64
+ expect(dd).to have_css('ul.mods_display_nested_related_items')
65
+ within(dd.find('ul.mods_display_nested_related_items li')) do |li|
66
+ expect(li).to have_css('dl dt', text: 'Custom Notes:')
67
+ expect(li).to have_css('dl dd', text: 'A note content')
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -6,6 +6,7 @@ end
6
6
 
7
7
  describe ModsDisplay::RelatedItem do
8
8
  include RelatedItemFixtures
9
+ include NestedRelatedItemFixtures
9
10
 
10
11
  before(:all) do
11
12
  @item = Stanford::Mods::Record.new.from_str(basic_related_item_fixture, false).related_item
@@ -16,7 +17,13 @@ describe ModsDisplay::RelatedItem do
16
17
  @reference = Stanford::Mods::Record.new.from_str(related_item_reference_fixture, false).related_item
17
18
  @blank_item = Stanford::Mods::Record.new.from_str(blank_related_item_fixture, false).related_item
18
19
  @multi_items = Stanford::Mods::Record.new.from_str(multi_related_item_fixture, false).related_item
20
+ @constituent_items = Stanford::Mods::Record.new.from_str(multi_constituent_fixture, false).related_item
19
21
  end
22
+
23
+ it 'excludes related items that will be rendered as a nested record' do
24
+ expect(mods_display_item(@constituent_items).fields).to be_empty
25
+ end
26
+
20
27
  describe 'label' do
21
28
  it 'should default to Related Item' do
22
29
  expect(mods_display_item(@item).fields.first.label).to eq('Related item:')
@@ -68,16 +68,15 @@ describe ModsDisplay::Subject do
68
68
  expect(fields.length).to eq(1)
69
69
  expect(fields.first.values.first.first).to be_a(ModsDisplay::Name::Person)
70
70
  expect(fields.first.values.first.first.name).to eq('John Doe')
71
- expect(fields.first.values.first.first.roles).to eq(['Depicted'])
72
71
  end
73
72
  it 'should link the name (and not the role) correctly' do
74
73
  html = mods_display_subject(@name_subject).to_html
75
- expect(html).to match(%r{<a href='.*\?John Doe'>John Doe</a> \(Depicted\)})
74
+ expect(html).to match(%r{<a href='.*\?John Doe'>John Doe</a>})
76
75
  expect(html).to match(%r{<a href='.*\?Anonymous People'>Anonymous People</a>})
77
76
  end
78
77
  it 'should linke the name (and not the role) correctly when linking hierarchicaly' do
79
78
  html = mods_display_hierarchical_subject(@name_subject).to_html
80
- expect(html).to match(%r{<a href='.*\?John Doe'>John Doe</a> \(Depicted\)})
79
+ expect(html).to match(%r{<a href='.*\?John Doe'>John Doe</a>})
81
80
  expect(html).to match(%r{<a href='.*\?John Doe Anonymous People'>Anonymous People</a>})
82
81
  end
83
82
  end
@@ -35,6 +35,16 @@ module NameFixtures
35
35
  XML
36
36
  end
37
37
 
38
+ def primary_name_solo_fixture
39
+ <<-XML
40
+ <mods>
41
+ <name usage='primary'>
42
+ <namePart>John Doe</namePart>
43
+ </name>
44
+ </mods>
45
+ XML
46
+ end
47
+
38
48
  def contributor_fixture
39
49
  <<-XML
40
50
  <mods>
@@ -193,4 +203,196 @@ module NameFixtures
193
203
  </mods>
194
204
  XML
195
205
  end
206
+ def author_role_fixture
207
+ <<-XML
208
+ <mods>
209
+ <name>
210
+ <namePart>John Doe</namePart>
211
+ <role>
212
+ <roleTerm type='code' authority='marcrelator'>aut</roleTerm>
213
+ </role>
214
+ </name>
215
+ </mods>
216
+ XML
217
+ end
218
+ def many_roles_and_names_fixture # from fs947tw3404
219
+ <<-XML
220
+ <mods>
221
+ <name type="corporate">
222
+ <namePart>United States Coast Survey</namePart>
223
+ </name>
224
+ <name type="personal">
225
+ <namePart>Lawson, J. S.</namePart>
226
+ <role>
227
+ <roleTerm type="text">surveyor.</roleTerm>
228
+ </role>
229
+ </name>
230
+ <name type="personal">
231
+ <namePart>Wilkes, Charles</namePart>
232
+ <namePart type="date">1798-1877</namePart>
233
+ <role>
234
+ <roleTerm type="text">cartographer.</roleTerm>
235
+ </role>
236
+ </name>
237
+ <name type="personal">
238
+ <namePart>Jones, John P. (John Percival)</namePart>
239
+ <namePart type="date">1829-1912</namePart>
240
+ <role>
241
+ <roleTerm type="text">cartographer.</roleTerm>
242
+ </role>
243
+ </name>
244
+ <name type="personal">
245
+ <namePart>Patterson, C. P. (Carlile Pollock)</namePart>
246
+ <namePart type="date">1816-1881</namePart>
247
+ <role>
248
+ <roleTerm type="text">cartographer.</roleTerm>
249
+ </role>
250
+ </name>
251
+ <name type="personal">
252
+ <namePart>Schott, C. A.</namePart>
253
+ <role>
254
+ <roleTerm type="text">editor.</roleTerm>
255
+ </role>
256
+ </name>
257
+ <name type="personal">
258
+ <namePart>Cutts, R. D. (Richard Dominicus)</namePart>
259
+ <namePart type="date">1817-1883</namePart>
260
+ <role>
261
+ <roleTerm type="text">surveyor.</roleTerm>
262
+ </role>
263
+ </name>
264
+ <name type="personal">
265
+ <namePart>Gilbert, J. J.</namePart>
266
+ <role>
267
+ <roleTerm type="text">surveyor.</roleTerm>
268
+ </role>
269
+ </name>
270
+ <name type="personal">
271
+ <namePart>Rockwell, Cleveland</namePart>
272
+ <namePart type="date">1837-1907</namePart>
273
+ <role>
274
+ <roleTerm type="text">surveyor.</roleTerm>
275
+ </role>
276
+ </name>
277
+ <name type="personal">
278
+ <namePart>Coffin, G. W.</namePart>
279
+ <role>
280
+ <roleTerm type="text">surveyor.</roleTerm>
281
+ </role>
282
+ </name>
283
+ <name type="personal">
284
+ <namePart>Cordell, E.</namePart>
285
+ <role>
286
+ <roleTerm type="text">surveyor.</roleTerm>
287
+ </role>
288
+ </name>
289
+ <name type="personal">
290
+ <namePart>Davidson, George</namePart>
291
+ <namePart type="date">1825-1911</namePart>
292
+ <role>
293
+ <roleTerm type="text">surveyor.</roleTerm>
294
+ </role>
295
+ </name>
296
+ <name type="personal">
297
+ <namePart>Eimbeck, W.</namePart>
298
+ <role>
299
+ <roleTerm type="text">surveyor.</roleTerm>
300
+ </role>
301
+ </name>
302
+ <name type="personal">
303
+ <namePart>Hilgard, J. E. (Julius Erasmus)</namePart>
304
+ <namePart type="date">1825-1891</namePart>
305
+ <role>
306
+ <roleTerm type="text">editor.</roleTerm>
307
+ </role>
308
+ </name>
309
+ <name type="personal">
310
+ <namePart>Bache, A. D. (Alexander Dallas)</namePart>
311
+ <namePart type="date">1806-1867</namePart>
312
+ <role>
313
+ <roleTerm type="text">surveyor.</roleTerm>
314
+ </role>
315
+ </name>
316
+ <name type="personal">
317
+ <namePart>Rodgers, A. F.</namePart>
318
+ <role>
319
+ <roleTerm type="text">surveyor.</roleTerm>
320
+ </role>
321
+ </name>
322
+ <name type="personal">
323
+ <namePart>Harrison, A. M. (Alexander Medina)</namePart>
324
+ <namePart type="date">1829-1881</namePart>
325
+ <role>
326
+ <roleTerm type="text">surveyor.</roleTerm>
327
+ </role>
328
+ </name>
329
+ <name type="personal">
330
+ <namePart>Alden, James</namePart>
331
+ <namePart type="date">1810-1877</namePart>
332
+ <role>
333
+ <roleTerm type="text">surveyor.</roleTerm>
334
+ </role>
335
+ </name>
336
+ <name type="personal">
337
+ <namePart>Mathiot, G.</namePart>
338
+ <role>
339
+ <roleTerm type="text">electrotyper.</roleTerm>
340
+ </role>
341
+ </name>
342
+ <name type="personal">
343
+ <namePart>Harrison, A. M. (Alexander Medina)</namePart>
344
+ <namePart type="date">1829-1881</namePart>
345
+ <role>
346
+ <roleTerm type="text">surveyor.</roleTerm>
347
+ </role>
348
+ </name>
349
+ <name type="corporate">
350
+ <namePart>U.S. Coast and Geodetic Survey</namePart>
351
+ <role>
352
+ <roleTerm type="text">surveyor.</roleTerm>
353
+ </role>
354
+ </name>
355
+ <name type="corporate">
356
+ <namePart>N.Y. Lithographing, Engraving & Printing Co</namePart>
357
+ <role>
358
+ <roleTerm type="text">lithographer.</roleTerm>
359
+ </role>
360
+ </name>
361
+ </mods>
362
+ XML
363
+ end
364
+ def names_with_code_and_text_roles_fixture # from vn199zb9806
365
+ <<-XML
366
+ <mods>
367
+ <name type="personal" usage="primary" authority="naf" authorityURI="http://id.loc.gov/authorities/names" valueURI="http://id.loc.gov/authorities/names/n78095825" nameTitleGroup="1">
368
+ <namePart>Johnson, Samuel, 1709-1784</namePart>
369
+ <role>
370
+ <roleTerm type="code" authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/aut">aut</roleTerm>
371
+ <roleTerm type="text" authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/aut">author</roleTerm>
372
+ </role>
373
+ </name>
374
+ <name type="personal" authority="naf" authorityURI="http://id.loc.gov/authorities/names" valueURI="http://id.loc.gov/authorities/names/n78095825">
375
+ <namePart>Johnson, Samuel, 1709-1784</namePart>
376
+ <role>
377
+ <roleTerm type="code" authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/prt">prt</roleTerm>
378
+ <roleTerm type="text" authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/prt">printer</roleTerm>
379
+ </role>
380
+ </name>
381
+ <name type="personal">
382
+ <namePart>Downing, Donn Faber</namePart>
383
+ <role>
384
+ <roleTerm type="code" authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/dnr">dnr</roleTerm>
385
+ <roleTerm type="text" authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/dnr">donor</roleTerm>
386
+ </role>
387
+ </name>
388
+ <name type="personal">
389
+ <namePart>Sanders, Letitia Leigh</namePart>
390
+ <role>
391
+ <roleTerm type="code" authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/dnr">dnr</roleTerm>
392
+ <roleTerm type="text" authority="marcrelator" authorityURI="http://id.loc.gov/vocabulary/relators" valueURI="http://id.loc.gov/vocabulary/relators/dnr">donor</roleTerm>
393
+ </role>
394
+ </name>
395
+ </mods>
396
+ XML
397
+ end
196
398
  end
@@ -0,0 +1,64 @@
1
+ module NestedRelatedItemFixtures
2
+ def related_item_host_fixture
3
+ <<-XML
4
+ <mods>
5
+ <relatedItem type="host">
6
+ <titleInfo>A host type related item</titleInfo>
7
+ <note displayLabel="Custom Notes">A note content</note>
8
+ </relatedItem>
9
+ <relatedItem type="host">
10
+ <titleInfo>A collection</titleInfo>
11
+ <typeOfResource collection="yes" />
12
+ </relatedItem>
13
+ </mods>
14
+ XML
15
+ end
16
+
17
+ def multi_constituent_fixture
18
+ <<-XML
19
+ <mods>
20
+ <relatedItem type="constituent">
21
+ <titleInfo>
22
+ <title>Polychronicon (epitome and continuation to 1429)</title>
23
+ <partNumber>ff. 1r - 29v</partNumber>
24
+ </titleInfo>
25
+ <titleInfo displayLabel="Nasmith Title" type="alternative">
26
+ <title>Epitome chronicae Cicestrensis, sed extractum e Polychronico, usque ad annum Christi 1429</title>
27
+ </titleInfo>
28
+ <name type="personal">
29
+ <namePart>Ranulf Higden OSB</namePart>
30
+ <role>
31
+ <roleTerm authority="marcrelator" type="text" valueURI="http://id.loc.gov/vocabulary/relators/aut">author</roleTerm>
32
+ </role>
33
+ </name>
34
+ <note>Dates are marked in the margin. Ends with the coronation of Henry VI at St Denis</note>
35
+ <note displayLabel="Incipit" type="incipit">Ieronimus ad eugenium in epistola 43a dicit quod decime leguntur primum date ab abraham</note>
36
+ <note displayLabel="Explicit" type="explicit">videlicet nono die mensis decembris ano etatis sue 10o</note>
37
+ </relatedItem>
38
+ <relatedItem type="constituent">
39
+ <titleInfo>
40
+ <title>Gesta regum ad Henricum VI</title>
41
+ <partNumber>ff. 30r - 53r</partNumber>
42
+ </titleInfo>
43
+ <titleInfo displayLabel="Nasmith Title" type="alternative">
44
+ <title>Breviarium historiae Angliae ad annum quartum Henrici IV. viz. 1402</title>
45
+ </titleInfo>
46
+ <titleInfo displayLabel="M.R. James Title" type="alternative">
47
+ <title>Breuiarium</title>
48
+ </titleInfo>
49
+ <name type="personal">
50
+ <namePart>Thomas Harsfield</namePart>
51
+ <role>
52
+ <roleTerm authority="marcrelator" type="text" valueURI="http://id.loc.gov/vocabulary/relators/aut">author</roleTerm>
53
+ </role>
54
+ </name>
55
+ <note>Another hand. Begins with 19 lines</note>
56
+ <note displayLabel="Incipit 1" type="incipit">Albion est terra constans in finibus orbis</note>
57
+ <note displayLabel="Explicit 1" type="explicit">Petrus pictauis dat cistrensis monachusque</note>
58
+ <note displayLabel="Incipit 2" type="incipit">Et quia confrater carissime non solum audiendo sacre scripture verbis aurem sedulus auditor accomodatur (!) tenetur</note>
59
+ <note displayLabel="Explicit 2" type="explicit">Tempore huius regis Owynus quidam Wallensis erigens se in principem Wallie toto vite sue tempore cum Wallensibus rebellauit</note>
60
+ </relatedItem>
61
+ </mods>
62
+ XML
63
+ end
64
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'mods_display'
2
2
  require 'stanford-mods'
3
+ require 'capybara'
4
+
3
5
  Dir["#{File.expand_path('..', __FILE__)}/fixtures/*.rb"].each { |file| require file }
4
6
  # Load i18n test file.
5
7
  # We don't have any reliable translations yet so this
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mods_display
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jessie Keck
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-23 00:00:00.000000000 Z
11
+ date: 2017-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: stanford-mods
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: capybara
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description: MODS Display is a gem to centralize the display logic of MODS medadata.
84
112
  email:
85
113
  - jessie.keck@gmail.com
@@ -127,6 +155,7 @@ files:
127
155
  - lib/mods_display/fields/language.rb
128
156
  - lib/mods_display/fields/location.rb
129
157
  - lib/mods_display/fields/name.rb
158
+ - lib/mods_display/fields/nested_related_item.rb
130
159
  - lib/mods_display/fields/note.rb
131
160
  - lib/mods_display/fields/related_item.rb
132
161
  - lib/mods_display/fields/resource_type.rb
@@ -136,6 +165,7 @@ files:
136
165
  - lib/mods_display/fields/values.rb
137
166
  - lib/mods_display/html.rb
138
167
  - lib/mods_display/model_extension.rb
168
+ - lib/mods_display/related_item_concerns.rb
139
169
  - lib/mods_display/relator_codes.rb
140
170
  - lib/mods_display/version.rb
141
171
  - mods_display.gemspec
@@ -158,6 +188,7 @@ files:
158
188
  - spec/fields/language_spec.rb
159
189
  - spec/fields/location_spec.rb
160
190
  - spec/fields/name_spec.rb
191
+ - spec/fields/nested_related_item_spec.rb
161
192
  - spec/fields/note_spec.rb
162
193
  - spec/fields/related_item_spec.rb
163
194
  - spec/fields/resource_type_spec.rb
@@ -168,6 +199,7 @@ files:
168
199
  - spec/fixtures/cartographics_fixtures.rb
169
200
  - spec/fixtures/imprint_fixtures.rb
170
201
  - spec/fixtures/name_fixtures.rb
202
+ - spec/fixtures/nested_realted_items_fixtures.rb
171
203
  - spec/fixtures/related_item_fixtures.rb
172
204
  - spec/fixtures/subjects_fixtures.rb
173
205
  - spec/fixtures/title_fixtures.rb
@@ -195,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
227
  version: '0'
196
228
  requirements: []
197
229
  rubyforge_project:
198
- rubygems_version: 2.4.5.1
230
+ rubygems_version: 2.6.11
199
231
  signing_key:
200
232
  specification_version: 4
201
233
  summary: The MODS Display gem allows implementers to configure a customized display
@@ -221,6 +253,7 @@ test_files:
221
253
  - spec/fields/language_spec.rb
222
254
  - spec/fields/location_spec.rb
223
255
  - spec/fields/name_spec.rb
256
+ - spec/fields/nested_related_item_spec.rb
224
257
  - spec/fields/note_spec.rb
225
258
  - spec/fields/related_item_spec.rb
226
259
  - spec/fields/resource_type_spec.rb
@@ -231,6 +264,7 @@ test_files:
231
264
  - spec/fixtures/cartographics_fixtures.rb
232
265
  - spec/fixtures/imprint_fixtures.rb
233
266
  - spec/fixtures/name_fixtures.rb
267
+ - spec/fixtures/nested_realted_items_fixtures.rb
234
268
  - spec/fixtures/related_item_fixtures.rb
235
269
  - spec/fixtures/subjects_fixtures.rb
236
270
  - spec/fixtures/title_fixtures.rb