mods_display 0.1.3 → 0.1.4

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.
Files changed (37) hide show
  1. data/lib/mods_display.rb +7 -1
  2. data/lib/mods_display/configuration.rb +7 -3
  3. data/lib/mods_display/configuration/access_condition.rb +17 -0
  4. data/lib/mods_display/configuration/format.rb +5 -0
  5. data/lib/mods_display/configuration/genre.rb +5 -0
  6. data/lib/mods_display/configuration/imprint.rb +8 -0
  7. data/lib/mods_display/controller_extension.rb +1 -1
  8. data/lib/mods_display/country_codes.rb +385 -0
  9. data/lib/mods_display/fields/access_condition.rb +73 -0
  10. data/lib/mods_display/fields/description.rb +1 -3
  11. data/lib/mods_display/fields/format.rb +23 -16
  12. data/lib/mods_display/fields/genre.rb +7 -1
  13. data/lib/mods_display/fields/identifier.rb +1 -0
  14. data/lib/mods_display/fields/imprint.rb +55 -6
  15. data/lib/mods_display/fields/location.rb +25 -3
  16. data/lib/mods_display/fields/name.rb +82 -13
  17. data/lib/mods_display/fields/related_item.rb +73 -14
  18. data/lib/mods_display/fields/resource_type.rb +7 -0
  19. data/lib/mods_display/html.rb +15 -9
  20. data/lib/mods_display/model_extension.rb +1 -0
  21. data/lib/mods_display/relator_codes.rb +268 -0
  22. data/lib/mods_display/version.rb +1 -1
  23. data/spec/configuration/access_condition_spec.rb +10 -0
  24. data/spec/fields/access_condition_spec.rb +91 -0
  25. data/spec/fields/description_spec.rb +9 -9
  26. data/spec/fields/format_spec.rb +10 -14
  27. data/spec/fields/genre_spec.rb +9 -1
  28. data/spec/fields/imprint_spec.rb +63 -2
  29. data/spec/fields/location_spec.rb +21 -2
  30. data/spec/fields/name_spec.rb +30 -0
  31. data/spec/fields/related_item_spec.rb +13 -0
  32. data/spec/fields/resource_type_spec.rb +6 -0
  33. data/spec/fixtures/imprint_fixtures.rb +36 -2
  34. data/spec/integration/configuration_spec.rb +14 -2
  35. metadata +15 -7
  36. data/lib/mods_display/fields/related_location.rb +0 -16
  37. data/spec/fields/related_location_spec.rb +0 -35
@@ -1,5 +1,12 @@
1
1
  class ModsDisplay::ResourceType < ModsDisplay::Field
2
2
 
3
+ def fields
4
+ return_fields = @values.map do |value|
5
+ ModsDisplay::Values.new(:label => displayLabel(value) || label, :values => [value.text.strip.capitalize].flatten)
6
+ end
7
+ collapse_fields(return_fields)
8
+ end
9
+
3
10
  private
4
11
  def displayLabel(element)
5
12
  super(element) || "Type of resource"
@@ -2,7 +2,8 @@ class ModsDisplay::HTML
2
2
  attr_reader :title, :body
3
3
  def initialize(config, xml, klass)
4
4
  @config = config
5
- @xml = xml
5
+ @stanford_mods = xml
6
+ @xml = xml.mods_ng_xml
6
7
  @klass = klass
7
8
  end
8
9
 
@@ -21,7 +22,8 @@ class ModsDisplay::HTML
21
22
  body_fields = mods_display_fields.dup
22
23
  body_fields[0] = :subTitle
23
24
  body_fields.each do |field_key|
24
- unless mods_field(@xml, field_key).to_html.nil?
25
+ field = mods_field(@xml, field_key)
26
+ unless field.nil? or field.to_html.nil?
25
27
  output << mods_field(@xml, field_key).to_html
26
28
  end
27
29
  end
@@ -31,8 +33,9 @@ class ModsDisplay::HTML
31
33
  def to_html
32
34
  output = "<dl>"
33
35
  mods_display_fields.each do |field_key|
34
- unless mods_field(@xml, field_key).to_html.nil?
35
- output << mods_field(@xml, field_key).to_html
36
+ field = mods_field(@xml, field_key)
37
+ unless field.nil? or field.to_html.nil?
38
+ output << field.to_html
36
39
  end
37
40
  end
38
41
  output << "</dl>"
@@ -52,6 +55,8 @@ class ModsDisplay::HTML
52
55
  if xml.respond_to?(mods_display_field_mapping[field_key])
53
56
  field = xml.send(mods_display_field_mapping[field_key])
54
57
  ModsDisplay.const_get("#{field_key.slice(0,1).upcase}#{field_key.slice(1..-1)}").new(field, field_config(field_key), @klass)
58
+ else @stanford_mods.respond_to?(field_key)
59
+ ModsDisplay.const_get("#{field_key.slice(0,1).upcase}#{field_key.slice(1..-1)}").new(@stanford_mods, field_config(field_key), @klass)
55
60
  end
56
61
  end
57
62
 
@@ -64,7 +69,7 @@ class ModsDisplay::HTML
64
69
  end
65
70
 
66
71
  def mods_display_fields
67
- [:title, :name, :language, :imprint, :resourceType, :genre, :description, :cartographics, :abstract, :contents, :audience, :note, :contact, :collection, :relatedLocation, :relatedItem, :subject, :identifier, :location]
72
+ [:title, :name, :language, :imprint, :resourceType, :genre, :format, :description, :cartographics, :abstract, :contents, :audience, :note, :contact, :collection, :relatedItem, :subject, :identifier, :location, :accessCondition]
68
73
  end
69
74
 
70
75
  def mods_display_field_mapping
@@ -73,6 +78,7 @@ class ModsDisplay::HTML
73
78
  :name => :plain_name,
74
79
  :resourceType => :typeOfResource,
75
80
  :genre => :genre,
81
+ :format => :format,
76
82
  :imprint => :origin_info,
77
83
  :language => :language,
78
84
  :description => :physical_description,
@@ -83,18 +89,18 @@ class ModsDisplay::HTML
83
89
  :note => :note,
84
90
  :contact => :note,
85
91
  :collection => :related_item,
86
- :relatedLocation => :related_item,
87
92
  :relatedItem => :related_item,
88
93
  :subject => :subject,
89
94
  :identifier => :identifier,
90
- :location => :location}
95
+ :location => :location,
96
+ :accessCondition => :accessCondition}
91
97
  end
92
98
 
93
99
  def field_key_translation
94
100
  {:subTitle => :sub_title,
95
101
  :resourceType => :resource_type,
96
- :relatedLocation => :related_location,
97
- :relatedItem => :related_item
102
+ :relatedItem => :related_item,
103
+ :accessCondition => :access_condition
98
104
  }
99
105
  end
100
106
 
@@ -8,6 +8,7 @@ module ModsDisplay::ModelExtension
8
8
  return if xml.nil?
9
9
  mods = Stanford::Mods::Record.new
10
10
  mods.from_str(xml, false)
11
+ mods
11
12
  end
12
13
  end
13
14
  end
@@ -0,0 +1,268 @@
1
+ module ModsDisplay::RelatorCodes
2
+ def relator_codes
3
+ {"abr" => "Abridger",
4
+ "acp" => "Art copyist",
5
+ "act" => "Actor",
6
+ "adi" => "Art director",
7
+ "adp" => "Adapter",
8
+ "aft" => "Author of afterword, colophon, etc.",
9
+ "anl" => "Analyst",
10
+ "anm" => "Animator",
11
+ "ann" => "Annotator",
12
+ "ant" => "Bibliographic antecedent",
13
+ "ape" => "Appellee",
14
+ "apl" => "Appellant",
15
+ "app" => "Applicant",
16
+ "aqt" => "Author in quotations or text abstracts",
17
+ "arc" => "Architect",
18
+ "ard" => "Artistic director",
19
+ "arr" => "Arranger",
20
+ "art" => "Artist",
21
+ "asg" => "Assignee",
22
+ "asn" => "Associated name",
23
+ "ato" => "Autographer",
24
+ "att" => "Attributed name",
25
+ "auc" => "Auctioneer",
26
+ "aud" => "Author of dialog",
27
+ "aui" => "Author of introduction, etc.",
28
+ "aus" => "Screenwriter",
29
+ "aut" => "Author",
30
+ "bdd" => "Binding designer",
31
+ "bjd" => "Bookjacket designer",
32
+ "bkd" => "Book designer",
33
+ "bkp" => "Book producer",
34
+ "blw" => "Blurb writer",
35
+ "bnd" => "Binder",
36
+ "bpd" => "Bookplate designer",
37
+ "brd" => "Broadcaster",
38
+ "brl" => "Braille embosser",
39
+ "bsl" => "Bookseller",
40
+ "cas" => "Caster",
41
+ "ccp" => "Conceptor",
42
+ "chr" => "Choreographer",
43
+ "clb" => "Collaborator",
44
+ "cli" => "Client",
45
+ "cll" => "Calligrapher",
46
+ "clr" => "Colorist",
47
+ "clt" => "Collotyper",
48
+ "cmm" => "Commentator",
49
+ "cmp" => "Composer",
50
+ "cmt" => "Compositor",
51
+ "cnd" => "Conductor",
52
+ "cng" => "Cinematographer",
53
+ "cns" => "Censor",
54
+ "coe" => "Contestant-appellee",
55
+ "col" => "Collector",
56
+ "com" => "Compiler",
57
+ "con" => "Conservator",
58
+ "cor" => "Collection registrar",
59
+ "cos" => "Contestant",
60
+ "cot" => "Contestant-appellant",
61
+ "cou" => "Court governed",
62
+ "cov" => "Cover designer",
63
+ "cpc" => "Copyright claimant",
64
+ "cpe" => "Complainant-appellee",
65
+ "cph" => "Copyright holder",
66
+ "cpl" => "Complainant",
67
+ "cpt" => "Complainant-appellant",
68
+ "cre" => "Creator",
69
+ "crp" => "Correspondent",
70
+ "crr" => "Corrector",
71
+ "crt" => "Court reporter",
72
+ "csl" => "Consultant",
73
+ "csp" => "Consultant to a project",
74
+ "cst" => "Costume designer",
75
+ "ctb" => "Contributor",
76
+ "cte" => "Contestee-appellee",
77
+ "ctg" => "Cartographer",
78
+ "ctr" => "Contractor",
79
+ "cts" => "Contestee",
80
+ "ctt" => "Contestee-appellant",
81
+ "cur" => "Curator",
82
+ "cwt" => "Commentator for written text",
83
+ "dbp" => "Distribution place",
84
+ "dfd" => "Defendant",
85
+ "dfe" => "Defendant-appellee",
86
+ "dft" => "Defendant-appellant",
87
+ "dgg" => "Degree granting institution",
88
+ "dis" => "Dissertant",
89
+ "dln" => "Delineator",
90
+ "dnc" => "Dancer",
91
+ "dnr" => "Donor",
92
+ "dpc" => "Depicted",
93
+ "dpt" => "Depositor",
94
+ "drm" => "Draftsman",
95
+ "drt" => "Director",
96
+ "dsr" => "Designer",
97
+ "dst" => "Distributor",
98
+ "dtc" => "Data contributor",
99
+ "dte" => "Dedicatee",
100
+ "dtm" => "Data manager",
101
+ "dto" => "Dedicator",
102
+ "dub" => "Dubious author",
103
+ "edc" => "Editor of compilation",
104
+ "edm" => "Editor of moving image work",
105
+ "edt" => "Editor",
106
+ "egr" => "Engraver",
107
+ "elg" => "Electrician",
108
+ "elt" => "Electrotyper",
109
+ "eng" => "Engineer",
110
+ "enj" => "Enacting jurisdiction",
111
+ "etr" => "Etcher",
112
+ "evp" => "Event place",
113
+ "exp" => "Expert",
114
+ "fac" => "Facsimilist",
115
+ "fds" => "Film distributor",
116
+ "fld" => "Field director",
117
+ "flm" => "Film editor",
118
+ "fmd" => "Film director",
119
+ "fmk" => "Filmmaker",
120
+ "fmo" => "Former owner",
121
+ "fmp" => "Film producer",
122
+ "fnd" => "Funder",
123
+ "fpy" => "First party",
124
+ "frg" => "Forger",
125
+ "gis" => "Geographic information specialist",
126
+ "grt" => "Graphic technician",
127
+ "his" => "Host institution",
128
+ "hnr" => "Honoree",
129
+ "hst" => "Host",
130
+ "ill" => "Illustrator",
131
+ "ilu" => "Illuminator",
132
+ "ins" => "Inscriber",
133
+ "itr" => "Instrumentalist",
134
+ "ive" => "Interviewee",
135
+ "ivr" => "Interviewer",
136
+ "inv" => "Inventor",
137
+ "isb" => "Issuing body",
138
+ "jud" => "Judge",
139
+ "jug" => "Jurisdiction governed",
140
+ "lbr" => "Laboratory",
141
+ "lbt" => "Librettist",
142
+ "ldr" => "Laboratory director",
143
+ "led" => "Lead",
144
+ "lee" => "Libelee-appellee",
145
+ "lel" => "Libelee",
146
+ "len" => "Lender",
147
+ "let" => "Libelee-appellant",
148
+ "lgd" => "Lighting designer",
149
+ "lie" => "Libelant-appellee",
150
+ "lil" => "Libelant",
151
+ "lit" => "Libelant-appellant",
152
+ "lsa" => "Landscape architect",
153
+ "lse" => "Licensee",
154
+ "lso" => "Licensor",
155
+ "ltg" => "Lithographer",
156
+ "lyr" => "Lyricist",
157
+ "mcp" => "Music copyist",
158
+ "mdc" => "Metadata contact",
159
+ "mfp" => "Manufacture place",
160
+ "mfr" => "Manufacturer",
161
+ "mod" => "Moderator",
162
+ "mon" => "Monitor",
163
+ "mrb" => "Marbler",
164
+ "mrk" => "Markup editor",
165
+ "msd" => "Musical director",
166
+ "mte" => "Metal-engraver",
167
+ "mus" => "Musician",
168
+ "nrt" => "Narrator",
169
+ "opn" => "Opponent",
170
+ "org" => "Originator",
171
+ "orm" => "Organizer of meeting",
172
+ "osp" => "Onscreen presenter",
173
+ "oth" => "Other",
174
+ "own" => "Owner",
175
+ "pan" => "Panelist",
176
+ "pat" => "Patron",
177
+ "pbd" => "Publishing director",
178
+ "pbl" => "Publisher",
179
+ "pdr" => "Project director",
180
+ "pfr" => "Proofreader",
181
+ "pht" => "Photographer",
182
+ "plt" => "Platemaker",
183
+ "pma" => "Permitting agency",
184
+ "pmn" => "Production manager",
185
+ "pop" => "Printer of plates",
186
+ "ppm" => "Papermaker",
187
+ "ppt" => "Puppeteer",
188
+ "pra" => "Praeses",
189
+ "prc" => "Process contact",
190
+ "prd" => "Production personnel",
191
+ "pre" => "Presenter",
192
+ "prf" => "Performer",
193
+ "prg" => "Programmer",
194
+ "prm" => "Printmaker",
195
+ "prn" => "Production company",
196
+ "pro" => "Producer",
197
+ "prp" => "Production place",
198
+ "prs" => "Production designer",
199
+ "prt" => "Printer",
200
+ "prv" => "Provider",
201
+ "pta" => "Patent applicant",
202
+ "pte" => "Plaintiff-appellee",
203
+ "ptf" => "Plaintiff",
204
+ "pth" => "Patent holder",
205
+ "ptt" => "Plaintiff-appellant",
206
+ "pup" => "Publication place",
207
+ "rbr" => "Rubricator",
208
+ "rce" => "Recording engineer",
209
+ "rcd" => "Recordist",
210
+ "rcp" => "Addressee",
211
+ "rdd" => "Radio director",
212
+ "red" => "Redaktor",
213
+ "ren" => "Renderer",
214
+ "res" => "Researcher",
215
+ "rev" => "Reviewer",
216
+ "rpc" => "Radio producer",
217
+ "rps" => "Repository",
218
+ "rpt" => "Reporter",
219
+ "rpy" => "Responsible party",
220
+ "rse" => "Respondent-appellee",
221
+ "rsg" => "Restager",
222
+ "rsp" => "Respondent",
223
+ "rsr" => "Restorationist",
224
+ "rst" => "Respondent-appellant",
225
+ "rth" => "Research team head",
226
+ "rtm" => "Research team member",
227
+ "sad" => "Scientific advisor",
228
+ "sce" => "Scenarist",
229
+ "scl" => "Sculptor",
230
+ "scr" => "Scribe",
231
+ "sds" => "Sound designer",
232
+ "sec" => "Secretary",
233
+ "sgd" => "Stage director",
234
+ "sgn" => "Signer",
235
+ "sht" => "Supporting host",
236
+ "sll" => "Seller",
237
+ "sng" => "Singer",
238
+ "spk" => "Speaker",
239
+ "spn" => "Sponsor",
240
+ "spy" => "Second party",
241
+ "std" => "Set designer",
242
+ "stg" => "Setting",
243
+ "stl" => "Storyteller",
244
+ "stm" => "Stage manager",
245
+ "stn" => "Standards body",
246
+ "str" => "Stereotyper",
247
+ "srv" => "Surveyor",
248
+ "tcd" => "Technical director",
249
+ "tch" => "Teacher",
250
+ "ths" => "Thesis advisor",
251
+ "tld" => "Television director",
252
+ "tlp" => "Television producer",
253
+ "trc" => "Transcriber",
254
+ "trl" => "Translator",
255
+ "tyd" => "Type designer",
256
+ "tyg" => "Typographer",
257
+ "uvp" => "University place",
258
+ "vdg" => "Videographer",
259
+ "voc" => "Vocalist",
260
+ "wac" => "Writer of added commentary",
261
+ "wal" => "Writer of added lyrics",
262
+ "wam" => "Writer of accompanying material",
263
+ "wat" => "Writer of added text",
264
+ "wdc" => "Woodcutter",
265
+ "wde" => "Wood engraver",
266
+ "wit" => "Witness"}
267
+ end
268
+ end
@@ -1,3 +1,3 @@
1
1
  module ModsDisplay
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -0,0 +1,10 @@
1
+ require "spec_helper"
2
+
3
+ describe ModsDisplay::Configuration::AccessCondition do
4
+ it "should default ignore? to true" do
5
+ ModsDisplay::Configuration::AccessCondition.new.ignore?.should be_true
6
+ end
7
+ it "should set ignore? to false when the display! configuration is set" do
8
+ ModsDisplay::Configuration::AccessCondition.new{ display! }.ignore?.should be_false
9
+ end
10
+ end
@@ -0,0 +1,91 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_access_condition(mods_record)
4
+ ModsDisplay::AccessCondition.new(mods_record, ModsDisplay::Configuration::AccessCondition.new, mock("controller"))
5
+ end
6
+ def mods_display_versioned_access_condition(mods_record, version)
7
+ ModsDisplay::AccessCondition.new(mods_record, ModsDisplay::Configuration::AccessCondition.new{cc_license_version version}, mock("controller"))
8
+ end
9
+ def mods_display_non_ignore_access_condition(mods_record)
10
+ ModsDisplay::AccessCondition.new(mods_record, ModsDisplay::Configuration::AccessCondition.new{display!}, mock("controller"))
11
+ end
12
+
13
+ describe ModsDisplay::AccessCondition do
14
+ before :all do
15
+ @access_condition = Stanford::Mods::Record.new.from_str("<mods><accessCondition>Access Condition Note</accessCondition></mods>", false).accessCondition
16
+ @restrict_condition = Stanford::Mods::Record.new.from_str("<mods><accessCondition type='restrictionOnAccess'>Restrict Access Note1</accessCondition><accessCondition type='restriction on access'>Restrict Access Note2</accessCondition></mods>", false).accessCondition
17
+ @copyright_note = Stanford::Mods::Record.new.from_str("<mods><accessCondition type='copyright'>This is a (c) copyright Note. Single instances of (c) should also be replaced in these notes.</accessCondition></mods>", false).accessCondition
18
+ @cc_license_note = Stanford::Mods::Record.new.from_str("<mods><accessCondition type='license'>CC by-sa: This work is licensed under a Creative Commons Attribution-Noncommercial 3.0 Unported License</accessCondition></mods>", false).accessCondition
19
+ @odc_license_note = Stanford::Mods::Record.new.from_str("<mods><accessCondition type='license'>ODC pddl: This work is licensed under a Open Data Commons Public Domain Dedication and License (PDDL)</accessCondition></mods>", false).accessCondition
20
+ @no_link_license_note = Stanford::Mods::Record.new.from_str("<mods><accessCondition type='license'>Unknown something: This work is licensed under an Unknown License and will not be linked</accessCondition></mods>", false).accessCondition
21
+ end
22
+ describe "labels" do
23
+ it "should normalize types and assign proper labels" do
24
+ fields = mods_display_access_condition(@restrict_condition).fields
25
+ fields.length.should == 1
26
+ fields.first.label.should == "Restriction on access"
27
+ fields.first.values.each_with_index do |value, index|
28
+ value.should match /^Restrict Access Note#{index+1}/
29
+ end
30
+ end
31
+ end
32
+ describe "fields" do
33
+ describe "copyright" do
34
+ it "should replace instances of '(c) copyright' with the HTML copyright entity" do
35
+ fields = mods_display_access_condition(@copyright_note).fields
36
+ fields.length.should == 1
37
+ fields.first.values.length.should == 1
38
+ fields.first.values.first.should == "This is a &copy; Note. Single instances of &copy; should also be replaced in these notes."
39
+ end
40
+ end
41
+ describe "licenses" do
42
+ it "should add the appropriate classes to the html around the license" do
43
+ fields = mods_display_access_condition(@no_link_license_note).fields
44
+ fields.length.should == 1
45
+ fields.first.values.length.should == 1
46
+ fields.first.values.first.should match /^<div class='unknown-something'>.*<\/div>$/
47
+ end
48
+ it "should itentify and link CreativeCommons licenses properly" do
49
+ fields = mods_display_access_condition(@cc_license_note).fields
50
+ fields.length.should == 1
51
+ fields.first.values.length.should == 1
52
+ fields.first.values.first.should include("<a href='http://creativecommons.org/licenses/by-sa/3.0/'>This work is licensed under a Creative Commons Attribution-Noncommercial 3.0 Unported License</a>")
53
+ end
54
+ it "should itentify and link OpenDataCommons licenses properly" do
55
+ fields = mods_display_access_condition(@odc_license_note).fields
56
+ fields.length.should == 1
57
+ fields.first.values.length.should == 1
58
+ fields.first.values.first.should include("<a href='http://opendatacommons.org/licenses/pddl'>This work is licensed under a Open Data Commons Public Domain Dedication and License (PDDL)</a>")
59
+ end
60
+ it "should have a configurable version for CC licenses" do
61
+ fields = mods_display_versioned_access_condition(@cc_license_note, "4.0").fields
62
+ fields.length.should == 1
63
+ fields.first.values.length.should == 1
64
+ fields.first.values.first.should include("http://creativecommons.org/licenses/by-sa/4.0/")
65
+ fields.first.values.first.should_not include("http://creativecommons.org/licenses/by-sa/3.0/")
66
+ end
67
+ it "should not apply configured version to NON-CC licenses" do
68
+ fields = mods_display_versioned_access_condition(@odc_license_note, "4.0").fields
69
+ fields.length.should == 1
70
+ fields.first.values.length.should == 1
71
+ fields.first.values.first.should_not include("/4.0/")
72
+ end
73
+ it "should not attempt unknown license types" do
74
+ fields = mods_display_access_condition(@no_link_license_note).fields
75
+ fields.length.should == 1
76
+ fields.first.values.length.should == 1
77
+ fields.first.values.first.should include("This work is licensed under an Unknown License and will not be linked")
78
+ fields.first.values.first.should_not include("<a.*>")
79
+ end
80
+ end
81
+ end
82
+ describe "to_html" do
83
+ it "should ignore access conditions by default" do
84
+ mods_display_access_condition(@access_condition).to_html.should be_nil
85
+ end
86
+ it "should not ignore the access condition when ignore is set to false" do
87
+ html = mods_display_non_ignore_access_condition(@access_condition).to_html
88
+ html.should match /<dt.*>Access condition:<\/dt><dd>Access Condition Note<\/dd>/
89
+ end
90
+ end
91
+ end