mirror of
https://github.com/chanzuckerberg/cellxgene.git
synced 2026-09-24 07:38:12 +08:00
* icons, partway * redux for values * onChange * cancel * annotations lifecycle for category names * copy categorical * edit category * add Dataframe.withColsFrom * render user annotations; default add/delete annotation category * add label name to actions * category name edit * error checking improvements * change schema field isUserAnnotation to writable * always have an unassigned label; implement delete label * implement add new label and edit label name * label current cell selection * fix select exact bug in crossfilter * clean up categorical reducer * fix tests * remove debugging printf * implement subset/reset for user annotations * undo redo support for user annotations * remove duplicate button from categories * add modal * remove obsolete duplicate annotation reducers * remove old debugging printf * connect modal to annotation create and dup * initial full-stack wiring * finish up end-to-end wiring * fix existing unit tests * fix pytests to match new schema API * remove debugging printfs * add label file rotation * remove obsolete comment * add fbs encode/decode tests * add tests for writable annotations * simplify code * fix hashing bug with FBS encoding * lint * fix smoke tests * improve error checking in Dataframe.withColsFrom * add unit test for Dataframe.withColsFrom * add unit test for Dataframe.columns and Dataframe.renameCol * fix bug in FBS encode, add better error checks, refactor * add FBS encode/decode test * add clarifying comment * clean up action type names; fix state inconsistency in crossfilter update * change autosave timer to 2.5sec * sort categorical metadata render order so it remains consistent * add temporary autogenerated label for add-new-label operation * fix hover-over label menu interference with cell highlighting * remove debugging code * add missing reducer cases & fix typo * make dataframe memoize more general purpose * add dev mode for annos * fix error on select duplicate * handle zero occupancy categories * correctly maintain unclipped AND clipped world * correctly handle zero length FBS matrix and label files * ensure all writable categorical schema contains an unassigned category * handle case where building occupancy stack for category with no members * dialog for creating label, disable button if duplicate or empty * visually separate writeable * edit category * fix edit category name * remove debugging code * fix edit annotation label * visually define unassigned, change options * Pull in requirements.txt from `master` * label currently selected cells * duplicate label * lint * fix pytest merge issues * rename --label-file to --experimental-label-file * remove debugging console log * spelling error fix; fix bug found in PR review. * lint
50 lines
1.0 KiB
Python
50 lines
1.0 KiB
Python
"""
|
|
Helpers for user annotations / label_file parameter
|
|
"""
|
|
from os.path import exists, splitext, getsize
|
|
from os import remove, rename
|
|
import pandas as pd
|
|
|
|
|
|
def read_labels(fname):
|
|
if exists(fname) and getsize(fname) > 0:
|
|
return pd.read_csv(fname, dtype='category')
|
|
else:
|
|
return pd.DataFrame()
|
|
|
|
|
|
def write_labels(fname, df):
|
|
rotate_fname(fname)
|
|
if not df.empty:
|
|
df.to_csv(fname, index=False)
|
|
else:
|
|
open(fname, 'a').close()
|
|
|
|
|
|
def rotate_fname(fname):
|
|
"""
|
|
save N backups of file.
|
|
fname -> fname-0
|
|
fname-0 -> fname->1
|
|
...
|
|
fname-(N-1) -> fname-N
|
|
"""
|
|
|
|
def rotate(src, dst):
|
|
if exists(src):
|
|
if exists(dst):
|
|
remove(dst)
|
|
rename(src, dst)
|
|
|
|
rotation_size = 9 # rotation size
|
|
name, ext = splitext(fname)
|
|
|
|
# rotate existing files
|
|
for i in range(rotation_size - 1, 0, -1):
|
|
src = f"{name}-{i}{ext}"
|
|
tgt = f"{name}-{i+1}{ext}"
|
|
rotate(src, tgt)
|
|
|
|
tgt = f"{name}-1{ext}"
|
|
rotate(fname, tgt)
|