From 264de9de98a5dcc0a0c618ac0d9f9e5a914d1030 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 14 May 2025 09:26:54 +0200 Subject: [PATCH 1/8] Don't load IRB when LogLevel=Trace on windows --- ruby/bindings/InitRubyBindings.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruby/bindings/InitRubyBindings.cpp b/ruby/bindings/InitRubyBindings.cpp index 5afa3be03c7..e82c2318131 100644 --- a/ruby/bindings/InitRubyBindings.cpp +++ b/ruby/bindings/InitRubyBindings.cpp @@ -545,6 +545,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 +656,7 @@ end end)ruby"; openstudio::evalString(irbPatch); +#endif } void setupEmbeddedGemsClearEnvVars() { From a32143d98d270b0cb6bcbd5187b0ade1847ebf6f Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 14 May 2025 09:28:35 +0200 Subject: [PATCH 2/8] OpenStudio.get_absolute_path is broken when not embedded --- ruby/engine/embedded_help.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/engine/embedded_help.rb b/ruby/engine/embedded_help.rb index c1322e3f25f..098cf3dd460 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 From e29db41355f8aa7e4c3f4771afb8db2be335399b Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 14 May 2025 09:51:21 +0200 Subject: [PATCH 3/8] Fixup override of Dir.glob * rubygems.rb calls Gem::Specification.load_defaults * https://github.com/ruby/ruby/blob/f91480d7a671b1b114270a4b5e4d3c5aa6dabce9/lib/rubygems.rb#L1355 * That uses each_spec([Gem.default_specifications_dir]), * Gem.default_specifications_dir is now `:/ruby/gems/3.2.0/specifications/default"` * That ends up calling rubygems/util.rb#glob_files_in_dir * https://github.com/ruby/ruby/blob/f91480d7a671b1b114270a4b5e4d3c5aa6dabce9/lib/rubygems/util.rb#L100-L102 * Essentially calling `Dir.glob('*.gemspec', ':/ruby/gems/3.2.0/specifications/default')` --- ruby/engine/embedded_help.rb | 76 ++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/ruby/engine/embedded_help.rb b/ruby/engine/embedded_help.rb index 098cf3dd460..4ff2aafdbfe 100644 --- a/ruby/engine/embedded_help.rb +++ b/ruby/engine/embedded_help.rb @@ -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,61 @@ def self.glob(pattern, *args, **options) pattern_array = pattern end - #puts "Dir.glob pattern = #{pattern}, pattern_array = #{pattern_array}, args = #{args}, options = #{options}" + 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 + + 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 = false result = [] pattern_array.each do |pattern| - if pattern.to_s.chars.first == ':' - - # DLM: seems like this is needed for embedded paths, possibly due to leading ':' character? - override_args_extglob = true - - #puts "searching embedded files for #{pattern}" - absolute_pattern = OpenStudio.get_absolute_path(pattern) - #puts "absolute_pattern #{absolute_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) + 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 block_given? From 04dd5f17a948f84f79cc178db90ab3eb426db905 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 14 May 2025 11:55:34 +0200 Subject: [PATCH 4/8] Turn off debugging in glob --- ruby/engine/embedded_help.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/engine/embedded_help.rb b/ruby/engine/embedded_help.rb index 4ff2aafdbfe..c3b83727c1b 100644 --- a/ruby/engine/embedded_help.rb +++ b/ruby/engine/embedded_help.rb @@ -629,7 +629,7 @@ def self.[](*args) 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') + # debug = !base.nil? && base.start_with?(':/ruby/gems/3.2.0/specifications/default') pattern_array = [] if pattern.is_a? String pattern_array = [pattern] From 400c30a02cb066ed901d1fc9c637d38cb8e01f9c Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 14 May 2025 11:56:16 +0200 Subject: [PATCH 5/8] Fixup fnmatch: was not finding IRB in Trace loglevel because of it --- ruby/engine/embedded_help.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruby/engine/embedded_help.rb b/ruby/engine/embedded_help.rb index c3b83727c1b..80dba3ea7b9 100644 --- a/ruby/engine/embedded_help.rb +++ b/ruby/engine/embedded_help.rb @@ -668,6 +668,8 @@ def self.glob(pattern, _flags = 0, flags: _flags, base: nil, sort: true) absolute_pattern = if pattern.to_s.chars.first == ':' OpenStudio.get_absolute_path(pattern) + elsif !base.nil? + File.expand_path(pattern, base) else pattern end From 4bf26cb79c7440b217bfa2d0203a14263ff9dbc6 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 14 May 2025 12:37:48 +0200 Subject: [PATCH 6/8] Add some notes for future me/kyle --- ruby/bindings/InitRubyBindings.cpp | 13 +++++++++++++ ruby/engine/embedded_help.rb | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/ruby/bindings/InitRubyBindings.cpp b/ruby/bindings/InitRubyBindings.cpp index e82c2318131..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 diff --git a/ruby/engine/embedded_help.rb b/ruby/engine/embedded_help.rb index 80dba3ea7b9..538c0ef8376 100644 --- a/ruby/engine/embedded_help.rb +++ b/ruby/engine/embedded_help.rb @@ -698,6 +698,10 @@ def self.glob(pattern, _flags = 0, flags: _flags, base: nil, sort: true) end + if debug + puts result + end + if block_given? return yield(result) else From 723ca8d8b4db25adb9724b176ebb227169e0ceab Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 14 May 2025 15:03:04 +0200 Subject: [PATCH 7/8] put back override for FNM_EXTGLOB so CLITest-test_embedded_help-dir_glob works --- ruby/engine/embedded_help.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ruby/engine/embedded_help.rb b/ruby/engine/embedded_help.rb index 538c0ef8376..6e0c5f9d7f4 100644 --- a/ruby/engine/embedded_help.rb +++ b/ruby/engine/embedded_help.rb @@ -661,8 +661,12 @@ def self.glob(pattern, _flags = 0, flags: _flags, base: nil, sort: true) end # DLM: seems like this is needed for embedded paths, possibly due to leading ':' character? - override_args_extglob = false + # 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 + flags = flags | File::FNM_EXTGLOB if override_args_extglob result = [] pattern_array.each do |pattern| From 6667e19cbe61e716686652cc4aa541f6a75aace2 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Wed, 14 May 2025 15:18:46 +0200 Subject: [PATCH 8/8] #5216 - Add a basic `openstudio --loglevel Trace ruby_version` --- src/cli/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) 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 )