Exemplo n.º 1
0
def make_graph(args, outfile):
	graph = Digraph('Subreddit connection graph starting with:\n' +
			', '.join(args))

	parser = RedditParser()
	next_subs = set(subreddit.lower() for subreddit in args)
	logging.debug("Received on commandline: " + ' '.join(next_subs))
	visited = set()

	for current_depth in xrange(MAX_DEPTH):
		current_subs = next_subs
		visited.update(next_subs)
		if len(current_subs) == 0:
			break
		next_subs = set()

		for subreddit in current_subs:
			logging.debug("Visiting: " + subreddit)
			info = parser.get_info(subreddit)
			if info:
				links, num_subs = info
			else:
				continue
			current_node = graph.add_node(subreddit, shape="circle",
					width=width(num_subs), fixedsize=True,
					label='\n'.join([subreddit, str(num_subs)]))
			logging.debug("Received links: " + ' '.join(links))

			for link in links:
				if link not in visited:
					next_subs.add(link)
				new_node = graph.add_node(link)
				current_node >> new_node

	logging.debug("Done main loop.  Remaining unvisited subs:\n" +
			'\n'.join(next_subs))
	# Style the subreddits we didn't visit due to maximum search depth being
	# reached.
	for link in next_subs:
		info = parser.get_info(link)
		if info:
			links, num_subs = info
		else:
			continue
		logging.debug("Updating properties for remaining subreddit: %s" % link)
		graph.add_node(link, shape="circle",
				width=width(num_subs), fixedsize=True,
				label='\n'.join([link, str(num_subs)]))

	graph.layout(engines.dot)
	graph.render(outfile)