mods_display 0.2.1 → 0.2.2
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/lib/mods_display/country_codes.rb +2 -1
- data/lib/mods_display/fields/name.rb +34 -24
- data/lib/mods_display/fields/subject.rb +2 -2
- data/lib/mods_display/fields/title.rb +1 -1
- data/lib/mods_display/version.rb +1 -1
- data/spec/fields/imprint_spec.rb +6 -0
- data/spec/fields/name_spec.rb +56 -33
- data/spec/fields/subject_spec.rb +1 -1
- data/spec/fields/title_spec.rb +10 -0
- data/spec/fixtures/imprint_fixtures.rb +12 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab713fa903d406d1b3e5d7b019a33fe02c15f5fd
|
4
|
+
data.tar.gz: d4ec7939d4d45cbf7ae8162554396b9316641940
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abb09cdaf3bbe01eab797de7dd20e5467cc66de304d151b11478f5710b55d41b72c3adcbe8e9e07061089ad628aa7435f01309f6c7db6d4468fd3482738dbb8f
|
7
|
+
data.tar.gz: 2fc0e8df881f28edfba1a85d28f54c3d802b5d1e09b633b48d79a5be58fb6c1d53654693c73b79b530113e3e0a772c86aa0ffe3c8dfb6e100062fc58a562b2c5
|
@@ -371,7 +371,8 @@ module ModsDisplay::CountryCodes
|
|
371
371
|
"xra" => "South Australia",
|
372
372
|
"xs" => "South Georgia and the South Sandwich Islands",
|
373
373
|
"xv" => "Slovenia",
|
374
|
-
|
374
|
+
# Removing per METADOR-32
|
375
|
+
#"xx" => "No place, unknown, or undetermined",
|
375
376
|
"xxc" => "Canada",
|
376
377
|
"xxk" => "United Kingdom",
|
377
378
|
"xxr" => "Soviet Union",
|
@@ -2,12 +2,12 @@ class ModsDisplay::Name < ModsDisplay::Field
|
|
2
2
|
include ModsDisplay::RelatorCodes
|
3
3
|
def fields
|
4
4
|
return_fields = @values.map do |value|
|
5
|
-
|
5
|
+
roles = process_role(value)
|
6
6
|
person = nil
|
7
7
|
if value.displayForm.length > 0
|
8
|
-
person = ModsDisplay::Name::Person.new(:name => value.displayForm.text, :
|
8
|
+
person = ModsDisplay::Name::Person.new(:name => value.displayForm.text, :roles => roles)
|
9
9
|
elsif !name_parts(value).empty?
|
10
|
-
person = ModsDisplay::Name::Person.new(:name => name_parts(value), :
|
10
|
+
person = ModsDisplay::Name::Person.new(:name => name_parts(value), :roles => roles)
|
11
11
|
end
|
12
12
|
ModsDisplay::Values.new(:label => displayLabel(value) || name_label(value), :values => [person]) if person
|
13
13
|
end.compact
|
@@ -23,7 +23,7 @@ class ModsDisplay::Name < ModsDisplay::Field
|
|
23
23
|
output << field.values.map do |val|
|
24
24
|
if @config.link
|
25
25
|
txt = link_to_value(val.name)
|
26
|
-
txt << " (#{val.
|
26
|
+
txt << " (#{val.roles.join(', ')})" if val.roles
|
27
27
|
txt
|
28
28
|
else
|
29
29
|
val.to_s
|
@@ -37,17 +37,23 @@ class ModsDisplay::Name < ModsDisplay::Field
|
|
37
37
|
private
|
38
38
|
|
39
39
|
def name_label(element)
|
40
|
-
if
|
41
|
-
if element.attributes.has_key?("type") && name_labels.has_key?(element.attributes["type"].value)
|
42
|
-
return name_labels[element.attributes["type"].value]
|
43
|
-
end
|
40
|
+
if !has_role?(element) || is_primary?(element) || has_author_or_creator_roles?(element)
|
44
41
|
"Author/Creator"
|
45
42
|
else
|
46
43
|
"Contributor"
|
47
44
|
end
|
48
45
|
end
|
49
|
-
|
50
|
-
def
|
46
|
+
|
47
|
+
def has_role?(element)
|
48
|
+
element.respond_to?(:role) and !element.role.empty?
|
49
|
+
end
|
50
|
+
|
51
|
+
def is_primary?(element)
|
52
|
+
element.attributes["usage"].respond_to?(:value) and
|
53
|
+
element.attributes["usage"].value == "primary"
|
54
|
+
end
|
55
|
+
|
56
|
+
def has_author_or_creator_roles?(element)
|
51
57
|
begin
|
52
58
|
["author", "aut", "creator", "cre", ""].include?(element.role.roleTerm.text.downcase)
|
53
59
|
rescue
|
@@ -108,22 +114,26 @@ class ModsDisplay::Name < ModsDisplay::Field
|
|
108
114
|
term.attributes["authority"].respond_to?(:value) and
|
109
115
|
term.attributes["authority"].value == "marcrelator" and
|
110
116
|
relator_codes.include?(term.text.strip)
|
111
|
-
term
|
112
|
-
term.content = relator_codes[term.text.strip]
|
113
|
-
term
|
117
|
+
relator_codes[term.text.strip]
|
114
118
|
end
|
115
|
-
end.compact
|
119
|
+
end.compact
|
116
120
|
end
|
117
121
|
end
|
118
122
|
end
|
119
123
|
|
120
124
|
def unencoded_role_term(element)
|
121
|
-
element.role.
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
end
|
125
|
+
roles = element.role.map do |role|
|
126
|
+
role.roleTerm.find do |term|
|
127
|
+
term.attributes["type"].respond_to?(:value) and
|
128
|
+
term.attributes["type"].value == "text"
|
129
|
+
end
|
130
|
+
end.compact
|
131
|
+
roles = element.role.map do |role|
|
132
|
+
role.roleTerm.find do |term|
|
133
|
+
!term.attributes["type"].respond_to?(:value)
|
134
|
+
end
|
135
|
+
end.compact if roles.empty?
|
136
|
+
roles.map{|t| t.text.strip }
|
127
137
|
end
|
128
138
|
|
129
139
|
def unencoded_role_term?(element)
|
@@ -141,15 +151,15 @@ class ModsDisplay::Name < ModsDisplay::Field
|
|
141
151
|
end
|
142
152
|
|
143
153
|
class Person
|
144
|
-
attr_accessor :name, :
|
154
|
+
attr_accessor :name, :roles
|
145
155
|
def initialize(data)
|
146
|
-
@name =
|
147
|
-
@
|
156
|
+
@name = data[:name]
|
157
|
+
@roles = data[:roles] && !data[:roles].empty? ? data[:roles] : nil
|
148
158
|
end
|
149
159
|
|
150
160
|
def to_s
|
151
161
|
text = @name.dup
|
152
|
-
text << " (#{@
|
162
|
+
text << " (#{@roles.join(', ')})" if @roles
|
153
163
|
text
|
154
164
|
end
|
155
165
|
end
|
@@ -47,7 +47,7 @@ class ModsDisplay::Subject < ModsDisplay::Field
|
|
47
47
|
if @config.link and @config.hierarchical_link
|
48
48
|
if val.is_a?(ModsDisplay::Name::Person)
|
49
49
|
txt = link_to_value(val.name, buffer.join(' '))
|
50
|
-
txt << " (#{val.
|
50
|
+
txt << " (#{val.roles.join(', ')})" if val.roles
|
51
51
|
sub_parts << txt
|
52
52
|
else
|
53
53
|
sub_parts << link_to_value(val, buffer.join(' '))
|
@@ -55,7 +55,7 @@ class ModsDisplay::Subject < ModsDisplay::Field
|
|
55
55
|
elsif @config.link
|
56
56
|
if val.is_a?(ModsDisplay::Name::Person)
|
57
57
|
txt = link_to_value(val.name)
|
58
|
-
txt << " (#{val.
|
58
|
+
txt << " (#{val.roles.join(', ')})" if val.roles
|
59
59
|
sub_parts << txt
|
60
60
|
else
|
61
61
|
sub_parts << link_to_value(val.to_s)
|
@@ -25,7 +25,7 @@ class ModsDisplay::Title < ModsDisplay::Field
|
|
25
25
|
return_values << ModsDisplay::Values.new(:label => displayLabel(value) || title_label(value), :values => [[preParts, parts].compact.join(". ")])
|
26
26
|
end
|
27
27
|
end
|
28
|
-
return_values
|
28
|
+
collapse_fields(return_values)
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
data/lib/mods_display/version.rb
CHANGED
data/spec/fields/imprint_spec.rb
CHANGED
@@ -29,6 +29,7 @@ describe ModsDisplay::Imprint do
|
|
29
29
|
@questionable_date = Stanford::Mods::Record.new.from_str(questionable_date, false).origin_info
|
30
30
|
@inferred_date = Stanford::Mods::Record.new.from_str(inferred_date, false).origin_info
|
31
31
|
@three_imprint_dates = Stanford::Mods::Record.new.from_str(three_imprint_dates, false).origin_info
|
32
|
+
@xx_country_code = Stanford::Mods::Record.new.from_str(xx_country_code, false).origin_info
|
32
33
|
@qualified_imprint_date = Stanford::Mods::Record.new.from_str(qualified_imprint_date, false).origin_info
|
33
34
|
@imprint_date_range = Stanford::Mods::Record.new.from_str(imprint_date_range, false).origin_info
|
34
35
|
@encoded_place = Stanford::Mods::Record.new.from_str(encoded_place, false).origin_info
|
@@ -205,6 +206,11 @@ describe ModsDisplay::Imprint do
|
|
205
206
|
fields.length.should == 1
|
206
207
|
fields.first.values.should include "Netherlands"
|
207
208
|
end
|
209
|
+
it "should ignore 'xx' country codes" do
|
210
|
+
fields = mods_display_imprint(@xx_country_code).fields
|
211
|
+
fields.length.should == 1
|
212
|
+
fields.first.values.should == ["1994"]
|
213
|
+
end
|
208
214
|
end
|
209
215
|
describe "to_html" do
|
210
216
|
it "should return the display form if one is available" do
|
data/spec/fields/name_spec.rb
CHANGED
@@ -17,7 +17,7 @@ describe ModsDisplay::Language do
|
|
17
17
|
before(:all) do
|
18
18
|
@name = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart></name></mods>", false).plain_name
|
19
19
|
@blank_name = Stanford::Mods::Record.new.from_str("<mods><name><namePart/><role><roleTerm></roleTerm></role></name></mods>", false).plain_name
|
20
|
-
@
|
20
|
+
@primary_name = Stanford::Mods::Record.new.from_str("<mods><name usage='primary'><namePart>John Doe</namePart><role><roleTerm>lithographer</roleTerm></role></name></mods>", false).plain_name
|
21
21
|
@contributor = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart><role><roleTerm>lithographer</roleTerm></role></name></mods>", false).plain_name
|
22
22
|
@encoded_role = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart><role><roleTerm type='code' authority='marcrelator'>ltg</roleTerm></role></name></mods>", false).plain_name
|
23
23
|
@mixed_role = Stanford::Mods::Record.new.from_str("<mods><name><role><roleTerm>publisher</roleTerm></role><namePart>John Doe</namePart><role><roleTerm type='text' authority='marcrelator'>engraver</roleTerm></role></name></mods>", false).plain_name
|
@@ -25,15 +25,17 @@ describe ModsDisplay::Language do
|
|
25
25
|
@simple_toa = Stanford::Mods::Record.new.from_str("<mods><name><namePart>Unqualfieid</namePart><namePart type='termsOfAddress'>Ier, empereur</namePart><namePart type='date'>date1-date2</namePart><namePart type='given'>Given Name</namePart><namePart type='family'>Family Name</namePart></name></mods>", false).plain_name
|
26
26
|
@display_form = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart><displayForm>Mr. John Doe</displayForm></name></mods>", false).plain_name
|
27
27
|
@collapse_label = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart></name><name><namePart>Jane Doe</namePart></name></mods>", false).plain_name
|
28
|
-
@complex_labels = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart></name><name><namePart>Jane Doe</namePart></name><name
|
28
|
+
@complex_labels = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart></name><name><namePart>Jane Doe</namePart><role><roleTerm>lithographer</roleTerm></role></name><name><namePart>John Dough</namePart></name><name><namePart>Jane Dough</namePart></name></mods>", false).plain_name
|
29
|
+
@complex_roles = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart><role><roleTerm type='text'>Depicted</roleTerm><roleTerm type='code'>dpt</roleTerm></role></name></mods>", false).plain_name
|
29
30
|
@name_with_role = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart><role><roleTerm type='text'>Depicted</roleTerm></role></name></mods>", false).plain_name
|
31
|
+
@multiple_roles = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart><role><roleTerm type='text'>Depicted</roleTerm></role><role><roleTerm type='text'>Artist</roleTerm></role></name></mods>", false).plain_name
|
30
32
|
end
|
31
33
|
describe "label" do
|
32
|
-
it "should default Author/Creator when
|
34
|
+
it "should default Author/Creator when no role is available" do
|
33
35
|
mods_display_name(@name).fields.first.label.should == "Author/Creator"
|
34
36
|
end
|
35
|
-
it "should
|
36
|
-
mods_display_name(@
|
37
|
+
it "should label 'Author/Creator' for primary authors" do
|
38
|
+
mods_display_name(@primary_name).fields.first.label.should == "Author/Creator"
|
37
39
|
end
|
38
40
|
it "should apply contributor labeling to all non blank/author/creator roles" do
|
39
41
|
mods_display_name(@contributor).fields.first.label.should == "Contributor"
|
@@ -48,25 +50,6 @@ describe ModsDisplay::Language do
|
|
48
50
|
fields.first.values.first.should be_a(ModsDisplay::Name::Person)
|
49
51
|
fields.first.values.first.name.should == "Mr. John Doe"
|
50
52
|
end
|
51
|
-
it "should get the role when present" do
|
52
|
-
fields = mods_display_name(@name_with_role).fields
|
53
|
-
fields.length.should == 1
|
54
|
-
fields.first.values.length.should == 1
|
55
|
-
fields.first.values.first.should be_a(ModsDisplay::Name::Person)
|
56
|
-
fields.first.values.first.role.should == "Depicted"
|
57
|
-
end
|
58
|
-
it "should decode encoded roleTerms when no text (or non-typed) roleTerm is available" do
|
59
|
-
fields = mods_display_name(@encoded_role).fields
|
60
|
-
fields.length.should == 1
|
61
|
-
fields.first.values.length.should == 1
|
62
|
-
fields.first.values.first.to_s.should == "John Doe (Lithographer)"
|
63
|
-
end
|
64
|
-
it "should get the type='text' role before an untyped role" do
|
65
|
-
fields = mods_display_name(@mixed_role).fields
|
66
|
-
fields.length.should == 1
|
67
|
-
fields.first.values.length.should == 1
|
68
|
-
fields.first.values.first.role.should == "engraver"
|
69
|
-
end
|
70
53
|
it "should not add blank names" do
|
71
54
|
mods_display_name(@blank_name).fields.should == []
|
72
55
|
end
|
@@ -97,18 +80,58 @@ describe ModsDisplay::Language do
|
|
97
80
|
|
98
81
|
fields.length.should == 3
|
99
82
|
fields.first.label.should == "Author/Creator"
|
100
|
-
fields.first.values.length.should ==
|
101
|
-
fields.first.values.
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
fields[1].label.should == "Meeting"
|
83
|
+
fields.first.values.length.should == 1
|
84
|
+
fields.first.values.first.to_s.should == "John Doe"
|
85
|
+
|
86
|
+
fields[1].label.should == "Contributor"
|
106
87
|
fields[1].values.length.should == 1
|
107
|
-
fields[1].values.first.
|
88
|
+
fields[1].values.first.name.should == "Jane Doe"
|
89
|
+
fields[1].values.first.roles.should == ["lithographer"]
|
108
90
|
|
109
91
|
fields.last.label.should == "Author/Creator"
|
110
|
-
fields.last.values.length.should ==
|
111
|
-
fields.last.values.
|
92
|
+
fields.last.values.length.should == 2
|
93
|
+
fields.last.values.each do |val|
|
94
|
+
["Jane Dough", "John Dough"].should include val.to_s
|
95
|
+
end
|
96
|
+
end
|
97
|
+
describe "roles" do
|
98
|
+
it "should get the role when present" do
|
99
|
+
fields = mods_display_name(@name_with_role).fields
|
100
|
+
fields.length.should == 1
|
101
|
+
fields.first.values.length.should == 1
|
102
|
+
fields.first.values.first.should be_a(ModsDisplay::Name::Person)
|
103
|
+
fields.first.values.first.roles.should == ["Depicted"]
|
104
|
+
end
|
105
|
+
it "should decode encoded roleTerms when no text (or non-typed) roleTerm is available" do
|
106
|
+
fields = mods_display_name(@encoded_role).fields
|
107
|
+
fields.length.should == 1
|
108
|
+
fields.first.values.length.should == 1
|
109
|
+
fields.first.values.first.to_s.should == "John Doe (Lithographer)"
|
110
|
+
end
|
111
|
+
it "should get the type='text' role before an untyped role" do
|
112
|
+
fields = mods_display_name(@mixed_role).fields
|
113
|
+
fields.length.should == 1
|
114
|
+
fields.first.values.length.should == 1
|
115
|
+
fields.first.values.first.roles.should == ["engraver"]
|
116
|
+
end
|
117
|
+
it "should be handled correctly when there are more than one" do
|
118
|
+
fields = mods_display_name(@multiple_roles).fields
|
119
|
+
fields.length.should == 1
|
120
|
+
fields.first.values.length.should == 1
|
121
|
+
fields.first.values.first.roles.should == ["Depicted", "Artist"]
|
122
|
+
end
|
123
|
+
it "should handle code and text roleTerms together correctly" do
|
124
|
+
fields = mods_display_name(@complex_roles).fields
|
125
|
+
fields.length.should == 1
|
126
|
+
fields.first.values.length.should == 1
|
127
|
+
fields.first.values.first.roles.should == ["Depicted"]
|
128
|
+
end
|
129
|
+
it "should comma seperate multiple roles" do
|
130
|
+
fields = mods_display_name(@multiple_roles).fields
|
131
|
+
fields.length.should == 1
|
132
|
+
fields.first.values.length.should == 1
|
133
|
+
fields.first.values.first.to_s.should == "John Doe (Depicted, Artist)"
|
134
|
+
end
|
112
135
|
end
|
113
136
|
end
|
114
137
|
|
data/spec/fields/subject_spec.rb
CHANGED
@@ -64,7 +64,7 @@ describe ModsDisplay::Subject do
|
|
64
64
|
fields.length.should == 1
|
65
65
|
fields.first.values.first.first.should be_a(ModsDisplay::Name::Person)
|
66
66
|
fields.first.values.first.first.name.should == "John Doe"
|
67
|
-
fields.first.values.first.first.
|
67
|
+
fields.first.values.first.first.roles.should == ["Depicted"]
|
68
68
|
end
|
69
69
|
it "should link the name (and not the role) correctly" do
|
70
70
|
html = mods_display_subject(@name_subject).to_html
|
data/spec/fields/title_spec.rb
CHANGED
@@ -11,6 +11,7 @@ describe ModsDisplay::Title do
|
|
11
11
|
@reverse_title_parts = Stanford::Mods::Record.new.from_str("<mods><titleInfo><nonSort>The</nonSort><title>Title</title><subTitle>For</subTitle><partNumber>Part 62</partNumber><partName>Something</partName></titleInfo></mods>", false).title_info
|
12
12
|
@display_label = Stanford::Mods::Record.new.from_str("<mods><titleInfo displayLabel='MyTitle'><title>Title</title></titleInfo></mods>", false).title_info
|
13
13
|
@display_form = Stanford::Mods::Record.new.from_str("<mods><titleInfo><title>Title</title><displayForm>The Title of This Item</displayForm></titleInfo></mods>", false).title_info
|
14
|
+
@multi_label = Stanford::Mods::Record.new.from_str("<mods><titleInfo><title>Main Title</title></titleInfo><titleInfo type='alternative'><title>Alt Title</title></titleInfo><titleInfo type='uniform'><title>Uniform Title</title></titleInfo><titleInfo type='alternative'><title>Another Alt Title</title></titleInfo><titleInfo type='alternative'><title>Yet Another Alt Title</title></titleInfo></mods>", false).title_info
|
14
15
|
@alt_title = Stanford::Mods::Record.new.from_str("<mods><titleInfo type='alternative'><title>Title</title></titleInfo></mods>", false).title_info
|
15
16
|
end
|
16
17
|
describe "labels" do
|
@@ -23,6 +24,15 @@ describe ModsDisplay::Title do
|
|
23
24
|
it "should return the label held in the displayLabel attribute of the titleInfo element when available" do
|
24
25
|
mods_display_title(@display_label).fields.first.label.should == "MyTitle"
|
25
26
|
end
|
27
|
+
it "should collapse adjacent identical labels" do
|
28
|
+
fields = mods_display_title(@multi_label).fields
|
29
|
+
fields.length.should == 4
|
30
|
+
fields[0].label.should == "Title"
|
31
|
+
fields[1].label.should == "Alternative title"
|
32
|
+
fields[2].label.should == "Uniform title"
|
33
|
+
fields[3].label.should == "Alternative title"
|
34
|
+
fields[3].values.should == ["Another Alt Title", "Yet Another Alt Title"]
|
35
|
+
end
|
26
36
|
end
|
27
37
|
describe "fields" do
|
28
38
|
it "should return an array of label/value objects" do
|
@@ -224,6 +224,18 @@ module ImprintFixtures
|
|
224
224
|
</mods>
|
225
225
|
MODS
|
226
226
|
end
|
227
|
+
def xx_country_code
|
228
|
+
<<-MODS
|
229
|
+
<mods>
|
230
|
+
<originInfo>
|
231
|
+
<place>
|
232
|
+
<placeTerm type="code" authority="marccountry">xx</placeTerm>
|
233
|
+
</place>
|
234
|
+
<dateIssued>1994</dateIssued>
|
235
|
+
</originInfo>
|
236
|
+
</mods>
|
237
|
+
MODS
|
238
|
+
end
|
227
239
|
def encoded_dates
|
228
240
|
<<-MODS
|
229
241
|
<mods>
|
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.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jessie Keck
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: stanford-mods
|