GithubHelp home page GithubHelp logo

layday / instawow Goto Github PK

View Code? Open in Web Editor NEW
148.0 4.0 9.0 48.77 MB

World of Warcraft add-on manager CLI and GUI

License: GNU General Public License v3.0

Python 78.09% Lua 0.20% Nix 0.11% JavaScript 0.08% TypeScript 2.60% HTML 0.07% Svelte 16.94% SCSS 1.41% Shell 0.50%
world-of-warcraft package-manager addon-manager wow-addon-manager

instawow's Introduction

instawow

instawow is an add-on manager for World of Warcraft. It can be used to install, update and remove add-ons from GitHub, CurseForge, WoWInterface and Tukui. instawow has an interoperable CLI and GUI, fuzzy search with download scoring and several other goodies.

Installation

You can download pre-built binaries of instawow from GitHub. bin users can install the CLI binaries by running:

bin install github.com/layday/instawow

If you'd prefer to install instawow from source, you are able to choose from:

  • pipx: pipx install instawow or pipx install instawow[gui] for the GUI
  • Vanilla pip: python -m pip install -U instawow or python -m pip install -U instawow[gui] for the GUI
  • Nix or NixOS: the CLI-only version of instawow is available as the instawow package.

CLI operation

tl;dr

Begin by running instawow reconcile to register previously-installed add-ons with instawow (or instawow reconcile --auto to do the same without user input). To install add-ons, you can search for them using the search command:

instawow search molinari

In addition, instawow is able to interpret add-on URLs and instawow-specific URIs of slugs and host IDs. All of the following will install Molinari:

instawow install https://www.curseforge.com/wow/addons/molinari
instawow install curse:molinari
instawow install curse:20338
instawow install https://github.com/p3lim-wow/Molinari
instawow install github:p3lim-wow/molinari

You can update add-ons and remove them just as you'd install them. If update is invoked without arguments, it will update all of your installed add-ons. You can list add-ons and view detailed information about them using list --format detailed. For list and similarly non-destructive commands, the source can be omitted and the alias can be shortened, e.g. instawow reveal moli will bring up the Molinari add-on folder in your file manager.

Add-on reconciliation

Add-on reconciliation is not automatic – instawow makes a point of not automatically assuming ownership of your add-ons. However, you can automate reconciliation with reconcile --auto and instawow will prioritise add-ons from CurseForge. Reconciled add-ons are reinstalled because the installed version cannot be extracted reliably.

instawow comes with a rudimentary search command with results ranked based on edit distance and popularity. Search uses a collated add-on catalogue which is updated once daily. You can install multiple add-ons directly from search.

Install strategies

Add-ons take a number of options which determine how they are resolved:

  • any_flavour to ignore game version compatibility by prioriting "affine" game versions
  • any_release_type to ignore add-on stability
  • version_eq=[VERSION] to install a specific add-on version

In the CLI, you can pass strategies in the fragment portion of the add-on URI, separated by a comma, e.g. instawow install curse:molinari#any_release_type,any_flavour. Strategies are respected by install and update. To reset an add-on's strategies on update, you can pass a = fragment, e.g. instawow update curse:molinari#=.

Reverting add-on updates

instawow keeps a log of all versions of an add-on it has previously installed. Add-on updates can be undone using the instawow rollback command. Add-ons which have been rolled back are pinned and will not receive updates. Rollbacks can themselves be undone with instawow rollback --undo, which will install the latest version of the specified add-on using the default strategy.

Profiles

instawow supports multiple game versions by means of profiles. Assuming your default profile is configured for retail, you can create a pristine profile for classic with:

instawow -p classic configure

"classic" is simply the name of the profile; you will be asked to select the game flavour that it corresponds to. You can have several profiles of the same flavour (think alpha, beta and PTR).

-p is a global option. You can prefix any instawow command with -p. For instance, to update your Classic add-ons, you would run:

instawow -p classic update

You can omit -p for the default profile if one exists.

Migrating Classic profiles

With the exception of "Classic Era" profiles (vanilla_classic in instawow parlance), classic profiles will start receiving updates for the latest Classic release once it is supported by instawow. No user intervention is necessary, save for updating instawow.

WeakAura updater

instawow contains a WeakAura updater modelled after WeakAuras Companion. To use the updater and provided that you have WeakAuras installed:

instawow plugins weakauras-companion build
instawow install instawow:weakauras-companion

You will have to rebuild the companion add-on prior to updating to receive aura updates. If you would like to check for updates on every invocation of instawow update, install the instawow:weakauras-companion-autoupdate variant:

instawow install instawow:weakauras-companion-autoupdate
instawow update

Plug-ins

instawow can be extended using plug-ins. Plug-ins can be used to add support for arbitrary hosts and add new commands to the CLI. You will find a sample plug-in in tests/plugin.

Metadata sourcing

CurseForge

CurseForge is set to retire its unauthenticated add-on API by the end of Q1 2022. CurseForge will be issuing keys for the new API conditionally and which add-on managers are obligated to conceal. The new API is therefore unworkable for add-on managers except through a proxy service, which the author of this particular add-on manager cannot afford. At the same time, CurseForge will be providing the option for authors to unlist their add-ons from the new API, and downloads intitiated through the new API will not count towards author credits for the ad revenue sharing programme.

GitHub

instawow supports WoW add-ons released on GitHub – that is to say that the repository must have a release (tags won't work) and the release must have an add-on ZIP file attached to it as an asset. instawow will not install or build add-ons directly from source, or from tarballs or 'zipballs', and will not validate the contents of the ZIP file.

Transparency

Web requests initiated by instawow can be identified by its user agent string.

Every 24 hours, on launch, instawow will query PyPI – the canonical Python package index – to check for instawow updates.

Contributing

Bug reports and fixes are welcome. Do open an issue before committing to making any significant changes.

The author of strongbox has been cataloguing similar software. If you are unhappy with instawow, you might find one of these other add-on managers more to your liking.

instawow's People

Contributors

dependabot[bot] avatar kelaun avatar layday avatar meltinglava avatar seirl avatar torkus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

instawow's Issues

instawow update encountered OSError

! curse:bartender4 encountered OSError ! curse:emote-splitter encountered OSError ! curse:bagnon encountered OSError ! curse:total-rp-3-extended encountered OSError ! curse:total-rp-3 encountered OSError ! curse:tomtom encountered OSError ! curse:weakauras-2 encountered OSError ! curse:listener encountered OSError ! curse:gladius encountered OSError ! curse:cross-rp encountered OSError ! curse:rp-friends encountered OSError
Arch Linux on Python 3.7.3 on instawow update encountered OSError. Any known solution?

PermissionError

Sorry to bug you once again, but with version 1.2.1 I receive encountered PermissionError when I try to install or update addons.

pipx install issue on Ubuntu 18.04.5

$ pipx install instawow
ERROR: Could not find a version that satisfies the requirement Logbook==1.4.3 (from instawow) (from versions: 0.1, 0.2, 0.2.1, 0.3, 0.4, 0.4.1, 0.4.2, 0.5.0, 0.6.0, 0.7.0, 0.8.0, 0.8.1, 0.9.0, 0.9.1, 0.10.0, 0.10.1, 0.11.0, 0.11.1, 0.11.2, 0.11.3, 0.12.1, 0.12.2, 0.12.3, 0.12.4, 0.12.5, 1.0.0, 1.1.0, 1.2.1, 1.2.2, 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.4.0, 1.4.1, 1.4.3.post1, 1.4.4, 1.5.1, 1.5.2, 1.5.3)
ERROR: No matching distribution found for Logbook==1.4.3 (from instawow)
$ uname -a
Linux chlorine 4.15.0-112-generic #113-Ubuntu SMP Thu Jul 9 23:41:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic```

instawow upgrade failure

instawow was out of date, so I attempted to update it, and i now see the following message:

Traceback (most recent call last):
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\instawow\cli.py", line 148, in create_config
return Config.read().write()
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\instawow\config.py", line 62, in read
.read_text(encoding='utf-8'))
File "c:\users\gamer\appdata\local\programs\python\python37\lib\pathlib.py", line 1199, in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
File "c:\users\gamer\appdata\local\programs\python\python37\lib\pathlib.py", line 1186, in open
opener=self._opener)
File "c:\users\gamer\appdata\local\programs\python\python37\lib\pathlib.py", line 1039, in _opener
return self._accessor.open(self, flags, mode)
FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\gamer\AppData\Roaming\instawow\config.json'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\gamer\AppData\Local\Programs\Python\Python37\Scripts\instawow-script.py", line 11, in
load_entry_point('instawow==1.3.0', 'console_scripts', 'instawow')()
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 764, in call
return self.main(*args, **kwargs)
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 717, in main
rv = self.invoke(ctx)
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 1134, in invoke
Command.invoke(self, ctx)
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\click\core.py", line 555, in invoke
return callback(*args, **kwargs)
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\click\decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\instawow\cli.py", line 188, in main
config = create_config()
File "c:\users\gamer\appdata\local\programs\python\python37\lib\site-packages\instawow\cli.py", line 151, in create_config
import readline
ModuleNotFoundError: No module named 'readline'

Can't install instawow in Windows with different default locale

Got the below error when install:

ERROR: Command errored out with exit status 1: command: 'c:\python37\python.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\luhao\\AppData\\Local\\Temp\\pip-req-build-n5e1ezlw\\setup.py'"'"'; __file__='"'"'C:\\Users\\luhao\\AppData\\Local\\Temp\\pip-req-build-n5e1ezlw\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base pip-egg-info cwd: C:\Users\luhao\AppData\Local\Temp\pip-req-build-n5e1ezlw\ Complete output (7 lines): Traceback (most recent call last): File "<string>", line 1, in <module> File "C:\Users\luhao\AppData\Local\Temp\pip-req-build-n5e1ezlw\setup.py", line 17, in <module> long_description=Path('README.rst').read_text(), File "c:\python37\lib\pathlib.py", line 1207, in read_text return f.read() UnicodeDecodeError: 'gbk' codec can't decode byte 0x93 in position 2233: illegal multibyte sequence ---------------------------------------- ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

It should be able to be fixed by passing in "encoding='utf-8‘" in "read_text()"

Conflicting addons that should be able to be installed together

When I run:

instawow install https://www.curseforge.com/wow/addons/mechagon-rare-share
instawow install https://www.curseforge.com/wow/addons/nazjatar-rare-share

I get:

package folders conflict with installed package's curse:mechagon-rare-share 

I'm pretty sure these addons are supposed to be compatible together, I've seen multiple people with both of them. Is there a restriction that needs to be relaxed?.

[Help Wanted]

I currently use instawow for Classic. I was hoping to also utilize it for Retail as well. I read your instructions for creating a second profile for the other version of the game. However the instructions are written for Linux and my ability to figure out how to adapt that over to Windows is non-existent. I was wondering if you could provide some insight on how to setup another profile in Windows should you ever find the time and have the inclination.

Thank you!

Error on instawow update

In the last couple of days been getting the following error (fingers crossed you're still updating this, thanks in advance!). I use both wow interface and curse.

Traceback (most recent call last):
  File "/usr/local/bin/instawow", line 11, in <module>
    load_entry_point('instawow==0.4', 'console_scripts', 'instawow')()
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/click/decorators.py", line 27, in new_func
    return f(get_current_context().obj, *args, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/instawow/cli.py", line 131, in update
    raise result
  File "/usr/local/lib/python3.6/site-packages/instawow/manager.py", line 158, in update
    new_pkg = await self.resolve(origin, id_or_slug, old_pkg.options.strategy)
  File "/usr/local/lib/python3.6/site-packages/instawow/manager.py", line 119, in resolve
    .resolve(id_or_slug, strategy=strategy)
  File "/usr/local/lib/python3.6/site-packages/instawow/resolvers.py", line 96, in resolve
    p_id = int(parse_html(text).xpath('string(//div[text() = "Project ID "]'
ValueError: invalid literal for int() with base 10: ''

A few more Unicode issues with Windows

  1. These two symbols - https://github.com/layday/instawow/blob/master/instawow/cli.py#L20 - cause an UnicodeEncodeError exception.

Appending .encode('utf8').decode(sys.stdout.encoding) to them seems to fix the issue but it looks rather hack-ish to me although I am not really fluent in Python. Using just one of those functions did not work.

  1. If there's a .toc-file with non-ASCII symbols, instawow list preexisting throws an UnicodeDecodeError exception:
$ instawow list preexisting
Traceback (most recent call last):
  File "C:\Program Files\Python36\Scripts\instawow-script.py", line 11, in <module>
    load_entry_point('instawow==0.8.4', 'console_scripts', 'instawow')()
  File "c:\program files\python36\lib\site-packages\click\core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "c:\program files\python36\lib\site-packages\click\core.py", line 697, in main
    rv = self.invoke(ctx)
  File "c:\program files\python36\lib\site-packages\click\core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "c:\program files\python36\lib\site-packages\click\core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "c:\program files\python36\lib\site-packages\click\core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "c:\program files\python36\lib\site-packages\click\core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "c:\program files\python36\lib\site-packages\click\decorators.py", line 27, in new_func
    return f(get_current_context().obj, *args, **kwargs)
  File "c:\program files\python36\lib\site-packages\instawow\cli.py", line 259, in preexisting
    folders = {(n, TocReader(t)) for n, t in folders if t.exists()}
  File "c:\program files\python36\lib\site-packages\instawow\cli.py", line 259, in <setcomp>
    folders = {(n, TocReader(t)) for n, t in folders if t.exists()}
  File "c:\program files\python36\lib\site-packages\instawow\utils.py", line 48, in __init__
    for e in toc_file_path.read_text().splitlines()
  File "c:\program files\python36\lib\pathlib.py", line 1175, in read_text
    return f.read()
  File "c:\program files\python36\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 162: character maps to <undefined>

This is the file that causes the mentioned exception:

## Interface: 70100
## Title: GridManaBars
## Notes: Adds manabars to the sides of Grid frames.
## Notes-ruRU: Добовляет полоски маны в фрейм Gridа.
## Notes-zhTW: [Grid] 在 Grid 框架旁邊顯示法力條。
## Notes-zhCN: [Grid] 在 Grid 框体内设置法力条。
## Author: Adelea@EU-Bronzebeard, Julith
## Version: 1.11
## Grid Author: Pastamancer & Maia
## X-Website: http://wowace.com/wiki/Grid
## Dependencies: Grid
## X-Curse-Packaged-Version: v1.1b
## X-Curse-Project-Name: GridManaBars
## X-Curse-Project-ID: grid-mana-bars
## X-Curse-Repository-ID: wow/grid-mana-bars/mainline

GMBLocale-enUS.lua
GMBLocale-ruRU.lua
GMBLocale-deDE.lua
GMBLocale-koKR.lua
GMBLocale-zhCN.lua
GMBLocale-zhTW.lua
GridManaBar.lua
GridStatusMana.lua

ubuntu release, 1.8.1, config not found

hey @layday , I just downloaded this release, unzipped it in my /tmp dir, did a chmod and then ./instawow - was very impressed with the speed and autocompletion and prompts, but then it died:

0 ✓ (9.788s) 00:35:07 tmp $ unzip instawow-ubuntu-latest.zip 
Archive:  instawow-ubuntu-latest.zip
  inflating: instawow                
0 ✓ (821ms) 00:35:11 tmp $ chmod +x instawow
0 ✓ (8.4ms) 00:35:16 tmp $ ./instawow 
Usage: instawow [OPTIONS] COMMAND [ARGS]...

  Add-on manager for World of Warcraft.

Options:
  --version   Show the version and exit.
  --debug     Log more things.
  -h, --help  Show this message and exit.

Commands:
  configure            Configure instawow.
  install              Install add-ons.
  list                 List installed add-ons.
  list-folders         List add-on folders.
  reconcile            Reconcile pre-installed add-ons.
  remove               Remove add-ons.
  reveal               Open an add-on folder in your file manager.
  search               Search for add-ons to install.
  update               Update installed add-ons.
  visit                Open an add-on's homepage in your browser.
  weakauras-companion  Manage your WeakAuras.
0 ✓ (109ms) 00:35:18 tmp $ ./instawow  list
Add-on directory: /home/torkus/foo/                                                                                                                                            
Game flavour: retail                                                                                                                                                           
Traceback (most recent call last):
  File "instawow.cli", line 83, in m
  File "instawow.config", line 52, in read
  File "pathlib", line 1216, in read_text
  File "pathlib", line 1203, in open
  File "pathlib", line 1058, in _opener
FileNotFoundError: [Errno 2] No such file or directory: '/home/torkus/.config/instawow/config.json'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "instawow.__main__", line 4, in <module>
  File "click.core", line 829, in __call__
  File "click.core", line 782, in main
  File "click.core", line 1257, in invoke
  File "click.core", line 700, in make_context
  File "click.core", line 1048, in parse_args
  File "click.core", line 1630, in handle_parse_result
  File "click.core", line 123, in invoke_param_callback
  File "instawow.cli", line 150, in <lambda>
  File "instawow.utils", line 83, in __get__
  File "instawow.cli", line 86, in m
  File "click.core", line 610, in invoke
  File "click.decorators", line 33, in new_func
  File "instawow.cli", line 487, in configure
  File "instawow.config", line 64, in write
  File "instawow.config", line 57, in ensure_dirs
  File "pathlib", line 1268, in mkdir
FileExistsError: [Errno 17] File exists: '/tmp/instawow'
SystemError

Apparently Curse moved addons to a different domain name

For example, if you visit https://mods.curse.com/addons/wow/big-wigs, it redirects you to https://www.curseforge.com/wow/addons/big-wigs. That domain was up before, but URIs were a bit different, so instawow currently fails:

$ instawow install https://www.curseforge.com/wow/addons/big-wigs
Resolving add-ons
Installing
Traceback (most recent call last):
  File "c:\program files\python36\lib\site-packages\instawow\cli.py", line 149, in install
    raise result
  File "c:\program files\python36\lib\site-packages\instawow\manager.py", line 37, in _intercept_fut
    result = await fut
  File "c:\program files\python36\lib\site-packages\instawow\manager.py", line 217, in _prepare_install
    new_pkg = await self._resolve(origin, id_or_slug, strategy)
  File "c:\program files\python36\lib\site-packages\instawow\manager.py", line 205, in _resolve
    raise PkgOriginInvalid
instawow.manager.PkgOriginInvalid

instawow should ignore missing directories when removing.

When doing an update or remove, instawow will give an error if an addon's directory does not exist.

For an update, this is probably the correct behavior. It means that it's trying to update something that doesn't exist, and there might be something wrong.

For a remove, instawow should ignore that the directory is missing, As we're going to delete it anyway.

'package does not exist' when trying to update addons

I'm getting the below errors when trying to update my addons. This is on a MacBook Pro. I suspect something changed on the Curse website?

$ instawow-classic update
✗ curse:decursive
package does not exist
✗ curse:bagnon
package does not exist

Sync Weakauras using a Wago account

First of all, thanks a lot for the project! I was looking for a decent AddOn helper that works on Linux and was very glad to discover this one. What really got me hooked at the end of the day was the Weakauras updater, such a neat idea to include it.

However, it was a little frustrating to get it to work. First of all, it'd be nice if you specified that by account you mean your WoW account (or the one in the WTF folder to be more precise) instead of your Wago account. It took me a while to figure that out and only got the hint by reading the help section of the official Weakauras Companion. I guess you're not to blame because you just replicated the way the official companion works but damn, it's pretty counter intuitive!

Wouldn't a sync using a Wago account be much nicer? The account allows you to star Weakauras and even entire collections (such as this one), and using their API I suppose that you could easily download them instead of looking for already imported WAs in the saved vars. I feel like that's a little more intuitive than the current approach and lets you add more WAs much quicker.

Error when update addons

Use instawow update curse:details and report 'instawow encountered an error'.

The error log:

2019-09-15 18:56:17.401 | ERROR    | instawow.manager:_intercept:385 - internal error
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\Scripts\instawow-script.py", line 11, in <module>
    load_entry_point('instawow==1.4.0', 'console_scripts', 'instawow')()
    �� <function load_entry_point at 0x000002EDDC9100D0>
  File "C:\ProgramData\Anaconda3\lib\site-packages\click\core.py", line 764, in __call__
    return self.main(*args, **kwargs)
           ��    ��     ��       �� {}
           ��    ��     �� ()
           ��    �� <function BaseCommand.main at 0x000002EDDCF302F0>
           �� <instawow.cli._OrigCmdOrderGroup object at 0x000002EDDE1972E8>
  File "C:\ProgramData\Anaconda3\lib\site-packages\click\core.py", line 717, in main
    rv = self.invoke(ctx)
         ��    ��      �� <click.core.Context object at 0x000002EDDCDDCC18>
         ��    �� <function MultiCommand.invoke at 0x000002EDDCF32048>
         �� <instawow.cli._OrigCmdOrderGroup object at 0x000002EDDE1972E8>
  File "C:\ProgramData\Anaconda3\lib\site-packages\click\core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
           ��               ��       ��       ��      �� <click.core.Context object at 0x000002EDDCE33FD0>
           ��               ��       ��       �� <function Command.invoke at 0x000002EDDCF30BF8>
           ��               ��       �� <click.core.Command object at 0x000002EDDE4BD080>
           ��               �� <click.core.Context object at 0x000002EDDCE33FD0>
           �� <function MultiCommand.invoke.<locals>._process_result at 0x000002EDDA3CC1E0>
  File "C:\ProgramData\Anaconda3\lib\site-packages\click\core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ��   ��      ��    ��           ��   �� {'addons': [('curse:details', ('curse', 'details'))]}
           ��   ��      ��    ��           �� <click.core.Context object at 0x000002EDDCE33FD0>
           ��   ��      ��    �� <function update at 0x000002EDDE4B6A60>
           ��   ��      �� <click.core.Command object at 0x000002EDDE4BD080>
           ��   �� <function Context.invoke at 0x000002EDDCF2FE18>
           �� <click.core.Context object at 0x000002EDDCE33FD0>
  File "C:\ProgramData\Anaconda3\lib\site-packages\click\core.py", line 555, in invoke
    return callback(*args, **kwargs)
           ��         ��       �� {'addons': [('curse:details', ('curse', 'details'))]}
           ��         �� ()
           �� <function update at 0x000002EDDE4B6A60>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\cli.py", line 136, in new_func
    return f(click.get_current_context().obj.m, *args, **kwargs)
           �� ��     ��                             ��       �� {'addons': [('curse:details', ('curse', 'details'))]}
           �� ��     ��                             �� ()
           �� ��     �� <function get_current_context at 0x000002EDDCF02598>
           �� �� <module 'click' from 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\click\\__init__.py'>
           �� <function update at 0x000002EDDE4B69D8>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\cli.py", line 200, in update
    results = zip((a for a, _ in values), manager.update(p for _, p in values))
                                 ��        ��       ��                    �� [('curse:details', ('curse', 'details'))]
                                 ��        ��       �� <property object at 0x000002EDDE4A96D8>
                                 ��        �� <instawow.manager.CliManager object at 0x000002EDDE521208>
                                 �� [('curse:details', ('curse', 'details'))]
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 405, in _process
    return self.run(do_process())
           ��    ��   �� <function CliManager._process.<locals>.do_process at 0x000002EDDE564D08>
           ��    �� <function Manager.run at 0x000002EDDE4B2400>
           �� <instawow.manager.CliManager object at 0x000002EDDE521208>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 212, in run
    return cv.copy_context().run(runner)
           ��  ��                  �� <function Manager.run.<locals>.runner at 0x000002EDDE959D90>
           ��  �� <built-in function copy_context>
           �� <module 'contextvars' from 'C:\\ProgramData\\Anaconda3\\lib\\contextvars.py'>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 210, in runner
    return loop.run_until_complete(do_run())
           ��    ��                  �� <function Manager.run.<locals>.runner.<locals>.do_run at 0x000002EDDE959E18>
           ��    �� <function BaseEventLoop.run_until_complete at 0x000002EDDD231620>
           �� <_WindowsSelectorEventLoop running=True closed=False debug=False>
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 555, in run_until_complete
    self.run_forever()
    ��    �� <function BaseEventLoop.run_forever at 0x000002EDDD231598>
    �� <_WindowsSelectorEventLoop running=True closed=False debug=False>
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 523, in run_forever
    self._run_once()
    ��    �� <function BaseEventLoop._run_once at 0x000002EDDD233F28>
    �� <_WindowsSelectorEventLoop running=True closed=False debug=False>
  File "C:\ProgramData\Anaconda3\lib\asyncio\base_events.py", line 1758, in _run_once
    handle._run()
    ��      �� <function Handle._run at 0x000002EDDD1D8378>
    �� <Handle <TaskWakeupMethWrapper object at 0x000002EDDEDE6A38>(<_GatheringFu...column 65')}]>)>
  File "C:\ProgramData\Anaconda3\lib\asyncio\events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
    ��    ��            ��    ��           ��    �� <member '_args' of 'Handle' objects>
    ��    ��            ��    ��           �� <Handle <TaskWakeupMethWrapper object at 0x000002EDDEDE6A38>(<_GatheringFu...column 65')}]>)>
    ��    ��            ��    �� <member '_callback' of 'Handle' objects>
    ��    ��            �� <Handle <TaskWakeupMethWrapper object at 0x000002EDDEDE6A38>(<_GatheringFu...column 65')}]>)>
    ��    �� <member '_context' of 'Handle' objects>
    �� <Handle <TaskWakeupMethWrapper object at 0x000002EDDEDE6A38>(<_GatheringFu...column 65')}]>)>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 206, in do_run
    return await awaitable
                 �� <coroutine object CliManager._process.<locals>.do_process at 0x000002EDDE8D43C8>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 402, in do_process
    return [await _intercept(c) for c in coros.values()]
                  ��                      ��     �� <method 'values' of 'dict' objects>
                  ��                      �� {('curse', 'details'): <coroutine object _error_wrapper.<locals>.error_out at 0x000002EDDE8D4948>}
                  �� <function _intercept at 0x000002EDDE4B29D8>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 402, in <listcomp>
    return [await _intercept(c) for c in coros.values()]
                  ��          ��      �� <coroutine object _error_wrapper.<locals>.error_out at 0x000002EDDE8D4948>
                  ��          �� <coroutine object _error_wrapper.<locals>.error_out at 0x000002EDDE8D4948>
                  �� <function _intercept at 0x000002EDDE4B29D8>
> File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 381, in _intercept
    return await coro
                 �� <coroutine object _error_wrapper.<locals>.error_out at 0x000002EDDE8D4948>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 179, in error_out
    raise error
          �� ParseError('undefined entity: line 78, column 65')
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\manager.py", line 224, in resolve
    return await self.resolvers[source].resolve(values, strategy=strategy)
                 ��    ��         ��               ��       ��        �� 'default'
                 ��    ��         ��               ��       �� 'default'
                 ��    ��         ��               �� ['details']
                 ��    ��         �� 'curse'
                 ��    �� {'tukui': <instawow.resolvers.TukuiResolver object at 0x000002EDDE4BDA58>, 'curse': <instawow.resolvers.CurseResolver object ...
                 �� <instawow.manager.CliManager object at 0x000002EDDE521208>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\resolvers.py", line 130, in resolve
    for k, v in (await self._fetch(ids)).items())
                       ��    ��      �� ['details']
                       ��    �� <function CurseResolver._fetch at 0x000002EDDE4AC488>
                       �� <instawow.resolvers.CurseResolver object at 0x000002EDDE4BD8D0>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\resolvers.py", line 109, in _fetch
    extracted = await gather((extract_id(i) for i in ids), False)
                      ��       ��                      �� ['details']
                      ��       �� <function CurseResolver._fetch.<locals>.extract_id at 0x000002EDDEE049D8>
                      �� <function gather at 0x000002EDDE1F8048>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\utils.py", line 116, in gather
    return await asyncio.gather(*it, return_exceptions=return_exceptions)
                 ��       ��       ��   ��                 �� False
                 ��       ��       ��   �� False
                 ��       ��       �� <generator object CurseResolver._fetch.<locals>.<genexpr> at 0x000002EDDED8EC78>
                 ��       �� <function gather at 0x000002EDDD22F7B8>
                 �� <module 'asyncio' from 'C:\\ProgramData\\Anaconda3\\lib\\asyncio\\__init__.py'>
  File "C:\ProgramData\Anaconda3\lib\site-packages\instawow-1.4.0-py3.7.egg\instawow\resolvers.py", line 105, in extract_id
    xml = ElementTree.fromstring(await response.text())
          ��           ��                ��        �� <function ClientResponse.text at 0x000002EDDED7B158>
          ��           ��                �� <ClientResponse(https://www.curseforge.com/wow/addons/details/download-client) [503 Service Temporarily Unavailable]>
          ��           ��                  <CIMult...
          ��           �� <function XML at 0x000002EDDEE6D488>
          �� <module 'xml.etree.ElementTree' from 'C:\\ProgramData\\Anaconda3\\lib\\xml\\etree\\ElementTree.py'>
  File "C:\ProgramData\Anaconda3\lib\xml\etree\ElementTree.py", line 1315, in XML
    parser.feed(text)
    ��      ��    �� '<!DOCTYPE HTML>\n<html lang="en-US">\n<head>\n  <meta charset="UTF-8" />\n  <meta http-equiv="Content-Type" content="text/ht...
    ��      �� <method 'feed' of 'xml.etree.ElementTree.XMLParser' objects>
    �� <xml.etree.ElementTree.XMLParser object at 0x000002EDDE8D4748>
  File "<string>", line None

xml.etree.ElementTree.ParseError: undefined entity: line 78, column 65

I am using a proxy and I can access https://www.curseforge.com/wow/addons/details/download-client when using proxy on broswer.

Pip Repository Update

Thank you for the quick fix earlier. It would be awesome if we can get the changes pushed to pypi as well.

macOS first startup problem

environment: macOS 10.13.6, python 3.7 installed with homebrew

When starting up for the first time, instawow gives an error that the addon directory cannot be found. The default addon directory it is looking for does exist. However, the config directory was not created. Running the following code from instawow in a python interpreter creates the config directory:

from os import environ
from pathlib import Path
import click

configdir = Path(click.get_app_dir('instawow'))
configdir.mkdir(exist_ok=True)

The directory was created with or without the exist_ok parameter. After creating the config directory this way, instawow launches fine. If I remove the config directory, instawow doesn't create it, even though the code instawow uses to create the directory works in the interpreter.

I'm not familiar with python, but it looks like it might be possible it's trying to validate that the configuration directory exists before trying to create it.

RuntimeError: There is no current event loop in thread 'MainThread'. during reconcile

Ran it again with --debug after and it finished the job without further incident.

$ ./instawow -p wow1 reconcile --auto
✓ curse:acp
  installed 3.5.7
✓ curse:advancedinterfaceoptions
  installed 1.3.4
✓ curse:ark-inventory
  installed 3.09.35
✓ curse:bad-boy
  installed v8.2.5
✓ curse:bank-stack
  installed v80200.0
✓ curse:bartender4
  installed 4.9.0
✓ curse:betterbattlepettooltip
  installed 8.0.0.0
✓ curse:candy-buckets
  installed v8.3.0.200703
✓ wowi:12326-chocolatebar-broker-display
  installed v3.3.5
✓ curse:copypasta
  installed 1.1.2
✓ curse:deadly-boss-mods
  installed 8.3.33
✓ curse:dejacharacterstats
  installed 830r306
✓ curse:fishingbuddy
  installed 1.10.10
✓ curse:gladiatorlossa
  installed 2.3.6
✓ curse:grid2
  installed r955
✓ curse:handynotes
  installed v1.5.10
✓ curse:instance-achievement-tracker
  installed V2.80.0-Release
✓ curse:masque
  installed 8.2.8
✓ curse:masque-caith
  installed 8.2.6
✓ curse:prat-3-0
  installed 3.8.26
✓ curse:quartz
  installed 3.5.2
✓ curse:rsa
  installed r532-release
✓ curse:raid_checklist
  installed 6.1.2.0
✓ curse:sexymap
  installed v8.3.0
✓ curse:shadowed-unit-frames
  installed v4.2.9
✓ curse:tellmewhen
  installed 8.7.5
✓ curse:weakauras-2
  installed 2.18.2
✓ curse:ora3
  installed v8.3.2
✓ curse:libpetjournal-2-0
  installed 2.0.33
Traceback (most recent call last):
  File "instawow.__main__", line 4, in <module>
  File "click.core", line 829, in __call__
  File "click.core", line 782, in main
  File "click.core", line 1259, in invoke
  File "click.core", line 1066, in invoke
  File "click.core", line 610, in invoke
  File "click.decorators", line 21, in new_func
  File "instawow.cli", line 475, in reconcile
  File "instawow.cli", line 458, in match_all
  File "instawow.manager", line 729, in run
  File "instawow.utils", line 327, in make_progress_bar
  File "prompt_toolkit.shortcuts.progress_bar.base", line 146, in __init__
  File "asyncio.events", line 644, in get_event_loop
RuntimeError: There is no current event loop in thread 'MainThread'.
sys:1: RuntimeWarning: coroutine 'match_dir_names' was never awaited
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
SystemError
1 $ ./instawow -p wow1 --debug reconcile --auto
✓ curse:ace3
  installed Release-r1227
✓ curse:achievementsreminder
  installed 8.300
✓ curse:addons-cpu-usage
  installed v8.2.0.040
✓ curse:altoholic
  installed Altoholic 8.3.001
✓ curse:angry-assignments
  installed v1.13.0
✓ curse:angry-boss-reminders
  installed v0.10.0
✓ curse:ashranbuddy
  installed v7.2.0
✓ curse:astral-keys
  installed 3.25
✓ curse:aura-frames
  installed 1.5.10-Release
✓ curse:autoturnin
  installed 7.4.0
✓ curse:azeritetooltip
  installed 2.0.8
✓ curse:battle-pet-daily-tamer
  installed Battle_Pet_Daily_Tamer_3_0_6.zip
✓ curse:btw-quests
  installed v1.70.1
✓ curse:buyemall
  installed v3.5.7
✓ curse:championcommander
  installed 1.2.4
✓ curse:colorpickerplus
  installed r45
✓ curse:conslegion
  installed ConsLegion v1.31
✓ curse:daily-to-do
  installed Daily To Do 1.0.3
✓ curse:derangement-pet-battle-cooldowns
  installed DerangementPetBattleCooldowns-v1-1-5.zip
✓ curse:details
  installed DetailsRetail.8.3.0.7356.141
✓ curse:errorfilter
  installed v3.7
✓ curse:exorsus-raid-tools
  installed Exorsus Raid Tools v.4170
✓ curse:gtfo
  installed 4.56
✓ curse:garrison-mission-manager
  installed v59
✓ curse:gottagofast
  installed GottaGoFast_v3.1.1
✓ curse:handynotes-visions-of-nzoth
  installed v38
✓ curse:lefollowers
  installed LeFollowers
✓ curse:legion-wardrobe
  installed Legion Wardrobe v.3.0
✓ curse:libsharedmedia-3-0
  installed 8.2.0 v2 - r113
✓ curse:long-forgotten-hippogryph
  installed LongForgottenHippogryph v2.01.zip
✓ curse:shadoweduf-facade
  installed 1.5.3
✓ curse:master-plan
  installed 0.117
✓ curse:move-anything
  installed 17.1.0
✓ curse:npcscan
  installed 8.0.1.13
✓ curse:opie
  installed Walnut 6
✓ curse:omni-cc
  installed 8.3.6
✓ curse:pawn
  installed 2.3.34
✓ curse:personal-loot-helper
  installed PersonalLootHelper-2.21.zip
✓ curse:pet-journal-enhanced
  installed 2.9.30
✓ curse:pettracker
  installed 8.3.8
✓ curse:postal
  installed v3.6.2
✓ curse:premade-groups-filter
  installed 1.37
✓ curse:rclootcouncil
  installed 2.19.3
✓ curse:rarescanner
  installed RareScanner_8.6
✓ curse:rarity
  installed r698-release
✓ curse:rematch
  installed Rematch_4_10_5.zip
✓ curse:routes
  installed v1.6.3
✓ curse:scrap
  installed 8.3.2
✓ curse:sheepmonitor
  installed 1.23
✓ curse:simpletarget
  installed 1.0.2
✓ curse:simulationcraft
  installed v1.12.5
✓ curse:tidy-plates-threat-plates
  installed 9.2.4
✓ curse:tier-token-tooltip
  installed TTT v1.05
✓ curse:tip-tac
  installed 19.03.31
✓ curse:toaster
  installed 8.0.1.1
✓ curse:tokenize
  installed Version 1.0.3
✓ curse:tomtom
  installed v80300-1.1.4
✓ curse:tradeskill-master
  installed v4.9.38
✓ curse:wowhead-linker
  installed v1.4.5
✓ curse:world-quest-tracker
  installed v8.3.0.398
✓ curse:world-quests-list
  installed World Quests List v.9.2
✓ curse:icpu
  installed 8.2.1
✓ curse:idtip
  installed idTip-8.2.1
✓ curse:tdbattlepetscript
  installed 80100.01
✓ curse:tdbattlepetscript-rematch
  installed 80100.01
✓ wowi:22229-auto-safari-hat
  installed 1.6.2

   unreconciled    
-------------------
PetTracker_Breeds  
PetTracker_Switcher
PetTracker_Upgrades
$

PIP3 update/install of ver 1.2 ERRORS

After upgrading to version 1.2 with pip3, these errors arise:

Traceback (most recent call last):
File "/usr/local/bin/instawow", line 10, in
sys.exit(main())
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 764, in call
return self.main(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 1134, in invoke
Command.invoke(self, ctx)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 956, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/usr/local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
return callback(*args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/click/decorators.py", line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File "/usr/local/lib/python3.7/site-packages/instawow/cli.py", line 195, in main
ctx.obj = manager = CliManager(config)
File "/usr/local/lib/python3.7/site-packages/instawow/manager.py", line 327, in init
if show_progress else None))
File "/usr/local/lib/python3.7/site-packages/instawow/manager.py", line 155, in init
Session = prepare_db_session(config=self.config)
File "/usr/local/lib/python3.7/site-packages/instawow/manager.py", line 111, in prepare_db_session
from .migrations import make_config, stamp, upgrade
ModuleNotFoundError: No module named 'instawow.migrations'

weakauras-companion-autoupdate error after removing weakaura

After removing some weakauras I get the following error:

λ ~ › instawow update
! instawow:weakauras-companion-autoupdate
  instawow encountered an error
2020-07-11 11:26:19.493 | ERROR    | instawow.exceptions:acapture:27 - error!
Traceback (most recent call last):
  File "/home/dennis/.local/bin/instawow", line 8, in <module>
    sys.exit(main())
    │   │    └ <Group main>
    │   └ <built-in function exit>
    └ <module 'sys' (built-in)>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
           │    │     │       └ {}
           │    │     └ ()
           │    └ <function BaseCommand.main at 0x7faf3cf54700>
           └ <Group main>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
         │    │      └ <click.core.Context object at 0x7faf3d14c820>
         │    └ <function MultiCommand.invoke at 0x7faf3cf554c0>
         └ <Group main>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
           │               │       │       │      └ <click.core.Context object at 0x7faf3d11e670>
           │               │       │       └ <function Command.invoke at 0x7faf3cf550d0>
           │               │       └ <Command update>
           │               └ <click.core.Context object at 0x7faf3d11e670>
           └ <function MultiCommand.invoke.<locals>._process_result at 0x7faf3d212700>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           │   │      │    │           │   └ {'addons': []}
           │   │      │    │           └ <click.core.Context object at 0x7faf3d11e670>
           │   │      │    └ <function update at 0x7faf392ee940>
           │   │      └ <Command update>
           │   └ <function Context.invoke at 0x7faf3cf541f0>
           └ <click.core.Context object at 0x7faf3d11e670>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
           │         │       └ {'addons': []}
           │         └ ()
           └ <function update at 0x7faf392ee940>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/click/decorators.py", line 33, in new_func
    return f(get_current_context().obj, *args, **kwargs)
           │ │                           │       └ {'addons': []}
           │ │                           └ ()
           │ └ <function get_current_context at 0x7faf3cfcd5e0>
           └ <function update at 0x7faf392ee820>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/cli.py", line 294, in update
    results = obj.m.run(obj.m.update(defns))
              │   │ │   │   │ │      └ [Defn(source='curse', name='bank-stack', strategy=<Strategies.default: 1>, strategy_vals=(), source_id='13494'), Defn(source=...
              │   │ │   │   │ └ <function Manager.update at 0x7faf38472af0>
              │   │ │   │   └ <instawow.manager.CliManager object at 0x7faf384e8760>
              │   │ │   └ <instawow.cli.ManagerWrapper object at 0x7faf3d19da90>
              │   │ └ <function CliManager.run at 0x7faf38472e50>
              │   └ <instawow.manager.CliManager object at 0x7faf384e8760>
              └ <instawow.cli.ManagerWrapper object at 0x7faf3d19da90>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/manager.py", line 577, in run
    return loop.run_until_complete(run())
           │    │                  └ <function CliManager.run.<locals>.run at 0x7faf375f4a60>
           │    └ <function BaseEventLoop.run_until_complete at 0x7faf3938d5e0>
           └ <_UnixSelectorEventLoop running=True closed=False debug=False>
  File "/home/dennis/.pyenv/versions/3.8.0/lib/python3.8/asyncio/base_events.py", line 595, in run_until_complete
    self.run_forever()
    │    └ <function BaseEventLoop.run_forever at 0x7faf3938d550>
    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
  File "/home/dennis/.pyenv/versions/3.8.0/lib/python3.8/asyncio/base_events.py", line 563, in run_forever
    self._run_once()
    │    └ <function BaseEventLoop._run_once at 0x7faf393900d0>
    └ <_UnixSelectorEventLoop running=True closed=False debug=False>
  File "/home/dennis/.pyenv/versions/3.8.0/lib/python3.8/asyncio/base_events.py", line 1844, in _run_once
    handle._run()
    │      └ <function Handle._run at 0x7faf3975ba60>
    └ <Handle <TaskWakeupMethWrapper object at 0x7faf36c7e790>(<_GatheringFu... sequence')}]>)>
  File "/home/dennis/.pyenv/versions/3.8.0/lib/python3.8/asyncio/events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
    │    │            │    │           │    └ <member '_args' of 'Handle' objects>
    │    │            │    │           └ <Handle <TaskWakeupMethWrapper object at 0x7faf36c7e790>(<_GatheringFu... sequence')}]>)>
    │    │            │    └ <member '_callback' of 'Handle' objects>
    │    │            └ <Handle <TaskWakeupMethWrapper object at 0x7faf36c7e790>(<_GatheringFu... sequence')}]>)>
    │    └ <member '_context' of 'Handle' objects>
    └ <Handle <TaskWakeupMethWrapper object at 0x7faf36c7e790>(<_GatheringFu... sequence')}]>)>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/manager.py", line 573, in run
    return await awaitable
                 └ <coroutine object Manager.update at 0x7faf37a661c0>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/manager.py", line 482, in update
    return await self._consume_seq(coros)
                 │    │            └ {Defn(source='curse', name='bank-stack', strategy=<Strategies.default: 1>, strategy_vals=(), source_id='13494'): functools.pa...
                 │    └ <function Manager._consume_seq at 0x7faf384724c0>
                 └ <instawow.manager.CliManager object at 0x7faf384e8760>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/manager.py", line 279, in _consume_seq
    return {d: await E.ManagerResult.acapture(c()) for d, c in coros_by_defn.items()}
                     │ │             │                         │             └ <method 'items' of 'dict' objects>
                     │ │             │                         └ {Defn(source='curse', name='bank-stack', strategy=<Strategies.default: 1>, strategy_vals=(), source_id='13494'): functools.pa...
                     │ │             └ <staticmethod object at 0x7faf25b45d60>
                     │ └ <class 'instawow.exceptions.ManagerResult'>
                     └ <module 'instawow.exceptions' from '/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/exceptions.py'>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/manager.py", line 279, in <dictcomp>
    return {d: await E.ManagerResult.acapture(c()) for d, c in coros_by_defn.items()}
            │        │ │             │        │        │  └ functools.partial(<function _error_out at 0x7faf38472040>, TypeError('cannot convert dictionary update sequence element #3 to...
            │        │ │             │        │        └ Defn(source='instawow', name='weakauras-companion-autoupdate', strategy=<Strategies.default: 1>, strategy_vals=(), source_id=...
            │        │ │             │        └ functools.partial(<function _error_out at 0x7faf38472040>, TypeError('cannot convert dictionary update sequence element #3 to...
            │        │ │             └ <staticmethod object at 0x7faf25b45d60>
            │        │ └ <class 'instawow.exceptions.ManagerResult'>
            │        └ <module 'instawow.exceptions' from '/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/exceptions.py'>
            └ Defn(source='instawow', name='weakauras-companion-autoupdate', strategy=<Strategies.default: 1>, strategy_vals=(), source_id=...
> File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/exceptions.py", line 23, in acapture
    return await awaitable
                 └ <coroutine object _error_out at 0x7faf35576ec0>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/manager.py", line 251, in _error_out
    raise error
          └ TypeError('cannot convert dictionary update sequence element #3 to a sequence')
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/resolvers.py", line 128, in wrapper
    return await resolve_one(self, defn, metadata)
                 │           │     │     └ None
                 │           │     └ Defn(source='instawow', name='weakauras-companion-autoupdate', strategy=<Strategies.default: 1>, strategy_vals=(), source_id=...
                 │           └ <instawow.resolvers.InstawowResolver object at 0x7faf37c57190>
                 └ <function InstawowResolver.resolve_one at 0x7faf392ecaf0>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/resolvers.py", line 565, in resolve_one
    await builder.build()
          │       └ <function WaCompanionBuilder.build at 0x7faf368650d0>
          └ <instawow.wa_updater.WaCompanionBuilder object at 0x7faf36aeba30>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/wa_updater.py", line 329, in build
    await t(self.make_addon)(remote_auras)
          │ │    │           └ [(<class 'instawow.wa_updater.WeakAuras'>, [RemoteAura(slug='r1_GTZbHm', existing_auras=[WeakAura(id='Avatar - Active', uid='...
          │ │    └ <function WaCompanionBuilder.make_addon at 0x7faf36865040>
          │ └ <instawow.wa_updater.WaCompanionBuilder object at 0x7faf36aeba30>
          └ <function run_in_thread at 0x7faf39362040>
  File "/home/dennis/.pyenv/versions/3.8.0/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
             │        │            └ None
             │        └ None
             └ None
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/utils.py", line 157, in <lambda>
    return lambda *a, **k: asyncio.get_running_loop().run_in_executor(None, lambda: fn(*a, **k))
                   │    │  │       │                                                │   │    └ {}
                   │    │  │       │                                                │   └ ([(<class 'instawow.wa_updater.WeakAuras'>, [RemoteAura(slug='r1_GTZbHm', existing_auras=[WeakAura(id='Avatar - Active', uid=...
                   │    │  │       │                                                └ <bound method WaCompanionBuilder.make_addon of <instawow.wa_updater.WaCompanionBuilder object at 0x7faf36aeba30>>
                   │    │  │       └ <built-in function get_running_loop>
                   │    │  └ <module 'asyncio' from '/home/dennis/.pyenv/versions/3.8.0/lib/python3.8/asyncio/__init__.py'>
                   │    └ {}
                   └ ([(<class 'instawow.wa_updater.WeakAuras'>, [RemoteAura(slug='r1_GTZbHm', existing_auras=[WeakAura(id='Avatar - Active', uid=...
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/wa_updater.py", line 246, in make_addon
    aura_dict = dict_chain((WeakAuras, Plateroos), [], auras)
                │           │          │               └ [(<class 'instawow.wa_updater.WeakAuras'>, [RemoteAura(slug='r1_GTZbHm', existing_auras=[WeakAura(id='Avatar - Active', uid='...
                │           │          └ <class 'instawow.wa_updater.Plateroos'>
                │           └ <class 'instawow.wa_updater.WeakAuras'>
                └ <function dict_chain at 0x7faf3935fdc0>
  File "/home/dennis/.local/pipx/venvs/instawow/lib/python3.8/site-packages/instawow/utils.py", line 123, in dict_chain
    return dict(chain(zip(keys, repeat(default)), *overrides))
                │         │     │      │           └ ([(<class 'instawow.wa_updater.WeakAuras'>, [RemoteAura(slug='r1_GTZbHm', existing_auras=[WeakAura(id='Avatar - Active', uid=...
                │         │     │      └ []
                │         │     └ <class 'itertools.repeat'>
                │         └ (<class 'instawow.wa_updater.WeakAuras'>, <class 'instawow.wa_updater.Plateroos'>)
                └ <class 'itertools.chain'>

TypeError: cannot convert dictionary update sequence element #3 to a sequence

Strange output

As far as I can tell, instawow is working as expected. It will list all my addons and it will update them too; the only strange part is the following output after it completes tasks:

Exception ignored in: <function _ProactorBasePipeTransport.__del__ at 0x03ECF8E0>
Traceback (most recent call last):
  File "c:\users\varian\appdata\local\programs\python\python38-32\lib\asyncio\proactor_events.py", line 116, in __del__
    self.close()
  File "c:\users\varian\appdata\local\programs\python\python38-32\lib\asyncio\proactor_events.py", line 108, in close
    self._loop.call_soon(self._call_connection_lost, None)
  File "c:\users\varian\appdata\local\programs\python\python38-32\lib\asyncio\base_events.py", line 715, in call_soon
    self._check_closed()
  File "c:\users\varian\appdata\local\programs\python\python38-32\lib\asyncio\base_events.py", line 508, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed

Any ideas what this output is? It doesn't seem to be negatively impacting the usage of instawow from what I can tell.

internal error updating weakauras-companion-autoupdate

I upgraded instawow from 1.14.1 to 1.14.3. After the upgrade weakauras-companion-autoupdate gives an internal error.

Upgrade output:

pipx upgrade instawow
  Overwriting file C:\Users\Blabla\.local\bin\instawow.exe with C:\Users\Blabla\.local\pipx\venvs\instawow\Scripts\instawow.exe
upgraded package instawow from 1.14.1 to 1.14.3 (location: C:\Users\Blabla\.local\pipx\venvs\instawow)

Output:

instawow update
! instawow:weakauras-companion-autoupdate
  internal error

error.log:

2020-09-20 12:06:10.124 | ERROR    | instawow.manager:_capture_exc_async:265 - unclassed error
Traceback (most recent call last):

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\engine\base.py", line 1204, in _execute_context
    context = constructor(dialect, self, conn, *args)
              |           |        |     |      -> (<sqlalchemy.dialects.sqlite.base.SQLiteCompiler object at 0x0000026E9F6409A0>, [{'description': 'A WeakAuras Companion clone...
              |           |        |     -> <sqlalchemy.pool.base._ConnectionFairy object at 0x0000026E9B089670>
              |           |        -> <sqlalchemy.engine.base.Connection object at 0x0000026E9F957A30>
              |           -> <sqlalchemy.dialects.sqlite.pysqlite.SQLiteDialect_pysqlite object at 0x0000026E9AFE80D0>
              -> <bound method DefaultExecutionContext._init_compiled of <class 'sqlalchemy.dialects.sqlite.base.SQLiteExecutionContext'>>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\engine\default.py", line 839, in _init_compiled
    param.append(processors[key](compiled_params[key]))
    |     |      |          |    |               -> 'date_published'
    |     |      |          |    -> {'slug': 'weakauras-companion-autoupdate', 'name': 'WeakAuras Companion', 'description': 'A WeakAuras Companion clone.', 'url...
    |     |      |          -> 'date_published'
    |     |      -> {'date_published': <function TypeDecorator.bind_processor.<locals>.process at 0x0000026E9F69B820>}
    |     -> <method 'append' of 'list' objects>
    -> ['weakauras-companion-autoupdate', 'WeakAuras Companion', 'A WeakAuras Companion clone.', 'https://github.com/layday/instawow...

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\sql\type_api.py", line 1230, in process
    return impl_processor(process_param(value, dialect))
           |              |             |      -> <sqlalchemy.dialects.sqlite.pysqlite.SQLiteDialect_pysqlite object at 0x0000026E9AFE80D0>
           |              |             -> datetime.datetime(2020, 9, 20, 12, 6, 10, 87015)
           |              -> <bound method TZDateTime.process_bind_param of TZDateTime()>
           -> <function DATETIME.bind_processor.<locals>.process at 0x0000026E9F69B700>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\models.py", line 75, in process_bind_param
    raise TypeError('tzinfo is required')

TypeError: tzinfo is required


The above exception was the direct cause of the following exception:


Traceback (most recent call last):

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
           |         |     -> {'__name__': '__main__', '__doc__': None, '__package__': '', '__loader__': <zipimporter object "C:\Users\Blabla\.local\bin\ins...
           |         -> <code object <module> at 0x0000026E980D4DF0, file "C:\Users\Blabla\.local\bin\instawow.exe\__main__.py", line 2>
           -> <function _run_code at 0x0000026E97ED8B80>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
         |     -> {'__name__': '__main__', '__doc__': None, '__package__': '', '__loader__': <zipimporter object "C:\Users\Blabla\.local\bin\ins...
         -> <code object <module> at 0x0000026E980D4DF0, file "C:\Users\Blabla\.local\bin\instawow.exe\__main__.py", line 2>

  File "C:\Users\Blabla\.local\bin\instawow.exe\__main__.py", line 7, in <module>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 829, in __call__
    return self.main(*args, **kwargs)
           |    |     |       -> {}
           |    |     -> ()
           |    -> <function BaseCommand.main at 0x0000026E99D97E50>
           -> <Group main>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 782, in main
    rv = self.invoke(ctx)
         |    |      -> <click.core.Context object at 0x0000026E9A882F70>
         |    -> <function MultiCommand.invoke at 0x0000026E99D9AC10>
         -> <Group main>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
           |               |       |       |      -> <click.core.Context object at 0x0000026E98221B20>
           |               |       |       -> <function Command.invoke at 0x0000026E99D9A820>
           |               |       -> <Command update>
           |               -> <click.core.Context object at 0x0000026E98221B20>
           -> <function MultiCommand.invoke.<locals>._process_result at 0x0000026E97CA61F0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           |   |      |    |           |   -> {'addons': []}
           |   |      |    |           -> <click.core.Context object at 0x0000026E98221B20>
           |   |      |    -> <function update at 0x0000026E9A88A670>
           |   |      -> <Command update>
           |   -> <function Context.invoke at 0x0000026E99D97940>
           -> <click.core.Context object at 0x0000026E98221B20>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 610, in invoke
    return callback(*args, **kwargs)
           |         |       -> {'addons': []}
           |         -> ()
           -> <function update at 0x0000026E9A88A670>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\decorators.py", line 33, in new_func
    return f(get_current_context().obj, *args, **kwargs)
           | |                           |       -> {'addons': []}
           | |                           -> ()
           | -> <function get_current_context at 0x0000026E99B3FF70>
           -> <function update at 0x0000026E9A88A5E0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\cli.py", line 304, in update
    results = obj.m.run(
              |   | -> <function CliManager.run at 0x0000026E9AF7F040>
              |   -> <instawow.manager.CliManager object at 0x0000026E9AFD9A30>
              -> <instawow.cli.ManagerWrapper object at 0x0000026E98232790>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 783, in run
    return loop.run_until_complete(run())
           |    |                  -> <function CliManager.run.<locals>.run at 0x0000026E9BE62670>
           |    -> <function BaseEventLoop.run_until_complete at 0x0000026E99FE6F70>
           -> <_WindowsSelectorEventLoop running=True closed=False debug=False>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
    |    -> <function BaseEventLoop.run_forever at 0x0000026E99FE6EE0>
    -> <_WindowsSelectorEventLoop running=True closed=False debug=False>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
    |    -> <function BaseEventLoop._run_once at 0x0000026E99FE9A60>
    -> <_WindowsSelectorEventLoop running=True closed=False debug=False>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
    |      -> <function Handle._run at 0x0000026E99F87790>
    -> <Handle <TaskWakeupMethWrapper object at 0x0000026E9F945D30>(<Future finis...is required')>)>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
    |    |            |    |           |    -> <member '_args' of 'Handle' objects>
    |    |            |    |           -> <Handle <TaskWakeupMethWrapper object at 0x0000026E9F945D30>(<Future finis...is required')>)>
    |    |            |    -> <member '_callback' of 'Handle' objects>
    |    |            -> <Handle <TaskWakeupMethWrapper object at 0x0000026E9F945D30>(<Future finis...is required')>)>
    |    -> <member '_context' of 'Handle' objects>
    -> <Handle <TaskWakeupMethWrapper object at 0x0000026E9F945D30>(<Future finis...is required')>)>

> File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 258, in _capture_exc_async
    return await coro()
                 -> functools.partial(<function Manager.update_pkg at 0x0000026E9F96AF70>, <instawow.models.Pkg object at 0x0000026E9C32C640>, <i...

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\concurrent\futures\thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
             |        |            -> None
             |        -> None
             -> None

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\utils.py", line 173, in <lambda>
    return loop.run_in_executor(None, lambda: fn(*args, **kwargs))
                                              |   |       -> {}
                                              |   -> (<instawow.models.Pkg object at 0x0000026E9C32C640>, <instawow.models.Pkg object at 0x0000026E9C3E5A30>, WindowsPath('C:/User...
                                              -> <bound method Manager.update_pkg of <instawow.manager.CliManager object at 0x0000026E9AFD9A30>>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 457, in update_pkg
    self.database.merge(
    |    |        -> <function Session.merge at 0x0000026E9AE9EAF0>
    |    -> <sqlalchemy.orm.session.Session object at 0x0000026E9AFD98B0>
    -> <instawow.manager.CliManager object at 0x0000026E9AFD9A30>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\session.py", line 2144, in merge
    self._autoflush()
    |    -> <function Session._autoflush at 0x0000026E9AEA0F70>
    -> <sqlalchemy.orm.session.Session object at 0x0000026E9AFD98B0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\session.py", line 1628, in _autoflush
    util.raise_(e, with_traceback=sys.exc_info()[2])
    |    |                        |   -> <built-in function exc_info>
    |    |                        -> <module 'sys' (built-in)>
    |    -> <function raise_ at 0x0000026E9A8FE0D0>
    -> <module 'sqlalchemy.util' from 'c:\\users\\blabla\\.local\\pipx\\venvs\\instawow\\lib\\site-packages\\sqlalchemy\\util\\__init...

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\session.py", line 1617, in _autoflush
    self.flush()
    |    -> <function Session.flush at 0x0000026E9AEA11F0>
    -> <sqlalchemy.orm.session.Session object at 0x0000026E9AFD98B0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\session.py", line 2523, in flush
    self._flush(objects)
    |    |      -> None
    |    -> <function Session._flush at 0x0000026E9AEA13A0>
    -> <sqlalchemy.orm.session.Session object at 0x0000026E9AFD98B0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\session.py", line 2664, in _flush
    transaction.rollback(_capture_exception=True)
    |           -> <function SessionTransaction.rollback at 0x0000026E9AE9DC10>
    -> <sqlalchemy.orm.session.SessionTransaction object at 0x0000026E9F957F40>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\util\langhelpers.py", line 68, in __exit__
    compat.raise_(
    |      -> <function raise_ at 0x0000026E9A8FE0D0>
    -> <module 'sqlalchemy.util.compat' from 'c:\\users\\blabla\\.local\\pipx\\venvs\\instawow\\lib\\site-packages\\sqlalchemy\\util\...

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\session.py", line 2624, in _flush
    flush_context.execute()
    |             -> <function UOWTransaction.execute at 0x0000026E9AE6AB80>
    -> <sqlalchemy.orm.unitofwork.UOWTransaction object at 0x0000026E9C401340>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 422, in execute
    rec.execute(self)
    |   |       -> <sqlalchemy.orm.unitofwork.UOWTransaction object at 0x0000026E9C401340>
    |   -> <function SaveUpdateAll.execute at 0x0000026E9AE72430>
    -> SaveUpdateAll(mapped class Pkg->pkg)

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\unitofwork.py", line 586, in execute
    persistence.save_obj(
    |           -> <function save_obj at 0x0000026E9AE14AF0>
    -> <module 'sqlalchemy.orm.persistence' from 'c:\\users\\blabla\\.local\\pipx\\venvs\\instawow\\lib\\site-packages\\sqlalchemy\\o...

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\persistence.py", line 230, in save_obj
    _emit_update_statements(
    -> <function _emit_update_statements at 0x0000026E9AE170D0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\orm\persistence.py", line 994, in _emit_update_statements
    c = cached_connections[connection].execute(
        |                  -> <sqlalchemy.engine.base.Connection object at 0x0000026E9B0896A0>
        -> {<sqlalchemy.engine.base.Connection object at 0x0000026E9B0896A0>: <sqlalchemy.engine.base.Connection object at 0x0000026E9F9...

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\engine\base.py", line 1011, in execute
    return meth(self, multiparams, params)
           |    |     |            -> {}
           |    |     -> ([{'description': 'A WeakAuras Companion clone.', 'version': '4d32366', 'download_url': 'file:///C:/Users/Blabla/AppData/Roami...
           |    -> <sqlalchemy.engine.base.Connection object at 0x0000026E9F957A30>
           -> <bound method ClauseElement._execute_on_connection of <sqlalchemy.sql.dml.Update object at 0x0000026E9AA3BD00>>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\sql\elements.py", line 298, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
           |          |                      |     |            -> {}
           |          |                      |     -> ([{'description': 'A WeakAuras Companion clone.', 'version': '4d32366', 'download_url': 'file:///C:/Users/Blabla/AppData/Roami...
           |          |                      -> <sqlalchemy.sql.dml.Update object at 0x0000026E9AA3BD00>
           |          -> <function Connection._execute_clauseelement at 0x0000026E9AC24040>
           -> <sqlalchemy.engine.base.Connection object at 0x0000026E9F957A30>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\engine\base.py", line 1124, in _execute_clauseelement
    ret = self._execute_context(
          |    -> <function Connection._execute_context at 0x0000026E9AC241F0>
          -> <sqlalchemy.engine.base.Connection object at 0x0000026E9F957A30>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\engine\base.py", line 1206, in _execute_context
    self._handle_dbapi_exception(
    |    -> <function Connection._handle_dbapi_exception at 0x0000026E9AC243A0>
    -> <sqlalchemy.engine.base.Connection object at 0x0000026E9F957A30>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\engine\base.py", line 1510, in _handle_dbapi_exception
    util.raise_(
    |    -> <function raise_ at 0x0000026E9A8FE0D0>
    -> <module 'sqlalchemy.util' from 'c:\\users\\blabla\\.local\\pipx\\venvs\\instawow\\lib\\site-packages\\sqlalchemy\\util\\__init...

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\util\compat.py", line 182, in raise_
    raise exception

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\engine\base.py", line 1204, in _execute_context
    context = constructor(dialect, self, conn, *args)
              |           |        |     |      -> (<sqlalchemy.dialects.sqlite.base.SQLiteCompiler object at 0x0000026E9F6409A0>, [{'description': 'A WeakAuras Companion clone...
              |           |        |     -> <sqlalchemy.pool.base._ConnectionFairy object at 0x0000026E9B089670>
              |           |        -> <sqlalchemy.engine.base.Connection object at 0x0000026E9F957A30>
              |           -> <sqlalchemy.dialects.sqlite.pysqlite.SQLiteDialect_pysqlite object at 0x0000026E9AFE80D0>
              -> <bound method DefaultExecutionContext._init_compiled of <class 'sqlalchemy.dialects.sqlite.base.SQLiteExecutionContext'>>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\engine\default.py", line 839, in _init_compiled
    param.append(processors[key](compiled_params[key]))
    |     |      |          |    |               -> 'date_published'
    |     |      |          |    -> {'slug': 'weakauras-companion-autoupdate', 'name': 'WeakAuras Companion', 'description': 'A WeakAuras Companion clone.', 'url...
    |     |      |          -> 'date_published'
    |     |      -> {'date_published': <function TypeDecorator.bind_processor.<locals>.process at 0x0000026E9F69B820>}
    |     -> <method 'append' of 'list' objects>
    -> ['weakauras-companion-autoupdate', 'WeakAuras Companion', 'A WeakAuras Companion clone.', 'https://github.com/layday/instawow...

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\sqlalchemy\sql\type_api.py", line 1230, in process
    return impl_processor(process_param(value, dialect))
           |              |             |      -> <sqlalchemy.dialects.sqlite.pysqlite.SQLiteDialect_pysqlite object at 0x0000026E9AFE80D0>
           |              |             -> datetime.datetime(2020, 9, 20, 12, 6, 10, 87015)
           |              -> <bound method TZDateTime.process_bind_param of TZDateTime()>
           -> <function DATETIME.bind_processor.<locals>.process at 0x0000026E9F69B700>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\models.py", line 75, in process_bind_param
    raise TypeError('tzinfo is required')

sqlalchemy.exc.StatementError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
(builtins.TypeError) tzinfo is required
[SQL: UPDATE pkg SET slug=?, name=?, description=?, url=?, download_url=?, date_published=?, version=? WHERE pkg.source = ? AND pkg.id = ?]
[parameters: [{'description': 'A WeakAuras Companion clone.', 'version': '4d32366', 'download_url': 'file:///C:/Users/Blabla/AppData/Roaming/instawow/profiles/__def ... (137 characters truncated) ... (2020, 9, 20, 12, 6, 10, 87015), 'name': 'WeakAuras Companion', 'url': 'https://github.com/layday/instawow', 'pkg_source': 'instawow', 'pkg_id': '1'}]]

Python3.8 get_args failure

Getting the following error in the past two releases:

Traceback (most recent call last):
  File ".local/bin/instawow", line 5, in <module>
    from instawow.cli import main
  File ".local/lib/python3.8/site-packages/instawow/cli.py", line 33, in <module>
    from .resolvers import Defn, MultiPkgModel, Strategies
  File ".local/lib/python3.8/site-packages/instawow/resolvers.py", line 22, in <module>
    from typing_extensions import Literal, TypedDict, get_args
ImportError: cannot import name 'get_args' from 'typing_extensions' (.local/lib/python3.8/site-packages/typing_extensions.py)
Traceback (most recent call last):
  File ".local/bin/instawow", line 5, in <module>
    from instawow.cli import main
  File ".local/lib/python3.8/site-packages/instawow/cli.py", line 33, in <module>
    from .resolvers import Defn, MultiPkgModel, Strategies
  File ".local/lib/python3.8/site-packages/instawow/resolvers.py", line 22, in <module>
    from typing_extensions import Literal, TypedDict, get_args
ImportError: cannot import name 'get_args' from 'typing_extensions' (.local/lib/python3.8/site-packages/typing_extensions.py)

The error is here in resolvers.py:

 22 from typing_extensions import Literal, TypedDict, get_args

It looks like get_args (for Python 3.8+ anyway) is now in typing rather than typing_extensions.
This fixes it for me:

 22 from typing_extensions import Literal, TypedDict
 23 from typing import get_args

curse:addon-name - package does not exist

Hello,
since today the plugin shows me for example

curse:weakauras-2
package does not exist

for every curse plugin. Do you have a clue or the same problem?

Best regards

Empty directory / imported instawow addons?

I'm noticing this stack trace when I attempt to list installed addons when the directory is empty.

Additional note: If I copy addons from a different machine which has used instawow for addon management, the new machine does not detect any of the addons and instead spits out the below stacktrace, is this expected? Any chance we can freely move instawow managed addon directories across installations and instawow can pick them up?

Traceback (most recent call last):
  File "/home/user/.local/bin/instawow", line 10, in <module>
    sys.exit(cli())
  File "/home/user/.local/lib/python3.7/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/home/user/.local/lib/python3.7/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/home/user/.local/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/user/.local/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/user/.local/lib/python3.7/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/user/.local/lib/python3.7/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/user/.local/lib/python3.7/site-packages/click/decorators.py", line 27, in new_func
    return f(get_current_context().obj, *args, **kwargs)
  File "/home/user/.local/lib/python3.7/site-packages/instawow/cli.py", line 278, in list_installed
    *(f'[{e}]' for e in toc_entries))))
  File "/home/user/.local/lib/python3.7/site-packages/instawow/cli.py", line 51, in _tabulate
    table.set_cols_align(f'r{"l" * len(rows[0])}')

Big Wigs versions

Not really sure if this is an instawow issue, but big wigs now has different versions for retail and classic in the same 'project'. Instawow is grabbing v2-classic (which does not work on retail).

Perhaps you can scrape the game version as well?

Thanks again for your fantastic contribution!

Old version (1.6.0) in pypi repository

Hello,
I get errors when trying to update addons and I think it might be related to the version of instawow I'm using. The github files are newer than the ones on pypi.org. Could you update these?

Best regards

How to use the 'any_flavour' strategy?

When I try to install a retail addon to my classic configuration I get this:

┌─[gotek][warsong:~]
└─▪iwowc install https://www.curseforge.com/wow/addons/colorpickerplus            
✗ curse:colorpickerplus
  no files compatible with classic using 'default' strategy

From which I can surmise that I should somehow use the 'any_flavour' strategy mentioned in the readme. But how exactly do I do this? I couldn't find any documentation on it.

AUR package

In reference to #33

Would you perhaps be interested if someone else would maintain said package?
I might attempt to create this AUR package next week (it would be my first AUR package) if you agree with this.

SSL error

New (to me) error that's been occurring for the last couple of days:

instawow update
Checking: 16%|######3 | 13/80 [00:01<00:14, 4.73it/s]Fatal error on transport
protocol: <uvloop.loop.SSLProtocol object at 0x108dd5a58>
transport: <TCPTransport closed=False reading=False 0x7fe9ca663ca8>
Traceback (most recent call last):
File "uvloop/sslproto.pyx", line 573, in uvloop.loop.SSLProtocol._do_shutdown
File "/Users/jeremy/miniconda3/lib/python3.7/ssl.py", line 767, in unwrap
return self._sslobj.shutdown()
ssl.SSLError: [SSL: KRB5_S_INIT] application data after close notify (_ssl.c:2609)
Checking: 49%|################### | 39/80 [00:03<00:02, 16.39it/s]Fatal error on transport
protocol: <uvloop.loop.SSLProtocol object at 0x108dd51b8>
transport: <TCPTransport closed=False reading=False 0x7fe9cd748df8>
Traceback (most recent call last):
File "uvloop/sslproto.pyx", line 573, in uvloop.loop.SSLProtocol._do_shutdown
File "/Users/XXXXXXX/lib/python3.7/ssl.py", line 767, in unwrap
return self._sslobj.shutdown()
ssl.SSLError: [SSL: KRB5_S_INIT] application data after close notify (_ssl.c:2609)
✗ curse:quartz
package does not exist
✗ curse:bazooka
package does not exist
Thu Jun 06 20:51:54>

If it helps:

instawow --version
instawow, version 1.0.0

Can't read non-utf8 .toc files that include non-ascii characters.

The .toc for SmartBuff Classic is encoded as iso-8859-1. when instawow encounters this file during a reconcile, it gives the following error:

  File "/home/kris/.local/instawow/.venv/bin/instawow", line 11, in <module>
    load_entry_point('instawow==1.5.1.dev4+gaf69a97', 'console_scripts', 'instawow')()
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/cli.py", line 343, in reconcile
    for selections in match_all():
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/cli.py", line 323, in match_all
    groups = fn(get_leftovers())
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/cli.py", line 270, in match_toc_ids_from_sources
    [])
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/cli.py", line 268, in <genexpr>
    (([t], {Defn(ids_to_sources[v.key], v.value) for v in i if v})
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/cli.py", line 266, in <genexpr>
    maybe_ids = (((n, r), (r[i] for i in ids_to_sources)) for n, r in dir_tocs)
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/cli.py", line 265, in <genexpr>
    dir_tocs = ((n, TocReader_(n)) for n in sorted(leftovers))
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/cli.py", line 224, in <lambda>
    TocReader_ = lambda n: TocReader.from_path_name(manager.config.addon_dir / n)
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/utils.py", line 65, in from_path_name
    return cls.from_path(path / f'{path.name}.toc', *args, **kwargs)
  File "/home/kris/.local/instawow/.venv/lib/python3.7/site-packages/instawow-1.5.1.dev4+gaf69a97-py3.7.egg/instawow/utils.py", line 61, in from_path
    return cls(path.read_text(encoding='utf-8-sig'), *args, **kwargs)
  File "/usr/lib/python3.7/pathlib.py", line 1207, in read_text
    return f.read()
  File "/usr/lib/python3.7/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
  File "/usr/lib/python3.7/encodings/utf_8_sig.py", line 69, in _buffer_decode
    return codecs.utf_8_decode(input, errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 359: invalid start byte

If I convert the .toc file to UTF-8, the file is read with no problems.

Windows - Path does not exist

OS

Windows 10 2004

Release

1.9

Steps

  1. Downloaded Windows 1.9.0 binary
  2. Placed binary in its own folder
  3. Ran the command instawow reconcile --auto
  4. Configured add-on path and game flavour
  5. Binary crashes after setting flavour

Error

D:\instawow-classic> .\instawow.exe reconcile --auto
Traceback (most recent call last):
  File "instawow.__main__", line 4, in <module>
  File "click.core", line 829, in __call__
  File "click.core", line 782, in main
  File "click.core", line 1259, in invoke
  File "click.core", line 1066, in invoke
  File "click.core", line 610, in invoke
  File "click.decorators", line 21, in new_func
  File "instawow.cli", line 320, in reconcile
  File "instawow.utils", line 106, in __get__
  File "instawow.cli", line 121, in m
  File "instawow.manager", line 208, in prepare_db_session
  File "alembic.command", line 278, in upgrade
  File "alembic.script.base", line 149, in from_config
  File "alembic.script.base", line 70, in __init__
alembic.util.exc.CommandError: Path doesn't exist: 'C:\\Users\\<username>\\AppData\\Local\\Temp\\tmpdhbqt6ov\\instawow\\migrations'.  Please use the 'init' command to create a new scripts folder.
SystemError

Notes

Same error exists every time I run reconcile.

internal error installing weakauras-companion

I tried installing the WeakAuras aura updater via

instawow weakauras-companion build -a <your account name> (account name is correct)
instawow install instawow:weakauras-companion

and get the following error.

Output:

C:\Users\Blabla>instawow install instawow:weakauras-companion
! instawow:weakauras-companion
  internal error

error.log:

2020-09-08 12:55:01.902 | ERROR    | instawow.manager:_capture_exc:265 - unclassed error
Traceback (most recent call last):

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
           |         |     -> {'__name__': '__main__', '__doc__': None, '__package__': '', '__loader__': <zipimporter object "C:\Users\Blabla\.local\bin\ins...
           |         -> <code object <module> at 0x0000026DB3F74DF0, file "C:\Users\Blabla\.local\bin\instawow.exe\__main__.py", line 2>
           -> <function _run_code at 0x0000026DB3D78B80>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
         |     -> {'__name__': '__main__', '__doc__': None, '__package__': '', '__loader__': <zipimporter object "C:\Users\Blabla\.local\bin\ins...
         -> <code object <module> at 0x0000026DB3F74DF0, file "C:\Users\Blabla\.local\bin\instawow.exe\__main__.py", line 2>

  File "C:\Users\Blabla\.local\bin\instawow.exe\__main__.py", line 7, in <module>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 829, in __call__
    return self.main(*args, **kwargs)
           |    |     |       -> {}
           |    |     -> ()
           |    -> <function BaseCommand.main at 0x0000026DB5C56CA0>
           -> <Group main>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 782, in main
    rv = self.invoke(ctx)
         |    |      -> <click.core.Context object at 0x0000026DB66409D0>
         |    -> <function MultiCommand.invoke at 0x0000026DB5C57A60>
         -> <Group main>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
           |               |       |       |      -> <click.core.Context object at 0x0000026DB40C19A0>
           |               |       |       -> <function Command.invoke at 0x0000026DB5C57670>
           |               |       -> <Command install>
           |               -> <click.core.Context object at 0x0000026DB40C19A0>
           -> <function MultiCommand.invoke.<locals>._process_result at 0x0000026DB3B461F0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           |   |      |    |           |   -> {'addons': [Defn(source='instawow', source_id=None, name='weakauras-companion', strategy=<Strategies.default: 'default'>, str...
           |   |      |    |           -> <click.core.Context object at 0x0000026DB40C19A0>
           |   |      |    -> <function install at 0x0000026DB66BE4C0>
           |   |      -> <Command install>
           |   -> <function Context.invoke at 0x0000026DB5C56790>
           -> <click.core.Context object at 0x0000026DB40C19A0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\core.py", line 610, in invoke
    return callback(*args, **kwargs)
           |         |       -> {'addons': [Defn(source='instawow', source_id=None, name='weakauras-companion', strategy=<Strategies.default: 'default'>, str...
           |         -> ()
           -> <function install at 0x0000026DB66BE4C0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\click\decorators.py", line 33, in new_func
    return f(get_current_context().obj, *args, **kwargs)
           | |                           |       -> {'addons': [Defn(source='instawow', source_id=None, name='weakauras-companion', strategy=<Strategies.default: 'default'>, str...
           | |                           -> ()
           | -> <function get_current_context at 0x0000026DB59D8D30>
           -> <function install at 0x0000026DB66BE430>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\cli.py", line 288, in install
    results = obj.m.run(obj.m.install(addons, replace))
              |   | |   |   | |       |       -> False
              |   | |   |   | |       -> [Defn(source='instawow', source_id=None, name='weakauras-companion', strategy=<Strategies.default: 'default'>, strategy_vals=...
              |   | |   |   | -> <function Manager._with_lock.<locals>.outer.<locals>.inner at 0x0000026DB6DEE5E0>
              |   | |   |   -> <instawow.manager.CliManager object at 0x0000026DB6E2F160>
              |   | |   -> <instawow.cli.ManagerWrapper object at 0x0000026DB40D2640>
              |   | -> <function CliManager.run at 0x0000026DB6DEEB80>
              |   -> <instawow.manager.CliManager object at 0x0000026DB6E2F160>
              -> <instawow.cli.ManagerWrapper object at 0x0000026DB40D2640>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 772, in run
    return loop.run_until_complete(run())
           |    |                  -> <function CliManager.run.<locals>.run at 0x0000026DB7C51AF0>
           |    -> <function BaseEventLoop.run_until_complete at 0x0000026DB5E67EE0>
           -> <_WindowsSelectorEventLoop running=True closed=False debug=False>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\asyncio\base_events.py", line 603, in run_until_complete
    self.run_forever()
    |    -> <function BaseEventLoop.run_forever at 0x0000026DB5E67E50>
    -> <_WindowsSelectorEventLoop running=True closed=False debug=False>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\asyncio\base_events.py", line 570, in run_forever
    self._run_once()
    |    -> <function BaseEventLoop._run_once at 0x0000026DB5E6A9D0>
    -> <_WindowsSelectorEventLoop running=True closed=False debug=False>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\asyncio\base_events.py", line 1859, in _run_once
    handle._run()
    |      -> <function Handle._run at 0x0000026DB5E09700>
    -> <Handle <TaskWakeupMethWrapper object at 0x0000026DB7C43A60>(<_GatheringFu...d argument')]>)>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\asyncio\events.py", line 81, in _run
    self._context.run(self._callback, *self._args)
    |    |            |    |           |    -> <member '_args' of 'Handle' objects>
    |    |            |    |           -> <Handle <TaskWakeupMethWrapper object at 0x0000026DB7C43A60>(<_GatheringFu...d argument')]>)>
    |    |            |    -> <member '_callback' of 'Handle' objects>
    |    |            -> <Handle <TaskWakeupMethWrapper object at 0x0000026DB7C43A60>(<_GatheringFu...d argument')]>)>
    |    -> <member '_context' of 'Handle' objects>
    -> <Handle <TaskWakeupMethWrapper object at 0x0000026DB7C43A60>(<_GatheringFu...d argument')]>)>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 768, in run
    return await awaitable
                 -> <coroutine object Manager._with_lock.<locals>.outer.<locals>.inner at 0x0000026DB6E106C0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 336, in inner
    return await coro_fn(self, *args, **kwargs)
                 |       |      |       -> {}
                 |       |      -> ([Defn(source='instawow', source_id=None, name='weakauras-companion', strategy=<Strategies.default: 'default'>, strategy_vals...
                 |       -> <instawow.manager.CliManager object at 0x0000026DB6E2F160>
                 -> <function Manager.install at 0x0000026DB6DEE550>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 606, in install
    results = {d: await _capture_exc(c) for d, c in result_coros.items()}
                        |                           |            -> <method 'items' of 'dict' objects>
                        |                           -> {Defn(source='instawow', source_id=None, name='weakauras-companion', strategy=<Strategies.default: 'default'>, strategy_vals=...
                        -> <function _capture_exc at 0x0000026DB6DEC940>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 606, in <dictcomp>
    results = {d: await _capture_exc(c) for d, c in result_coros.items()}
               |        |            |      |  -> <function _error_out.<locals>.inner at 0x0000026DB93B63A0>
               |        |            |      -> Defn(source='instawow', source_id=None, name='weakauras-companion', strategy=<Strategies.default: 'default'>, strategy_vals=())
               |        |            -> <function _error_out.<locals>.inner at 0x0000026DB93B63A0>
               |        -> <function _capture_exc at 0x0000026DB6DEC940>
               -> Defn(source='instawow', source_id=None, name='weakauras-companion', strategy=<Strategies.default: 'default'>, strategy_vals=())

> File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 258, in _capture_exc
    return await coro()
                 -> <function _error_out.<locals>.inner at 0x0000026DB93B63A0>

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 249, in inner
    raise error
          -> OSError(22, 'Invalid argument')

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\manager.py", line 131, in download_archive
    await copy_async(unquote(url[7:]), dest)
          |          |       |         -> WindowsPath('C:/Users/Blabla/AppData/Local/Temp/instawow/cache/f709d0aa5646dca7f57904e1be899b61')
          |          |       -> 'file:///C:/Users/Blabla/AppData/Roaming/instawow/profiles/__default__/plugins/instawow.wa_updater/WeakAurasCompanion.zip'
          |          -> <function unquote at 0x0000026DB41448B0>
          -> <function copy at 0x0000026DB6DEC040>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\concurrent\futures\thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
             |        |            -> None
             |        -> None
             -> None

  File "c:\users\blabla\.local\pipx\venvs\instawow\lib\site-packages\instawow\utils.py", line 173, in <lambda>
    return loop.run_in_executor(None, lambda: fn(*args, **kwargs))
                                              |   |       -> {}
                                              |   -> ('/C:/Users/Blabla/AppData/Roaming/instawow/profiles/__default__/plugins/instawow.wa_updater/WeakAurasCompanion.zip', WindowsP...
                                              -> <function copy at 0x0000026DB5C6BA60>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\shutil.py", line 415, in copy
    copyfile(src, dst, follow_symlinks=follow_symlinks)
    |        |    |                    -> True
    |        |    -> WindowsPath('C:/Users/Blabla/AppData/Local/Temp/instawow/cache/f709d0aa5646dca7f57904e1be899b61')
    |        -> '/C:/Users/Blabla/AppData/Roaming/instawow/profiles/__default__/plugins/instawow.wa_updater/WeakAurasCompanion.zip'
    -> <function copyfile at 0x0000026DB5C6B820>

  File "c:\users\blabla\appdata\local\programs\python\python38\lib\shutil.py", line 261, in copyfile
    with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
              |                        -> WindowsPath('C:/Users/Blabla/AppData/Local/Temp/instawow/cache/f709d0aa5646dca7f57904e1be899b61')
              -> '/C:/Users/Blabla/AppData/Roaming/instawow/profiles/__default__/plugins/instawow.wa_updater/WeakAurasCompanion.zip'

OSError: [Errno 22] Invalid argument: '/C:/Users/Blabla/AppData/Roaming/instawow/profiles/__default__/plugins/instawow.wa_updater/WeakAurasCompanion.zip'

Add-ons missing from CF POST API

$ # DBM is okay
$ http get https://addons-ecs.forgesvc.net/api/v2/addon/3358 -b | jq .id
3358
$ echo [3358] | http post https://addons-ecs.forgesvc.net/api/v2/addon -b | jq .[].id
3358
$ # But what about this one?
$ http get https://addons-ecs.forgesvc.net/api/v2/addon/336400 -b | jq .id
336400
$ echo [336400] | http post https://addons-ecs.forgesvc.net/api/v2/addon -b | jq .
[]
$ # Uh...

I'll wait and see if this resolves itself for now.

[Not an Issue, Seeking Help] How to update instawow

I received a message today that instawow was not up to date. I tried to use 'pip3 install instawow' and then pip3 help to find a command that would allow for me to upgrade but I wasn't able to find the command. Is upgrading a possibility or do I need to uninstall and reinstall your application?

I'm sure this is an idiotic question for you and I tried to avoid asking it by Googling but I'm somewhat out of my element here.

Cheers.

AttributeError: 'Report' object has no attribute '_symbols'

Seems to be a persistent problem, ran it with --debug but no additional info. I'm still running the version before yesterday's fixes but I will pull down the latest and check it as well.

$ ./instawow -p wow1 --debug update
Traceback (most recent call last):
  File "instawow.__main__", line 4, in <module>
  File "click.core", line 829, in __call__
  File "click.core", line 782, in main
  File "click.core", line 1259, in invoke
  File "click.core", line 1066, in invoke
  File "click.core", line 610, in invoke
  File "click.decorators", line 33, in new_func
  File "instawow.cli", line 306, in update
  File "instawow.cli", line 91, in generate_and_exit
  File "instawow.cli", line 84, in generate
AttributeError: 'Report' object has no attribute '_symbols'
SystemError
$ ./instawow --version
instawow, version 1.13.1

One of the required dependencies doesn't support Windows

I tried to install instawow using Cygwin, but uvloop refuses to let me:

$ pip3 install instawow
Collecting instawow
  Using cached instawow-0.8.1.tar.gz
Collecting aiohttp<3,>=2.2.5 (from instawow)
  Using cached aiohttp-2.2.5-cp36-cp36m-win_amd64.whl
Collecting click<7,>=6.7 (from instawow)
  Using cached click-6.7-py2.py3-none-any.whl
Collecting lxml<5,>=4.0.0 (from instawow)
  Using cached lxml-4.1.0-cp36-cp36m-win_amd64.whl
Collecting pydantic<1,>=0.4 (from instawow)
  Using cached pydantic-0.4-py36-none-any.whl
Collecting SQLAlchemy<2,>=1.1.14 (from instawow)
  Using cached SQLAlchemy-1.1.14.tar.gz
Collecting texttable<1,>=0.9.1 (from instawow)
  Using cached texttable-0.9.1.tar.gz
Collecting uvloop<1,>=0.8.1 (from instawow)
  Using cached uvloop-0.8.1.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "D:\cygwin64\tmp\pip-build-2ei2xumt\uvloop\setup.py", line 10, in <module>
        raise RuntimeError('uvloop does not support Windows at the moment')
    RuntimeError: uvloop does not support Windows at the moment

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in D:\cygwin64\tmp\pip-build-2ei2xumt\uvloop\

Curse feed apparently retired

The Curse feed's not been updated in three days and the Twitch client no longer pulls data from the feed. Curse packages have stopped receiving updates in instawow.

SQLite 3 Exception

Hi there! I recently updated my instawow from v1.12.1 to v1.13.3 and when I attempted to update my WoW classic addons I got this error:

PS C:\Users\Jacob> instawow -p classic update
Traceback (most recent call last):
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\Jacob\scoop\apps\python\current\Scripts\instawow.exe\__main__.py", line 7, in <module>
  File "C:\Users\Jacob\AppData\Roaming\Python\Python38\site-packages\click\core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "C:\Users\Jacob\AppData\Roaming\Python\Python38\site-packages\click\core.py", line 782, in main
    rv = self.invoke(ctx)
  File "C:\Users\Jacob\AppData\Roaming\Python\Python38\site-packages\click\core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:\Users\Jacob\AppData\Roaming\Python\Python38\site-packages\click\core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Users\Jacob\AppData\Roaming\Python\Python38\site-packages\click\core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "C:\Users\Jacob\AppData\Roaming\Python\Python38\site-packages\click\decorators.py", line 33, in new_func
    return f(get_current_context().obj, *args, **kwargs)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\instawow\cli.py", line 306, in update
    Report(results.items(), filter_results).generate_and_exit()
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\instawow\cli.py", line 91, in generate_and_exit
    self.generate()
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\instawow\cli.py", line 86, in generate
    report = str(self)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\instawow\cli.py", line 72, in __str__
    return '\n'.join(
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\instawow\cli.py", line 74, in <genexpr>
    + fill(r.message, initial_indent=' ' * 2, subsequent_indent=' ' * 4)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\instawow\exceptions.py", line 16, in message
    return self.message_template.format(self=self)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\attributes.py", line 287, in __get__
    return self.impl.get(instance_state(instance), dict_)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\attributes.py", line 718, in get
    value = state._load_expired(state, passive)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\state.py", line 652, in _load_expired
    self.manager.deferred_scalar_loader(self, toload)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\loading.py", line 1008, in load_scalar_attributes
    result = load_on_ident(
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\loading.py", line 201, in load_on_ident
    return load_on_pk_identity(
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\loading.py", line 287, in load_on_pk_identity
    return q.one()
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\query.py", line 3458, in one
    ret = self.one_or_none()
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\query.py", line 3427, in one_or_none
    ret = list(self)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\query.py", line 3503, in __iter__
    return self._execute_and_instances(context)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\query.py", line 3524, in _execute_and_instances
    conn = self._get_bind_args(
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\query.py", line 3539, in _get_bind_args
    return fn(
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\query.py", line 3518, in _connection_from_session
    conn = self.session.connection(**kw)
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\session.py", line 1138, in connection
    return self._connection_for_bind(
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\session.py", line 1146, in _connection_for_bind
    return self.transaction._connection_for_bind(
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\session.py", line 409, in _connection_for_bind
    self._assert_active()
  File "c:\users\jacob\scoop\apps\python\3.8.5\lib\site-packages\sqlalchemy\orm\session.py", line 289, in _assert_active
    raise sa_exc.InvalidRequestError(
sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Original exception was: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
(sqlite3.IntegrityError) UNIQUE constraint failed: pkg_dep.id, pkg_dep.pkg_source, pkg_dep.pkg_id
[SQL: INSERT INTO pkg_dep (id, pkg_source, pkg_id) VALUES (?, ?, ?)]
[parameters: ('327139', 'curse', '335852')]
(Background on this error at: http://sqlalche.me/e/13/gkpj) (Background on this error at: http://sqlalche.me/e/13/7s2a)

Now when I try to update again, I get this error:

PS C:\Users\Jacob> instawow --debug -p classic update
! curse:guidelime-busteas-1-60-leveling
  internal error
! curse:characterstatsclassic
  internal error
! curse:atlaslootclassic
  internal error
! curse:tradeskill-master
  internal error
! curse:deadly-boss-mods
  internal error

These are my installed addons:

PS C:\Users\Jacob> instawow -p classic list
curse:atlaslootclassic
curse:best-in-slot-classic
curse:characterstatsclassic
curse:deadly-boss-mods
curse:guidelime
curse:guidelime-busteas-1-60-leveling
curse:guidelime_sage
curse:omni-cc
curse:pally-power
curse:questie
curse:total-rp-3-classic
curse:tradeskill-master
tukui:2-elvui
wowi:25006-classicauradurations

This is using a non-admin Powershell on Windows 10 19041. Interestingly, updating my retail addons occurred without issue.

Change strategy of installed addon

I'm trying to change the strategy of an installed addon from default to curse_latest_beta (is this even possible?).

I tried for example:

instawow install -o -s curse_latest_beta curse:grid2
✗ curse:grid2
  package already installed

This is possibly a feature or a documentation request.
Btw thanks for the fast fix of the previous issue!

Rollback to nonexistent version deinstalls addon

The "r978-classic" version of grid2 was previously tagged as "r978-beta-classic". If I roll back to "r978-beta-classic" this just leads to grid2 being removed.

Output

instawow rollback curse:grid2
- Select version of curse:grid2 for rollback  r978-beta-classic
✓ curse:grid2
  removed
✗ curse:grid2
  no files compatible with classic using 'version' strategy

Recent update results in error

recently ran an instawow update and now see the following:

Traceback (most recent call last):
  File "/usr/local/bin/instawow", line 8, in <module>
    sys.exit(main())
  File "/home/nayab9/.local/lib/python3.8/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/home/nayab9/.local/lib/python3.8/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/home/nayab9/.local/lib/python3.8/site-packages/click/core.py", line 1257, in invoke
    sub_ctx = cmd.make_context(cmd_name, args, parent=ctx)
  File "/home/nayab9/.local/lib/python3.8/site-packages/click/core.py", line 700, in make_context
    self.parse_args(ctx, args)
  File "/home/nayab9/.local/lib/python3.8/site-packages/click/core.py", line 1048, in parse_args
    value, args = param.handle_parse_result(ctx, opts, args)
  File "/home/nayab9/.local/lib/python3.8/site-packages/click/core.py", line 1630, in handle_parse_result
    value = invoke_param_callback(self.callback, ctx, self, value)
  File "/home/nayab9/.local/lib/python3.8/site-packages/click/core.py", line 123, in invoke_param_callback
    return callback(ctx, param, value)
  File "/home/nayab9/.local/lib/python3.8/site-packages/instawow/cli.py", line 148, in <lambda>
    return lambda c, _, v: fn(c.obj.m, v)
  File "/home/nayab9/.local/lib/python3.8/site-packages/instawow/utils.py", line 108, in __get__
    o.__dict__[self.f.__name__] = v = self.f(o)
  File "/home/nayab9/.local/lib/python3.8/site-packages/instawow/cli.py", line 115, in m
    config = Config.read(self.ctx.params['profile']).ensure_dirs()
  File "/home/nayab9/.local/lib/python3.8/site-packages/instawow/config.py", line 94, in read
    dummy_config.migrate_legacy_dirs()
  File "/home/nayab9/.local/lib/python3.8/site-packages/instawow/config.py", line 137, in migrate_legacy_dirs
    legacy_config = self.parse_raw(legacy_config_file.read_text(encoding='utf-8'))
  File "pydantic/main.py", line 478, in pydantic.main.BaseModel.parse_raw
  File "pydantic/main.py", line 455, in pydantic.main.BaseModel.parse_obj
  File "pydantic/env_settings.py", line 33, in pydantic.env_settings.BaseSettings.__init__
  File "pydantic/main.py", line 346, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for _GlobalConfig
profile
  none is not an allowed value (type=type_error.none.not_allowed)

Instawow is in my $PATH; not sure what is causing this

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.