Class: TRuby::RemoteRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/t_ruby/package_manager.rb

Overview

Remote registry client (RubyGems.org style API)

Constant Summary collapse

DEFAULT_REGISTRY_URL =
"https://rubygems.org/api/v1"
TYPE_REGISTRY_URL =

Hypothetical type registry

"https://types.ruby-lang.org/api/v1"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(registry_url: nil, cache_dir: nil) ⇒ RemoteRegistry

Returns a new instance of RemoteRegistry.



293
294
295
296
297
298
# File 'lib/t_ruby/package_manager.rb', line 293

def initialize(registry_url: nil, cache_dir: nil)
  @registry_url = registry_url || TYPE_REGISTRY_URL
  @cache_dir = cache_dir || File.join(Dir.home, ".trb-cache")
  @http_cache = {}
  FileUtils.mkdir_p(@cache_dir)
end

Instance Attribute Details

#cache_dirObject (readonly)

Returns the value of attribute cache_dir.



291
292
293
# File 'lib/t_ruby/package_manager.rb', line 291

def cache_dir
  @cache_dir
end

#registry_urlObject (readonly)

Returns the value of attribute registry_url.



291
292
293
# File 'lib/t_ruby/package_manager.rb', line 291

def registry_url
  @registry_url
end

Instance Method Details

#api_key_info(api_key) ⇒ Object

Get API key info



424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
# File 'lib/t_ruby/package_manager.rb', line 424

def api_key_info(api_key)
  uri = URI("#{@registry_url}/api_key.json")

  request = Net::HTTP::Get.new(uri)
  request["Authorization"] = api_key

  response = send_request(uri, request)

  case response
  when Net::HTTPSuccess
    JSON.parse(response.body)
  else
    nil
  end
rescue StandardError
  nil
end

#download(name, version, target_dir = nil) ⇒ Object

Download package



363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
# File 'lib/t_ruby/package_manager.rb', line 363

def download(name, version, target_dir = nil)
  target = target_dir || File.join(@cache_dir, name, version)
  FileUtils.mkdir_p(target)

  # Download from registry
  uri = URI("#{@registry_url}/gems/#{name}-#{version}.gem")

  gem_path = File.join(target, "#{name}-#{version}.gem")
  download_file(uri, gem_path)

  # Extract type definitions
  extract_types(gem_path, target)

  target
rescue StandardError => e
  warn "Download failed: #{e.message}"
  nil
end

#info(name) ⇒ Object

Get package info



322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
# File 'lib/t_ruby/package_manager.rb', line 322

def info(name)
  uri = URI("#{@registry_url}/gems/#{name}.json")
  response = fetch_json(uri)
  return nil unless response

  {
    name: response["name"],
    version: response["version"],
    authors: response["authors"],
    summary: response["info"],
    homepage: response["homepage_uri"],
    source_code: response["source_code_uri"],
    documentation: response["documentation_uri"],
    licenses: response["licenses"],
    dependencies: parse_dependencies(response["dependencies"])
  }
rescue StandardError => e
  warn "Failed to fetch package info: #{e.message}"
  nil
end

#push(gem_path, api_key:) ⇒ Object

Push package to registry



383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
# File 'lib/t_ruby/package_manager.rb', line 383

def push(gem_path, api_key:)
  uri = URI("#{@registry_url}/gems")

  request = Net::HTTP::Post.new(uri)
  request["Authorization"] = api_key
  request["Content-Type"] = "application/octet-stream"
  request.body = File.binread(gem_path)

  response = send_request(uri, request)

  case response
  when Net::HTTPSuccess
    { success: true, message: response.body }
  else
    { success: false, message: response.body }
  end
rescue StandardError => e
  { success: false, message: e.message }
end

#search(query, page: 1, per_page: 30) ⇒ Object

Search for type packages



301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# File 'lib/t_ruby/package_manager.rb', line 301

def search(query, page: 1, per_page: 30)
  uri = URI("#{@registry_url}/search.json")
  uri.query = URI.encode_www_form(query: query, page: page, per_page: per_page)

  response = fetch_json(uri)
  return [] unless response

  response.map do |pkg|
    {
      name: pkg["name"],
      version: pkg["version"],
      downloads: pkg["downloads"],
      summary: pkg["info"] || pkg["summary"]
    }
  end
rescue StandardError => e
  warn "Registry search failed: #{e.message}"
  []
end

#versions(name) ⇒ Object

Get all versions of a package



344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
# File 'lib/t_ruby/package_manager.rb', line 344

def versions(name)
  uri = URI("#{@registry_url}/versions/#{name}.json")
  response = fetch_json(uri)
  return [] unless response

  response.map do |v|
    {
      number: v["number"],
      created_at: v["created_at"],
      prerelease: v["prerelease"],
      sha: v["sha"]
    }
  end
rescue StandardError => e
  warn "Failed to fetch versions: #{e.message}"
  []
end

#yank(name, version, api_key:) ⇒ Object

Yank (unpublish) a version



404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
# File 'lib/t_ruby/package_manager.rb', line 404

def yank(name, version, api_key:)
  uri = URI("#{@registry_url}/gems/yank")

  request = Net::HTTP::Delete.new(uri)
  request["Authorization"] = api_key
  request.set_form_data(gem_name: name, version: version)

  response = send_request(uri, request)

  case response
  when Net::HTTPSuccess
    { success: true }
  else
    { success: false, message: response.body }
  end
rescue StandardError => e
  { success: false, message: e.message }
end