oai 0.0.9 → 0.0.10
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.
- data/Rakefile +1 -1
- data/lib/oai/provider/metadata_format.rb +4 -2
- data/lib/oai/provider/model/activerecord_wrapper.rb +2 -7
- data/lib/oai/provider/response.rb +6 -10
- data/lib/oai/provider/response/identify.rb +1 -2
- data/lib/oai/provider/response/list_metadata_formats.rb +1 -4
- data/lib/oai/provider/response/record_response.rb +3 -6
- data/lib/oai/provider/resumption_token.rb +1 -1
- data/test/client/tc_libxml.rb +1 -1
- data/test/client/tc_xpath.rb +2 -2
- data/test/provider/models.rb +15 -11
- metadata +2 -2
data/Rakefile
CHANGED
@@ -54,11 +54,13 @@ module OAI::Provider::Metadata
|
|
54
54
|
# 2. Try calling the pluralized name method on the model.
|
55
55
|
# 3. Try calling the singular name method on the model
|
56
56
|
def value_for(field, record, map)
|
57
|
-
method = map[field] ? map[field].to_s : field.to_s
|
58
|
-
|
57
|
+
method = map[field] ? map[field].to_s : field.to_s
|
58
|
+
|
59
59
|
if record.respond_to?(pluralize(method))
|
60
60
|
record.send pluralize(method)
|
61
61
|
elsif record.respond_to?(method)
|
62
|
+
# at this point, this function will throw a dep. error because of the call to type -- a reserved work
|
63
|
+
# in ruby
|
62
64
|
record.send method
|
63
65
|
else
|
64
66
|
[]
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'active_record'
|
2
|
-
|
3
2
|
module OAI::Provider
|
4
3
|
# = OAI::Provider::ActiveRecordWrapper
|
5
4
|
#
|
@@ -35,7 +34,6 @@ module OAI::Provider
|
|
35
34
|
model.find(:first,
|
36
35
|
:order => "#{timestamp_field} desc").send(timestamp_field)
|
37
36
|
end
|
38
|
-
|
39
37
|
# A model class is expected to provide a method Model.sets that
|
40
38
|
# returns all the sets the model supports. See the
|
41
39
|
# activerecord_provider tests for an example.
|
@@ -46,7 +44,6 @@ module OAI::Provider
|
|
46
44
|
def find(selector, options={})
|
47
45
|
return next_set(options[:resumption_token]) if options[:resumption_token]
|
48
46
|
conditions = sql_conditions(options)
|
49
|
-
|
50
47
|
if :all == selector
|
51
48
|
total = model.count(:id, :conditions => conditions)
|
52
49
|
if @limit && total > @limit
|
@@ -93,9 +90,7 @@ module OAI::Provider
|
|
93
90
|
:conditions => token_conditions(token),
|
94
91
|
:limit => @limit,
|
95
92
|
:order => "#{model.primary_key} asc")
|
96
|
-
|
97
93
|
raise OAI::ResumptionTokenException.new unless records
|
98
|
-
|
99
94
|
offset = records.last.send(model.primary_key.to_sym)
|
100
95
|
|
101
96
|
PartialResult.new(records, token.next(offset))
|
@@ -124,9 +119,8 @@ module OAI::Provider
|
|
124
119
|
sql = []
|
125
120
|
sql << "#{timestamp_field} >= ?" << "#{timestamp_field} <= ?"
|
126
121
|
sql << "set = ?" if opts[:set]
|
127
|
-
|
128
122
|
esc_values = [sql.join(" AND ")]
|
129
|
-
esc_values << opts[:from].localtime << opts[:until].localtime
|
123
|
+
esc_values << Time.parse(opts[:from]).localtime << Time.parse(opts[:until]).localtime #-- OAI 2.0 hack - UTC fix from record_responce
|
130
124
|
esc_values << opts[:set] if opts[:set]
|
131
125
|
|
132
126
|
return esc_values
|
@@ -134,3 +128,4 @@ module OAI::Provider
|
|
134
128
|
|
135
129
|
end
|
136
130
|
end
|
131
|
+
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'builder' unless defined?(Builder)
|
2
|
-
|
3
2
|
module OAI
|
4
3
|
module Provider
|
5
4
|
module Response
|
@@ -9,7 +8,6 @@ module OAI
|
|
9
8
|
|
10
9
|
class << self
|
11
10
|
attr_reader :valid_options, :default_options, :required_options
|
12
|
-
|
13
11
|
def valid_parameters(*args)
|
14
12
|
@valid_options ||= []
|
15
13
|
@valid_options = (@valid_options + args.dup).uniq
|
@@ -27,23 +25,23 @@ module OAI
|
|
27
25
|
end
|
28
26
|
|
29
27
|
end
|
30
|
-
|
31
28
|
def initialize(provider, options = {})
|
32
29
|
@provider = provider
|
33
30
|
@options = internalize(options)
|
34
31
|
raise OAI::ArgumentException.new unless valid?
|
35
32
|
end
|
36
|
-
|
37
33
|
def response
|
38
34
|
@builder = Builder::XmlMarkup.new
|
39
35
|
@builder.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
|
40
36
|
@builder.tag!('OAI-PMH', header) do
|
41
37
|
@builder.responseDate Time.now.utc.xmlschema
|
42
|
-
|
38
|
+
#options parameter has been removed here because with it
|
39
|
+
#the data won't validate against oai validators. Without, it
|
40
|
+
#validates.
|
41
|
+
@builder.request(provider.url) #-- OAI 2.0 Hack - removed request options
|
43
42
|
yield @builder
|
44
43
|
end
|
45
44
|
end
|
46
|
-
|
47
45
|
private
|
48
46
|
|
49
47
|
def header
|
@@ -54,7 +52,6 @@ module OAI
|
|
54
52
|
http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd}
|
55
53
|
}
|
56
54
|
end
|
57
|
-
|
58
55
|
def extract_identifier(id)
|
59
56
|
id.sub("#{provider.prefix}/", '')
|
60
57
|
end
|
@@ -67,9 +64,7 @@ module OAI
|
|
67
64
|
if self.class.required_options
|
68
65
|
return false unless (self.class.required_options - @options.keys).empty?
|
69
66
|
end
|
70
|
-
|
71
67
|
return false unless (@options.keys - self.class.valid_options).empty?
|
72
|
-
|
73
68
|
populate_defaults
|
74
69
|
end
|
75
70
|
|
@@ -95,7 +90,7 @@ module OAI
|
|
95
90
|
return value if value.respond_to?(:strftime)
|
96
91
|
|
97
92
|
Date.parse(value) # This will raise an exception for badly formatted dates
|
98
|
-
Time.parse(value).utc #
|
93
|
+
Time.parse(value).utc # -- UTC Bug fix hack 8/08 not in core
|
99
94
|
rescue
|
100
95
|
raise OAI::ArgumentError.new
|
101
96
|
end
|
@@ -119,3 +114,4 @@ module OAI
|
|
119
114
|
end
|
120
115
|
end
|
121
116
|
end
|
117
|
+
|
@@ -13,7 +13,7 @@ module OAI::Provider::Response
|
|
13
13
|
else
|
14
14
|
r.adminEmail provider.email.to_s
|
15
15
|
end
|
16
|
-
r.earliestDatestamp provider.model.earliest
|
16
|
+
r.earliestDatestamp Time.parse(provider.model.earliest.to_s).utc.xmlschema
|
17
17
|
r.deletedRecord provider.delete_support.to_s
|
18
18
|
r.granularity provider.granularity
|
19
19
|
end
|
@@ -23,4 +23,3 @@ module OAI::Provider::Response
|
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
26
|
-
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module OAI::Provider::Response
|
2
|
-
|
3
2
|
class ListMetadataFormats < RecordResponse
|
4
3
|
valid_parameters :identifier
|
5
4
|
|
@@ -17,7 +16,6 @@ module OAI::Provider::Response
|
|
17
16
|
# Remove any format that this particular record can't be provided in.
|
18
17
|
formats.reject! { |f| !record_supports(record, f.prefix) }
|
19
18
|
end
|
20
|
-
|
21
19
|
response do |r|
|
22
20
|
r.ListMetadataFormats do
|
23
21
|
formats.each do |format|
|
@@ -38,5 +36,4 @@ module OAI::Provider::Response
|
|
38
36
|
end
|
39
37
|
|
40
38
|
end
|
41
|
-
|
42
|
-
end
|
39
|
+
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module OAI::Provider::Response
|
2
2
|
class RecordResponse < Base
|
3
|
-
|
4
3
|
def self.inherited(klass)
|
5
4
|
klass.valid_parameters :metadata_prefix, :from, :until, :set
|
6
5
|
klass.default_parameters :metadata_prefix => "oai_dc",
|
7
|
-
|
8
|
-
|
6
|
+
:from => Proc.new {|x| Time.parse(x.provider.model.earliest.to_s) }, #-- OAI 2.0 hack - UTC
|
7
|
+
:until => Proc.new {|x| Time.parse(x.provider.model.latest.to_s) } #-- OAI 2.0 hack - UTC
|
9
8
|
end
|
10
9
|
|
11
10
|
# emit record header
|
@@ -20,7 +19,6 @@ module OAI::Provider::Response
|
|
20
19
|
end
|
21
20
|
end
|
22
21
|
end
|
23
|
-
|
24
22
|
# metadata - core routine for delivering metadata records
|
25
23
|
#
|
26
24
|
def data_for(record)
|
@@ -51,7 +49,6 @@ module OAI::Provider::Response
|
|
51
49
|
elsif options[:resumption_token]
|
52
50
|
OAI::Provider::ResumptionToken.extract_format(options[:resumption_token])
|
53
51
|
end
|
54
|
-
|
55
52
|
raise OAI::FormatException.new unless provider.format_supported?(format)
|
56
53
|
|
57
54
|
format
|
@@ -65,4 +62,4 @@ module OAI::Provider::Response
|
|
65
62
|
end
|
66
63
|
|
67
64
|
end
|
68
|
-
end
|
65
|
+
end
|
@@ -89,7 +89,7 @@ module OAI::Provider
|
|
89
89
|
def encode_conditions
|
90
90
|
encoded_token = @prefix.to_s.dup
|
91
91
|
encoded_token << ".s(#{set})" if set
|
92
|
-
encoded_token << ".f(#{from.utc.xmlschema})" if from
|
92
|
+
encoded_token << ".f(#{self.from.utc.xmlschema})" if self.from
|
93
93
|
encoded_token << ".u(#{self.until.utc.xmlschema})" if self.until
|
94
94
|
encoded_token << ":#{last}"
|
95
95
|
end
|
data/test/client/tc_libxml.rb
CHANGED
data/test/client/tc_xpath.rb
CHANGED
@@ -18,9 +18,9 @@ class XpathTest < Test::Unit::TestCase
|
|
18
18
|
return
|
19
19
|
end
|
20
20
|
|
21
|
-
doc = XML::Document.file('test/test.xml')
|
21
|
+
doc = LibXML::XML::Document.file('test/test.xml')
|
22
22
|
assert_equal xpath(doc, './/responseDate'), '2006-09-11T14:33:15Z'
|
23
23
|
assert_equal xpath(doc, './/foobar'), nil
|
24
24
|
end
|
25
25
|
|
26
|
-
end
|
26
|
+
end
|
data/test/provider/models.rb
CHANGED
@@ -7,9 +7,9 @@ class Record
|
|
7
7
|
tags = 'tag',
|
8
8
|
sets = nil,
|
9
9
|
deleted = false,
|
10
|
-
updated_at = Time.
|
10
|
+
updated_at = Time.now.utc.xmlschema)
|
11
11
|
|
12
|
-
@id = id
|
12
|
+
@id = id
|
13
13
|
@titles = titles
|
14
14
|
@creator = creator
|
15
15
|
@tags = tags
|
@@ -31,7 +31,6 @@ class Record
|
|
31
31
|
end
|
32
32
|
false
|
33
33
|
end
|
34
|
-
|
35
34
|
end
|
36
35
|
|
37
36
|
class TestModel < OAI::Provider::Model
|
@@ -41,15 +40,15 @@ class TestModel < OAI::Provider::Model
|
|
41
40
|
super(limit)
|
42
41
|
@records = []
|
43
42
|
@sets = []
|
44
|
-
@earliest = Time.now
|
43
|
+
@earliest = Time.now.utc.xmlschema
|
45
44
|
end
|
46
45
|
|
47
46
|
def earliest
|
48
|
-
(@records.min {|a,b| a.updated_at <=> b.updated_at }).updated_at
|
47
|
+
(@records.min {|a,b| a.updated_at <=> b.updated_at }).updated_at.utc.xmlschema
|
49
48
|
end
|
50
49
|
|
51
50
|
def latest
|
52
|
-
@records.max {|a,b| a.updated_at <=> b.updated_at }.updated_at
|
51
|
+
@records.max {|a,b| a.updated_at <=> b.updated_at }.updated_at.utc.xmlschema
|
53
52
|
end
|
54
53
|
|
55
54
|
def sets
|
@@ -76,9 +75,14 @@ class TestModel < OAI::Provider::Model
|
|
76
75
|
end
|
77
76
|
else
|
78
77
|
records = @records.select do |rec|
|
79
|
-
|
80
|
-
|
81
|
-
|
78
|
+
((opts[:set].nil? || rec.in_set(opts[:set])) &&
|
79
|
+
(opts[:from].nil? || rec.updated_at >= opts[:from]) &&
|
80
|
+
(opts[:until].nil? || rec.updated_at <= opts[:until]))
|
81
|
+
#else
|
82
|
+
# ((opts[:set].nil? || rec.in_set(opts[:set])) &&
|
83
|
+
# (opts[:from].nil? || rec.updated_at >= opts[:from]) &&
|
84
|
+
# (opts[:until].nil? || rec.updated_at <= opts[:until]))
|
85
|
+
#end
|
82
86
|
end
|
83
87
|
|
84
88
|
if @limit && records.size > @limit
|
@@ -107,8 +111,8 @@ class TestModel < OAI::Provider::Model
|
|
107
111
|
groups
|
108
112
|
end
|
109
113
|
|
110
|
-
def generate_records(number, timestamp = Time.now, sets = [], deleted = false)
|
111
|
-
@earliest = timestamp.dup if @earliest.nil? || timestamp < @earliest
|
114
|
+
def generate_records(number, timestamp = Time.now.utc.xmlschema, sets = [], deleted = false)
|
115
|
+
@earliest = timestamp.dup if @earliest.nil? || timestamp.to_s < @earliest
|
112
116
|
|
113
117
|
# Add any sets we don't already have
|
114
118
|
sets = [sets] unless sets.respond_to?(:each)
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: oai
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2008-
|
6
|
+
version: 0.0.10
|
7
|
+
date: 2008-09-12 00:00:00 -07:00
|
8
8
|
summary: A ruby library for working with the Open Archive Initiative Protocol for Metadata Harvesting (OAI-PMH)
|
9
9
|
require_paths:
|
10
10
|
- lib
|