Show More
Commit Description:
merge with algo and add brython files that were missing
Commit Description:
merge with algo and add brython files that were missing
References:
File last commit:
Show/Diff file:
Action:
lib/assets/Lib/browser/local_storage.py
| 92 lines
| 2.9 KiB
| text/x-python
| PythonLexer
|
r584 | # local storage in browser | |||
import sys | ||||
from javascript import JSObject | ||||
from browser import window, console | ||||
has_local_storage = hasattr(window, 'localStorage') | ||||
class __UnProvided(): | ||||
pass | ||||
class LocalStorage(): | ||||
storage_type = "local_storage" | ||||
def __init__(self): | ||||
if not has_local_storage: | ||||
raise EnvironmentError("LocalStorage not available") | ||||
self.store = JSObject(window.localStorage) | ||||
def __delitem__(self, key): | ||||
if (not isinstance(key, str)): | ||||
raise TypeError("key must be string") | ||||
if key not in self: | ||||
raise KeyError(key) | ||||
self.store.removeItem(key) | ||||
def __getitem__(self, key): | ||||
if (not isinstance(key, str)): | ||||
raise TypeError("key must be string") | ||||
res = __BRYTHON__.JSObject(self.store.getItem(key)) | ||||
if res is not None: | ||||
return res | ||||
raise KeyError(key) | ||||
def __setitem__(self, key, value): | ||||
if (not isinstance(key, str)): | ||||
raise TypeError("key must be string") | ||||
if (not isinstance(value, str)): | ||||
raise TypeError("value must be string") | ||||
self.store.setItem(key, value) | ||||
# implement "in" functionality | ||||
def __contains__(self, key): | ||||
if (not isinstance(key, str)): | ||||
raise TypeError("key must be string") | ||||
res = __BRYTHON__.JSObject(self.store.getItem(key)) | ||||
if res is None: | ||||
return False | ||||
return True | ||||
def __iter__(self): | ||||
keys = self.keys() | ||||
return keys.__iter__() | ||||
def get(self, key, default=None): | ||||
if (not isinstance(key, str)): | ||||
raise TypeError("key must be string") | ||||
return __BRYTHON__.JSObject(self.store.getItem(key)) or default | ||||
def pop(self, key, default=__UnProvided()): | ||||
if (not isinstance(key, str)): | ||||
raise TypeError("key must be string") | ||||
if type(default) is __UnProvided: | ||||
ret = self.get(key) | ||||
del self[key] # will throw key error if doesn't exist | ||||
return ret | ||||
else: | ||||
if key in self: | ||||
ret = self.get(key) | ||||
del self[key] | ||||
return ret | ||||
else: | ||||
return default | ||||
# while a real dict provides a view, returning a generator would less helpful than simply returning a list | ||||
# and creating a custom iterator is overkill and would likely result in slower performance | ||||
def keys(self): | ||||
return [__BRYTHON__.JSObject(self.store.key(i)) for i in range(self.store.length)] | ||||
def values(self): | ||||
return [__BRYTHON__.JSObject(self.__getitem__(k)) for k in self.keys()] | ||||
def items(self): | ||||
return list(zip(self.keys(), self.values())) | ||||
def clear(self): | ||||
self.store.clear() | ||||
def __len__(self): | ||||
return self.store.length | ||||
if has_local_storage: | ||||
storage = LocalStorage() | ||||