oh-my-batch 0.2.0__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.
@@ -1,6 +1,7 @@
1
+ GREEN='\033[0;32m'
2
+ NC='\033[0m'
1
3
 
2
4
  checkpoint() {
3
- # Usage: checkpoint <flag_file> <command> [arg1] [arg2] ...
4
5
  local flag_file="$1"
5
6
  shift # Remove the first argument so $@ contains only the command and its arguments
6
7
  if [ -f "$flag_file" ]; then
@@ -10,6 +11,7 @@ checkpoint() {
10
11
  local exit_code=$?
11
12
  if [ $exit_code -eq 0 ]; then
12
13
  local current_time=$(date '+%Y-%m-%d %H:%M:%S')
14
+ mkdir -p "$(dirname "$flag_file")"
13
15
  printf 'Command succeeded at %s\n' "$current_time" > "$flag_file"
14
16
  echo "Created flag file '$flag_file' with timestamp: $current_time"
15
17
  else
@@ -18,3 +20,16 @@ checkpoint() {
18
20
  fi
19
21
  fi
20
22
  }
23
+
24
+ echo -e "${GREEN}Functiion: checkpoint${NC}"
25
+ cat <<EOF
26
+ Usage:
27
+ checkpoint <flag_file> <command> [arg1] [arg2] ...
28
+
29
+ Set a flag file to indicate the completion of a command,
30
+ so that it will not be executed again next time.
31
+
32
+ Example:
33
+ checkpoint lmp.done lmp -in in.lmp
34
+
35
+ EOF
oh_my_batch/cli.py CHANGED
@@ -23,6 +23,9 @@ class OhMyBatch:
23
23
  def job(self):
24
24
  return JobCli()
25
25
 
26
+ def misc(self):
27
+ from .misc import Misc
28
+ return Misc()
26
29
 
27
30
  def main():
28
31
  fire.Fire(OhMyBatch)
oh_my_batch/combo.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from itertools import product
2
2
  from string import Template
3
3
  import random
4
+ import json
4
5
  import os
5
6
 
6
7
  from .util import expand_globs, mode_translate
@@ -67,7 +68,7 @@ class ComboMaker:
67
68
  self.add_var(key, *args, broadcast=broadcast)
68
69
  return self
69
70
 
70
- def add_files(self, key: str, *path: str, broadcast=False, abs=False):
71
+ def add_files(self, key: str, *path: str, broadcast=False, abs=False, raise_invalid=False):
71
72
  """
72
73
  Add a variable with files by glob pattern
73
74
  For example, suppose there are 3 files named 1.txt, 2.txt, 3.txt in data directory,
@@ -78,8 +79,9 @@ class ComboMaker:
78
79
  :param path: Path to files, can include glob pattern
79
80
  :param broadcast: If True, values are broadcasted, otherwise they are producted when making combos
80
81
  :param abs: If True, path will be turned into absolute path
82
+ :param raise_invalid: If True, will raise error if no file found for a glob pattern
81
83
  """
82
- args = expand_globs(path, raise_invalid=True)
84
+ args = expand_globs(path, raise_invalid=raise_invalid)
83
85
  if not args:
84
86
  raise ValueError(f"No files found for {path}")
85
87
  if abs:
@@ -87,7 +89,8 @@ class ComboMaker:
87
89
  self.add_var(key, *args, broadcast=broadcast)
88
90
  return self
89
91
 
90
- def add_files_as_one(self, key: str, path: str, broadcast=False, sep=' ', abs=False):
92
+ def add_files_as_one(self, key: str, *path: str, broadcast=False, format=None,
93
+ sep=' ', abs=False, raise_invalid=False):
91
94
  """
92
95
  Add a variable with files by glob pattern as one string
93
96
  Unlike add_files, this function joins the files with a delimiter.
@@ -98,15 +101,25 @@ class ComboMaker:
98
101
  :param key: Variable name
99
102
  :param path: Path to files, can include glob pattern
100
103
  :param broadcast: If True, values are broadcasted, otherwise they are producted when making combos
104
+ :param format: the way to format the files, can be None, 'json-list','json-item'
101
105
  :param sep: Separator to join files
102
106
  :param abs: If True, path will be turned into absolute path
107
+ :param raise_invalid: If True, will raise error if no file found for a glob pattern
103
108
  """
104
- args = expand_globs(path, raise_invalid=True)
109
+ args = expand_globs(path, raise_invalid=raise_invalid)
105
110
  if not args:
106
111
  raise ValueError(f"No files found for {path}")
107
112
  if abs:
108
113
  args = [os.path.abspath(p) for p in args]
109
- self.add_var(key, sep.join(args), broadcast=broadcast)
114
+ if format is None:
115
+ value = sep.join(args)
116
+ elif format == 'json-list':
117
+ value = json.dumps(args)
118
+ elif format == 'json-item':
119
+ value = json.dumps(args).strip('[]')
120
+ else:
121
+ raise ValueError(f"Invalid format: {format}")
122
+ self.add_var(key, value, broadcast=broadcast)
110
123
  return self
111
124
 
112
125
  def add_var(self, key: str, *args, broadcast=False):
@@ -148,19 +161,20 @@ class ComboMaker:
148
161
  raise ValueError(f"Variable {key} not found")
149
162
  return self
150
163
 
151
- def make_files(self, template: str, dest: str, delimiter='$', mode=None):
164
+ def make_files(self, template: str, dest: str, delimiter='@', mode=None):
152
165
  """
153
166
  Make files from template
154
167
  The template file can include variables with delimiter.
155
- For example, if delimiter is '$', then the template file can include $var1, $var2, ...
168
+ For example, if delimiter is '@', then the template file can include @var1, @var2, ...
156
169
 
157
170
  The destination can also include variables in string format style.
158
- For example, if dest is 'output/{i}.txt', then files are saved as output/0.txt, output/1.txt, ...
171
+ For example, if dest is 'output/{i}-{TEMP}.txt',
172
+ then files are saved as output/0-300K.txt, output/1-400K.txt, ...
159
173
 
160
174
  :param template: Path to template file
161
175
  :param dest: Path pattern to destination file
162
- :param delimiter: Delimiter for variables in template, default is '$',
163
- can be changed to other character, e.g $$, @, ...
176
+ :param delimiter: Delimiter for variables in template, default is '@', as '$' is popular in shell scripts
177
+ can be changed to other character, e.g $, $$, ...
164
178
  """
165
179
  _delimiter = delimiter
166
180
 
oh_my_batch/misc.py ADDED
@@ -0,0 +1,14 @@
1
+ from .assets import get_asset
2
+
3
+ class Misc:
4
+
5
+ def export_shell_func(self):
6
+ """
7
+ Export shell functions for batch scripts
8
+
9
+ For example, you can load them to you shell environment with the following command:
10
+ omb misc export-shell-func > omb-func.sh && source omb-func.sh
11
+ """
12
+ shell_func = get_asset('functions.sh')
13
+ with open(shell_func, 'r', encoding='utf-8') as f:
14
+ print(f.read())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: oh-my-batch
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary:
5
5
  License: GPL
6
6
  Author: weihong.xu
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.9
13
13
  Classifier: Programming Language :: Python :: 3.10
14
14
  Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
16
17
  Requires-Dist: fire (>=0.7.0,<0.8.0)
17
18
  Description-Content-Type: text/markdown
18
19
 
@@ -22,19 +23,35 @@ Description-Content-Type: text/markdown
22
23
  [![PyPI - Downloads](https://img.shields.io/pypi/dm/oh-my-batch)](https://pypi.org/project/oh-my-batch/)
23
24
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/oh-my-batch)](https://pypi.org/project/oh-my-batch/)
24
25
 
25
- A simple tool to manipulate batch tasks designed for scientific computing community.
26
+ A toolkit to manipulate batch tasks with command line. Designed for scientific computing community.
26
27
 
27
28
  ## Features
28
29
  * `omb combo`: generate folders/files from different combinations of parameters
29
30
  * `omb batch`: generate batch scripts from multiple working directories
30
31
  * `omb job`: track the state of job in job schedular
32
+ * `omb misc`: miscellaneous commands
31
33
 
32
34
  ## Install
33
35
  ```bash
34
36
  pip install oh-my-batch
35
37
  ```
36
38
 
39
+ ## Shell tips
40
+ `oh-my-batch` is intended to help you implement computational workflows with shell scripts.
41
+ To make the best use of `oh-my-batch`, you need to know some shell tips.
42
+
43
+ * [Retry commands until success in shell script](https://stackoverflow.com/a/79191004/3099733)
44
+ * [Run multiple line shell script with ssh](https://stackoverflow.com/a/32082912/3099733)
45
+
37
46
  ## Use cases
47
+ ### Load functions in shell script
48
+ You can load useful functions from `oh-my-batch` this way:
49
+
50
+ ```bash
51
+ omb misc export-shell-func > omb-func.sh && source omb-func.sh && rm omb-func.sh
52
+ ```
53
+
54
+ This will load some functions to your shell script, for example, `checkpoint`.
38
55
 
39
56
  ### Generate files from different combinations of parameters
40
57
 
@@ -52,8 +69,8 @@ touch tmp/1.data tmp/2.data tmp/3.data
52
69
 
53
70
  # prepare a lammps input file template
54
71
  cat > tmp/in.lmp.tmp <<EOF
55
- read_data $DATA_FILE
56
- velocity all create $TEMP $RANDOM
72
+ read_data @DATA_FILE
73
+ velocity all create @TEMP @RANDOM
57
74
  run 1000
58
75
  EOF
59
76
 
@@ -0,0 +1,15 @@
1
+ oh_my_batch/__init__.py,sha256=BsRNxZbqDWfaIZJGxzIDqCubRWztMGFDceW08TECuFs,98
2
+ oh_my_batch/__main__.py,sha256=sWyFZMwWNvhkanwZSJRGfBBDoIevhC028dTSB67i6yI,61
3
+ oh_my_batch/assets/__init__.py,sha256=Exub46UbQaz2V2eXpQeiVfnThQpXaNeuyjlGY6gBSZc,130
4
+ oh_my_batch/assets/functions.sh,sha256=dvPGpOKz4CyUSlE5IAewQc8HUrQJuaZ0j-WZIuxB3Tg,1002
5
+ oh_my_batch/batch.py,sha256=6qnaXEVyA493heGzzbCrdZXCcnYk8zgl7WP0rmo7KlU,3690
6
+ oh_my_batch/cli.py,sha256=jMSM_orAamNoEP7jPsbp0UYPX-UDY1-kHSHO31zELHs,548
7
+ oh_my_batch/combo.py,sha256=UQYyZAGFi-siUN13XVcpQwuqSZ0ZYPJl3hdVCORECng,8407
8
+ oh_my_batch/job.py,sha256=8kZnWtvpr1rAl4tc9I_Vlhi-T0o3rh4RQZZgMNBCGho,5800
9
+ oh_my_batch/misc.py,sha256=G_iOovRCrShBJJCc82QLN0CvMqW4adOefEoY1GedEiw,452
10
+ oh_my_batch/util.py,sha256=okg_kY8dJouyJ2BYCXRl7bxDUAtNH6GLh2UjXRnkoW0,2385
11
+ oh_my_batch-0.2.2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
12
+ oh_my_batch-0.2.2.dist-info/METADATA,sha256=7Y9HPRolb4gljmDpHLaqkfdh1bfPYR4WdzFuh8DeKVw,5496
13
+ oh_my_batch-0.2.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
14
+ oh_my_batch-0.2.2.dist-info/entry_points.txt,sha256=ZY2GutSoNjjSyJ4qO2pTeseKUFgoTYdvmgkuZZkwi68,77
15
+ oh_my_batch-0.2.2.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: poetry-core 1.9.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,14 +0,0 @@
1
- oh_my_batch/__init__.py,sha256=BsRNxZbqDWfaIZJGxzIDqCubRWztMGFDceW08TECuFs,98
2
- oh_my_batch/__main__.py,sha256=sWyFZMwWNvhkanwZSJRGfBBDoIevhC028dTSB67i6yI,61
3
- oh_my_batch/assets/__init__.py,sha256=Exub46UbQaz2V2eXpQeiVfnThQpXaNeuyjlGY6gBSZc,130
4
- oh_my_batch/assets/functions.sh,sha256=eORxFefV-XrWbG-2I6u-c8uf1XxOQ31LaeVHBumwzJ4,708
5
- oh_my_batch/batch.py,sha256=6qnaXEVyA493heGzzbCrdZXCcnYk8zgl7WP0rmo7KlU,3690
6
- oh_my_batch/cli.py,sha256=uelW9ms1N30DipJOcsiuG5K-5VN8O6yu1RNEqex00GY,475
7
- oh_my_batch/combo.py,sha256=R_WTO4v-LWHIQ0O46bIgeRlL_RGrFcf8305S9auqeQk,7679
8
- oh_my_batch/job.py,sha256=8kZnWtvpr1rAl4tc9I_Vlhi-T0o3rh4RQZZgMNBCGho,5800
9
- oh_my_batch/util.py,sha256=okg_kY8dJouyJ2BYCXRl7bxDUAtNH6GLh2UjXRnkoW0,2385
10
- oh_my_batch-0.2.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
11
- oh_my_batch-0.2.0.dist-info/METADATA,sha256=_qeLyk6LEg2--NU9NqgMoV2WU96125A0eiIOdJFY760,4759
12
- oh_my_batch-0.2.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
13
- oh_my_batch-0.2.0.dist-info/entry_points.txt,sha256=ZY2GutSoNjjSyJ4qO2pTeseKUFgoTYdvmgkuZZkwi68,77
14
- oh_my_batch-0.2.0.dist-info/RECORD,,