Class: TRuby::RemoteRegistry
- Inherits:
-
Object
- Object
- TRuby::RemoteRegistry
- 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
-
#cache_dir ⇒ Object
readonly
Returns the value of attribute cache_dir.
-
#registry_url ⇒ Object
readonly
Returns the value of attribute registry_url.
Instance Method Summary collapse
-
#api_key_info(api_key) ⇒ Object
Get API key info.
-
#download(name, version, target_dir = nil) ⇒ Object
Download package.
-
#info(name) ⇒ Object
Get package info.
-
#initialize(registry_url: nil, cache_dir: nil) ⇒ RemoteRegistry
constructor
A new instance of RemoteRegistry.
-
#push(gem_path, api_key:) ⇒ Object
Push package to registry.
-
#search(query, page: 1, per_page: 30) ⇒ Object
Search for type packages.
-
#versions(name) ⇒ Object
Get all versions of a package.
-
#yank(name, version, api_key:) ⇒ Object
Yank (unpublish) a version.
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_dir ⇒ Object (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_url ⇒ Object (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. } 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. } end |