diff --git a/ruby/bindings/InitRubyBindings.cpp b/ruby/bindings/InitRubyBindings.cpp index 5afa3be03c7..0d0a7702170 100644 --- a/ruby/bindings/InitRubyBindings.cpp +++ b/ruby/bindings/InitRubyBindings.cpp @@ -534,10 +534,23 @@ if RbConfig::CONFIG['arch'] =~ /x64-mswin64/ end # load embedded ruby gems +# This loads :/ruby/gems/3.2.0/specifications/default require 'rubygems' require 'rubygems/version' Gem::Platform.local +# Note that we have three standard locations where we have gemspecs +# +# 1. This is the Ruby-built in stuff (eg; csv, fileutils, irb, json, reline, etc) +#':/ruby/gems/3.2.0/specifications/default', +# +# 2. This is the Ruby-built in stuff that's brought in via gems/bundled_gems (https://github.com/ruby/ruby/blob/f91480d7a671b1b114270a4b5e4d3c5aa6dabce9/gems/bundled_gems) +# (rbs, debug, matrix, rexml, etc) +# ':/ruby/gems/3.2.0/specifications', +# +# 3. Where we have the openstudio-gems gemspecs (openstudio-standards, etc) +#':/ruby/3.2.0/specifications', + if original_arch RbConfig::CONFIG['arch'] = original_arch end @@ -545,6 +558,7 @@ end openstudio::evalString(initScript); +#ifndef _WIN32 // no io/console available const std::string irbPatch = R"ruby(if $logger.trace? require 'irb' require 'irb/lc/error' @@ -655,6 +669,7 @@ end end)ruby"; openstudio::evalString(irbPatch); +#endif } void setupEmbeddedGemsClearEnvVars() { diff --git a/ruby/engine/embedded_help.rb b/ruby/engine/embedded_help.rb index c1322e3f25f..6e0c5f9d7f4 100644 --- a/ruby/engine/embedded_help.rb +++ b/ruby/engine/embedded_help.rb @@ -36,7 +36,7 @@ def self.get_absolute_path(p) end absolute_path = ':' + absolute_path else - absolute_path = File.expand_path p2 + absolute_path = File.expand_path p end return absolute_path end @@ -626,8 +626,10 @@ def self.[](*args) end end - def self.glob(pattern, *args, **options) + def self.glob(pattern, _flags = 0, flags: _flags, base: nil, sort: true) + debug = false + # debug = !base.nil? && base.start_with?(':/ruby/gems/3.2.0/specifications/default') pattern_array = [] if pattern.is_a? String pattern_array = [pattern] @@ -637,45 +639,71 @@ def self.glob(pattern, *args, **options) pattern_array = pattern end - #puts "Dir.glob pattern = #{pattern}, pattern_array = #{pattern_array}, args = #{args}, options = #{options}" - override_args_extglob = false - - result = [] - pattern_array.each do |pattern| + pattern_has_embedded = pattern_array.any? {|p| p.to_s.chars.first == ':'} + base_has_embedded = (!base.nil? && base.to_s.chars.first == ':') + if !pattern_has_embedded && !base_has_embedded + # puts "Original glob" + return self.original_glob(pattern, flags: flags, base: base, sort: sort) + end - if pattern.to_s.chars.first == ':' + absolute_base = if base.nil? + nil + else + OpenStudio.get_absolute_path(base) + end + if debug + puts "pattern_array=#{pattern_array}" + puts "base=#{base}" + puts "flags=#{flags}" + puts "pattern_has_embedded=#{pattern_has_embedded}" + puts "base_has_embedded=#{base_has_embedded}" + puts "absolute_base=#{absolute_base}" + end - # DLM: seems like this is needed for embedded paths, possibly due to leading ':' character? - override_args_extglob = true + # DLM: seems like this is needed for embedded paths, possibly due to leading ':' character? + # JM (2025): Seems like fnmatch behaves differently than Dir.glob + # fnmatch specifically needs EXTGLOB to allow patterns like '{a,b}' while + # glob seems to allow that directly + override_args_extglob = true - #puts "searching embedded files for #{pattern}" - absolute_pattern = OpenStudio.get_absolute_path(pattern) - #puts "absolute_pattern #{absolute_pattern}" + flags = flags | File::FNM_EXTGLOB if override_args_extglob + result = [] + pattern_array.each do |pattern| - EmbeddedScripting::fileNames.each do |name| - absolute_path = OpenStudio.get_absolute_path(name) + absolute_pattern = if pattern.to_s.chars.first == ':' + OpenStudio.get_absolute_path(pattern) + elsif !base.nil? + File.expand_path(pattern, base) + else + pattern + end + if debug + puts "searching embedded files for #{pattern}" + puts "absolute_pattern #{absolute_pattern}" + end - if override_args_extglob - if File.fnmatch( absolute_pattern, absolute_path, File::FNM_EXTGLOB ) - #puts "#{absolute_path} is a match!" - result << absolute_path - end - else - if File.fnmatch( absolute_pattern, absolute_path, *args, **options ) - #puts "#{absolute_path} is a match!" - result << absolute_path - end + EmbeddedScripting::fileNames.each do |name| + absolute_path = OpenStudio.get_absolute_path(name) + if base_has_embedded + next unless absolute_path.start_with?(absolute_base) + if debug + puts "name=#{name}, absolute_path=#{absolute_path}" + puts "absolute_path.start_with?(absolute_base)=#{absolute_path.start_with?(absolute_base)}" end - end - else - if override_args_extglob - result.concat(self.original_glob(pattern, File::FNM_EXTGLOB)) - else - result.concat(self.original_glob(pattern, *args, **options)) + #if override_args_extglob + # if File.fnmatch( absolute_pattern, absolute_path, File::FNM_EXTGLOB ) + if File.fnmatch(absolute_pattern, absolute_path, flags) + #puts "#{absolute_path} is a match!" + result << absolute_path end end + + end + + if debug + puts result end if block_given? diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt index d424ca2874d..cf114be99a0 100644 --- a/src/cli/CMakeLists.txt +++ b/src/cli/CMakeLists.txt @@ -120,6 +120,10 @@ if(BUILD_TESTING) COMMAND $ ruby_version ) + add_test(NAME OpenStudioCLI.ruby_version_trace + COMMAND $ --loglevel Trace ruby_version + ) + add_test(NAME OpenStudioCLI.python_version COMMAND $ python_version )