Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
7617c938b1 | |||
a1256bb0af | |||
73e26a2ecb |
@ -9,6 +9,7 @@ export I3__BORDER_PIXEL_SIZE=
|
|||||||
export I3__DMENU_FONT_SIZE=
|
export I3__DMENU_FONT_SIZE=
|
||||||
export I3__GLOBAL_FONT_SIZE=
|
export I3__GLOBAL_FONT_SIZE=
|
||||||
export I3__MODEL_CONFIG=
|
export I3__MODEL_CONFIG=
|
||||||
|
export LINEAR__API_TOKEN=
|
||||||
export REDIS_AUTH=
|
export REDIS_AUTH=
|
||||||
export REDIS_HOST=
|
export REDIS_HOST=
|
||||||
export REDIS_PORT=
|
export REDIS_PORT=
|
||||||
|
@ -12,6 +12,8 @@ I3__DMENU_FONT_SIZE |
|
|||||||
I3__GLOBAL_FONT_SIZE |
|
I3__GLOBAL_FONT_SIZE |
|
||||||
I3__MODEL_CONFIG |
|
I3__MODEL_CONFIG |
|
||||||
|
|
||||||
|
LINEAR__API_TOKEN | linear.app project management configuration
|
||||||
|
|
||||||
REDIS_AUTH | redis connection credentials
|
REDIS_AUTH | redis connection credentials
|
||||||
REDIS_HOST |
|
REDIS_HOST |
|
||||||
REDIS_PORT |
|
REDIS_PORT |
|
||||||
|
0
py/data/__init__.py
Normal file
0
py/data/__init__.py
Normal file
0
py/data/convert/__init__.py
Normal file
0
py/data/convert/__init__.py
Normal file
21
py/data/convert/csv-to-json.py
Executable file
21
py/data/convert/csv-to-json.py
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from py.lib.data.io import add_io_arguments
|
||||||
|
from py.lib.data.converter import convert
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'converts csv into json')
|
||||||
|
add_io_arguments(parser)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
convert(
|
||||||
|
input_file = args.input_file,
|
||||||
|
input_type = 'csv',
|
||||||
|
output_file = args.output_file,
|
||||||
|
output_type = 'json',
|
||||||
|
)
|
21
py/data/convert/csv-to-yaml.py
Executable file
21
py/data/convert/csv-to-yaml.py
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from py.lib.data.io import add_io_arguments
|
||||||
|
from py.lib.data.converter import convert
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'converts csv into yaml')
|
||||||
|
add_io_arguments(parser)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
convert(
|
||||||
|
input_file = args.input_file,
|
||||||
|
input_type = 'csv',
|
||||||
|
output_file = args.output_file,
|
||||||
|
output_type = 'yaml',
|
||||||
|
)
|
21
py/data/convert/json-to-csv.py
Executable file
21
py/data/convert/json-to-csv.py
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from py.lib.data.io import add_io_arguments
|
||||||
|
from py.lib.data.converter import convert
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'converts csv into json')
|
||||||
|
add_io_arguments(parser)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
convert(
|
||||||
|
input_file = args.input_file,
|
||||||
|
input_type = 'json',
|
||||||
|
output_file = args.output_file,
|
||||||
|
output_type = 'csv',
|
||||||
|
)
|
21
py/data/convert/json-to-yaml.py
Executable file
21
py/data/convert/json-to-yaml.py
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from py.lib.data.io import add_io_arguments
|
||||||
|
from py.lib.data.converter import convert
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'converts json into yaml')
|
||||||
|
add_io_arguments(parser)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
convert(
|
||||||
|
input_file = args.input_file,
|
||||||
|
input_type = 'json',
|
||||||
|
output_file = args.output_file,
|
||||||
|
output_type = 'yaml',
|
||||||
|
)
|
21
py/data/convert/yaml-to-csv.py
Executable file
21
py/data/convert/yaml-to-csv.py
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from py.lib.data.io import add_io_arguments
|
||||||
|
from py.lib.data.converter import convert
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'converts yaml into csv')
|
||||||
|
add_io_arguments(parser)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
convert(
|
||||||
|
input_file = args.input_file,
|
||||||
|
input_type = 'yaml',
|
||||||
|
output_file = args.output_file,
|
||||||
|
output_type = 'csv',
|
||||||
|
)
|
21
py/data/convert/yaml-to-json.py
Executable file
21
py/data/convert/yaml-to-json.py
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from py.lib.data.io import add_io_arguments
|
||||||
|
from py.lib.data.converter import convert
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'converts yaml into json')
|
||||||
|
add_io_arguments(parser)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
convert(
|
||||||
|
input_file = args.input_file,
|
||||||
|
input_type = 'yaml',
|
||||||
|
output_file = args.output_file,
|
||||||
|
output_type = 'json',
|
||||||
|
)
|
19
py/hello-world.py
Executable file
19
py/hello-world.py
Executable file
@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'a simple "Hello, World!" program')
|
||||||
|
parser.add_argument(
|
||||||
|
'-m', '--message',
|
||||||
|
dest = 'message',
|
||||||
|
default = 'HELLO WORLD',
|
||||||
|
help = 'message to print to stdout',
|
||||||
|
required = False,
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
print(args.message)
|
@ -1,7 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
def main():
|
|
||||||
print('HELLO WORLD')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
0
py/lib/__init__.py
Normal file
0
py/lib/__init__.py
Normal file
0
py/lib/data/__init__.py
Normal file
0
py/lib/data/__init__.py
Normal file
76
py/lib/data/converter.py
Normal file
76
py/lib/data/converter.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
import csv
|
||||||
|
import json
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from py.lib.data.io import get_stream
|
||||||
|
|
||||||
|
|
||||||
|
def convert(input_file, input_type, output_file, output_type):
|
||||||
|
if input_type == output_type:
|
||||||
|
raise ValueError('input type and output type are the same')
|
||||||
|
|
||||||
|
with get_stream(input_file) as input_stream:
|
||||||
|
data = convert_input(input_stream, input_type)
|
||||||
|
|
||||||
|
with get_stream(output_file, 'w+') as output_stream:
|
||||||
|
_write_output(output_stream, output_type, data)
|
||||||
|
|
||||||
|
|
||||||
|
def convert_input(stream, input_type):
|
||||||
|
supported_input_types = {'csv', 'json', 'yaml'}
|
||||||
|
|
||||||
|
if input_type not in supported_input_types:
|
||||||
|
raise ValueError(f'input_type "{input_type}" not supported; must be one of {supported_input_types}')
|
||||||
|
|
||||||
|
return {
|
||||||
|
'csv': _read_csv,
|
||||||
|
'json': _read_json,
|
||||||
|
'yaml': _read_yaml,
|
||||||
|
}[input_type](stream)
|
||||||
|
|
||||||
|
def _write_output(stream, output_type, data):
|
||||||
|
supported_output_types = {'csv', 'json', 'yaml'}
|
||||||
|
|
||||||
|
if output_type not in supported_output_types:
|
||||||
|
raise ValueError(f'output_type "{output_type}" not supported; must be one of {supported_output_types}')
|
||||||
|
|
||||||
|
return {
|
||||||
|
'csv': _write_csv,
|
||||||
|
'json': _write_json,
|
||||||
|
'yaml': _write_yaml,
|
||||||
|
}[output_type](stream, data)
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
def _read_csv(stream):
|
||||||
|
return [dict(line) for line in csv.DictReader(stream)]
|
||||||
|
|
||||||
|
def _write_csv(stream, data):
|
||||||
|
writer = csv.DictWriter(stream, fieldnames=list({
|
||||||
|
key
|
||||||
|
for dictionary in data
|
||||||
|
for key in dictionary.keys()
|
||||||
|
}))
|
||||||
|
|
||||||
|
writer.writeheader()
|
||||||
|
|
||||||
|
for value in data:
|
||||||
|
writer.writerow(value)
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
def _read_json(stream):
|
||||||
|
data = json.loads(stream.read())
|
||||||
|
return data if isinstance(data, list) else [data]
|
||||||
|
|
||||||
|
def _write_json(stream, data):
|
||||||
|
stream.write(json.dumps(data))
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
def _read_yaml(stream):
|
||||||
|
data = yaml.safe_load(stream)
|
||||||
|
return data if isinstance(data, list) else [data]
|
||||||
|
|
||||||
|
def _write_yaml(stream, data):
|
||||||
|
yaml.dump(data, stream, default_flow_style=False)
|
51
py/lib/data/io.py
Normal file
51
py/lib/data/io.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
from contextlib import contextmanager
|
||||||
|
from pathlib import Path
|
||||||
|
from sys import stdin, stdout, stderr
|
||||||
|
|
||||||
|
from py.lib.scwrypts.getenv import getenv
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def get_stream(filename=None, mode='r', encoding='utf-8', verbose=False, **kwargs):
|
||||||
|
allowed_modes = {'r', 'w', 'w+'}
|
||||||
|
|
||||||
|
if mode not in allowed_modes:
|
||||||
|
raise ValueError(f'mode "{mode}" not supported modes (must be one of {allowed_modes})')
|
||||||
|
|
||||||
|
is_read = mode == 'r'
|
||||||
|
|
||||||
|
if filename is not None:
|
||||||
|
|
||||||
|
if verbose:
|
||||||
|
print(f'opening file {filename} for {"read" if is_read else "write"}', file=stderr)
|
||||||
|
|
||||||
|
if filename[0] not in {'/', '~'}:
|
||||||
|
filename = Path(f'{getenv("EXECUTION_DIR")}/{filename}').resolve()
|
||||||
|
with open(filename, mode=mode, encoding=encoding, **kwargs) as stream:
|
||||||
|
yield stream
|
||||||
|
|
||||||
|
else:
|
||||||
|
if verbose:
|
||||||
|
print('using stdin for read' if is_read else 'using stdout for write', file=stderr)
|
||||||
|
|
||||||
|
yield stdin if is_read else stdout
|
||||||
|
|
||||||
|
|
||||||
|
def add_io_arguments(parser, toggle_input=True, toggle_output=True):
|
||||||
|
if toggle_input:
|
||||||
|
parser.add_argument(
|
||||||
|
'-i', '--input-file',
|
||||||
|
dest = 'input_file',
|
||||||
|
default = None,
|
||||||
|
help = 'path to input file; omit for stdin',
|
||||||
|
required = False,
|
||||||
|
)
|
||||||
|
|
||||||
|
if toggle_output:
|
||||||
|
parser.add_argument(
|
||||||
|
'-o', '--output-file',
|
||||||
|
dest = 'output_file',
|
||||||
|
default = None,
|
||||||
|
help = 'path to output file; omit for stdout',
|
||||||
|
required = False,
|
||||||
|
)
|
1
py/lib/http/__init__.py
Normal file
1
py/lib/http/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from py.lib.http.client import get_request_client
|
20
py/lib/http/client.py
Normal file
20
py/lib/http/client.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
from requests import request
|
||||||
|
|
||||||
|
|
||||||
|
def get_request_client(base_url, headers=None):
|
||||||
|
if headers is None:
|
||||||
|
headers = {}
|
||||||
|
|
||||||
|
return lambda method, endpoint, **kwargs: request(
|
||||||
|
method = method,
|
||||||
|
url = f'{base_url}/{endpoint}',
|
||||||
|
headers = {
|
||||||
|
**headers,
|
||||||
|
**kwargs.get('headers', {}),
|
||||||
|
},
|
||||||
|
**{
|
||||||
|
key: value
|
||||||
|
for key, value in kwargs.items()
|
||||||
|
if key != 'headers'
|
||||||
|
},
|
||||||
|
)
|
1
py/lib/linear/__init__.py
Normal file
1
py/lib/linear/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from py.lib.linear.client import request, graphql
|
13
py/lib/linear/client.py
Normal file
13
py/lib/linear/client.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from py.lib.http import get_request_client
|
||||||
|
from py.lib.scwrypts import getenv
|
||||||
|
|
||||||
|
|
||||||
|
request = get_request_client(
|
||||||
|
base_url = 'https://api.linear.app',
|
||||||
|
headers = {
|
||||||
|
'Authorization': f'bearer {getenv("LINEAR__API_TOKEN")}',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def graphql(query):
|
||||||
|
return request('POST', 'graphql', json={'query': query})
|
1
py/lib/redis/__init__.py
Normal file
1
py/lib/redis/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
from redis import StrictRedis
|
from redis import StrictRedis
|
||||||
|
|
||||||
from py.scwrypts import getenv
|
from py.lib.scwrypts import getenv
|
||||||
|
|
||||||
|
|
||||||
class RedisClient(StrictRedis):
|
class RedisClient(StrictRedis):
|
3
py/lib/scwrypts/__init__.py
Normal file
3
py/lib/scwrypts/__init__.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from py.lib.scwrypts.getenv import getenv
|
||||||
|
from py.lib.scwrypts.interactive import interactive
|
||||||
|
from py.lib.scwrypts.run import run
|
@ -1,7 +1,7 @@
|
|||||||
from os import getenv as os_getenv
|
from os import getenv as os_getenv
|
||||||
|
|
||||||
from py.scwrypts.exceptions import MissingVariableError
|
from py.lib.scwrypts.exceptions import MissingVariableError
|
||||||
from py.scwrypts.run import run
|
from py.lib.scwrypts.run import run
|
||||||
|
|
||||||
|
|
||||||
def getenv(name, required=True):
|
def getenv(name, required=True):
|
@ -7,11 +7,15 @@ def run(scwrypt_name, *args):
|
|||||||
DEPTH = int(getenv('SUBSCWRYPT', '0'))
|
DEPTH = int(getenv('SUBSCWRYPT', '0'))
|
||||||
DEPTH += 1
|
DEPTH += 1
|
||||||
|
|
||||||
|
SCWRYPTS_EXE = Path(__file__).parents[2] / 'scwrypts'
|
||||||
|
ARGS = ' '.join([str(x) for x in args])
|
||||||
|
|
||||||
print(f'\n {"--"*DEPTH} ({DEPTH}) BEGIN SUBSCWRYPT : {Path(scwrypt_name).name}')
|
print(f'\n {"--"*DEPTH} ({DEPTH}) BEGIN SUBSCWRYPT : {Path(scwrypt_name).name}')
|
||||||
subprocess_run(
|
subprocess_run(
|
||||||
f'SUBSCWRYPT={DEPTH} {Path(__file__).parents[2] / "scwrypts"} {scwrypt_name} -- {" ".join([str(x) for x in args])}',
|
f'SUBSCWRYPT={DEPTH} {SCWRYPTS_EXE} {scwrypt_name} -- {ARGS}',
|
||||||
shell=True,
|
shell=True,
|
||||||
executable='/bin/zsh',
|
executable='/bin/zsh',
|
||||||
|
check=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
print(f' {"--"*DEPTH} ({DEPTH}) END SUBSCWRYPT : {Path(scwrypt_name).name}\n')
|
print(f' {"--"*DEPTH} ({DEPTH}) END SUBSCWRYPT : {Path(scwrypt_name).name}\n')
|
0
py/linear/__init__.py
Normal file
0
py/linear/__init__.py
Normal file
47
py/linear/comment.py
Executable file
47
py/linear/comment.py
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
|
from py.lib.data.io import get_stream, add_io_arguments
|
||||||
|
from py.lib.linear import graphql
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'comment on an issue in linear.app')
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-i', '--issue',
|
||||||
|
dest = 'issue_id',
|
||||||
|
help = 'issue short-code (e.g. CLOUD-319)',
|
||||||
|
required = True,
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_argument(
|
||||||
|
'-m', '--message',
|
||||||
|
dest = 'message',
|
||||||
|
help = 'comment to post to the target issue',
|
||||||
|
required = True,
|
||||||
|
)
|
||||||
|
|
||||||
|
add_io_arguments(parser, toggle_input=False)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
query = f'''
|
||||||
|
mutation CommentCreate {{
|
||||||
|
commentCreate(
|
||||||
|
input: {{
|
||||||
|
issueId: "{args.issue_id}"
|
||||||
|
body: """from wrobot:
|
||||||
|
```
|
||||||
|
{args.message.strip()}
|
||||||
|
```"""
|
||||||
|
}}
|
||||||
|
) {{ success }}
|
||||||
|
}}
|
||||||
|
'''
|
||||||
|
|
||||||
|
response = graphql(query)
|
||||||
|
with get_stream(args.output_file, 'w+') as output:
|
||||||
|
output.write(response.text)
|
@ -1,11 +1,19 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
from argparse import ArgumentParser
|
||||||
|
|
||||||
from py.redis.client import Client
|
from py.lib.redis.client import Client
|
||||||
from py.scwrypts import interactive, getenv
|
from py.lib.scwrypts import interactive, getenv
|
||||||
|
|
||||||
|
if __name__ != '__main__':
|
||||||
|
raise Exception('executable only; must run through scwrypts')
|
||||||
|
|
||||||
|
|
||||||
|
parser = ArgumentParser(description = 'establishes a redis client in an interactive python shell')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
@interactive
|
@interactive
|
||||||
def main():
|
def main():
|
||||||
|
# pylint: disable=possibly-unused-variable
|
||||||
r = Client
|
r = Client
|
||||||
|
|
||||||
print(f'''
|
print(f'''
|
||||||
@ -14,6 +22,4 @@ def main():
|
|||||||
|
|
||||||
return locals()
|
return locals()
|
||||||
|
|
||||||
|
main()
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
redis
|
redis
|
||||||
bpython
|
bpython
|
||||||
|
pyyaml
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
from py.scwrypts.getenv import getenv
|
|
||||||
from py.scwrypts.interactive import interactive
|
|
||||||
from py.scwrypts.run import run
|
|
6
run
6
run
@ -102,10 +102,10 @@ __RUN() {
|
|||||||
[ ! $LOGFILE ] && {
|
[ ! $LOGFILE ] && {
|
||||||
[ $HEADER ] && echo $HEADER
|
[ $HEADER ] && echo $HEADER
|
||||||
[ $SUBSCWRYPT ] && {
|
[ $SUBSCWRYPT ] && {
|
||||||
eval $RUN_STRING $@
|
eval "$RUN_STRING $(printf "%q " "$@")"
|
||||||
exit $?
|
exit $?
|
||||||
} || {
|
} || {
|
||||||
eval $RUN_STRING $@ </dev/tty >/dev/tty 2>&1
|
eval "$RUN_STRING $(printf "%q " "$@")" </dev/tty >/dev/tty 2>&1
|
||||||
exit $?
|
exit $?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -113,7 +113,7 @@ __RUN() {
|
|||||||
{
|
{
|
||||||
[ $HEADER ] && echo $HEADER
|
[ $HEADER ] && echo $HEADER
|
||||||
echo '\033[1;33m--- BEGIN OUTPUT -------------------------\033[0m'
|
echo '\033[1;33m--- BEGIN OUTPUT -------------------------\033[0m'
|
||||||
eval $RUN_STRING $@
|
eval "$RUN_STRING $(printf "%q " "$@")"
|
||||||
EXIT_CODE=$?
|
EXIT_CODE=$?
|
||||||
echo '\033[1;33m--- END OUTPUT ---------------------------\033[0m'
|
echo '\033[1;33m--- END OUTPUT ---------------------------\033[0m'
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ __SYNC_MEDIA() {
|
|||||||
local FLAGS=(${@:3})
|
local FLAGS=(${@:3})
|
||||||
|
|
||||||
__STATUS "${ACTION}ing $2"
|
__STATUS "${ACTION}ing $2"
|
||||||
_AWS s3 sync $REMOTE_TARGET $LOCAL_TARGET $FLAGS \
|
_AWS s3 sync $A $B $FLAGS \
|
||||||
&& __SUCCESS "$2 up-to-date" \
|
&& __SUCCESS "$2 up-to-date" \
|
||||||
|| { __ERROR "unable to sync $2 (see above)"; return 1; }
|
|| { __ERROR "unable to sync $2 (see above)"; return 1; }
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ source ${0:a:h}/common.zsh
|
|||||||
#####################################################################
|
#####################################################################
|
||||||
|
|
||||||
LAUNCH_OR_SHOW() {
|
LAUNCH_OR_SHOW() {
|
||||||
|
__INFO $@
|
||||||
local USAGE="
|
local USAGE="
|
||||||
usage: <path-executable> [client-class] [...options...]
|
usage: <path-executable> [client-class] [...options...]
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ LAUNCH_OR_SHOW() {
|
|||||||
Depending on state, performs one of three useful functions
|
Depending on state, performs one of three useful functions
|
||||||
1) starts application
|
1) starts application
|
||||||
2) adds application window to the scratchpad
|
2) adds application window to the scratchpad
|
||||||
3) pulls applciation from scratchpad to foreground on active screen
|
3) pulls application from scratchpad to foreground on active screen
|
||||||
"
|
"
|
||||||
local APPLICATION CLIENT_CLASS
|
local APPLICATION CLIENT_CLASS
|
||||||
|
|
||||||
|
@ -50,6 +50,14 @@ Setting the `AWS_REGION` variable will cause scwrypts to ignore the `__select` s
|
|||||||
|
|
||||||
CI will fail on select, because CI fails on any FZF prompt.
|
CI will fail on select, because CI fails on any FZF prompt.
|
||||||
|
|
||||||
|
#### `__override` Environment Variables
|
||||||
|
Override any variable with the indicated value.
|
||||||
|
This will take precedence over existing values *and* any other special environment variable types.
|
||||||
|
|
||||||
|
Examples of use:
|
||||||
|
- temporarily changing a single value in your current session (e.g. `export VARIABLE__override=value`)
|
||||||
|
- overriding a variable for a one-time command (e.g. `VARIABLE__override=value scwrypts ...`)
|
||||||
|
|
||||||
|
|
||||||
## Logs
|
## Logs
|
||||||
Quickly view or clear Scwrypts logs.
|
Quickly view or clear Scwrypts logs.
|
||||||
|
@ -6,7 +6,9 @@ source ${0:a:h}/../common.zsh
|
|||||||
_SORT_ENV() {
|
_SORT_ENV() {
|
||||||
local ENV_FILE="$1"
|
local ENV_FILE="$1"
|
||||||
|
|
||||||
sed -i "/^# /d; /^$/d" "$ENV_FILE"
|
_SED -i "/^# /d; /^$/d" "$ENV_FILE"
|
||||||
sed -i "s/^[A-Z]/export &/; s/^[^#=]\\+$/&=/" "$ENV_FILE"
|
_SED -i "s/^[A-Z]/export &/; s/^[^#=]\\+$/&=/" "$ENV_FILE"
|
||||||
LC_COLLATE=C sort -uo "$ENV_FILE" "$ENV_FILE"
|
LC_COLLATE=C sort -uo "$ENV_FILE" "$ENV_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_SED() { sed --follow-symlinks $@; }
|
||||||
|
@ -25,7 +25,7 @@ cp "$TEMPLATE_ENV_FILE" "$ENV_FILE" \
|
|||||||
|| __FAIL 3 "unable to create '$ENV_NAME'"
|
|| __FAIL 3 "unable to create '$ENV_NAME'"
|
||||||
|
|
||||||
__STATUS 'stripping inherited values'
|
__STATUS 'stripping inherited values'
|
||||||
sed -i 's/ # inherited from.*$//' "$ENV_FILE" 2>/dev/null
|
_SED -i 's/ # inherited from.*$//' "$ENV_FILE" 2>/dev/null
|
||||||
|
|
||||||
__RUN_SCWRYPT zsh/scwrypts/environment/synchronize -- --no-prompt \
|
__RUN_SCWRYPT zsh/scwrypts/environment/synchronize -- --no-prompt \
|
||||||
|| __FAIL 4 'failed to run environment sync'
|
|| __FAIL 4 'failed to run environment sync'
|
||||||
|
@ -27,7 +27,7 @@ _SORT_ENV $ENV_FILE
|
|||||||
|
|
||||||
while read line
|
while read line
|
||||||
do
|
do
|
||||||
ENV_VAR=$(echo "$line" | sed 's/=.*$//; s/^export //')
|
ENV_VAR=$(echo "$line" | _SED 's/=.*$//; s/^export //')
|
||||||
grep -q "$ENV_VAR" $__ENV_TEMPLATE || {
|
grep -q "$ENV_VAR" $__ENV_TEMPLATE || {
|
||||||
((NEW_VAR+=1))
|
((NEW_VAR+=1))
|
||||||
echo "export $ENV_VAR=" >> $__ENV_TEMPLATE
|
echo "export $ENV_VAR=" >> $__ENV_TEMPLATE
|
||||||
|
@ -20,7 +20,7 @@ _SYNCHRONIZE() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_SORT_ENV "$__ENV_TEMPLATE"
|
_SORT_ENV "$__ENV_TEMPLATE"
|
||||||
sed -i '/__[a-z_]\+=$/d' "$__ENV_TEMPLATE"
|
_SED -i '/__[a-z_]\+=$/d' "$__ENV_TEMPLATE"
|
||||||
git add $__ENV_TEMPLATE >/dev/null 2>&1
|
git add $__ENV_TEMPLATE >/dev/null 2>&1
|
||||||
|
|
||||||
ENVIRONMENTS=$(__GET_ENV_NAMES | sort -r)
|
ENVIRONMENTS=$(__GET_ENV_NAMES | sort -r)
|
||||||
@ -40,7 +40,7 @@ _CLEAR_INHERITED_VARIABLES() {
|
|||||||
for ENV_NAME in $(echo $ENVIRONMENTS)
|
for ENV_NAME in $(echo $ENVIRONMENTS)
|
||||||
do
|
do
|
||||||
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||||
sed -i 's/ # inherited from.*//' "$ENV_FILE"
|
_SED -i 's/ # inherited from.*//' "$ENV_FILE"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ _INSERT_NEW_VARIABLES() {
|
|||||||
echo $line >> $ENV_FILE && __STATUS "added '$line' to '$ENV_NAME'"
|
echo $line >> $ENV_FILE && __STATUS "added '$line' to '$ENV_NAME'"
|
||||||
}
|
}
|
||||||
done
|
done
|
||||||
done < <(sed -n '/^./p' "$__ENV_TEMPLATE")
|
done < <(_SED -n '/^./p' "$__ENV_TEMPLATE")
|
||||||
}
|
}
|
||||||
|
|
||||||
_REMOVE_OLD_VARIABLES() {
|
_REMOVE_OLD_VARIABLES() {
|
||||||
@ -69,11 +69,11 @@ _REMOVE_OLD_VARIABLES() {
|
|||||||
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
ENV_FILE=$(__GET_ENV_FILE $ENV_NAME)
|
||||||
while read line
|
while read line
|
||||||
do
|
do
|
||||||
ENV_VAR=$(echo "$line" | sed 's/=.*/=/')
|
ENV_VAR=$(echo "$line" | _SED 's/=.*/=/')
|
||||||
echo $ENV_VAR | grep -q '__[a-z_]\+=' && continue
|
echo $ENV_VAR | grep -q '__[a-z_]\+=' && continue
|
||||||
|
|
||||||
grep -q "$ENV_VAR" "$__ENV_TEMPLATE" || {
|
grep -q "$ENV_VAR" "$__ENV_TEMPLATE" || {
|
||||||
sed -i "\\%$ENV_VAR%d" "$ENV_FILE"
|
_SED -i "\\%$ENV_VAR%d" "$ENV_FILE"
|
||||||
echo "$ENV_VAR" | grep -qv '^#' \
|
echo "$ENV_VAR" | grep -qv '^#' \
|
||||||
&& __WARNING "removed unwanted '$ENV_VAR' from '$ENV_NAME'"
|
&& __WARNING "removed unwanted '$ENV_VAR' from '$ENV_NAME'"
|
||||||
}
|
}
|
||||||
@ -114,8 +114,8 @@ _CASCADE_ENVIRONMENT() {
|
|||||||
|
|
||||||
while read PARENT_VAR
|
while read PARENT_VAR
|
||||||
do
|
do
|
||||||
VAR_PATTERN=$(echo "$PARENT_VAR" | sed 's/=.*/=/; s/\//\/\//g')
|
VAR_PATTERN=$(echo "$PARENT_VAR" | _SED 's/=.*/=/; s/\//\/\//g')
|
||||||
__STATUS "propagating '$(echo $VAR_PATTERN | sed 's/^export \([^=]*\)=/\1/')' to children"
|
__STATUS "propagating '$(echo $VAR_PATTERN | _SED 's/^export \([^=]*\)=/\1/')' to children"
|
||||||
|
|
||||||
PARENT_VAR+=" # inherited from $PARENT_NAME"
|
PARENT_VAR+=" # inherited from $PARENT_NAME"
|
||||||
|
|
||||||
@ -123,10 +123,10 @@ _CASCADE_ENVIRONMENT() {
|
|||||||
do
|
do
|
||||||
CHILD_FILE=$(__GET_ENV_FILE $CHILD_NAME)
|
CHILD_FILE=$(__GET_ENV_FILE $CHILD_NAME)
|
||||||
|
|
||||||
sed -i "/^$VAR_PATTERN/d" "$CHILD_FILE"
|
_SED -i "/^$VAR_PATTERN/d" "$CHILD_FILE"
|
||||||
echo $PARENT_VAR >> "$CHILD_FILE"
|
echo $PARENT_VAR >> "$CHILD_FILE"
|
||||||
done
|
done
|
||||||
done < <(sed -n '/^[^#][^=]*=[^#]\+$/p' "$PARENT_FILE")
|
done < <(_SED -n '/^[^#][^=]*=[^#]\+$/p' "$PARENT_FILE")
|
||||||
|
|
||||||
__SUCCESS "finished '$PARENT_NAME' propagation"
|
__SUCCESS "finished '$PARENT_NAME' propagation"
|
||||||
}
|
}
|
||||||
@ -135,18 +135,18 @@ _ADD_DESCRIPTIONS() {
|
|||||||
__STATUS 'updating descriptions'
|
__STATUS 'updating descriptions'
|
||||||
while read DESCRIPTION_LINE
|
while read DESCRIPTION_LINE
|
||||||
do
|
do
|
||||||
ENV_VAR=$(echo $DESCRIPTION_LINE | sed 's/ \+| .*$//')
|
ENV_VAR=$(echo $DESCRIPTION_LINE | _SED 's/ \+| .*$//')
|
||||||
DESCRIPTION=$(echo $DESCRIPTION_LINE | sed 's/^.* | //')
|
DESCRIPTION=$(echo $DESCRIPTION_LINE | _SED 's/^.* | //')
|
||||||
for ENV_NAME in $(echo $ENVIRONMENTS)
|
for ENV_NAME in $(echo $ENVIRONMENTS)
|
||||||
do
|
do
|
||||||
sed -i "/^export $ENV_VAR=/i # $DESCRIPTION" "$(__GET_ENV_FILE $ENV_NAME)"
|
_SED -i "/^export $ENV_VAR=/i # $DESCRIPTION" "$(__GET_ENV_FILE $ENV_NAME)"
|
||||||
done
|
done
|
||||||
done < <(sed -n '/^[^ ]\+ \+| /p' "$__ENV_TEMPLATE.descriptions")
|
done < <(_SED -n '/^[^ ]\+ \+| /p' "$__ENV_TEMPLATE.descriptions")
|
||||||
|
|
||||||
for ENV_NAME in $(echo $ENVIRONMENTS)
|
for ENV_NAME in $(echo $ENVIRONMENTS)
|
||||||
do
|
do
|
||||||
sed -i "/^# /i \ " "$(__GET_ENV_FILE $ENV_NAME)"
|
_SED -i "/^# /i \ " "$(__GET_ENV_FILE $ENV_NAME)"
|
||||||
sed -i "s/^ $//" "$(__GET_ENV_FILE $ENV_NAME)"
|
_SED -i "s/^ $//" "$(__GET_ENV_FILE $ENV_NAME)"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@ __CHECK_ENV_VAR() {
|
|||||||
local NAME="$1"
|
local NAME="$1"
|
||||||
[ ! $NAME ] && return 1
|
[ ! $NAME ] && return 1
|
||||||
|
|
||||||
|
local OVERRIDE_VALUE=$(eval echo '$'$NAME'__override')
|
||||||
|
[ $OVERRIDE_VALUE ] && export $NAME=$OVERRIDE_VALUE && return 0
|
||||||
|
|
||||||
local OPTIONAL="$2"
|
local OPTIONAL="$2"
|
||||||
local DEFAULT_VALUE="$3"
|
local DEFAULT_VALUE="$3"
|
||||||
|
|
||||||
@ -17,7 +20,10 @@ __CHECK_ENV_VAR() {
|
|||||||
local SELECTION_VALUES=$(eval echo '$'$NAME'__select' | sed 's/,/\n/g')
|
local SELECTION_VALUES=$(eval echo '$'$NAME'__select' | sed 's/,/\n/g')
|
||||||
[ $SELECTION_VALUES ] && {
|
[ $SELECTION_VALUES ] && {
|
||||||
local SELECTION=$(echo $SELECTION_VALUES | __FZF "select a value for '$NAME'")
|
local SELECTION=$(echo $SELECTION_VALUES | __FZF "select a value for '$NAME'")
|
||||||
[ $SELECTION ] && export VALUE=$SELECTION
|
[ $SELECTION ] && {
|
||||||
|
export $NAME=$SELECTION
|
||||||
|
return 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
[ $VALUE ] && return 0
|
[ $VALUE ] && return 0
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ __PRINT() {
|
|||||||
printf "${COLOR}${MESSAGE}${__COLOR_RESET}${LINE_END}"
|
printf "${COLOR}${MESSAGE}${__COLOR_RESET}${LINE_END}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[ ! $ERRORS ] && export ERRORS=0
|
||||||
__ERROR() { __PRINT $__RED "ERROR ✖ : $@" >&2; ((ERRORS+=1)); }
|
__ERROR() { __PRINT $__RED "ERROR ✖ : $@" >&2; ((ERRORS+=1)); }
|
||||||
__SUCCESS() { __PRINT $__GREEN "SUCCESS ✔ : $@" >&2; }
|
__SUCCESS() { __PRINT $__GREEN "SUCCESS ✔ : $@" >&2; }
|
||||||
__WARNING() { __PRINT $__ORANGE "WARNING : $@" >&2; }
|
__WARNING() { __PRINT $__ORANGE "WARNING : $@" >&2; }
|
||||||
|
Reference in New Issue
Block a user