From 81b9055f05d373eba07759a3d10f8493b8d9dc64 Mon Sep 17 00:00:00 2001 From: Andy Gradl Date: Fri, 1 Aug 2025 10:56:34 -0600 Subject: [PATCH 1/2] optimize workspace lookup, update gemspec --- lib/rally_api/rally_rest_json.rb | 20 ++++++++------------ rally_api.gemspec | 10 +++++----- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/lib/rally_api/rally_rest_json.rb b/lib/rally_api/rally_rest_json.rb index 78c4e0e..a9f4d25 100644 --- a/lib/rally_api/rally_rest_json.rb +++ b/lib/rally_api/rally_rest_json.rb @@ -132,18 +132,14 @@ def debug_logging_off @rally_connection.low_debug = false end - def find_workspace(workspace_name, matcher_ref = 'Name') - # use matcher_ref to search for 'Name' or '_ref' - sub = self.user["Subscription"].read({:fetch => "Workspaces,Name,State"}) - workspace = nil - sub.Workspaces.each do |ws| - #ws.read - if (ws[matcher_ref] == workspace_name) && (ws["State"] == "Open") - workspace = ws - break #doing a break for performance some customers have 100+ workspaces - no need to do the others - end - end - workspace + def find_workspace(workspace_name_or_ref, matcher_ref = 'Name') + q = RallyAPI::RallyQuery.new + q.type = "workspace" + q.fetch = true # not ideal, but needed to be backwards compatible + q.query_string = "(State = \"Open\")" + q.workspace = { "_ref" => "null" } + results = find(q) + results.select { |result| result[matcher_ref] == workspace_name_or_ref }.first end def find_project(workspace_object, project_name) diff --git a/rally_api.gemspec b/rally_api.gemspec index d012bb5..8d8f9fc 100644 --- a/rally_api.gemspec +++ b/rally_api.gemspec @@ -16,11 +16,11 @@ Gem::Specification.new do |s| s.add_dependency('httpclient', '2.6.0.1') - s.add_development_dependency('bundler', '2.2.33') - s.add_development_dependency('rake', '12.3.4') - s.add_development_dependency('rspec', '3.1.0') - s.add_development_dependency('simplecov', '0.9.1') - s.add_development_dependency('pry', '0.10.1') + s.add_development_dependency('bundler', '~> 2.2') + s.add_development_dependency('rake', '~> 13.0') + s.add_development_dependency('rspec', '~> 3.1') + s.add_development_dependency('simplecov', '~> 0.9') + s.add_development_dependency('pry', '~> 0.10') #s.files = `git ls-files`.split("\n") s.files = %w(README.md LICENSE Gemfile rally_api.gemspec Rakefile) + Dir.glob("{lib}/**/*.rb") From 20938b0aa967b87069bd6409b4eddca71a575b3e Mon Sep 17 00:00:00 2001 From: Andy Gradl Date: Fri, 1 Aug 2025 11:27:04 -0600 Subject: [PATCH 2/2] query for all fetching just name, then hydrate the match --- lib/rally_api/rally_rest_json.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/rally_api/rally_rest_json.rb b/lib/rally_api/rally_rest_json.rb index a9f4d25..e48eecf 100644 --- a/lib/rally_api/rally_rest_json.rb +++ b/lib/rally_api/rally_rest_json.rb @@ -135,11 +135,17 @@ def debug_logging_off def find_workspace(workspace_name_or_ref, matcher_ref = 'Name') q = RallyAPI::RallyQuery.new q.type = "workspace" - q.fetch = true # not ideal, but needed to be backwards compatible + q.fetch = "Name,ObjectID" q.query_string = "(State = \"Open\")" q.workspace = { "_ref" => "null" } results = find(q) - results.select { |result| result[matcher_ref] == workspace_name_or_ref }.first + match = results.select { |result| result[matcher_ref] == workspace_name_or_ref }.first + return nil unless match + + q.query_string = "(ObjectID = \"#{match["ObjectID"]}\")" + q.fetch = true # result must be a fully hydrated object + results = find(q) + results.first end def find_project(workspace_object, project_name)