spira 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +1 -0
- data/CHANGES.md +10 -1
- data/VERSION +1 -1
- data/lib/spira/resource/dsl.rb +54 -8
- data/lib/spira/resource/instance_methods.rb +2 -2
- data/lib/spira/types/decimal.rb +3 -3
- data/lib/spira/version.rb +1 -1
- metadata +8 -8
data/AUTHORS
CHANGED
data/CHANGES.md
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
# Changelog for Spira <http://github.com/datagraph/spira>
|
2
2
|
|
3
|
-
##
|
3
|
+
## 0.0.5
|
4
|
+
* Relations can now find related classes in modules, either by absolute
|
5
|
+
reference, or by class name if they are in the same namespace.
|
6
|
+
* Fix a bug with default_vocabulary in which a '/' was appended to
|
7
|
+
vocabularies ending in '#'
|
8
|
+
* Fix a bug with the Decimal type where round-tripping was incorrect
|
9
|
+
* Fix some error messages that were missing closing parentheses
|
10
|
+
|
11
|
+
## 0.0.4
|
12
|
+
* Added a Decimal type
|
4
13
|
* Small updates for RDF.rb 0.2.0 compatibility
|
5
14
|
* Add a Spira::Base class that can be inherited from for users who prefer to
|
6
15
|
inherit rather than include.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
data/lib/spira/resource/dsl.rb
CHANGED
@@ -139,13 +139,7 @@ module Spira
|
|
139
139
|
when type.is_a?(Class) && type.ancestors.include?(Spira::Type)
|
140
140
|
type.unserialize(statement.object)
|
141
141
|
when type.is_a?(Symbol) || type.is_a?(String)
|
142
|
-
klass =
|
143
|
-
Kernel.const_get(type.to_s)
|
144
|
-
rescue NameError
|
145
|
-
unless klass.is_a?(Class) && klass.ancestors.include?(Spira::Resource)
|
146
|
-
raise TypeError, "#{type} is not a Spira Resource (referenced as #{type} by #{self}"
|
147
|
-
end
|
148
|
-
end
|
142
|
+
klass = classize_resource(type)
|
149
143
|
promise { klass.for(statement.object) }
|
150
144
|
else
|
151
145
|
raise TypeError, "Unable to unserialize #{statement.object} as #{type}"
|
@@ -159,7 +153,13 @@ module Spira
|
|
159
153
|
when type.is_a?(Class) && type.ancestors.include?(Spira::Type)
|
160
154
|
type.serialize(value)
|
161
155
|
when value && value.class.ancestors.include?(Spira::Resource)
|
156
|
+
klass = classize_resource(type)
|
157
|
+
unless klass.ancestors.include?(value.class)
|
158
|
+
raise TypeError, "#{value} is an instance of #{value.class}, expected #{klass}"
|
159
|
+
end
|
162
160
|
value.subject
|
161
|
+
when type.is_a?(Symbol) || type.is_a?(String)
|
162
|
+
klass = classize_resource(type)
|
163
163
|
else
|
164
164
|
raise TypeError, "Unable to serialize #{value} as #{type}"
|
165
165
|
end
|
@@ -167,6 +167,52 @@ module Spira
|
|
167
167
|
|
168
168
|
private
|
169
169
|
|
170
|
+
# Return the appropriate class object for a string or symbol
|
171
|
+
# representation. Throws errors correctly if the given class cannot be
|
172
|
+
# located, or if it is not a Spira::Resource
|
173
|
+
#
|
174
|
+
def classize_resource(type)
|
175
|
+
klass = nil
|
176
|
+
begin
|
177
|
+
klass = qualified_const_get(type.to_s)
|
178
|
+
rescue NameError
|
179
|
+
raise NameError, "Could not find relation class #{type} (referenced as #{type} by #{self})"
|
180
|
+
klass.is_a?(Class) && klass.ancestors.include?(Spira::Resource)
|
181
|
+
end
|
182
|
+
unless klass.is_a?(Class) && klass.ancestors.include?(Spira::Resource)
|
183
|
+
raise TypeError, "#{type} is not a Spira Resource (referenced as #{type} by #{self})"
|
184
|
+
end
|
185
|
+
klass
|
186
|
+
end
|
187
|
+
|
188
|
+
# Resolve a constant from a string, relative to this class' namespace, if
|
189
|
+
# available, and from root, otherwise.
|
190
|
+
#
|
191
|
+
# FIXME: this is not really 'qualified', but it's one of those
|
192
|
+
# impossible-to-name functions. Open to suggestions.
|
193
|
+
#
|
194
|
+
# @author njh
|
195
|
+
# @private
|
196
|
+
def qualified_const_get(str)
|
197
|
+
path = str.to_s.split('::')
|
198
|
+
from_root = path[0].empty?
|
199
|
+
if from_root
|
200
|
+
from_root = []
|
201
|
+
path = path[1..-1]
|
202
|
+
else
|
203
|
+
start_ns = ((Class === self)||(Module === self)) ? self : self.class
|
204
|
+
from_root = start_ns.to_s.split('::')
|
205
|
+
end
|
206
|
+
until from_root.empty?
|
207
|
+
begin
|
208
|
+
return (from_root+path).inject(Object) { |ns,name| ns.const_get(name) }
|
209
|
+
rescue NameError
|
210
|
+
from_root.delete_at(-1)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
path.inject(Object) { |ns,name| ns.const_get(name) }
|
214
|
+
end
|
215
|
+
|
170
216
|
##
|
171
217
|
# Add getters and setters for a property or list.
|
172
218
|
# @private
|
@@ -177,7 +223,7 @@ module Spira
|
|
177
223
|
when @default_vocabulary.nil?
|
178
224
|
raise TypeError, "A :predicate option is required for types without a default vocabulary"
|
179
225
|
else @default_vocabulary
|
180
|
-
separator = @default_vocabulary.to_s[-1,1]
|
226
|
+
separator = @default_vocabulary.to_s[-1,1] =~ /(\/|#)/ ? '' : '/'
|
181
227
|
RDF::URI.new(@default_vocabulary.to_s + separator + name.to_s)
|
182
228
|
end
|
183
229
|
type = case
|
@@ -301,7 +301,7 @@ module Spira
|
|
301
301
|
# @return [RDF::URI]
|
302
302
|
# @raise [NoMethodError]
|
303
303
|
def to_uri
|
304
|
-
uri || (raise NoMethodError, "No such method: :to_uri (this instance's subject is not a URI")
|
304
|
+
uri || (raise NoMethodError, "No such method: :to_uri (this instance's subject is not a URI)")
|
305
305
|
end
|
306
306
|
|
307
307
|
##
|
@@ -319,7 +319,7 @@ module Spira
|
|
319
319
|
# @return [RDF::Node]
|
320
320
|
# @raise [NoMethodError]
|
321
321
|
def to_node
|
322
|
-
@subject.node? ? @subject : (raise NoMethodError, "No such method: :to_uri (this instance's subject is not a URI")
|
322
|
+
@subject.node? ? @subject : (raise NoMethodError, "No such method: :to_uri (this instance's subject is not a URI)")
|
323
323
|
end
|
324
324
|
|
325
325
|
##
|
data/lib/spira/types/decimal.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'bigdecimal'
|
2
|
+
|
1
3
|
module Spira::Types
|
2
4
|
|
3
5
|
##
|
@@ -13,14 +15,12 @@ module Spira::Types
|
|
13
15
|
include Spira::Type
|
14
16
|
|
15
17
|
def self.unserialize(value)
|
16
|
-
require 'bigdecimal' unless defined?(BigDecimal)
|
17
18
|
object = value.object
|
18
19
|
object.is_a?(BigDecimal) ? object : BigDecimal.new(object.to_s)
|
19
20
|
end
|
20
21
|
|
21
22
|
def self.serialize(value)
|
22
|
-
|
23
|
-
RDF::Literal.new(value, :datatype => XSD.decimal)
|
23
|
+
RDF::Literal.new(value.is_a?(BigDecimal) ? value.to_s('F') : value.to_s, :datatype => XSD.decimal)
|
24
24
|
end
|
25
25
|
|
26
26
|
register_alias XSD.decimal
|
data/lib/spira/version.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ben Lavender
|
@@ -15,7 +15,7 @@ bindir:
|
|
15
15
|
- bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-28 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -83,9 +83,9 @@ dependencies:
|
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
segments:
|
85
85
|
- 0
|
86
|
-
- 1
|
87
86
|
- 2
|
88
|
-
|
87
|
+
- 0
|
88
|
+
version: 0.2.0
|
89
89
|
type: :runtime
|
90
90
|
version_requirements: *id005
|
91
91
|
- !ruby/object:Gem::Dependency
|
@@ -97,9 +97,9 @@ dependencies:
|
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
segments:
|
99
99
|
- 0
|
100
|
-
-
|
101
|
-
-
|
102
|
-
version: 0.
|
100
|
+
- 2
|
101
|
+
- 0
|
102
|
+
version: 0.2.0
|
103
103
|
type: :runtime
|
104
104
|
version_requirements: *id006
|
105
105
|
description: Spira is a framework for using the information in RDF.rb repositories as model objects.
|