looper 1.6.0a2__py3-none-any.whl → 1.7.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
looper/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.6.0a2"
1
+ __version__ = "1.7.0"
looper/cli_looper.py CHANGED
@@ -219,19 +219,27 @@ def build_parser():
219
219
  for subparser in [run_subparser, rerun_subparser]:
220
220
  subparser.add_argument(
221
221
  "-u",
222
- "--lump",
222
+ "--lump-s",
223
223
  default=None,
224
224
  metavar="X",
225
225
  type=html_range(min_val=0, max_val=100, step=0.1, value=0),
226
- help="Total input file size (GB) to batch into one job",
226
+ help="Lump by size: total input file size (GB) to batch into one job",
227
227
  )
228
228
  subparser.add_argument(
229
229
  "-n",
230
- "--lumpn",
230
+ "--lump-n",
231
231
  default=None,
232
232
  metavar="N",
233
233
  type=html_range(min_val=1, max_val="num_samples", value=1),
234
- help="Number of commands to batch into one job",
234
+ help="Lump by number: number of samples to batch into one job",
235
+ )
236
+ subparser.add_argument(
237
+ "-j",
238
+ "--lump-j",
239
+ default=None,
240
+ metavar="J",
241
+ type=int,
242
+ help="Lump samples into number of jobs.",
235
243
  )
236
244
 
237
245
  check_subparser.add_argument(
@@ -495,6 +503,18 @@ def build_parser():
495
503
  help="Number of attributes to display",
496
504
  type=int,
497
505
  )
506
+ parser.add_argument(
507
+ "--commands",
508
+ action="version",
509
+ version="{}".format(" ".join(subparsers.choices.keys())),
510
+ )
511
+
512
+ report_subparser.add_argument(
513
+ "--portable",
514
+ help="Makes html report portable.",
515
+ action="store_true",
516
+ )
517
+
498
518
  result.append(parser)
499
519
  return result
500
520
 
looper/conductor.py CHANGED
@@ -6,6 +6,7 @@ import os
6
6
  import subprocess
7
7
  import time
8
8
  import yaml
9
+ from math import ceil
9
10
  from copy import copy, deepcopy
10
11
  from json import loads
11
12
  from subprocess import check_output
@@ -132,6 +133,7 @@ class SubmissionConductor(object):
132
133
  compute_variables=None,
133
134
  max_cmds=None,
134
135
  max_size=None,
136
+ max_jobs=None,
135
137
  automatic=True,
136
138
  collate=False,
137
139
  ):
@@ -166,6 +168,8 @@ class SubmissionConductor(object):
166
168
  include in a single job script.
167
169
  :param int | float | NoneType max_size: Upper bound on total file
168
170
  size of inputs used by the commands lumped into single job script.
171
+ :param int | float | NoneType max_jobs: Upper bound on total number of jobs to
172
+ group samples for submission.
169
173
  :param bool automatic: Whether the submission should be automatic once
170
174
  the pool reaches capacity.
171
175
  :param bool collate: Whether a collate job is to be submitted (runs on
@@ -200,6 +204,16 @@ class SubmissionConductor(object):
200
204
  "{}".format(self.extra_pipe_args)
201
205
  )
202
206
 
207
+ if max_jobs:
208
+ if max_jobs == 0 or max_jobs < 0:
209
+ raise ValueError(
210
+ "If specified, max job command count must be a positive integer, greater than zero."
211
+ )
212
+
213
+ num_samples = len(self.prj.samples)
214
+ samples_per_job = num_samples / max_jobs
215
+ max_cmds = ceil(samples_per_job)
216
+
203
217
  if not self.collate:
204
218
  self.automatic = automatic
205
219
  if max_cmds is None and max_size is None:
looper/looper.py CHANGED
@@ -404,8 +404,9 @@ class Runner(Executor):
404
404
  extra_args=args.command_extra,
405
405
  extra_args_override=args.command_extra_override,
406
406
  ignore_flags=args.ignore_flags,
407
- max_cmds=args.lumpn,
408
- max_size=args.lump,
407
+ max_cmds=args.lump_n,
408
+ max_size=args.lump_s,
409
+ max_jobs=args.lump_j,
409
410
  )
410
411
  submission_conductors[piface.pipe_iface_file] = conductor
411
412
 
@@ -547,12 +548,16 @@ class Reporter(Executor):
547
548
  p = self.prj
548
549
  project_level = args.project
549
550
 
551
+ portable = args.portable
552
+
550
553
  if project_level:
551
554
  psms = self.prj.get_pipestat_managers(project_level=True)
552
555
  print(psms)
553
556
  for name, psm in psms.items():
554
557
  # Summarize will generate the static HTML Report Function
555
- report_directory = psm.summarize(looper_samples=self.prj.samples)
558
+ report_directory = psm.summarize(
559
+ looper_samples=self.prj.samples, portable=portable
560
+ )
556
561
  print(f"Report directory: {report_directory}")
557
562
  else:
558
563
  for piface_source_samples in self.prj._samples_by_piface(
@@ -567,7 +572,9 @@ class Reporter(Executor):
567
572
  print(psms)
568
573
  for name, psm in psms.items():
569
574
  # Summarize will generate the static HTML Report Function
570
- report_directory = psm.summarize(looper_samples=self.prj.samples)
575
+ report_directory = psm.summarize(
576
+ looper_samples=self.prj.samples, portable=portable
577
+ )
571
578
  print(f"Report directory: {report_directory}")
572
579
 
573
580
 
looper/project.py CHANGED
@@ -111,9 +111,7 @@ class Project(peppyProject):
111
111
  compute settings.
112
112
  """
113
113
 
114
- def __init__(
115
- self, cfg=None, amendments=None, divcfg_path=None, runp=False, **kwargs
116
- ):
114
+ def __init__(self, cfg=None, amendments=None, divcfg_path=None, **kwargs):
117
115
  super(Project, self).__init__(cfg=cfg, amendments=amendments)
118
116
  prj_dict = kwargs.get("project_dict")
119
117
  pep_config = kwargs.get("pep_config", None)
@@ -122,7 +120,7 @@ class Project(peppyProject):
122
120
 
123
121
  # init project from pephub pep_config:
124
122
  if prj_dict is not None and cfg is None:
125
- self.from_dict(prj_dict)
123
+ self._from_dict(prj_dict)
126
124
  self["_config_file"] = os.getcwd() # for finding pipeline interface
127
125
  self["pep_config"] = pep_config
128
126
 
@@ -916,7 +914,7 @@ def make_set(items):
916
914
  try:
917
915
  # Check if user input single integer value for inclusion/exclusion criteria
918
916
  if len(items) == 1:
919
- items = list(map(int, items)) # list(int(items[0]))
917
+ items = list(map(str, items)) # list(int(items[0]))
920
918
  except:
921
919
  if isinstance(items, str):
922
920
  items = [items]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: looper
3
- Version: 1.6.0a2
3
+ Version: 1.7.0
4
4
  Summary: A pipeline submission engine that parses sample inputs and submits pipelines for each sample.
5
5
  Home-page: https://github.com/pepkit/looper
6
6
  Author: Nathan Sheffield, Vince Reuter, Michal Stolarczyk, Johanna Klughammer, Andre Rendeiro
@@ -22,8 +22,8 @@ Requires-Dist: jinja2
22
22
  Requires-Dist: logmuse >=0.2.0
23
23
  Requires-Dist: pandas >=2.0.2
24
24
  Requires-Dist: pephubclient >=0.1.2
25
- Requires-Dist: peppy >=0.40.0.a4
26
- Requires-Dist: pipestat >=0.6.0a9
25
+ Requires-Dist: peppy >=0.40.0
26
+ Requires-Dist: pipestat >=0.8.0
27
27
  Requires-Dist: pyyaml >=3.12
28
28
  Requires-Dist: rich >=9.10.0
29
29
  Requires-Dist: ubiquerg >=0.5.2
@@ -1,18 +1,18 @@
1
1
  looper/__init__.py,sha256=f_z9YY4ibOk7eyWoaViH_VaCXMlPQeiftbnibSFj-3E,1333
2
2
  looper/__main__.py,sha256=8CX2ae8mUQNI_Z8pdBT4i5UFqROFX1awyFnuYCKuYXg,238
3
- looper/_version.py,sha256=LyKCp03C0l6j9csFpO9LhsN-rNU_LmTHK3ql3ULRXUI,24
3
+ looper/_version.py,sha256=lEEx5lwinUby-YNl7w-VFGUcjcibsJ9EuzgJ2W7ocrU,22
4
4
  looper/cli_divvy.py,sha256=J07x83sqC4jJeu3_yS6KOARPWmwKGAV7JvN33T5zDac,5907
5
- looper/cli_looper.py,sha256=0SYyPAPg8MEGOnp_vjn0Mxohe7Annr56hwDBX_DqM5U,25769
6
- looper/conductor.py,sha256=BmMATwtkHoPSsffYopCQ1WxK83O3UjOTFRrakgD6DzA,30231
5
+ looper/cli_looper.py,sha256=se-EbQ4nucWxMiU0VLnmV0Kss-JMjSmWih6vHaOiLi0,26367
6
+ looper/conductor.py,sha256=9k0r_vsHCP25MrDjz7GR16_EEdqP9JZELYZJVm6ny1g,30777
7
7
  looper/const.py,sha256=bPj4lTuj2l6gwHROWqj16iHfJFo9ghZAz8THNREWW4U,8558
8
8
  looper/divvy.py,sha256=qa1ebbQTfNupAyDfhfEJ6mbZ_V3zk-D_E-Tck7miJ38,15688
9
9
  looper/exceptions.py,sha256=r6SKKt-m8CXQnXGDnuiwoA6zBJhIZflygBKjX4RCloI,3419
10
- looper/looper.py,sha256=f__lSwDgzTcFpv5kUIrR-XdC49_YPvdVZTBfBdkm2J8,30251
10
+ looper/looper.py,sha256=U3mNqXRDZRzmFXV26TcPQYKPdY1plPvMraNHTnps4mQ,30448
11
11
  looper/parser_types.py,sha256=d3FHt54f9jo9VZMr5SQkbghcAdABqiYZW2JBGO5EBnw,2327
12
12
  looper/pipeline_interface.py,sha256=y46tB1_73d1FX8N1w4-GGvRBJ7rqhenuUYVtUfIhK5s,14974
13
13
  looper/plugins.py,sha256=MaMdPmK9U_4FkNJE5kccohBbY1i2qj1NTEucubFOJek,5747
14
14
  looper/processed_project.py,sha256=jZxoMYafvr-OHFxylc5ivGty1VwXBZhl0kgoFkY-174,9837
15
- looper/project.py,sha256=Ldsa__wLNnDpKFfN0cOCWQnL-pTuVrPbbHJPHFt9fcU,36196
15
+ looper/project.py,sha256=nkNP7ftVs82Tnk2Yn6FUp60_D6bjE9sSvySE0SHqsmg,36171
16
16
  looper/utils.py,sha256=i7srIXPEnQjtNaoP0ziRpdYfB7HNY5_3rW5LoKIM15I,27257
17
17
  looper/default_config/divvy_config.yaml,sha256=wK5kLDGBV2wwoyqg2rl3X8SXjds4x0mwBUjUzF1Ln7g,1705
18
18
  looper/default_config/divvy_templates/localhost_bulker_template.sub,sha256=yn5VB9Brt7Hck9LT17hD2o8Kn-76gYJQk_A-8C1Gr4k,164
@@ -55,9 +55,9 @@ looper/schemas/divvy_config_schema.yaml,sha256=7GJfKLc3VX4RGjHnOE1zxwsHXhj_ur9za
55
55
  looper/schemas/pipeline_interface_schema_generic.yaml,sha256=D16Rkpj03H9WnvA_N18iNU-hH_HwOuyESJ8Hk5hZSXc,1518
56
56
  looper/schemas/pipeline_interface_schema_project.yaml,sha256=-ZWyA0lKXWik3obuLNVk3IsAZYfbLVbCDvJnD-Fcluo,1567
57
57
  looper/schemas/pipeline_interface_schema_sample.yaml,sha256=x0OwVnijJpvm50DscvvJujdK4UAI7d71pqVemQS-D-0,1564
58
- looper-1.6.0a2.dist-info/LICENSE.txt,sha256=oB6ZGDa4kcznznJKJsLLFFcOZyi8Y6e2Jv0rJozgp-I,1269
59
- looper-1.6.0a2.dist-info/METADATA,sha256=VZ2Qj4IYbM8GRd7Bt6zfEDrPhwGy5dIoCunh83nzgWk,1740
60
- looper-1.6.0a2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
61
- looper-1.6.0a2.dist-info/entry_points.txt,sha256=AEL1eb0gPLYvAEUewM35Ng4scXGZIWJK4Mxdj3Hm8Fw,83
62
- looper-1.6.0a2.dist-info/top_level.txt,sha256=I0Yf7djsoQAMzwHBbDiQi9hGtq4Z41_Ma5CX8qXG8Y8,7
63
- looper-1.6.0a2.dist-info/RECORD,,
58
+ looper-1.7.0.dist-info/LICENSE.txt,sha256=oB6ZGDa4kcznznJKJsLLFFcOZyi8Y6e2Jv0rJozgp-I,1269
59
+ looper-1.7.0.dist-info/METADATA,sha256=pGYwFxwYKiFtzUuYx4t0q-cMKmCF_fhsKwAFlbwBfP0,1733
60
+ looper-1.7.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
61
+ looper-1.7.0.dist-info/entry_points.txt,sha256=AEL1eb0gPLYvAEUewM35Ng4scXGZIWJK4Mxdj3Hm8Fw,83
62
+ looper-1.7.0.dist-info/top_level.txt,sha256=I0Yf7djsoQAMzwHBbDiQi9hGtq4Z41_Ma5CX8qXG8Y8,7
63
+ looper-1.7.0.dist-info/RECORD,,