cmd-queue 0.2.1__py3-none-any.whl → 0.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cmd-queue might be problematic. Click here for more details.
- cmd_queue/__init__.py +1 -1
- cmd_queue/serial_queue.py +7 -43
- cmd_queue/slurm_queue.py +286 -40
- cmd_queue/tmux_queue.py +1 -2
- cmd_queue/util/util_bash.py +52 -0
- cmd_queue/util/util_tmux.py +76 -0
- {cmd_queue-0.2.1.dist-info → cmd_queue-0.2.2.dist-info}/METADATA +183 -172
- {cmd_queue-0.2.1.dist-info → cmd_queue-0.2.2.dist-info}/RECORD +12 -11
- {cmd_queue-0.2.1.dist-info → cmd_queue-0.2.2.dist-info}/WHEEL +1 -1
- {cmd_queue-0.2.1.dist-info → cmd_queue-0.2.2.dist-info}/LICENSE +0 -0
- {cmd_queue-0.2.1.dist-info → cmd_queue-0.2.2.dist-info}/entry_points.txt +0 -0
- {cmd_queue-0.2.1.dist-info → cmd_queue-0.2.2.dist-info}/top_level.txt +0 -0
cmd_queue/__init__.py
CHANGED
cmd_queue/serial_queue.py
CHANGED
|
@@ -7,6 +7,7 @@ import ubelt as ub
|
|
|
7
7
|
import uuid
|
|
8
8
|
from cmd_queue import base_queue
|
|
9
9
|
from cmd_queue.util import util_tags
|
|
10
|
+
from cmd_queue.util import util_bash
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class BashJob(base_queue.Job):
|
|
@@ -169,7 +170,8 @@ class BashJob(base_queue.Job):
|
|
|
169
170
|
json_fmt_parts += [
|
|
170
171
|
('logs', '"%s"', self.log_fpath),
|
|
171
172
|
]
|
|
172
|
-
dump_pre_status =
|
|
173
|
+
dump_pre_status = util_bash.bash_json_dump(json_fmt_parts,
|
|
174
|
+
self.stat_fpath)
|
|
173
175
|
script.append('# Mark job as running')
|
|
174
176
|
script.append(dump_pre_status)
|
|
175
177
|
|
|
@@ -238,7 +240,8 @@ class BashJob(base_queue.Job):
|
|
|
238
240
|
json_fmt_parts += [
|
|
239
241
|
('logs', '"%s"', self.log_fpath),
|
|
240
242
|
]
|
|
241
|
-
dump_post_status =
|
|
243
|
+
dump_post_status = util_bash.bash_json_dump(json_fmt_parts,
|
|
244
|
+
self.stat_fpath)
|
|
242
245
|
|
|
243
246
|
on_pass_part = indent(_job_conditionals['on_pass'])
|
|
244
247
|
on_fail_part = indent(_job_conditionals['on_fail'])
|
|
@@ -459,7 +462,8 @@ class SerialQueue(base_queue.Queue):
|
|
|
459
462
|
('name', '"%s"', self.name),
|
|
460
463
|
('rootid', '"%s"', self.rootid),
|
|
461
464
|
]
|
|
462
|
-
dump_code =
|
|
465
|
+
dump_code = util_bash.bash_json_dump(json_fmt_parts,
|
|
466
|
+
self.state_fpath)
|
|
463
467
|
script.append('# Update queue status')
|
|
464
468
|
script.append(dump_code)
|
|
465
469
|
# script.append('cat ' + str(self.state_fpath))
|
|
@@ -670,46 +674,6 @@ class SerialQueue(base_queue.Queue):
|
|
|
670
674
|
return state
|
|
671
675
|
|
|
672
676
|
|
|
673
|
-
def _bash_json_dump(json_fmt_parts, fpath):
|
|
674
|
-
"""
|
|
675
|
-
Make a printf command that dumps a json file indicating some status in a
|
|
676
|
-
bash environment.
|
|
677
|
-
|
|
678
|
-
Args:
|
|
679
|
-
List[Tuple[str, str, str]]: A list of 3-tupels indicating the name of
|
|
680
|
-
the json key, the printf code, and the bash expression to fill the
|
|
681
|
-
printf code.
|
|
682
|
-
|
|
683
|
-
fpath (str): where bash should write the json file
|
|
684
|
-
|
|
685
|
-
Returns:
|
|
686
|
-
str : the bash that will perform the printf
|
|
687
|
-
|
|
688
|
-
Example:
|
|
689
|
-
>>> from cmd_queue.serial_queue import _bash_json_dump
|
|
690
|
-
>>> json_fmt_parts = [
|
|
691
|
-
>>> ('home', '%s', '$HOME'),
|
|
692
|
-
>>> ('const', '%s', 'MY_CONSTANT'),
|
|
693
|
-
>>> ('ps2', '"%s"', '$PS2'),
|
|
694
|
-
>>> ]
|
|
695
|
-
>>> fpath = 'out.json'
|
|
696
|
-
>>> dump_code = _bash_json_dump(json_fmt_parts, fpath)
|
|
697
|
-
>>> print(dump_code)
|
|
698
|
-
"""
|
|
699
|
-
printf_body_parts = [
|
|
700
|
-
'"{}": {}'.format(k, f) for k, f, v in json_fmt_parts
|
|
701
|
-
]
|
|
702
|
-
printf_arg_parts = [
|
|
703
|
-
'"{}"'.format(v) for k, f, v in json_fmt_parts
|
|
704
|
-
]
|
|
705
|
-
printf_body = r"'{" + ", ".join(printf_body_parts) + r"}\n'"
|
|
706
|
-
printf_args = ' '.join(printf_arg_parts)
|
|
707
|
-
redirect_part = '> ' + str(fpath)
|
|
708
|
-
printf_part = 'printf ' + printf_body + ' \\\n ' + printf_args
|
|
709
|
-
dump_code = printf_part + ' \\\n ' + redirect_part
|
|
710
|
-
return dump_code
|
|
711
|
-
|
|
712
|
-
|
|
713
677
|
def indent(text, prefix=' '):
|
|
714
678
|
r"""
|
|
715
679
|
Indents a block of text
|
cmd_queue/slurm_queue.py
CHANGED
|
@@ -435,6 +435,8 @@ class SlurmQueue(base_queue.Queue):
|
|
|
435
435
|
self.all_depends = None
|
|
436
436
|
self._sbatch_kvargs = ub.udict(kwargs) & SLURM_SBATCH_KVARGS
|
|
437
437
|
self._sbatch_flags = ub.udict(kwargs) & SLURM_SBATCH_FLAGS
|
|
438
|
+
self._include_monitor_metadata = True
|
|
439
|
+
self.jobid_fpath = None
|
|
438
440
|
|
|
439
441
|
def __nice__(self):
|
|
440
442
|
return self.queue_id
|
|
@@ -490,15 +492,29 @@ class SlurmQueue(base_queue.Queue):
|
|
|
490
492
|
# Dont check in this case
|
|
491
493
|
return True
|
|
492
494
|
else:
|
|
493
|
-
|
|
495
|
+
import json
|
|
496
|
+
# sinfo --json changed between v22 and v23
|
|
497
|
+
# https://github.com/SchedMD/slurm/blob/slurm-23.02/RELEASE_NOTES#L230
|
|
498
|
+
if sinfo_major_version == 22:
|
|
499
|
+
sinfo = ub.cmd('sinfo --json')
|
|
500
|
+
else:
|
|
501
|
+
sinfo = ub.cmd('scontrol show nodes --json')
|
|
494
502
|
if sinfo['ret'] == 0:
|
|
495
|
-
import json
|
|
496
503
|
sinfo_out = json.loads(sinfo['out'])
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
504
|
+
nodes = sinfo_out['nodes']
|
|
505
|
+
# FIXME: this might be an incorrect check on v22
|
|
506
|
+
# the v23 version seems different, but I don't have
|
|
507
|
+
# v22 setup anymore. Might not be worth supporting.
|
|
508
|
+
node_states = [node['state'] for node in nodes]
|
|
509
|
+
if sinfo_major_version == 22:
|
|
510
|
+
has_working_nodes = not all(
|
|
511
|
+
'down' in str(state).lower() for state in node_states)
|
|
512
|
+
else:
|
|
513
|
+
has_working_nodes = not all(
|
|
514
|
+
'DOWN' in state for state in node_states)
|
|
500
515
|
if has_working_nodes:
|
|
501
516
|
return True
|
|
517
|
+
|
|
502
518
|
return False
|
|
503
519
|
|
|
504
520
|
def submit(self, command, **kwargs):
|
|
@@ -540,6 +556,12 @@ class SlurmQueue(base_queue.Queue):
|
|
|
540
556
|
self.header_commands.append(command)
|
|
541
557
|
|
|
542
558
|
def order_jobs(self):
|
|
559
|
+
"""
|
|
560
|
+
Get a topological sorting of the jobs in this DAG.
|
|
561
|
+
|
|
562
|
+
Returns:
|
|
563
|
+
List[SlurmJob]: ordered jobs
|
|
564
|
+
"""
|
|
543
565
|
import networkx as nx
|
|
544
566
|
graph = self._dependency_graph()
|
|
545
567
|
if 0:
|
|
@@ -551,6 +573,15 @@ class SlurmQueue(base_queue.Queue):
|
|
|
551
573
|
return new_order
|
|
552
574
|
|
|
553
575
|
def finalize_text(self, exclude_tags=None, **kwargs):
|
|
576
|
+
"""
|
|
577
|
+
Serialize the state of the queue into a bash script.
|
|
578
|
+
|
|
579
|
+
Returns:
|
|
580
|
+
str
|
|
581
|
+
"""
|
|
582
|
+
# generating the slurm bash script is straightforward because slurm
|
|
583
|
+
# will take of the hard stuff (like scheduling) for us. we just need
|
|
584
|
+
# to effectively encode the DAG as a list of sbatch commands.
|
|
554
585
|
exclude_tags = util_tags.Tags.coerce(exclude_tags)
|
|
555
586
|
new_order = self.order_jobs()
|
|
556
587
|
commands = []
|
|
@@ -571,6 +602,20 @@ class SlurmQueue(base_queue.Queue):
|
|
|
571
602
|
jobname_to_varname[job.name] = varname
|
|
572
603
|
commands.append(command)
|
|
573
604
|
self.jobname_to_varname = jobname_to_varname
|
|
605
|
+
|
|
606
|
+
self._include_monitor_metadata = True
|
|
607
|
+
if self._include_monitor_metadata:
|
|
608
|
+
# Build a command to dump the job-ids for this queue to disk to
|
|
609
|
+
# allow us to track them in the monitor.
|
|
610
|
+
from cmd_queue.util import util_bash
|
|
611
|
+
json_fmt_parts = [
|
|
612
|
+
(job_varname, '%s', '$' + job_varname)
|
|
613
|
+
for job_varname in self.jobname_to_varname.values()
|
|
614
|
+
]
|
|
615
|
+
self.jobid_fpath = self.fpath.augment(ext='.jobids.json')
|
|
616
|
+
command = util_bash.bash_json_dump(json_fmt_parts, self.jobid_fpath)
|
|
617
|
+
commands.append(command)
|
|
618
|
+
|
|
574
619
|
text = '\n'.join(commands)
|
|
575
620
|
return text
|
|
576
621
|
|
|
@@ -586,6 +631,25 @@ class SlurmQueue(base_queue.Queue):
|
|
|
586
631
|
def monitor(self, refresh_rate=0.4):
|
|
587
632
|
"""
|
|
588
633
|
Monitor progress until the jobs are done
|
|
634
|
+
|
|
635
|
+
CommandLine:
|
|
636
|
+
xdoctest -m cmd_queue.slurm_queue SlurmQueue.monitor --dev --run
|
|
637
|
+
|
|
638
|
+
Example:
|
|
639
|
+
>>> # xdoctest: +REQUIRES(--dev)
|
|
640
|
+
>>> from cmd_queue.slurm_queue import * # NOQA
|
|
641
|
+
>>> dpath = ub.Path.appdir('slurm_queue/tests/test-slurm-failed-monitor')
|
|
642
|
+
>>> queue = SlurmQueue()
|
|
643
|
+
>>> job0 = queue.submit(f'echo "here we go"', name='job0')
|
|
644
|
+
>>> job1 = queue.submit(f'echo "this job will pass, allowing dependencies to run" && true', depends=[job0])
|
|
645
|
+
>>> job2 = queue.submit(f'echo "this job will run and pass" && sleep 10 && true', depends=[job1])
|
|
646
|
+
>>> job3 = queue.submit(f'echo "this job will run and fail" && false', depends=[job1])
|
|
647
|
+
>>> job4 = queue.submit(f'echo "this job will fail, preventing dependencies from running" && false', depends=[job0])
|
|
648
|
+
>>> job5 = queue.submit(f'echo "this job will never run" && true', depends=[job4])
|
|
649
|
+
>>> job6 = queue.submit(f'echo "this job will also never run" && false', depends=[job4])
|
|
650
|
+
>>> queue.print_commands()
|
|
651
|
+
>>> # xdoctest: +REQUIRES(--run)
|
|
652
|
+
>>> queue.run()
|
|
589
653
|
"""
|
|
590
654
|
|
|
591
655
|
import time
|
|
@@ -597,50 +661,154 @@ class SlurmQueue(base_queue.Queue):
|
|
|
597
661
|
|
|
598
662
|
num_at_start = None
|
|
599
663
|
|
|
664
|
+
job_status_table = None
|
|
665
|
+
if self.jobid_fpath is not None:
|
|
666
|
+
class UnableToMonitor(Exception):
|
|
667
|
+
...
|
|
668
|
+
try:
|
|
669
|
+
import json
|
|
670
|
+
if not self.jobid_fpath.exists():
|
|
671
|
+
raise UnableToMonitor
|
|
672
|
+
jobid_lut = json.loads(self.jobid_fpath.read_text())
|
|
673
|
+
job_status_table = [
|
|
674
|
+
{
|
|
675
|
+
'job_varname': job_varname,
|
|
676
|
+
'job_id': job_id,
|
|
677
|
+
'status': 'unknown',
|
|
678
|
+
'needs_update': True,
|
|
679
|
+
}
|
|
680
|
+
for job_varname, job_id in jobid_lut.items()
|
|
681
|
+
]
|
|
682
|
+
except UnableToMonitor:
|
|
683
|
+
print('ERROR: Unable to monitors jobids')
|
|
684
|
+
|
|
685
|
+
def update_jobid_status():
|
|
686
|
+
import rich
|
|
687
|
+
for row in job_status_table:
|
|
688
|
+
if row['needs_update']:
|
|
689
|
+
job_id = row['job_id']
|
|
690
|
+
out = ub.cmd(f'scontrol show job "{job_id}"')
|
|
691
|
+
info = parse_scontrol_output(out.stdout)
|
|
692
|
+
row['JobState'] = info['JobState']
|
|
693
|
+
row['ExitCode'] = info.get('ExitCode', None)
|
|
694
|
+
# https://slurm.schedmd.com/job_state_codes.html
|
|
695
|
+
if info['JobState'].startswith('FAILED'):
|
|
696
|
+
row['status'] = 'failed'
|
|
697
|
+
rich.print(f'[red] Failed job: {info["JobName"]}')
|
|
698
|
+
if info["StdErr"] == info["StdOut"]:
|
|
699
|
+
rich.print(f'[red] * Logs: {info["StdErr"]}')
|
|
700
|
+
else:
|
|
701
|
+
rich.print(f'[red] StdErr: {info["StdErr"]}')
|
|
702
|
+
rich.print(f'[red] StdOut: {info["StdOut"]}')
|
|
703
|
+
row['needs_update'] = False
|
|
704
|
+
elif info['JobState'].startswith('CANCELLED'):
|
|
705
|
+
rich.print(f'[yellow] Skip job: {info["JobName"]}')
|
|
706
|
+
row['status'] = 'skipped'
|
|
707
|
+
row['needs_update'] = False
|
|
708
|
+
elif info['JobState'].startswith('COMPLETED'):
|
|
709
|
+
rich.print(f'[green] Completed job: {info["JobName"]}')
|
|
710
|
+
row['status'] = 'passed'
|
|
711
|
+
row['needs_update'] = False
|
|
712
|
+
elif info['JobState'].startswith('RUNNING'):
|
|
713
|
+
row['status'] = 'running'
|
|
714
|
+
elif info['JobState'].startswith('PENDING'):
|
|
715
|
+
row['status'] = 'pending'
|
|
716
|
+
else:
|
|
717
|
+
row['status'] = 'unknown'
|
|
718
|
+
# print(f'job_status_table = {ub.urepr(job_status_table, nl=1)}')
|
|
719
|
+
|
|
600
720
|
def update_status_table():
|
|
601
721
|
nonlocal num_at_start
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
if
|
|
624
|
-
|
|
625
|
-
|
|
722
|
+
|
|
723
|
+
# TODO: move this block into into the version where job status
|
|
724
|
+
# table is not available, and reimplement it for the per-job style
|
|
725
|
+
# of query. The reason we have it out here now is because we need
|
|
726
|
+
# to implement the HACK_KILL_BROKEN_JOBS in the alternate case.
|
|
727
|
+
if True:
|
|
728
|
+
# https://rich.readthedocs.io/en/stable/live.html
|
|
729
|
+
info = ub.cmd('squeue --format="%i %P %j %u %t %M %D %R"')
|
|
730
|
+
stream = io.StringIO(info['out'])
|
|
731
|
+
df = pd.read_csv(stream, sep=' ')
|
|
732
|
+
|
|
733
|
+
# Only include job names that this queue created
|
|
734
|
+
job_names = [job.name for job in self.jobs]
|
|
735
|
+
df = df[df['NAME'].isin(job_names)]
|
|
736
|
+
jobid_history.update(df['JOBID'])
|
|
737
|
+
|
|
738
|
+
num_running = (df['ST'] == 'R').sum()
|
|
739
|
+
num_in_queue = len(df)
|
|
740
|
+
total_monitored = len(jobid_history)
|
|
741
|
+
|
|
742
|
+
HACK_KILL_BROKEN_JOBS = 1
|
|
743
|
+
if HACK_KILL_BROKEN_JOBS:
|
|
744
|
+
# For whatever reason using kill-on-invalid-dep
|
|
745
|
+
# kills jobs too fast and not when they are in a dependency state not a
|
|
746
|
+
# a never satisfied state. Killing these jobs here seems to fix
|
|
747
|
+
# it.
|
|
748
|
+
broken_jobs = df[df['NODELIST(REASON)'] == '(DependencyNeverSatisfied)']
|
|
749
|
+
if len(broken_jobs):
|
|
750
|
+
for name in broken_jobs['NAME']:
|
|
751
|
+
ub.cmd(f'scancel --name="{name}"')
|
|
626
752
|
|
|
627
753
|
if num_at_start is None:
|
|
628
754
|
num_at_start = len(df)
|
|
629
755
|
|
|
630
|
-
|
|
756
|
+
if job_status_table is not None:
|
|
757
|
+
update_jobid_status()
|
|
758
|
+
state = ub.dict_hist([row['status'] for row in job_status_table])
|
|
759
|
+
state.setdefault('passed', 0)
|
|
760
|
+
state.setdefault('failed', 0)
|
|
761
|
+
state.setdefault('skipped', 0)
|
|
762
|
+
state.setdefault('pending', 0)
|
|
763
|
+
state.setdefault('unknown', 0)
|
|
764
|
+
state.setdefault('running', 0)
|
|
765
|
+
state['total'] = len(job_status_table)
|
|
766
|
+
|
|
767
|
+
state['other'] = state['total'] - (
|
|
768
|
+
state['passed'] + state['failed'] + state['skipped'] +
|
|
769
|
+
state['running'] + state['pending']
|
|
770
|
+
)
|
|
771
|
+
pass_color = ''
|
|
772
|
+
fail_color = ''
|
|
773
|
+
skip_color = ''
|
|
774
|
+
finished = (state['pending'] + state['unknown'] + state['running'] == 0)
|
|
775
|
+
if (state['failed'] > 0):
|
|
776
|
+
fail_color = '[red]'
|
|
777
|
+
if (state['skipped'] > 0):
|
|
778
|
+
skip_color = '[yellow]'
|
|
779
|
+
if finished:
|
|
780
|
+
pass_color = '[green]'
|
|
781
|
+
|
|
782
|
+
header = ['passed', 'failed', 'skipped', 'running', 'pending', 'other', 'total']
|
|
783
|
+
row_values = [
|
|
784
|
+
f"{pass_color}{state['passed']}",
|
|
785
|
+
f"{fail_color}{state['failed']}",
|
|
786
|
+
f"{skip_color}{state['skipped']}",
|
|
787
|
+
f"{state['running']}",
|
|
788
|
+
f"{state['pending']}",
|
|
789
|
+
f"{state['other']}",
|
|
790
|
+
f"{state['total']}",
|
|
791
|
+
]
|
|
792
|
+
else:
|
|
793
|
+
# TODO: determine if slurm has accounting on, and if we can
|
|
794
|
+
# figure out how many jobs errored / passed
|
|
795
|
+
header = ['num_running', 'num_in_queue', 'total_monitored', 'num_at_start']
|
|
796
|
+
row_values = [
|
|
797
|
+
f'{num_running}',
|
|
798
|
+
f'{num_in_queue}',
|
|
799
|
+
f'{total_monitored}',
|
|
800
|
+
f'{num_at_start}',
|
|
801
|
+
]
|
|
802
|
+
# row_values.append(str(state.get('FAIL', 0)))
|
|
803
|
+
# row_values.append(str(state.get('SKIPPED', 0)))
|
|
804
|
+
# row_values.append(str(state.get('PENDING', 0)))
|
|
805
|
+
finished = (num_in_queue == 0)
|
|
806
|
+
|
|
807
|
+
table = Table(*header,
|
|
631
808
|
title='slurm-monitor')
|
|
632
809
|
|
|
633
|
-
|
|
634
|
-
# figure out how many jobs errored / passed
|
|
635
|
-
|
|
636
|
-
table.add_row(
|
|
637
|
-
f'{num_running}',
|
|
638
|
-
f'{num_in_queue}',
|
|
639
|
-
f'{total_monitored}',
|
|
640
|
-
f'{num_at_start}',
|
|
641
|
-
)
|
|
810
|
+
table.add_row(*row_values)
|
|
642
811
|
|
|
643
|
-
finished = (num_in_queue == 0)
|
|
644
812
|
return table, finished
|
|
645
813
|
|
|
646
814
|
try:
|
|
@@ -680,6 +848,8 @@ class SlurmQueue(base_queue.Queue):
|
|
|
680
848
|
style (str):
|
|
681
849
|
can be 'colors', 'rich', or 'plain'
|
|
682
850
|
|
|
851
|
+
**kwargs: extra backend-specific args passed to finalize_text
|
|
852
|
+
|
|
683
853
|
CommandLine:
|
|
684
854
|
xdoctest -m cmd_queue.slurm_queue SlurmQueue.print_commands
|
|
685
855
|
|
|
@@ -698,6 +868,82 @@ class SlurmQueue(base_queue.Queue):
|
|
|
698
868
|
rprint = print_commands
|
|
699
869
|
|
|
700
870
|
|
|
871
|
+
def parse_scontrol_output(output: str) -> dict:
|
|
872
|
+
"""
|
|
873
|
+
Parses the output of `scontrol show job` into a dictionary.
|
|
874
|
+
|
|
875
|
+
Example:
|
|
876
|
+
from cmd_queue.slurm_queue import * # NOQA
|
|
877
|
+
# Example usage
|
|
878
|
+
output = ub.codeblock(
|
|
879
|
+
'''
|
|
880
|
+
JobId=307 JobName=J0002-SQ-2025 with a space 0218T165929-9a50513a
|
|
881
|
+
UserId=joncrall(1000) GroupId=joncrall(1000) MCS_label=N/A
|
|
882
|
+
Priority=1 Nice=0 Account=(null) QOS=(null)
|
|
883
|
+
JobState=COMPLETED Reason=None Dependency=(null)
|
|
884
|
+
Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
|
|
885
|
+
RunTime=00:00:10 TimeLimit=365-00:00:00 TimeMin=N/A
|
|
886
|
+
SubmitTime=2025-02-18T16:59:30 EligibleTime=2025-02-18T16:59:33
|
|
887
|
+
AccrueTime=Unknown
|
|
888
|
+
StartTime=2025-02-18T16:59:33 EndTime=2025-02-18T16:59:43 Deadline=N/A
|
|
889
|
+
SuspendTime=None SecsPreSuspend=0 LastSchedEval=2025-02-18T16:59:33 Scheduler=Backfill
|
|
890
|
+
Partition=priority AllocNode:Sid=localhost:215414
|
|
891
|
+
ReqNodeList=(null) ExcNodeList=(null)
|
|
892
|
+
NodeList=toothbrush
|
|
893
|
+
BatchHost=toothbrush
|
|
894
|
+
NumNodes=1 NumCPUs=2 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
|
|
895
|
+
ReqTRES=cpu=1,mem=120445M,node=1,billing=1
|
|
896
|
+
AllocTRES=cpu=2,node=1,billing=2
|
|
897
|
+
Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
|
|
898
|
+
MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
|
|
899
|
+
Features=(null) DelayBoot=00:00:00
|
|
900
|
+
OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null)
|
|
901
|
+
Command=(null)
|
|
902
|
+
WorkDir=/home/joncrall/code/cmd_queue
|
|
903
|
+
StdErr="cmd_queue/slurm/SQ-2025021 with a space 8T165929-9a50513a/logs/J0002-SQ-20250218T165929-9a50513a.sh"
|
|
904
|
+
StdIn=/dev/null
|
|
905
|
+
StdOut="slurm/SQ-20 with and = 250218T165929-9a50513a/logs/J0002-SQ-20250218T165929-9a50513a.sh"
|
|
906
|
+
Power=
|
|
907
|
+
''')
|
|
908
|
+
parse_scontrol_output(output)
|
|
909
|
+
"""
|
|
910
|
+
import re
|
|
911
|
+
# These keys should be the last key on a line. They are allowed to contain
|
|
912
|
+
# space and equal characters.
|
|
913
|
+
special_keys = [
|
|
914
|
+
'JobName', 'WorkDir', 'StdErr', 'StdIn', 'StdOut', 'Command',
|
|
915
|
+
'NodeList', 'BatchHost', 'Partition'
|
|
916
|
+
]
|
|
917
|
+
patterns = '(' + '|'.join(f' {re.escape(k)}=' for k in special_keys) + ')'
|
|
918
|
+
pat = re.compile(patterns)
|
|
919
|
+
|
|
920
|
+
# Initialize dictionary to store parsed key-value pairs
|
|
921
|
+
parsed_data = {}
|
|
922
|
+
|
|
923
|
+
# Split the input into lines
|
|
924
|
+
for line in output.splitlines():
|
|
925
|
+
# First, check for special keys (those with spaces before the equal sign)
|
|
926
|
+
match = pat.search(line)
|
|
927
|
+
if match:
|
|
928
|
+
# Special case: Key is a special key with a space
|
|
929
|
+
startpos = match.start()
|
|
930
|
+
leading_part = line[:startpos]
|
|
931
|
+
special_part = line[startpos + 1:]
|
|
932
|
+
key, value = special_part.split('=', 1)
|
|
933
|
+
parsed_data[key] = value.strip()
|
|
934
|
+
line = leading_part
|
|
935
|
+
|
|
936
|
+
# Now, handle the general case: split by spaces and then by "="
|
|
937
|
+
line = line.strip()
|
|
938
|
+
if line:
|
|
939
|
+
parts = line.split(' ')
|
|
940
|
+
for part in parts:
|
|
941
|
+
key, value = part.split('=', 1)
|
|
942
|
+
parsed_data[key] = value
|
|
943
|
+
|
|
944
|
+
return parsed_data
|
|
945
|
+
|
|
946
|
+
|
|
701
947
|
SLURM_NOTES = r"""
|
|
702
948
|
This shows a few things you can do with slurm
|
|
703
949
|
|
cmd_queue/tmux_queue.py
CHANGED
|
@@ -724,7 +724,7 @@ class TMUXMultiQueue(base_queue.Queue):
|
|
|
724
724
|
|
|
725
725
|
CommandLine:
|
|
726
726
|
xdoctest -m cmd_queue.tmux_queue TMUXMultiQueue.monitor:0
|
|
727
|
-
xdoctest -m cmd_queue.tmux_queue TMUXMultiQueue.monitor:1
|
|
727
|
+
INTERACTIVE_TEST=1 xdoctest -m cmd_queue.tmux_queue TMUXMultiQueue.monitor:1
|
|
728
728
|
|
|
729
729
|
Example:
|
|
730
730
|
>>> # xdoctest: +REQUIRES(--interact)
|
|
@@ -855,7 +855,6 @@ class TMUXMultiQueue(base_queue.Queue):
|
|
|
855
855
|
finished &= (state['status'] == 'done')
|
|
856
856
|
if state['status'] == 'done':
|
|
857
857
|
pass_color = '[green]'
|
|
858
|
-
|
|
859
858
|
if (state['failed'] > 0):
|
|
860
859
|
fail_color = '[red]'
|
|
861
860
|
if (state['skipped'] > 0):
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
def bash_json_dump(json_fmt_parts, fpath):
|
|
2
|
+
r"""
|
|
3
|
+
Generate a printf bash command that dumps a JSON file indicating some
|
|
4
|
+
status in a bash environment.
|
|
5
|
+
|
|
6
|
+
Args:
|
|
7
|
+
List[Tuple[str, str, str]]: A list of 3-tuples where each tuple contains:
|
|
8
|
+
- The JSON key (str)
|
|
9
|
+
- The printf format string (str)
|
|
10
|
+
- The bash expression (str) that provides the value to be printed
|
|
11
|
+
|
|
12
|
+
fpath (str): Path where the bash script should write the JSON file.
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
str: The bash command that will perform the printf.
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
>>> from cmd_queue.util.util_bash import * # NOQA
|
|
19
|
+
>>> json_fmt_parts = [
|
|
20
|
+
>>> ('home', '%s', '$HOME'),
|
|
21
|
+
>>> ('const', '%s', 'MY_CONSTANT'),
|
|
22
|
+
>>> ('ps2', '"%s"', '$PS2'),
|
|
23
|
+
>>> ]
|
|
24
|
+
>>> fpath = 'out.json'
|
|
25
|
+
>>> dump_code = bash_json_dump(json_fmt_parts, fpath)
|
|
26
|
+
>>> print(dump_code)
|
|
27
|
+
printf '{"home": %s, "const": %s, "ps2": "%s"}\n' \
|
|
28
|
+
"$HOME" "MY_CONSTANT" "$PS2" \
|
|
29
|
+
> out.json
|
|
30
|
+
|
|
31
|
+
Example:
|
|
32
|
+
>>> from cmd_queue.util.util_bash import * # NOQA
|
|
33
|
+
>>> json_fmt_parts = []
|
|
34
|
+
>>> fpath = 'out.json'
|
|
35
|
+
>>> dump_code = bash_json_dump(json_fmt_parts, fpath)
|
|
36
|
+
>>> print(dump_code)
|
|
37
|
+
printf '{}\n' \
|
|
38
|
+
\
|
|
39
|
+
> out.json
|
|
40
|
+
"""
|
|
41
|
+
printf_body_parts = [
|
|
42
|
+
'"{}": {}'.format(k, f) for k, f, v in json_fmt_parts
|
|
43
|
+
]
|
|
44
|
+
printf_arg_parts = [
|
|
45
|
+
'"{}"'.format(v) for k, f, v in json_fmt_parts
|
|
46
|
+
]
|
|
47
|
+
printf_body = r"'{" + ", ".join(printf_body_parts) + r"}\n'"
|
|
48
|
+
printf_args = ' '.join(printf_arg_parts)
|
|
49
|
+
redirect_part = '> ' + str(fpath)
|
|
50
|
+
printf_part = 'printf ' + printf_body + ' \\\n ' + printf_args
|
|
51
|
+
dump_code = printf_part + ' \\\n ' + redirect_part
|
|
52
|
+
return dump_code
|
cmd_queue/util/util_tmux.py
CHANGED
|
@@ -5,6 +5,16 @@ import ubelt as ub
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
class tmux:
|
|
8
|
+
"""
|
|
9
|
+
TODO:
|
|
10
|
+
- [ ] should use libtmux instead, or provide a compatible minimal API.
|
|
11
|
+
|
|
12
|
+
Example:
|
|
13
|
+
>>> # xdoctest: +SKIP
|
|
14
|
+
>>> from cmd_queue.util.util_tmux import tmux
|
|
15
|
+
>>> sessions = tmux.list_sessions()
|
|
16
|
+
|
|
17
|
+
"""
|
|
8
18
|
|
|
9
19
|
@staticmethod
|
|
10
20
|
def list_sessions():
|
|
@@ -36,3 +46,69 @@ class tmux:
|
|
|
36
46
|
@staticmethod
|
|
37
47
|
def kill_session(target_session, verbose=3):
|
|
38
48
|
return ub.cmd(tmux._kill_session_command(target_session), verbose=verbose)
|
|
49
|
+
|
|
50
|
+
@staticmethod
|
|
51
|
+
def kill_pane(pane_id, verbose=3):
|
|
52
|
+
return ub.cmd(f'tmux kill-pane -t {pane_id}', verbose=verbose)
|
|
53
|
+
|
|
54
|
+
@staticmethod
|
|
55
|
+
def list_panes(target_session):
|
|
56
|
+
"""
|
|
57
|
+
Ignore:
|
|
58
|
+
from cmd_queue.util.util_tmux import tmux
|
|
59
|
+
sessions = tmux.list_sessions()
|
|
60
|
+
rows = []
|
|
61
|
+
for session in tmux.list_sessions():
|
|
62
|
+
target_session = session['id']
|
|
63
|
+
rows.extend(tmux.list_panes(target_session))
|
|
64
|
+
print(f'rows = {ub.urepr(rows, nl=1)}')
|
|
65
|
+
"""
|
|
66
|
+
import json
|
|
67
|
+
# References:
|
|
68
|
+
# https://github.com/tmux-python/libtmux/blob/f705713c7aff1b14e8f8f3ca53d1b0b6ba6e98d0/src/libtmux/formats.py#L80
|
|
69
|
+
PANE_FORMATS = [
|
|
70
|
+
"pane_id",
|
|
71
|
+
"pane_index",
|
|
72
|
+
"pane_pid",
|
|
73
|
+
|
|
74
|
+
"pane_active",
|
|
75
|
+
"pane_dead",
|
|
76
|
+
"pane_in_mode",
|
|
77
|
+
"pane_synchronized",
|
|
78
|
+
"pane_tty",
|
|
79
|
+
"pane_start_command",
|
|
80
|
+
"pane_start_path",
|
|
81
|
+
"pane_current_path",
|
|
82
|
+
"pane_current_command",
|
|
83
|
+
"cursor_x",
|
|
84
|
+
"cursor_y",
|
|
85
|
+
"scroll_region_upper",
|
|
86
|
+
"scroll_region_lower",
|
|
87
|
+
"saved_cursor_x",
|
|
88
|
+
"saved_cursor_y",
|
|
89
|
+
"alternate_on",
|
|
90
|
+
"alternate_saved_x",
|
|
91
|
+
"alternate_saved_y",
|
|
92
|
+
"cursor_flag",
|
|
93
|
+
"insert_flag",
|
|
94
|
+
"keypad_cursor_flag",
|
|
95
|
+
"keypad_flag",
|
|
96
|
+
"wrap_flag",
|
|
97
|
+
"mouse_standard_flag",
|
|
98
|
+
"mouse_button_flag",
|
|
99
|
+
"mouse_any_flag",
|
|
100
|
+
"mouse_utf8_flag",
|
|
101
|
+
"history_size",
|
|
102
|
+
"history_limit",
|
|
103
|
+
"history_bytes",
|
|
104
|
+
"pane_width",
|
|
105
|
+
"pane_height",
|
|
106
|
+
# "pane_title", # removed in 3.1+
|
|
107
|
+
]
|
|
108
|
+
format_code = json.dumps({k: '#{' + k + '}' for k in PANE_FORMATS})
|
|
109
|
+
rows = []
|
|
110
|
+
out = ub.cmd(['tmux', 'list-panes', '-t', str(target_session), '-F', format_code], verbose=0)
|
|
111
|
+
for line in out.stdout.strip().split('\n'):
|
|
112
|
+
row = json.loads(line)
|
|
113
|
+
rows.append(row)
|
|
114
|
+
return rows
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: cmd_queue
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: The cmd_queue module for a DAG of bash commands
|
|
5
5
|
Home-page: https://gitlab.kitware.com/computer-vision/cmd_queue
|
|
6
6
|
Author: Kitware Inc., Jon Crall
|
|
@@ -20,210 +20,221 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
20
20
|
Requires-Python: >=3.8
|
|
21
21
|
Description-Content-Type: text/x-rst
|
|
22
22
|
License-File: LICENSE
|
|
23
|
+
Requires-Dist: numpy>=2.1.0; python_version < "4.0" and python_version >= "3.13"
|
|
24
|
+
Requires-Dist: numpy>=1.26.0; python_version < "3.13" and python_version >= "3.12"
|
|
25
|
+
Requires-Dist: numpy>=1.23.2; python_version < "3.12" and python_version >= "3.11"
|
|
26
|
+
Requires-Dist: numpy>=1.21.6; python_version < "3.11" and python_version >= "3.10"
|
|
27
|
+
Requires-Dist: numpy>=1.19.3; python_version < "3.10" and python_version >= "3.6.0"
|
|
23
28
|
Requires-Dist: ubelt>=1.3.0
|
|
29
|
+
Requires-Dist: networkx>=2.8; python_version < "4.0" and python_version >= "3.11"
|
|
30
|
+
Requires-Dist: networkx>=2.7; python_version < "3.11" and python_version >= "3.8"
|
|
31
|
+
Requires-Dist: networkx>=2.6.2; python_version < "3.8" and python_version >= "3.7"
|
|
32
|
+
Requires-Dist: networkx<=2.5.1,>=2.5.1; python_version < "3.7.0" and python_version >= "3.6.0"
|
|
24
33
|
Requires-Dist: rich>=12.5.1
|
|
34
|
+
Requires-Dist: pandas>=2.2.3; python_version < "4.0" and python_version >= "3.13"
|
|
35
|
+
Requires-Dist: pandas>=2.1.1; python_version < "3.13" and python_version >= "3.12"
|
|
36
|
+
Requires-Dist: pandas>=1.5.0; python_version < "3.12" and python_version >= "3.11"
|
|
37
|
+
Requires-Dist: pandas>=1.4.0; python_version < "3.11" and python_version >= "3.10"
|
|
38
|
+
Requires-Dist: pandas>=1.4.0; python_version < "3.10" and python_version >= "3.9"
|
|
39
|
+
Requires-Dist: pandas>=1.4.0; python_version < "3.9" and python_version >= "3.8"
|
|
40
|
+
Requires-Dist: pandas>=1.3.5; python_version < "3.8" and python_version >= "3.7"
|
|
41
|
+
Requires-Dist: pandas>=1.1.5; python_version < "3.7" and python_version >= "3.6"
|
|
25
42
|
Requires-Dist: scriptconfig>=0.7.9
|
|
26
43
|
Requires-Dist: psutil>=5.9.1
|
|
27
44
|
Requires-Dist: ruamel.yaml>=0.17.22
|
|
28
|
-
Requires-Dist: numpy>=1.19.3; python_version < "3.10" and python_version >= "3.6.0"
|
|
29
|
-
Requires-Dist: pandas>=1.4.0; python_version < "3.10" and python_version >= "3.9"
|
|
30
|
-
Requires-Dist: numpy>=1.21.6; python_version < "3.11" and python_version >= "3.10"
|
|
31
|
-
Requires-Dist: pandas>=1.4.0; python_version < "3.11" and python_version >= "3.10"
|
|
32
|
-
Requires-Dist: networkx>=2.7; python_version < "3.11" and python_version >= "3.8"
|
|
33
|
-
Requires-Dist: numpy>=1.23.2; python_version < "3.12" and python_version >= "3.11"
|
|
34
|
-
Requires-Dist: pandas>=1.5.0; python_version < "3.12" and python_version >= "3.11"
|
|
35
|
-
Requires-Dist: numpy>=1.26.0; python_version < "3.13" and python_version >= "3.12"
|
|
36
|
-
Requires-Dist: pandas>=2.1.1; python_version < "3.13" and python_version >= "3.12"
|
|
37
|
-
Requires-Dist: pandas>=1.1.5; python_version < "3.7" and python_version >= "3.6"
|
|
38
|
-
Requires-Dist: networkx<=2.5.1,>=2.5.1; python_version < "3.7.0" and python_version >= "3.6.0"
|
|
39
|
-
Requires-Dist: networkx>=2.6.2; python_version < "3.8" and python_version >= "3.7"
|
|
40
|
-
Requires-Dist: pandas>=1.3.5; python_version < "3.8" and python_version >= "3.7"
|
|
41
|
-
Requires-Dist: pandas>=1.4.0; python_version < "3.9" and python_version >= "3.8"
|
|
42
|
-
Requires-Dist: networkx>=2.8; python_version < "4.0" and python_version >= "3.11"
|
|
43
|
-
Requires-Dist: numpy>=2.1.0; python_version < "4.0" and python_version >= "3.13"
|
|
44
|
-
Requires-Dist: pandas>=2.2.3; python_version < "4.0" and python_version >= "3.13"
|
|
45
45
|
Provides-Extra: all
|
|
46
|
+
Requires-Dist: numpy>=2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "all"
|
|
47
|
+
Requires-Dist: numpy>=1.26.0; (python_version < "3.13" and python_version >= "3.12") and extra == "all"
|
|
48
|
+
Requires-Dist: numpy>=1.23.2; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
|
|
49
|
+
Requires-Dist: numpy>=1.21.6; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
|
|
50
|
+
Requires-Dist: numpy>=1.19.3; (python_version < "3.10" and python_version >= "3.6.0") and extra == "all"
|
|
46
51
|
Requires-Dist: ubelt>=1.3.0; extra == "all"
|
|
52
|
+
Requires-Dist: networkx>=2.8; (python_version < "4.0" and python_version >= "3.11") and extra == "all"
|
|
53
|
+
Requires-Dist: networkx>=2.7; (python_version < "3.11" and python_version >= "3.8") and extra == "all"
|
|
54
|
+
Requires-Dist: networkx>=2.6.2; (python_version < "3.8" and python_version >= "3.7") and extra == "all"
|
|
55
|
+
Requires-Dist: networkx<=2.5.1,>=2.5.1; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "all"
|
|
47
56
|
Requires-Dist: rich>=12.5.1; extra == "all"
|
|
57
|
+
Requires-Dist: pandas>=2.2.3; (python_version < "4.0" and python_version >= "3.13") and extra == "all"
|
|
58
|
+
Requires-Dist: pandas>=2.1.1; (python_version < "3.13" and python_version >= "3.12") and extra == "all"
|
|
59
|
+
Requires-Dist: pandas>=1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
|
|
60
|
+
Requires-Dist: pandas>=1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
|
|
61
|
+
Requires-Dist: pandas>=1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
|
|
62
|
+
Requires-Dist: pandas>=1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
|
|
63
|
+
Requires-Dist: pandas>=1.3.5; (python_version < "3.8" and python_version >= "3.7") and extra == "all"
|
|
64
|
+
Requires-Dist: pandas>=1.1.5; (python_version < "3.7" and python_version >= "3.6") and extra == "all"
|
|
48
65
|
Requires-Dist: scriptconfig>=0.7.9; extra == "all"
|
|
49
66
|
Requires-Dist: psutil>=5.9.1; extra == "all"
|
|
50
67
|
Requires-Dist: ruamel.yaml>=0.17.22; extra == "all"
|
|
68
|
+
Requires-Dist: pytest>=7.1.0; python_version >= "3.7" and extra == "all"
|
|
69
|
+
Requires-Dist: pytest>=6.2.0; (python_version < "3.7" and python_version >= "3.6") and extra == "all"
|
|
51
70
|
Requires-Dist: xdoctest>=1.0.1; extra == "all"
|
|
52
|
-
|
|
53
|
-
Requires-Dist:
|
|
54
|
-
Requires-Dist: rich==12.5.1; extra == "all-strict"
|
|
55
|
-
Requires-Dist: scriptconfig==0.7.9; extra == "all-strict"
|
|
56
|
-
Requires-Dist: psutil==5.9.1; extra == "all-strict"
|
|
57
|
-
Requires-Dist: ruamel.yaml==0.17.22; extra == "all-strict"
|
|
58
|
-
Requires-Dist: xdoctest==1.0.1; extra == "all-strict"
|
|
59
|
-
Requires-Dist: numpy==1.19.3; (python_version < "3.10" and python_version >= "3.6.0") and extra == "all-strict"
|
|
60
|
-
Requires-Dist: pandas==1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
|
|
61
|
-
Requires-Dist: coverage==5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
|
|
62
|
-
Requires-Dist: pint==0.18; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
|
|
63
|
-
Requires-Dist: numpy==1.21.6; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
|
|
64
|
-
Requires-Dist: pandas==1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
|
|
65
|
-
Requires-Dist: pint==0.18; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
|
|
66
|
-
Requires-Dist: networkx==2.7; (python_version < "3.11" and python_version >= "3.8") and extra == "all-strict"
|
|
67
|
-
Requires-Dist: numpy==1.23.2; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
|
|
68
|
-
Requires-Dist: pandas==1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
|
|
69
|
-
Requires-Dist: pint==0.18; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
|
|
70
|
-
Requires-Dist: numpy==1.26.0; (python_version < "3.13" and python_version >= "3.12") and extra == "all-strict"
|
|
71
|
-
Requires-Dist: pandas==2.1.1; (python_version < "3.13" and python_version >= "3.12") and extra == "all-strict"
|
|
72
|
-
Requires-Dist: pint==0.23; (python_version < "3.13" and python_version >= "3.12") and extra == "all-strict"
|
|
73
|
-
Requires-Dist: pandas==1.1.5; (python_version < "3.7" and python_version >= "3.6") and extra == "all-strict"
|
|
74
|
-
Requires-Dist: pytest==6.2.0; (python_version < "3.7" and python_version >= "3.6") and extra == "all-strict"
|
|
75
|
-
Requires-Dist: coverage==6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "all-strict"
|
|
76
|
-
Requires-Dist: networkx<=2.5.1,==2.5.1; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "all-strict"
|
|
77
|
-
Requires-Dist: networkx==2.6.2; (python_version < "3.8" and python_version >= "3.7") and extra == "all-strict"
|
|
78
|
-
Requires-Dist: pandas==1.3.5; (python_version < "3.8" and python_version >= "3.7") and extra == "all-strict"
|
|
79
|
-
Requires-Dist: coverage==6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "all-strict"
|
|
80
|
-
Requires-Dist: pandas==1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
|
|
81
|
-
Requires-Dist: coverage==6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
|
|
82
|
-
Requires-Dist: pint==0.18; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
|
|
83
|
-
Requires-Dist: networkx==2.8; (python_version < "4.0" and python_version >= "3.11") and extra == "all-strict"
|
|
84
|
-
Requires-Dist: numpy==2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "all-strict"
|
|
85
|
-
Requires-Dist: pandas==2.2.3; (python_version < "4.0" and python_version >= "3.13") and extra == "all-strict"
|
|
86
|
-
Requires-Dist: pint==0.24.4; (python_version < "4.0" and python_version >= "3.13") and extra == "all-strict"
|
|
87
|
-
Requires-Dist: coverage==6.1.1; python_version >= "3.10" and extra == "all-strict"
|
|
88
|
-
Requires-Dist: pytest-cov==3.0.0; python_version >= "3.6.0" and extra == "all-strict"
|
|
89
|
-
Requires-Dist: pytest==7.1.0; python_version >= "3.7" and extra == "all-strict"
|
|
90
|
-
Requires-Dist: textual==0.1.18; python_version >= "3.7" and extra == "all-strict"
|
|
91
|
-
Requires-Dist: numpy>=1.19.3; (python_version < "3.10" and python_version >= "3.6.0") and extra == "all"
|
|
92
|
-
Requires-Dist: pandas>=1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
|
|
71
|
+
Requires-Dist: pytest-cov>=3.0.0; python_version >= "3.6.0" and extra == "all"
|
|
72
|
+
Requires-Dist: coverage>=6.1.1; python_version >= "3.10" and extra == "all"
|
|
93
73
|
Requires-Dist: coverage>=5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
|
|
94
|
-
Requires-Dist: pint>=0.18; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
|
|
95
|
-
Requires-Dist: numpy>=1.21.6; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
|
|
96
|
-
Requires-Dist: pandas>=1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
|
|
97
|
-
Requires-Dist: pint>=0.18; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
|
|
98
|
-
Requires-Dist: networkx>=2.7; (python_version < "3.11" and python_version >= "3.8") and extra == "all"
|
|
99
|
-
Requires-Dist: numpy>=1.23.2; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
|
|
100
|
-
Requires-Dist: pandas>=1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
|
|
101
|
-
Requires-Dist: pint>=0.18; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
|
|
102
|
-
Requires-Dist: numpy>=1.26.0; (python_version < "3.13" and python_version >= "3.12") and extra == "all"
|
|
103
|
-
Requires-Dist: pandas>=2.1.1; (python_version < "3.13" and python_version >= "3.12") and extra == "all"
|
|
104
|
-
Requires-Dist: pint>=0.23; (python_version < "3.13" and python_version >= "3.12") and extra == "all"
|
|
105
|
-
Requires-Dist: pandas>=1.1.5; (python_version < "3.7" and python_version >= "3.6") and extra == "all"
|
|
106
|
-
Requires-Dist: pytest>=6.2.0; (python_version < "3.7" and python_version >= "3.6") and extra == "all"
|
|
107
|
-
Requires-Dist: coverage>=6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "all"
|
|
108
|
-
Requires-Dist: networkx<=2.5.1,>=2.5.1; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "all"
|
|
109
|
-
Requires-Dist: networkx>=2.6.2; (python_version < "3.8" and python_version >= "3.7") and extra == "all"
|
|
110
|
-
Requires-Dist: pandas>=1.3.5; (python_version < "3.8" and python_version >= "3.7") and extra == "all"
|
|
111
|
-
Requires-Dist: coverage>=6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "all"
|
|
112
|
-
Requires-Dist: pandas>=1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
|
|
113
74
|
Requires-Dist: coverage>=6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
|
|
114
|
-
Requires-Dist:
|
|
115
|
-
Requires-Dist:
|
|
116
|
-
Requires-Dist: numpy>=2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "all"
|
|
117
|
-
Requires-Dist: pandas>=2.2.3; (python_version < "4.0" and python_version >= "3.13") and extra == "all"
|
|
118
|
-
Requires-Dist: pint>=0.24.4; (python_version < "4.0" and python_version >= "3.13") and extra == "all"
|
|
119
|
-
Requires-Dist: coverage>=6.1.1; python_version >= "3.10" and extra == "all"
|
|
120
|
-
Requires-Dist: pytest-cov>=3.0.0; python_version >= "3.6.0" and extra == "all"
|
|
121
|
-
Requires-Dist: pytest>=7.1.0; python_version >= "3.7" and extra == "all"
|
|
75
|
+
Requires-Dist: coverage>=6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "all"
|
|
76
|
+
Requires-Dist: coverage>=6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "all"
|
|
122
77
|
Requires-Dist: textual>=0.1.18; python_version >= "3.7" and extra == "all"
|
|
78
|
+
Requires-Dist: pint>=0.24.4; (python_version < "4.0" and python_version >= "3.13") and extra == "all"
|
|
79
|
+
Requires-Dist: pint>=0.23; (python_version < "3.13" and python_version >= "3.12") and extra == "all"
|
|
80
|
+
Requires-Dist: pint>=0.18; (python_version < "3.12" and python_version >= "3.11") and extra == "all"
|
|
81
|
+
Requires-Dist: pint>=0.18; (python_version < "3.11" and python_version >= "3.10") and extra == "all"
|
|
82
|
+
Requires-Dist: pint>=0.18; (python_version < "3.10" and python_version >= "3.9") and extra == "all"
|
|
83
|
+
Requires-Dist: pint>=0.18; (python_version < "3.9" and python_version >= "3.8") and extra == "all"
|
|
84
|
+
Provides-Extra: runtime
|
|
85
|
+
Requires-Dist: numpy>=2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime"
|
|
86
|
+
Requires-Dist: numpy>=1.26.0; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime"
|
|
87
|
+
Requires-Dist: numpy>=1.23.2; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime"
|
|
88
|
+
Requires-Dist: numpy>=1.21.6; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime"
|
|
89
|
+
Requires-Dist: numpy>=1.19.3; (python_version < "3.10" and python_version >= "3.6.0") and extra == "runtime"
|
|
90
|
+
Requires-Dist: ubelt>=1.3.0; extra == "runtime"
|
|
91
|
+
Requires-Dist: networkx>=2.8; (python_version < "4.0" and python_version >= "3.11") and extra == "runtime"
|
|
92
|
+
Requires-Dist: networkx>=2.7; (python_version < "3.11" and python_version >= "3.8") and extra == "runtime"
|
|
93
|
+
Requires-Dist: networkx>=2.6.2; (python_version < "3.8" and python_version >= "3.7") and extra == "runtime"
|
|
94
|
+
Requires-Dist: networkx<=2.5.1,>=2.5.1; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "runtime"
|
|
95
|
+
Requires-Dist: rich>=12.5.1; extra == "runtime"
|
|
96
|
+
Requires-Dist: pandas>=2.2.3; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime"
|
|
97
|
+
Requires-Dist: pandas>=2.1.1; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime"
|
|
98
|
+
Requires-Dist: pandas>=1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime"
|
|
99
|
+
Requires-Dist: pandas>=1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime"
|
|
100
|
+
Requires-Dist: pandas>=1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "runtime"
|
|
101
|
+
Requires-Dist: pandas>=1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "runtime"
|
|
102
|
+
Requires-Dist: pandas>=1.3.5; (python_version < "3.8" and python_version >= "3.7") and extra == "runtime"
|
|
103
|
+
Requires-Dist: pandas>=1.1.5; (python_version < "3.7" and python_version >= "3.6") and extra == "runtime"
|
|
104
|
+
Requires-Dist: scriptconfig>=0.7.9; extra == "runtime"
|
|
105
|
+
Requires-Dist: psutil>=5.9.1; extra == "runtime"
|
|
106
|
+
Requires-Dist: ruamel.yaml>=0.17.22; extra == "runtime"
|
|
107
|
+
Provides-Extra: tests
|
|
108
|
+
Requires-Dist: pytest>=7.1.0; python_version >= "3.7" and extra == "tests"
|
|
109
|
+
Requires-Dist: pytest>=6.2.0; (python_version < "3.7" and python_version >= "3.6") and extra == "tests"
|
|
110
|
+
Requires-Dist: xdoctest>=1.0.1; extra == "tests"
|
|
111
|
+
Requires-Dist: pytest-cov>=3.0.0; python_version >= "3.6.0" and extra == "tests"
|
|
112
|
+
Requires-Dist: coverage>=6.1.1; python_version >= "3.10" and extra == "tests"
|
|
113
|
+
Requires-Dist: coverage>=5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "tests"
|
|
114
|
+
Requires-Dist: coverage>=6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "tests"
|
|
115
|
+
Requires-Dist: coverage>=6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "tests"
|
|
116
|
+
Requires-Dist: coverage>=6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "tests"
|
|
117
|
+
Provides-Extra: optional
|
|
118
|
+
Requires-Dist: textual>=0.1.18; python_version >= "3.7" and extra == "optional"
|
|
119
|
+
Requires-Dist: pint>=0.24.4; (python_version < "4.0" and python_version >= "3.13") and extra == "optional"
|
|
120
|
+
Requires-Dist: pint>=0.23; (python_version < "3.13" and python_version >= "3.12") and extra == "optional"
|
|
121
|
+
Requires-Dist: pint>=0.18; (python_version < "3.12" and python_version >= "3.11") and extra == "optional"
|
|
122
|
+
Requires-Dist: pint>=0.18; (python_version < "3.11" and python_version >= "3.10") and extra == "optional"
|
|
123
|
+
Requires-Dist: pint>=0.18; (python_version < "3.10" and python_version >= "3.9") and extra == "optional"
|
|
124
|
+
Requires-Dist: pint>=0.18; (python_version < "3.9" and python_version >= "3.8") and extra == "optional"
|
|
123
125
|
Provides-Extra: docs
|
|
124
126
|
Requires-Dist: sphinx>=5.0.1; extra == "docs"
|
|
125
127
|
Requires-Dist: sphinx-autobuild>=2021.3.14; extra == "docs"
|
|
126
|
-
Requires-Dist:
|
|
128
|
+
Requires-Dist: sphinx_rtd_theme>=1.0.0; extra == "docs"
|
|
127
129
|
Requires-Dist: sphinxcontrib-napoleon>=0.7; extra == "docs"
|
|
128
130
|
Requires-Dist: sphinx-autoapi>=1.8.4; extra == "docs"
|
|
129
131
|
Requires-Dist: Pygments>=2.9.0; extra == "docs"
|
|
130
|
-
Requires-Dist:
|
|
132
|
+
Requires-Dist: myst_parser>=0.18.0; extra == "docs"
|
|
131
133
|
Requires-Dist: sphinx-reredirects>=0.0.1; extra == "docs"
|
|
132
|
-
Provides-Extra: docs-strict
|
|
133
|
-
Requires-Dist: sphinx==5.0.1; extra == "docs-strict"
|
|
134
|
-
Requires-Dist: sphinx-autobuild==2021.3.14; extra == "docs-strict"
|
|
135
|
-
Requires-Dist: sphinx-rtd-theme==1.0.0; extra == "docs-strict"
|
|
136
|
-
Requires-Dist: sphinxcontrib-napoleon==0.7; extra == "docs-strict"
|
|
137
|
-
Requires-Dist: sphinx-autoapi==1.8.4; extra == "docs-strict"
|
|
138
|
-
Requires-Dist: Pygments==2.9.0; extra == "docs-strict"
|
|
139
|
-
Requires-Dist: myst-parser==0.18.0; extra == "docs-strict"
|
|
140
|
-
Requires-Dist: sphinx-reredirects==0.0.1; extra == "docs-strict"
|
|
141
134
|
Provides-Extra: linting
|
|
142
135
|
Requires-Dist: flake8>=5.0.0; extra == "linting"
|
|
143
|
-
Provides-Extra:
|
|
144
|
-
Requires-Dist:
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
Requires-Dist:
|
|
148
|
-
Requires-Dist:
|
|
149
|
-
Requires-Dist:
|
|
150
|
-
Requires-Dist:
|
|
151
|
-
Requires-Dist:
|
|
152
|
-
Requires-Dist:
|
|
153
|
-
Requires-Dist:
|
|
154
|
-
Requires-Dist:
|
|
155
|
-
Requires-Dist:
|
|
156
|
-
Requires-Dist:
|
|
157
|
-
Requires-Dist:
|
|
158
|
-
Requires-Dist:
|
|
159
|
-
Requires-Dist:
|
|
160
|
-
Requires-Dist:
|
|
161
|
-
|
|
162
|
-
Requires-Dist:
|
|
163
|
-
Requires-Dist:
|
|
164
|
-
Requires-Dist:
|
|
165
|
-
Requires-Dist:
|
|
166
|
-
Requires-Dist:
|
|
136
|
+
Provides-Extra: all-strict
|
|
137
|
+
Requires-Dist: numpy==2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "all-strict"
|
|
138
|
+
Requires-Dist: numpy==1.26.0; (python_version < "3.13" and python_version >= "3.12") and extra == "all-strict"
|
|
139
|
+
Requires-Dist: numpy==1.23.2; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
|
|
140
|
+
Requires-Dist: numpy==1.21.6; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
|
|
141
|
+
Requires-Dist: numpy==1.19.3; (python_version < "3.10" and python_version >= "3.6.0") and extra == "all-strict"
|
|
142
|
+
Requires-Dist: ubelt==1.3.0; extra == "all-strict"
|
|
143
|
+
Requires-Dist: networkx==2.8; (python_version < "4.0" and python_version >= "3.11") and extra == "all-strict"
|
|
144
|
+
Requires-Dist: networkx==2.7; (python_version < "3.11" and python_version >= "3.8") and extra == "all-strict"
|
|
145
|
+
Requires-Dist: networkx==2.6.2; (python_version < "3.8" and python_version >= "3.7") and extra == "all-strict"
|
|
146
|
+
Requires-Dist: networkx<=2.5.1,==2.5.1; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "all-strict"
|
|
147
|
+
Requires-Dist: rich==12.5.1; extra == "all-strict"
|
|
148
|
+
Requires-Dist: pandas==2.2.3; (python_version < "4.0" and python_version >= "3.13") and extra == "all-strict"
|
|
149
|
+
Requires-Dist: pandas==2.1.1; (python_version < "3.13" and python_version >= "3.12") and extra == "all-strict"
|
|
150
|
+
Requires-Dist: pandas==1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
|
|
151
|
+
Requires-Dist: pandas==1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
|
|
152
|
+
Requires-Dist: pandas==1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
|
|
153
|
+
Requires-Dist: pandas==1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
|
|
154
|
+
Requires-Dist: pandas==1.3.5; (python_version < "3.8" and python_version >= "3.7") and extra == "all-strict"
|
|
155
|
+
Requires-Dist: pandas==1.1.5; (python_version < "3.7" and python_version >= "3.6") and extra == "all-strict"
|
|
156
|
+
Requires-Dist: scriptconfig==0.7.9; extra == "all-strict"
|
|
157
|
+
Requires-Dist: psutil==5.9.1; extra == "all-strict"
|
|
158
|
+
Requires-Dist: ruamel.yaml==0.17.22; extra == "all-strict"
|
|
159
|
+
Requires-Dist: pytest==7.1.0; python_version >= "3.7" and extra == "all-strict"
|
|
160
|
+
Requires-Dist: pytest==6.2.0; (python_version < "3.7" and python_version >= "3.6") and extra == "all-strict"
|
|
161
|
+
Requires-Dist: xdoctest==1.0.1; extra == "all-strict"
|
|
162
|
+
Requires-Dist: pytest-cov==3.0.0; python_version >= "3.6.0" and extra == "all-strict"
|
|
163
|
+
Requires-Dist: coverage==6.1.1; python_version >= "3.10" and extra == "all-strict"
|
|
164
|
+
Requires-Dist: coverage==5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
|
|
165
|
+
Requires-Dist: coverage==6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
|
|
166
|
+
Requires-Dist: coverage==6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "all-strict"
|
|
167
|
+
Requires-Dist: coverage==6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "all-strict"
|
|
168
|
+
Requires-Dist: textual==0.1.18; python_version >= "3.7" and extra == "all-strict"
|
|
169
|
+
Requires-Dist: pint==0.24.4; (python_version < "4.0" and python_version >= "3.13") and extra == "all-strict"
|
|
170
|
+
Requires-Dist: pint==0.23; (python_version < "3.13" and python_version >= "3.12") and extra == "all-strict"
|
|
171
|
+
Requires-Dist: pint==0.18; (python_version < "3.12" and python_version >= "3.11") and extra == "all-strict"
|
|
172
|
+
Requires-Dist: pint==0.18; (python_version < "3.11" and python_version >= "3.10") and extra == "all-strict"
|
|
173
|
+
Requires-Dist: pint==0.18; (python_version < "3.10" and python_version >= "3.9") and extra == "all-strict"
|
|
174
|
+
Requires-Dist: pint==0.18; (python_version < "3.9" and python_version >= "3.8") and extra == "all-strict"
|
|
167
175
|
Provides-Extra: runtime-strict
|
|
176
|
+
Requires-Dist: numpy==2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime-strict"
|
|
177
|
+
Requires-Dist: numpy==1.26.0; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime-strict"
|
|
178
|
+
Requires-Dist: numpy==1.23.2; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime-strict"
|
|
179
|
+
Requires-Dist: numpy==1.21.6; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime-strict"
|
|
180
|
+
Requires-Dist: numpy==1.19.3; (python_version < "3.10" and python_version >= "3.6.0") and extra == "runtime-strict"
|
|
168
181
|
Requires-Dist: ubelt==1.3.0; extra == "runtime-strict"
|
|
182
|
+
Requires-Dist: networkx==2.8; (python_version < "4.0" and python_version >= "3.11") and extra == "runtime-strict"
|
|
183
|
+
Requires-Dist: networkx==2.7; (python_version < "3.11" and python_version >= "3.8") and extra == "runtime-strict"
|
|
184
|
+
Requires-Dist: networkx==2.6.2; (python_version < "3.8" and python_version >= "3.7") and extra == "runtime-strict"
|
|
185
|
+
Requires-Dist: networkx<=2.5.1,==2.5.1; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "runtime-strict"
|
|
169
186
|
Requires-Dist: rich==12.5.1; extra == "runtime-strict"
|
|
187
|
+
Requires-Dist: pandas==2.2.3; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime-strict"
|
|
188
|
+
Requires-Dist: pandas==2.1.1; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime-strict"
|
|
189
|
+
Requires-Dist: pandas==1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime-strict"
|
|
190
|
+
Requires-Dist: pandas==1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime-strict"
|
|
191
|
+
Requires-Dist: pandas==1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "runtime-strict"
|
|
192
|
+
Requires-Dist: pandas==1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "runtime-strict"
|
|
193
|
+
Requires-Dist: pandas==1.3.5; (python_version < "3.8" and python_version >= "3.7") and extra == "runtime-strict"
|
|
194
|
+
Requires-Dist: pandas==1.1.5; (python_version < "3.7" and python_version >= "3.6") and extra == "runtime-strict"
|
|
170
195
|
Requires-Dist: scriptconfig==0.7.9; extra == "runtime-strict"
|
|
171
196
|
Requires-Dist: psutil==5.9.1; extra == "runtime-strict"
|
|
172
197
|
Requires-Dist: ruamel.yaml==0.17.22; extra == "runtime-strict"
|
|
173
|
-
Requires-Dist: numpy==1.19.3; (python_version < "3.10" and python_version >= "3.6.0") and extra == "runtime-strict"
|
|
174
|
-
Requires-Dist: pandas==1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "runtime-strict"
|
|
175
|
-
Requires-Dist: numpy==1.21.6; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime-strict"
|
|
176
|
-
Requires-Dist: pandas==1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime-strict"
|
|
177
|
-
Requires-Dist: networkx==2.7; (python_version < "3.11" and python_version >= "3.8") and extra == "runtime-strict"
|
|
178
|
-
Requires-Dist: numpy==1.23.2; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime-strict"
|
|
179
|
-
Requires-Dist: pandas==1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime-strict"
|
|
180
|
-
Requires-Dist: numpy==1.26.0; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime-strict"
|
|
181
|
-
Requires-Dist: pandas==2.1.1; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime-strict"
|
|
182
|
-
Requires-Dist: pandas==1.1.5; (python_version < "3.7" and python_version >= "3.6") and extra == "runtime-strict"
|
|
183
|
-
Requires-Dist: networkx<=2.5.1,==2.5.1; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "runtime-strict"
|
|
184
|
-
Requires-Dist: networkx==2.6.2; (python_version < "3.8" and python_version >= "3.7") and extra == "runtime-strict"
|
|
185
|
-
Requires-Dist: pandas==1.3.5; (python_version < "3.8" and python_version >= "3.7") and extra == "runtime-strict"
|
|
186
|
-
Requires-Dist: pandas==1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "runtime-strict"
|
|
187
|
-
Requires-Dist: networkx==2.8; (python_version < "4.0" and python_version >= "3.11") and extra == "runtime-strict"
|
|
188
|
-
Requires-Dist: numpy==2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime-strict"
|
|
189
|
-
Requires-Dist: pandas==2.2.3; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime-strict"
|
|
190
|
-
Requires-Dist: numpy>=1.19.3; (python_version < "3.10" and python_version >= "3.6.0") and extra == "runtime"
|
|
191
|
-
Requires-Dist: pandas>=1.4.0; (python_version < "3.10" and python_version >= "3.9") and extra == "runtime"
|
|
192
|
-
Requires-Dist: numpy>=1.21.6; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime"
|
|
193
|
-
Requires-Dist: pandas>=1.4.0; (python_version < "3.11" and python_version >= "3.10") and extra == "runtime"
|
|
194
|
-
Requires-Dist: networkx>=2.7; (python_version < "3.11" and python_version >= "3.8") and extra == "runtime"
|
|
195
|
-
Requires-Dist: numpy>=1.23.2; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime"
|
|
196
|
-
Requires-Dist: pandas>=1.5.0; (python_version < "3.12" and python_version >= "3.11") and extra == "runtime"
|
|
197
|
-
Requires-Dist: numpy>=1.26.0; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime"
|
|
198
|
-
Requires-Dist: pandas>=2.1.1; (python_version < "3.13" and python_version >= "3.12") and extra == "runtime"
|
|
199
|
-
Requires-Dist: pandas>=1.1.5; (python_version < "3.7" and python_version >= "3.6") and extra == "runtime"
|
|
200
|
-
Requires-Dist: networkx<=2.5.1,>=2.5.1; (python_version < "3.7.0" and python_version >= "3.6.0") and extra == "runtime"
|
|
201
|
-
Requires-Dist: networkx>=2.6.2; (python_version < "3.8" and python_version >= "3.7") and extra == "runtime"
|
|
202
|
-
Requires-Dist: pandas>=1.3.5; (python_version < "3.8" and python_version >= "3.7") and extra == "runtime"
|
|
203
|
-
Requires-Dist: pandas>=1.4.0; (python_version < "3.9" and python_version >= "3.8") and extra == "runtime"
|
|
204
|
-
Requires-Dist: networkx>=2.8; (python_version < "4.0" and python_version >= "3.11") and extra == "runtime"
|
|
205
|
-
Requires-Dist: numpy>=2.1.0; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime"
|
|
206
|
-
Requires-Dist: pandas>=2.2.3; (python_version < "4.0" and python_version >= "3.13") and extra == "runtime"
|
|
207
|
-
Provides-Extra: tests
|
|
208
|
-
Requires-Dist: xdoctest>=1.0.1; extra == "tests"
|
|
209
198
|
Provides-Extra: tests-strict
|
|
199
|
+
Requires-Dist: pytest==7.1.0; python_version >= "3.7" and extra == "tests-strict"
|
|
200
|
+
Requires-Dist: pytest==6.2.0; (python_version < "3.7" and python_version >= "3.6") and extra == "tests-strict"
|
|
210
201
|
Requires-Dist: xdoctest==1.0.1; extra == "tests-strict"
|
|
202
|
+
Requires-Dist: pytest-cov==3.0.0; python_version >= "3.6.0" and extra == "tests-strict"
|
|
203
|
+
Requires-Dist: coverage==6.1.1; python_version >= "3.10" and extra == "tests-strict"
|
|
211
204
|
Requires-Dist: coverage==5.3.1; (python_version < "3.10" and python_version >= "3.9") and extra == "tests-strict"
|
|
212
|
-
Requires-Dist: pytest==6.2.0; (python_version < "3.7" and python_version >= "3.6") and extra == "tests-strict"
|
|
213
|
-
Requires-Dist: coverage==6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "tests-strict"
|
|
214
|
-
Requires-Dist: coverage==6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "tests-strict"
|
|
215
205
|
Requires-Dist: coverage==6.1.1; (python_version < "3.9" and python_version >= "3.8") and extra == "tests-strict"
|
|
216
|
-
Requires-Dist: coverage==6.1.1; python_version >= "3.
|
|
217
|
-
Requires-Dist:
|
|
218
|
-
|
|
219
|
-
Requires-Dist:
|
|
220
|
-
Requires-Dist:
|
|
221
|
-
Requires-Dist:
|
|
222
|
-
Requires-Dist:
|
|
223
|
-
Requires-Dist:
|
|
224
|
-
Requires-Dist:
|
|
225
|
-
Requires-Dist:
|
|
226
|
-
|
|
206
|
+
Requires-Dist: coverage==6.1.1; (python_version < "3.8" and python_version >= "3.7") and extra == "tests-strict"
|
|
207
|
+
Requires-Dist: coverage==6.1.1; (python_version < "3.7" and python_version >= "3.6") and extra == "tests-strict"
|
|
208
|
+
Provides-Extra: optional-strict
|
|
209
|
+
Requires-Dist: textual==0.1.18; python_version >= "3.7" and extra == "optional-strict"
|
|
210
|
+
Requires-Dist: pint==0.24.4; (python_version < "4.0" and python_version >= "3.13") and extra == "optional-strict"
|
|
211
|
+
Requires-Dist: pint==0.23; (python_version < "3.13" and python_version >= "3.12") and extra == "optional-strict"
|
|
212
|
+
Requires-Dist: pint==0.18; (python_version < "3.12" and python_version >= "3.11") and extra == "optional-strict"
|
|
213
|
+
Requires-Dist: pint==0.18; (python_version < "3.11" and python_version >= "3.10") and extra == "optional-strict"
|
|
214
|
+
Requires-Dist: pint==0.18; (python_version < "3.10" and python_version >= "3.9") and extra == "optional-strict"
|
|
215
|
+
Requires-Dist: pint==0.18; (python_version < "3.9" and python_version >= "3.8") and extra == "optional-strict"
|
|
216
|
+
Provides-Extra: docs-strict
|
|
217
|
+
Requires-Dist: sphinx==5.0.1; extra == "docs-strict"
|
|
218
|
+
Requires-Dist: sphinx-autobuild==2021.3.14; extra == "docs-strict"
|
|
219
|
+
Requires-Dist: sphinx_rtd_theme==1.0.0; extra == "docs-strict"
|
|
220
|
+
Requires-Dist: sphinxcontrib-napoleon==0.7; extra == "docs-strict"
|
|
221
|
+
Requires-Dist: sphinx-autoapi==1.8.4; extra == "docs-strict"
|
|
222
|
+
Requires-Dist: Pygments==2.9.0; extra == "docs-strict"
|
|
223
|
+
Requires-Dist: myst_parser==0.18.0; extra == "docs-strict"
|
|
224
|
+
Requires-Dist: sphinx-reredirects==0.0.1; extra == "docs-strict"
|
|
225
|
+
Provides-Extra: linting-strict
|
|
226
|
+
Requires-Dist: flake8==5.0.0; extra == "linting-strict"
|
|
227
|
+
Dynamic: author
|
|
228
|
+
Dynamic: author-email
|
|
229
|
+
Dynamic: classifier
|
|
230
|
+
Dynamic: description
|
|
231
|
+
Dynamic: description-content-type
|
|
232
|
+
Dynamic: home-page
|
|
233
|
+
Dynamic: license
|
|
234
|
+
Dynamic: provides-extra
|
|
235
|
+
Dynamic: requires-dist
|
|
236
|
+
Dynamic: requires-python
|
|
237
|
+
Dynamic: summary
|
|
227
238
|
|
|
228
239
|
Command Queue - cmd_queue
|
|
229
240
|
=========================
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
cmd_queue/__init__.py,sha256=
|
|
1
|
+
cmd_queue/__init__.py,sha256=ugr7Z7WGFJP8aF1CdoE7j77szv-SZNHpS6nBlEvBsmM,14898
|
|
2
2
|
cmd_queue/__main__.py,sha256=11Af1e3gd3CeDOj6x-OuHMttQWRvMxiB9xWdgKJeJa0,179
|
|
3
3
|
cmd_queue/__main__.pyi,sha256=UJCsqOQ7pnRJOHYNksDffyazWYrXgu6nCFZkLq_PgxA,51
|
|
4
4
|
cmd_queue/airflow_queue.py,sha256=aQE6t8im2nzJ1w_U5swBDbDEoJWrC8tUr8oEoJcqFLE,10503
|
|
@@ -12,12 +12,12 @@ cmd_queue/main.pyi,sha256=QK2dH-nvCsPSSEDNKlO4Uld6rBHsAIswXrkMd6JK2JU,1199
|
|
|
12
12
|
cmd_queue/monitor_app.py,sha256=m0cROUkBvTfpArjdZBfDvBMYnVJKBU_gDiW4HqENm0o,4641
|
|
13
13
|
cmd_queue/monitor_app.pyi,sha256=iMjOCX4djY-3F5GMlMcYBavm4aKYHz6RZJbsUrh43Po,860
|
|
14
14
|
cmd_queue/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
-
cmd_queue/serial_queue.py,sha256=
|
|
15
|
+
cmd_queue/serial_queue.py,sha256=5hEeGRA77SNMNZPzdYd_-xVhegVbucpSnHU1sXontMY,27100
|
|
16
16
|
cmd_queue/serial_queue.pyi,sha256=puYmRndz0-z8TzGKYrDS3fHs6OMuZT7wbHDv3NKKngU,3163
|
|
17
|
-
cmd_queue/slurm_queue.py,sha256=
|
|
17
|
+
cmd_queue/slurm_queue.py,sha256=VT7JsmZYQxgFZMKs0Tr9K85HgVe6Z8okoCt6JPsYN_Q,38849
|
|
18
18
|
cmd_queue/slurm_queue.pyi,sha256=z67qF4_IncO3YyuPIutk8-xzhQ2zOY_-IvYix0OWqJs,2174
|
|
19
19
|
cmd_queue/slurmify.py,sha256=iBaZxxd1hiZQgPzh_9OFCrieZiwQtaZce3YHwboAXD4,4008
|
|
20
|
-
cmd_queue/tmux_queue.py,sha256=
|
|
20
|
+
cmd_queue/tmux_queue.py,sha256=5fhxl6VnfMCy5FOFdGU4kHq-FO7EJAnm0ovnPK9Y1Mc,43613
|
|
21
21
|
cmd_queue/tmux_queue.pyi,sha256=bBxxQKKVIDGXLmb2O9eHX37lXrJuo4BSePbTDmaEiNc,1992
|
|
22
22
|
cmd_queue/util/__init__.py,sha256=QzlId47F1lzuLyeIIJoPGZR3b9ljJl50sFEcJzYWrB8,1450
|
|
23
23
|
cmd_queue/util/richer.py,sha256=OPXpoXYgdhv_49sskF9FMwj6KCSiNcBo1kNhbuj6hoU,3373
|
|
@@ -28,19 +28,20 @@ cmd_queue/util/textual_extensions.py,sha256=D2WC9ZpNLRo9tSozLBUISVF2rpPKYhE8x2RE
|
|
|
28
28
|
cmd_queue/util/textual_extensions.pyi,sha256=-9erJRxACajeVKPNn1y7ZMg8FBV4EY6Q5so_9yBX1RI,1260
|
|
29
29
|
cmd_queue/util/util_algo.py,sha256=NSHXhNz0YThlks0Ku4Dki3NPCfw3SP-yI-Ul6wd3z30,1663
|
|
30
30
|
cmd_queue/util/util_algo.pyi,sha256=xO8R3oHigzSeFEdbMMbpj3tslQPxLPtkN2yDmTFGwnI,175
|
|
31
|
+
cmd_queue/util/util_bash.py,sha256=GR9i-6wjLsCtP-itI1auEJXW7yECgLkXRCErYsUjGSw,1831
|
|
31
32
|
cmd_queue/util/util_network_text.py,sha256=bLJYY98qEKOngvPWA6SlBfkgOdHltuHWDHLdW0PD5CE,32127
|
|
32
33
|
cmd_queue/util/util_network_text.pyi,sha256=OVOZUtNePgktdpQVEvfritQ4IFimmi5rlgTQ9WkT5UA,1862
|
|
33
34
|
cmd_queue/util/util_networkx.py,sha256=wW1ZKZDy79zfOV76f9fbewY9Zjeb8YCqXKKeaeBld1g,1475
|
|
34
35
|
cmd_queue/util/util_networkx.pyi,sha256=qUjZx421kO3lEQoP5sR3bk35-yOVDaszvVszpb8xsmg,120
|
|
35
36
|
cmd_queue/util/util_tags.py,sha256=Hlxpel759AduUy3Wdq3fCe-XKjxqBUFCLOr3Mw2bzsw,719
|
|
36
37
|
cmd_queue/util/util_tags.pyi,sha256=RXg8yJFvgFCNL7Sbu8Cfxrmg855G4w6badAhhWAc4HQ,123
|
|
37
|
-
cmd_queue/util/util_tmux.py,sha256=
|
|
38
|
+
cmd_queue/util/util_tmux.py,sha256=v922ojywS3wHifLCHGwSfNJN3MI1Q9zU2ZwSpWaPXds,3482
|
|
38
39
|
cmd_queue/util/util_tmux.pyi,sha256=a4XMkzhPntU4MTpeHteZIvOpP0FQt7Qym-tueHojSnQ,246
|
|
39
40
|
cmd_queue/util/util_yaml.py,sha256=5BAuP_fyucB0LrWmXLJLNyXGW7kqbyjJHLlH0zhRiKk,14460
|
|
40
41
|
cmd_queue/util/util_yaml.pyi,sha256=FmbRydo62JgVWtq6oH7ICqVeij8GEpqjEetPiCeO0sE,775
|
|
41
|
-
cmd_queue-0.2.
|
|
42
|
-
cmd_queue-0.2.
|
|
43
|
-
cmd_queue-0.2.
|
|
44
|
-
cmd_queue-0.2.
|
|
45
|
-
cmd_queue-0.2.
|
|
46
|
-
cmd_queue-0.2.
|
|
42
|
+
cmd_queue-0.2.2.dist-info/LICENSE,sha256=o6jcFk_bwjiPUz6vHK0Ju7RwbFp9eXMwAS2BDnwER-4,11343
|
|
43
|
+
cmd_queue-0.2.2.dist-info/METADATA,sha256=0T3KVWLWPgouLQhFQryAIhcBJfY-SCKt5ggIhu8RGBo,38829
|
|
44
|
+
cmd_queue-0.2.2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
45
|
+
cmd_queue-0.2.2.dist-info/entry_points.txt,sha256=HDxa1dTf0Dne-a-QeDu7cWZVYRyEtCvqaau0GCCMEyw,54
|
|
46
|
+
cmd_queue-0.2.2.dist-info/top_level.txt,sha256=C2JVEsOZsjnMx3jIAWhIQGWAXjGs-hyBzzjkOIm7qW8,10
|
|
47
|
+
cmd_queue-0.2.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|