@startuml

!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml

Person(user, "Developer")

System_Boundary(DFetch, "Dfetch") {

    Container(contCommands, "Commands", "python", "Parsing, editing and finding of manifests.")

    Boundary(DFetchManifest, "Manifest") {
        Component(compManifest, "Manifest", "python", "Main configuration file describing all projects.")
        Component(compProject, "Project", "python", "A single project requirement with optionally specific version")
        Component(compRemote, "Remote", "python", "A remote source that contains one or more projects.")
        Component(compValidate, "Validate", "python", "Validate a manifest.")
        Component(compVersion, "Version", "python", "Check and compare versions.")

        Rel(compManifest, compProject, "Uses")
        Rel(compProject, compVersion, "Uses")
        Rel_L(compProject, compRemote, "Uses")
        Rel(compManifest, compValidate, "Uses")
        Rel(compManifest, compRemote, "Uses")
    }

    Container(contProject, "Project", "python", "Main project that has a manifest.")
    Container(contVcs, "Vcs", "python", "Abstraction of various Version Control Systems.")
    Container(contReporting, "Reporting", "python", "Output formatters for various reporting formats.")

    Rel(contCommands, compManifest, "Uses")
    Rel(contReporting, contProject, "Extends")
    Rel_R(contProject, compManifest, "Has")
    Rel(contReporting, compManifest, "Uses")
    Rel(contProject, contVcs, "Uses")
}

Rel(user, contCommands, "Uses")

@enduml
