mods_display 0.0.1.beta1

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 (60) hide show
  1. data/.gitignore +19 -0
  2. data/.travis.yml +5 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +26 -0
  5. data/README.md +136 -0
  6. data/Rakefile +5 -0
  7. data/lib/mods_display.rb +30 -0
  8. data/lib/mods_display/configuration.rb +73 -0
  9. data/lib/mods_display/configuration/base.rb +23 -0
  10. data/lib/mods_display/configuration/subject.rb +11 -0
  11. data/lib/mods_display/controller_extension.rb +32 -0
  12. data/lib/mods_display/fields/abstract.rb +32 -0
  13. data/lib/mods_display/fields/audience.rb +7 -0
  14. data/lib/mods_display/fields/cartographics.rb +21 -0
  15. data/lib/mods_display/fields/collection.rb +21 -0
  16. data/lib/mods_display/fields/contents.rb +7 -0
  17. data/lib/mods_display/fields/description.rb +30 -0
  18. data/lib/mods_display/fields/field.rb +89 -0
  19. data/lib/mods_display/fields/format.rb +34 -0
  20. data/lib/mods_display/fields/identifier.rb +60 -0
  21. data/lib/mods_display/fields/imprint.rb +68 -0
  22. data/lib/mods_display/fields/language.rb +33 -0
  23. data/lib/mods_display/fields/location.rb +25 -0
  24. data/lib/mods_display/fields/name.rb +97 -0
  25. data/lib/mods_display/fields/note.rb +49 -0
  26. data/lib/mods_display/fields/related_item.rb +24 -0
  27. data/lib/mods_display/fields/related_location.rb +14 -0
  28. data/lib/mods_display/fields/subject.rb +103 -0
  29. data/lib/mods_display/fields/title.rb +49 -0
  30. data/lib/mods_display/fields/values.rb +11 -0
  31. data/lib/mods_display/html.rb +87 -0
  32. data/lib/mods_display/model_extension.rb +20 -0
  33. data/lib/mods_display/version.rb +3 -0
  34. data/mods_display.gemspec +24 -0
  35. data/spec/configuration/base_spec.rb +29 -0
  36. data/spec/fields/abstract_spec.rb +21 -0
  37. data/spec/fields/audience_spec.rb +21 -0
  38. data/spec/fields/cartographics_spec.rb +39 -0
  39. data/spec/fields/collection_spec.rb +31 -0
  40. data/spec/fields/contents_spec.rb +21 -0
  41. data/spec/fields/description_spec.rb +37 -0
  42. data/spec/fields/format_spec.rb +35 -0
  43. data/spec/fields/identifier_spec.rb +49 -0
  44. data/spec/fields/imprint_spec.rb +78 -0
  45. data/spec/fields/language_spec.rb +55 -0
  46. data/spec/fields/location_spec.rb +25 -0
  47. data/spec/fields/name_spec.rb +88 -0
  48. data/spec/fields/note_spec.rb +53 -0
  49. data/spec/fields/related_item_spec.rb +37 -0
  50. data/spec/fields/related_location_spec.rb +31 -0
  51. data/spec/fields/subject_spec.rb +89 -0
  52. data/spec/fields/title_spec.rb +47 -0
  53. data/spec/fixtures/cartographics_fixtures.rb +52 -0
  54. data/spec/fixtures/imprint_fixtures.rb +89 -0
  55. data/spec/fixtures/name_fixtures.rb +3 -0
  56. data/spec/fixtures/subjects_fixtures.rb +70 -0
  57. data/spec/integration/configuration_spec.rb +37 -0
  58. data/spec/integration/installation_spec.rb +26 -0
  59. data/spec/spec_helper.rb +35 -0
  60. metadata +182 -0
@@ -0,0 +1,53 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_note(mods_record)
4
+ ModsDisplay::Note.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Note do
8
+ before(:all) do
9
+ @note = Stanford::Mods::Record.new.from_str("<mods><note>Note Field</note></mods>", false).note
10
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><note displayLabel='Special Label'>Note Field</note></mods>", false).note
11
+ @sor_label = Stanford::Mods::Record.new.from_str("<mods><note type='statement of responsibility'>Note Field</note></mods>", false).note
12
+ @type_label = Stanford::Mods::Record.new.from_str("<mods><note type='Some other Type'>Note Field</note></mods>", false).note
13
+ @complex_label = Stanford::Mods::Record.new.from_str("<mods><note>Note Field</note><note>2nd Note Field</note><note type='statement of responsibility'>SoR</note><note>Another Note</note></mods>", false).note
14
+ end
15
+ describe "label" do
16
+ it "should have a default label" do
17
+ mods_display_note(@note).fields.first.label.should == "Note"
18
+ end
19
+ it "should use the displayLabel attribute when one is available" do
20
+ mods_display_note(@display_label).fields.first.label.should == "Special Label"
21
+ end
22
+ it "should use get a label from a list of translations" do
23
+ mods_display_note(@sor_label).fields.first.label.should == "Statement of Responsibility"
24
+ end
25
+ it "should use use the raw type attribute if one is present" do
26
+ mods_display_note(@type_label).fields.first.label.should == "Some other Type"
27
+ end
28
+ end
29
+
30
+ describe "fields" do
31
+ it "should handle single values" do
32
+ fields = mods_display_note(@note).fields
33
+ fields.length.should == 1
34
+ fields.first.values.should == ["Note Field"]
35
+ end
36
+ it "should handle complex grouping" do
37
+ fields = mods_display_note(@complex_label).fields
38
+ fields.length.should == 3
39
+ fields.first.label.should == "Note"
40
+ fields.first.values.length == 2
41
+ fields.first.values.should == ["Note Field", "2nd Note Field"]
42
+
43
+ fields[1].label == "Statement of Responsibility"
44
+ fields[1].values.length == 1
45
+ fields[1].values.should == ["SoR"]
46
+
47
+ fields.last.label.should == "Note"
48
+ fields.last.values.length == 1
49
+ fields.last.values.should == ["Another Note"]
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_item(mods_record)
4
+ ModsDisplay::RelatedItem.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::RelatedItem do
8
+ before(:all) do
9
+ @item = Stanford::Mods::Record.new.from_str("<mods><relatedItem><titleInfo>A Related Item</titleInfo></relatedItem></mods>", false).related_item
10
+ @linked_item = Stanford::Mods::Record.new.from_str("<mods><relatedItem><titleInfo>A Related Item</titleInfo><location><url>http://library.stanford.edu/</url></location></relatedItem></mods>", false).related_item
11
+ @collection = Stanford::Mods::Record.new.from_str("<mods><relatedItem><titleInfo>This is a Collection</titleInfo><typeOfResource collection='yes' /></relatedItem></mods>", false).related_item
12
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><relatedItem displayLabel='Special Item'><titleInfo>A Related Item</titleInfo></relatedItem></mods>", false).related_item
13
+ end
14
+ describe "label" do
15
+ it "should default to Related Item" do
16
+ mods_display_item(@item).fields.first.label.should == "Related Item"
17
+ end
18
+ it "should get the displayLabel if available" do
19
+ mods_display_item(@display_label).fields.first.label.should == "Special Item"
20
+ end
21
+ end
22
+ describe "fields" do
23
+ it "should get a location if it is available" do
24
+ fields = mods_display_item(@item).fields
25
+ fields.length.should == 1
26
+ fields.first.values.should == ["A Related Item"]
27
+ end
28
+ it "should return a link if there is a location/url present" do
29
+ fields = mods_display_item(@linked_item).fields
30
+ fields.length.should == 1
31
+ fields.first.values.should == ["<a href='http://library.stanford.edu/'>A Related Item</a>"]
32
+ end
33
+ it "should not return any fields if the described related item is a collection" do
34
+ mods_display_item(@collection).fields.should == []
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_related_location(mods_record)
4
+ ModsDisplay::RelatedLocation.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::RelatedLocation do
8
+ before(:all) do
9
+ @location = Stanford::Mods::Record.new.from_str("<mods><relatedItem><location>The Location</location></relatedItem></mods>", false).related_item
10
+ @non_location = Stanford::Mods::Record.new.from_str("<mods><relatedItem><title>No Location</title></relatedItem></mods>", false).related_item
11
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><relatedItem displayLabel='Special Location'><location>The Location</location></relatedItem></mods>", false).related_item
12
+ end
13
+ describe "label" do
14
+ it "should default to Location" do
15
+ mods_display_related_location(@location).fields.first.label.should == "Location"
16
+ end
17
+ it "should get the displayLabel if available" do
18
+ mods_display_related_location(@display_label).label.should == "Special Location"
19
+ end
20
+ end
21
+ describe "fields" do
22
+ it "should get a location if it is available" do
23
+ fields = mods_display_related_location(@location).fields
24
+ fields.length.should == 1
25
+ fields.first.values.should == ["The Location"]
26
+ end
27
+ it "should not return any fields if there is no location" do
28
+ mods_display_related_location(@non_location).fields.should == []
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,89 @@
1
+ require "spec_helper"
2
+ require "fixtures/subjects_fixtures"
3
+ include SubjectsFixtures
4
+
5
+ def mods_display_subject(mods_record)
6
+ config = ModsDisplay::Configuration::Subject.new do
7
+ link :link_method, "%value%"
8
+ end
9
+ ModsDisplay::Subject.new(mods_record, config, TestController.new)
10
+ end
11
+
12
+ def mods_display_hierarchical_subject(mods_record)
13
+ config = ModsDisplay::Configuration::Subject.new do
14
+ hierarchical_link true
15
+ link :link_method, "%value%"
16
+ end
17
+ ModsDisplay::Subject.new(mods_record, config, TestController.new)
18
+ end
19
+
20
+ describe ModsDisplay::Subject do
21
+ before(:all) do
22
+ @subject = Stanford::Mods::Record.new.from_str(subjects, false).subject
23
+ @emdash_subject = Stanford::Mods::Record.new.from_str(emdash_subjects, false).subject
24
+ @geo_subject = Stanford::Mods::Record.new.from_str(hierarchical_geo_subjects, false).subject
25
+ @name_subject = Stanford::Mods::Record.new.from_str(name_subjects, false).subject
26
+ @complex_subject = Stanford::Mods::Record.new.from_str(complex_subjects, false).subject
27
+ end
28
+
29
+ describe "fields" do
30
+ it "should split individual child elments of subject into separate parts" do
31
+ fields = mods_display_subject(@subject).fields
32
+ fields.length.should == 1
33
+ fields.first.values.should == [["Jazz", "Japan", "History and criticism"]]
34
+ end
35
+ it "should split horizontalized subjects split with an emdash into separate parts" do
36
+ fields = mods_display_subject(@emdash_subject).fields
37
+ fields.length.should == 1
38
+ fields.first.values.should == [["Jazz", "Japan", "History and criticism"]]
39
+ end
40
+ it "should handle hierarchicalGeogaphic subjects properly" do
41
+ fields = mods_display_subject(@geo_subject).fields
42
+ fields.length.should == 1
43
+ fields.first.values.should == [["United States", "California", "Stanford"]]
44
+ end
45
+ end
46
+
47
+ describe "name subjects" do
48
+ it "should handle name subjects properly" do
49
+ fields = mods_display_subject(@name_subject).fields
50
+ fields.length.should == 1
51
+ fields.first.values.first.first.should be_a(ModsDisplay::Name::Person)
52
+ fields.first.values.first.first.name.should == "John Doe"
53
+ fields.first.values.first.first.role.should == "Depicted"
54
+ end
55
+ it "should link the name (and not the role) correctly" do
56
+ html = mods_display_subject(@name_subject).to_html
57
+ html.should match(/<a href='.*\?John Doe'>John Doe<\/a> \(Depicted\)/)
58
+ html.should match(/<a href='.*\?Anonymous People'>Anonymous People<\/a>/)
59
+ end
60
+ it "should linke the name (and not the role) correctly when linking hierarchicaly" do
61
+ html = mods_display_hierarchical_subject(@name_subject).to_html
62
+ html.should match(/<a href='.*\?John Doe'>John Doe<\/a> \(Depicted\)/)
63
+ html.should match(/<a href='.*\?John Doe Anonymous People'>Anonymous People<\/a>/)
64
+ end
65
+ end
66
+
67
+ describe "to_html" do
68
+ it "should link the values when requested" do
69
+ html = mods_display_subject(@subject).to_html
70
+ html.should match(/<a href='http:\/\/library.stanford.edu\?Jazz'>Jazz<\/a>/)
71
+ html.should match(/<a href='http:\/\/library.stanford.edu\?Japan'>Japan<\/a>/)
72
+ html.should match(/<a href='http:\/\/library.stanford.edu\?History and criticism'>History and criticism<\/a>/)
73
+ end
74
+ it "does something" do
75
+ html = mods_display_hierarchical_subject(@subject).to_html
76
+ html.should match(/<a href='http:\/\/library.stanford.edu\?Jazz'>Jazz<\/a>/)
77
+ html.should match(/<a href='http:\/\/library.stanford.edu\?Jazz Japan'>Japan<\/a>/)
78
+ html.should match(/<a href='http:\/\/library.stanford.edu\?Jazz Japan History and criticism'>History and criticism<\/a>/)
79
+ end
80
+ it "should collapse fields into the same label" do
81
+ html = mods_display_subject(@complex_subject).to_html
82
+ html.scan(/<dt title='Subject'>Subject:<\/dt>/).length.should == 1
83
+ html.scan(/<dd>/).length.should == 1
84
+ html.scan(/<br\/>/).length.should == 1
85
+ html.scan(/ &gt; /).length.should == 3
86
+ end
87
+ end
88
+
89
+ end
@@ -0,0 +1,47 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_title(mods_record)
4
+ ModsDisplay::Title.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Title do
8
+ before(:all) do
9
+ @title = Stanford::Mods::Record.new.from_str("<mods><titleInfo><title>Title</title></titleInfo></mods>", false).title_info
10
+ @title_parts = Stanford::Mods::Record.new.from_str("<mods><titleInfo><nonSort>The</nonSort><title>Title</title><subTitle>For</subTitle><partName>Something</partName><partNumber>62</partNumber></titleInfo></mods>", false).title_info
11
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><titleInfo displayLabel='MyTitle'><title>Title</title></titleInfo></mods>", false).title_info
12
+ @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
13
+ @alt_title = Stanford::Mods::Record.new.from_str("<mods><titleInfo type='alternative'><title>Title</title></titleInfo></mods>", false).title_info
14
+ end
15
+ describe "labels" do
16
+ it "should return a default label of Title if nothing else is available" do
17
+ mods_display_title(@title).fields.first.label.should == "Title"
18
+ end
19
+ it "should return an appropriate label from the type attribute" do
20
+ mods_display_title(@alt_title).fields.first.label.should == "Alternative Title"
21
+ end
22
+ it "should return the label held in the displayLabel attribute of the titleInfo element when available" do
23
+ mods_display_title(@display_label).fields.first.label.should == "MyTitle"
24
+ end
25
+ end
26
+ describe "fields" do
27
+ it "should return an array of label/value objects" do
28
+ values = mods_display_title(@display_label).fields
29
+ values.length.should == 1
30
+ values.first.should be_a ModsDisplay::Values
31
+ values.first.label.should == "MyTitle"
32
+ values.first.values.should == ["Title"]
33
+ end
34
+ end
35
+ describe "text" do
36
+ it "should construct all the elements in titleInfo" do
37
+ mods_display_title(@title_parts).fields.first.values.should include "The Title : For. Something, 62"
38
+ end
39
+ it "should use the displayForm when available" do
40
+ mods_display_title(@display_form).fields.first.values.should include "The Title of This Item"
41
+ end
42
+ it "should return the basic text held in a sub element of titleInfo" do
43
+ mods_display_title(@title).fields.first.values.should include "Title"
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,52 @@
1
+ module CartographicsFixtures
2
+ def full_cartographic
3
+ <<-MODS
4
+ <mods>
5
+ <subject>
6
+ <cartographics>
7
+ <scale>The scale</scale>
8
+ <coordinates>the coordinates</coordinates>
9
+ <projection>the projection</projection>
10
+ </cartographics>
11
+ </subject>
12
+ </mods>
13
+ MODS
14
+ end
15
+
16
+ def no_scale_cartographic
17
+ <<-MODS
18
+ <mods>
19
+ <subject>
20
+ <cartographics>
21
+ <coordinates>the coordinates</coordinates>
22
+ <projection>the projection</projection>
23
+ </cartographics>
24
+ </subject>
25
+ </mods>
26
+ MODS
27
+ end
28
+
29
+ def coordinates_only
30
+ <<-MODS
31
+ <mods>
32
+ <subject>
33
+ <cartographics>
34
+ <coordinates>the coordinates</coordinates>
35
+ </cartographics>
36
+ </subject>
37
+ </mods>
38
+ MODS
39
+ end
40
+
41
+ def scale_only
42
+ <<-MODS
43
+ <mods>
44
+ <subject>
45
+ <cartographics>
46
+ <scale>The scale</scale>
47
+ </cartographics>
48
+ </subject>
49
+ </mods>
50
+ MODS
51
+ end
52
+ end
@@ -0,0 +1,89 @@
1
+ module ImprintFixtures
2
+ def imprint_mods
3
+ <<-MODS
4
+ <mods>
5
+ <originInfo>
6
+ <place>A Place</place>
7
+ <publisher>A Publisher</publisher>
8
+ <dateCreated>A Create Date</dateCreated>
9
+ <dateIssued>An Issue Date</dateIssued>
10
+ <dateCaptured>A Capture Date</dateCaptured>
11
+ <dateOther>Another Date</dateOther>
12
+ </originInfo>
13
+ </mods>
14
+ MODS
15
+ end
16
+ def origin_info_mods
17
+ <<-MODS
18
+ <mods>
19
+ <originInfo>
20
+ <dateValid>A Valid Date</dateValid>
21
+ </originInfo>
22
+ <originInfo>
23
+ <edition>The Edition</edition>
24
+ </originInfo>
25
+ </mods>
26
+ MODS
27
+ end
28
+ def encoded_date
29
+ <<-MODS
30
+ <mods>
31
+ <originInfo>
32
+ <place>A Place</place>
33
+ <dateIssued encoding="an-encoding">An Encoded Date</dateIssued>
34
+ </originInfo>
35
+ </mods>
36
+ MODS
37
+ end
38
+ def only_encoded_data
39
+ <<-MODS
40
+ <mods>
41
+ <originInfo>
42
+ <dateIssued encoding="an-encoding">An Encoded Date</dateIssued>
43
+ </originInfo>
44
+ </mods>
45
+ MODS
46
+ end
47
+ def mixed_mods
48
+ <<-MODS
49
+ <mods>
50
+ <originInfo>
51
+ <place>A Place</place>
52
+ <publisher>A Publisher</publisher>
53
+ <edition>The Edition</edition>
54
+ </originInfo>
55
+ </mods>
56
+ MODS
57
+ end
58
+ def display_form
59
+ <<-MODS
60
+ <mods>
61
+ <originInfo>
62
+ <place>A Place</place>
63
+ <publisher>A Publisher</publisher>
64
+ <displayForm>The Display Form</displayForm>
65
+ </originInfo>
66
+ <originInfo displayLabel="TheLabel">
67
+ <place>A Place</place>
68
+ <publisher>A Publisher</publisher>
69
+ <displayForm>The Display Form</displayForm>
70
+ </originInfo>
71
+ </mods>
72
+ MODS
73
+ end
74
+ def display_label
75
+ <<-MODS
76
+ <mods>
77
+ <originInfo displayLabel="TheLabel">
78
+ <place>A Place</place>
79
+ <publisher>A Publisher</publisher>
80
+ </originInfo>
81
+ <originInfo displayLabel="EditionLabel">
82
+ <place>A Place</place>
83
+ <publisher>A Publisher</publisher>
84
+ <edition>The Edition</edition>
85
+ </originInfo>
86
+ </mods>
87
+ MODS
88
+ end
89
+ end
@@ -0,0 +1,3 @@
1
+ module NameFixtures
2
+
3
+ end
@@ -0,0 +1,70 @@
1
+ module SubjectsFixtures
2
+ def subjects
3
+ <<-XML
4
+ <mods>
5
+ <subject>
6
+ <topic>Jazz</topic>
7
+ <geographical>Japan</geographical>
8
+ <topic>History and criticism</topic>
9
+ </subject>
10
+ </mods>
11
+ XML
12
+ end
13
+
14
+ def emdash_subjects
15
+ <<-XML
16
+ <mods>
17
+ <subject>
18
+ <topic>Jazz -- Japan -- History and criticism</topic>
19
+ </subject>
20
+ </mods>
21
+ XML
22
+ end
23
+
24
+ def hierarchical_geo_subjects
25
+ <<-XML
26
+ <mods>
27
+ <subject>
28
+ <hierarchicalGeographic>
29
+ <country>United States</country>
30
+ <state>California</state>
31
+ <city>Stanford</city>
32
+ </hierarchicalGeographic>
33
+ </subject>
34
+ </mods>
35
+ XML
36
+ end
37
+
38
+ def name_subjects
39
+ <<-XML
40
+ <mods>
41
+ <subject>
42
+ <name>
43
+ <role>
44
+ <roleTerm type='text'>Depicted</roleTerm>
45
+ </role>
46
+ <namePart>John Doe</namePart>
47
+ </name>
48
+ <topic>Anonymous People</topic>
49
+ </subject>
50
+ </mods>
51
+ XML
52
+ end
53
+
54
+ def complex_subjects
55
+ <<-XML
56
+ <mods>
57
+ <subject>
58
+ <topic>Jazz</topic>
59
+ <geographical>Japan</geographical>
60
+ <topic>History and criticism</topic>
61
+ </subject>
62
+ <subject>
63
+ <topic>Bay Area</topic>
64
+ <geographical>Stanford</geographical>
65
+ </subject>
66
+ </mods>
67
+ XML
68
+ end
69
+
70
+ end