active-fedora 6.4.0.rc1 → 6.4.0.rc2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a57c2dc577a4f6595cba76b441203b6d6663d083
4
- data.tar.gz: d8192c0c8615c94caf0ebe10820866981eb870e9
3
+ metadata.gz: 9f6463fca15144a94e10e6c80c86871f57867c2b
4
+ data.tar.gz: d08ad6e9492d3d62fa5227ce779539ffd83406bc
5
5
  SHA512:
6
- metadata.gz: b6e1153143dc1a2140c155fbffdfa17e721a05c187cdc54f97099a17dd4ff7db3c738eb2de016128b9f3aec119282bf91804f3d2baaa8a3ae95dcc4d54fd4a0b
7
- data.tar.gz: 4492eb4d126ee07a15c43e9403722fa5dca9d26d111d8aa6fe680c78d7602bf48cacbf1fa93b4cb66fc551fbce1a61d59c89dbab0632ef365626b24fb4bf1ecf
6
+ metadata.gz: 13a56b47d6da5d2c173f67f255a30e5d7bdf1b4e6c1a98cd3cff69390bbe5a463ef3b4e2167976f7ef1c55defa7844224ba6cfa769e38ad057bb49e0fb12c53f
7
+ data.tar.gz: 64befaef8bdcbb7f54443591ceba0d71d98ceacf5fc303b0e162bf6cdbd38bb8f2709ea52e5e5e19e492591127cb810c09bdb1fb61d90ab0b5bce6624ec7328d
@@ -25,19 +25,60 @@ module ActiveFedora
25
25
  association = self.send(association_name)
26
26
 
27
27
  attributes_collection.each do |attributes|
28
- if attributes.instance_of? Hash
28
+ attributes = attributes.with_indifferent_access
29
+
30
+ if attributes['id'].blank?
29
31
  attributes = attributes.with_indifferent_access
30
32
  association.build(attributes.except(*UNASSIGNABLE_KEYS))
33
+ elsif existing_record = association.detect { |record| record.rdf_subject.to_s == attributes['id'].to_s }
34
+ if !call_reject_if(association_name, attributes)
35
+ assign_to_or_mark_for_destruction(existing_record, attributes, options[:allow_destroy])
36
+ end
31
37
  else
32
- association.build(attributes)
38
+ raise_nested_attributes_record_not_found(association_name, record.rdf_subject.to_s)
33
39
  end
34
40
  end
35
41
  end
36
42
 
43
+ # Updates a record with the +attributes+ or marks it for destruction if
44
+ # +allow_destroy+ is +true+ and has_destroy_flag? returns +true+.
45
+ def assign_to_or_mark_for_destruction(record, attributes, allow_destroy)
46
+ record.attributes = attributes.except(*UNASSIGNABLE_KEYS)
47
+ record.mark_for_destruction if has_destroy_flag?(attributes) && allow_destroy
48
+ end
49
+
50
+ def raise_nested_attributes_record_not_found(association_name, record_id)
51
+ raise RecordNotFound, "Couldn't find #{association_name} with ID=#{record_id} for #{self.class.name} with ID=#{id}"
52
+ end
53
+
54
+ def call_reject_if(association_name, attributes)
55
+ return false if has_destroy_flag?(attributes)
56
+ case callback = self.nested_attributes_options[association_name][:reject_if]
57
+ when Symbol
58
+ method(callback).arity == 0 ? send(callback) : send(callback, attributes)
59
+ when Proc
60
+ callback.call(attributes)
61
+ end
62
+ end
63
+
64
+ # Determines if a hash contains a truthy _destroy key.
65
+ def has_destroy_flag?(hash)
66
+ ["1", "true"].include?(hash['_destroy'].to_s)
67
+ end
68
+
69
+
37
70
  module ClassMethods
38
- def accepts_nested_attributes_for *relationships
39
- relationships.each do |association_name|
40
- nested_attributes_options[association_name] = {}
71
+ def accepts_nested_attributes_for *attr_names
72
+ options = { :allow_destroy => false, :update_only => false }
73
+ options.update(attr_names.extract_options!)
74
+ options.assert_valid_keys(:allow_destroy, :reject_if, :limit, :update_only)
75
+ options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
76
+
77
+ attr_names.each do |association_name|
78
+ nested_attributes_options = self.nested_attributes_options.dup
79
+ nested_attributes_options[association_name] = options
80
+ self.nested_attributes_options = nested_attributes_options
81
+
41
82
  generate_association_writer(association_name)
42
83
  end
43
84
  end
@@ -56,16 +97,17 @@ module ActiveFedora
56
97
  # the helper methods defined below. Makes it seem like the nested
57
98
  # associations are just regular associations.
58
99
  def generate_association_writer(association_name)
59
- class_eval <<-eoruby, __FILE__, __LINE__ + 1
60
- if method_defined?(:#{association_name}_attributes=)
61
- remove_method(:#{association_name}_attributes=)
62
- end
63
- def #{association_name}_attributes=(attributes)
64
- unless attributes.nil?
65
- assign_nested_attributes_for_collection_association(:#{association_name}, attributes)
66
- end
67
- end
68
- eoruby
100
+ class_eval <<-eoruby, __FILE__, __LINE__ + 1
101
+ if method_defined?(:#{association_name}_attributes=)
102
+ remove_method(:#{association_name}_attributes=)
103
+ end
104
+ def #{association_name}_attributes=(attributes)
105
+ assign_nested_attributes_for_collection_association(:#{association_name}, attributes)
106
+ ## in lieu of autosave_association_callbacks just save all of em.
107
+ send(:#{association_name}).each {|obj| obj.marked_for_destruction? ? obj.destroy : nil}
108
+ send(:#{association_name}).reset!
109
+ end
110
+ eoruby
69
111
  end
70
112
  end
71
113
  end
@@ -42,6 +42,7 @@ module ActiveFedora
42
42
  end
43
43
 
44
44
  def content=(content)
45
+ reset_child_cache!
45
46
  @graph = deserialize(content)
46
47
  end
47
48
 
@@ -98,6 +99,7 @@ module ActiveFedora
98
99
  # Note: This method is implemented on SemanticNode instead of RelsExtDatastream because SemanticNode contains the relationships array
99
100
  def serialize
100
101
  update_subjects_to_use_a_real_pid!
102
+
101
103
  RDF::Writer.for(serialization_format).dump(graph)
102
104
  end
103
105
 
@@ -109,6 +111,7 @@ module ActiveFedora
109
111
 
110
112
  bad_subject = rdf_subject
111
113
  reset_rdf_subject!
114
+ reset_child_cache!
112
115
  new_subject = rdf_subject
113
116
 
114
117
  new_repository = RDF::Repository.new
@@ -125,7 +128,7 @@ module ActiveFedora
125
128
 
126
129
  # returns a Hash, e.g.: {field => {:values => [], :type => :something, :behaviors => []}, ...}
127
130
  def fields
128
- field_map = {}
131
+ field_map = {}.with_indifferent_access
129
132
 
130
133
  rdf_subject = self.rdf_subject
131
134
  query = RDF::Query.new do
@@ -9,6 +9,10 @@ module ActiveFedora
9
9
  graph.insert([subject, RDF.rest, RDF.nil])
10
10
  end
11
11
 
12
+ def rdf_subject
13
+ subject
14
+ end
15
+
12
16
  def first
13
17
  self[0]
14
18
  end
@@ -36,12 +36,17 @@ module ActiveFedora
36
36
  @subject = nil
37
37
  end
38
38
 
39
+ def reset_child_cache!
40
+ @target = {}
41
+ end
42
+
39
43
  # @param [RDF::URI] subject the base node to start the search from
40
44
  # @param [Symbol] term the term to get the values for
41
45
  def get_values(subject, term)
42
46
  options = config_for_term_or_uri(term)
43
47
  predicate = options[:predicate]
44
- TermProxy.new(self, subject, predicate, options)
48
+ @target ||= {}
49
+ @target[term.to_s] ||= TermProxy.new(self, subject, predicate, options)
45
50
  end
46
51
 
47
52
  def target_class(predicate)
@@ -51,12 +56,20 @@ module ActiveFedora
51
56
  ActiveFedora.class_from_string(class_name, self.class)
52
57
  end
53
58
 
59
+ def mark_for_destruction
60
+ @marked_for_destruction = true
61
+ end
62
+
63
+ def marked_for_destruction?
64
+ @marked_for_destruction
65
+ end
66
+
54
67
  # if there are any existing statements with this predicate, replace them
55
68
  # @param [RDF::URI] subject the subject to insert into the graph
56
69
  # @param [Symbol, RDF::URI] predicate the predicate to insert into the graph
57
70
  # @param [Array,#to_s] values the value/values to insert into the graph
58
- def set_value(subject, predicate, values)
59
- options = config_for_term_or_uri(predicate)
71
+ def set_value(subject, term, values)
72
+ options = config_for_term_or_uri(term)
60
73
  predicate = options[:predicate]
61
74
  values = Array(values)
62
75
 
@@ -71,20 +84,46 @@ module ActiveFedora
71
84
  end
72
85
  end
73
86
 
74
- TermProxy.new(self, subject, predicate, options)
87
+ @target ||= {}
88
+ proxy = @target[term.to_s]
89
+ proxy ||= TermProxy.new(self, subject, predicate, options)
90
+ proxy.reset!
91
+ proxy
92
+
93
+ end
94
+
95
+ # Be careful with destroy. It will still be in the cache untill you call reset()
96
+ def destroy
97
+ # delete any statements about this rdf_subject
98
+ subject = rdf_subject
99
+ query = RDF::Query.new do
100
+ pattern [subject, :predicate, :value]
101
+ end
102
+
103
+ query.execute(graph).each do |solution|
104
+ graph.delete [subject, solution.predicate, solution.value]
105
+ end
106
+
107
+ # delete any statements that reference this rdf_subject
108
+ query = RDF::Query.new do
109
+ pattern [:subject, :predicate, subject]
110
+ end
111
+
112
+ query.execute(graph).each do |solution|
113
+ graph.delete [solution.subject, solution.predicate, subject]
114
+ end
75
115
  end
76
116
 
77
117
  # @option [Hash] values the values to assign to this rdf node.
78
118
  def attributes=(values)
79
119
  raise ArgumentError, "values must be a Hash, you provided #{values.class}" unless values.kind_of? Hash
80
- self.class.config.keys.each do |key|
81
- if values.has_key?(key)
82
- set_value(rdf_subject, key, values[key])
120
+ values.with_indifferent_access.each do |key, value|
121
+ if self.class.config.keys.include?(key)
122
+ set_value(rdf_subject, key, value)
123
+ elsif nested_attributes_options.keys.map{ |k| "#{k}_attributes"}.include?(key)
124
+ send("#{key}=".to_sym, value)
83
125
  end
84
126
  end
85
- nested_attributes_options.keys.each do |key|
86
- send("#{key}_attributes=".to_sym, values["#{key}_attributes".to_sym])
87
- end
88
127
  end
89
128
 
90
129
  def delete_predicate(subject, predicate, values = nil)
@@ -103,6 +142,7 @@ module ActiveFedora
103
142
  graph.delete [subject, predicate, v]
104
143
  end
105
144
  end
145
+ reset_child_cache!
106
146
  end
107
147
 
108
148
  # append a value
@@ -110,7 +150,6 @@ module ActiveFedora
110
150
  def append(subject, predicate, args)
111
151
  options = config_for_term_or_uri(predicate)
112
152
  graph.insert([subject, predicate, args])
113
- TermProxy.new(self, subject, options[:predicate], options)
114
153
  end
115
154
 
116
155
  def config_for_term_or_uri(term)
@@ -139,8 +178,8 @@ module ActiveFedora
139
178
  end
140
179
 
141
180
  def method_missing(name, *args)
142
- if (md = /^([^=]+)=$/.match(name.to_s)) && pred = find_predicate(md[1])
143
- set_value(rdf_subject, pred, *args)
181
+ if md = /^([^=]+)=$/.match(name.to_s)
182
+ set_value(rdf_subject, md[1], *args)
144
183
  elsif find_predicate(name)
145
184
  get_values(rdf_subject, name)
146
185
  else
@@ -244,7 +283,7 @@ module ActiveFedora
244
283
 
245
284
  module ClassMethods
246
285
  def config
247
- @config ||= {}
286
+ @config ||= {}.with_indifferent_access
248
287
  end
249
288
 
250
289
  def map_predicates(&block)
@@ -2,45 +2,57 @@ module ActiveFedora
2
2
  module RdfNode
3
3
  class TermProxy
4
4
 
5
- attr_reader :graph, :subject, :predicate, :options
6
-
7
- delegate *(Array.public_instance_methods - [:__send__, :__id__, :class, :object_id] + [:as_json]), :to => :values
5
+ attr_reader :parent, :subject, :predicate, :options
6
+ delegate *(Array.public_instance_methods - [:__send__, :__id__, :class, :object_id] + [:as_json]), :to => :target
7
+
8
8
 
9
- # @param graph RDF::Graph
9
+ # @param parent RdfNode
10
10
  # @param subject RDF::URI
11
11
  # @param options Hash
12
- def initialize(graph, subject, predicate, options)
13
- @graph = graph
12
+ def initialize(parent, subject, predicate, options)
13
+ @parent = parent
14
14
  @subject = subject
15
15
  @predicate = predicate
16
16
  @options = options
17
17
  end
18
18
 
19
+
19
20
  def build(attributes=nil)
20
21
  new_subject = RDF::Node.new
21
- graph.graph.insert([subject, predicate, new_subject])
22
- graph.target_class(predicate).new(graph.graph, new_subject).tap do |node|
22
+ parent.graph.insert([subject, predicate, new_subject])
23
+ parent.target_class(predicate).new(parent.graph, new_subject).tap do |node|
23
24
  node.attributes = attributes if attributes
24
25
  end
26
+ reset!
27
+ target.find { |n| n.rdf_subject == new_subject}
28
+ end
29
+
30
+ def reset!
31
+ @target = nil
25
32
  end
26
33
 
27
34
  def <<(*values)
28
- values.each { |value| graph.append(subject, predicate, value) }
35
+ values.each { |value| parent.append(subject, predicate, value) }
36
+ reset!
29
37
  values
30
38
  end
31
39
 
32
40
  def delete(*values)
33
41
  values.each do |value|
34
- graph.delete_predicate(subject, predicate, value)
42
+ parent.delete_predicate(subject, predicate, value)
35
43
  end
36
44
 
37
45
  values
38
46
  end
39
47
 
40
- def values
48
+ def target
49
+ @target ||= load_values
50
+ end
51
+
52
+ def load_values
41
53
  values = []
42
54
 
43
- graph.query(subject, predicate).each do |solution|
55
+ parent.query(subject, predicate).each do |solution|
44
56
  v = solution.value
45
57
  v = v.to_s if v.is_a? RDF::Literal
46
58
  if options[:type] == :date
@@ -50,14 +62,14 @@ module ActiveFedora
50
62
  # potential solution is of the right RDF.type
51
63
  if options[:class_name]
52
64
  klass = class_from_rdf_type(v)
53
- values << v if klass == ActiveFedora.class_from_string(options[:class_name], graph.class)
65
+ values << v if klass == ActiveFedora.class_from_string(options[:class_name], parent.class)
54
66
  else
55
67
  values << v
56
68
  end
57
69
  end
58
70
 
59
71
  if options[:class_name]
60
- values = values.map{ |found_subject| class_from_rdf_type(found_subject).new(graph.graph, found_subject)}
72
+ values = values.map{ |found_subject| class_from_rdf_type(found_subject).new(parent.graph, found_subject)}
61
73
  end
62
74
 
63
75
  values
@@ -66,7 +78,7 @@ module ActiveFedora
66
78
  private
67
79
 
68
80
  def target_class
69
- graph.target_class(predicate)
81
+ parent.target_class(predicate)
70
82
  end
71
83
 
72
84
  # Look for a RDF.type assertion on this node to see if an RDF class is specified.
@@ -78,7 +90,7 @@ module ActiveFedora
78
90
  end
79
91
 
80
92
  type_uri = []
81
- q.execute(graph.graph).each do |sol|
93
+ q.execute(parent.graph).each do |sol|
82
94
  type_uri << sol.value
83
95
  end
84
96
 
@@ -1,3 +1,3 @@
1
1
  module ActiveFedora
2
- VERSION = "6.4.0.rc1"
2
+ VERSION = "6.4.0.rc2"
3
3
  end
@@ -35,6 +35,23 @@ describe "Nested Rdf Objects" do
35
35
  ds.parts.first.label.should == ["Alternator"]
36
36
  end
37
37
 
38
+ it "should be able to replace attributes" do
39
+ v = ds.parts.build(label: 'Alternator')
40
+ ds.parts.first.label.should == ['Alternator']
41
+ ds.parts.first.label = ['Distributor']
42
+ ds.parts.first.label.should == ['Distributor']
43
+ end
44
+
45
+ it "should be able to replace objects" do
46
+ ds.parts.build(label: 'Alternator')
47
+ ds.parts.build(label: 'Distributor')
48
+ ds.parts.size.should == 2
49
+ comp = SpecDatastream::Component.new(ds.graph)
50
+ comp.label = "Injector port"
51
+ ds.parts = [comp]
52
+ ds.parts.size.should == 1
53
+ end
54
+
38
55
  it "should be able to nest many complex objects" do
39
56
  comp1 = SpecDatastream::Component.new ds.graph
40
57
  comp1.label = ["Alternator"]
@@ -1,118 +1,157 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe ActiveFedora::RDFDatastream do
4
- before do
5
- class DummyMADS < RDF::Vocabulary("http://www.loc.gov/mads/rdf/v1#")
6
- # componentList and Types of components
7
- property :componentList
8
- property :Topic
9
- property :Temporal
10
- property :PersonalName
11
- property :CorporateName
12
- property :ComplexSubject
13
-
14
-
15
- # elementList and elementList values
16
- property :elementList
17
- property :elementValue
18
- property :TopicElement
19
- property :TemporalElement
20
- property :NameElement
21
- property :FullNameElement
22
- property :DateNameElement
23
- end
24
-
25
- class ComplexRDFDatastream < ActiveFedora::NtriplesRDFDatastream
26
- map_predicates do |map|
27
- map.topic(in: DummyMADS, to: "Topic", class_name:"Topic")
28
- map.personalName(in: DummyMADS, to: "PersonalName", class_name:"PersonalName")
29
- map.title(in: RDF::DC)
3
+ describe "Nesting attribute behavior of RDFDatastream" do
4
+ describe ".attributes=" do
5
+ describe "complex properties" do
6
+ before do
7
+ class DummyMADS < RDF::Vocabulary("http://www.loc.gov/mads/rdf/v1#")
8
+ # componentList and Types of components
9
+ property :componentList
10
+ property :Topic
11
+ property :Temporal
12
+ property :PersonalName
13
+ property :CorporateName
14
+ property :ComplexSubject
15
+
16
+
17
+ # elementList and elementList values
18
+ property :elementList
19
+ property :elementValue
20
+ property :TopicElement
21
+ property :TemporalElement
22
+ property :NameElement
23
+ property :FullNameElement
24
+ property :DateNameElement
30
25
  end
31
26
 
32
- accepts_nested_attributes_for :topic, :personalName
33
-
34
- class Topic
35
- include ActiveFedora::RdfObject
27
+ class ComplexRDFDatastream < ActiveFedora::NtriplesRDFDatastream
36
28
  map_predicates do |map|
37
- map.elementList(in: DummyMADS, class_name:"ComplexRDFDatastream::ElementList")
29
+ map.topic(in: DummyMADS, to: "Topic", class_name:"Topic")
30
+ map.personalName(in: DummyMADS, to: "PersonalName", class_name:"PersonalName")
31
+ map.title(in: RDF::DC)
38
32
  end
39
- accepts_nested_attributes_for :elementList
40
- end
41
- class PersonalName
42
- include ActiveFedora::RdfObject
43
- map_predicates do |map|
44
- map.elementList(in: DummyMADS, to: "elementList", class_name:"ComplexRDFDatastream::ElementList")
45
- map.extraProperty(in: DummyMADS, to: "elementValue", class_name:"ComplexRDFDatastream::Topic")
33
+
34
+ accepts_nested_attributes_for :topic, :personalName
35
+
36
+ class Topic
37
+ include ActiveFedora::RdfObject
38
+ map_predicates do |map|
39
+ map.elementList(in: DummyMADS, class_name:"ComplexRDFDatastream::ElementList")
40
+ end
41
+ accepts_nested_attributes_for :elementList
46
42
  end
47
- accepts_nested_attributes_for :elementList, :extraProperty
48
- end
49
- class ElementList
50
- include ActiveFedora::RdfObject
51
- rdf_type DummyMADS.elementList
52
- map_predicates do |map|
53
- map.topicElement(in: DummyMADS, to: "TopicElement")
54
- map.temporalElement(in: DummyMADS, to: "TemporalElement")
55
- map.fullNameElement(in: DummyMADS, to: "FullNameElement")
56
- map.dateNameElement(in: DummyMADS, to: "DateNameElement")
57
- map.nameElement(in: DummyMADS, to: "NameElement")
58
- map.elementValue(in: DummyMADS)
43
+ class PersonalName
44
+ include ActiveFedora::RdfObject
45
+ map_predicates do |map|
46
+ map.elementList(in: DummyMADS, to: "elementList", class_name:"ComplexRDFDatastream::ElementList")
47
+ map.extraProperty(in: DummyMADS, to: "elementValue", class_name:"ComplexRDFDatastream::Topic")
48
+ end
49
+ accepts_nested_attributes_for :elementList, :extraProperty
50
+ end
51
+ class ElementList
52
+ include ActiveFedora::RdfObject
53
+ rdf_type DummyMADS.elementList
54
+ map_predicates do |map|
55
+ map.topicElement(in: DummyMADS, to: "TopicElement")
56
+ map.temporalElement(in: DummyMADS, to: "TemporalElement")
57
+ map.fullNameElement(in: DummyMADS, to: "FullNameElement")
58
+ map.dateNameElement(in: DummyMADS, to: "DateNameElement")
59
+ map.nameElement(in: DummyMADS, to: "NameElement")
60
+ map.elementValue(in: DummyMADS)
61
+ end
59
62
  end
60
63
  end
61
64
  end
62
- end
63
- after do
64
- Object.send(:remove_const, :ComplexRDFDatastream)
65
- Object.send(:remove_const, :DummyMADS)
66
- end
67
- subject { ComplexRDFDatastream.new(stub('inner object', :pid=>'foo', :new? =>true), 'descMetadata') }
68
-
69
- describe ".attributes=" do
70
- describe "complex properties" do
71
- let(:params) do
72
- { myResource:
73
- {
74
- topic_attributes: [
75
- {
76
- elementList_attributes: {
77
- topicElement:"Cosmology"
78
- }
79
- },
80
- {
81
- elementList_attributes: {
82
- topicElement:"Quantum Behavior"
83
- }
84
- }
85
- ],
86
- personalName_attributes: [
87
- {
88
- elementList_attributes: {
89
- fullNameElement: "Jefferson, Thomas",
90
- dateNameElement: "1743-1826"
91
- }
92
- }
93
- #, "Hemings, Sally"
94
- ],
95
- }
65
+ after do
66
+ Object.send(:remove_const, :ComplexRDFDatastream)
67
+ Object.send(:remove_const, :DummyMADS)
68
+ end
69
+ subject { ComplexRDFDatastream.new(stub('inner object', :pid=>'foo', :new? =>true), 'descMetadata') }
70
+ let(:params) do
71
+ { myResource:
72
+ {
73
+ topic_attributes: [
74
+ {
75
+ elementList_attributes: [{
76
+ topicElement:"Cosmology"
77
+ }]
78
+ },
79
+ {
80
+ elementList_attributes: [{
81
+ topicElement:"Quantum Behavior"
82
+ }]
83
+ }
84
+ ],
85
+ personalName_attributes: [
86
+ {
87
+ elementList_attributes: [{
88
+ fullNameElement: "Jefferson, Thomas",
89
+ dateNameElement: "1743-1826"
90
+ }]
91
+ }
92
+ #, "Hemings, Sally"
93
+ ],
96
94
  }
97
- end
98
- it "should support mass-assignment" do
99
- # Replace the graph's contents with the Hash
100
- subject.attributes = params[:myResource]
95
+ }
96
+ end
97
+ it "should create nested objects" do
98
+ # Replace the graph's contents with the Hash
99
+ subject.attributes = params[:myResource]
101
100
 
102
- # Here's how this would happen if we didn't have attributes=
103
- # personal_name = subject.personalName.build
104
- # elem_list = personal_name.elementList.build
105
- # elem_list.fullNameElement = "Jefferson, Thomas"
106
- # elem_list.dateNameElement = "1743-1826"
107
- # topic = subject.topic.build
108
- # elem_list = topic.elementList.build
109
- # elem_list.fullNameElement = 'Cosmology'
101
+ # Here's how this would happen if we didn't have attributes=
102
+ # personal_name = subject.personalName.build
103
+ # elem_list = personal_name.elementList.build
104
+ # elem_list.fullNameElement = "Jefferson, Thomas"
105
+ # elem_list.dateNameElement = "1743-1826"
106
+ # topic = subject.topic.build
107
+ # elem_list = topic.elementList.build
108
+ # elem_list.fullNameElement = 'Cosmology'
110
109
 
111
- subject.topic.first.elementList.first.topicElement.should == ["Cosmology"]
112
- subject.topic[1].elementList.first.topicElement.should == ["Quantum Behavior"]
113
- subject.personalName.first.elementList.first.fullNameElement.should == ["Jefferson, Thomas"]
114
- subject.personalName.first.elementList.first.dateNameElement.should == ["1743-1826"]
115
- end
116
- end
110
+ subject.topic.first.elementList.first.topicElement.should == ["Cosmology"]
111
+ subject.topic[1].elementList.first.topicElement.should == ["Quantum Behavior"]
112
+ subject.personalName.first.elementList.first.fullNameElement.should == ["Jefferson, Thomas"]
113
+ subject.personalName.first.elementList.first.dateNameElement.should == ["1743-1826"]
114
+ end
117
115
  end
116
+
117
+ describe "with an existing object" do
118
+ before(:each) do
119
+ class SpecDatastream < ActiveFedora::NtriplesRDFDatastream
120
+ map_predicates do |map|
121
+ map.parts(:in=> RDF::DC, :to=>'hasPart', :class_name=>'Component')
122
+ end
123
+ accepts_nested_attributes_for :parts, allow_destroy: true
124
+
125
+ class Component
126
+ include ActiveFedora::RdfObject
127
+ map_predicates do |map|
128
+ map.label(:in=> RDF::DC, :to=>'title')
129
+ end
130
+ end
131
+ end
132
+
133
+ end
134
+
135
+ after(:each) do
136
+ Object.send(:remove_const, :SpecDatastream)
137
+ end
138
+ subject { SpecDatastream.new(stub('inner object', :pid=>'foo', :new? =>true), 'descMetadata') }
139
+ before do
140
+ subject.attributes = { parts_attributes: [
141
+ {label: 'Alternator'},
142
+ {label: 'Distributor'},
143
+ {label: 'Transmission'},
144
+ {label: 'Fuel Filter'}]}
145
+ end
146
+ let (:replace_object_id) { subject.parts[1].rdf_subject.to_s }
147
+ let (:remove_object_id) { subject.parts[3].rdf_subject.to_s }
148
+
149
+ it "should update nested objects" do
150
+ subject.parts_attributes= [{id: replace_object_id, label: "Universal Joint"}, {label:"Oil Pump"}, {id: remove_object_id, _destroy: '1', label: "bar1 uno"}]
151
+
152
+ subject.parts.map{|p| p.label.first}.should == ['Alternator', 'Universal Joint', 'Transmission', 'Oil Pump']
153
+
154
+ end
155
+ end
156
+ end
118
157
  end
@@ -223,7 +223,7 @@ describe ActiveFedora::NtriplesRDFDatastream do
223
223
 
224
224
  describe ".fields()" do
225
225
  it "should return the right fields" do
226
- @obj.send(:fields).keys.should == [:created, :title, :publisher, :based_near, :related_url]
226
+ @obj.send(:fields).keys.should == ["created", "title", "publisher", "based_near", "related_url"]
227
227
  end
228
228
  it "should return the right values" do
229
229
  fields = @obj.send(:fields)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active-fedora
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.4.0.rc1
4
+ version: 6.4.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Zumwalt
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-06-21 00:00:00.000000000 Z
13
+ date: 2013-06-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rsolr