kettle-dev 2.2.13 → 2.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -32,6 +32,9 @@ module Kettle
32
32
  COMMENT_REASON = "update_version_comment"
33
33
  DEFAULT_UPGRADE_LEVEL = "patch"
34
34
  DEFAULT_CACHE_TTL_SECONDS = 24 * 60 * 60
35
+ DEFAULT_HTTP_OPEN_TIMEOUT_SECONDS = 5
36
+ DEFAULT_HTTP_READ_TIMEOUT_SECONDS = 10
37
+ DEFAULT_HTTP_REFRESH_TIMEOUT_SECONDS = 20
35
38
  VALID_UPGRADE_LEVELS = %w[major minor patch].freeze
36
39
  VERSION_COMMENT_SUFFIX_RE = /\A\s+#\s*v?(?<version>\d+(?:\.\d+\.\d+(?:[-.]?[0-9A-Za-z.-]+)?)?)/
37
40
  VERSION_COMMENT_REPLACEMENT_RE = /\A(?<prefix>\s+#\s*)v?\d+(?:\.\d+\.\d+(?:[-.]?[0-9A-Za-z.-]+)?)?/
@@ -1100,12 +1103,15 @@ module Kettle
1100
1103
 
1101
1104
  # Lightweight GitHub API client for commit and release SHA resolution.
1102
1105
  class GitHubClient
1103
- def initialize(token:, api_base:, user_agent:, persistent_cache: nil, refresh_cache: false)
1106
+ def initialize(token:, api_base:, user_agent:, persistent_cache: nil, refresh_cache: false, open_timeout: DEFAULT_HTTP_OPEN_TIMEOUT_SECONDS, read_timeout: DEFAULT_HTTP_READ_TIMEOUT_SECONDS, refresh_timeout: DEFAULT_HTTP_REFRESH_TIMEOUT_SECONDS)
1104
1107
  @token = token
1105
1108
  @api_base = api_base
1106
1109
  @user_agent = user_agent
1107
1110
  @persistent_cache = persistent_cache
1108
1111
  @refresh_cache = refresh_cache
1112
+ @open_timeout = open_timeout
1113
+ @read_timeout = read_timeout
1114
+ @refresh_timeout = refresh_timeout
1109
1115
  @commit_cache = {}
1110
1116
  @release_cache = {}
1111
1117
  end
@@ -1114,58 +1120,31 @@ module Kettle
1114
1120
  return [] if repo_ref.to_s.empty?
1115
1121
  return @release_cache[repo_ref] if @release_cache.key?(repo_ref)
1116
1122
 
1123
+ stale = nil
1117
1124
  unless @refresh_cache
1118
1125
  cached = @persistent_cache&.versions_for_repo(repo_ref, fresh: true)
1119
1126
  if cached
1120
1127
  @release_cache[repo_ref] = cached
1121
1128
  return cached
1122
1129
  end
1130
+ stale = @persistent_cache&.versions_for_repo(repo_ref, fresh: false)
1123
1131
  end
1124
1132
 
1125
- data = request_json("/repos/#{repo_ref}/releases?per_page=100")
1126
- unless data.is_a?(Array)
1127
- fallback = @persistent_cache&.versions_for_repo(repo_ref, fresh: false)
1128
- return fallback if fallback
1133
+ releases = nil
1134
+ Timeout.timeout(@refresh_timeout) do
1135
+ data = request_json("/repos/#{repo_ref}/releases?per_page=100")
1136
+ return cached_versions(repo_ref, stale) unless data.is_a?(Array)
1129
1137
 
1130
- return []
1131
- end
1132
-
1133
- tag_shas = tag_ref_shas(repo_ref)
1134
- releases = data.filter_map do |release|
1135
- next unless release.is_a?(Hash)
1136
-
1137
- tag = release["tag_name"].to_s
1138
- parsed = parse_release_version_text(tag)
1139
- next unless parsed
1138
+ tag_shas = tag_ref_shas(repo_ref)
1139
+ return cached_versions(repo_ref, stale) unless tag_shas
1140
1140
 
1141
- {
1142
- tag: tag,
1143
- version_obj: parsed,
1144
- version: parsed.to_s,
1145
- sha: tag_shas[tag]
1146
- }
1141
+ releases = build_release_versions(data, tag_shas)
1147
1142
  end
1148
- released_tags = releases.each_with_object({}) { |release, memo| memo[release[:tag]] = true }
1149
- tag_versions = tag_shas.filter_map do |tag, sha|
1150
- next if released_tags[tag]
1151
-
1152
- parsed = parse_release_version_text(tag)
1153
- next unless parsed
1154
-
1155
- {
1156
- tag: tag,
1157
- version_obj: parsed,
1158
- version: parsed.to_s,
1159
- sha: sha
1160
- }
1161
- end
1162
- releases.concat(tag_versions)
1163
-
1164
- releases.sort_by! { |release| release[:version_obj] }
1165
- releases.reverse!
1166
1143
  @persistent_cache&.write_versions(repo_ref, releases)
1167
1144
  @release_cache[repo_ref] = releases
1168
1145
  releases
1146
+ rescue Timeout::Error
1147
+ cached_versions(repo_ref, stale)
1169
1148
  end
1170
1149
 
1171
1150
  def commit_sha(repo_ref, ref)
@@ -1203,6 +1182,48 @@ module Kettle
1203
1182
 
1204
1183
  private
1205
1184
 
1185
+ def cached_versions(repo_ref, stale)
1186
+ versions = stale || []
1187
+ @release_cache[repo_ref] = versions
1188
+ versions
1189
+ end
1190
+
1191
+ def build_release_versions(data, tag_shas)
1192
+ releases = data.filter_map do |release|
1193
+ next unless release.is_a?(Hash)
1194
+
1195
+ tag = release["tag_name"].to_s
1196
+ parsed = parse_release_version_text(tag)
1197
+ next unless parsed
1198
+
1199
+ {
1200
+ tag: tag,
1201
+ version_obj: parsed,
1202
+ version: parsed.to_s,
1203
+ sha: tag_shas[tag]
1204
+ }
1205
+ end
1206
+ released_tags = releases.each_with_object({}) { |release, memo| memo[release[:tag]] = true }
1207
+ tag_versions = tag_shas.filter_map do |tag, sha|
1208
+ next if released_tags[tag]
1209
+
1210
+ parsed = parse_release_version_text(tag)
1211
+ next unless parsed
1212
+
1213
+ {
1214
+ tag: tag,
1215
+ version_obj: parsed,
1216
+ version: parsed.to_s,
1217
+ sha: sha
1218
+ }
1219
+ end
1220
+ releases.concat(tag_versions)
1221
+
1222
+ releases.sort_by! { |release| release[:version_obj] }
1223
+ releases.reverse!
1224
+ releases
1225
+ end
1226
+
1206
1227
  def parse_release_version_text(value)
1207
1228
  normalized = value.to_s.sub(/\A[vV]/, "")
1208
1229
  return nil unless normalized.match?(/\A(?:\d+|\d+\.\d+\.\d+(?:[-.]?[0-9A-Za-z.-]+)?)\z/)
@@ -1214,13 +1235,15 @@ module Kettle
1214
1235
 
1215
1236
  def tag_ref_shas(repo_ref)
1216
1237
  data = request_json("/repos/#{repo_ref}/git/matching-refs/tags/")
1217
- return {} unless data.is_a?(Array)
1238
+ return nil unless data.is_a?(Array)
1218
1239
 
1219
1240
  data.each_with_object({}) do |entry, memo|
1220
1241
  ref = entry["ref"].to_s
1221
1242
  next unless ref.start_with?("refs/tags/")
1222
1243
 
1223
1244
  tag = ref.sub(%r{\Arefs/tags/}, "")
1245
+ next unless parse_release_version_text(tag)
1246
+
1224
1247
  object = entry["object"]
1225
1248
  next unless object.is_a?(Hash)
1226
1249
 
@@ -1229,8 +1252,7 @@ module Kettle
1229
1252
  when "commit"
1230
1253
  memo[tag] = sha
1231
1254
  when "tag"
1232
- dereferenced_sha = annotated_tag_commit_sha(repo_ref, sha)
1233
- memo[tag] = dereferenced_sha if dereferenced_sha
1255
+ memo[tag] = nil
1234
1256
  end
1235
1257
  end
1236
1258
  end
@@ -1259,9 +1281,7 @@ module Kettle
1259
1281
  request["X-GitHub-Api-Version"] = "2022-11-28"
1260
1282
  request["Authorization"] = "Bearer #{@token}" if @token && !@token.empty?
1261
1283
 
1262
- response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
1263
- http.request(request)
1264
- end
1284
+ response = http_request(uri, request)
1265
1285
 
1266
1286
  break unless response.code.to_i.between?(300, 399)
1267
1287
  redirects -= 1
@@ -1280,6 +1300,17 @@ module Kettle
1280
1300
  rescue JSON::ParserError
1281
1301
  nil
1282
1302
  end
1303
+ rescue IOError, SystemCallError, Net::OpenTimeout, Net::ReadTimeout
1304
+ nil
1305
+ end
1306
+
1307
+ def http_request(uri, request)
1308
+ http = Net::HTTP.new(uri.host, uri.port)
1309
+ http.use_ssl = uri.scheme == "https"
1310
+ http.open_timeout = @open_timeout
1311
+ http.read_timeout = @read_timeout
1312
+ http.ssl_timeout = @open_timeout if http.respond_to?(:ssl_timeout=)
1313
+ http.start { |connection| connection.request(request) }
1283
1314
  end
1284
1315
 
1285
1316
  def uri_encode(value)
@@ -326,10 +326,10 @@ module Kettle
326
326
  end
327
327
  rescue Exception => e # rubocop:disable Lint/RescueException
328
328
  Kettle::Dev.debug_error(e, __method__)
329
- # :nocov:
329
+ # simplecov:disable
330
330
  # Catch all exceptions in the worker thread boundary, including SystemExit
331
331
  status_q << [c, f, "err"]
332
- # :nocov:
332
+ # simplecov:enable
333
333
  end
334
334
  end
335
335
  end
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Dev
5
5
  module Version
6
- VERSION = "2.2.13"
6
+ VERSION = "2.2.15"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
data/lib/kettle/dev.rb CHANGED
@@ -19,9 +19,9 @@ end
19
19
  # External gems
20
20
 
21
21
  # It's not reasonable to test this ENV variable
22
- # :nocov:
22
+ # simplecov:disable
23
23
  require "require_bench" if ENV.fetch("REQUIRE_BENCH", "false").casecmp("true").zero?
24
- # :nocov:
24
+ # simplecov:enable
25
25
 
26
26
  # Autoload public CLI/APIs so requiring "kettle-dev" exposes them lazily
27
27
  # for tests and executables. Files will be loaded on first constant access.
@@ -29,6 +29,7 @@ module Kettle
29
29
  autoload :EmojiRegex, "kettle/emoji_regex"
30
30
  module Dev
31
31
  autoload :ChangelogCLI, "kettle/dev/changelog_cli"
32
+ autoload :ChangelogEntryAdder, "kettle/dev/changelog_entry_adder"
32
33
  autoload :BumpCLI, "kettle/dev/bump_cli"
33
34
  autoload :CIHelpers, "kettle/dev/ci_helpers"
34
35
  autoload :CIMonitor, "kettle/dev/ci_monitor"
@@ -202,9 +203,9 @@ module Kettle
202
203
  Kettle::Soup::Cover.install_tasks
203
204
  # NOTE: Coverage on CI is configured independent of this task.
204
205
  # This task is for local development, as it opens results in browser
205
- # :nocov:
206
+ # simplecov:disable
206
207
  Kettle::Dev.register_default("coverage") unless Kettle::Dev::IS_CI
207
- # :nocov:
208
+ # simplecov:enable
208
209
  rescue LoadError
209
210
  # OK, no soup for you.
210
211
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kettle-dev
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.13
4
+ version: 2.2.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: '1.1'
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
- version: 1.1.11
69
+ version: 1.1.12
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -76,7 +76,7 @@ dependencies:
76
76
  version: '1.1'
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: 1.1.11
79
+ version: 1.1.12
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: bundler-audit
82
82
  requirement: !ruby/object:Gem::Requirement
@@ -154,7 +154,7 @@ dependencies:
154
154
  version: '3.1'
155
155
  - - ">="
156
156
  - !ruby/object:Gem::Version
157
- version: 3.1.2
157
+ version: 3.1.4
158
158
  type: :development
159
159
  prerelease: false
160
160
  version_requirements: !ruby/object:Gem::Requirement
@@ -164,7 +164,7 @@ dependencies:
164
164
  version: '3.1'
165
165
  - - ">="
166
166
  - !ruby/object:Gem::Version
167
- version: 3.1.2
167
+ version: 3.1.4
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: ruby-progressbar
170
170
  requirement: !ruby/object:Gem::Requirement
@@ -208,7 +208,7 @@ dependencies:
208
208
  version: '2.0'
209
209
  - - ">="
210
210
  - !ruby/object:Gem::Version
211
- version: 2.0.1
211
+ version: 2.0.2
212
212
  type: :development
213
213
  prerelease: false
214
214
  version_requirements: !ruby/object:Gem::Requirement
@@ -218,7 +218,7 @@ dependencies:
218
218
  version: '2.0'
219
219
  - - ">="
220
220
  - !ruby/object:Gem::Version
221
- version: 2.0.1
221
+ version: 2.0.2
222
222
  description: "\U0001F372 Kettle::Dev is a meta tool from kettle-rb to streamline development
223
223
  and testing. Acts as a shim dependency, pulling in many other dependencies, to give
224
224
  you OOTB productivity with a RubyGem, or Ruby app project. Configures a complete
@@ -276,6 +276,7 @@ files:
276
276
  - lib/kettle/dev.rb
277
277
  - lib/kettle/dev/bump_cli.rb
278
278
  - lib/kettle/dev/changelog_cli.rb
279
+ - lib/kettle/dev/changelog_entry_adder.rb
279
280
  - lib/kettle/dev/ci_helpers.rb
280
281
  - lib/kettle/dev/ci_monitor.rb
281
282
  - lib/kettle/dev/commit_msg.rb
@@ -338,10 +339,10 @@ licenses:
338
339
  - AGPL-3.0-only
339
340
  metadata:
340
341
  homepage_uri: https://kettle-dev.galtzo.com
341
- source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.2.13
342
- changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.2.13/CHANGELOG.md
342
+ source_code_uri: https://github.com/kettle-dev/kettle-dev/tree/v2.2.15
343
+ changelog_uri: https://github.com/kettle-dev/kettle-dev/blob/v2.2.15/CHANGELOG.md
343
344
  bug_tracker_uri: https://github.com/kettle-dev/kettle-dev/issues
344
- documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.2.13
345
+ documentation_uri: https://www.rubydoc.info/gems/kettle-dev/2.2.15
345
346
  funding_uri: https://github.com/sponsors/pboling
346
347
  wiki_uri: https://github.com/kettle-dev/kettle-dev/wiki
347
348
  news_uri: https://www.railsbling.com/tags/kettle-dev
metadata.gz.sig CHANGED
Binary file