spira 0.0.4 → 0.0.5
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/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.
|