mods_display 0.0.4 → 0.0.5
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.
- data/lib/mods_display/fields/imprint.rb +119 -6
- data/lib/mods_display/version.rb +1 -1
- data/spec/fields/imprint_spec.rb +75 -9
- data/spec/fixtures/imprint_fixtures.rb +107 -19
- metadata +4 -4
@@ -19,10 +19,12 @@ class ModsDisplay::Imprint < ModsDisplay::Field
|
|
19
19
|
publisher = val.publisher.map do |p|
|
20
20
|
p.text unless p.text.strip.empty?
|
21
21
|
end.compact.join(" : ").strip unless val.publisher.text.strip.empty?
|
22
|
-
parts =
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
parts = ["dateIssued", "dateOther"].map do |date_field_name|
|
23
|
+
if val.respond_to?(date_field_name.to_sym)
|
24
|
+
parse_dates(val.send(date_field_name.to_sym))
|
25
|
+
end
|
26
|
+
end.flatten.map do |date|
|
27
|
+
date.strip unless date.strip.empty?
|
26
28
|
end.compact.join(", ")
|
27
29
|
edition = nil if edition.strip.empty?
|
28
30
|
parts = nil if parts.strip.empty?
|
@@ -33,6 +35,9 @@ class ModsDisplay::Imprint < ModsDisplay::Field
|
|
33
35
|
unless [editionPlace, parts].compact.join(", ").strip.empty?
|
34
36
|
return_values << ModsDisplay::Values.new(:label => displayLabel(val) || "Imprint", :values => [[editionPlace, parts].compact.join(", ")])
|
35
37
|
end
|
38
|
+
if dates(val).length > 0
|
39
|
+
return_values.concat(dates(val))
|
40
|
+
end
|
36
41
|
if other_pub_info(val).length > 0
|
37
42
|
other_pub_info(val).each do |pub_info|
|
38
43
|
return_values << ModsDisplay::Values.new(:label => displayLabel(val) || pub_info_labels[pub_info.name.to_sym], :values => [pub_info.text.strip])
|
@@ -42,7 +47,111 @@ class ModsDisplay::Imprint < ModsDisplay::Field
|
|
42
47
|
end
|
43
48
|
return_values
|
44
49
|
end
|
45
|
-
|
50
|
+
def dates(element)
|
51
|
+
date_field_keys.map do |date_field|
|
52
|
+
if element.respond_to?(date_field)
|
53
|
+
elements = element.send(date_field)
|
54
|
+
unless elements.empty?
|
55
|
+
ModsDisplay::Values.new(:label => displayLabel(element) || pub_info_labels[elements.first.name.to_sym], :values => parse_dates(elements))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end.compact
|
59
|
+
end
|
60
|
+
def parse_dates(date_field)
|
61
|
+
apply_date_qualifier_decoration dedup_dates join_date_ranges date_field
|
62
|
+
end
|
63
|
+
def join_date_ranges(date_fields)
|
64
|
+
if dates_are_range?(date_fields)
|
65
|
+
start_date = date_fields.find{|d| d.attributes["point"] && d.attributes["point"].value == "start"}
|
66
|
+
end_date = date_fields.find{|d| d.attributes["point"] && d.attributes["point"].value == "end"}
|
67
|
+
date_fields.map do |date|
|
68
|
+
date = date.clone # clone the date object so we don't append the same one
|
69
|
+
if normalize_date(date.text) == start_date.text
|
70
|
+
date.content = [start_date.text, end_date.text].join("-")
|
71
|
+
date
|
72
|
+
elsif normalize_date(date.text) != end_date.text
|
73
|
+
date
|
74
|
+
end
|
75
|
+
end.compact
|
76
|
+
elsif dates_are_open_range?(date_fields)
|
77
|
+
start_date = date_fields.find{|d| d.attributes["point"] && d.attributes["point"].value == "start"}
|
78
|
+
date_fields.map do |date|
|
79
|
+
date = date.clone # clone the date object so we don't append the same one
|
80
|
+
if date.text == start_date.text
|
81
|
+
date.content = "#{start_date.text}-"
|
82
|
+
end
|
83
|
+
date
|
84
|
+
end
|
85
|
+
else
|
86
|
+
date_fields
|
87
|
+
end
|
88
|
+
end
|
89
|
+
def apply_date_qualifier_decoration(date_fields)
|
90
|
+
return_fields = date_fields.map do |date|
|
91
|
+
date = date.clone
|
92
|
+
if date_is_approximate?(date)
|
93
|
+
date.content = "c#{date.text}"
|
94
|
+
elsif date_is_questionable?(date)
|
95
|
+
date.content = "[#{date.text}?]"
|
96
|
+
elsif date_is_inferred?(date)
|
97
|
+
date.content = "[#{date.text}]"
|
98
|
+
end
|
99
|
+
date
|
100
|
+
end
|
101
|
+
return_fields.map{|d| d.text }
|
102
|
+
end
|
103
|
+
def date_is_approximate?(date_field)
|
104
|
+
date_field.attributes["qualifier"] and
|
105
|
+
date_field.attributes["qualifier"].respond_to?(:value) and
|
106
|
+
date_field.attributes["qualifier"].value == "approximate"
|
107
|
+
end
|
108
|
+
def date_is_questionable?(date_field)
|
109
|
+
date_field.attributes["qualifier"] and
|
110
|
+
date_field.attributes["qualifier"].respond_to?(:value) and
|
111
|
+
date_field.attributes["qualifier"].value == "questionable"
|
112
|
+
end
|
113
|
+
def date_is_inferred?(date_field)
|
114
|
+
date_field.attributes["qualifier"] and
|
115
|
+
date_field.attributes["qualifier"].respond_to?(:value) and
|
116
|
+
date_field.attributes["qualifier"].value == "inferred"
|
117
|
+
end
|
118
|
+
def dates_are_open_range?(date_fields)
|
119
|
+
date_fields.any? do |field|
|
120
|
+
field.attributes["point"] and
|
121
|
+
field.attributes["point"].respond_to?(:value) and
|
122
|
+
field.attributes["point"].value == "start"
|
123
|
+
end and !date_fields.any? do |field|
|
124
|
+
field.attributes["point"] and
|
125
|
+
field.attributes["point"].respond_to?(:value) and
|
126
|
+
field.attributes["point"].value == "end"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
def dates_are_range?(date_fields)
|
130
|
+
attributes = date_fields.map do |date|
|
131
|
+
if date.attributes["point"].respond_to?(:value)
|
132
|
+
date.attributes["point"].value
|
133
|
+
end
|
134
|
+
end
|
135
|
+
attributes.include?("start") and
|
136
|
+
attributes.include?("end")
|
137
|
+
end
|
138
|
+
def dedup_dates(date_fields)
|
139
|
+
date_text = date_fields.map{|d| normalize_date(d.text) }
|
140
|
+
if date_text != date_text.uniq
|
141
|
+
if date_fields.find{ |d| d.attributes["qualifier"].respond_to?(:value) }
|
142
|
+
[date_fields.find{ |d| d.attributes["qualifier"].respond_to?(:value) }]
|
143
|
+
elsif date_fields.find{ |d| !d.attributes["encoding"] }
|
144
|
+
[date_fields.find{ |d| !d.attributes["encoding"] }]
|
145
|
+
else
|
146
|
+
[date_fields.first]
|
147
|
+
end
|
148
|
+
else
|
149
|
+
date_fields
|
150
|
+
end
|
151
|
+
end
|
152
|
+
def normalize_date(date)
|
153
|
+
date.strip.gsub(/^\s*c\s*|\[|\]|\?/, "")
|
154
|
+
end
|
46
155
|
def other_pub_info(element)
|
47
156
|
element.children.select do |child|
|
48
157
|
pub_info_parts.include?(child.name.to_sym)
|
@@ -59,7 +168,11 @@ class ModsDisplay::Imprint < ModsDisplay::Field
|
|
59
168
|
private
|
60
169
|
|
61
170
|
def pub_info_parts
|
62
|
-
|
171
|
+
[:issuance, :frequency]
|
172
|
+
end
|
173
|
+
|
174
|
+
def date_field_keys
|
175
|
+
[:dateCreated, :dateCaptured, :dateValid, :dateModified, :copyrightDate]
|
63
176
|
end
|
64
177
|
|
65
178
|
def pub_info_labels
|
data/lib/mods_display/version.rb
CHANGED
data/spec/fields/imprint_spec.rb
CHANGED
@@ -12,12 +12,21 @@ describe ModsDisplay::Imprint do
|
|
12
12
|
@imprint = Stanford::Mods::Record.new.from_str(imprint_mods, false).origin_info
|
13
13
|
@no_edition = Stanford::Mods::Record.new.from_str(no_edition_mods, false).origin_info
|
14
14
|
@edition_and_date = Stanford::Mods::Record.new.from_str(origin_info_mods, false).origin_info
|
15
|
-
@encoded_date = Stanford::Mods::Record.new.from_str(encoded_date, false).origin_info
|
16
|
-
@encoded_only = Stanford::Mods::Record.new.from_str(only_encoded_data, false).origin_info
|
17
15
|
@mixed = Stanford::Mods::Record.new.from_str(mixed_mods, false).origin_info
|
18
16
|
@display_form = Stanford::Mods::Record.new.from_str(display_form, false).origin_info
|
19
17
|
@display_form_with_label = Stanford::Mods::Record.new.from_str(display_form, false).origin_info
|
20
18
|
@display_label = Stanford::Mods::Record.new.from_str(display_label, false).origin_info
|
19
|
+
@date_range = Stanford::Mods::Record.new.from_str(date_range, false).origin_info
|
20
|
+
@open_date_range = Stanford::Mods::Record.new.from_str(open_date_range, false).origin_info
|
21
|
+
@dup_qualified_date = Stanford::Mods::Record.new.from_str(dup_qualified_date, false).origin_info
|
22
|
+
@dup_unencoded_date = Stanford::Mods::Record.new.from_str(dup_unencoded_date, false).origin_info
|
23
|
+
@dup_date = Stanford::Mods::Record.new.from_str(dup_date, false).origin_info
|
24
|
+
@approximate_date = Stanford::Mods::Record.new.from_str(approximate_date, false).origin_info
|
25
|
+
@questionable_date = Stanford::Mods::Record.new.from_str(questionable_date, false).origin_info
|
26
|
+
@inferred_date = Stanford::Mods::Record.new.from_str(inferred_date, false).origin_info
|
27
|
+
@three_imprint_dates = Stanford::Mods::Record.new.from_str(three_imprint_dates, false).origin_info
|
28
|
+
@qualified_imprint_date = Stanford::Mods::Record.new.from_str(qualified_imprint_date, false).origin_info
|
29
|
+
@imprint_date_range = Stanford::Mods::Record.new.from_str(imprint_date_range, false).origin_info
|
21
30
|
end
|
22
31
|
|
23
32
|
describe "labels" do
|
@@ -30,7 +39,7 @@ describe ModsDisplay::Imprint do
|
|
30
39
|
fields.last.label.should == "Issuance"
|
31
40
|
end
|
32
41
|
it "should get multiple labels when we have mixed content" do
|
33
|
-
mods_display_imprint(@mixed).fields.map{|val| val.label }.should == ["Imprint", "
|
42
|
+
mods_display_imprint(@mixed).fields.map{|val| val.label }.should == ["Imprint", "Date captured", "Issuance"]
|
34
43
|
end
|
35
44
|
it "should use the displayLabel when available" do
|
36
45
|
mods_display_imprint(@display_label).fields.map{|val| val.label }.should == ["TheLabel", "IssuanceLabel", "IssuanceLabel"]
|
@@ -51,12 +60,6 @@ describe ModsDisplay::Imprint do
|
|
51
60
|
fields.first.values.should == ["A Valid Date"]
|
52
61
|
fields.last.values.should == ["The Issuance"]
|
53
62
|
end
|
54
|
-
it "should omit dates with an encoding attribute" do
|
55
|
-
mods_display_imprint(@encoded_date).fields.map{|val| val.values }.join.should_not include("An Encoded Date")
|
56
|
-
end
|
57
|
-
it "should not try to return data w/ only encoded data" do
|
58
|
-
mods_display_imprint(@encoded_only).fields.should be_empty
|
59
|
-
end
|
60
63
|
it "should handle mixed mods properly" do
|
61
64
|
values = mods_display_imprint(@mixed).fields
|
62
65
|
values.length.should == 3
|
@@ -65,6 +68,69 @@ describe ModsDisplay::Imprint do
|
|
65
68
|
values.map{|val| val.values}.should include(["The Capture Date"])
|
66
69
|
end
|
67
70
|
end
|
71
|
+
describe "date processing" do
|
72
|
+
describe "ranges" do
|
73
|
+
it "should join start and end point ranges with a '-'" do
|
74
|
+
fields = mods_display_imprint(@date_range).fields
|
75
|
+
fields.length.should == 1
|
76
|
+
fields.first.values.should == ["1820-1825"]
|
77
|
+
end
|
78
|
+
it "should handle open ranges properly" do
|
79
|
+
fields = mods_display_imprint(@open_date_range).fields
|
80
|
+
fields.length.should == 1
|
81
|
+
fields.first.values.should == ["1820-"]
|
82
|
+
end
|
83
|
+
it "should handle when there are more than 3 of the same date w/i a range" do
|
84
|
+
fields = mods_display_imprint(@three_imprint_dates).fields
|
85
|
+
fields.length.should == 1
|
86
|
+
fields.first.values.should == ["[1820-1825?]"]
|
87
|
+
end
|
88
|
+
it "should apply the qualifier decoration in the imprints" do
|
89
|
+
fields = mods_display_imprint(@qualified_imprint_date).fields
|
90
|
+
fields.length.should == 1
|
91
|
+
fields.first.values.should == ["[1820?]"]
|
92
|
+
end
|
93
|
+
it "should handle date ranges in imprints" do
|
94
|
+
fields = mods_display_imprint(@imprint_date_range).fields
|
95
|
+
fields.length.should == 1
|
96
|
+
fields.first.values.should == ["1820-1825"]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
describe "duplication" do
|
100
|
+
it "should only return the qualified date when present" do
|
101
|
+
fields = mods_display_imprint(@dup_qualified_date).fields
|
102
|
+
fields.length.should == 1
|
103
|
+
fields.first.values.should == ["[1820?]"]
|
104
|
+
end
|
105
|
+
it "should use the non-encoded date when prsent" do
|
106
|
+
fields = mods_display_imprint(@dup_unencoded_date).fields
|
107
|
+
fields.length.should == 1
|
108
|
+
fields.first.values.should == ["c1820"]
|
109
|
+
end
|
110
|
+
it "should only return one when no attributes are present" do
|
111
|
+
fields = mods_display_imprint(@dup_date).fields
|
112
|
+
fields.length.should == 1
|
113
|
+
fields.first.values.should == ["1820"]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
describe "qualifier decoration" do
|
117
|
+
it "should prepend a 'c' to approximate dates" do
|
118
|
+
fields = mods_display_imprint(@approximate_date).fields
|
119
|
+
fields.length.should == 1
|
120
|
+
fields.first.values.should == ["c1820"]
|
121
|
+
end
|
122
|
+
it "should append a '?' to a questionable dates and wrap them in square-brackets" do
|
123
|
+
fields = mods_display_imprint(@questionable_date).fields
|
124
|
+
fields.length.should == 1
|
125
|
+
fields.first.values.should == ["[1820?]"]
|
126
|
+
end
|
127
|
+
it "should wrap inferred dates in square-brackets" do
|
128
|
+
fields = mods_display_imprint(@inferred_date).fields
|
129
|
+
fields.length.should == 1
|
130
|
+
fields.first.values.should == ["[1820]"]
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
68
134
|
describe "to_html" do
|
69
135
|
it "should return the display form if one is available" do
|
70
136
|
html = mods_display_imprint(@display_form).to_html
|
@@ -38,25 +38,6 @@ module ImprintFixtures
|
|
38
38
|
</mods>
|
39
39
|
MODS
|
40
40
|
end
|
41
|
-
def encoded_date
|
42
|
-
<<-MODS
|
43
|
-
<mods>
|
44
|
-
<originInfo>
|
45
|
-
<place>A Place</place>
|
46
|
-
<dateIssued encoding="an-encoding">An Encoded Date</dateIssued>
|
47
|
-
</originInfo>
|
48
|
-
</mods>
|
49
|
-
MODS
|
50
|
-
end
|
51
|
-
def only_encoded_data
|
52
|
-
<<-MODS
|
53
|
-
<mods>
|
54
|
-
<originInfo>
|
55
|
-
<dateIssued encoding="an-encoding">An Encoded Date</dateIssued>
|
56
|
-
</originInfo>
|
57
|
-
</mods>
|
58
|
-
MODS
|
59
|
-
end
|
60
41
|
def mixed_mods
|
61
42
|
<<-MODS
|
62
43
|
<mods>
|
@@ -101,4 +82,111 @@ module ImprintFixtures
|
|
101
82
|
</mods>
|
102
83
|
MODS
|
103
84
|
end
|
85
|
+
def date_range
|
86
|
+
<<-MODS
|
87
|
+
<mods>
|
88
|
+
<originInfo>
|
89
|
+
<dateCreated point="end">1825</dateCreated>
|
90
|
+
<dateCreated point="start">1820</dateCreated>
|
91
|
+
</originInfo>
|
92
|
+
</mods>
|
93
|
+
MODS
|
94
|
+
end
|
95
|
+
def open_date_range
|
96
|
+
<<-MODS
|
97
|
+
<mods>
|
98
|
+
<originInfo>
|
99
|
+
<dateCreated point="start">1820</dateCreated>
|
100
|
+
</originInfo>
|
101
|
+
</mods>
|
102
|
+
MODS
|
103
|
+
end
|
104
|
+
def dup_qualified_date
|
105
|
+
<<-MODS
|
106
|
+
<mods>
|
107
|
+
<originInfo>
|
108
|
+
<dateCreated qualifier="questionable">1820</dateCreated>
|
109
|
+
<dateCreated>1820</dateCreated>
|
110
|
+
</originInfo>
|
111
|
+
</mods>
|
112
|
+
MODS
|
113
|
+
end
|
114
|
+
def dup_unencoded_date
|
115
|
+
<<-MODS
|
116
|
+
<mods>
|
117
|
+
<originInfo>
|
118
|
+
<dateCreated encoding="marc">1820</dateCreated>
|
119
|
+
<dateCreated>c1820</dateCreated>
|
120
|
+
</originInfo>
|
121
|
+
</mods>
|
122
|
+
MODS
|
123
|
+
end
|
124
|
+
def dup_date
|
125
|
+
<<-MODS
|
126
|
+
<mods>
|
127
|
+
<originInfo>
|
128
|
+
<dateCreated>1820</dateCreated>
|
129
|
+
<dateCreated>1820</dateCreated>
|
130
|
+
</originInfo>
|
131
|
+
</mods>
|
132
|
+
MODS
|
133
|
+
end
|
134
|
+
def approximate_date
|
135
|
+
<<-MODS
|
136
|
+
<mods>
|
137
|
+
<originInfo>
|
138
|
+
<dateValid qualifier="approximate">1820</dateValid>
|
139
|
+
</originInfo>
|
140
|
+
</mods>
|
141
|
+
MODS
|
142
|
+
end
|
143
|
+
def questionable_date
|
144
|
+
<<-MODS
|
145
|
+
<mods>
|
146
|
+
<originInfo>
|
147
|
+
<dateValid qualifier="questionable">1820</dateValid>
|
148
|
+
</originInfo>
|
149
|
+
</mods>
|
150
|
+
MODS
|
151
|
+
end
|
152
|
+
def inferred_date
|
153
|
+
<<-MODS
|
154
|
+
<mods>
|
155
|
+
<originInfo>
|
156
|
+
<dateValid qualifier="inferred">1820</dateValid>
|
157
|
+
</originInfo>
|
158
|
+
</mods>
|
159
|
+
MODS
|
160
|
+
end
|
161
|
+
def three_imprint_dates
|
162
|
+
<<-MODS
|
163
|
+
<mods>
|
164
|
+
<originInfo>
|
165
|
+
<dateIssued>[1820-1825]</dateIssued>
|
166
|
+
<dateIssued point="start" qualifier="questionable">1820</dateIssued>
|
167
|
+
<dateIssued point="end" qualifier="questionable">1825</dateIssued>
|
168
|
+
</originInfo>
|
169
|
+
</mods>
|
170
|
+
MODS
|
171
|
+
end
|
172
|
+
def qualified_imprint_date
|
173
|
+
<<-MODS
|
174
|
+
<mods>
|
175
|
+
<originInfo>
|
176
|
+
<dateIssued qualifier="questionable">1820</dateIssued>
|
177
|
+
</originInfo>
|
178
|
+
</mods>
|
179
|
+
MODS
|
180
|
+
end
|
181
|
+
def imprint_date_range
|
182
|
+
<<-MODS
|
183
|
+
<mods>
|
184
|
+
<originInfo>
|
185
|
+
<dateIssued>[1820]</dateIssued>
|
186
|
+
<dateIssued point="start">1820</dateIssued>
|
187
|
+
<dateIssued point="end">1825</dateIssued>
|
188
|
+
</originInfo>
|
189
|
+
</mods>
|
190
|
+
MODS
|
191
|
+
end
|
104
192
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mods_display
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: stanford-mods
|
@@ -151,7 +151,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
151
151
|
version: '0'
|
152
152
|
segments:
|
153
153
|
- 0
|
154
|
-
hash: -
|
154
|
+
hash: -3367910035276828963
|
155
155
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
156
|
none: false
|
157
157
|
requirements:
|
@@ -160,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
160
|
version: '0'
|
161
161
|
segments:
|
162
162
|
- 0
|
163
|
-
hash: -
|
163
|
+
hash: -3367910035276828963
|
164
164
|
requirements: []
|
165
165
|
rubyforge_project:
|
166
166
|
rubygems_version: 1.8.25
|