From 33983b2a54666555d8865481a6b94f89c638cfd4 Mon Sep 17 00:00:00 2001 From: Michael Hofrichter Date: Fri, 27 Feb 2026 14:43:21 -0600 Subject: [PATCH 1/3] add -list-servers argument --- .bumpversion.cfg | 2 +- .gitignore | 3 +++ CHANGELOG.md | 6 +++++ README.md | 6 +++-- docassemblecli/commands.py | 46 ++++++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- 6 files changed, 61 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 6524918..b624ea6 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.0.25 +current_version = 0.0.26 commit = True tag = True diff --git a/.gitignore b/.gitignore index b178552..d5b5122 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ newversion.sh .history .mypy_cache */.mypy_cache +Icon +.DS_Store +Icon? \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e0bf7e..212a044 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 0.0.26 - 2026-02-27 + +### Added + +- `--list-servers` argument for the dainstall command. + ## 0.0.23 - 2025-06-12 ### Added diff --git a/README.md b/README.md index a97c83b..ad7ec50 100644 --- a/README.md +++ b/README.md @@ -147,8 +147,8 @@ You can run `dainstall --help` to get more information about how usage: dainstall [-h] [--apiurl APIURL] [--apikey APIKEY] [--norestart] [--watch] [--force-restart] [--server SERVER] [--playground] - [--project PROJECT] [--add] [--noconfig] [--debug] - [directory] + [--project PROJECT] [--add] [--noconfig] [--debug] + [--list-servers] [directory] positional arguments: directory @@ -171,6 +171,8 @@ You can run `dainstall --help` to get more information about how --add add another server to the .docassemblecli config file --noconfig do not use the .docassemblecli config file --debug use verbose logging + --list-servers Lists out the names and urls of all servers in the + .docassemblecli configuration file For example, you might want to pass the URL and API key in the command itself: diff --git a/docassemblecli/commands.py b/docassemblecli/commands.py index afad93d..a790351 100644 --- a/docassemblecli/commands.py +++ b/docassemblecli/commands.py @@ -318,6 +318,36 @@ def name_from_url(url): return name +def list_servers(): + dotfile = os.path.join(os.path.expanduser("~"), ".docassemblecli") + if os.path.isfile(dotfile): + try: + with open(dotfile, "r", encoding="utf-8") as fp: + env = yaml.load(fp, Loader=yaml.FullLoader) + except Exception as err: + sys.stderr.write( + "Unable to load .docassemblecli file. " + + err.__class__.__name__ + + ": " + + str(err) + + "\n" + ) + env = [] + else: + env = [] + if isinstance(env, dict) and "apikey" in env and "apiurl" in env: + env["name"] = name_from_url(str(env["apiurl"])) + env = [env] + if not isinstance(env, list): + sys.stderr.write("Format of .docassemblecli file is not a list; ignoring.\n") + env = [] + return [ + (item["name"], item["apiurl"]) + for item in env + if isinstance(item, dict) and "name" in item and "apiurl" in item + ] + + def wait_for_server(playground:bool, task_id, apikey, apiurl): if playground: sys.stdout.write("Waiting for server to restart.") @@ -395,11 +425,27 @@ def dainstall(): parser.add_argument("--add", help="add another server to the .docassemblecli config file", action="store_true") parser.add_argument("--noconfig", help="do not use the .docassemblecli config file", action="store_true") parser.add_argument("--debug", help="use verbose logging", action="store_true") + parser.add_argument( + "--list-servers", + help="list servers in the .docassemblecli config file", + action="store_true", + ) args = parser.parse_args() if args.norestart and args.force_restart: return("The --norestart option can cannot be used with --force-restart.") if args.project and not args.playground: return("The --project option can only be used with --playground.") + if args.list_servers: + servers = list_servers() + if len(servers) == 0: + sys.stdout.write("No servers found in .docassemblecli\n") + else: + sys.stdout.write("Servers in .docassemblecli:\n") + sys.stdout.write(" Server Name: Server URL\n") + sys.stdout.write(" ------------ ----------\n") + for name, url in servers: + sys.stdout.write(f" {name}: {url}\n") + return if not args.add: if args.directory is None: parser.print_help() diff --git a/pyproject.toml b/pyproject.toml index bb9868f..e55d44d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "docassemblecli" -version = "0.0.25" +version = "0.0.26" authors = [ { name = "Jonathan Pyle", email = "jhpyle@gmail.com" }, ] From 7635b287131764f31baee9131ce1b3daef72923f Mon Sep 17 00:00:00 2001 From: Michael Hofrichter Date: Fri, 27 Feb 2026 14:58:24 -0600 Subject: [PATCH 2/3] slight tweak to handling single records --- docassemblecli/commands.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docassemblecli/commands.py b/docassemblecli/commands.py index a790351..6dbf9d5 100644 --- a/docassemblecli/commands.py +++ b/docassemblecli/commands.py @@ -335,8 +335,9 @@ def list_servers(): env = [] else: env = [] - if isinstance(env, dict) and "apikey" in env and "apiurl" in env: - env["name"] = name_from_url(str(env["apiurl"])) + if isinstance(env, dict): + if "apiurl" in env and "name" not in env: + env["name"] = name_from_url(str(env["apiurl"])) env = [env] if not isinstance(env, list): sys.stderr.write("Format of .docassemblecli file is not a list; ignoring.\n") From 06aa4da2d661a30453d949bfe7a457a6cdea6b5d Mon Sep 17 00:00:00 2001 From: Michael Hofrichter Date: Thu, 7 May 2026 22:03:19 -0500 Subject: [PATCH 3/3] fix for 3.14 regex --- .bumpversion.cfg | 2 +- CHANGELOG.md | 6 ++++++ docassemblecli/commands.py | 14 +++++++++----- pyproject.toml | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index b624ea6..5f78553 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.0.26 +current_version = 0.0.27 commit = True tag = True diff --git a/CHANGELOG.md b/CHANGELOG.md index 212a044..d9ff0d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 0.0.27 - 2026-05-07 + +### Fixed + +- Update regex matching for 3.14 syntax. + ## 0.0.26 - 2026-02-27 ### Added diff --git a/docassemblecli/commands.py b/docassemblecli/commands.py index 6dbf9d5..7e3348b 100644 --- a/docassemblecli/commands.py +++ b/docassemblecli/commands.py @@ -21,7 +21,7 @@ import hashlib from pathlib import Path -IGNORE_REGEXES = ['.*/\.git$', '.*/\.git/.*', '.*~$', '.*/\.?\#.*', '.*/\.?flycheck_.*', '.*__pycache__.*', '.*/\.mypy_cache/.*', '.*\.egg-info.*', '.*\.py[cod]$', '.*\$py\.class$', '.*\.swp$', '.*/build/.*', '.*\.tmp$', '.*\#$', '.*/\.~.*', '.*/~.*', '.*\.swx$', '.*\.tmp\..*'] +IGNORE_REGEXES = [r'.*/\.git$', r'.*/\.git/.*', r'.*~$', r'.*/\.?\#.*', r'.*/\.?flycheck_.*', r'.*__pycache__.*', r'.*/\.mypy_cache/.*', r'.*\.egg-info.*', r'.*\.py[cod]$', r'.*\$py\.class$', r'.*\.swp$', r'.*/build/.*', r'.*\.tmp$', r'.*\#$', r'.*/\.~.*', r'.*/~.*', r'.*\.swx$', r'.*\.tmp\..*'] IGNORE_DIRS = ['.git', '__pycache__', '.mypy_cache', '.venv', '.history', 'build'] SETTLE_DELAY = 0.6 # Delay in seconds to let the local system become settled after an event. The optimal value depends on how local applications modify files. LICENSES = ['0BSD', '3D-Slicer-1.0', 'AAL', 'Abstyles', 'AdaCore-doc', 'Adobe-2006', 'Adobe-Display-PostScript', 'Adobe-Glyph', 'Adobe-Utopia', 'ADSL', 'AFL-1.1', 'AFL-1.2', 'AFL-2.0', 'AFL-2.1', 'AFL-3.0', 'Afmparse', 'AGPL-1.0', 'AGPL-1.0-only', 'AGPL-1.0-or-later', 'AGPL-3.0', 'AGPL-3.0-only', 'AGPL-3.0-or-later', 'Aladdin', 'AMD-newlib', 'AMDPLPA', 'AML', 'AML-glslang', 'AMPAS', 'ANTLR-PD', 'ANTLR-PD-fallback', 'any-OSI', 'any-OSI-perl-modules', 'Apache-1.0', 'Apache-1.1', 'Apache-2.0', 'APAFML', 'APL-1.0', 'App-s2p', 'APSL-1.0', 'APSL-1.1', 'APSL-1.2', 'APSL-2.0', 'Arphic-1999', 'Artistic-1.0', 'Artistic-1.0-cl8', 'Artistic-1.0-Perl', 'Artistic-2.0', 'ASWF-Digital-Assets-1.0', 'ASWF-Digital-Assets-1.1', 'Baekmuk', 'Bahyph', 'Barr', 'bcrypt-Solar-Designer', 'Beerware', 'Bitstream-Charter', 'Bitstream-Vera', 'BitTorrent-1.0', 'BitTorrent-1.1', 'blessing', 'BlueOak-1.0.0', 'Boehm-GC', 'Boehm-GC-without-fee', 'Borceux', 'Brian-Gladman-2-Clause', 'Brian-Gladman-3-Clause', 'BSD-1-Clause', 'BSD-2-Clause', 'BSD-2-Clause-Darwin', 'BSD-2-Clause-first-lines', 'BSD-2-Clause-FreeBSD', 'BSD-2-Clause-NetBSD', 'BSD-2-Clause-Patent', 'BSD-2-Clause-Views', 'BSD-3-Clause', 'BSD-3-Clause-acpica', 'BSD-3-Clause-Attribution', 'BSD-3-Clause-Clear', 'BSD-3-Clause-flex', 'BSD-3-Clause-HP', 'BSD-3-Clause-LBNL', 'BSD-3-Clause-Modification', 'BSD-3-Clause-No-Military-License', 'BSD-3-Clause-No-Nuclear-License', 'BSD-3-Clause-No-Nuclear-License-2014', 'BSD-3-Clause-No-Nuclear-Warranty', 'BSD-3-Clause-Open-MPI', 'BSD-3-Clause-Sun', 'BSD-4-Clause', 'BSD-4-Clause-Shortened', 'BSD-4-Clause-UC', 'BSD-4.3RENO', 'BSD-4.3TAHOE', 'BSD-Advertising-Acknowledgement', 'BSD-Attribution-HPND-disclaimer', 'BSD-Inferno-Nettverk', 'BSD-Protection', 'BSD-Source-beginning-file', 'BSD-Source-Code', 'BSD-Systemics', 'BSD-Systemics-W3Works', 'BSL-1.0', 'BUSL-1.1', 'bzip2-1.0.5', 'bzip2-1.0.6', 'C-UDA-1.0', 'CAL-1.0', 'CAL-1.0-Combined-Work-Exception', 'Caldera', 'Caldera-no-preamble', 'Catharon', 'CATOSL-1.1', 'CC-BY-1.0', 'CC-BY-2.0', 'CC-BY-2.5', 'CC-BY-2.5-AU', 'CC-BY-3.0', 'CC-BY-3.0-AT', 'CC-BY-3.0-AU', 'CC-BY-3.0-DE', 'CC-BY-3.0-IGO', 'CC-BY-3.0-NL', 'CC-BY-3.0-US', 'CC-BY-4.0', 'CC-BY-NC-1.0', 'CC-BY-NC-2.0', 'CC-BY-NC-2.5', 'CC-BY-NC-3.0', 'CC-BY-NC-3.0-DE', 'CC-BY-NC-4.0', 'CC-BY-NC-ND-1.0', 'CC-BY-NC-ND-2.0', 'CC-BY-NC-ND-2.5', 'CC-BY-NC-ND-3.0', 'CC-BY-NC-ND-3.0-DE', 'CC-BY-NC-ND-3.0-IGO', 'CC-BY-NC-ND-4.0', 'CC-BY-NC-SA-1.0', 'CC-BY-NC-SA-2.0', 'CC-BY-NC-SA-2.0-DE', 'CC-BY-NC-SA-2.0-FR', 'CC-BY-NC-SA-2.0-UK', 'CC-BY-NC-SA-2.5', 'CC-BY-NC-SA-3.0', 'CC-BY-NC-SA-3.0-DE', 'CC-BY-NC-SA-3.0-IGO', 'CC-BY-NC-SA-4.0', 'CC-BY-ND-1.0', 'CC-BY-ND-2.0', 'CC-BY-ND-2.5', 'CC-BY-ND-3.0', 'CC-BY-ND-3.0-DE', 'CC-BY-ND-4.0', 'CC-BY-SA-1.0', 'CC-BY-SA-2.0', 'CC-BY-SA-2.0-UK', 'CC-BY-SA-2.1-JP', 'CC-BY-SA-2.5', 'CC-BY-SA-3.0', 'CC-BY-SA-3.0-AT', 'CC-BY-SA-3.0-DE', 'CC-BY-SA-3.0-IGO', 'CC-BY-SA-4.0', 'CC-PDDC', 'CC-PDM-1.0', 'CC-SA-1.0', 'CC0-1.0', 'CDDL-1.0', 'CDDL-1.1', 'CDL-1.0', 'CDLA-Permissive-1.0', 'CDLA-Permissive-2.0', 'CDLA-Sharing-1.0', 'CECILL-1.0', 'CECILL-1.1', 'CECILL-2.0', 'CECILL-2.1', 'CECILL-B', 'CECILL-C', 'CERN-OHL-1.1', 'CERN-OHL-1.2', 'CERN-OHL-P-2.0', 'CERN-OHL-S-2.0', 'CERN-OHL-W-2.0', 'CFITSIO', 'check-cvs', 'checkmk', 'ClArtistic', 'Clips', 'CMU-Mach', 'CMU-Mach-nodoc', 'CNRI-Jython', 'CNRI-Python', 'CNRI-Python-GPL-Compatible', 'COIL-1.0', 'Community-Spec-1.0', 'Condor-1.1', 'copyleft-next-0.3.0', 'copyleft-next-0.3.1', 'Cornell-Lossless-JPEG', 'CPAL-1.0', 'CPL-1.0', 'CPOL-1.02', 'Cronyx', 'Crossword', 'CrystalStacker', 'CUA-OPL-1.0', 'Cube', 'curl', 'cve-tou', 'D-FSL-1.0', 'DEC-3-Clause', 'diffmark', 'DL-DE-BY-2.0', 'DL-DE-ZERO-2.0', 'DOC', 'DocBook-Schema', 'DocBook-Stylesheet', 'DocBook-XML', 'Dotseqn', 'DRL-1.0', 'DRL-1.1', 'DSDP', 'dtoa', 'dvipdfm', 'ECL-1.0', 'ECL-2.0', 'eCos-2.0', 'EFL-1.0', 'EFL-2.0', 'eGenix', 'Elastic-2.0', 'Entessa', 'EPICS', 'EPL-1.0', 'EPL-2.0', 'ErlPL-1.1', 'etalab-2.0', 'EUDatagrid', 'EUPL-1.0', 'EUPL-1.1', 'EUPL-1.2', 'Eurosym', 'Fair', 'FBM', 'FDK-AAC', 'Ferguson-Twofish', 'Frameworx-1.0', 'FreeBSD-DOC', 'FreeImage', 'FSFAP', 'FSFAP-no-warranty-disclaimer', 'FSFUL', 'FSFULLR', 'FSFULLRWD', 'FTL', 'Furuseth', 'fwlw', 'GCR-docs', 'GD', 'generic-xts', 'GFDL-1.1', 'GFDL-1.1-invariants-only', 'GFDL-1.1-invariants-or-later', 'GFDL-1.1-no-invariants-only', 'GFDL-1.1-no-invariants-or-later', 'GFDL-1.1-only', 'GFDL-1.1-or-later', 'GFDL-1.2', 'GFDL-1.2-invariants-only', 'GFDL-1.2-invariants-or-later', 'GFDL-1.2-no-invariants-only', 'GFDL-1.2-no-invariants-or-later', 'GFDL-1.2-only', 'GFDL-1.2-or-later', 'GFDL-1.3', 'GFDL-1.3-invariants-only', 'GFDL-1.3-invariants-or-later', 'GFDL-1.3-no-invariants-only', 'GFDL-1.3-no-invariants-or-later', 'GFDL-1.3-only', 'GFDL-1.3-or-later', 'Giftware', 'GL2PS', 'Glide', 'Glulxe', 'GLWTPL', 'gnuplot', 'GPL-1.0', 'GPL-1.0+', 'GPL-1.0-only', 'GPL-1.0-or-later', 'GPL-2.0', 'GPL-2.0+', 'GPL-2.0-only', 'GPL-2.0-or-later', 'GPL-2.0-with-autoconf-exception', 'GPL-2.0-with-bison-exception', 'GPL-2.0-with-classpath-exception', 'GPL-2.0-with-font-exception', 'GPL-2.0-with-GCC-exception', 'GPL-3.0', 'GPL-3.0+', 'GPL-3.0-only', 'GPL-3.0-or-later', 'GPL-3.0-with-autoconf-exception', 'GPL-3.0-with-GCC-exception', 'Graphics-Gems', 'gSOAP-1.3b', 'gtkbook', 'Gutmann', 'HaskellReport', 'hdparm', 'HIDAPI', 'Hippocratic-2.1', 'HP-1986', 'HP-1989', 'HPND', 'HPND-DEC', 'HPND-doc', 'HPND-doc-sell', 'HPND-export-US', 'HPND-export-US-acknowledgement', 'HPND-export-US-modify', 'HPND-export2-US', 'HPND-Fenneberg-Livingston', 'HPND-INRIA-IMAG', 'HPND-Intel', 'HPND-Kevlin-Henney', 'HPND-Markus-Kuhn', 'HPND-merchantability-variant', 'HPND-MIT-disclaimer', 'HPND-Netrek', 'HPND-Pbmplus', 'HPND-sell-MIT-disclaimer-xserver', 'HPND-sell-regexpr', 'HPND-sell-variant', 'HPND-sell-variant-MIT-disclaimer', 'HPND-sell-variant-MIT-disclaimer-rev', 'HPND-UC', 'HPND-UC-export-US', 'HTMLTIDY', 'IBM-pibs', 'ICU', 'IEC-Code-Components-EULA', 'IJG', 'IJG-short', 'ImageMagick', 'iMatix', 'Imlib2', 'Info-ZIP', 'Inner-Net-2.0', 'InnoSetup', 'Intel', 'Intel-ACPI', 'Interbase-1.0', 'IPA', 'IPL-1.0', 'ISC', 'ISC-Veillard', 'Jam', 'JasPer-2.0', 'JPL-image', 'JPNIC', 'JSON', 'Kastrup', 'Kazlib', 'Knuth-CTAN', 'LAL-1.2', 'LAL-1.3', 'Latex2e', 'Latex2e-translated-notice', 'Leptonica', 'LGPL-2.0', 'LGPL-2.0+', 'LGPL-2.0-only', 'LGPL-2.0-or-later', 'LGPL-2.1', 'LGPL-2.1+', 'LGPL-2.1-only', 'LGPL-2.1-or-later', 'LGPL-3.0', 'LGPL-3.0+', 'LGPL-3.0-only', 'LGPL-3.0-or-later', 'LGPLLR', 'Libpng', 'libpng-2.0', 'libselinux-1.0', 'libtiff', 'libutil-David-Nugent', 'LiLiQ-P-1.1', 'LiLiQ-R-1.1', 'LiLiQ-Rplus-1.1', 'Linux-man-pages-1-para', 'Linux-man-pages-copyleft', 'Linux-man-pages-copyleft-2-para', 'Linux-man-pages-copyleft-var', 'Linux-OpenIB', 'LOOP', 'LPD-document', 'LPL-1.0', 'LPL-1.02', 'LPPL-1.0', 'LPPL-1.1', 'LPPL-1.2', 'LPPL-1.3a', 'LPPL-1.3c', 'lsof', 'Lucida-Bitmap-Fonts', 'LZMA-SDK-9.11-to-9.20', 'LZMA-SDK-9.22', 'Mackerras-3-Clause', 'Mackerras-3-Clause-acknowledgment', 'magaz', 'mailprio', 'MakeIndex', 'Martin-Birgmeier', 'McPhee-slideshow', 'metamail', 'Minpack', 'MIPS', 'MirOS', 'MIT', 'MIT-0', 'MIT-advertising', 'MIT-Click', 'MIT-CMU', 'MIT-enna', 'MIT-feh', 'MIT-Festival', 'MIT-Khronos-old', 'MIT-Modern-Variant', 'MIT-open-group', 'MIT-testregex', 'MIT-Wu', 'MITNFA', 'MMIXware', 'Motosoto', 'MPEG-SSG', 'mpi-permissive', 'mpich2', 'MPL-1.0', 'MPL-1.1', 'MPL-2.0', 'MPL-2.0-no-copyleft-exception', 'mplus', 'MS-LPL', 'MS-PL', 'MS-RL', 'MTLL', 'MulanPSL-1.0', 'MulanPSL-2.0', 'Multics', 'Mup', 'NAIST-2003', 'NASA-1.3', 'Naumen', 'NBPL-1.0', 'NCBI-PD', 'NCGL-UK-2.0', 'NCL', 'NCSA', 'Net-SNMP', 'NetCDF', 'Newsletr', 'NGPL', 'NICTA-1.0', 'NIST-PD', 'NIST-PD-fallback', 'NIST-Software', 'NLOD-1.0', 'NLOD-2.0', 'NLPL', 'Nokia', 'NOSL', 'Noweb', 'NPL-1.0', 'NPL-1.1', 'NPOSL-3.0', 'NRL', 'NTP', 'NTP-0', 'Nunit', 'O-UDA-1.0', 'OAR', 'OCCT-PL', 'OCLC-2.0', 'ODbL-1.0', 'ODC-By-1.0', 'OFFIS', 'OFL-1.0', 'OFL-1.0-no-RFN', 'OFL-1.0-RFN', 'OFL-1.1', 'OFL-1.1-no-RFN', 'OFL-1.1-RFN', 'OGC-1.0', 'OGDL-Taiwan-1.0', 'OGL-Canada-2.0', 'OGL-UK-1.0', 'OGL-UK-2.0', 'OGL-UK-3.0', 'OGTSL', 'OLDAP-1.1', 'OLDAP-1.2', 'OLDAP-1.3', 'OLDAP-1.4', 'OLDAP-2.0', 'OLDAP-2.0.1', 'OLDAP-2.1', 'OLDAP-2.2', 'OLDAP-2.2.1', 'OLDAP-2.2.2', 'OLDAP-2.3', 'OLDAP-2.4', 'OLDAP-2.5', 'OLDAP-2.6', 'OLDAP-2.7', 'OLDAP-2.8', 'OLFL-1.3', 'OML', 'OpenPBS-2.3', 'OpenSSL', 'OpenSSL-standalone', 'OpenVision', 'OPL-1.0', 'OPL-UK-3.0', 'OPUBL-1.0', 'OSET-PL-2.1', 'OSL-1.0', 'OSL-1.1', 'OSL-2.0', 'OSL-2.1', 'OSL-3.0', 'PADL', 'Parity-6.0.0', 'Parity-7.0.0', 'PDDL-1.0', 'PHP-3.0', 'PHP-3.01', 'Pixar', 'pkgconf', 'Plexus', 'pnmstitch', 'PolyForm-Noncommercial-1.0.0', 'PolyForm-Small-Business-1.0.0', 'PostgreSQL', 'PPL', 'PSF-2.0', 'psfrag', 'psutils', 'Python-2.0', 'Python-2.0.1', 'python-ldap', 'Qhull', 'QPL-1.0', 'QPL-1.0-INRIA-2004', 'radvd', 'Rdisc', 'RHeCos-1.1', 'RPL-1.1', 'RPL-1.5', 'RPSL-1.0', 'RSA-MD', 'RSCPL', 'Ruby', 'Ruby-pty', 'SAX-PD', 'SAX-PD-2.0', 'Saxpath', 'SCEA', 'SchemeReport', 'Sendmail', 'Sendmail-8.23', 'Sendmail-Open-Source-1.1', 'SGI-B-1.0', 'SGI-B-1.1', 'SGI-B-2.0', 'SGI-OpenGL', 'SGP4', 'SHL-0.5', 'SHL-0.51', 'SimPL-2.0', 'SISSL', 'SISSL-1.2', 'SL', 'Sleepycat', 'SMAIL-GPL', 'SMLNJ', 'SMPPL', 'SNIA', 'snprintf', 'softSurfer', 'Soundex', 'Spencer-86', 'Spencer-94', 'Spencer-99', 'SPL-1.0', 'ssh-keyscan', 'SSH-OpenSSH', 'SSH-short', 'SSLeay-standalone', 'SSPL-1.0', 'StandardML-NJ', 'SugarCRM-1.1.3', 'Sun-PPP', 'Sun-PPP-2000', 'SunPro', 'SWL', 'swrule', 'Symlinks', 'TAPR-OHL-1.0', 'TCL', 'TCP-wrappers', 'TermReadKey', 'TGPPL-1.0', 'ThirdEye', 'threeparttable', 'TMate', 'TORQUE-1.1', 'TOSL', 'TPDL', 'TPL-1.0', 'TrustedQSL', 'TTWL', 'TTYP0', 'TU-Berlin-1.0', 'TU-Berlin-2.0', 'Ubuntu-font-1.0', 'UCAR', 'UCL-1.0', 'ulem', 'UMich-Merit', 'Unicode-3.0', 'Unicode-DFS-2015', 'Unicode-DFS-2016', 'Unicode-TOU', 'UnixCrypt', 'Unlicense', 'UPL-1.0', 'URT-RLE', 'Vim', 'VOSTROM', 'VSL-1.0', 'W3C', 'W3C-19980720', 'W3C-20150513', 'w3m', 'Watcom-1.0', 'Widget-Workshop', 'Wsuipa', 'WTFPL', 'wwl', 'wxWindows', 'X11', 'X11-distribute-modifications-variant', 'X11-swapped', 'Xdebug-1.03', 'Xerox', 'Xfig', 'XFree86-1.1', 'xinetd', 'xkeyboard-config-Zinoviev', 'xlock', 'Xnet', 'xpp', 'XSkat', 'xzoom', 'YPL-1.0', 'YPL-1.1', 'Zed', 'Zeeff', 'Zend-2.0', 'Zimbra-1.3', 'Zimbra-1.4', 'Zlib', 'zlib-acknowledgement', 'ZPL-1.1', 'ZPL-2.0', 'ZPL-2.1'] @@ -442,10 +442,14 @@ def dainstall(): sys.stdout.write("No servers found in .docassemblecli\n") else: sys.stdout.write("Servers in .docassemblecli:\n") - sys.stdout.write(" Server Name: Server URL\n") - sys.stdout.write(" ------------ ----------\n") + header_name = "Server Name" + header_url = "Server URL" + max_name_len = max([len(name) for name, url in servers] + [len(header_name)]) + max_url_len = max([len(url) for name, url in servers] + [len(header_url)]) + sys.stdout.write(f" {header_name:<{max_name_len}} | {header_url:<{max_url_len}}\n") + sys.stdout.write(f" {'-' * max_name_len} | {'-' * max_url_len}\n") for name, url in servers: - sys.stdout.write(f" {name}: {url}\n") + sys.stdout.write(f" {name:<{max_name_len}} | {url:<{max_url_len}}\n") return if not args.add: if args.directory is None: @@ -739,7 +743,7 @@ def do_install(args, apikey, apiurl, to_ignore): installed_packages = r.json() already_installed = False for package_info in installed_packages: - package_info['alt_name'] = re.sub('^docassemble\.', 'docassemble-', package_info['name']) + package_info['alt_name'] = re.sub(r'^docassemble\.', 'docassemble-', package_info['name']) for dependency_name, dependency_info in dependencies.items(): if dependency_name in (package_info['name'], package_info['alt_name']): condition = True diff --git a/pyproject.toml b/pyproject.toml index e55d44d..4178999 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "docassemblecli" -version = "0.0.26" +version = "0.0.27" authors = [ { name = "Jonathan Pyle", email = "jhpyle@gmail.com" }, ]