Class: RbVmomi::TypeLoader
- Inherits:
-
Object
- Object
- RbVmomi::TypeLoader
- Defined in:
- lib/rbvmomi/type_loader.rb
Instance Method Summary collapse
- #add_types(types) ⇒ Object
- #get(name) ⇒ Object
- #has?(name) ⇒ Boolean
-
#initialize(fn, extension_dirs, namespace) ⇒ TypeLoader
constructor
A new instance of TypeLoader.
- #preload ⇒ Object
-
#reload_extensions ⇒ Object
Reload all extensions for loaded VMODL types.
-
#reload_extensions_dir(path) ⇒ Object
Reload all extensions for loaded VMODL types from the given directory.
- #typenames ⇒ Object
Constructor Details
#initialize(fn, extension_dirs, namespace) ⇒ TypeLoader
Returns a new instance of TypeLoader.
11 12 13 14 15 16 17 18 19 20 21 22 23 |
# File 'lib/rbvmomi/type_loader.rb', line 11 def initialize fn, extension_dirs, namespace @extension_dirs = extension_dirs @namespace = namespace @lock = Monitor.new @db = {} @id2wsdl = {} @loaded = {} add_types Hash[BasicTypes::BUILTIN.map { |k| [k, nil] }] vmodl_database = File.open(fn, 'r') { |io| Marshal.load io } vmodl_database.reject! { |k, v| k =~ /^_/ } add_types vmodl_database preload end |
Instance Method Details
#add_types(types) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/rbvmomi/type_loader.rb', line 76 def add_types types @lock.synchronize do @db.merge! types @db = Hash[@db.map do |name, value| value['wsdl_name'] ||= name if value first_char = name[0].chr name = '%s%s' % [first_char.upcase, name[1..-1]] if first_char.downcase == first_char [name, value] end] end end |
#get(name) ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/rbvmomi/type_loader.rb', line 58 def get name raise "name '#{name}' is #{name.class} expecting String" unless name.is_a? String first_char = name[0].chr name = '%s%s' % [first_char.upcase, name[1..-1]] if first_char.downcase == first_char return @loaded[name] if @loaded.member? name @lock.synchronize do return @loaded[name] if @loaded.member? name klass = make_type(name) @namespace.const_set name, klass load_extension name @loaded[name] = klass end end |
#has?(name) ⇒ Boolean
52 53 54 55 56 |
# File 'lib/rbvmomi/type_loader.rb', line 52 def has? name raise unless name.is_a? String @db.member?(name) or BasicTypes::BUILTIN.member?(name) end |
#preload ⇒ Object
25 26 27 28 29 |
# File 'lib/rbvmomi/type_loader.rb', line 25 def preload names = (@namespace.constants + Object.constants).map(&:to_s).uniq. select { |x| has? x } names.each { |x| get(x) } end |
#reload_extensions ⇒ Object
Reload all extensions for loaded VMODL types
32 33 34 35 36 |
# File 'lib/rbvmomi/type_loader.rb', line 32 def reload_extensions @extension_dirs.each do |path| reload_extensions_dir path end end |
#reload_extensions_dir(path) ⇒ Object
Reload all extensions for loaded VMODL types from the given directory
39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/rbvmomi/type_loader.rb', line 39 def reload_extensions_dir path loaded = Set.new(typenames.select { |x| @namespace.const_defined? x }) Dir.open(path) do |dir| dir.each do |file| next unless file =~ /\.rb$/ next unless loaded.member? $` file_path = File.join(dir, file) load file_path end end end |
#typenames ⇒ Object
88 89 90 |
# File 'lib/rbvmomi/type_loader.rb', line 88 def typenames @db.keys end |