On Thu, 2012-09-06 at 14:36 +0200, Michal Fojtik wrote:
> 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 :)

Don't give the class a name at all (by passing in nil as the name)

David




Reply via email to