Class: TRuby::PackageManager

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

Overview

Extension to PackageManager for Bundler support

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(project_dir: ".") ⇒ PackageManager

Returns a new instance of PackageManager.



570
571
572
573
574
575
# File 'lib/t_ruby/package_manager.rb', line 570

def initialize(project_dir: ".")
  @project_dir = project_dir
  @manifest = PackageManifest.load(File.join(project_dir, PackageManifest::MANIFEST_FILE))
  @registry = PackageRegistry.new(local_path: File.join(project_dir, ".trb-packages"))
  @resolver = DependencyResolver.new(@registry)
end

Instance Attribute Details

#bundlerObject (readonly)

Returns the value of attribute bundler.



531
532
533
# File 'lib/t_ruby/bundler_integration.rb', line 531

def bundler
  @bundler
end

#manifestObject (readonly)

Returns the value of attribute manifest.



568
569
570
# File 'lib/t_ruby/package_manager.rb', line 568

def manifest
  @manifest
end

#registryObject (readonly)

Returns the value of attribute registry.



568
569
570
# File 'lib/t_ruby/package_manager.rb', line 568

def registry
  @registry
end

#resolverObject (readonly)

Returns the value of attribute resolver.



568
569
570
# File 'lib/t_ruby/package_manager.rb', line 568

def resolver
  @resolver
end

Instance Method Details

#add(name, version = "*", dev: false) ⇒ Object

Add a dependency



589
590
591
592
593
594
595
596
597
598
599
600
601
602
# File 'lib/t_ruby/package_manager.rb', line 589

def add(name, version = "*", dev: false)
  ensure_manifest!

  if dev
    @manifest.add_dev_dependency(name, version)
  else
    @manifest.add_dependency(name, version)
  end

  @manifest.save(File.join(@project_dir, PackageManifest::MANIFEST_FILE))

  # Resolve and install
  install
end

#deprecate(version, message) ⇒ Object

Create deprecation notice



688
689
690
691
692
693
694
695
696
697
# File 'lib/t_ruby/package_manager.rb', line 688

def deprecate(version, message)
  ensure_manifest!

  {
    package: @manifest.name,
    version: version,
    deprecated: true,
    message: message,
  }
end

#init(name: nil) ⇒ Object

Initialize a new package



578
579
580
581
582
583
584
585
586
# File 'lib/t_ruby/package_manager.rb', line 578

def init(name: nil)
  @manifest = PackageManifest.new(
    name: name || File.basename(@project_dir),
    version: "0.1.0",
    types: "lib/types/**/*.d.trb"
  )
  @manifest.save(File.join(@project_dir, PackageManifest::MANIFEST_FILE))
  @manifest
end

#installObject

Install all dependencies



612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
# File 'lib/t_ruby/package_manager.rb', line 612

def install
  ensure_manifest!

  result = @resolver.resolve(@manifest)

  if result[:conflicts].any?
    raise "Dependency conflicts: #{result[:conflicts].join(", ")}"
  end

  installed = []
  result[:resolved].each do |name, version|
    pkg = @registry.install(name, version)
    installed << pkg if pkg
  end

  # Generate lockfile
  generate_lockfile(result[:resolved])

  installed
end

#install_with_bundler_fallbackObject

Use Bundler if available, fall back to native package management



542
543
544
545
546
547
548
# File 'lib/t_ruby/bundler_integration.rb', line 542

def install_with_bundler_fallback
  if @bundler.bundler_project?
    @bundler.sync_types
  else
    install
  end
end

#listObject

List installed packages



659
660
661
662
663
664
665
666
# File 'lib/t_ruby/package_manager.rb', line 659

def list
  lockfile_path = File.join(@project_dir, ".trb-lock.json")
  return {} unless File.exist?(lockfile_path)

  JSON.parse(File.read(lockfile_path))
rescue JSON::ParserError
  {}
end

#migrate_to_bundlerObject

Migrate from native T-Ruby packages to Bundler



551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
# File 'lib/t_ruby/bundler_integration.rb', line 551

def migrate_to_bundler
  return { success: false, error: "Not a Bundler project" } unless @bundler.bundler_project?

  migrated = []

  # Read existing T-Ruby manifest
  @manifest&.dependencies&.each do |name, version|
    result = @bundler.add_type_gem(name, version: version)
    migrated << result
  end

  # Generate new bundle manifest
  @bundler.generate_bundle_manifest

  { success: true, migrated: migrated }
end

#publishObject

Publish package (stub - would integrate with real registry)



669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
# File 'lib/t_ruby/package_manager.rb', line 669

def publish
  ensure_manifest!

  unless @manifest.valid?
    raise "Invalid manifest: missing name or version"
  end

  # Validate package
  validate_package

  # In real implementation, would upload to registry
  {
    name: @manifest.name,
    version: @manifest.version,
    status: :published,
  }
end

#remove(name) ⇒ Object

Remove a dependency



605
606
607
608
609
# File 'lib/t_ruby/package_manager.rb', line 605

def remove(name)
  ensure_manifest!
  @manifest.remove_dependency(name)
  @manifest.save(File.join(@project_dir, PackageManifest::MANIFEST_FILE))
end

#update(name = nil) ⇒ Object

Update dependencies



634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
# File 'lib/t_ruby/package_manager.rb', line 634

def update(name = nil)
  ensure_manifest!

  if name
    # Update specific package
    current = @manifest.dependencies[name]
    if current
      @manifest.dependencies[name] = "*" # Get latest
      result = @resolver.resolve(@manifest)
      if result[:resolved][name]
        @manifest.dependencies[name] = "^#{result[:resolved][name]}"
        @manifest.save(File.join(@project_dir, PackageManifest::MANIFEST_FILE))
      end
    end
  else
    # Update all
    @manifest.dependencies.each_key do |dep_name|
      update(dep_name)
    end
  end

  install
end