openurl 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,71 @@
1
+ # openurl
2
+
3
+ ## DESCRIPTION
4
+
5
+ openurl is a Ruby library creating, parsing and using NISO Z39.88 OpenURLs over
6
+ HTTP. <http://openurl.info/registry>
7
+
8
+ While openurl can send requests to OpenURL 1.0 resolvers, there is no 'standard'
9
+ response format, so parsing the returned value is up to you.
10
+
11
+ ## USAGE
12
+
13
+ require 'openurl'
14
+
15
+ # Create your context object
16
+ context_object = OpenURL::ContextObject.new
17
+
18
+ # Add metadata to the Context Object Entities
19
+ context_object.referent.set_format('journal')
20
+ context_object.referent.add_identifier('info:doi/10.1016/j.ipm.2005.03.024')
21
+ context_object.referent.set_metadata('issn', '0306-4573')
22
+ context_object.referent.set_metadata('aulast', 'Bollen')
23
+ context_object.referrer.add_identifier('info:sid/google')
24
+
25
+ puts context_object.kev
26
+
27
+ puts context_object.xml
28
+
29
+ # Send the context object to an OpenURL link resolver
30
+ transport = OpenURL::Transport.new('http://demo.exlibrisgroup.com:9003/lr_3', context_object)
31
+ transport.get
32
+ puts tranport.response
33
+
34
+ # Create a new ContextObject from an existing kev or XML serialization:
35
+ #
36
+ # ContextObject.new_from_kev( kev_context_object )
37
+ # ContextObject.new_from_xml( xml_context_object ) # Can be String or REXML::Document
38
+
39
+ ## Ruby 1.9 and encodings
40
+
41
+ Gem does run and all tests pass under ruby 1.9. There is very limited
42
+ support for handling character encodings in the proper 1.9 way.
43
+
44
+ CTX or XML context objects will be assumed utf-8 even if the ruby string
45
+ they are held in has an ascii-8bit encoding. They will forced into a utf-8 encoding.
46
+ This seems to be a side effect of the REXML and CGI libraries we use to parse,
47
+ but there are runnable tests that assert it is true. (see test/encoding_test.rb)
48
+
49
+ Incoming context objects with a non-utf8 ctx_enc value will *not* be handled
50
+ properly, they'll still be forced to utf8.
51
+
52
+ Programmatically created context objects, you must ensure all strings are
53
+ represented as utf8 encoded yourself.
54
+
55
+ More sophisticated encoding handling can theoretically be added, but it's
56
+ somewhat non-trivial, and it's not clear anyone needs it.
57
+
58
+ ## INSTALLATION
59
+
60
+ You should be able to install the gem:
61
+
62
+ gem install openurl
63
+
64
+ The source lives in git on github:
65
+
66
+ http://github.com/openurl/openurl
67
+
68
+ ## TESTS
69
+
70
+ There are some automated tests. Run with `rake test`. They live in `./test`
71
+ and use Test::Unit.
@@ -37,7 +37,7 @@ module OpenURL
37
37
 
38
38
  attr_reader :admin, :referent, :referringEntity, :requestor, :referrer,
39
39
  :serviceType, :resolver
40
- attr_accessor :foreign_keys
40
+ attr_accessor :foreign_keys, :openurl_ver
41
41
 
42
42
  @@defined_entities = {"rft"=>"referent", "rfr"=>"referrer", "rfe"=>"referring-entity", "req"=>"requestor", "svc"=>"service-type", "res"=>"resolver"}
43
43
 
@@ -51,7 +51,17 @@ module OpenURL
51
51
  @serviceType = []
52
52
  @resolver = []
53
53
  @foreign_keys = {}
54
- @admin = {"ctx_ver"=>{"label"=>"version", "value"=>"Z39.88-2004"}, "ctx_tim"=>{"label"=>"timestamp", "value"=>DateTime.now().to_s}, "ctx_id"=>{"label"=>"identifier", "value"=>""}, "ctx_enc"=>{"label"=>"encoding", "value"=>"info:ofi/enc:UTF-8"}}
54
+ @openurl_ver = "Z39.88-2004"
55
+ @admin = {"ctx_ver"=>{"label"=>"version", "value"=>@openurl_ver}, "ctx_tim"=>{"label"=>"timestamp", "value"=>DateTime.now().to_s}, "ctx_id"=>{"label"=>"identifier", "value"=>""}, "ctx_enc"=>{"label"=>"encoding", "value"=>"info:ofi/enc:UTF-8"}}
56
+ end
57
+
58
+ # Any legal OpenURL 1.0 sends url_ver=Z39.88-2004, and usually
59
+ # ctx_ver=Z39.88-2004 too. However, sometimes we need to send
60
+ # an illegal OpenURL with a different openurl ver string, to deal
61
+ # with weird agents, for instance to trick SFX into doing the right thing.
62
+ def openurl_ver=(ver)
63
+ @openurl_ver = ver
64
+ @admin["ctx_ver"]["value"] = ver
55
65
  end
56
66
 
57
67
  def deep_copy
@@ -99,7 +109,7 @@ module OpenURL
99
109
  # true argument if you do not want the ctx_tim key included.
100
110
 
101
111
  def kev(no_date=false)
102
- kevs = ["url_ver=Z39.88-2004", "url_ctx_fmt=#{CGI.escape("info:ofi/fmt:kev:mtx:ctx")}"]
112
+ kevs = ["url_ver=#{self.openurl_ver}", "url_ctx_fmt=#{CGI.escape("info:ofi/fmt:kev:mtx:ctx")}"]
103
113
 
104
114
  # Loop through the administrative metadata
105
115
  @admin.each_key do |k|
@@ -127,7 +137,7 @@ module OpenURL
127
137
  # So this function is really deprecated, but here because we have so much
128
138
  # code dependent on it.
129
139
  def to_hash
130
- co_hash = {"url_ver"=>"Z39.88-2004", "url_ctx_fmt"=>"info:ofi/fmt:kev:mtx:ctx"}
140
+ co_hash = {"url_ver"=>self.openurl_ver, "url_ctx_fmt"=>"info:ofi/fmt:kev:mtx:ctx"}
131
141
 
132
142
  @admin.each_key do |k|
133
143
  co_hash[k]=@admin[k]["value"] if @admin[k]["value"]
@@ -367,7 +377,9 @@ module OpenURL
367
377
  @referent.add_identifier(val)
368
378
  end
369
379
  elsif key == 'sid'
370
- @referrer.set_identifier("info:sid/"+val.to_s)
380
+ @referrer.set_identifier("info:sid/"+val.to_s)
381
+ elsif key == 'pid'
382
+ @referent.set_private_data(val.to_s)
371
383
  else
372
384
  @referent.set_metadata(key, val)
373
385
  end
@@ -18,6 +18,7 @@ module OpenURL
18
18
  @author_keys = ['aulast','aufirst','auinit','auinit1','auinitm','ausuffix',
19
19
  'au', 'aucorp']
20
20
  end
21
+
21
22
  def method_missing(metadata, value=nil)
22
23
  meta = metadata.to_s.sub(/=$/,'')
23
24
  raise ArgumentError, "#{meta.to_s} is not a valid #{self.class} metadata field." unless (@author_keys+@metadata_keys).index(meta)
@@ -28,10 +29,16 @@ module OpenURL
28
29
  end
29
30
  else
30
31
  return self.metadata[meta]
31
- end
32
-
32
+ end
33
33
  end
34
34
 
35
+ def respond_to?(message)
36
+ # make it match method_messing
37
+ key = message.to_s.sub(/=$/,'')
38
+ super || (@author_keys+@metadata_keys).index(key)
39
+ end
40
+
41
+
35
42
  def set_metadata(key, val)
36
43
  @metadata[key] = val.to_s
37
44
  if @author_keys.index(key)
@@ -352,6 +352,25 @@ class ContextObjectTest < Test::Unit::TestCase
352
352
  assert_match("ctx_enc=#{CGI.escape("info:ofi/enc:UTF-8")}", ctx.kev)
353
353
  end
354
354
 
355
+ def test_kev_01_pid
356
+ kev = "sid=CSA:eric-set-c&pid=%3CAN%3EED492558%3C%2FAN%3E%26%3CPY%3E2004%3C%2FPY%3E%26%3CAU%3EHsu%2C%20Jeng-yih%20Tim%3C%2FAU%3E&date=2004&genre=proceeding&aulast=Hsu&aufirst=Jeng-yih&auinitm=T&title=Reading%20without%20Teachers%3A%20Literature%20Circles%20in%20an%20EFL%20Classroom"
357
+ ctx = OpenURL::ContextObject.new_from_kev(kev)
358
+ assert_equal("<AN>ED492558</AN>&<PY>2004</PY>&<AU>Hsu, Jeng-yih Tim</AU>", ctx.referent.private_data)
359
+ end
360
+
361
+ def test_set_openurl_ver
362
+ # manually set 'illegal' openurl_ver is respected
363
+ kev = "sid=CSA:eric-set-c&pid=%3CAN%3EED492558%3C%2FAN%3E%26%3CPY%3E2004%3C%2FPY%3E%26%3CAU%3EHsu%2C%20Jeng-yih%20Tim%3C%2FAU%3E&date=2004&genre=proceeding&aulast=Hsu&aufirst=Jeng-yih&auinitm=T&title=Reading%20without%20Teachers%3A%20Literature%20Circles%20in%20an%20EFL%20Classroom"
364
+ ctx = OpenURL::ContextObject.new_from_kev(kev)
365
+
366
+ ctx.openurl_ver = "" # empty string!
367
+
368
+ kev = ctx.kev
369
+
370
+ assert_match(/url_ver=&/, kev)
371
+ assert_match(/ctx_ver=&/, kev)
372
+ end
373
+
355
374
  protected
356
375
 
357
376
  # Make sure ctx1 and ctx2 don't share the same data objects.
@@ -0,0 +1,13 @@
1
+ class ScholarlyCommonTest < Test::Unit::TestCase
2
+
3
+ def test_respond_to
4
+ kev = "url_ver=Z39.88-2004&rfr_id=info:sid/library.jhu.edu%3Axerxes+%28+OmniFile+Full+Text+Mega%29&rft.genre=article&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.issn=00297917&rft.date=2012&rft.tpages=2+pages&rft.jtitle=Occupational+Health&rft.volume=64&rft.issue=5&rft.spage=14&rft.epage=15&rft.atitle=Inhalation+versus+skin+exposure+%3A+have+we+got+the+balance+right%3F+&rft.aulast=Packham&rft.aufirst=Chris+Partner%2C+EnviroDerm+Services"
5
+
6
+ openurl = OpenURL::ContextObject.new_from_kev(kev)
7
+
8
+ assert openurl.referent.respond_to? :jtitle
9
+ assert openurl.referent.respond_to? :atitle
10
+
11
+ end
12
+
13
+ end
metadata CHANGED
@@ -1,36 +1,42 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: openurl
3
- version: !ruby/object:Gem::Version
4
- hash: 23
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 0
10
- version: 0.2.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Jonathan Rochkind
14
9
  - Ross Singer
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2011-10-10 00:00:00 -04:00
20
- default_executable:
21
- dependencies: []
22
-
13
+ date: 2011-10-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: marc
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
23
31
  description:
24
- email:
32
+ email:
25
33
  - rochkind@jhu.edu
26
34
  - rossfsinger@gmail.com
27
35
  executables: []
28
-
29
36
  extensions: []
30
-
31
- extra_rdoc_files:
32
- - README
33
- files:
37
+ extra_rdoc_files:
38
+ - README.md
39
+ files:
34
40
  - lib/openurl.rb
35
41
  - lib/openurl/context_object_entity.rb
36
42
  - lib/openurl/metadata_formats/book.rb
@@ -52,40 +58,30 @@ files:
52
58
  - test/test.yml
53
59
  - test/context_object_test.rb
54
60
  - test/encoding_test.rb
55
- - README
56
- has_rdoc: true
61
+ - test/scholarly_common_test.rb
62
+ - README.md
57
63
  homepage: https://github.com/openurl/openurl
58
64
  licenses: []
59
-
60
65
  post_install_message:
61
66
  rdoc_options: []
62
-
63
- require_paths:
67
+ require_paths:
64
68
  - lib
65
- required_ruby_version: !ruby/object:Gem::Requirement
69
+ required_ruby_version: !ruby/object:Gem::Requirement
66
70
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
74
- required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
76
  none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- hash: 3
80
- segments:
81
- - 0
82
- version: "0"
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
83
81
  requirements: []
84
-
85
82
  rubyforge_project:
86
- rubygems_version: 1.6.2
83
+ rubygems_version: 1.8.24
87
84
  signing_key:
88
85
  specification_version: 3
89
86
  summary: a Ruby library to create, parse and use NISO Z39.88 OpenURLs
90
87
  test_files: []
91
-
data/README DELETED
@@ -1,68 +0,0 @@
1
- == openurl
2
-
3
- == DESCRIPTION
4
-
5
- openurl is a Ruby library creating, parsing and using NISO Z39.88 OpenURLs over
6
- HTTP. <http://openurl.info/registry>
7
-
8
- While openurl can send requests to OpenURL 1.0 resolvers, there is no 'standard'
9
- response format, so parsing the returned value is up to you.
10
-
11
- == USAGE
12
-
13
- require 'openurl'
14
-
15
- # Create your context object
16
- context_object = OpenURL::ContextObject.new
17
-
18
- # Add metadata to the Context Object Entities
19
- context_object.referent.set_format('journal')
20
- context_object.referent.add_identifier('info:doi/10.1016/j.ipm.2005.03.024')
21
- context_object.referent.set_metadata('issn', '0306-4573')
22
- context_object.referent.set_metadata('aulast', 'Bollen')
23
- context_object.referrer.add_identifier('info:sid/google')
24
-
25
- puts context_object.kev
26
-
27
- puts context_object.xml
28
-
29
- # Send the context object to an OpenURL link resolver
30
- transport = OpenURL::Transport.new('http://demo.exlibrisgroup.com:9003/lr_3', context_object)
31
- transport.get
32
- puts tranport.response
33
-
34
- # Create a new ContextObject from an existing kev or XML serialization:
35
- #
36
- # ContextObject.new_from_kev( kev_context_object )
37
- # ContextObject.new_from_xml( xml_context_object ) # Can be String or REXML::Document
38
-
39
- == Ruby 1.9 and encodings
40
-
41
- Gem does run and all tests pass under ruby 1.9. There is very limited
42
- support for handling character encodings in the proper 1.9 way.
43
-
44
- CTX or XML context objects will be assumed utf-8 even if the ruby string
45
- they are held in has an ascii-8bit encoding. They will forced into a utf-8 encoding.
46
- This seems to be a side effect of the REXML and CGI libraries we use to parse,
47
- but there are runnable tests that assert it is true. (see test/encoding_test.rb)
48
-
49
- Incoming context objects with a non-utf8 ctx_enc value will *not* be handled
50
- properly, they'll still be forced to utf8.
51
-
52
- Programmatically created context objects, you must ensure all strings are
53
- represented as utf8 encoded yourself.
54
-
55
- More sophisticated encoding handling can theoretically be added, but it's
56
- somewhat non-trivial, and it's not clear anyone needs it.
57
-
58
- == INSTALLATION
59
-
60
- You should be able to install the gem:
61
-
62
- gem install openurl
63
-
64
- The source lives in git on github:
65
-
66
- http://github.com/openurl/openurl
67
-
68
-