[macruby-changes] [805] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Jan 22 08:30:36 PST 2009


Revision: 805
          http://trac.macosforge.org/projects/ruby/changeset/805
Author:   eloy.de.enige at gmail.com
Date:     2009-01-22 08:30:36 -0800 (Thu, 22 Jan 2009)
Log Message:
-----------
Object.full_const_get now raises a NameError is a const is missing. Also keep track of the frameworks which are loaded and use that information to decide whether or not to lookup a constant now, or once the framework has been loaded. Made tests green. Patch by Vincent Isambart.

Modified Paths:
--------------
    MacRuby/trunk/lib/hotcocoa/mappings.rb
    MacRuby/trunk/lib/hotcocoa/object_ext.rb
    MacRuby/trunk/test-macruby/cases/hotcocoa/mappings_test.rb

Modified: MacRuby/trunk/lib/hotcocoa/mappings.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa/mappings.rb	2009-01-21 09:47:51 UTC (rev 804)
+++ MacRuby/trunk/lib/hotcocoa/mappings.rb	2009-01-22 16:30:36 UTC (rev 805)
@@ -34,13 +34,9 @@
       if mapped_value.kind_of?(Class)
         add_mapping(mapped_name, mapped_value, &block)
       else
-        constant = Object.full_const_get(mapped_value)
-        if framework.nil? || constant
+        on_framework(framework) do
+          constant = Object.full_const_get(mapped_value)
           add_mapping(mapped_name, constant, &block)
-        else
-          on_framework(framework) do
-            add_mapping(mapped_name, constant, &block)
-          end
         end
       end
     end
@@ -57,16 +53,27 @@
     end
     
     def self.on_framework(name, &block)
-      (frameworks[name.to_s.downcase] ||= []) << block
+      name = name.nil? ? nil : name.to_s.downcase
+      if name.nil? or loaded_frameworks.include?(name)
+        block.call
+      else
+        (frameworks[name] ||= []) << block
+      end
     end
     
     def self.frameworks
       @frameworks ||= {}
     end
     
+    def self.loaded_frameworks
+      @loaded_frameworks ||= Set.new
+    end
+    
     def self.framework_loaded(name)
-      if frameworks[name.to_s.downcase]
-        frameworks[name.to_s.downcase].each do |mapper|
+      name = name.to_s.downcase
+      loaded_frameworks << name
+      if frameworks[name]
+        frameworks[name].each do |mapper|
           mapper.call
         end
       end

Modified: MacRuby/trunk/lib/hotcocoa/object_ext.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa/object_ext.rb	2009-01-21 09:47:51 UTC (rev 804)
+++ MacRuby/trunk/lib/hotcocoa/object_ext.rb	2009-01-22 16:30:36 UTC (rev 805)
@@ -12,8 +12,8 @@
     list.each do |x|
       # This is required because const_get tries to look for constants in the
       # ancestor chain, but we only want constants that are HERE
-      obj = obj.const_defined?(x) ? obj.const_get(x) : nil
-      return false unless obj
+      raise NameError, "uninitialized constant #{self.name}::#{name}" unless obj.const_defined?(x)
+      obj = obj.const_get(x)
     end
     obj
   end

Modified: MacRuby/trunk/test-macruby/cases/hotcocoa/mappings_test.rb
===================================================================
--- MacRuby/trunk/test-macruby/cases/hotcocoa/mappings_test.rb	2009-01-21 09:47:51 UTC (rev 804)
+++ MacRuby/trunk/test-macruby/cases/hotcocoa/mappings_test.rb	2009-01-22 16:30:36 UTC (rev 805)
@@ -62,6 +62,7 @@
   it "should create a mapping to a class in a framework with #map" do
     mock = Mock.new
     
+    eval "class ::ClassInTheFrameWork; end"
     Mappings.map(:klass => 'ClassInTheFrameWork', :framework => 'TheFramework') do
       mock.call!
     end
@@ -89,7 +90,7 @@
   
   it "should resolve a constant when a framework, that's registered with #map, is loaded" do
     assert_nothing_raised(NameError) do
-      Mappings.map(:klass => 'ClassFromFramework', :framework => 'TheFramework') {}
+      Mappings.map(:klass => 'ClassFromFramework', :framework => 'TheFrameworkAfterLoad') {}
     end
     
     # The mapping should not yet exist
@@ -97,7 +98,7 @@
     
     # now we actually define the class and fake the loading of the framework
     eval "class ::ClassFromFramework; end"
-    Mappings.framework_loaded('TheFramework')
+    Mappings.framework_loaded('TheFrameworkAfterLoad')
     
     # It should be loaded by now
     assert_equal ClassFromFramework, Mappings.mappings[:klass].control_class
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090122/ad43c33f/attachment.html>


More information about the macruby-changes mailing list