From 02c9d610a064d3cb3920e0effbb251b54d037215 Mon Sep 17 00:00:00 2001 From: Jennifer Vendetti Date: Tue, 14 Apr 2026 18:01:55 -0700 Subject: [PATCH 1/3] Fix nil error in Analytics.last_month when ontology data is missing Use Hash#dig for nil-safe nested hash access instead of chained bracket lookups, which raised NoMethodError when analytics[ont] was nil. Defaults to 0 views and logs a debug message when data is missing. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/ontologies_api_client/analytics.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/ontologies_api_client/analytics.rb b/lib/ontologies_api_client/analytics.rb index cbb85ac..93c2f04 100644 --- a/lib/ontologies_api_client/analytics.rb +++ b/lib/ontologies_api_client/analytics.rb @@ -1,6 +1,7 @@ module LinkedData::Client class Analytics HTTP = LinkedData::Client::HTTP + LOGGER = Logger.new($stdout) attr_accessor :onts, :date @@ -18,7 +19,11 @@ def self.last_month analytics.delete(:context) onts = [] analytics.keys.each do |ont| - views = analytics[ont][:"#{year_num}"][:"#{month_num}"] + views = analytics.dig(ont, :"#{year_num}", :"#{month_num}") + if views.nil? + LOGGER.debug("Analytics data missing for ontology: #{ont}, year: #{year_num}, month: #{month_num}") + views = 0 + end onts << {ont: ont, views: views} end data.onts = onts From d1a1a34ff5219b25904c7c1a876530d435cfb32a Mon Sep 17 00:00:00 2001 From: Jennifer Vendetti Date: Tue, 14 Apr 2026 18:12:35 -0700 Subject: [PATCH 2/3] Skip failing test blocked by Cloudflare --- test/models/test_class.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/models/test_class.rb b/test/models/test_class.rb index 5b597df..a763b1d 100644 --- a/test/models/test_class.rb +++ b/test/models/test_class.rb @@ -20,6 +20,8 @@ def test_find # Test PURL generation for a class in an OWL format ontology def test_purl_owl + skip 'Disable until #41 is fixed: https://github.com/ncbo/ontologies_api_ruby_client/issues/41' + cls = LinkedData::Client::Models::Class.find( 'http://bioontology.org/ontologies/Activity.owl#Activity', 'https://data.bioontology.org/ontologies/BRO' From b854d0b811faea5e784666efcdc1efda952193c0 Mon Sep 17 00:00:00 2001 From: Jennifer Vendetti Date: Wed, 15 Apr 2026 09:45:17 -0700 Subject: [PATCH 3/3] Fix some RuboCop warnings --- lib/ontologies_api_client/analytics.rb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/ontologies_api_client/analytics.rb b/lib/ontologies_api_client/analytics.rb index 93c2f04..9eeb60d 100644 --- a/lib/ontologies_api_client/analytics.rb +++ b/lib/ontologies_api_client/analytics.rb @@ -5,26 +5,26 @@ class Analytics attr_accessor :onts, :date - def self.all(params = {}) + def self.all(_params = {}) get(:analytics) end def self.last_month - data = self.new + data = new data.date = last_month = DateTime.now - 1.month year_num = last_month.year month_num = last_month.month - analytics = get(:analytics, {year: year_num, month: month_num}).to_h + analytics = get(:analytics, { year: year_num, month: month_num }).to_h analytics.delete(:links) analytics.delete(:context) onts = [] - analytics.keys.each do |ont| + analytics.each_key do |ont| views = analytics.dig(ont, :"#{year_num}", :"#{month_num}") if views.nil? LOGGER.debug("Analytics data missing for ontology: #{ont}, year: #{year_num}, month: #{month_num}") views = 0 end - onts << {ont: ont, views: views} + onts << { ont: ont, views: views } end data.onts = onts data @@ -34,9 +34,8 @@ def self.last_month def self.get(path, params = {}) path = path.to_s - path = "/"+path unless path.start_with?("/") + path = "/#{path}" unless path.start_with?('/') HTTP.get(path, params) end - end -end \ No newline at end of file +end