On 02/12/10 10:29 +0100, Michal Fojtik wrote:
On 01/12/10 17:27 -0500, [email protected] wrote:
From: Tobias Crawley <[email protected]>
This resolves an issue where based on the results of one request,
the client will create an Instance class as a subclass of StateFullObject
then, based on the results of another request try to create an Instance
as a subclass of ActionObject, causing a superclass mismatch error.
ACK. Nice catch Tobi.
Pushed into master.
-- Michal
This patch groups the dynamic classes inside nested containing classes
inside DeltaCloud::API, preventing collisions.
---
client/lib/base_object.rb | 27 +++++++++++++++------------
1 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/client/lib/base_object.rb b/client/lib/base_object.rb
index 295968c..93c35cc 100644
--- a/client/lib/base_object.rb
+++ b/client/lib/base_object.rb
@@ -192,7 +192,7 @@ module DeltaCloud
end
- class StateFullObject < ActionObject
+ class StatefulObject < ActionObject
attr_reader :state
def initialize(opts={}, &block)
@@ -263,25 +263,28 @@ module DeltaCloud
end
def self.add_class(name, parent=:base)
- parent_class = case parent
- when :base then 'BaseObject'
- when :action then 'ActionObject'
- when :state then 'StateFullObject'
- end
+ parent = parent.to_s
+ parent_class = "#{parent.classify}Object"
@defined_classes ||= []
- if @defined_classes.include?(name)
- DeltaCloud::API.class_eval("#{name.classify}")
- else
- DeltaCloud::API.class_eval("class #{name.classify} <
DeltaCloud::#{parent_class}; end")
- DeltaCloud::API.const_get("#{name.classify}")
+ class_name = "#{parent.classify}::#{name.classify}"
+ unless @defined_classes.include?(class_name)
+ DeltaCloud::API.class_eval("class #{class_name} <
DeltaCloud::#{parent_class}; end")
+ @defined_classes << class_name
end
+
+ DeltaCloud::API.const_get(parent.classify).const_get(name.classify)
end
def self.guess_model_type(response)
response = Nokogiri::XML(response.to_s)
return :action if ((response/'//actions').length == 1) and
((response/'//state').length == 0)
- return :state if ((response/'//actions').length == 1) and
((response/'//state').length == 1)
+ return :stateful if ((response/'//actions').length == 1) and
((response/'//state').length == 1)
return :base
end
+ class API
+ class Action; end
+ class Base; end
+ class Stateful; end
+ end
end
--
1.7.3.2
--
--------------------------------------------------------
Michal Fojtik, [email protected]
Deltacloud API: http://deltacloud.org
--------------------------------------------------------
--
--------------------------------------------------------
Michal Fojtik, [email protected]
Deltacloud API: http://deltacloud.org
--------------------------------------------------------