rdf-xsd 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +1 -0
- data/README.markdown +91 -0
- data/UNLICENSE +24 -0
- data/VERSION +1 -0
- data/lib/rdf/xsd.rb +18 -0
- data/lib/rdf/xsd/binary.rb +71 -0
- data/lib/rdf/xsd/date.rb +63 -0
- data/lib/rdf/xsd/double.rb +8 -0
- data/lib/rdf/xsd/duration.rb +195 -0
- data/lib/rdf/xsd/integer.rb +191 -0
- data/lib/rdf/xsd/version.rb +18 -0
- metadata +101 -0
data/AUTHORS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* Gregg Kellogg <gregg@kellogg-assoc.com>
|
data/README.markdown
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
# Extended XSD Datatypes for RDF.rb
|
2
|
+
|
3
|
+
This gem adds additional RDF::Literal subclasses for extended [XSD datatypes][]
|
4
|
+
|
5
|
+
* <http://github.com/gkellogg/rdf-xsd>
|
6
|
+
|
7
|
+
## Features
|
8
|
+
|
9
|
+
* Additional xsd:integer subtypes
|
10
|
+
* xsd:float based on xsd:double
|
11
|
+
* xsd:duration
|
12
|
+
|
13
|
+
Examples
|
14
|
+
--------
|
15
|
+
|
16
|
+
require 'rdf'
|
17
|
+
require 'rdf/xsd'
|
18
|
+
|
19
|
+
## Dependencies
|
20
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.1)
|
21
|
+
* [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.3.3)
|
22
|
+
* [Haml](https://rubygems.org/gems/haml) (>= 3.0.0)
|
23
|
+
|
24
|
+
## Documentation
|
25
|
+
Full documentation available on [Rubydoc.info][XSD doc]
|
26
|
+
|
27
|
+
### Principle Classes
|
28
|
+
* {RDF::Literal::Float}
|
29
|
+
* {RDF::Literal::NonPositiveInteger}
|
30
|
+
* {RDF::Literal::NegativeInteger}
|
31
|
+
* {RDF::Literal::Long}
|
32
|
+
* {RDF::Literal::Int}
|
33
|
+
* {RDF::Literal::Short}
|
34
|
+
* {RDF::Literal::Byte}
|
35
|
+
* {RDF::Literal::NonNegativeInteger}
|
36
|
+
* {RDF::Literal::PositiveInteger}
|
37
|
+
* {RDF::Literal::UnsignedLong}
|
38
|
+
* {RDF::Literal::UnsignedInt}
|
39
|
+
* {RDF::Literal::UnsignedShort}
|
40
|
+
* {RDF::Literal::UnsignedByte}
|
41
|
+
|
42
|
+
## Dependencies
|
43
|
+
|
44
|
+
* [Ruby](http://ruby-lang.org/) (>= 1.8.7) or (>= 1.8.1 with [Backports][])
|
45
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.4)
|
46
|
+
|
47
|
+
## Installation
|
48
|
+
|
49
|
+
The recommended installation method is via [RubyGems](http://rubygems.org/).
|
50
|
+
To install the latest official release of the `RDF::XSD` gem, do:
|
51
|
+
|
52
|
+
% [sudo] gem install rdf-xsd
|
53
|
+
|
54
|
+
## Mailing List
|
55
|
+
|
56
|
+
* <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
|
57
|
+
|
58
|
+
## Author
|
59
|
+
|
60
|
+
* [Gregg Kellogg](http://github.com/gkellogg) - <http://kellogg-assoc.com/>
|
61
|
+
|
62
|
+
Contributing
|
63
|
+
------------
|
64
|
+
|
65
|
+
* Do your best to adhere to the existing coding conventions and idioms.
|
66
|
+
* Don't use hard tabs, and don't leave trailing whitespace on any line.
|
67
|
+
* Do document every method you add using [YARD][] annotations. Read the
|
68
|
+
[tutorial][YARD-GS] or just look at the existing code for examples.
|
69
|
+
* Don't touch the `.gemspec`, `VERSION` or `AUTHORS` files. If you need to
|
70
|
+
change them, do so on your private branch only.
|
71
|
+
* Do feel free to add yourself to the `CREDITS` file and the corresponding
|
72
|
+
list in the the `README`. Alphabetical order applies.
|
73
|
+
* Do note that in order for us to merge any non-trivial changes (as a rule
|
74
|
+
of thumb, additions larger than about 15 lines of code), we need an
|
75
|
+
explicit [public domain dedication][PDD] on record from you.
|
76
|
+
|
77
|
+
License
|
78
|
+
-------
|
79
|
+
|
80
|
+
This is free and unencumbered public domain software. For more information,
|
81
|
+
see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
82
|
+
|
83
|
+
Portions of tests are derived from [W3C DAWG tests](http://www.w3.org/2001/sw/DataAccess/tests/) and have [other licensing terms](http://www.w3.org/2001/sw/DataAccess/tests/data-r2/LICENSE).
|
84
|
+
|
85
|
+
[Ruby]: http://ruby-lang.org/
|
86
|
+
[RDF]: http://www.w3.org/RDF/
|
87
|
+
[YARD]: http://yardoc.org/
|
88
|
+
[YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
|
89
|
+
[PDD]: http://lists.w3.org/Archives/Public/public-rdf-ruby/2010May/0013.html
|
90
|
+
[Backports]: http://rubygems.org/gems/backports
|
91
|
+
[XSD Datatypes]: http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#built-in-datatypes
|
data/UNLICENSE
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
This is free and unencumbered software released into the public domain.
|
2
|
+
|
3
|
+
Anyone is free to copy, modify, publish, use, compile, sell, or
|
4
|
+
distribute this software, either in source code form or as a compiled
|
5
|
+
binary, for any purpose, commercial or non-commercial, and by any
|
6
|
+
means.
|
7
|
+
|
8
|
+
In jurisdictions that recognize copyright laws, the author or authors
|
9
|
+
of this software dedicate any and all copyright interest in the
|
10
|
+
software to the public domain. We make this dedication for the benefit
|
11
|
+
of the public at large and to the detriment of our heirs and
|
12
|
+
successors. We intend this dedication to be an overt act of
|
13
|
+
relinquishment in perpetuity of all present and future rights to this
|
14
|
+
software under copyright law.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
20
|
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
21
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
For more information, please refer to <http://unlicense.org/>
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.3.3
|
data/lib/rdf/xsd.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..')))
|
2
|
+
require 'rdf'
|
3
|
+
|
4
|
+
##
|
5
|
+
# Plugin for RDF.rb for extended XSD datatypes.
|
6
|
+
#
|
7
|
+
# @example Requiring the `RDF::XSD` module
|
8
|
+
# require 'rdf/xsd'
|
9
|
+
#
|
10
|
+
# @see http://rdf.rubyforge.org/
|
11
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#built-in-datatypes
|
12
|
+
#
|
13
|
+
# @author [Gregg Kellogg](http://greggkellogg.net/)
|
14
|
+
module RDFa
|
15
|
+
autoload :VERSION, 'rdf/xsd/version'
|
16
|
+
end
|
17
|
+
|
18
|
+
Dir.glob(File.join(File.expand_path(File.dirname(__FILE__)), 'xsd', '*.rb')) {|f| require f}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
module RDF; class Literal
|
4
|
+
##
|
5
|
+
# More specific sub-types of double
|
6
|
+
# Derived types
|
7
|
+
# @see http://www.w3.org/TR/xpath-functions/#datatypes
|
8
|
+
|
9
|
+
##
|
10
|
+
# hexBinary represents arbitrary hex-encoded binary data. The value space of hexBinary is the set of finite-length
|
11
|
+
# sequences of binary octets.
|
12
|
+
#
|
13
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#hexBinary
|
14
|
+
class HexBinary < RDF::Literal
|
15
|
+
DATATYPE = XSD.hexBinary
|
16
|
+
GRAMMAR = %r(\A[0-9a-fA-F]+\Z)
|
17
|
+
|
18
|
+
##
|
19
|
+
# Converts this literal into its canonical lexical representation.
|
20
|
+
#
|
21
|
+
# @return [RDF::Literal] `self`
|
22
|
+
def canonicalize!
|
23
|
+
@string = @object.downcase
|
24
|
+
self
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# base64Binary represents Base64-encoded arbitrary binary data. The ·value space· of base64Binary is the set of
|
30
|
+
# finite-length sequences of binary octets. For base64Binary data the entire binary stream is encoded using the Base64
|
31
|
+
# Alphabet in [RFC 2045].
|
32
|
+
#
|
33
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#hexBinary
|
34
|
+
class Base64Binary < RDF::Literal
|
35
|
+
DATATYPE = XSD.base64Binary
|
36
|
+
|
37
|
+
##
|
38
|
+
# @param [String, Object] value
|
39
|
+
# If given a string, it will decode it as an object value.
|
40
|
+
# Otherwise, it will take the value as the object and encode to retrieve a value
|
41
|
+
# @option options [String] :lexical (nil)
|
42
|
+
def initialize(value, options = {})
|
43
|
+
super
|
44
|
+
@object = value.is_a?(String) ? ::Base64.decode64(value) : value
|
45
|
+
canonicalize! unless value.is_a?(String)
|
46
|
+
end
|
47
|
+
|
48
|
+
##
|
49
|
+
# Converts this literal into its canonical lexical representation.
|
50
|
+
#
|
51
|
+
# @return [RDF::Literal] `self`
|
52
|
+
# @see http://www.w3.org/TR/xmlschema-2/#dateTime
|
53
|
+
def canonicalize!
|
54
|
+
@string = ::Base64.encode64(@object)
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
##
|
59
|
+
# Returns `true` if the value adheres to the defined grammar of the
|
60
|
+
# datatype.
|
61
|
+
#
|
62
|
+
# @return [Boolean]
|
63
|
+
def valid?
|
64
|
+
Base64.strict_decode64(value.gsub(/\s+/m, ''))
|
65
|
+
true
|
66
|
+
rescue ArgumentError
|
67
|
+
STDERR.puts($!.inspect + ": #{value.inspect}")
|
68
|
+
false
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end; end #RDF::Literal
|
data/lib/rdf/xsd/date.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'rdf'
|
2
|
+
|
3
|
+
module RDF; class Literal
|
4
|
+
##
|
5
|
+
# gYearMonth represents a specific gregorian month in a specific gregorian year. The value space of gYearMonth is
|
6
|
+
# the set of Gregorian calendar months as defined in § 5.2.1 of [ISO 8601]. Specifically, it is a set of one-month
|
7
|
+
# long, non-periodic instances e.g. 1999-10 to represent the whole month of 1999-10, independent of how many days this
|
8
|
+
# month has.
|
9
|
+
#
|
10
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#gYearMonth
|
11
|
+
class YearMonth < RDF::Literal::Date
|
12
|
+
DATATYPE = XSD.gYearMonth
|
13
|
+
GRAMMAR = %r(\A-?\d{4,}-\d{2}((?:[\+\-]\d{2}:\d{2})|UTC|Z)?\Z).freeze
|
14
|
+
FORMAT = '%Y-%m%Z'.freeze
|
15
|
+
end
|
16
|
+
|
17
|
+
##
|
18
|
+
# gYear represents a gregorian calendar year. The value space of gYear is the set of Gregorian calendar years as
|
19
|
+
# defined in § 5.2.1 of [ISO 8601]. Specifically, it is a set of one-year long, non-periodic instances e.g. lexical
|
20
|
+
# 1999 to represent the whole year 1999, independent of how many months and days this year has.
|
21
|
+
#
|
22
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#gYear
|
23
|
+
class Year < RDF::Literal::Date
|
24
|
+
DATATYPE = XSD.gYear
|
25
|
+
GRAMMAR = %r(\A-?\d{4,}(?:(?:[\+\-]\d{2}:\d{2})|UTC|Z)?\Z).freeze
|
26
|
+
FORMAT = '%Y%Z'.freeze
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# gMonthDay is a gregorian date that recurs, specifically a day of the year such as the third of May. Arbitrary
|
31
|
+
# recurring dates are not supported by this datatype. The value space of gMonthDay is the set of calendar dates,
|
32
|
+
# as defined in § 3 of [ISO 8601]. Specifically, it is a set of one-day long, annually periodic instances.
|
33
|
+
#
|
34
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#gMonthDay
|
35
|
+
class MonthDay < RDF::Literal::Date
|
36
|
+
DATATYPE = XSD.gMonthDay
|
37
|
+
GRAMMAR = %r(\A\d{2}-\d{2}(?:(?:[\+\-]\d{2}:\d{2})|UTC|Z)?\Z).freeze
|
38
|
+
FORMAT = '%m-%d%Z'.freeze
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# gDay is a gregorian day that recurs, specifically a day of the month such as the 5th of the month. Arbitrary
|
43
|
+
# recurring days are not supported by this datatype. The value space of gDay is the space of a set of calendar
|
44
|
+
# dates as defined in § 3 of [ISO 8601]. Specifically, it is a set of one-day long, monthly periodic instances.
|
45
|
+
#
|
46
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#gDay
|
47
|
+
class Day < RDF::Literal::Date
|
48
|
+
DATATYPE = XSD.gDay
|
49
|
+
GRAMMAR = %r(\A\d{2}(?:(?:[\+\-]\d{2}:\d{2})|UTC|Z)?\Z).freeze
|
50
|
+
FORMAT = '%d%Z'.freeze
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# gMonth is a gregorian month that recurs every year. The value space of gMonth is the space of a set of calendar
|
55
|
+
# months as defined in § 3 of [ISO 8601]. Specifically, it is a set of one-month long, yearly periodic instances.
|
56
|
+
#
|
57
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#gMonth
|
58
|
+
class Month < RDF::Literal::Date
|
59
|
+
DATATYPE = XSD.gMonth
|
60
|
+
GRAMMAR = %r(\A\d{2}(?:(?:[\+\-]\d{2}:\d{2})|UTC|Z)?\Z).freeze
|
61
|
+
FORMAT = '%m%Z'.freeze
|
62
|
+
end
|
63
|
+
end; end #RDF::Literal
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module RDF; class Literal
|
2
|
+
# Note that in XML Schema, Float is not really derived from Double,
|
3
|
+
# but implementations are identical in Ruby
|
4
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#float
|
5
|
+
class Float < Double
|
6
|
+
DATATYPE = XSD.float
|
7
|
+
end
|
8
|
+
end; end #RDF::Literal
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
module RDF; class Literal
|
5
|
+
##
|
6
|
+
# A duration literal.
|
7
|
+
#
|
8
|
+
# @see http://www.w3.org/TR/xmlschema-2/#duration
|
9
|
+
# @since 0.2.1
|
10
|
+
class Duration < Literal
|
11
|
+
DATATYPE = XSD.duration
|
12
|
+
GRAMMAR = %r(\A(-?)P(\d+Y)?(\d+M)?(\d+D)?T?(\d+H)?(\d+M)?([\d\.]+S)?\Z).freeze
|
13
|
+
|
14
|
+
##
|
15
|
+
# * Given a Numeric, assumes that it is milliseconds
|
16
|
+
# * Given a String, parse as xsd:duration
|
17
|
+
# * Hash form is used for internal representation
|
18
|
+
# @param [Duration, Hash, Numeric, #to_s] value
|
19
|
+
# @option options [String] :lexical (nil)
|
20
|
+
def initialize(value, options = {})
|
21
|
+
super
|
22
|
+
@object = case value
|
23
|
+
when Hash
|
24
|
+
value = value.dup
|
25
|
+
value[:yr] ||= value[:years]
|
26
|
+
value[:mo] ||= value[:months]
|
27
|
+
value[:da] ||= value[:days]
|
28
|
+
value[:hr] ||= value[:hours]
|
29
|
+
value[:mi] ||= value[:minutes]
|
30
|
+
value[:se] ||= value[:seconds]
|
31
|
+
|
32
|
+
value
|
33
|
+
when Duration, Numeric
|
34
|
+
{:se => value.to_f}
|
35
|
+
else
|
36
|
+
parse(value.to_s) rescue { }
|
37
|
+
end
|
38
|
+
@object[:si] ||= 1
|
39
|
+
end
|
40
|
+
|
41
|
+
##
|
42
|
+
# Converts this literal into its canonical lexical representation.
|
43
|
+
#
|
44
|
+
# Also normalizes elements
|
45
|
+
#
|
46
|
+
# @return [RDF::Literal] `self`
|
47
|
+
# @see http://www.w3.org/TR/xmlschema-2/#dateTime
|
48
|
+
def canonicalize!
|
49
|
+
@string = @humanize = nil
|
50
|
+
if @object[:se].to_i > 60
|
51
|
+
m_r = (@object[:se].to_i / 60) - 1
|
52
|
+
@object[:se] -= m_r * 60
|
53
|
+
@object[:mi] = @object[:mi].to_i + m_r
|
54
|
+
end
|
55
|
+
if @object[:mi].to_i > 60
|
56
|
+
h_r = (@object[:mi].to_i / 60) - 1
|
57
|
+
@object[:mi] -= h_r * 60
|
58
|
+
@object[:hr] = @object[:hr].to_i + h_r
|
59
|
+
end
|
60
|
+
if @object[:hr].to_i > 24
|
61
|
+
d_r = (@object[:hr].to_i / 24) - 1
|
62
|
+
@object[:hr] -= d_r * 24
|
63
|
+
@object[:da] = @object[:da].to_i + d_r
|
64
|
+
end
|
65
|
+
if @object[:da].to_i > 30
|
66
|
+
m_r = (@object[:da].to_i / 30) - 1
|
67
|
+
@object[:da] -= m_r * 30
|
68
|
+
@object[:mo] = @object[:mo].to_i + m_r
|
69
|
+
end
|
70
|
+
if @object[:mo].to_i > 12
|
71
|
+
y_r = (@object[:mo].to_i / 12) - 1
|
72
|
+
@object[:mo] -= y_r * 12
|
73
|
+
@object[:yr] = @object[:yr].to_i + y_r
|
74
|
+
end
|
75
|
+
@object.to_s # site-effect
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
##
|
80
|
+
# Returns `true` if the value adheres to the defined grammar of the
|
81
|
+
# datatype.
|
82
|
+
#
|
83
|
+
# Special case for date and dateTime, for which '0000' is not a valid year
|
84
|
+
#
|
85
|
+
# @return [Boolean]
|
86
|
+
# @since 0.2.1
|
87
|
+
def valid?
|
88
|
+
!!(value =~ GRAMMAR)
|
89
|
+
end
|
90
|
+
|
91
|
+
##
|
92
|
+
# Returns the value as a string.
|
93
|
+
#
|
94
|
+
# @return [String]
|
95
|
+
def to_s
|
96
|
+
@string ||= begin
|
97
|
+
str = @object[:si] < 0 ? "-P" : "P"
|
98
|
+
str << "%dY" % @object[:yr].to_i if @object[:yr]
|
99
|
+
str << "%dM" % @object[:mo].to_i if @object[:mo]
|
100
|
+
str << "%dD" % @object[:da].to_i if @object[:da]
|
101
|
+
str << "T" if @object[:hr] || @object[:mi] || @object[:se]
|
102
|
+
str << "%dH" % @object[:hr].to_i if @object[:hr]
|
103
|
+
str << "%dM" % @object[:mi].to_i if @object[:mi]
|
104
|
+
str << "#{sec_str}S" if @object[:se]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def plural(v, str)
|
109
|
+
"#{v} #{str}#{v == 1 ? '' : 's'}" if v
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# Returns a human-readable value for the interval
|
114
|
+
def humanize(lang = :en)
|
115
|
+
@humanize ||= {}
|
116
|
+
@humanize[lang] ||= begin
|
117
|
+
# Just english, for now
|
118
|
+
ar = []
|
119
|
+
ar << plural(@object[:yr], "year")
|
120
|
+
ar << plural(@object[:mo], "month")
|
121
|
+
ar << plural(@object[:da], "day")
|
122
|
+
ar << plural(@object[:hr], "hour")
|
123
|
+
ar << plural(@object[:mi], "minute")
|
124
|
+
ar << plural(sec_str, "second") if @object[:se]
|
125
|
+
ar = ar.compact
|
126
|
+
last = ar.pop
|
127
|
+
first = ar.join(" ")
|
128
|
+
res = first.empty? ? last : "#{first} and #{last}"
|
129
|
+
@object[:si] < 0 ? "#{res} ago" : res
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
##
|
134
|
+
# Equal compares as DateTime objects
|
135
|
+
def ==(other)
|
136
|
+
# If lexically invalid, use regular literal testing
|
137
|
+
return super unless self.valid?
|
138
|
+
|
139
|
+
case other
|
140
|
+
when Duration
|
141
|
+
return super unless other.valid?
|
142
|
+
self.to_f == something.to_f
|
143
|
+
when String
|
144
|
+
self.to_s(:xml) == something
|
145
|
+
when Numeric
|
146
|
+
self.to_f == something
|
147
|
+
when Literal::DateTime, Literal::Time, Literal::Date
|
148
|
+
false
|
149
|
+
else
|
150
|
+
super
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# @return [Float]
|
155
|
+
def to_f
|
156
|
+
( @object[:yr].to_i * 365 * 24 * 3600 +
|
157
|
+
@object[:mo].to_i * 30 * 24 * 3600 +
|
158
|
+
@object[:da].to_i * 24 * 3600 +
|
159
|
+
@object[:hr].to_i * 3600 +
|
160
|
+
@object[:mi].to_i * 60 +
|
161
|
+
@object[:se].to_f
|
162
|
+
) * @object[:si]
|
163
|
+
end
|
164
|
+
|
165
|
+
# @return [Integer]
|
166
|
+
def to_i; Integer(self.to_f); end
|
167
|
+
|
168
|
+
private
|
169
|
+
# Reverse convert from XSD version of duration
|
170
|
+
# XSD allows -P1111Y22M33DT44H55M66.666S with any combination in regular order
|
171
|
+
# We assume 1M == 30D, but are out of spec in this regard
|
172
|
+
# We only output up to hours
|
173
|
+
#
|
174
|
+
# @param [String] value XSD formatted duration
|
175
|
+
# @return [Duration]
|
176
|
+
def parse(value)
|
177
|
+
hash = {}
|
178
|
+
if value.to_s.match(GRAMMAR)
|
179
|
+
hash[:si] = $1 == "-" ? -1 : 1
|
180
|
+
hash[:yr] = $2.to_i if $2
|
181
|
+
hash[:mo] = $3.to_i if $3
|
182
|
+
hash[:da] = $4.to_i if $4
|
183
|
+
hash[:hr] = $5.to_i if $5
|
184
|
+
hash[:mi] = $6.to_i if $6
|
185
|
+
hash[:se] = $7.to_f if $7
|
186
|
+
end
|
187
|
+
hash
|
188
|
+
end
|
189
|
+
|
190
|
+
def sec_str
|
191
|
+
usec = (@object[:se] * 1000).to_i % 1000
|
192
|
+
usec > 0 ? ("%2.3f" % @object[:se]).sub(/0*\Z/, '') : @object[:se].to_i.to_s
|
193
|
+
end
|
194
|
+
end # Duration
|
195
|
+
end; end # RDF::Literal
|
@@ -0,0 +1,191 @@
|
|
1
|
+
module RDF; class Literal
|
2
|
+
##
|
3
|
+
# nonPositiveInteger is derived from integer by setting the value of maxInclusive to be 0. This results in
|
4
|
+
# the standard mathematical concept of the non-positive integers. The value space of nonPositiveInteger is the
|
5
|
+
# infinite set {...,-2,-1,0}. The base type of nonPositiveInteger is integer.
|
6
|
+
#
|
7
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#nonPositiveInteger
|
8
|
+
class NonPositiveInteger < Integer
|
9
|
+
DATATYPE = RDF::XSD.nonPositiveInteger
|
10
|
+
GRAMMAR = /^(?:[\+\-]?0)|(?:-\d+)$/.freeze
|
11
|
+
|
12
|
+
##
|
13
|
+
# Returns `self` negated.
|
14
|
+
#
|
15
|
+
# @return [RDF::Literal::Numeric]
|
16
|
+
# @since 0.2.3
|
17
|
+
def -@
|
18
|
+
if object != 0
|
19
|
+
# XXX Raise error?
|
20
|
+
end
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
def valid?
|
25
|
+
super && @object <= 0
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# negativeInteger is derived from nonPositiveInteger by setting the value of maxInclusive to be -1. This
|
31
|
+
# results in the standard mathematical concept of the negative integers. The value space of negativeInteger is
|
32
|
+
# the infinite set {...,-2,-1}. The base type of negativeInteger is nonPositiveInteger.
|
33
|
+
#
|
34
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#negativeInteger
|
35
|
+
class NegativeInteger < NonPositiveInteger
|
36
|
+
GRAMMAR = /^\-\d+$/.freeze
|
37
|
+
DATATYPE = RDF::XSD.negativeInteger
|
38
|
+
|
39
|
+
##
|
40
|
+
# Returns `self` negated.
|
41
|
+
#
|
42
|
+
# @return [RDF::Literal::Numeric]
|
43
|
+
# @since 0.2.3
|
44
|
+
def -@
|
45
|
+
if object != 0
|
46
|
+
# XXX Raise error?
|
47
|
+
end
|
48
|
+
self.class.new(-self.object)
|
49
|
+
end
|
50
|
+
|
51
|
+
def valid?
|
52
|
+
super && @object < 0
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# long is derived from integer by setting the value of maxInclusive to be 9223372036854775807
|
58
|
+
# and minInclusive to be -9223372036854775808.
|
59
|
+
#
|
60
|
+
# The base type of long is integer.
|
61
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#long
|
62
|
+
class Long < Integer
|
63
|
+
DATATYPE = RDF::XSD.long
|
64
|
+
|
65
|
+
def valid?
|
66
|
+
super && @object >= -9223372036854775808 && @object <= 9223372036854775807
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# int is derived from long by setting the value of maxInclusive to be 2147483647 and minInclusive to be
|
72
|
+
# -2147483648. The base type of int is long.
|
73
|
+
#
|
74
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#int
|
75
|
+
class Int < Long
|
76
|
+
DATATYPE = RDF::XSD.int
|
77
|
+
|
78
|
+
def valid?
|
79
|
+
super && @object >= -2147483648 && @object <= 2147483647
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
##
|
84
|
+
# short is derived from int by setting the value of maxInclusive to be 32767 and minInclusive to be
|
85
|
+
# -32768. The base type of short is int.
|
86
|
+
#
|
87
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#short
|
88
|
+
class Short < Int
|
89
|
+
DATATYPE = RDF::XSD.short
|
90
|
+
|
91
|
+
def valid?
|
92
|
+
super && @object >= -32768 && @object <= 32767
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
##
|
97
|
+
# byte is derived from short by setting the value of maxInclusive to be 127 and minInclusive to be -128.
|
98
|
+
# The base type of byte is short.
|
99
|
+
#
|
100
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#byte
|
101
|
+
class Byte < Short
|
102
|
+
DATATYPE = RDF::XSD.byte
|
103
|
+
|
104
|
+
def valid?
|
105
|
+
super && @object >= -128 && @object <= 127
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
##
|
110
|
+
# nonNegativeInteger is derived from integer by setting the value of minInclusive to be 0. This results in
|
111
|
+
# the standard mathematical concept of the non-negative integers. The value space of nonNegativeInteger is the
|
112
|
+
# infinite set {0,1,2,...}. The base type of nonNegativeInteger is integer.
|
113
|
+
#
|
114
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#nonNegativeInteger
|
115
|
+
class NonNegativeInteger < Integer
|
116
|
+
GRAMMAR = /^(?:(?:[\+\-]?0)|(?:\+?\d+))$/.freeze
|
117
|
+
DATATYPE = RDF::XSD.nonNegativeInteger
|
118
|
+
|
119
|
+
def valid?
|
120
|
+
super && @object >= 0
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
##
|
125
|
+
# positiveInteger is derived from nonNegativeInteger by setting the value of minInclusive to be 1. This
|
126
|
+
# results in the standard mathematical concept of the positive integer numbers. The value space of
|
127
|
+
# positiveInteger is the infinite set {1,2,...}. The base type of positiveInteger is nonNegativeInteger.
|
128
|
+
#
|
129
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#positiveInteger
|
130
|
+
class PositiveInteger < NonNegativeInteger
|
131
|
+
GRAMMAR = /^\+?\d+$/.freeze
|
132
|
+
DATATYPE = RDF::XSD.positiveInteger
|
133
|
+
|
134
|
+
def valid?
|
135
|
+
super && @object > 0
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
##
|
140
|
+
# unsignedLong is derived from nonNegativeInteger by setting the value of maxInclusive to be
|
141
|
+
# 18446744073709551615. The base type of unsignedLong is nonNegativeInteger.
|
142
|
+
#
|
143
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#unsignedLong
|
144
|
+
class UnsignedLong < NonNegativeInteger
|
145
|
+
GRAMMAR = /^\d+$/.freeze
|
146
|
+
DATATYPE = RDF::XSD.unsignedLong
|
147
|
+
|
148
|
+
def valid?
|
149
|
+
super && @object >= 0 && @object <= 18446744073709551615
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
##
|
154
|
+
# unsignedInt is derived from unsignedLong by setting the value of maxInclusive to be 4294967295. The base
|
155
|
+
# type of unsignedInt is unsignedLong.
|
156
|
+
#
|
157
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#unsignedInt
|
158
|
+
class UnsignedInt < UnsignedLong
|
159
|
+
DATATYPE = RDF::XSD.unsignedInt
|
160
|
+
|
161
|
+
def valid?
|
162
|
+
super && @object >= 0 && @object <= 4294967295
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
##
|
167
|
+
# unsignedShort is derived from unsignedInt by setting the value of maxInclusive to be 65535. The base
|
168
|
+
# type of unsignedShort is unsignedInt.
|
169
|
+
#
|
170
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#unsignedShort
|
171
|
+
class UnsignedShort < UnsignedInt
|
172
|
+
DATATYPE = RDF::XSD.unsignedShort
|
173
|
+
|
174
|
+
def valid?
|
175
|
+
super && @object >= 0 && @object <= 65535
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
##
|
180
|
+
# unsignedByte is derived from unsignedShort by setting the value of maxInclusive to be 255. The base
|
181
|
+
# type of unsignedByte is unsignedShort.
|
182
|
+
#
|
183
|
+
# @see http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#unsignedByte
|
184
|
+
class UnsignedByte < UnsignedShort
|
185
|
+
DATATYPE = RDF::XSD.unsignedByte
|
186
|
+
|
187
|
+
def valid?
|
188
|
+
super && @object >= 0 && @object <= 255
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end; end #RDF::Literal
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RDF::XSD::VERSION
|
2
|
+
VERSION_FILE = File.join(File.expand_path(File.dirname(__FILE__)), "..", "..", "..", "VERSION")
|
3
|
+
MAJOR, MINOR, TINY, EXTRA = File.read(VERSION_FILE).chop.split(".")
|
4
|
+
|
5
|
+
STRING = [MAJOR, MINOR, TINY, EXTRA].compact.join('.')
|
6
|
+
|
7
|
+
##
|
8
|
+
# @return [String]
|
9
|
+
def self.to_s() STRING end
|
10
|
+
|
11
|
+
##
|
12
|
+
# @return [String]
|
13
|
+
def self.to_str() STRING end
|
14
|
+
|
15
|
+
##
|
16
|
+
# @return [Array(Integer, Integer, Integer)]
|
17
|
+
def self.to_a() STRING.split(".") end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rdf-xsd
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.3
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Gregg
|
9
|
+
- Kellogg
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2011-09-15 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rdf
|
17
|
+
requirement: &2165552680 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.3.3
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2165552680
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rspec
|
28
|
+
requirement: &2165552100 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.5.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *2165552100
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rdf-spec
|
39
|
+
requirement: &2165551520 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ! '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.3.2
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2165551520
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: yard
|
50
|
+
requirement: &2165551000 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 0.6.0
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2165551000
|
59
|
+
description: Adds RDF::Literal subclasses for extended XSD datatypes
|
60
|
+
email: public-rdf-ruby@w3.org
|
61
|
+
executables: []
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- AUTHORS
|
66
|
+
- README.markdown
|
67
|
+
- UNLICENSE
|
68
|
+
- VERSION
|
69
|
+
- lib/rdf/xsd/binary.rb
|
70
|
+
- lib/rdf/xsd/date.rb
|
71
|
+
- lib/rdf/xsd/double.rb
|
72
|
+
- lib/rdf/xsd/duration.rb
|
73
|
+
- lib/rdf/xsd/integer.rb
|
74
|
+
- lib/rdf/xsd/version.rb
|
75
|
+
- lib/rdf/xsd.rb
|
76
|
+
homepage: http://github.com/gkellogg/rdf-xsd
|
77
|
+
licenses:
|
78
|
+
- Public Domain
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 1.8.1
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
requirements: []
|
96
|
+
rubyforge_project: rdf-xsd
|
97
|
+
rubygems_version: 1.8.6
|
98
|
+
signing_key:
|
99
|
+
specification_version: 3
|
100
|
+
summary: Extended XSD Datatypes for RDF.rb
|
101
|
+
test_files: []
|