Architecture Diagrams
Purpose
Visual representation of Excavate’s architecture.
Class Diagram
┌─────────────────────────────────────────────────────────────────┐
│ Excavate::Archive │
│─────────────────────────────────────────────────────────────────│
│ - archive_path: String │
│─────────────────────────────────────────────────────────────────│
│ + initialize(archive_path) │
│ + extract(target, **options): String │
│ + files(**options, &block): Array │
└───────────────────────────────┬─────────────────────────────────┘
│ uses
│
┌───────────────────────────────┴─────────────────────────────────┐
│ Extractors::Extractor │
│─────────────────────────────────────────────────────────────────│
│ # archive: String │
│─────────────────────────────────────────────────────────────────│
│ + initialize(archive) │
│ + extract(target): void │
└───────────────────────────────┬─────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ CabExtractor │ │ ZipExtractor │ │ TarExtractor │
│─────────────────│ │─────────────────│ │─────────────────│
│ + extract() │ │ + extract() │ │ + extract() │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
│ uses │ uses │ uses
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Cabriolet │ │ Omnizip │ │ Omnizip │
└─────────────────┘ └─────────────────┘ └─────────────────┘
┌─────────────┐
│ Archive │
│ .new(path) │
└──────┬──────┘
│
▼
┌─────────────────┐
│ .extract(target)│
└──────┬──────────┘
│
▼
┌─────────────────┐ No ┌───────────────────┐
│ Target exists? │────────────▶│ TargetExistsError │
└──────┬──────────┘ └───────────────────┘
│ Yes
▼
┌─────────────────┐ No ┌───────────────────┐
│ Extension known?│────────────▶│ UnknownArchive │
└──────┬──────────┘ └───────────────────┘
│ Yes
▼
┌─────────────────┐
│ Select extractor│
└──────┬──────────┘
│
▼
┌─────────────────┐
│ Extractor.new() │
│ .extract(target)│
└──────┬──────────┘
│
▼
┌─────────────────┐ Yes ┌───────────────────┐
│ Recursive? │────────────▶│ Extract nested │
└──────┬──────────┘ └───────────────────┘
│ No
▼
┌─────────────────┐
│ Return target │
└─────────────────┘
┌─────────────────────────────────────────────────────┐
│ TYPES Hash │
├─────────────────────────────────────────────────────┤
│ "cab" => CabExtractor │
│ "cpio" => CpioExtractor │
│ "exe" => SevenZipExtractor │
│ "gz" => GzipExtractor │
│ "msi" => OleExtractor │
│ "pkg" => XarExtractor │
│ "rpm" => RpmExtractor │
│ "tar" => TarExtractor │
│ "xz" => XzExtractor │
│ "zip" => ZipExtractor │
└─────────────────────────────────────────────────────┘
Dependency Graph
┌─────────────────────────────────────────────────────┐
│ Excavate │
├─────────────────────────────────────────────────────┤
│ Dependencies: │
│ - omnizip ~> 0.3.8 │
│ - cabriolet ~> 0.2.2 │
│ - thor ~> 1.0 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Omnizip │ │ Cabriolet │ │
│ │ │ │ │ │
│ │ • ZIP │ │ • CAB │ │
│ │ • 7-Zip │ │ • CHM │ │
│ │ • TAR │ │ • SZDD │ │
│ │ • GZIP │ │ • KWAJ │ │
│ │ • XZ │ │ │ │
│ │ • CPIO │ │ │ │
│ │ • RPM │ │ │ │
│ │ • OLE/MSI │ │ │ │
│ │ • XAR │ │ │ │
│ └─────────────┘ └─────────────┘ │
│ │
│ All pure Ruby - no native dependencies │
└─────────────────────────────────────────────────────┘