Skip to content

Commit fbdea98

Browse files
authored
Merge pull request #1400 from MITLibraries/pw-132-ampersands-in-authors
Update Primo author link encoding
2 parents 2d99b5e + 9e51fd8 commit fbdea98

File tree

2 files changed

+26
-20
lines changed

2 files changed

+26
-20
lines changed

app/models/normalize_primo_common.rb

+9-3
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,16 @@ def sanitize_authors(authors)
5252
authors.map { |author| author.strip.gsub(/\$\$Q.*$/, '') }
5353
end
5454

55+
# author_link constructs a link to Primo as an exact creator search
5556
def author_link(author)
56-
[ENV['MIT_PRIMO_URL'], '/discovery/search?query=creator,exact,',
57-
author, '&tab=', ENV['PRIMO_MAIN_VIEW_TAB'], '&search_scope=all&vid=',
58-
ENV['PRIMO_VID']].join
57+
[ENV.fetch('MIT_PRIMO_URL', nil), '/discovery/search?query=creator,exact,',
58+
encode_author(author), '&tab=', ENV.fetch('PRIMO_MAIN_VIEW_TAB', nil), '&search_scope=all&vid=',
59+
ENV.fetch('PRIMO_VID', nil)].join
60+
end
61+
62+
# encode_author ensures author components are URI encoded
63+
def encode_author(author)
64+
URI.encode_uri_component(author)
5965
end
6066

6167
def year

test/models/normalize_primo_test.rb

+17-17
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ def popcorn
55
VCR.use_cassette('popcorn primo',
66
allow_playback_repeats: true) do
77
raw_query = SearchPrimo.new.search('popcorn',
8-
ENV['PRIMO_BOOK_SCOPE'], 5)
9-
NormalizePrimo.new.to_result(raw_query, ENV['PRIMO_BOOK_SCOPE'],
8+
ENV.fetch('PRIMO_BOOK_SCOPE', nil), 5)
9+
NormalizePrimo.new.to_result(raw_query, ENV.fetch('PRIMO_BOOK_SCOPE', nil),
1010
'popcorn')
1111
end
1212
end
@@ -15,8 +15,8 @@ def monkeys
1515
VCR.use_cassette('monkeys primo articles',
1616
allow_playback_repeats: true) do
1717
raw_query = SearchPrimo.new.search('monkeys',
18-
ENV['PRIMO_ARTICLE_SCOPE'], 5)
19-
NormalizePrimo.new.to_result(raw_query, ENV['PRIMO_ARTICLE_SCOPE'],
18+
ENV.fetch('PRIMO_ARTICLE_SCOPE', nil), 5)
19+
NormalizePrimo.new.to_result(raw_query, ENV.fetch('PRIMO_ARTICLE_SCOPE', nil),
2020
'monkeys')
2121
end
2222
end
@@ -28,8 +28,8 @@ def missing_fields
2828
VCR.use_cassette('missing fields primo',
2929
allow_playback_repeats: true) do
3030
raw_query = SearchPrimo.new.search('Chʻomsŭkʻi, kkŭt ŏmnŭn tojŏn',
31-
ENV['PRIMO_BOOK_SCOPE'], 5)
32-
NormalizePrimo.new.to_result(raw_query, ENV['PRIMO_BOOK_SCOPE'],
31+
ENV.fetch('PRIMO_BOOK_SCOPE', nil), 5)
32+
NormalizePrimo.new.to_result(raw_query, ENV.fetch('PRIMO_BOOK_SCOPE', nil),
3333
'Chʻomsŭkʻi, kkŭt ŏmnŭn tojŏn')
3434
end
3535
end
@@ -38,8 +38,8 @@ def missing_fields
3838
VCR.use_cassette('no results primo',
3939
allow_playback_repeats: true) do
4040
raw_query = SearchPrimo.new.search('popcornandorangejuice',
41-
ENV['PRIMO_BOOK_SCOPE'], 5)
42-
query = NormalizePrimo.new.to_result(raw_query, ENV['PRIMO_BOOK_SCOPE'],
41+
ENV.fetch('PRIMO_BOOK_SCOPE', nil), 5)
42+
query = NormalizePrimo.new.to_result(raw_query, ENV.fetch('PRIMO_BOOK_SCOPE', nil),
4343
'popcornandorangejuice')
4444
assert_equal(0, query['total'])
4545
end
@@ -79,47 +79,47 @@ def missing_fields
7979
result = popcorn['results'].first
8080
assert_not_equal 'Rudolph, J.$$QRudolph, J.', result.authors.first.first
8181
assert_equal ['Rudolph, J.',
82-
'https://mit.primo.exlibrisgroup.com/discovery/search?query=creator,exact,Rudolph, J.&tab=all&search_scope=all&vid=FAKE_PRIMO_VID'],
82+
'https://mit.primo.exlibrisgroup.com/discovery/search?query=creator,exact,Rudolph%2C%20J.&tab=all&search_scope=all&vid=FAKE_PRIMO_VID'],
8383
result.authors.first
8484
end
8585

8686
test 'multiple authors in a single element are appropriately parsed' do
8787
result = monkeys['results'].second
8888
assert_not_equal ['Beran, Michael J ; Smith, J. David'], result.authors.first.first
8989
assert_equal ['Beran, Michael J',
90-
'https://mit.primo.exlibrisgroup.com/discovery/search?query=creator,exact,Beran, Michael J&tab=all&search_scope=all&vid=FAKE_PRIMO_VID'],
90+
'https://mit.primo.exlibrisgroup.com/discovery/search?query=creator,exact,Beran%2C%20Michael%20J&tab=all&search_scope=all&vid=FAKE_PRIMO_VID'],
9191
result.authors.first
9292
assert_equal ['Smith, J. David',
93-
'https://mit.primo.exlibrisgroup.com/discovery/search?query=creator,exact,Smith, J. David&tab=all&search_scope=all&vid=FAKE_PRIMO_VID'],
93+
'https://mit.primo.exlibrisgroup.com/discovery/search?query=creator,exact,Smith%2C%20J.%20David&tab=all&search_scope=all&vid=FAKE_PRIMO_VID'],
9494
result.authors.second
9595
end
9696

9797
test 'cleans up single author data in the expected Alma format' do
98-
normalizer = NormalizePrimoCommon.new('record', ENV['PRIMO_BOOK_SCOPE'])
98+
normalizer = NormalizePrimoCommon.new('record', ENV.fetch('PRIMO_BOOK_SCOPE', nil))
9999
authors = ['Evans, Bill$$QEvans, Bill']
100100
assert_equal ['Evans, Bill'], normalizer.sanitize_authors(authors)
101101
end
102102

103103
test 'cleans up multiple author data in the expected Alma format' do
104-
normalizer = NormalizePrimoCommon.new('record', ENV['PRIMO_BOOK_SCOPE'])
104+
normalizer = NormalizePrimoCommon.new('record', ENV.fetch('PRIMO_BOOK_SCOPE', nil))
105105
authors = ['Blakey, Art$$QBlakey, Art', 'Shorter, Wayne$$QShorter, Wayne']
106106
assert_equal ['Blakey, Art', 'Shorter, Wayne'], normalizer.sanitize_authors(authors)
107107
end
108108

109109
test 'cleans up multiple author data in the expected CDI format' do
110-
normalizer = NormalizePrimoCommon.new('record', ENV['PRIMO_ARTICLE_SCOPE'])
110+
normalizer = NormalizePrimoCommon.new('record', ENV.fetch('PRIMO_ARTICLE_SCOPE', nil))
111111
authors = ['Blakey, Art ; Shorter, Wayne']
112112
assert_equal ['Blakey, Art', 'Shorter, Wayne'], normalizer.sanitize_authors(authors)
113113
end
114114

115115
test 'does not attempt to clean up acceptable single author data' do
116-
normalizer = NormalizePrimoCommon.new('record', ENV['PRIMO_BOOK_SCOPE'])
116+
normalizer = NormalizePrimoCommon.new('record', ENV.fetch('PRIMO_BOOK_SCOPE', nil))
117117
authors = ['Redman, Joshua']
118118
assert_equal ['Redman, Joshua'], normalizer.sanitize_authors(authors)
119119
end
120120

121121
test 'does not attempt to clean up acceptable multiple author data' do
122-
normalizer = NormalizePrimoCommon.new('record', ENV['PRIMO_BOOK_SCOPE'])
122+
normalizer = NormalizePrimoCommon.new('record', ENV.fetch('PRIMO_BOOK_SCOPE', nil))
123123
authors = ['Redman, Joshua', 'Mehldau, Brad']
124124
assert_equal ['Redman, Joshua', 'Mehldau, Brad'], normalizer.sanitize_authors(authors)
125125
end
@@ -132,7 +132,7 @@ def missing_fields
132132

133133
test 'can handle bad results' do
134134
assert_raises NormalizePrimo::InvalidResults do
135-
NormalizePrimo.new.to_result('', ENV['PRIMO_BOOK_SCOPE'], 'popcorn')
135+
NormalizePrimo.new.to_result('', ENV.fetch('PRIMO_BOOK_SCOPE', nil), 'popcorn')
136136
end
137137
end
138138
end

0 commit comments

Comments
 (0)