Class: Ace::TestSupport::SandboxPackageCopy

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/test_support/sandbox_package_copy.rb

Overview

Creates deterministic E2E sandboxes and copies package sources into them.

Constant Summary collapse

DEFAULT_SANDBOX_BASE =
".ace-local/test-e2e"

Instance Method Summary collapse

Constructor Details

#initialize(source_root: Dir.pwd, sandbox_base: DEFAULT_SANDBOX_BASE) ⇒ SandboxPackageCopy

Returns a new instance of SandboxPackageCopy.



11
12
13
14
# File 'lib/ace/test_support/sandbox_package_copy.rb', line 11

def initialize(source_root: Dir.pwd, sandbox_base: DEFAULT_SANDBOX_BASE)
  @source_root = File.expand_path(source_root)
  @sandbox_base = File.expand_path(sandbox_base, @source_root)
end

Instance Method Details

#prepare(package_name:, sandbox_name: nil, sandbox_root: nil) ⇒ Hash

Prepare a sandbox and copy a package into it.

Exactly one of sandbox_name or sandbox_root must be provided.

Parameters:

  • package_name (String)

    package directory to copy

  • sandbox_name (String, nil) (defaults to: nil)

    sandbox folder name under .ace-local/test-e2e

  • sandbox_root (String, nil) (defaults to: nil)

    explicit sandbox path

Returns:

  • (Hash)

    sandbox_root, package_root, source_root, and env contract

Raises:

  • (ArgumentError)


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/ace/test_support/sandbox_package_copy.rb', line 24

def prepare(package_name:, sandbox_name: nil, sandbox_root: nil)
  package = package_name.to_s.strip
  raise ArgumentError, "package_name is required" if package.empty?

  root = resolve_sandbox_root(sandbox_name: sandbox_name, sandbox_root: sandbox_root)
  source_package = File.join(@source_root, package)
  target_package = File.join(root, package)

  unless File.directory?(source_package)
    raise ArgumentError, "Package source directory not found: #{source_package}"
  end

  FileUtils.mkdir_p(root)
  FileUtils.cp_r(source_package, target_package) unless File.exist?(target_package)

  {
    sandbox_root: root,
    package_root: target_package,
    source_root: @source_root,
    env: {
      "PROJECT_ROOT_PATH" => root,
      "ACE_E2E_SOURCE_ROOT" => @source_root
    }
  }
end