def __matchVersion(): cura_version = Application.getInstance().getVersion() if cura_version == "master": Logger.log("d", "Running Cura from source. Skipping version check") return True if cura_version == "Arachne_engine_alpha": Logger.log( "d", "Running Cura Arachne_engine_alpha. Skipping version check") return True cura_version = Version(cura_version) cura_version = Version([cura_version.getMajor(), cura_version.getMinor()]) # Get version information from plugin.json plugin_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "plugin.json") try: with open(plugin_file_path, encoding="utf-8") as plugin_file: plugin_info = json.load(plugin_file) minimum_cura_version = Version(plugin_info["minimum_cura_version"]) maximum_cura_version = Version(plugin_info["maximum_cura_version"]) except Exception as e: Logger.log( "w", "Could not get version information for the plugin: " + str(e)) return False if cura_version >= minimum_cura_version and cura_version <= maximum_cura_version: return True else: Logger.log( "d", "This version of MKS WiFi Plugin is not compatible with current version of Cura. Please check for an update." ) return False
def __matchVersion(): cura_version = Application.getInstance().getVersion() if cura_version == "master": Logger.log("d", "Running Cura from source, ignoring version of the plugin") return True cura_version = Version(cura_version) cura_version = Version([cura_version.getMajor(), cura_version.getMinor()]) # Get version information from plugin.json plugin_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "plugin.json") try: with open(plugin_file_path) as plugin_file: plugin_info = json.load(plugin_file) minimum_cura_version = Version(plugin_info["minimum_cura_version"]) maximum_cura_version = Version(plugin_info["maximum_cura_version"]) except: Logger.log("w", "Could not get version information for the plugin") return False if cura_version >= minimum_cura_version and cura_version <= maximum_cura_version: return True else: Logger.log( "d", "This version of the plugin is not compatible with this version of Cura. Please check for an update." ) return False
def _loadChangeLogText(self) -> str: # Load change log texts and organize them with a dict file_path = Resources.getPath(Resources.Texts, "change_log.txt") change_logs_dict = {} # type: Dict[Version, Dict[str, List[str]]] with open(file_path, "r", encoding="utf-8") as f: open_version = None # type: Optional[Version] open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog for line in f: line = line.replace("\n", "") if "[" in line and "]" in line: line = line.replace("[", "") line = line.replace("]", "") open_version = Version(line) if open_version > Version( [14, 99, 99] ): # Bit of a hack: We released the 15.x.x versions before 2.x open_version = Version([ 0, open_version.getMinor(), open_version.getRevision(), open_version.getPostfixVersion() ]) open_header = "" change_logs_dict[open_version] = collections.OrderedDict() elif line.startswith("*"): open_header = line.replace("*", "") change_logs_dict[cast(Version, open_version)][open_header] = [] elif line != "": if open_header not in change_logs_dict[cast( Version, open_version)]: change_logs_dict[cast(Version, open_version)][open_header] = [] change_logs_dict[cast( Version, open_version)][open_header].append(line) # Format changelog text content = "" for version in sorted(change_logs_dict.keys(), reverse=True): text_version = version if version < Version([ 1, 0, 0 ]): # Bit of a hack: We released the 15.x.x versions before 2.x text_version = Version([ 15, version.getMinor(), version.getRevision(), version.getPostfixVersion() ]) content += "<h1>" + str(text_version) + "</h1><br>" content += "" for change in change_logs_dict[version]: if str(change) != "": content += "<b>" + str(change) + "</b><br>" for line in change_logs_dict[version][change]: content += str(line) + "<br>" content += "<br>" return content
def _loadChangeLogText(self) -> str: # Load change log texts and organize them with a dict try: file_path = Resources.getPath(Resources.Texts, "change_log.txt") except FileNotFoundError as e: # I have no idea how / when this happens, but we're getting crash reports about it. return catalog.i18nc("@text:window", "The release notes could not be opened.") + "<br>" + str(e) change_logs_dict = {} # type: Dict[Version, Dict[str, List[str]]] try: with open(file_path, "r", encoding = "utf-8") as f: open_version = None # type: Optional[Version] open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog for line in f: line = line.replace("\n", "") if "[" in line and "]" in line: line = line.replace("[", "") line = line.replace("]", "") open_version = Version(line) if open_version < Version([0, 0, 1]): # Something went wrong with parsing, assume non-numerical alternate version that should be on top. open_version = Version([99, 99, 99]) if Version([14, 99, 99]) < open_version < Version([16, 0, 0]): # Bit of a hack: We released the 15.x.x versions before 2.x open_version = Version([0, open_version.getMinor(), open_version.getRevision(), open_version.getPostfixVersion()]) open_header = "" change_logs_dict[open_version] = collections.OrderedDict() elif line.startswith("*"): open_header = line.replace("*", "") change_logs_dict[cast(Version, open_version)][open_header] = [] elif line != "": if open_header not in change_logs_dict[cast(Version, open_version)]: change_logs_dict[cast(Version, open_version)][open_header] = [] change_logs_dict[cast(Version, open_version)][open_header].append(line) except EnvironmentError as e: return catalog.i18nc("@text:window", "The release notes could not be opened.") + "<br>" + str(e) # Format changelog text content = "" for version in sorted(change_logs_dict.keys(), reverse = True): text_version = version if version < Version([1, 0, 0]): # Bit of a hack: We released the 15.x.x versions before 2.x text_version = Version([15, version.getMinor(), version.getRevision(), version.getPostfixVersion()]) if version > Version([99, 0, 0]): # Leave it out altogether if it was originally a non-numbered version. text_version = "" content += ("<h1>" + str(text_version) + "</h1><br>") if text_version else "" content += "" for change in change_logs_dict[version]: if str(change) != "": content += "<b>" + str(change) + "</b><br>" for line in change_logs_dict[version][change]: content += str(line) + "<br>" content += "<br>" return content
def __initializeStoragePaths(cls) -> None: Logger.log("d", "Initializing storage paths") # use nested structure: <app-name>/<version>/... if cls.ApplicationVersion == "master" or cls.ApplicationVersion == "unknown": storage_dir_name = os.path.join(cls.ApplicationIdentifier, cls.ApplicationVersion) else: version = Version(cls.ApplicationVersion) storage_dir_name = os.path.join( cls.ApplicationIdentifier, "%s.%s" % (version.getMajor(), version.getMinor())) # config is saved in "<CONFIG_ROOT>/<storage_dir_name>" cls.__config_storage_path = os.path.join( Resources._getConfigStorageRootPath(), storage_dir_name) Logger.log("d", "Config storage path is %s", cls.__config_storage_path) # data is saved in # - on Linux: "<DATA_ROOT>/<storage_dir_name>" # - on other: "<CONFIG_DIR>" (in the config directory) data_root_path = Resources._getDataStorageRootPath() cls.__data_storage_path = cls.__config_storage_path if data_root_path is None else \ os.path.join(data_root_path, storage_dir_name) Logger.log("d", "Data storage path is %s", cls.__data_storage_path) # cache is saved in # - on Linux: "<CACHE_DIR>/<storage_dir_name>" # - on Windows: "<CACHE_DIR>/<storage_dir_name>/cache" # - on Mac: "<CONFIG_DIR>/cache" (in the config directory) cache_root_path = Resources._getCacheStorageRootPath() if cache_root_path is None: cls.__cache_storage_path = os.path.join(cls.__config_storage_path, "cache") else: cls.__cache_storage_path = os.path.join(cache_root_path, storage_dir_name) if Platform.isWindows(): cls.__cache_storage_path = os.path.join( cls.__cache_storage_path, "cache") Logger.log("d", "Cache storage path is %s", cls.__cache_storage_path) if not os.path.exists(cls.__config_storage_path) or not os.path.exists( cls.__data_storage_path): cls._copyLatestDirsIfPresent() if not os.path.exists(cls.__cache_storage_path): try: os.makedirs(cls.__cache_storage_path, exist_ok=True) except EnvironmentError as e: Logger.error(f"Unable to create cache path: {e}") cls.__paths.insert(0, cls.__data_storage_path)
def isPackageCompatible(self, package_api_version: UMVersion) -> bool: """ Check whether an API version is compatible with the application's API version. :param package_api_version: The API version to check. :return: ``True`` if packages with this API version are compatible, or ``False`` if they are not. """ app_api_version = self._application.getAPIVersion() if app_api_version.getMajor() != package_api_version.getMajor(): return False # minor versions are backwards compatible if app_api_version.getMinor() < package_api_version.getMinor(): return False return True
def _loadChangeLogText(self) -> str: # Load change log texts and organize them with a dict file_path = Resources.getPath(Resources.Texts, "change_log.txt") change_logs_dict = {} # type: Dict[Version, Dict[str, List[str]]] with open(file_path, "r", encoding = "utf-8") as f: open_version = None # type: Optional[Version] open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog for line in f: line = line.replace("\n", "") if "[" in line and "]" in line: line = line.replace("[", "") line = line.replace("]", "") open_version = Version(line) if open_version > Version([14, 99, 99]): # Bit of a hack: We released the 15.x.x versions before 2.x open_version = Version([0, open_version.getMinor(), open_version.getRevision(), open_version.getPostfixVersion()]) open_header = "" change_logs_dict[open_version] = collections.OrderedDict() elif line.startswith("*"): open_header = line.replace("*", "") change_logs_dict[cast(Version, open_version)][open_header] = [] elif line != "": if open_header not in change_logs_dict[cast(Version, open_version)]: change_logs_dict[cast(Version, open_version)][open_header] = [] change_logs_dict[cast(Version, open_version)][open_header].append(line) # Format changelog text content = "" for version in sorted(change_logs_dict.keys(), reverse = True): text_version = version if version < Version([1, 0, 0]): # Bit of a hack: We released the 15.x.x versions before 2.x text_version = Version([15, version.getMinor(), version.getRevision(), version.getPostfixVersion()]) content += "<h1>" + str(text_version) + "</h1><br>" content += "" for change in change_logs_dict[version]: if str(change) != "": content += "<b>" + str(change) + "</b><br>" for line in change_logs_dict[version][change]: content += str(line) + "<br>" content += "<br>" return content
def __matchVersion(): cura_version = Application.getInstance().getVersion() if cura_version == "master": Logger.log("d", "Running Cura from source, ignoring version of the plugin") return True cura_version = Version(cura_version) cura_version = Version([cura_version.getMajor(), cura_version.getMinor()]) # Get version information from plugin.json plugin_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "plugin.json") try: with open(plugin_file_path) as plugin_file: plugin_info = json.load(plugin_file) minimum_cura_version = Version(plugin_info["minimum_cura_version"]) maximum_cura_version = Version(plugin_info["maximum_cura_version"]) except: Logger.log("w", "Could not get version information for the plugin") return False if cura_version >= minimum_cura_version and cura_version <= maximum_cura_version: return True else: Logger.log("d", "This version of the plugin is not compatible with this version of Cura. Please check for an update.") return False
def __initializeStoragePaths(cls): Logger.log("d", "Initializing storage paths") # use nested structure: <app-name>/<version>/... if cls.ApplicationVersion == "master" or cls.ApplicationVersion == "unknown": storage_dir_name = os.path.join(cls.ApplicationIdentifier, cls.ApplicationVersion) else: from UM.Version import Version version = Version(cls.ApplicationVersion) storage_dir_name = os.path.join(cls.ApplicationIdentifier, "%s.%s" % (version.getMajor(), version.getMinor())) # config is saved in "<CONFIG_ROOT>/<storage_dir_name>" cls.__config_storage_path = os.path.join(Resources._getConfigStorageRootPath(), storage_dir_name) Logger.log("d", "Config storage path is %s", cls.__config_storage_path) # data is saved in # - on Linux: "<DATA_ROOT>/<storage_dir_name>" # - on other: "<CONFIG_DIR>" (in the config directory) data_root_path = Resources._getDataStorageRootPath() cls.__data_storage_path = cls.__config_storage_path if data_root_path is None else \ os.path.join(data_root_path, storage_dir_name) Logger.log("d", "Data storage path is %s", cls.__data_storage_path) # cache is saved in # - on Linux: "<CACHE_DIR>/<storage_dir_name>" # - on Windows: "<CACHE_DIR>/<storage_dir_name>/cache" # - on Mac: "<CONFIG_DIR>/cache" (in the config directory) cache_root_path = Resources._getCacheStorageRootPath() if cache_root_path is None: cls.__cache_storage_path = os.path.join(cls.__config_storage_path, "cache") else: cls.__cache_storage_path = os.path.join(cache_root_path, storage_dir_name) if Platform.isWindows(): cls.__cache_storage_path = os.path.join(cls.__cache_storage_path, "cache") Logger.log("d", "Cache storage path is %s", cls.__cache_storage_path) if not os.path.exists(cls.__config_storage_path): cls._copyLatestDirsIfPresent() cls.__paths.insert(0, cls.__data_storage_path)
def check_version_equals(first_version: Version, second_version: Version): assert first_version == second_version assert first_version.getMajor() == second_version.getMajor() assert first_version.getMinor() == second_version.getMinor() assert first_version.getRevision() == second_version.getRevision()