121 lines
2.8 KiB
Python
121 lines
2.8 KiB
Python
"""Model and Helpers for local apps
|
|
|
|
This is useful for the launcher and other apps.
|
|
"""
|
|
|
|
___license___ = "MIT"
|
|
___dependencies___ = ["metadata_reader", "ospath"]
|
|
|
|
from ospath import *
|
|
import os, machine
|
|
from metadata_reader import read_metadata
|
|
|
|
class App:
|
|
"""Models an app and provides some helper functions"""
|
|
def __init__(self, name):
|
|
self.name = name
|
|
self._attributes = None # Load lazily
|
|
|
|
@property
|
|
def folder_path(self):
|
|
return self.name
|
|
|
|
@property
|
|
def main_path(self):
|
|
return self.folder_path + "/main.py"
|
|
|
|
@property
|
|
def loadable(self):
|
|
return isfile(self.main_path)
|
|
|
|
@property
|
|
def description(self):
|
|
return self.get_attribute("doc")
|
|
|
|
@property
|
|
def title(self):
|
|
return self.get_attribute("title", self.name)
|
|
|
|
@property
|
|
def categories(self):
|
|
return self.get_attribute("categories")
|
|
|
|
def matches_category(self, target):
|
|
return target in self.categories
|
|
|
|
@property
|
|
def attributes(self):
|
|
if self._attributes == None:
|
|
try:
|
|
with open(self.main_path) as file:
|
|
self._attributes = read_metadata(file)
|
|
except OSError:
|
|
raise Exception("File %s not found in on badge" % self.main_path)
|
|
return self._attributes
|
|
|
|
def get_attribute(self, attribute, default=None):
|
|
if attribute in self.attributes:
|
|
return self.attributes[attribute]
|
|
return default
|
|
|
|
def uninstall(self):
|
|
try:
|
|
os.remove(self.name)
|
|
except Exception as e:
|
|
pass
|
|
|
|
def boot(self):
|
|
write_launch_file(self.name)
|
|
machine.reset()
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
def __repr__(self):
|
|
return "<App %s>" % (self.name)
|
|
|
|
def __eq__(self, other):
|
|
if isinstance(other, App):
|
|
return self.name == other.name
|
|
return False
|
|
|
|
def __hash__(self):
|
|
return hash(self.name)
|
|
|
|
|
|
_apps = None
|
|
def get_apps(category=None):
|
|
global _apps
|
|
if _apps == None:
|
|
_apps = []
|
|
for path in os.listdir():
|
|
if path.startswith(".") or (not isdir(path)) or path in ["lib", "shared", "upip"]:
|
|
continue
|
|
app = App(path)
|
|
if app.loadable:
|
|
_apps.append(app)
|
|
|
|
if category:
|
|
return [app for app in _apps if app.matches_category(category)]
|
|
return _apps
|
|
|
|
_categories = None
|
|
def get_categories():
|
|
global _categories
|
|
if _categories == None:
|
|
_categories = set()
|
|
for app in get_apps():
|
|
_categories.update(app.categories)
|
|
return _categories
|
|
|
|
def write_launch_file(app, file = "once.txt"):
|
|
with open(file, "wt") as file:
|
|
file.write(app)
|
|
file.flush()
|
|
os.sync()
|
|
|
|
def restart_to_default():
|
|
write_launch_file("")
|
|
machine.reset()
|
|
|