Skip to content

Instantly share code, notes, and snippets.

@tknerr
Created August 14, 2012 11:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tknerr/3348296 to your computer and use it in GitHub Desktop.
Save tknerr/3348296 to your computer and use it in GitHub Desktop.
DTangler -> Flare Converter. Converts DTangler cmdline output to the JSON format understood used by Flare
class Item
def initialize(name, *deps)
@name = name
@deps = deps || []
end
def name
@name
end
def deps
@deps
end
def to_s
name
end
end
class DSM
def initialize
@items = []
end
def items
@items
end
def parse(dtangle_output)
tmp_deps = {}
# parse lines and create items
dtangle_output.each_line do |line|
md = /^\s*(\d+)\s+(.*)\s\(\s*(\d+)\)\s\|(.*)\|$/.match line
if (md)
row_item_idx = md[1].to_i
row_item_name = md[2]
row_item_num_subitems = md[3].to_i
row_item_cols = md[4]
#puts "add item: #{row_item_idx} #{row_item_name} #{row_item_num_subitems}"
item = Item.new (row_item_name)
@items << item
# for each column remember the dependencies in tmp_deps
row_item_cols.split('|').each_with_index do |col_value, col_idx|
next if (col_value.empty? || col_value.include?('#'))
num_deps = col_value.strip.gsub('C','').to_i
if (num_deps > 0)
col_item_idx = col_idx+1
#puts " item(#{col_item_idx}) has #{num_deps} dependencies on #{item}"
(tmp_deps[col_item_idx] ||= []) << row_item_idx
end
end
end
end
# establish dependencies
tmp_deps.each_pair do |col_item_idx, row_item_idxs|
row_item_idxs.each do |row_item_idx|
@items[col_item_idx-1].deps << @items[row_item_idx-1]
end
end
end
end
def to_flare_json(items)
s = String.new
s << "var data = [\n"
items.each do |item|
s << "{\"name\":\"#{format(item)}\", \"size\":0, \"imports\":["
item.deps.each do |dep|
s << "\"#{format(dep)}\","
end
s << "]},\n"
end
s << "];"
s
end
def format(item)
# for jars filenames -> use only filename
# item.name.gsub('.jar','_jar').gsub(/.*\\([^\\]+_jar)/, '\1')
# for package names -> show only last 4 levels of nesting
item.name #.gsub(/^\.\.\.?/,'').split('.')[0..3].join('.')
end
dsm = DSM.new
# dsm.parse IO.read('mnet-dependencies-jar-level.txt')
dsm.parse IO.read('mnet-dependencies-package-level.txt')
puts to_flare_json(dsm.items.sort {|x,y| x.name <=> y.name })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment