[ create a new paste ] login | about

Project: circuits
Link: http://circuits.codepad.org/6EMbV7zA    [ raw code | fork ]

Python, pasted on Mar 16:
#!/usr/bin/env python
"""Justin Giorgi, Robert Straitt 12/31/12

File: main.py

Scope: Initialization and registration of all core modules and configured mods.

Changelog:
	No changes
	
Status:
	Complete within scope of current requirements.
	
Testing:
	No tests, extensive testing necessary.
"""

# Standard library imports
from os import getcwd
from ConfigParser import SafeConfigParser as ConfigParser

# Installed extension imports
from circuits import Component, Debugger

# Local imports
from core import core
from mods import mods
from environment import Environment

# Exception(s)
class ConfigurationError(Exception): pass

class Main(Component):
	"""Main class responsible for importing and loading all core classes as well
	as enabled mods. No other tasks performed.
	"""
	
	def __init__(self, config):
		super(Main, self).__init__()
		
		# Prepare environment
		self.env = Environment(config)
		
		# Load core (core is a list of core modules to load)
		for C in core:
			c = C(self.env)
			c.register(self)
		
		# Load enabled mods (mods is a dict of modname to mod)
		for m in mods:
			if self.env.config.has_option("mods", m) and \
				self.env.config.getboolean("mods", m):
				m = mods[m](self.env)
				m.register(self)
				
def init(config="infocream.conf", cwd=getcwd()):
	# Parse config
	conf = ConfigParser()
	conf.read(config)
	
	# Init debugger if required
	components = []
	ret = []
	
	# Check for config errors
	if conf.getboolean("run", "multiprocess") and conf.getboolean("run",
																  "thread"):
		raise ConfigurationError("Multiprocessing and threading are mutually "
								 "exclusive.")
	
	# Run in daemon?
	if conf.getboolean("run", "daemon"):
		print "Initializing Daemonizer..."
		components.append(Daemon("infocream.pid", path=cwd, stdin="stdin.txt",
				  				 stdout="stdout.txt", stderr="stderr.txt"))
				  				 
	# Run Debugger?
	if conf.getboolean("run", "debug"):
		print "Initializing Debugger..."
		d = Debugger()
		components.append(d)
		ret.append(d)
	else:
		ret.append(None)
	
	# Startup main
	print "Initializing system..."
	m = Main(conf)
	components.append(m)
	ret.append(m)
	print "System components loaded."
	
	# Initialize everything
	print "Preparing environment..."
	components.reverse() # run first item as root
	root = components.pop()
	for comp in components:
		comp.register(root)
		
	# Run in thread or multiprocess?
	if conf.getboolean("run", "thread"):
		print "Configuring for interactive operations..."
		go = root.start
		ret.append(True)
	elif conf.getboolean("run", "multiprocess"):
		print "Preparing for multiprocessing..."
		def initprocesses():
			processes = conf.getint("run", "processes")
			for x in range(1, processes):
				root.start(process=True)
			root.run()
		go = initprocesses
		ret.append(False)
	else:
		"Configuring for single processes, non-interactive operation..."
		go = root.run
		ret.append(False)
		
	# Run the system
	print "System loaded successfully. Executing Main loop."
	go()
	
	# Return
	return tuple(ret)

# If run independently initialize automagically	
if __name__ == "__main__":
	d, m, thread = init()
	if thread:
		print "Ready for interactive operations."


Create a new paste based on this one


Comments: