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.



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

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.



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

def bundler
  @bundler
end

#manifestObject (readonly)

Returns the value of attribute manifest.



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

def manifest
  @manifest
end

#registryObject (readonly)

Returns the value of attribute registry.



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

def registry
  @registry
end

#resolverObject (readonly)

Returns the value of attribute resolver.



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

def resolver
  @resolver
end

Instance Method Details

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

Add a dependency



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

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



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

def deprecate(version, message)
  ensure_manifest!

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

#init(name: nil) ⇒ Object

Initialize a new package



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

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



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

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



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

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

#listObject

List installed packages



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

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



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

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

  migrated = []

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

  # Generate new bundle manifest
  @bundler.generate_bundle_manifest

  { success: true, migrated: migrated }
end

#publishObject

Publish package (stub - would integrate with real registry)



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

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



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

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



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

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