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.


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
--------------------------------------------------------

Reply via email to