Giter Club home page Giter Club logo

dagger's Introduction

dagger

https://circleci.com/gh/jkrmr/dagger.svg?style=svg

A program to resolve dependencies, written in Ruby.

Usage

From the command line, pipe the contents of a package listing file to the executable bin/dagger script as follows:

$ cat data/sample_input.txt | bin/dagger
# KittenService, Ice, Cyberportal, Leetmeme, CamelCaser, Fraudstream

Input files are expected to be in the following format:

KittenService:
Leetmeme: Cyberportal
Cyberportal: Ice
CamelCaser: KittenService
Fraudstream: Leetmeme
Ice:

Architecture

Dagger::DependencyResolver

A coordinator class that performs dependency resolution via a depth-first search through the dependency graph.

# lib/dagger/dependency_resolver.rb L17-L24 (cc9ca72f)

def gather_dependencies(package, deps = [])
  raise Dagger::CyclicDependencyError.new(package, deps) if deps.include?(package)

  deps.unshift(package)
  return deps if package.dependency.nil?

  gather_dependencies(package.dependency, deps)
end

lib/dagger/dependency_resolver.rb#L17-L24 (cc9ca72f)

Dagger::Package

A model class containing data for a given package and a reference to its dependency, if it exists.

A type method, .build_collection_from_list, provides a factory method accepting a list of String instances and returning a list of Package instances.

# lib/dagger/package.rb L13-L22 (cc9ca72f)

def self.build_collection_from_list(strings)
  list_hash = strings.each_with_object({}) do |entry, memo|
    name, dep_name = entry.scan(PACKAGE_ENTRY_FORMAT).flatten
    memo[name] = new(name, dep_name)
  end

  list_hash.values.each do |package|
    package.dependency = list_hash[package.dependency_name]
  end
end

lib/dagger/package.rb#L13-L22 (cc9ca72f)

Dagger::PackageList

Provides an ordered set implementation used to build the package manifest (i.e., the list of packages to be installed, topologically sorted).

# lib/dagger/package_list.rb L12-L21 (cc9ca72f)

def add(packages)
  Array(packages).each do |package|
    next if package_set.include?(package)

    package_set << package
    package_list << package
  end

  self
end

lib/dagger/package_list.rb#L12-L21 (cc9ca72f)

Test Suite

The test suite is written in RSpec. An “RSpec-y” (i.e., DSL-heavy) style is intentionally avoided in favor of a more traditional xUnit four-phase test style.

# spec/dagger/package_list_spec.rb L29-L45 (bc062558)

it "adds entries idempotently" do
  list = described_class.new

  list.add(1)
  list.add(1)

  expect(list.to_a).to eq [1]
end

it "maintains insertion order" do
  list = described_class.new

  list.add([5, 1, 2, 3])
  list.add([2, 3, 4])

  expect(list.to_a).to eq [5, 1, 2, 3, 4]
end

spec/dagger/package_list_spec.rb#L29-L45 (bc062558)

Dagger::DependencyResolver#resolve

The coordinator class’s #resolve method accepts an array of strings, each with the format PACKAGE: [DEPENDENCY].

[
   "KittenService: ",
   "Leetmeme: Cyberportal",
   "Cyberportal: Ice",
   "CamelCaser: KittenService",
   "Fraudstream: Leetmeme",
   "Ice: "
]

Output

"KittenService, Ice, Cyberportal, Leetmeme, CamelCaser, Fraudstream"

Invalid Input

Dependency graphs containing cycles will raise a CyclicDependencyError.

[
   "KittenService: ",
   "Leetmeme: Cyberportal",
   "Cyberportal: Ice",
   "CamelCaser: KittenService",
   "Fraudstream: ",
   "Ice: Leetmeme"
 ]
Dagger::CyclicDependencyError:
  Package 'Leetmeme' has cyclic dependencies: [Ice <Leetmeme>, Cyberportal <Ice>, Leetmeme <Cyberportal>]

dagger's People

Stargazers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.