On Sep 6, 2012, at 1:30 AM, David Lutterkort <[email protected]> wrote:

> On Wed, 2012-09-05 at 15:15 +0200, [email protected] wrote:
>> From: Michal Fojtik <[email protected]>
>> 
>> * This should fix DTACLOUD-311
>> 
>> Signed-off-by: Michal fojtik <[email protected]>
>> ---
>> server/lib/cimi/models/schema.rb |    6 ++----
>> 1 file changed, 2 insertions(+), 4 deletions(-)
>> 
>> diff --git a/server/lib/cimi/models/schema.rb 
>> b/server/lib/cimi/models/schema.rb
>> index 088e111..a7dc0f2 100644
>> --- a/server/lib/cimi/models/schema.rb
>> +++ b/server/lib/cimi/models/schema.rb
>> @@ -140,11 +140,9 @@ class CIMI::Model::Schema
>>     def struct
>>       cname = "CIMI_#{json_name.upcase_first}"
>>       if ::Struct.const_defined?(cname)
>> -        ::Struct.const_get(cname)
>> -      else
>> -        ::Struct.new("CIMI_#{json_name.upcase_first}",
>> -                     *@schema.attribute_names)
>> +        ::Struct.send(:remove_const, "CIMI_#{json_name.upcase_first}")
>>       end
>> +      ::Struct.new("CIMI_#{json_name.upcase_first}", 
>> *@schema.attribute_names)
> 
> Nice catch - instead of defining a constant Struct::Foo and then
> undefining it, and continually defining new classes, we should just save
> it in an instance variable, i.e. do the following
> 
>        def struct
>          @struct_class ||= Struct.new(nil, *@schema.attribute_names)
>        end
> 

I tried this but got a lot of:

................F/Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: 
warning: redefining constant Struct::CIMI_Operations
./Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_Disks
/Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_Operations
F/Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_Operations
./Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_Volumes
/Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_NetworkInterfaces
/Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_Operations
...../Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_Structs
../Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_Meter
...../Users/mfojtik/code/core/server/lib/cimi/models/schema.rb:146: warning: 
redefining constant Struct::CIMI_Struct


But no errors. I think we can combine both to:

    def struct
      cname = "CIMI_#{json_name.upcase_first}"
      ::Struct.send(:remove_const, cname) if ::Struct.const_defined?(cname)
      @struct_class ||= ::Struct.new(cname, *@schema.attribute_names)
    end

This will remove the warnings and does not define new class every time :)

  -- Michal


Michal Fojtik
http://deltacloud.org
[email protected]



Reply via email to