mods_display 0.0.1.beta1

Sign up to get free protection for your applications and to get access to all the features.
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,21 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_audience(mods_record)
4
+ ModsDisplay::Audience.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Contents do
8
+ before(:all) do
9
+ @audience = Stanford::Mods::Record.new.from_str("<mods><targetAudience>Audience Note</targetAudience></mods>", false).targetAudience
10
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><targetAudience displayLabel='Special Label'>Audience Note</tableOfContents></mods>", false).targetAudience
11
+ end
12
+ describe "label" do
13
+ it "should have a default label" do
14
+ mods_display_audience(@audience).label.should == "Target audience"
15
+ end
16
+ it "should use the displayLabel attribute when one is available" do
17
+ mods_display_audience(@display_label).label.should == "Special Label"
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+ require "fixtures/cartographics_fixtures"
3
+ include CartographicsFixtures
4
+
5
+ def mods_display_cartographics(mods)
6
+ ModsDisplay::Cartographics.new(mods, ModsDisplay::Configuration::Base.new, mock("controller"))
7
+ end
8
+
9
+ describe ModsDisplay::Cartographics do
10
+ before(:all) do
11
+ @cart = Stanford::Mods::Record.new.from_str(full_cartographic, false).subject
12
+ @scale_only = Stanford::Mods::Record.new.from_str(scale_only, false).subject
13
+ @no_scale = Stanford::Mods::Record.new.from_str(no_scale_cartographic, false).subject
14
+ @coordinates = Stanford::Mods::Record.new.from_str(coordinates_only, false).subject
15
+ end
16
+ describe "values" do
17
+ it "should get the full cartographic note" do
18
+ values = mods_display_cartographics(@cart).fields
19
+ values.length.should == 1
20
+ values.first.values.should == ["The scale ; the projection the coordinates"]
21
+ end
22
+ it "should put a scale not given note if no scale is present" do
23
+ values = mods_display_cartographics(@no_scale).fields
24
+ values.length.should == 1
25
+ values.first.values.should == ["Scale not given ; the projection the coordinates"]
26
+ end
27
+ it "should handle when there is only a scale note" do
28
+ values = mods_display_cartographics(@scale_only).fields
29
+ values.length.should == 1
30
+ values.first.values.should == ["The scale"]
31
+ end
32
+ it "should handle when only one post-scale piece of the data is available" do
33
+ values = mods_display_cartographics(@coordinates).fields
34
+ values.length.should == 1
35
+ values.first.values.should == ["Scale not given ; the coordinates"]
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_collection(mods_record)
4
+ ModsDisplay::Collection.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Collection do
8
+ before(:all) do
9
+ @collection = Stanford::Mods::Record.new.from_str("<mods><relatedItem><titleInfo><title>The Collection</title></titleInfo><typeOfResource collection='yes' /></relatedItem></mods>", false).related_item
10
+ @non_collection = Stanford::Mods::Record.new.from_str("<mods><relatedItem><titleInfo><title>Not a Collection</title></titleInfo></relatedItem></mods>", false).related_item
11
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><relatedItem displayLabel='Special Collection'><titleInfo><title>Not a Collection</title></titleInfo></relatedItem></mods>", false).related_item
12
+ end
13
+ describe "label" do
14
+ it "should default to Collection" do
15
+ mods_display_collection(@collection).label.should == "Collection"
16
+ end
17
+ it "should get the displayLabel if available" do
18
+ mods_display_collection(@display_label).label.should == "Special Collection"
19
+ end
20
+ end
21
+ describe "fields" do
22
+ it "should get a collection title if there is an appropriate typeOfResource field with the collection attribute" do
23
+ fields = mods_display_collection(@collection).fields
24
+ fields.length.should == 1
25
+ fields.first.values.should == ["The Collection"]
26
+ end
27
+ it "should not return anything if the there is not an appropriate typeOfResource field with the collection attribute" do
28
+ mods_display_collection(@non_collection).fields.should == []
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_contents(mods_record)
4
+ ModsDisplay::Contents.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Contents do
8
+ before(:all) do
9
+ @contents = Stanford::Mods::Record.new.from_str("<mods><tableOfContents>Content Note</tableOfContents></mods>", false).tableOfContents
10
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><tableOfContents displayLabel='Special Label'>Content Note</tableOfContents></mods>", false).tableOfContents
11
+ end
12
+ describe "label" do
13
+ it "should have a default label" do
14
+ mods_display_contents(@contents).label.should == "Table of Contents"
15
+ end
16
+ it "should use the displayLabel attribute when one is available" do
17
+ mods_display_contents(@display_label).label.should == "Special Label"
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_description(mods)
4
+ ModsDisplay::Description.new(mods, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Description do
8
+ before(:all) do
9
+ @form = Stanford::Mods::Record.new.from_str("<mods><physicalDescription><form>Form Note</form></physicalDescription></mods>", false).physical_description
10
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><physicalDescription displayLabel='SpecialLabel'><form>Form Note</form></physicalDescription></mods>", false).physical_description
11
+ @child_display_label = Stanford::Mods::Record.new.from_str("<mods><physicalDescription><form displayLabel='Form Label'>Form Note</form></physicalDescription></mods>", false).physical_description
12
+ @mixed = Stanford::Mods::Record.new.from_str("<mods><physicalDescription><form>Form Note</form><extent>Extent Note</extent></physicalDescription></mods>", false).physical_description
13
+ end
14
+ describe "labels" do
15
+ it "should use the dislayLabel if one is provided" do
16
+ mods_display_description(@display_label).fields.first.label.should == "SpecialLabel"
17
+ end
18
+ it "should get the default label for a child element" do
19
+ mods_display_description(@form).fields.first.label.should == "Form"
20
+ end
21
+ it "should get multiple lables for mixed content" do
22
+ mods_display_description(@mixed).fields.map{|v| v.label }.should == ["Form", "Extent"]
23
+ end
24
+ it "should get the display label from child elements" do
25
+ mods_display_description(@child_display_label).fields.map{|f| f.label }.should == ["Form Label"]
26
+ end
27
+ end
28
+
29
+ describe "fields" do
30
+ it "should get the value from a field in physicalDescription" do
31
+ mods_display_description(@form).fields.first.values.should == ["Form Note"]
32
+ end
33
+ it "should get multiple values for mixed content" do
34
+ mods_display_description(@mixed).fields.map{|v| v.values }.should == [["Form Note"], ["Extent Note"]]
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_format(mods)
4
+ ModsDisplay::Format.new(mods, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Format do
8
+ before(:all) do
9
+ @format = Stanford::Mods::Record.new.from_str("<mods><typeOfResource>Format</typeOfResource></mods>", false).typeOfResource
10
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><typeOfResource displayLabel='SpecialFormat'>Mixed Materials</typeOfResource></mods>", false).typeOfResource
11
+ @space_format = Stanford::Mods::Record.new.from_str("<mods><typeOfResource>Mixed Materials</typeOfResource></mods>", false).typeOfResource
12
+ @slash_format = Stanford::Mods::Record.new.from_str("<mods><typeOfResource>Manuscript/Archive</typeOfResource></mods>", false).typeOfResource
13
+ end
14
+
15
+ describe "labels" do
16
+ it "should return the format label" do
17
+ mods_display_format(@format).to_html.should match(/<dt title='Format'>Format:<\/dt>/)
18
+ end
19
+ it "should return the displayLabel when available" do
20
+ mods_display_format(@display_label).to_html.should match(/<dt title='SpecialFormat'>SpecialFormat:<\/dt>/)
21
+ end
22
+ end
23
+ describe "format_class" do
24
+ it "should wrap the format in a span w/ the format class in it" do
25
+ mods_display_format(@format).to_html.should match(/<span class='format'>Format<\/span>/)
26
+ end
27
+ it "should remove any spaces" do
28
+ ModsDisplay::Format.send(:format_class, "Mixed Materials").should == "mixed_materials"
29
+ end
30
+ it "should replace any slashes" do
31
+ ModsDisplay::Format.send(:format_class, "Manuscript/Archive").should == "manuscript_archive"
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,49 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_id(mods_record)
4
+ ModsDisplay::Identifier.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Note do
8
+ before(:all) do
9
+ @id = Stanford::Mods::Record.new.from_str("<mods><identifier>12345</identifier></mods>", false).identifier
10
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><identifier displayLabel='Special Label'>54321</identifier></mods>", false).identifier
11
+ @issue_label = Stanford::Mods::Record.new.from_str("<mods><identifier type='issue number'>Issue 1</identifier></mods>", false).identifier
12
+ @type_label = Stanford::Mods::Record.new.from_str("<mods><identifier type='Some other Type'>98765</identifier></mods>", false).identifier
13
+ @complex_label = Stanford::Mods::Record.new.from_str("<mods><identifier>12345</identifier><identifier>54321</identifier><identifier type='issue number'>12345</identifier><identifier>98765</identifier></mods>", false).identifier
14
+ end
15
+ describe "label" do
16
+ it "should have a default label" do
17
+ mods_display_id(@id).fields.first.label.should == "Identifier"
18
+ end
19
+ it "should use the displayLabel attribute when one is available" do
20
+ mods_display_id(@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_id(@issue_label).fields.first.label.should == "Issue Number"
24
+ end
25
+ it "should use use the raw type attribute if one is present" do
26
+ mods_display_id(@type_label).fields.first.label.should == "Some other Type"
27
+ end
28
+ end
29
+
30
+ describe "fields" do
31
+ it "should handle matching adjacent labels" do
32
+ fields = mods_display_id(@complex_label).fields
33
+ fields.length.should == 3
34
+
35
+ fields.first.label.should == "Identifier"
36
+ fields.first.values.length.should == 2
37
+ fields.first.values.should == ["12345", "54321"]
38
+
39
+ fields[1].label.should == "Issue Number"
40
+ fields[1].values.length.should == 1
41
+ fields[1].values.should == ["12345"]
42
+
43
+ fields.last.label.should == "Identifier"
44
+ fields.last.values.length.should == 1
45
+ fields.last.values.should == ["98765"]
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,78 @@
1
+ require "spec_helper"
2
+ require "fixtures/imprint_fixtures"
3
+
4
+ include ImprintFixtures
5
+
6
+ def mods_display_imprint(mods_record)
7
+ ModsDisplay::Imprint.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
8
+ end
9
+
10
+ describe ModsDisplay::Imprint do
11
+ before(:all) do
12
+ @imprint = Stanford::Mods::Record.new.from_str(imprint_mods, false).origin_info
13
+ @edition_and_date = Stanford::Mods::Record.new.from_str(origin_info_mods, false).origin_info
14
+ @encoded_date = Stanford::Mods::Record.new.from_str(encoded_date, false).origin_info
15
+ @encoded_only = Stanford::Mods::Record.new.from_str(only_encoded_data, false).origin_info
16
+ @mixed = Stanford::Mods::Record.new.from_str(mixed_mods, false).origin_info
17
+ @display_form = Stanford::Mods::Record.new.from_str(display_form, false).origin_info
18
+ @display_form_with_label = Stanford::Mods::Record.new.from_str(display_form, false).origin_info
19
+ @display_label = Stanford::Mods::Record.new.from_str(display_label, false).origin_info
20
+ end
21
+
22
+ describe "labels" do
23
+ it "should get the Imprint label by default" do
24
+ mods_display_imprint(@imprint).fields.first.label.should == "Imprint"
25
+ end
26
+ it "should get the label from non-imprint origin info fields" do
27
+ fields = mods_display_imprint(@edition_and_date).fields
28
+ fields.first.label.should == "Date Valid"
29
+ fields.last.label.should == "Edition"
30
+ end
31
+ it "should get multiple labels when we have mixed content" do
32
+ mods_display_imprint(@mixed).fields.map{|val| val.label }.should == ["Imprint", "Edition"]
33
+ end
34
+ it "should use the displayLabel when available" do
35
+ mods_display_imprint(@display_label).fields.map{|val| val.label }.should == ["TheLabel", "EditionLabel", "EditionLabel"]
36
+ end
37
+ end
38
+
39
+ describe "fields" do
40
+ it "should return various parts of the imprint" do
41
+ mods_display_imprint(@imprint).fields.map{|val| val.values }.join(" ").should == "A Place : A Publisher, A Create Date, An Issue Date, A Capture Date, Another Date"
42
+ end
43
+ it "should get the text for non-imprint origin info fields" do
44
+ fields = mods_display_imprint(@edition_and_date).fields
45
+ fields.first.values.should == ["A Valid Date"]
46
+ fields.last.values.should == ["The Edition"]
47
+ end
48
+ it "should omit dates with an encoding attribute" do
49
+ mods_display_imprint(@encoded_date).fields.map{|val| val.values }.join.should_not include("An Encoded Date")
50
+ end
51
+ it "should not try to return data w/ only encoded data" do
52
+ mods_display_imprint(@encoded_only).fields.should be_empty
53
+ end
54
+ it "should handle mixed mods properly" do
55
+ values = mods_display_imprint(@mixed).fields
56
+ values.length.should == 2
57
+ values.map{|val| val.values}.should include(["A Place : A Publisher"])
58
+ values.map{|val| val.values}.should include(["The Edition"])
59
+ end
60
+ end
61
+ describe "to_html" do
62
+ it "should return the display form if one is available" do
63
+ html = mods_display_imprint(@display_form).to_html
64
+ html.scan(/<dd>/).length.should == 2
65
+ html.scan(/<dd>The Display Form<\/dd>/).length.should == 2
66
+ end
67
+ it "should return the displayLabel when present if we're using the displayForm" do
68
+ mods_display_imprint(@display_form_with_label).to_html.should match(/<dt title='TheLabel'>TheLabel:<\/dt>/)
69
+ end
70
+ it "should have individual dt/dd pairs for mixed content" do
71
+ html = mods_display_imprint(@mixed).to_html
72
+ html.scan(/<dt title='Imprint'>Imprint:<\/dt>/).length.should == 1
73
+ html.scan(/<dt title='Edition'>Edition:<\/dt>/).length.should == 1
74
+ html.scan(/<dd>/).length.should == 2
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,55 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_language(mods_record)
4
+ ModsDisplay::Language.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Language do
8
+ before(:all) do
9
+ @language = Stanford::Mods::Record.new.from_str("<mods><language><languageTerm type='code'>eng</languageTerm></language></mods>", false).language
10
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><language displayLabel='Lang'><languageTerm type='code'>eng</languageTerm></language></mods>", false).language
11
+ @no_lang = Stanford::Mods::Record.new.from_str("<mods><language displayLabel='Lang'><languageTerm type='code'>zzzxxx</languageTerm></language></mods>", false).language
12
+ @mixed = Stanford::Mods::Record.new.from_str("<mods><language><languageTerm type='text'>ger</languageTerm><languageTerm type='code'>eng</languageTerm></language></mods>", false).language
13
+ @multi = Stanford::Mods::Record.new.from_str("<mods><language><languageTerm type='code'>ger</languageTerm><languageTerm type='code'>eng</languageTerm></language></mods>", false).language
14
+ @display_form = Stanford::Mods::Record.new.from_str("<mods><language><languageTerm>zzzxxx</languageTerm><displayForm>Klingon</displayForm></language></mods>", false).language
15
+ end
16
+ describe "label" do
17
+ it "should default to Language when no displayLabel is available" do
18
+ mods_display_language(@language).label.should == "Language"
19
+ end
20
+ it "should use the displayLabel attribute when present" do
21
+ mods_display_language(@display_label).label.should == "Lang"
22
+ end
23
+ end
24
+ describe "fields" do
25
+ it "should return an array with a label/values object" do
26
+ values = mods_display_language(@display_label).fields
27
+ values.length.should == 1
28
+ values.first.should be_a ModsDisplay::Values
29
+ values.first.label.should == "Lang"
30
+ values.first.values.should == ["English"]
31
+ end
32
+ it "should not return any non type='code' languageTerms from the XML" do
33
+ values = mods_display_language(@mixed).fields
34
+ values.length.should == 1
35
+ values.first.values.should == ["English"]
36
+ end
37
+ it "should handle multiple languages correctly" do
38
+ values = mods_display_language(@multi).fields
39
+ values.length.should == 1
40
+ values.first.values.should == ["German", "English"]
41
+ end
42
+ end
43
+ describe "text" do
44
+ it "should return the language code translation" do
45
+ mods_display_language(@language).text.should == "English"
46
+ end
47
+ it "should return the code if the languages table does not have a translation" do
48
+ mods_display_language(@no_lang).text.should == "zzzxxx"
49
+ end
50
+ it "should return a displayForm if there is one" do
51
+ mods_display_language(@display_form).text.should == "Klingon"
52
+ end
53
+ end
54
+
55
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ def mods_display_location(mods_record)
4
+ ModsDisplay::Location.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
5
+ end
6
+
7
+ describe ModsDisplay::Note do
8
+ before(:all) do
9
+ @location = Stanford::Mods::Record.new.from_str("<mods><location><physicalLocation>The Location</physicalLocation></location></mods>", false).location
10
+ @display_label = Stanford::Mods::Record.new.from_str("<mods><location displayLabel='Special Label'><shelfLocation>On Shelf A</shelfLocation></location></mods>", false).location
11
+ @repository_label = Stanford::Mods::Record.new.from_str("<mods><location type='repository'><physicalLocation>Location Field</physicalLocation></location></mods>", false).location
12
+ end
13
+ describe "label" do
14
+ it "should have a default label" do
15
+ mods_display_location(@location).fields.first.label.should == "Location"
16
+ end
17
+ it "should use the displayLabel attribute when one is available" do
18
+ mods_display_location(@display_label).fields.first.label.should == "Special Label"
19
+ end
20
+ it "should use get a label from a list of translations" do
21
+ mods_display_location(@repository_label).fields.first.label.should == "Repository"
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,88 @@
1
+ require "spec_helper"
2
+ require "fixtures/name_fixtures"
3
+ include NameFixtures
4
+
5
+ def mods_display_name_link(mods_record)
6
+ config = ModsDisplay::Configuration::Base.new do
7
+ link :link_method, '%value%'
8
+ end
9
+ ModsDisplay::Name.new(mods_record, config, TestController.new)
10
+ end
11
+
12
+ def mods_display_name(mods_record)
13
+ ModsDisplay::Name.new(mods_record, ModsDisplay::Configuration::Base.new, mock("controller"))
14
+ end
15
+
16
+ describe ModsDisplay::Language do
17
+ before(:all) do
18
+ @name = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart></name></mods>", false).plain_name
19
+ @conf_name = Stanford::Mods::Record.new.from_str("<mods><name type='conference'><namePart>John Doe</namePart></name></mods>", false).plain_name
20
+ @display_form = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart><displayForm>Mr. John Doe</displayForm></name></mods>", false).plain_name
21
+ @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
22
+ @complex_labels = Stanford::Mods::Record.new.from_str("<mods><name><namePart>John Doe</namePart></name><name><namePart>Jane Doe</namePart></name><name type='conference'><namePart>John Dough</namePart></name><name><namePart>Jane Dough</namePart></name></mods>", false).plain_name
23
+ @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
24
+ end
25
+ describe "label" do
26
+ it "should default Creator/Contributor when none is available" do
27
+ mods_display_name(@name).fields.first.label.should == "Creator/Contributor"
28
+ end
29
+ it "should derive the name from the type attribute if one is available" do
30
+ mods_display_name(@conf_name).fields.first.label.should == "Meeting"
31
+ end
32
+ end
33
+
34
+ describe "fields" do
35
+ it "should use the display form when available" do
36
+ fields = mods_display_name(@display_form).fields
37
+ fields.length.should == 1
38
+ fields.first.values.length.should == 1
39
+ fields.first.values.first.should be_a(ModsDisplay::Name::Person)
40
+ fields.first.values.first.name.should == "Mr. John Doe"
41
+ end
42
+ it "should get the role when present" do
43
+ fields = mods_display_name(@name_with_role).fields
44
+ fields.length.should == 1
45
+ fields.first.values.length.should == 1
46
+ fields.first.values.first.should be_a(ModsDisplay::Name::Person)
47
+ fields.first.values.first.role.should == "Depicted"
48
+ end
49
+ it "should collapse adjacent matching labels" do
50
+ fields = mods_display_name(@collapse_label).fields
51
+ fields.length.should == 1
52
+ fields.first.label.should == "Creator/Contributor"
53
+ fields.first.values.each do |val|
54
+ ["John Doe", "Jane Doe"].should include val.to_s
55
+ end
56
+ end
57
+ it "should perseve order and separation of non-adjesent matching labels" do
58
+ fields = mods_display_name(@complex_labels).fields
59
+
60
+ fields.length.should == 3
61
+ fields.first.label.should == "Creator/Contributor"
62
+ fields.first.values.length.should == 2
63
+ fields.first.values.each do |val|
64
+ ["John Doe", "Jane Doe"].should include val.to_s
65
+ end
66
+
67
+ fields[1].label.should == "Meeting"
68
+ fields[1].values.length.should == 1
69
+ fields[1].values.first.to_s.should == "John Dough"
70
+
71
+ fields.last.label.should == "Creator/Contributor"
72
+ fields.last.values.length.should == 1
73
+ fields.last.values.first.to_s.should == "Jane Dough"
74
+ end
75
+ end
76
+
77
+ describe "to_html" do
78
+ it "should add the role to the name in parens" do
79
+ html = mods_display_name(@name_with_role).to_html
80
+ html.should match(/<dd>John Doe \(Depicted\)<\/dd>/)
81
+ end
82
+ it "should linke the name and not the role if requested" do
83
+ html = mods_display_name_link(@name_with_role).to_html
84
+ html.should match(/<dd><a href='.*\?John Doe'>John Doe<\/a> \(Depicted\)<\/dd>/)
85
+ end
86
+ end
87
+
88
+ end