spira 0.0.11 → 0.0.12

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/CHANGES.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog for Spira <http://github.com/datagraph/spira>
2
2
 
3
+ ## 0.0.12
4
+ * Implemented #validate, #validate! (refactored from #save!)
5
+ * Force to_a on query results when constructing to force the promise-like
6
+ semantics of SPARQL::Client
7
+
3
8
  ## 0.0.11
4
9
  * Bumped the version dependency on rdf-isomorphic to 0.3.0
5
10
  * Added support for before_create, after_create, before_save, after_save,
@@ -70,19 +70,25 @@ module Spira
70
70
  # @see Spira::Type
71
71
  # @return [Void]
72
72
  def property(name, opts = {} )
73
- add_accessors(name,opts,:hash_accessors)
73
+ predicate = predicate_for(opts[:predicate], name)
74
+ type = type_for(opts[:type])
75
+ @properties[name] = { :predicate => predicate, :type => type }
76
+ add_accessors(name,opts)
74
77
  end
75
78
 
76
79
  ##
77
80
  # The plural form of `property`. `Has_many` has the same options as
78
81
  # `property`, but instead of a single value, a Ruby Array of objects will
79
- # be created instead. Be warned that this should be a Set to match RDF
80
- # semantics, but this is not currently implemented. Duplicate values of
81
- # an array will be lost on save.
82
+ # be created instead.
83
+ #
84
+ # has_many corresponds to an RDF subject with several triples of the same
85
+ # predicate. This corresponds to a Ruby Set, which will be returned when
86
+ # the property is accessed. Arrays will be accepted for new values, but
87
+ # ordering and duplicate values will be lost on save.
82
88
  #
83
89
  # @see Spira::Resource::DSL#property
84
90
  def has_many(name, opts = {})
85
- add_accessors(name,opts,:hash_accessors)
91
+ property(name, opts)
86
92
  @lists[name] = true
87
93
  end
88
94
 
@@ -215,34 +221,48 @@ module Spira
215
221
  end
216
222
 
217
223
  ##
218
- # Add getters and setters for a property or list.
224
+ # Determine the type for a property based on the given type option
225
+ #
226
+ # @param [nil, Spira::Type, Constant] type
227
+ # @return Spira::Type
228
+ # @private
229
+ def type_for(type)
230
+ case
231
+ when type.nil?
232
+ Spira::Types::Any
233
+ when type.is_a?(Symbol) || type.is_a?(String)
234
+ type
235
+ when !(Spira.types[type].nil?)
236
+ Spira.types[type]
237
+ else
238
+ raise TypeError, "Unrecognized type: #{type}"
239
+ end
240
+ end
241
+
242
+ ##
243
+ # Determine the predicate for a property based on the given predicate, name, and default vocabulary
244
+ #
245
+ # @param [#to_s, #to_uri] predicate
246
+ # @param [Symbol] name
247
+ # @return [RDF::URI]
219
248
  # @private
220
- def add_accessors(name, opts, accessors_method)
221
- predicate = case
222
- when opts[:predicate]
223
- opts[:predicate]
249
+ def predicate_for(predicate, name)
250
+ case
251
+ when predicate.respond_to?(:to_uri) && predicate.to_uri.absolute?
252
+ predicate
224
253
  when @default_vocabulary.nil?
225
254
  raise ResourceDeclarationError, "A :predicate option is required for types without a default vocabulary"
226
- else @default_vocabulary
255
+ else
256
+ # FIXME: use rdf.rb smart separator after 0.3.0 release
227
257
  separator = @default_vocabulary.to_s[-1,1] =~ /(\/|#)/ ? '' : '/'
228
258
  RDF::URI.intern(@default_vocabulary.to_s + separator + name.to_s)
229
259
  end
230
- if !(predicate.respond_to?(:to_uri))
231
- raise ResourceDeclarationError, ":predicate options must be RDF::URIs or strings with a default vocabulary declared"
232
- end
233
- type = case
234
- when opts[:type].nil?
235
- Spira::Types::Any
236
- when opts[:type].is_a?(Symbol) || opts[:type].is_a?(String)
237
- opts[:type]
238
- when !(Spira.types[opts[:type]].nil?)
239
- Spira.types[opts[:type]]
240
- else
241
- raise TypeError, "Unrecognized type: #{opts[:type]}"
242
- end
243
- @properties[name] = {}
244
- @properties[name][:predicate] = predicate
245
- @properties[name][:type] = type
260
+ end
261
+
262
+ ##
263
+ # Add getters and setters for a property or list.
264
+ # @private
265
+ def add_accessors(name, opts)
246
266
  name_equals = (name.to_s + "=").to_sym
247
267
 
248
268
  self.send(:define_method,name_equals) do |arg|
@@ -78,14 +78,14 @@ module Spira
78
78
  # @return [Hash{Symbol => Any}] attributes
79
79
  # @private
80
80
  def reload_attributes()
81
- statements = self.class.repository_or_fail.query(:subject => @subject)
81
+ statements = self.class.repository_or_fail.query(:subject => @subject).to_a
82
82
  attributes = {}
83
83
 
84
84
  # Set attributes for each statement corresponding to a predicate
85
85
  self.class.properties.each do |name, property|
86
86
  if self.class.is_list?(name)
87
87
  values = Set.new
88
- collection = statements.query(:subject => @subject, :predicate => property[:predicate]) unless statements.empty?
88
+ collection = statements.select{|s| s.subject == @subject && s.predicate == property[:predicate]} unless statements.empty?
89
89
  unless collection.nil?
90
90
  collection.each do |statement|
91
91
  values << self.class.build_value(statement,property[:type], @cache)
@@ -93,7 +93,7 @@ module Spira
93
93
  end
94
94
  attributes[name] = values
95
95
  else
96
- statement = statements.query(:subject => @subject, :predicate => property[:predicate]).first unless statements.empty?
96
+ statement = statements.select{|s| s.subject == @subject && s.predicate == property[:predicate]}.first unless statements.empty?
97
97
  attributes[name] = self.class.build_value(statement, property[:type], @cache)
98
98
  end
99
99
  end
@@ -162,16 +162,12 @@ module Spira
162
162
  existed = (self.respond_to?(:before_create) || self.respond_to?(:after_create)) && !self.type.nil? && exists?
163
163
  before_create if self.respond_to?(:before_create) && !self.type.nil? && !existed
164
164
  before_save if self.respond_to?(:before_save)
165
- unless self.class.validators.empty?
166
- errors.clear
167
- self.class.validators.each do | validator | self.send(validator) end
168
- if errors.empty?
165
+ # we use the non-raising validate and check it to make a slightly different error message. worth it?...
166
+ case validate
167
+ when true
169
168
  _update!
170
- else
169
+ when false
171
170
  raise(ValidationError, "Could not save #{self.inspect} due to validation errors: " + errors.each.join(';'))
172
- end
173
- else
174
- _update!
175
171
  end
176
172
  after_create if self.respond_to?(:after_create) && !self.type.nil? && !existed
177
173
  after_save if self.respond_to?(:after_save)
@@ -464,6 +460,28 @@ module Spira
464
460
  @errors ||= Spira::Errors.new
465
461
  end
466
462
 
463
+ ##
464
+ # Run any model validations and populate the errors object accordingly.
465
+ # Returns true if the model is valid, false otherwise
466
+ #
467
+ # @return [True, False]
468
+ def validate
469
+ unless self.class.validators.empty?
470
+ errors.clear
471
+ self.class.validators.each do | validator | self.send(validator) end
472
+ end
473
+ errors.empty?
474
+ end
475
+
476
+ ##
477
+ # Run validations on this model and raise a Spira::ValidationError if the validations fail.
478
+ #
479
+ # @see #validate
480
+ # @return true
481
+ def validate!
482
+ validate || raise(ValidationError, "Failed to validate #{self.inspect}: " + errors.each.join(';'))
483
+ end
484
+
467
485
  ##
468
486
  # Returns true if any data exists for this subject in the backing RDF store
469
487
  #
data/lib/spira/version.rb CHANGED
@@ -2,7 +2,7 @@ module Spira
2
2
  module VERSION
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 11
5
+ TINY = 12
6
6
  EXTRA = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY].join('.')
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 11
9
- version: 0.0.11
8
+ - 12
9
+ version: 0.0.12
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ben Lavender
@@ -15,13 +15,14 @@ bindir:
15
15
  - bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-03 00:00:00 -05:00
18
+ date: 2011-02-10 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: rdf-spec
23
23
  prerelease: false
24
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
25
26
  requirements:
26
27
  - - ">="
27
28
  - !ruby/object:Gem::Version
@@ -36,6 +37,7 @@ dependencies:
36
37
  name: rspec
37
38
  prerelease: false
38
39
  requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
39
41
  requirements:
40
42
  - - ">="
41
43
  - !ruby/object:Gem::Version
@@ -50,6 +52,7 @@ dependencies:
50
52
  name: yard
51
53
  prerelease: false
52
54
  requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
53
56
  requirements:
54
57
  - - ">="
55
58
  - !ruby/object:Gem::Version
@@ -64,6 +67,7 @@ dependencies:
64
67
  name: rdf
65
68
  prerelease: false
66
69
  requirement: &id004 !ruby/object:Gem::Requirement
70
+ none: false
67
71
  requirements:
68
72
  - - ">="
69
73
  - !ruby/object:Gem::Version
@@ -78,6 +82,7 @@ dependencies:
78
82
  name: rdf-isomorphic
79
83
  prerelease: false
80
84
  requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
81
86
  requirements:
82
87
  - - ">="
83
88
  - !ruby/object:Gem::Version
@@ -92,6 +97,7 @@ dependencies:
92
97
  name: promise
93
98
  prerelease: false
94
99
  requirement: &id006 !ruby/object:Gem::Requirement
100
+ none: false
95
101
  requirements:
96
102
  - - ">="
97
103
  - !ruby/object:Gem::Version
@@ -115,7 +121,6 @@ files:
115
121
  - AUTHORS
116
122
  - README
117
123
  - UNLICENSE
118
- - VERSION
119
124
  - lib/spira/base.rb
120
125
  - lib/spira/errors.rb
121
126
  - lib/spira/exceptions.rb
@@ -148,6 +153,7 @@ rdoc_options: []
148
153
  require_paths:
149
154
  - lib
150
155
  required_ruby_version: !ruby/object:Gem::Requirement
156
+ none: false
151
157
  requirements:
152
158
  - - ">="
153
159
  - !ruby/object:Gem::Version
@@ -157,6 +163,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
157
163
  - 2
158
164
  version: 1.8.2
159
165
  required_rubygems_version: !ruby/object:Gem::Requirement
166
+ none: false
160
167
  requirements:
161
168
  - - ">="
162
169
  - !ruby/object:Gem::Version
@@ -166,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
173
  requirements: []
167
174
 
168
175
  rubyforge_project: spira
169
- rubygems_version: 1.3.6
176
+ rubygems_version: 1.3.7
170
177
  signing_key:
171
178
  specification_version: 3
172
179
  summary: A framework for using the information in RDF.rb repositories as model objects.
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.0.11