Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
from_startup: mark that this project comes from the beginning of the app life (e.g. from the NV-storage) so
it can be treated differently on the GUI side
parent: Qt parent
"""
super().__init__(parent=parent)
if project_args is None:
project_args = []
if project_kwargs is None:
project_kwargs = {}
self._from_startup = from_startup
underlying_logger = logging.getLogger('stm32pio_gui.projects')
self.logger = stm32pio.util.ProjectLoggerAdapter(underlying_logger, { 'project_id': id(self) })
self.logging_worker = LoggingWorker(project_id=id(self))
self.logging_worker.sendLog.connect(self.logAdded)
# QThreadPool can automatically queue new incoming tasks if a number of them are larger than maxThreadCount
self.workers_pool = QThreadPool(parent=self)
self.workers_pool.setMaxThreadCount(1)
self.workers_pool.setExpiryTimeout(-1) # tasks wait forever for the available spot
self._current_action = ''
# These values are valid only until the Stm32pio project initialize itself (or failed to) (see init_project)
self.project = None
self._name = 'Loading...'
self._state = { 'LOADING': True } # pseudo-stage (not present in the ProjectStage enum but is used from QML)
self._current_stage = 'Loading...'
self.qml_ready = threading.Event() # the front and the back both should know when each other is initialized
instance_options = copy.copy(Stm32pio.INSTANCE_OPTIONS_DEFAULTS)
else:
# Create a shallow copy of the argument, a mutable mapping, as we probably going to add some pairs to it
instance_options = dict(instance_options)
# Insert missing pairs but do not touch any extra ones if there is any
for key, value in copy.copy(Stm32pio.INSTANCE_OPTIONS_DEFAULTS).items():
if key not in instance_options:
instance_options[key] = value
# The individual loggers for every single project allows to fine-tune the output when the multiple projects are
# created by the third-party code
if instance_options['logger'] is not None:
self.logger = instance_options['logger']
else:
underlying_logger = logging.getLogger('stm32pio.projects')
self.logger = stm32pio.util.ProjectLoggerAdapter(underlying_logger, { 'project_id': id(self) })
# The path is a primary entity of the project so we process it first and foremost. Handle 'path/to/proj',
# 'path/to/proj/', '.', '../proj', etc., make the path absolute and check for existence. Also, the .ioc file can
# be specified instead of the directory. In this case it is assumed that the parent path is an actual project
# path and the provided .ioc file is used on a priority basis
path = pathlib.Path(dirty_path).expanduser().resolve(strict=True)
ioc_file = None
if path.is_file() and path.suffix == '.ioc': # if .ioc file was supplied instead of the directory
ioc_file = path
path = path.parent
self.path = path
self.config = self._load_config(parameters)
self.ioc_file = self._find_ioc_file(explicit_file=ioc_file)
self.config.set('project', 'ioc_file', self.ioc_file.name) # save only the name of file to the config