def setUp(self):
		config = {
			'key1': 'hello world',
			'some_name': 'another name',
			'version': '1.2.3'
		}

		macroProcessor = MacroProcessor()

		valueProvider = ValueProvider()
		valueProvider.setConfig(config)

		self.macroResolver = MacroResolver(macroProcessor, valueProvider)
class TaskRunner:
	def __init__(self, settingsProvider, fileContentProvider, buildConfigProvider, linePreprocessor, defaults):
		assert settingsProvider is not None
		assert fileContentProvider is not None
		assert buildConfigProvider is not None
		assert linePreprocessor is not None
		assert defaults is not None

		self.settingsProvider = settingsProvider
		self.fileContentProvider = fileContentProvider
		self.configsProvider = buildConfigProvider
		self.linePreprocessor = linePreprocessor
		self.defaults = defaults

		macroProcessor = MacroProcessor()
		self.valueProvider = ValueProvider()
		macroResolver = MacroResolver(macroProcessor, self.valueProvider)

		includeProcessor = IncludeProcessor()
		textInclude = TextInclude(includeProcessor, self.fileContentProvider)

		# последовательность важна!
		# Сначала резолвим макросы, потом делаем включение файлов
		# Это позволяет использовать макросы в include выражениях
		self.textPreprocessor = TextConveyorPreprocessor()
		self.textPreprocessor.addProcessor(macroResolver)
		self.textPreprocessor.addProcessor(textInclude)


	def run(self):
		rawSettings = self.settingsProvider.fetchSettings()
		buildReadyConfigs = self.configsProvider.getConfigs(rawSettings)

		for bc in buildReadyConfigs:
			self.valueProvider.setConfig(bc)
			self.runConfig(bc)

	def runConfig(self, config):
		content = self.getStepsContent(config)

		stepsRunner = StepsRunner(config, self.linePreprocessor, self.valueProvider)
		stepsRunner.run(content)

	def getStepsContent(self, config):
		pathToSteps = config.get('steps', self.defaults['steps'])

		content = self.fileContentProvider.fetchContent(pathToSteps)
		content = self.textPreprocessor.processText(content, self.textPreprocessor)

		return content
class TestCase(unittest.TestCase):
	def setUp(self):
		self.__config = {
			'key1': 'value1',
			'key2': 'value2'
		}
		self.__provider = ValueProvider()
		self.__provider.setConfig(self.__config)

	def test_provideByLink(self):
		value1 = self.__provider.getValueFor('@key1')
		value2 = self.__provider.getValueFor('@key2')

		self.assertEqual(value1, 'value1')
		self.assertEqual(value2, 'value2')
	def __init__(self, settingsProvider, fileContentProvider, buildConfigProvider, linePreprocessor, defaults):
		assert settingsProvider is not None
		assert fileContentProvider is not None
		assert buildConfigProvider is not None
		assert linePreprocessor is not None
		assert defaults is not None

		self.settingsProvider = settingsProvider
		self.fileContentProvider = fileContentProvider
		self.configsProvider = buildConfigProvider
		self.linePreprocessor = linePreprocessor
		self.defaults = defaults

		macroProcessor = MacroProcessor()
		self.valueProvider = ValueProvider()
		macroResolver = MacroResolver(macroProcessor, self.valueProvider)

		includeProcessor = IncludeProcessor()
		textInclude = TextInclude(includeProcessor, self.fileContentProvider)

		# последовательность важна!
		# Сначала резолвим макросы, потом делаем включение файлов
		# Это позволяет использовать макросы в include выражениях
		self.textPreprocessor = TextConveyorPreprocessor()
		self.textPreprocessor.addProcessor(macroResolver)
		self.textPreprocessor.addProcessor(textInclude)
	def setUp(self):
		self.__config = {
			'key1': 'value1',
			'key2': 'value2'
		}
		self.__provider = ValueProvider()
		self.__provider.setConfig(self.__config)
from CommandBuilders.PatchInfoplistCommandBuilder import PatchInfoplistCommandBuilder
from commands.ValueProvider import ValueProvider

config = {
	'version': '0.1.2',
	'app_name': 'TestAppName',

	# patch_info_plist
	'plist app:CoolApp rel_path': 'BuildSample/Info.plist',
	'plist app:CoolApp key:CFBundleVersion': '@version',		# set CFBundleVersion
	'plist app:CoolApp key:CFBundleDisplayName': '@app_name',	# set CFBundleDisplayName
}
line = "inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'MyCoolApp'"

value_provider = ValueProvider()
value_provider.setConfig(config)
builder = PatchInfoplistCommandBuilder(value_provider)

command = builder.getCommandFor(line)
command.execute()