[macruby-changes] [5282] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sun Mar 20 18:46:15 PDT 2011


Revision: 5282
          http://trac.macosforge.org/projects/ruby/changeset/5282
Author:   mattaimonetti at gmail.com
Date:     2011-03-20 18:46:15 -0700 (Sun, 20 Mar 2011)
Log Message:
-----------
removed rb_nibtool.old

Modified Paths:
--------------
    MacRuby/trunk/instruby.rb

Removed Paths:
-------------
    MacRuby/trunk/tool/rb_nibtool.old

Modified: MacRuby/trunk/instruby.rb
===================================================================
--- MacRuby/trunk/instruby.rb	2011-03-21 01:40:09 UTC (rev 5281)
+++ MacRuby/trunk/instruby.rb	2011-03-21 01:46:15 UTC (rev 5282)
@@ -520,7 +520,7 @@
 ib_dest = '/Developer/usr/bin'
 mkdir_p ib_dest
 ln_sfh File.join("../../..", CONFIG['bindir'], 'rb_nibtool'), ib_dest
-install('tool/rb_nibtool.old', ib_dest, :mode => $prog_mode)
+#install('tool/rb_nibtool.old', ib_dest, :mode => $prog_mode)
 
 puts "installing LLVM tools"
 llc_dest = File.join(CONFIG['bindir'], 'llc')

Deleted: MacRuby/trunk/tool/rb_nibtool.old
===================================================================
--- MacRuby/trunk/tool/rb_nibtool.old	2011-03-21 01:40:09 UTC (rev 5281)
+++ MacRuby/trunk/tool/rb_nibtool.old	2011-03-21 01:46:15 UTC (rev 5282)
@@ -1,443 +0,0 @@
-#!/usr/bin/env ruby
-# Copyright (c) 2006-2007, The RubyCocoa Project.
-# Copyright (c) 2007 Chris Mcgrath.
-# All Rights Reserved.
-#
-# RubyCocoa is free software, covered under either the Ruby's license or the 
-# LGPL. See the COPYRIGHT file for more information.
-
-require 'osx/cocoa'
-include OSX
-require 'erb'
-
-def log(*s)
-  $stderr.puts s if $DEBUG
-end
-
-def die(*s)
-  $stderr.puts s
-  exit 1
-end
-
-# Requires rubygems if present.
-begin require 'rubygems'; rescue LoadError; end
-
-class OSX::NSObject
-  class << self
-    @@subklasses = {}
-
-    def subklasses
-      @@subklasses
-    end
-  end
-end
-
-begin
-  require 'rubynode'
-  require 'enumerator'
-  # RubyNode is found, we can get the IB metadata by parsing the code. 
-  class OSX::NSObject
-    class << self
-      def collect_ib_metadata(ruby_file)
-        @current_class = nil
-        __parse_nodes(File.read(ruby_file).parse_to_nodes.transform)
-      end
-
-      def __parse_nodes(ary)
-        ary.each_slice(2) { |key, val| __parse_nodes_pair(key, val) }
-      end
-      
-      def __parse_nodes_pair(key, val)
-        case val
-        when Array
-          if val.all? { |e| e.is_a?(Array) }
-            val.each { |p| __parse_nodes(p) }
-          else
-            __parse_nodes(val)
-          end
-        when Hash 
-          case key
-          when :class
-            a = val[:super]
-            if a and a.is_a?(Array) and a[1].is_a?(Hash)
-              # This class inherits from another class, let's memorize the 
-              # class name. We could actually check that the super class is
-              # an Objective-C class, but this would require to load all the
-              # required frameworks.
-              sclass = (a[1][:vid] or a[1][:mid])
-              a = val[:cpath]
-              if sclass and a and a.is_a?(Array) and a[1].is_a?(Hash)
-                @current_class = a[1][:mid]
-                if @current_class
-                  subklasses[@current_class] ||= {}
-                  subklasses[@current_class][:super] = sclass
-                end
-              end
-            end
-          when :fcall
-            case val[:mid]
-            # Memorize IB outlets.
-            when :ns_outlet, :ib_outlet, :ns_outlets, :ib_outlets
-              if @current_class.nil?
-                $stderr.puts "ib_outlet detected without current_class, skipping..."
-              elsif val[:args].is_a?(Array) and !val[:args].empty?
-                c = (subklasses[@current_class][:outlets] ||= [])
-                val[:args][1].each do |key2, val2|
-                  if key2 == :lit and val2.is_a?(Hash) and val2[:lit]
-                    c << val2[:lit]
-                  end
-                end
-              end
-            # Memorize IB actions.
-            when :ib_action
-              if @current_class.nil?
-                $stderr.puts "ib_action detected without current_class, skipping..."
-              elsif val[:args].is_a?(Array) and !val[:args].empty?
-                c = (subklasses[@current_class][:actions] ||= [])
-                a = val[:args][1][0]
-                if val[:args][1].size != 1
-                  $stderr.puts "ib_action called without or with more than one argument, skipping..."
-                elsif a[0] == :lit and 
-                      a[1].is_a?(Hash) and
-                      a[1][:lit]
-                  c << a[1][:lit]
-                end
-              end
-            end
-          end
-          val.each do |key2, val2|
-            if val2.is_a?(Array)
-              __parse_nodes_pair(key2, val2)
-            end
-          end
-        end
-      end
-    end
-  end
-  RUBYNODE_LOADED = true
-rescue LoadError
-  # We don't have a Ruby parser handy, let's evaluate/interpret the code as
-  # a second alternative.
-  class OSX::NSObject
-    class << self
-      @@collect_child_classes = false
-    
-      def ib_outlets(*args)
-        args.each do |arg|
-          log "found outlet #{arg} in #{$current_class}"
-          (subklasses[$current_class][:outlets] ||= []) << arg
-        end
-      end
-    
-      alias_method :ns_outlet,  :ib_outlets
-      alias_method :ib_outlet,  :ib_outlets
-      alias_method :ns_outlets, :ib_outlets
-  
-      def ib_action(name, &blk)
-        log "found action #{name} in #{$current_class}"
-        (subklasses[$current_class][:actions] ||= []) << name
-      end
-    
-      alias_method :_before_classes_nib_inherited, :inherited
-      def inherited(subklass)
-        if @@collect_child_classes
-          unless subklass.to_s == ""
-            log "current class: #{subklass.to_s}"
-            $current_class = subklass.to_s
-            subklasses[$current_class] ||= {}
-            subklasses[$current_class][:super] = subklass.superclass.to_s
-          end
-        end
-        _before_classes_nib_inherited(subklass)
-      end
-
-      def collect_ib_metadata(ruby_file)
-        @@collect_child_classes = true
-        require ruby_file
-        @@collect_child_classes = false 
-      end
-    end
-  end
-  RUBYNODE_LOADED = false 
-end
-
-class ClassesNibPlist
-  attr_reader :plist
-  
-  def initialize(plist_path=nil)
-    @plist_path = plist_path
-    if plist_path and File.exist?(plist_path)
-      plist_data = NSData.alloc.initWithContentsOfFile(plist_path)
-      @plist, format, error = NSPropertyListSerialization.propertyListFromData_mutabilityOption_format_errorDescription(plist_data, NSPropertyListMutableContainersAndLeaves)
-      die "Can't deserialize property list at path '#{plist_path}' : #{error}" if @plist.nil?
-    else
-      @plist = NSMutableDictionary.alloc.init
-    end
-    self
-  end
-  
-  def find_ruby_class(ruby_class)
-    log "Looking for #{ruby_class} in plist"
-    # be nice if NSDictionary had the same methods as hash
-    ruby_class_plist = nil
-    classes = @plist['IBClasses']
-    if classes
-      classes.each do |klass|
-        next unless klass['CLASS'].to_s == ruby_class.to_s
-        ruby_class_plist = klass
-      end
-    else
-      @plist['IBClasses'] = []
-    end
-    if ruby_class_plist.nil?
-      log "Didn't find #{ruby_class} in plist, creating dictionary"
-      # didn't find one, create a new one
-      ruby_class_plist = NSMutableDictionary.alloc.init
-      ruby_class_plist['CLASS'] = ruby_class
-      ruby_class_plist['LANGUAGE'] = 'ObjC' # Hopefully one day we can put Ruby here :)
-      plist['IBClasses'].addObject(ruby_class_plist)
-    end
-    ruby_class_plist
-  end
-
-  def write_plist_data
-    data, error = NSPropertyListSerialization.objc_send \
-      :dataFromPropertyList, @plist,
-      :format, NSPropertyListXMLFormat_v1_0,
-      :errorDescription
-    if data.nil?
-      $stderr.puts error
-      exit 1
-    end
-    data = OSX::NSString.alloc.initWithData_encoding(data, NSUTF8StringEncoding)
-
-    if @plist_path
-      log "Writing updated classes.nib plist back to file"
-      File.open(@plist_path, "w+") { |io| io.puts data }
-    else
-      log "Writing updated classes.nib plist back to standard output"
-      puts data
-    end
-  end
-  
-  def each_class(&block)
-    plist['IBClasses'].each do |klass|
-      next if klass['CLASS'].to_s == 'FirstResponder'
-      yield(klass)
-    end
-  end
-end
-
-class ClassesNibUpdater
-  def self.update_nib(plist_path, ruby_file, sorted_plist)
-    plist = ClassesNibPlist.new(plist_path)
-    updater = new
-    updater.find_classes_outlets_and_actions(ruby_file)
-    log "Found #{NSObject.subklasses.size} classes in #{ruby_file}"
-    NSObject.subklasses.each do |klass, data|
-      ruby_class_plist = plist.find_ruby_class(klass)
-      updater.update_superclass(klass, ruby_class_plist)
-      updater.add_outlets_and_actions_to_plist(klass, ruby_class_plist, 
-        sorted_plist)
-    end
-    plist.write_plist_data
-  end
- 
-  # we've taken over ns_outlets and ns_actions above, so just requiring the
-  # class will cause it to be parsed an the methods to be called so we can get
-  # at them
-  def find_classes_outlets_and_actions(ruby_file)
-    log "Getting classes, outlets and actions"
-    NSObject.collect_ib_metadata(ruby_file)
-  end
-
-  def update_superclass(ruby_class, ruby_class_plist)
-    superklass = NSObject.subklasses[ruby_class][:super].to_s.sub(/^OSX::/, '')
-    unless RUBYNODE_LOADED
-      # If the class has a superclass which isn't defined in the classes in the nib/ib
-      # then the class will still not show up. Because we can assume that it will be a
-      # descendant of NSObject use that as a default if the superclass can't be found.
-      begin
-        Object.const_get(superklass)
-      rescue NameError
-        superklass = :NSObject
-      end
-    end
-    ruby_class_plist.setObject_forKey(superklass, "SUPERCLASS")
-  end
-  
-  def add_outlets_and_actions_to_plist(klass, ruby_class_plist, sorted_plist)
-    log "Adding outlets and actions to plist for #{klass}"
-   
-    [:outlets, :actions].each do |sym|
-      cont = NSObject.subklasses[klass][sym]
-      next if cont.nil?
-      unless sorted_plist
-        hash = {}
-        cont.each do |val|
-          log "adding #{sym.to_s} #{val}"
-          hash[val] = 'id' 
-        end 
-        cont = hash
-      end
-      ruby_class_plist[sym.to_s.upcase] = cont unless cont.empty?
-    end
-  end
-end
-
-class ClassesNibCreator
-  def self.create_from_nib(plist_path, output_dir)
-    creator = new
-    plist = ClassesNibPlist.new(plist_path)
-    plist.each_class { |klass| creator.create_class(output_dir, klass) }
-  end
-  
-  def initialize
-    @class_template = ERB.new(DATA.read, 0, "-")
-  end
-  
-  def create_class(output_dir, klass)
-    @class_name = klass['CLASS']
-    output_file = File.join(output_dir, "#{@class_name}.rb")
-    if File.exists?(output_file)
-      log "#{output_file} exists, skipping"
-      return
-    end
-    @superclass = klass['SUPERCLASS']
-    if klass['OUTLETS'].nil?
-      @outlets = []
-    else
-      @outlets = klass['OUTLETS'].allKeys.to_a
-    end
-    if klass['ACTIONS'].nil?
-      @actions = []
-    else
-      @actions = klass['ACTIONS'].allKeys.to_a
-    end
-    log "Writing #{@class_name} to #{output_file}"
-    File.open(output_file, "w+") do |file|
-      file.write(@class_template.result(binding))
-    end 
-  end
-end
-
-require 'optparse'
-class Options
-  def self.parse(args)
-    options = {}
-    options[:update] = false
-    options[:create] = false
-    options[:plist] = false
-    options[:sorted_plist] = false
-    opts = OptionParser.new do |opts|
-      opts.banner = "Usage: #{__FILE__} [options]"
-      opts.on("-u", "--update", "Update the classes.nib file from a Ruby",
-                                "class (requires -f and -n options)") do |_|
-        options[:update] = true
-      end
-      opts.on("-c", "--create", "Create new Ruby classes from a nib",
-                                "(requires -d and -n options)") do |_|
-        options[:create] = true
-      end
-      opts.on("-p", "--plist", "Dump on standard output a property list", "of the Ruby class IB metadata",
-                               "(requires -f option)") do |_|
-        options[:plist] = true
-      end
-      opts.on("-s", "--sorted-plist", 
-        "Dump a property list where the actions and",
-        "outlets are in sorted collections.",
-        "NOT compatible with the nib format.",
-         "(requires -p and -f options)") do |_|
-        options[:sorted_plist] = true
-      end
-      opts.on("-d", "--directory PATH", "Path to directory to create Ruby classes", "(requires -c option)") do |dir|
-        options[:dir] = dir == "" ? nil : dir
-      end
-      opts.on("-f", "--file PATH", "Path to file containing Ruby class(es)", "(requires -u or -p options)") do |file|
-        options[:file] = case file
-          when '' then nil
-          when '-' then '/dev/stdin'
-          else file
-        end
-      end
-      opts.on("-n", "--nib PATH", "Path to .nib to update") do |nib|
-        options[:nib] = nib == "" ? nil : nib
-      end
-      opts.on_tail("-h", "--help", "Show this message") do
-        puts opts
-        exit
-      end  
-    end
-    opts.parse!(args)
-    unless options[:update] || options[:create] || options[:plist]
-      puts "Must supply --update or --create or --plist"
-      exit_with_opts(opts)
-    end
-    if [:update, :create, :plist].map { |x| (options[x] or nil) }.compact.size > 1
-      puts "Can only specify one of --update or --create or --plist"
-      exit_with_opts(opts)
-    end
-    if options[:update]
-      if options[:file].nil? || options[:nib].nil?
-        puts "Must supply the ruby file and the nib paths"
-        exit_with_opts(opts)
-      end
-    end
-    if options[:create]
-      if options[:dir].nil? || options[:nib].nil?
-        puts "Must supply the output directory and the nib paths"
-        exit_with_opts(opts)
-      end
-    end
-    if options[:plist]
-      if options[:file].nil?
-        puts "Must supply the ruby file"
-        exit_with_opts(opts)
-      end
-    end
-    if options[:sorted_plist]
-      unless options[:plist]
-        puts "Must specify plist format"
-        exit_with_opts(opts)
-      end
-    end
-    options
-  end
-  
-  def self.exit_with_opts(opts)
-    puts opts
-    exit
-  end
-end
-
-options = Options.parse(ARGV)
-nib_plist = 
-  if options[:nib]
-    "#{options[:nib]}/classes.nib"
-  else
-    nil 
-  end
-if options[:update] || options[:plist]
-  ClassesNibUpdater.update_nib(nib_plist, options[:file], 
-    options[:sorted_plist])
-elsif options[:create]
-  ClassesNibCreator.create_from_nib(nib_plist, options[:dir])
-else
-  puts "Unknown options"
-end
-
-# wierd indentation here seems to be needed to produce nice output
-__END__
-require 'osx/cocoa'
-include OSX
-
-class <%= @class_name %> < <%= @superclass %>
-  <% unless @outlets.size == 0 -%>
-  ib_outlets <%= @outlets.map { |o| ":#{o}" }.join(", ") -%>
-  <% end -%>
-  <% @actions.each do |action| %>
-  ib_action :<%= action %> do |sender|
-    NSLog("Need to implement <%= @class_name%>.<%= action %>")
-  end
-  <% end %>
-end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20110320/c93246f6/attachment-0001.html>


More information about the macruby-changes mailing list