skilleter-thingy 0.0.40__py3-none-any.whl → 0.0.41__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 skilleter-thingy might be problematic. Click here for more details.

Files changed (68) hide show
  1. skilleter_thingy/__init__.py +6 -0
  2. skilleter_thingy/addpath.py +107 -0
  3. skilleter_thingy/borger.py +269 -0
  4. skilleter_thingy/console_colours.py +63 -0
  5. skilleter_thingy/diskspacecheck.py +67 -0
  6. skilleter_thingy/docker_purge.py +113 -0
  7. skilleter_thingy/ffind.py +536 -0
  8. skilleter_thingy/ggit.py +90 -0
  9. skilleter_thingy/ggrep.py +154 -0
  10. skilleter_thingy/git_br.py +180 -0
  11. skilleter_thingy/git_ca.py +142 -0
  12. skilleter_thingy/git_cleanup.py +287 -0
  13. skilleter_thingy/git_co.py +220 -0
  14. skilleter_thingy/git_common.py +61 -0
  15. skilleter_thingy/git_hold.py +154 -0
  16. skilleter_thingy/git_mr.py +92 -0
  17. skilleter_thingy/git_parent.py +77 -0
  18. skilleter_thingy/git_review.py +1428 -0
  19. skilleter_thingy/git_update.py +385 -0
  20. skilleter_thingy/git_wt.py +96 -0
  21. skilleter_thingy/gitcmp_helper.py +322 -0
  22. skilleter_thingy/gitprompt.py +274 -0
  23. skilleter_thingy/gl.py +174 -0
  24. skilleter_thingy/gphotosync.py +610 -0
  25. skilleter_thingy/linecount.py +155 -0
  26. skilleter_thingy/moviemover.py +133 -0
  27. skilleter_thingy/photodupe.py +136 -0
  28. skilleter_thingy/phototidier.py +248 -0
  29. skilleter_thingy/py_audit.py +131 -0
  30. skilleter_thingy/readable.py +270 -0
  31. skilleter_thingy/remdir.py +126 -0
  32. skilleter_thingy/rmdupe.py +550 -0
  33. skilleter_thingy/rpylint.py +91 -0
  34. skilleter_thingy/splitpics.py +99 -0
  35. skilleter_thingy/strreplace.py +82 -0
  36. skilleter_thingy/sysmon.py +435 -0
  37. skilleter_thingy/tfm.py +920 -0
  38. skilleter_thingy/tfparse.py +101 -0
  39. skilleter_thingy/thingy/__init__.py +6 -0
  40. skilleter_thingy/thingy/colour.py +213 -0
  41. skilleter_thingy/thingy/dc_curses.py +278 -0
  42. skilleter_thingy/thingy/dc_defaults.py +221 -0
  43. skilleter_thingy/thingy/dc_util.py +50 -0
  44. skilleter_thingy/thingy/dircolors.py +308 -0
  45. skilleter_thingy/thingy/docker.py +95 -0
  46. skilleter_thingy/thingy/files.py +142 -0
  47. skilleter_thingy/thingy/git.py +1371 -0
  48. skilleter_thingy/thingy/git2.py +1307 -0
  49. skilleter_thingy/thingy/gitlab.py +193 -0
  50. skilleter_thingy/thingy/logger.py +112 -0
  51. skilleter_thingy/thingy/path.py +156 -0
  52. skilleter_thingy/thingy/popup.py +87 -0
  53. skilleter_thingy/thingy/process.py +112 -0
  54. skilleter_thingy/thingy/run.py +334 -0
  55. skilleter_thingy/thingy/tfm_pane.py +595 -0
  56. skilleter_thingy/thingy/tidy.py +160 -0
  57. skilleter_thingy/trimpath.py +84 -0
  58. skilleter_thingy/window_rename.py +92 -0
  59. skilleter_thingy/xchmod.py +125 -0
  60. skilleter_thingy/yamlcheck.py +89 -0
  61. {skilleter_thingy-0.0.40.dist-info → skilleter_thingy-0.0.41.dist-info}/METADATA +1 -1
  62. skilleter_thingy-0.0.41.dist-info/RECORD +66 -0
  63. skilleter_thingy-0.0.41.dist-info/top_level.txt +1 -0
  64. skilleter_thingy-0.0.40.dist-info/RECORD +0 -6
  65. skilleter_thingy-0.0.40.dist-info/top_level.txt +0 -1
  66. {skilleter_thingy-0.0.40.dist-info → skilleter_thingy-0.0.41.dist-info}/LICENSE +0 -0
  67. {skilleter_thingy-0.0.40.dist-info → skilleter_thingy-0.0.41.dist-info}/WHEEL +0 -0
  68. {skilleter_thingy-0.0.40.dist-info → skilleter_thingy-0.0.41.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,160 @@
1
+ #! /usr/bin/env python3
2
+
3
+ ################################################################################
4
+ """ Functions for making log files and similar more easily viewed and/or compared
5
+
6
+ Defaults to making things readable on a light background but has the
7
+ option to make things readable on a dark background or for removing
8
+ colours altogether.
9
+
10
+ Has functions for removing times, AWS ID values, colours, SHA1 values,
11
+ Also function for making ANSI codes more readable on light or dark backgrounds
12
+
13
+ Currently this is very cude and needs to be a lot more cleverer.
14
+
15
+ TODO: Handle multiple colour changes in a single ANSI sequence
16
+ TODO: Take account of the background colour when determining how to change the foreground colour
17
+ TODO: More colour conversions (currently only converts bright yellow on white to dark yellow)
18
+ TODO: Handle 256 colour codes
19
+ TODO: More time formats
20
+ """
21
+ ################################################################################
22
+
23
+ import re
24
+
25
+ ################################################################################
26
+ # Regular expressions
27
+
28
+ # Match an ANSI colour control sequence
29
+
30
+ ANSI_REGEXES = [
31
+ re.compile(r'\x1b\[([0-9][0-9;]*)*m'),
32
+ re.compile(r'\x1b\[m')
33
+ ]
34
+
35
+ # Match and ANSI colour control sequence and capture the colour bit
36
+
37
+ RE_DEBUG = re.compile(r'\x1b(\[[0-9][0-9;]*m)')
38
+
39
+ # Colour conversions for light backgrounds
40
+
41
+ LIGHT_TABLE = [['1;33', '0;33']]
42
+
43
+ # Colour conversions for dark backgrounds
44
+
45
+ DARK_TABLE = []
46
+
47
+ # Common time formats found in log files
48
+
49
+ RE_TIME = [
50
+ {'regex': re.compile(r'[1-9][0-9]{3}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]+Z?'), 'replace': '{DATE+TIME}'},
51
+ {'regex': re.compile(r'[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}(Z|,[0-9]+)'), 'replace': '{TIME}'},
52
+ {'regex': re.compile(r'[0-9]{1,2}:[0-9]{2}:[0-9]{2}(\.[0-9]{1,6})?([+][0-9]{2}:[0-9]{2})?'), 'replace': '{TIME}'},
53
+
54
+
55
+ {'regex': re.compile(r'[1-9][0-9]{3}/[0-9][0-9]?/[1-9][0-9]'), 'replace': '{DATE}'},
56
+ {'regex': re.compile(r'[1-9][0-9]/[0-9][0-9]?/[1-9][0-9]{3}'), 'replace': '{DATE}'},
57
+ {'regex': re.compile(r'[0-9]{4}-[0-9]{2}-[0-9]{2}'), 'replace': '{DATE}'},
58
+ {'regex': re.compile(r'[0-9]{2}-[0-9]{2}-[0-9]{4}'), 'replace': '{DATE}'},
59
+
60
+ {'regex': re.compile(r'[0-9]([.][0-9]*)*\s*(second[s]?)'), 'replace': '{ELAPSED}'},
61
+
62
+ {'find': '{DATE} {TIME}', 'replace': '{DATE+TIME}'},
63
+ ]
64
+
65
+ # SHA values
66
+
67
+ RE_SHA256 = [
68
+ {'regex': re.compile('[0-9a-f]{64}'), 'replace': '{SHA256}'},
69
+ ]
70
+
71
+ RE_SHA1 = [
72
+ {'regex': re.compile('[0-9a-f]{40}'), 'replace': '{SHA1}'},
73
+ ]
74
+
75
+ # AWS ids
76
+
77
+ RE_AWS = \
78
+ [
79
+ {'regex': re.compile('eni-0[0-9a-f]{16}'), 'replace': '{ENI-ID}'},
80
+ {'regex': re.compile('ami-0[0-9a-f]{16}'), 'replace': '{AMI-ID}'},
81
+ {'regex': re.compile('snap-0[0-9a-f]{16}'), 'replace': '{AMI-SNAP}'},
82
+ {'regex': re.compile('vol-0[0-9a-f]{16}'), 'replace': '{AMI-VOL}'},
83
+ {'regex': re.compile('sir-[0-9a-z]{8}'), 'replace': '{SPOT-INSTANCE}'},
84
+ {'regex': re.compile('i-0[0-9a-f]{16}'), 'replace': '{EC2-ID}'},
85
+ {'regex': re.compile('request id: [0-0a-f]{8}-[0-0a-f]{4}-[0-0a-f]{4}-[0-0a-f]{4}-[0-0a-f]{12}'), 'replace': 'request id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'},
86
+ ]
87
+
88
+ ################################################################################
89
+
90
+ def regex_replace(data, regexes):
91
+ """ Do a set of regex replacements """
92
+
93
+ for regex in regexes:
94
+ if 'find' in regex:
95
+ data = data.replace(regex['find'], regex['replace'])
96
+ elif 'regex' in regex:
97
+ data = regex['regex'].sub(regex['replace'], data)
98
+ else:
99
+ assert False
100
+
101
+ return data
102
+
103
+ ################################################################################
104
+
105
+ def debug_format(data):
106
+ """ Make the ANSI colour codes in the specified string human-readable """
107
+
108
+ return RE_DEBUG.sub('{ESC\\1}', data)
109
+
110
+ ################################################################################
111
+
112
+ def convert_ansi(data, light=True):
113
+ """ Use the conversion table to convert ANSI codes in the string for display
114
+ on a light or dark background """
115
+
116
+ table = LIGHT_TABLE if light else DARK_TABLE
117
+
118
+ for entry in table:
119
+ data = data.replace('\x1b[%s' % entry[0], '\x1b[%s' % entry[1])
120
+
121
+ return data
122
+
123
+ ################################################################################
124
+
125
+ def remove_times(data):
126
+ """ Attempt to remove obvious time and duration references from a string """
127
+
128
+ return regex_replace(data, RE_TIME)
129
+
130
+ ################################################################################
131
+
132
+ def remove_sha1(data):
133
+ """ Attempt to remove SHA1 references from a string """
134
+
135
+ return regex_replace(data, RE_SHA1)
136
+
137
+ ################################################################################
138
+
139
+ def remove_sha256(data):
140
+ """ Attempt to remove SHA256 references from a string """
141
+
142
+ return regex_replace(data, RE_SHA256)
143
+
144
+ ################################################################################
145
+
146
+ def remove_aws_ids(data):
147
+ """ Attempt to remove a variety of AWS ID references from a string """
148
+
149
+ return regex_replace(data, RE_AWS)
150
+
151
+ ################################################################################
152
+
153
+ def remove_ansi(text):
154
+ """ Remove ANSI codes from a string """
155
+
156
+ if '\x1b' in text:
157
+ for regex in ANSI_REGEXES:
158
+ text = regex.sub('', text)
159
+
160
+ return text
@@ -0,0 +1,84 @@
1
+ #! /usr/bin/env python3
2
+
3
+ ################################################################################
4
+ """ Thingy trimpath command
5
+
6
+ Copyright (C) 2017 John Skilleter
7
+
8
+ Given a path, truncate it to less than 25% of the width of the console by
9
+ replacing intermediate directories with '...' """
10
+ ################################################################################
11
+
12
+ import sys
13
+ import os
14
+ import argparse
15
+ import shutil
16
+
17
+ import thingy.path as path
18
+ import thingy.logger as logger
19
+
20
+ ################################################################################
21
+
22
+ def main():
23
+ """ Trim a path to a specified width """
24
+
25
+ # Set up the command line parser
26
+
27
+ parser = argparse.ArgumentParser(description='Trim a path for display to a specified with by replacing intermediate directory names with "..."')
28
+
29
+ parser.add_argument('-w', '--width', default=None, help='Specify the width to trim to the path to. Default is 25% of the current console width')
30
+ parser.add_argument('path', nargs='?', default=None, help='The path to trim. Default is the current directory')
31
+ parser.add_argument('--debug', action='store_true', help='Enable debug output')
32
+
33
+ args = parser.parse_args()
34
+
35
+ log = logger.init('trimpath')
36
+
37
+ if args.debug:
38
+ if log.getEffectiveLevel() < logger.DEBUG:
39
+ log.setLevel(logger.DEBUG)
40
+
41
+ # Set the width, defaulting to 25% of the console width
42
+
43
+ if args.width:
44
+ try:
45
+ trim_width = int(args.width)
46
+ except ValueError:
47
+ trim_width = -1
48
+
49
+ if trim_width <= 0:
50
+ log.critical('Invalid width: "%s"', args.width)
51
+ sys.exit(1)
52
+ else:
53
+ console = shutil.get_terminal_size()
54
+ trim_width = console.columns // 4
55
+
56
+ # Set the path, defaulting to the current directory
57
+
58
+ if args.path:
59
+ full_path = args.path
60
+ else:
61
+ full_path = os.getcwd()
62
+
63
+ trimmed = path.trimpath(full_path, trim_width)
64
+
65
+ sys.stdout.write(trimmed)
66
+
67
+ ################################################################################
68
+
69
+ def trimpath():
70
+ """Entry point"""
71
+
72
+ try:
73
+ main()
74
+ except KeyboardInterrupt:
75
+ sys.exit(1)
76
+ except BrokenPipeError:
77
+ sys.exit(2)
78
+ except:
79
+ sys.exit(3)
80
+
81
+ ################################################################################
82
+
83
+ if __name__ == '__main__':
84
+ trimpath()
@@ -0,0 +1,92 @@
1
+ #! /usr/bin/env python3
2
+
3
+ ################################################################################
4
+ """
5
+ Monitor window titles and rename them to fit an alphabetical grouping
6
+ in 'Appname - Document' format.
7
+ """
8
+ ################################################################################
9
+
10
+ import sys
11
+ import re
12
+ import subprocess
13
+
14
+ ################################################################################
15
+ # Hard coded table of regexes for window titles to rename
16
+ # TODO: This should be a configuration file
17
+
18
+ RENAMES = [
19
+ [r'^\[(.*)\]$', r'\1'],
20
+ [r'(.*) - Mozilla Firefox', r'Firefox - \1'],
21
+ [r'(.*) - Mozilla Thunderbird', r'Thunderbird - \1'],
22
+ [r'\[(.*) - KeePass\]', r'Keepass - \1'],
23
+ [r'(.*) - LibreOffice Calc', r'LibreOffice Calc - \1'],
24
+ [r'(.*) - Zim$', r'Zim - \1'],
25
+ [r'(.*) - Chromium$', r'Chromium - \1'],
26
+ ]
27
+
28
+ ################################################################################
29
+
30
+ def main():
31
+ """ Search for windows and rename them appropriately """
32
+
33
+ # Build the re. to match renameable windows
34
+
35
+ regex = '|'.join([rename[0] for rename in RENAMES])
36
+
37
+ # Build the command to wait for a matching visible window to appear
38
+
39
+ cmd = ['xdotool', 'search', '--sync', '--name', '--onlyvisible', regex]
40
+
41
+ while True:
42
+ # Wait for one or more matching windows
43
+
44
+ result = subprocess.run(cmd, stdout=subprocess.PIPE, universal_newlines=True)
45
+
46
+ if result.returncode:
47
+ sys.stderr.write('ERROR %d returned from xdotool search, ignoring it.\n' % result.returncode)
48
+ continue
49
+
50
+ # Parse the list of window IDs
51
+
52
+ for window_id in result.stdout.split('\n'):
53
+ if window_id:
54
+ # Get the window name
55
+
56
+ names = subprocess.run(['xdotool', 'getwindowname', window_id], stdout=subprocess.PIPE, universal_newlines=True)
57
+
58
+ if result.returncode:
59
+ sys.stderr.write('ERROR %d returned from xdotool getwindowname, ignoring it.\n' % result.returncode)
60
+ return
61
+
62
+ name = names.stdout.split('\n')[0].strip()
63
+
64
+ if name:
65
+ # If it matches an entry in the list then rename it
66
+
67
+ for entry in RENAMES:
68
+ new_name = re.sub(entry[0], entry[1], name)
69
+
70
+ if new_name != name:
71
+ print('%s -> %s' % (name, new_name))
72
+ subprocess.run(['wmctrl', '-i', '-r', window_id, '-N', new_name])
73
+ if result.returncode:
74
+ sys.stderr.write('ERROR %d returned from wmctrl set_window, ignoring it.\n' % result.returncode)
75
+
76
+ break
77
+
78
+ ################################################################################
79
+
80
+ def window_rename():
81
+ """Entry point"""
82
+ try:
83
+ main()
84
+ except KeyboardInterrupt:
85
+ sys.exit(1)
86
+ except BrokenPipeError:
87
+ sys.exit(2)
88
+
89
+ ################################################################################
90
+
91
+ if __name__ == '__main__':
92
+ window_rename()
@@ -0,0 +1,125 @@
1
+ #! /usr/bin/env python3
2
+
3
+ ################################################################################
4
+ """ xchmod - Equivalent to chmod but only modifies files that do not
5
+ have the correct permissions - chmod will just set all to the
6
+ correct permissions regardless of current permissions and update
7
+ the file last-changed date whether or not the file has changed.
8
+
9
+ Initial version has MAJOR RESTRICTIONS: It only allows permissions
10
+ of 'a+rw' and applies them to all files and directories in the specified
11
+ path and must be run with -R/--recursive.
12
+
13
+ TODO:
14
+ Support all file modes as per chmod
15
+ Support all command line options of chmod
16
+ Implement non-recursive mode
17
+ Options for files/directories only
18
+
19
+ Copyright (C) 2017 John Skilleter
20
+
21
+ Licence: GPL v3 or later
22
+ """
23
+ ################################################################################
24
+
25
+ import os
26
+ import sys
27
+ import stat
28
+ import argparse
29
+
30
+ ################################################################################
31
+ # Constants
32
+
33
+ # Required mode for files
34
+
35
+ MODE_ALL_RW = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IWGRP | stat.S_IROTH | stat.S_IWOTH
36
+
37
+ MODE_ALL_RW_DIR = MODE_ALL_RW | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
38
+
39
+ ################################################################################
40
+
41
+ def set_mode(filepath, mode, debug, verbose):
42
+ """ Given the name of a file, the required mode and verbose
43
+ and debug flags, attempt to set the mode of the file if it does not
44
+ already have the specified mode bits set (it currently only sets
45
+ mode bits - it will not unset them)
46
+
47
+ If verbose or debug are true then the operation is reported
48
+ If debug is true the operation is not performed """
49
+
50
+ # File mode (the bits that can be changed via chmod)
51
+
52
+ filemode = stat.S_IMODE(os.stat(filepath).st_mode)
53
+
54
+ # If the current mode doesn't have all the right bits set
55
+ # then either report it or set them (leaving other bits unchanged)
56
+
57
+ if (filemode & mode) != mode:
58
+
59
+ newfilemode = filemode | mode
60
+
61
+ if verbose or debug:
62
+ print('%s (%03o -> %03o)' % (filepath, filemode, newfilemode))
63
+
64
+ if not debug:
65
+ os.chmod(filepath, newfilemode)
66
+
67
+ ################################################################################
68
+
69
+ def make_public():
70
+ """ Search and make public everything in the paths specified on the command
71
+ line """
72
+
73
+ parser = argparse.ArgumentParser(description='Locate files that are not publically writeable and make them so')
74
+
75
+ parser.add_argument('--debug', action='store_true', help='Output the list of files (if any) that need to be made publically writeable')
76
+ parser.add_argument('--verbose', action='store_true', help='List files as they are updated')
77
+ parser.add_argument('-R', '--recursive', action='store_true', help='Operate recursively')
78
+ parser.add_argument('mode', help='Mode to set')
79
+ parser.add_argument('paths', nargs='+', help='List of directory paths to search')
80
+
81
+ args = parser.parse_args()
82
+
83
+ # We only support a+rw in the first version! Future versions will allow all mode types
84
+ # and command line options supported by the chmod command.
85
+
86
+ if args.mode != 'a+rw':
87
+ sys.stderr.write('Invalid mode "%s" - currently ONLY a+rw is supported\n' % args.mode)
88
+ sys.exit(1)
89
+
90
+ if not args.recursive:
91
+ sys.stderr.write('Invalid command line - recursive option currently MUST be specified\n')
92
+ sys.exit(1)
93
+
94
+ # Make sure that we aren't doing anything reckless
95
+
96
+ for path in args.paths:
97
+ if os.path.abspath(path) == '/':
98
+ sys.stderr.write('You cannot recurse from the root directory\n')
99
+ sys.exit(1)
100
+
101
+ # Process each path and each directory and each file & directory in each directory
102
+
103
+ for path in args.paths:
104
+ for root, dirs, files in os.walk(path):
105
+ for filename in files:
106
+ set_mode(os.path.join(root, filename), MODE_ALL_RW, args.debug, args.verbose)
107
+
108
+ for dirname in dirs:
109
+ set_mode(os.path.join(root, dirname) + '/', MODE_ALL_RW_DIR, args.debug, args.verbose)
110
+
111
+ ################################################################################
112
+
113
+ def xchmod():
114
+ """Entry point"""
115
+ try:
116
+ make_public()
117
+ except KeyboardInterrupt:
118
+ sys.exit(1)
119
+ except BrokenPipeError:
120
+ sys.exit(2)
121
+
122
+ ################################################################################
123
+
124
+ if __name__ == '__main__':
125
+ xchmod()
@@ -0,0 +1,89 @@
1
+ #! /usr/bin/env python3
2
+
3
+ ################################################################################
4
+ """ Basic YML validator
5
+
6
+ Copyright (C) 2017, 2018 John Skilleter
7
+ """
8
+ ################################################################################
9
+
10
+ import sys
11
+ import argparse
12
+
13
+ import yaml
14
+
15
+ ################################################################################
16
+
17
+ def yaml_process(name, data):
18
+ """ Recursive yaml nosher """
19
+
20
+ if isinstance(data, dict):
21
+ for item in data:
22
+ yaml_process('%s::%s' % (name, item), data[item])
23
+ else:
24
+ print('%s: %s' % (name, data))
25
+
26
+ ################################################################################
27
+
28
+ def main():
29
+ """ Parse the command line - just takes one option (to dump the file after
30
+ successfully parsing it) and a list of 1 or more files to parse """
31
+
32
+ parser = argparse.ArgumentParser(description='Validate one or more YAML source files')
33
+ parser.add_argument('--dump', action='store_true', help='Dump the YAML data after parsing it')
34
+ parser.add_argument('--block', action='store_true', help='Force block style when dumping the YAML data')
35
+ parser.add_argument('--flow', action='store_true', help='Force flow style when dumping the YAML data')
36
+ parser.add_argument('--hiera', action='store_true', help='Process the file as Puppet Hiera data')
37
+ parser.add_argument('files', nargs='+', help='YAML source file')
38
+ args = parser.parse_args()
39
+
40
+ if args.block and args.flow:
41
+ sys.stderr.write('You cannot specify both block and flow style output')
42
+
43
+ if args.block:
44
+ flow_style = False
45
+ elif args.flow:
46
+ flow_style = True
47
+ else:
48
+ flow_style = None
49
+
50
+ # Try to parse each file, optionally dumping the result back to stdout
51
+ # and catching and reporting exceptions
52
+
53
+ for filename in args.files:
54
+ try:
55
+ for yaml_data in yaml.safe_load_all(open(filename)):
56
+
57
+ if args.dump:
58
+ if len(args.files) > 1:
59
+ print('File: %s' % filename)
60
+
61
+ print(yaml.dump(yaml_data, default_flow_style=flow_style))
62
+
63
+ if args.hiera:
64
+ for data in yaml_data:
65
+ yaml_process(data, yaml_data[data])
66
+
67
+ except yaml.YAMLError as exc:
68
+ sys.stderr.write('Error: %s\n' % exc)
69
+
70
+ except IOError:
71
+ sys.stderr.write('Error reading %s\n' % filename)
72
+ sys.exit(2)
73
+
74
+ ################################################################################
75
+
76
+ def yamlcheck():
77
+ """Entry point"""
78
+
79
+ try:
80
+ main()
81
+ except KeyboardInterrupt:
82
+ sys.exit(1)
83
+ except BrokenPipeError:
84
+ sys.exit(2)
85
+
86
+ ################################################################################
87
+
88
+ if __name__ == '__main__':
89
+ yamlcheck()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: skilleter_thingy
3
- Version: 0.0.40
3
+ Version: 0.0.41
4
4
  Summary: A collection of useful utilities, mainly aimed at making Git more friendly
5
5
  Author-email: John Skilleter <john@skilleter.org.uk>
6
6
  Project-URL: Home, https://skilleter.org.uk
@@ -0,0 +1,66 @@
1
+ skilleter_thingy/__init__.py,sha256=rVPTxm8L5w52U0YdTd7r_D44SBP7pS3JCJtsf0iIsow,110
2
+ skilleter_thingy/addpath.py,sha256=4Yhhgjjz1XDI98j0dAiQpNA2ejLefeWUTeSg3nIXQq0,3842
3
+ skilleter_thingy/borger.py,sha256=AQX7OHeGXcUjkgyXEWE2h_oOey9eczZBbKjrreXvRAs,7832
4
+ skilleter_thingy/console_colours.py,sha256=BOS9mo3jChx_FE8L1j488MDoVNgib11KjTRhrz_YRYE,1781
5
+ skilleter_thingy/diskspacecheck.py,sha256=7xsj4egXXV6jPhXZTe2b5rS03XAmm5uLC5TeiO1NJoE,2072
6
+ skilleter_thingy/docker_purge.py,sha256=2t6yjlxmHCHKMAejLViYyOQNzyqSXGiV59df4Wlojaw,3349
7
+ skilleter_thingy/ffind.py,sha256=1MQGnzr-n3TUH2yFphfj4SjYNR3b-6LsdmLjhHJy2e0,19345
8
+ skilleter_thingy/ggit.py,sha256=AIhW3S7HC9smgBcHmDsbTLnO6j9VASkeLsBeA0hnCvM,2480
9
+ skilleter_thingy/ggrep.py,sha256=Mxme8gliQms9-_uf7CLqD9Zd3ZAVFWjamsK6dWw58jg,5863
10
+ skilleter_thingy/git_br.py,sha256=NUCqe85VCgouzEpbMVODaScPIsbCrC4pe7zDMDz02Ro,5799
11
+ skilleter_thingy/git_ca.py,sha256=0SluqsJaNSaPdcS4c94648ELAm7aHB3aWgIdF1sngT8,4963
12
+ skilleter_thingy/git_cleanup.py,sha256=TnUPYAUnByVyY_dwANzDg2BGGNh3jskNF1DgU3pc8Jk,10201
13
+ skilleter_thingy/git_co.py,sha256=gBES0ltlomy7vXX8IHh0-Vt1af54t2Ie5UnRYYfP4tM,8212
14
+ skilleter_thingy/git_common.py,sha256=ZjNkvIBRDGNLFYwOu9FjeqdDKJdm0sndX5QATtmq290,1879
15
+ skilleter_thingy/git_hold.py,sha256=yXpbpwH0cKpRiSAwxsYZncF4XHkJREUiLEyxCWzN8Rg,4617
16
+ skilleter_thingy/git_mr.py,sha256=BCE68hhz2bV0zwHkEv5tyfRY0aXoUdb_aJ-yWYDu_Wo,3087
17
+ skilleter_thingy/git_parent.py,sha256=D47D01dPs6kActusA0ircJYTv8tBjDoe8MzMpJVWJpA,2683
18
+ skilleter_thingy/git_review.py,sha256=1_vGcEgy6TvzoXIIDqsOeRZ4qeweDeNPuLwDQsEH08k,51769
19
+ skilleter_thingy/git_update.py,sha256=2SAGeqL2LjdsXTYak3nvPtNfhSOWJdXZfAUx6bqC8Qw,13972
20
+ skilleter_thingy/git_wt.py,sha256=pe2VNmNZTlc4su9I1-xnDcui7QVBQ7X3kOIJWQrrfic,3128
21
+ skilleter_thingy/gitcmp_helper.py,sha256=_3ji-PyIF2oI6a4zyUPjLeCFgAtACykxPpOrbjD6-aw,11245
22
+ skilleter_thingy/gitprompt.py,sha256=SzSMd0EGI7ftPko80Q2PipwbVA-qjU1jsmdpmTCM5GI,8912
23
+ skilleter_thingy/gl.py,sha256=9zbGpKxw6lX9RghLkdy-Q5sZlqtbB3uGFO04qTu1dH8,5954
24
+ skilleter_thingy/gphotosync.py,sha256=TBxGEwhbMKv47tw1R-9roGPXZE_XYfZTNEe8FsA4AxI,22035
25
+ skilleter_thingy/linecount.py,sha256=5voQtjJjDCVx4zjPwVRy620NpuLiwwFitzxjIsRGtxQ,4310
26
+ skilleter_thingy/moviemover.py,sha256=j_Xb9_jFdgpFBAXcF4tEqbnKH_FonlnUU39LiCK980k,4470
27
+ skilleter_thingy/photodupe.py,sha256=FssLgbLnqHPuSvMGtRyOa7bRdowufJOQaJJ56f9ybxk,4195
28
+ skilleter_thingy/phototidier.py,sha256=5gSjlINUxf3ZQl3NG0o7CsWwODvTbokIMIafLFvn8Hc,7818
29
+ skilleter_thingy/py_audit.py,sha256=ZyKN8O0fM4xnwVspk1qH_Dnv5ujM7lJfKxC87xWilr0,4395
30
+ skilleter_thingy/readable.py,sha256=eZ6nI5TDMncwP74sdPMXrvGTNR7M51-NUGOxRwJpAvA,9474
31
+ skilleter_thingy/remdir.py,sha256=-C-LAOaphdKLbBwm--rEwrsDdyldXps-C4s8iDNOKw8,4610
32
+ skilleter_thingy/rmdupe.py,sha256=tcX3w8XvliGwBMdSt9BUu07kuDtQEc0IiU8sCxmgzHA,17117
33
+ skilleter_thingy/rpylint.py,sha256=TzZ5GvWrqgTKYKZwadTvzdbX-DJ8ll4WfVJqtN6IzO0,2635
34
+ skilleter_thingy/splitpics.py,sha256=qRlJrqet7TEI6SodS4bkuKXQUpOdMaqmjE4c1CR7ouo,3266
35
+ skilleter_thingy/strreplace.py,sha256=xsIWw0hc452rYEBtNEQFKIzmV03xjm_Taz-eDTmFFKI,2539
36
+ skilleter_thingy/sysmon.py,sha256=XRZG6EVSzoVYan_N16qVB1l1RaU51uvLWlRA0CDjC54,11348
37
+ skilleter_thingy/tfm.py,sha256=3ejKNI2P65lGz-50mxRMxW_o5NmoeMDcmhji_0uALhI,33703
38
+ skilleter_thingy/tfparse.py,sha256=u1IZH2J_WH1aORyMozKSI2JKok7_S1MMJhiobzmhlUI,2988
39
+ skilleter_thingy/trimpath.py,sha256=IJU3zl4Hg08g0eU24LZyDlGfNa-5k-TZM5s9zR4OIdA,2385
40
+ skilleter_thingy/window_rename.py,sha256=dCBgZqih_3YKHt35hsOAhARFp3QxOi8w8huC63sqJK8,3128
41
+ skilleter_thingy/xchmod.py,sha256=F9_lxKuLqVlHHr3oBI3dkMoFOuwRzYDlpQMTmDcjpBI,4590
42
+ skilleter_thingy/yamlcheck.py,sha256=FXylZ5NtHirDlPVhVEUZUZkTugVR-g51BbjaN06akAc,2868
43
+ skilleter_thingy/thingy/__init__.py,sha256=rVPTxm8L5w52U0YdTd7r_D44SBP7pS3JCJtsf0iIsow,110
44
+ skilleter_thingy/thingy/colour.py,sha256=D-RTYsND6Xm6m3xl0mOe9QSrTNYsyY0K_a8x3id2gvg,7031
45
+ skilleter_thingy/thingy/dc_curses.py,sha256=fuuQPR11zV_akAhygL_cAhVLC5YAgKgowzlITVbETE8,8539
46
+ skilleter_thingy/thingy/dc_defaults.py,sha256=ahcteQvoWZrO5iTU68zkIY1Zex6iX5uR5ubwI4CCYBk,6170
47
+ skilleter_thingy/thingy/dc_util.py,sha256=Df73imXhHx3HzcPHiRcHAoea0e3HURdLcrolUsMhOFs,1783
48
+ skilleter_thingy/thingy/dircolors.py,sha256=5NbXMsGWdABLvvZfB70VPmN6N5HyyihfpgoQq1NRJbg,12264
49
+ skilleter_thingy/thingy/docker.py,sha256=9EFatudoVPfB1UbDEtzdJDB3o6ToHiNHv8-oLsUeqiQ,2449
50
+ skilleter_thingy/thingy/files.py,sha256=8wXUHEGALhHvYtJewjSNwHFw-hGHFYbWH9_40lJj5ZY,4257
51
+ skilleter_thingy/thingy/git.py,sha256=9y58KhFx6t9nNyqMbixM5cl8LBcD2sdCh9UgyVPv4bo,38043
52
+ skilleter_thingy/thingy/git2.py,sha256=xfQrOpOk4SLdE6T-pr0FTuYGn0gSY92VMDpmqvX3gDM,35751
53
+ skilleter_thingy/thingy/gitlab.py,sha256=uXAF918xnPk6qQyiwPQDbMZfqtJzhiRqDS7yEtJEIAg,6079
54
+ skilleter_thingy/thingy/logger.py,sha256=xKgPAq8KGXmtaXIFjFs1AmZJXtYrXJn2sqL3oxHZjfQ,3107
55
+ skilleter_thingy/thingy/path.py,sha256=me__Ukw-7NiD70Yd9tOWyj7QX79-deFvsQaQ9AGzWzU,4732
56
+ skilleter_thingy/thingy/popup.py,sha256=jW-nbpdeswqEMTli7OmBv1J8XQsvFoMI0J33O6dOeu8,2529
57
+ skilleter_thingy/thingy/process.py,sha256=88pKHQZXBP1m3Ja7t3DtKJ4Njn7HS2OtcI0Z0i1KwUs,3560
58
+ skilleter_thingy/thingy/run.py,sha256=051lGahG4liYLckQFpmSaGuE9Chd-lFdmJO85LdmeXE,12607
59
+ skilleter_thingy/thingy/tfm_pane.py,sha256=40DmQeLMEUPiKKIJkgN1MEpIen00V70I1HB7Q6git44,19814
60
+ skilleter_thingy/thingy/tidy.py,sha256=wzkyxzCsHXyY46G3Rjqu4ZrqiL8QMbRXyJEeYOmpy-o,5402
61
+ skilleter_thingy-0.0.41.dist-info/LICENSE,sha256=ljOS4DjXvqEo5VzGfdaRwgRZPbNScGBmfwyC8PChvmQ,32422
62
+ skilleter_thingy-0.0.41.dist-info/METADATA,sha256=4_CFHLGXRD5uP5weLidJUJCYq1Dphd4RpcQA8PXVPeE,5210
63
+ skilleter_thingy-0.0.41.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
64
+ skilleter_thingy-0.0.41.dist-info/entry_points.txt,sha256=jf7hVfH0dojLxk0D4TjIazKoqdToditCGdCfyhIotME,1971
65
+ skilleter_thingy-0.0.41.dist-info/top_level.txt,sha256=8-JhgToBBiWURunmvfpSxEvNkDHQQ7r25-aBXtZv61g,17
66
+ skilleter_thingy-0.0.41.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ skilleter_thingy
@@ -1,6 +0,0 @@
1
- skilleter_thingy-0.0.40.dist-info/LICENSE,sha256=ljOS4DjXvqEo5VzGfdaRwgRZPbNScGBmfwyC8PChvmQ,32422
2
- skilleter_thingy-0.0.40.dist-info/METADATA,sha256=dzz1bPdsRTAHhbnCs2U-PN1_auK0mGmbiQbYA6hNDQs,5210
3
- skilleter_thingy-0.0.40.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
4
- skilleter_thingy-0.0.40.dist-info/entry_points.txt,sha256=jf7hVfH0dojLxk0D4TjIazKoqdToditCGdCfyhIotME,1971
5
- skilleter_thingy-0.0.40.dist-info/top_level.txt,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
6
- skilleter_thingy-0.0.40.dist-info/RECORD,,