spira 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
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