From b5e69ca18040f135e4c9fa9d9a21a6aa7165a65f Mon Sep 17 00:00:00 2001 From: torkus <48790775+torkus@users.noreply.github.com> Date: Sat, 20 Jul 2024 09:11:41 +0930 Subject: [PATCH] 7.4.0 (#432) * support multiple 'interface' values in .toc files (#430) * toc.clj, introduces 'interface-version-list' field. it contains all possible interface versions parsed from the 'interface' field. * toc.clj, split 'parse-addon-toc' into '-parse-addon-toc'. new private fn is less strict, interpreting and extrapolating values, warning on bad values etc. new fn does validation and discards data if it's invalid. this was done so we don't have to repeat parsing steps elsewhere. * toc.clj, the templated '## # interface' value is now considered and included in the interface-version-list. * github-api.clj, removed duplicated parsing of :interface values in favour of that in toc.clj * github-api.clj, order of extracted gametrack values is now deterministic. * utils, fixed bug in interface-version-to-game-version '110000' was returning '1.0.000' instead of '11.0.0' * toc.clj, fixed bug where data would fail to validate and be discarded. it was possible for multiple distinct interface-version values to become duplicate game tracks values (like [:retail :retail]) * jfx.clj, the 'WoW' (interface version) column now supports multiple values. default column width values increased to accommodate them. * specs.clj, replaces toc :interface-version with :interface-version-list * core.clj, fixed a typo in the import/export logic and the test helper that was using :toc/game-track instead of :-toc/game-track * toc.clj, replaced :-toc/game-track with :-toc/game-track-list * addon.clj, a single set of toc data can now belong to many game tracks this means the first instance of 'classic' toc data (for example) will be used even if multiple toc files support classic. crazy. * tukui, curseforge, removed their 'expand-summary' implementations as they were using :interface-version * jfx.clj, addon data detail pane now accommodates many interface values. * toc.clj, removed a warning when the presence of a game track in the filename doesn't match the game tracks parsed from the data. the user can't really do anything about it, I had at least one false-positive and with many game tracks to now check it seems needlessly expensive. * curseforge, tukui, removes test fixtures referenced by removed code. * catalogue.clj, fixed possibilty of multiple game tracks in toc2summary * specs, source-updates, removes 'release-label' and 'interface-version'. these appear to have been introduced for curseforge and only used there. * deps bump * constants, adds entries for Dragonflight patch releases. * constants, adds entry for The War Within. * replaces references to old wiki with new wiki. * linted --- CHANGELOG.md | 33 + README.md | 6 +- TODO.md | 17 +- manage.sh | 15 - pom.xml | 14 +- project.clj | 12 +- src/strongbox/addon.clj | 10 +- src/strongbox/catalogue.clj | 18 +- src/strongbox/constants.clj | 17 +- src/strongbox/core.clj | 4 +- src/strongbox/curseforge_api.clj | 163 +- src/strongbox/github_api.clj | 19 +- src/strongbox/gitlab_api.clj | 20 +- src/strongbox/jfx.clj | 19 +- src/strongbox/specs.clj | 9 +- src/strongbox/toc.clj | 204 +- src/strongbox/tukui_api.clj | 47 +- src/strongbox/utils.clj | 56 +- test/fixtures/catalogue--v2--curseforge.json | 14 - .../curseforge-api-addon--classic.json | 329 ---- .../curseforge-api-addon--everyaddon.json | 126 -- ...ge-api-addon--everyotheraddon-classic.json | 126 -- ...curseforge-api-addon--everyotheraddon.json | 126 -- .../curseforge-api-addon--new-game-track.json | 619 ------ ...seforge-api-addon--retail-AND-classic.json | 391 ---- .../curseforge-api-addon--retail.json | 329 ---- .../import-export--installed-addons-list.edn | 20 +- .../import-export--tukui-addon-list.json | 16 - .../tukui--addon-details-missing-patch.json | 16 - test/fixtures/tukui--addon-details.json | 16 - test/fixtures/tukui--elvui-addon-proper.json | 19 - test/fixtures/tukui--tukui-addon-proper.json | 19 - test/fixtures/user-catalogue--curseforge.json | 1397 -------------- .../user-catalogue--tukui-classic-tbc.json | 435 ----- .../user-catalogue--tukui-classic.json | 718 ------- test/fixtures/user-catalogue--tukui.json | 1685 ----------------- test/strongbox/addon_test.clj | 191 +- test/strongbox/catalogue_test.clj | 4 +- test/strongbox/cli_test.clj | 50 +- test/strongbox/core_test.clj | 58 +- test/strongbox/curseforge_api_test.clj | 312 +-- test/strongbox/github_api_test.clj | 5 +- test/strongbox/jfx_test.clj | 13 + test/strongbox/test_helper.clj | 24 +- test/strongbox/toc_test.clj | 88 +- test/strongbox/tukui_api_test.clj | 129 +- test/strongbox/utils_test.clj | 56 +- 47 files changed, 636 insertions(+), 7378 deletions(-) delete mode 100644 test/fixtures/catalogue--v2--curseforge.json delete mode 100644 test/fixtures/curseforge-api-addon--classic.json delete mode 100644 test/fixtures/curseforge-api-addon--everyaddon.json delete mode 100644 test/fixtures/curseforge-api-addon--everyotheraddon-classic.json delete mode 100644 test/fixtures/curseforge-api-addon--everyotheraddon.json delete mode 100644 test/fixtures/curseforge-api-addon--new-game-track.json delete mode 100644 test/fixtures/curseforge-api-addon--retail-AND-classic.json delete mode 100644 test/fixtures/curseforge-api-addon--retail.json delete mode 100644 test/fixtures/import-export--tukui-addon-list.json delete mode 100644 test/fixtures/tukui--addon-details-missing-patch.json delete mode 100644 test/fixtures/tukui--addon-details.json delete mode 100644 test/fixtures/tukui--elvui-addon-proper.json delete mode 100644 test/fixtures/tukui--tukui-addon-proper.json delete mode 100644 test/fixtures/user-catalogue--curseforge.json delete mode 100644 test/fixtures/user-catalogue--tukui-classic-tbc.json delete mode 100644 test/fixtures/user-catalogue--tukui-classic.json delete mode 100644 test/fixtures/user-catalogue--tukui.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a843ca7..93f8ef5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,39 @@ All notable changes to this project will be documented in this file. This change The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 7.4.0 - 2024-07-19 + +### Added + +* added support for parsing multiple interface version values from .toc file. + - a single .toc file may now yield multiple possible game tracks (retail, classic, wrath, etc). +* added entries to the known patch list for the recent major Dragonflight patches and The War Within. + +### Changed + +* the WoW column in the GUI now supports displaying multiple game versions (like 8.0, 9.0, 10.0). + - these are derived from interface versions (80000, 90000, 100000). +* the raw data GUI widget in the addon details pane now supports displaying multiple interface versions. +* replaced references to the old wiki with the new wiki (warcraft.wiki.gg). +* bumped dependencies. + +### Fixed + +* fixed a typo in a field name in the import/export logic. +* fixed a bug in the interface-version => game-version logic where 110000 was returned as '1.0.000' instead of '11.0.0'. + +### Removed + +* removed curseforge and tukui test fixtures and the fetching of test fixtures. +* removed support for 'release labels' attached to addon source updates. + - only supported by curseforge and provided a friendlier label for a release than a version number. +* removed more curseforge and tukui logic that was disabled many releases ago. +* removed support for interface versions in .toc files containing non-numeric values. + - for example, "30008a" which used to parse to "3.0.8a". + - the interface version for these alpha and beta releases don't actually have 'a' and 'b' suffixes. + - https://warcraft.wiki.gg/wiki/Patch_3.0.8a + - https://warcraft.wiki.gg/wiki/Patch_8.1.0a + ## 7.3.0 - 2024-04-23 ### Added diff --git a/README.md b/README.md index 89ab1f6f..aa094389 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,7 @@ the same addon directory. If an addon is available for multiple addon systems it * `classic (Cata)` will prefer `classic (Cata)` addons, then `classic (WotLK)`, then `classic (TBC)`, then `classic` then `retail` If uncertain which addon system an installed addon supports, look at the `WoW` column value on the `installed` tab and -compare it to the `Version` value in the list of WoW [public client builds](https://wowpedia.fandom.com/wiki/Public_client_builds). +compare it to the `Version` value in the list of WoW [public client builds](https://warcraft.wiki.gg/wiki/Public_client_builds). ### install addons from URL @@ -413,12 +413,12 @@ Prior to `1.0.0`, Strongbox was known as "wowman". The [AUR package](https://aur Moved here: **https://ogri-la.github.io/wow-addon-managers/** -Last updated: **2023-08-13** +Last updated: **2024-05-07** [Request a change](https://github.com/ogri-la/strongbox-comrades/issues). ## License -Copyright © 2018-2023 Torkus +Copyright © 2018-2024 Torkus Distributed under the GNU Affero General Public Licence, version 3 [with additional permissions](LICENCE.txt#L665) diff --git a/TODO.md b/TODO.md index 28097d71..77297a23 100644 --- a/TODO.md +++ b/TODO.md @@ -6,22 +6,15 @@ see CHANGELOG.md for a more formal list of changes by release ## done -* rename `strongbox` release to `strongbox.AppImage` - - re-submit - - update release scripts - - done - - https://appimage.github.io/strongbox/ - -* update release script - - update references from 'strongbox' to 'strongbox.AppImage' - - done - -* cataclysm classic support - - done +* support multiple interface values +* bump any game versions +* bump any deps ## todo + ## todo bucket (no particular order) +* remove support for parsing templated .toc keyvals: '# ## Key: Value' * gui, 'set-icon' is taking a long time to do it's thing. diff --git a/manage.sh b/manage.sh index b727ac40..ad5d4404 100755 --- a/manage.sh +++ b/manage.sh @@ -74,15 +74,6 @@ elif test "$cmd" = "update-test-fixtures"; then echo "$fname" } - # curseforge - dl "https://www.curseforge.com/wow/addons?filter-sort=name&page=1" "curseforge-addon-summary-listing.html" - - # curseforge api - dl "https://addons-ecs.forgesvc.net/api/v2/addon/327019" "curseforge-api-addon--everyaddon.json" - cp "test/fixtures/curseforge-api-addon--everyaddon.json" "test/fixtures/curseforge-api-addon--everyotheraddon.json" - ## one search result - dl "https://addons-ecs.forgesvc.net/api/v2/addon/search?gameId=1&index=0&pageSize=1&searchFilter=&sort=2" "curseforge-api-search--truncated.json" - # wowinterface dl "https://wowinterface.com/addons.php" "wowinterface-category-list.html" dl "https://www.wowinterface.com/downloads/cat19.html" "wowinterface-category-page.html" @@ -107,12 +98,6 @@ elif test "$cmd" = "update-test-fixtures"; then dl "https://gitlab.com/api/v4/projects/thing-engineering%2Fwowthing%2Fwowthing-collector/repository/blobs/125c899d813d2e11c976879f28dccc2a36fd207b" "gitlab-repo-blobs--wowthing.json" dl "https://gitlab.com/api/v4/projects/woblight%2Fnitro/repository/tree" "gitlab-repo-tree--woblight-nitro.json" - # tukui api - dl "https://www.tukui.org/api.php?addon=98" "tukui--addon-details.json" - dl "https://www.tukui.org/api.php?classic-addon=13" "tukui--classic-addon-details.json" - dl "https://www.tukui.org/api.php?ui=tukui" "tukui--tukui-addon-proper.json" - dl "https://www.tukui.org/api.php?ui=elvui" "tukui--elvui-addon-proper.json" - # user-catalogue dl "https://api.github.com/repos/Stanzilla/AdvancedInterfaceOptions/releases" "user-catalogue--github.json" diff --git a/pom.xml b/pom.xml index 90b6aec4..20da4685 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ogri-la strongbox jar - 7.3.0 + 7.4.0 strongbox World Of Warcraft Addon Manager https://github.com/ogri-la/strongbox @@ -18,7 +18,7 @@ https://github.com/ogri-la/strongbox scm:git:git://github.com/ogri-la/strongbox.git scm:git:ssh://git@github.com/ogri-la/strongbox.git - 86204296a94b4e5b4621bd143daa693f1f4934de + 822521feaf85c7579ac3ecff6eb849e91abbed94 src @@ -78,7 +78,7 @@ org.clojure clojure - 1.11.2 + 1.11.3 org.clojure @@ -108,7 +108,7 @@ clj-http clj-http - 3.12.3 + 3.13.0 clj-commons @@ -128,7 +128,7 @@ org.flatland ordered - 1.15.11 + 1.15.12 clojure.java-time @@ -148,7 +148,7 @@ cljfx cljfx - 1.8.0 + 1.9.0 javafx-web @@ -219,7 +219,7 @@ org.ocpsoft.prettytime prettytime - 5.0.7.Final + 5.0.9.Final org.controlsfx diff --git a/project.clj b/project.clj index dfb2fc04..ef4ec3b6 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject ogri-la/strongbox "7.3.0" +(defproject ogri-la/strongbox "7.4.0" :description "World Of Warcraft Addon Manager" :url "https://github.com/ogri-la/strongbox" :license {:name "GNU Affero General Public License (AGPL)" @@ -11,23 +11,23 @@ ;; https://github.com/technomancy/leiningen/issues/2769 :pedantic? false - :dependencies [[org.clojure/clojure "1.11.2"] + :dependencies [[org.clojure/clojure "1.11.3"] [org.clojure/tools.cli "1.1.230"] ;; cli arg parsing [org.clojure/tools.namespace "1.5.0"] ;; reload code [org.clojure/data.json "2.5.0"] ;; json handling [orchestra "2021.01.01-1"] ;; improved clojure.spec instrumentation ;; see lein deps :tree [com.taoensso/timbre "6.5.0"] ;; logging - [clj-http "3.12.3"] ;; better http slurping + [clj-http "3.13.0"] ;; better http slurping [clj-commons/fs "1.6.311"] ;; file system wrangling [slugify "0.0.1"] [trptcolin/versioneer "0.2.0"] ;; version number wrangling. it's more involved than you might suspect - [org.flatland/ordered "1.15.11"] ;; better ordered map + [org.flatland/ordered "1.15.12"] ;; better ordered map [clojure.java-time "1.4.2"] ;; date/time handling library, https://github.com/dm3/clojure.java-time [envvar "1.1.2"] ;; environment variable wrangling [tolitius/lasync "0.1.25"] ;; better parallel processing - [cljfx "1.8.0" :exclusions [org.openjfx/javafx-web + [cljfx "1.9.0" :exclusions [org.openjfx/javafx-web org.openjfx/javafx-media]] [cljfx/css "1.1.0"] @@ -45,7 +45,7 @@ ;; GPLv3 compatible dependencies. ;; these don't need an exception in LICENCE.txt - [org.ocpsoft.prettytime/prettytime "5.0.7.Final"] ;; Apache 2.0 licenced, pretty date formatting + [org.ocpsoft.prettytime/prettytime "5.0.9.Final"] ;; Apache 2.0 licenced, pretty date formatting [org.controlsfx/controlsfx "11.2.1"] ;; BSD-3 ;; remember to update the LICENCE.txt diff --git a/src/strongbox/addon.clj b/src/strongbox/addon.clj index a095da9b..39a96734 100644 --- a/src/strongbox/addon.clj +++ b/src/strongbox/addon.clj @@ -175,13 +175,13 @@ (logging/with-addon {:dirname (-> addon-dir fs/base-name str)} (let [toc-data-list (toc/parse-addon-toc-guard addon-dir)] (if (= 1 (count toc-data-list)) - ;; whatever toc data we have, we only have 1 of it (normal case), so return that - (-> toc-data-list first (dissoc :-toc/game-track)) + ;; we only have 1 set of .toc data, so return that + (-> toc-data-list first (dissoc :-toc/game-track-list)) - ;; we have multiple sets of toc data to choose from. which to choose? + ;; we have multiple sets of .toc data to choose from. which to choose? ;; prefer the one for the given `game-track`, if it exists, otherwise do as we do with ;; the catalogue and use a list of priorities. - (let [grouped-toc-data (group-by :-toc/game-track toc-data-list) + (let [grouped-toc-data (utils/group-by-coll :-toc/game-track-list toc-data-list) safe-fallback [game-track] priorities (get constants/game-track-priority-map game-track safe-fallback) group (utils/first-nn #(get grouped-toc-data %) priorities)] @@ -193,7 +193,7 @@ (not (apply = group))) (debug (format "multiple sets of different toc data found for %s. using first." game-track))) - (-> group first (dissoc :-toc/game-track))))))) + (-> group first (dissoc :-toc/game-track-list))))))) (defn-spec load-all-installed-addons :addon/toc-list "reads and merges the toc data and the nfo data from *all* addons in the given `install-dir`, groups them and returns the grouped mooshed data." diff --git a/src/strongbox/catalogue.clj b/src/strongbox/catalogue.clj index 42a019e3..843e1efc 100644 --- a/src/strongbox/catalogue.clj +++ b/src/strongbox/catalogue.clj @@ -21,11 +21,11 @@ does *not* support ignoring disabled hosts, see `expand-summary`. returns `nil` when no release found." [addon :addon/expandable, game-track ::sp/game-track] - (let [dispatch-map {"curse" curseforge-api/expand-summary + (let [dispatch-map {;;"curse" curseforge-api/expand-summary ;; 2024-07-15: removed "wowin" wowinterface-api/expand-summary "gitla" gitlab-api/expand-summary "githu" github-api/expand-summary - "tukui" tukui-api/expand-summary + ;;"tukui" tukui-api/expand-summary ;; 2024-07-15: removed nil (fn [_ _] (error "malformed addon:" (utils/pprint addon)))} key (utils/safe-subs (:source addon) 5)] (try @@ -38,9 +38,7 @@ (strongbox.addon/find-pinned-release (assoc addon :release-list release-list))) source-updates (or pinned-release latest-release)] (when source-updates - (-> addon - (merge source-updates {:release-list release-list}) - (dissoc :release-label))))) + (merge addon source-updates {:release-list release-list})))) (catch Exception e (error e (utils/reportable-error "unexpected error attempting to expand addon summary")))))) @@ -104,7 +102,15 @@ syn (if (= (:source toc) "wowinterface") (cond (:installed-game-track toc) (assoc syn :game-track-list [(:installed-game-track toc)]) - (:interface-version toc) (assoc syn :game-track-list [(utils/interface-version-to-game-track (:interface-version toc))]) + + (not (empty? (:interface-version-list toc))) + (assoc syn :game-track-list + (->> toc + :interface-version-list + (map utils/interface-version-to-game-track) + distinct + vec)) + :else sink) syn) diff --git a/src/strongbox/constants.clj b/src/strongbox/constants.clj index 6dc4affc..33df3b6d 100644 --- a/src/strongbox/constants.clj +++ b/src/strongbox/constants.clj @@ -4,18 +4,18 @@ (def release-of-previous-expansion "'Shadowlands', released October 13, 2020. Used to shorten the 'full' catalogue. - https://wowpedia.fandom.com/wiki/Public_client_builds" + https://warcraft.wiki.gg/wiki/Public_client_builds" "2018-08-14T00:00:00Z") (def release-of-wow-classic "the date wow classic went live (addon development may have started before that). Used to guess possible game tracks when it's ambiguous. - https://wowpedia.fandom.com/wiki/Public_client_builds + https://warcraft.wiki.gg/wiki/Public_client_builds https://worldofwarcraft.com/en-us/news/22990080/mark-your-calendars-wow-classic-launch-and-testing-schedule" "2019-08-26T00:00:00Z") ;; used as a placeholder for an addon's supported version when we're forced to guess. ;; don't fret too much about patch versions. These values don't affect much. -;; https://wowpedia.fandom.com/wiki/Public_client_builds +;; https://warcraft.wiki.gg/wiki/Public_client_builds (def latest-retail-game-version "10.0.0") (def latest-classic-game-version "1.14.3") (def latest-classic-tbc-game-version "2.5.4") @@ -87,9 +87,14 @@ (def tukui-cutoff-label "June 1st, 2023") (def releases - "https://wowpedia.fandom.com/wiki/Patch" + "https://warcraft.wiki.gg/wiki/Patch" - {"10.2" "Dragonflight: Guardians of the Dream" + {"11.0.0" "The War Within" + + "10.2.7" "Dragonflight: Dark Heart" + "10.2.6" "Dragonflight: Plunderstorm" + "10.2.5" "Dragonflight: Seeds of Renewal" + "10.2" "Dragonflight: Guardians of the Dream" "10.1" "Dragonflight: Embers of Neltharion" "10.0" "Dragonflight" @@ -108,7 +113,6 @@ "7" "Legion" "6.2" "Warlords of Draenor: Fury of Hellfire" - ;; "6.1" "'Garrisons Update'" ? "6" "Warlords of Draenor" "5.4" "Mists of Pandaria: Siege of Orgrimmar" @@ -129,7 +133,6 @@ "2.4" "The Burning Crusade: Fury of the Sunwell" "2.3" "The Burning Crusade: The Gods of Zul'Aman" - ;; "2.2" "'Voice Chat!'" ? "2.1" "The Burning Crusade: Black Temple" "2" "The Burning Crusade" diff --git a/src/strongbox/core.clj b/src/strongbox/core.clj index 51856299..0d036685 100644 --- a/src/strongbox/core.clj +++ b/src/strongbox/core.clj @@ -1593,8 +1593,8 @@ ;; 2020-06: dirname must be a non-empty string ;; todo: why is dirname needed here? :dirname addon/dummy-dirname - :interface-version constants/default-interface-version - :toc/game-track :retail + :interface-version-list [constants/default-interface-version] + :-toc/game-track-list [:retail] :supported-game-tracks [] :installed-version "0"} addon-list (map #(merge padding %) addon-list) diff --git a/src/strongbox/curseforge_api.clj b/src/strongbox/curseforge_api.clj index dbfd3c8f..b3839482 100644 --- a/src/strongbox/curseforge_api.clj +++ b/src/strongbox/curseforge_api.clj @@ -1,13 +1,9 @@ (ns strongbox.curseforge-api (:require [strongbox - [http :as http] - [specs :as sp] - [utils :as utils :refer [to-json join]]] + [specs :as sp]] [clojure.spec.alpha :as s] - [me.raynes.fs :as fs] - [orchestra.core :refer [defn-spec]] - [taoensso.timbre :as log :refer [debug info warn error spy]])) + [orchestra.core :refer [defn-spec]])) (def curseforge-api "https://addons-ecs.forgesvc.net/api/v2") @@ -15,161 +11,6 @@ [path string?, & args (s/* any?)] (str curseforge-api (apply format path args))) -;; addon expansion - -(defn-spec release-download-url (s/or :ok ::sp/url, :error nil?) - "returns a URL to the release file. - 'https://edge.forgecdn.net/files/1234/567/Addon-v7.8.9.zip'" - [project-file-id int?, project-file-name string?] - (try - (let [project-file-id (str project-file-id) ;; "3164017" - offset (- (count project-file-id) 3) ;; "4" - bit1 (-> project-file-id (.substring 0 offset)) ;; "3164" - bit2 (-> project-file-id (.substring offset) (utils/ltrim "0"))] ;; 17 (strips leading zeroes) - (format "https://edge.forgecdn.net/files/%s/%s/%s" bit1 bit2 project-file-name)) - (catch java.lang.StringIndexOutOfBoundsException e - (warn (format "failed to build a download url for release '%s'" project-file-name))))) - -(defn-spec rename-identical-releases ::sp/list-of-maps - "releases must have unique names otherwise we can't find them in the list of available releases. - This function assigns each release a `:-unique-name` that is either `:projectFileName` or - `:projectFileName` + `projectFileId`." - [release-list ::sp/list-of-maps] - (let [count-occurances (fn [accumulator-m m] - (let [key :projectFileName] - (update accumulator-m (get m key) (fn [x] (inc (or x 0)))))) - occurances (reduce count-occurances {} release-list) ;; {"Foo-v1.zip" 1, "Foo-v2.zip 1, "Foo.zip" 5} - get* #(get %2 %1) - rename-release (fn [release] - (let [[name _] (fs/split-ext (:projectFileName release)) - pid (:projectFileId release)] - (assoc release :-unique-name - (if (-> release :projectFileName (get* occurances) (> 1)) - (format "%s--%s" name pid) ;; "Foo--3084724" - name)))) ;; "Foo" - ] - (mapv rename-release release-list))) - -(defn-spec game-version-flavor-to-game-track ::sp/game-track - "given a curseforge 'gameVersionFlavor' value, returns the equivalent strongbox game track" - [game-version-flavor (s/nilable string?)] - (case game-version-flavor - "wow_retail" :retail - "wow_classic" :classic - "wow_burning_crusade" :classic-tbc - - ;; else - (do (warn (format "unexpected game track '%s', falling back to 'retail'" game-version-flavor)) - :retail))) - -(defn-spec older-releases :addon/release-list - "these are releases under `:gameVersionLatestFiles` that that are the most recent release by game/interface version (8.0.3 etc). - returns only stable releases." - [gameVersionLatestFiles ::sp/list-of-maps] - (let [stable 1 ;; 2 is beta, 3 is alpha - stable-releases #(-> % :fileType (= stable)) - pad-release (fn [release] - (when-let [download-url (release-download-url (:projectFileId release) (:projectFileName release))] - {:download-url download-url - :version (:-unique-name release) ;; see `rename-identical-releases` - :release-label (format "[WoW %s] %s" (:gameVersion release) (:-unique-name release)) - :interface-version (utils/game-version-to-interface-version (:gameVersion release)) - :game-track (game-version-flavor-to-game-track (:gameVersionFlavor release))}))] - - (->> gameVersionLatestFiles - (filter stable-releases) - rename-identical-releases - (map pad-release) - (remove nil?) - vec))) - -(defn-spec extract-release :addon/release-list - "for each release, set the correct value for `:gameVersionFlavor` and `:gameVersion`. - if `:gameVersion` is an empty list, use the value from `:gameVersionFlavor` to come up with a value. - return multiple instances of the release if necessary." - [release map?] - (let [;; "wow_retail", "wow_classic" => :retail, :classic - fallback (game-version-flavor-to-game-track (:gameVersionFlavor release)) - - ;; if the `:gameVersion` value is missing we assume this addon supports the latest version of `:retail` - ;; if we know the `gameVersionFlavor` we can switch that assumption to the latest version of `:classic` - release (if (empty? (:gameVersion release)) - (assoc release :gameVersion [(utils/game-track-to-latest-game-version fallback)]) - release) - - ;; generate a release per-gametrack - pad-release (fn [game-version] - (let [;; api value is empty in some cases (carbonite, improved loot frames, skada damage meter). - ;; this value overrides the one found in .toc files, so if it can't be scraped, use the .toc version. - interface-version (utils/game-version-to-interface-version game-version) - interface-version (when interface-version - {:interface-version interface-version}) - [name _] (fs/split-ext (get release :fileName "null"))] - (merge {:download-url (:downloadUrl release) - :version (:displayName release) - :release-label (format "[WoW %s] %s" (first (:gameVersion release)) name) - :game-track (utils/game-version-to-game-track game-version)} - interface-version))) - - padded-release-list (mapv pad-release (:gameVersion release)) - - ;; 2021-04-02: curseforge is using a `:gameVersionFlavor` of `null` and `2.5.1` as the `:gameVersion` for WoW Classic (BC). - ;; this fn must return a valid `:addon/release-list` and that means `:game-track` cannot be anything other than `:classic` or `:retail`. - ;; so lets remove these releases until we can support them. - unknown-game-track (comp nil? :game-track)] - (vec (remove unknown-game-track padded-release-list)))) - -(defn-spec prune-leading-duplicates (s/or :ok :addon/release-list, :garbage-in nil?) - "curseforge may produce the same release under `:latestFiles` and `:gameVersionLatestFiles`. - remove any `:gameVersionLatestFiles` releases in favour of releases from `:latestFiles`. - because we're duplicating releases by `:game-track`, assume two different releases may share - the same download URL and only call this *after* a game track has been selected." - [release-list (s/nilable :addon/release-list)] - (if (empty? release-list) - nil - (let [[latest-release latest-release-by-game-version] release-list] - (if (= (:download-url latest-release) - (:download-url latest-release-by-game-version)) - (concat [latest-release] (rest (rest release-list))) - release-list)))) - -(defn-spec group-releases map? - "given a curseforge api result, returns a map of release data keyed by `game-track`." - [api-result (s/nilable map?)] - - ;; issue #63: curseforge actually allow a release to be on both retail and classic game tracks. - ;; the single value under `gameVersionFlavor` is *inaccurate and misleading* and we can't trust it. - ;; instead we look at the `gameVersion` list and convert the versions we find there into game tracks. - ;; `8.2.0` and `8.2.5` => `retail` - ;; `1.13.2` => `classic` - - ;; however! `gameVersion` is occasionally *empty* (see Adibags) and we have to guess which game track - ;; this release supports. In these cases we fall back to `:gameVersionFlavor`. - - (let [;; results appear sorted, but lets be sure as we'll be taking the first - desc (comp - compare) ;; most to least recent (desc) - stable 1 ;; 2 is beta, 3 is alpha - stable-release #(-> % :releaseType (= stable)) - concat* #(concat %2 %1) - more-releases (when-let [gameVersionLatestFiles (:gameVersionLatestFiles api-result)] - (older-releases gameVersionLatestFiles))] - (->> api-result - :latestFiles - (sort-by :fileDate desc) - (filter stable-release) - (remove :exposeAsAlternative) ;; no alternative versions, for now - (map extract-release) - flatten - (concat* more-releases) - (group-by :game-track)))) - -(defn-spec expand-summary (s/or :ok :addon/release-list, :error nil?) - "fetches a list of releases from the addon host for the given `addon-summary`" - [addon-summary :addon/expandable, game-track ::sp/game-track] - (let [url (api-url "/addon/%s" (:source-id addon-summary)) - result (some-> url http/download-with-backoff http/sink-error utils/from-json)] - (-> result group-releases (get game-track) prune-leading-duplicates))) - ;; catalogue building (defn-spec parse-user-string (s/or :ok ::sp/url, :error nil?) diff --git a/src/strongbox/github_api.clj b/src/strongbox/github_api.clj index e97bfb5c..4a55e088 100644 --- a/src/strongbox/github_api.clj +++ b/src/strongbox/github_api.clj @@ -192,20 +192,11 @@ (defn-spec -find-gametracks-toc-data (s/or :ok ::sp/game-track-list, :error nil?) "returns a set of game tracks after inspecting .toc file contents" [toc-data map?] - (->> (-> toc-data - ;; hrm: this only allows for two possible game tracks, one normal and one hiding in the template area - ;; 2021-06-10: see release.json - (select-keys [:interface :#interface]) - vals) - - (map utils/to-int) - (map utils/interface-version-to-game-track) - - ;; 2021-05-02: unknown game versions of 2.x (that are now considered "Classic (TBC)") were returning `nil` as the game track. - (remove nil?) - set - vec - utils/nilable)) + (let [use-defaults false] + (-> toc-data + (toc/-parse-addon-toc use-defaults) + :supported-game-tracks + utils/nilable))) (defn-spec find-gametracks-toc-data (s/or :ok ::sp/game-track-list, :error nil?) "returns a set of game tracks after inspecting the .toc file contents" diff --git a/src/strongbox/gitlab_api.clj b/src/strongbox/gitlab_api.clj index dfbf9ad9..803fcc04 100644 --- a/src/strongbox/gitlab_api.clj +++ b/src/strongbox/gitlab_api.clj @@ -190,20 +190,18 @@ "attempts to guess the game track of a [filename blob-url] pair. if the game track can't be guessed from the filename, it downlads the blob and inspects the interface version." [[filename blob-url] (s/coll-of string?)] - (if-let [game-track (utils/guess-game-track filename)] - [game-track] - (do (debug "couldn't guess game track, downloading toc file and inspecting interface version:" filename) - (some->> blob-url - download-decode-blob - (select-keys* [:interface :#interface]) - vals - (map utils/to-int) - (mapv utils/interface-version-to-game-track))))) + (let [game-track (utils/guess-game-track filename) + use-defaults false] + (if game-track + [game-track] + (do (debug "couldn't guess game track, downloading toc file and inspecting interface version:" filename) + (some-> blob-url + download-decode-blob + (toc/-parse-addon-toc use-defaults) + :supported-game-tracks))))) (defn-spec guess-game-track-list (s/or :ok ::sp/game-track-list, :error nil?) "attempts to guess the game tracks an addon may support. - if multiple toc files exist it assumes they are being used for classic versions of the game. - if only a single toc file exists, it downloads and inspects the `:interface` value in the toc file. if no toc files are found it returns `nil`." [source-id :addon/source-id] (->> source-id diff --git a/src/strongbox/jfx.clj b/src/strongbox/jfx.clj index fb697178..152acb86 100644 --- a/src/strongbox/jfx.clj +++ b/src/strongbox/jfx.clj @@ -1223,6 +1223,15 @@ :on-action (handler #(utils/browse-to (format "%s/%s" (core/selected-addon-dir) dirname))) :text "↪ browse local files"})) +(defn-spec addon-game-version-list-string (s/or :ok string?, :err nil?) + "returns the list of game versions an addon supports as a string." + [row (s/nilable map?)] + (some->> row + :interface-version-list ;; [80000, 100000] + (map utils/interface-version-to-game-version) ;; [8.0, 10.0] + distinct + (clojure.string/join " | "))) ;; "8.0 | 10.0" + (defn gui-column-map "list of columns for the installed-addons-table that needs to be separately defined so a menu can be built. called with no arguments, the various attached functions will probably fail." @@ -1351,11 +1360,11 @@ :cell-value-factory cli/available-versions-v2} :game-version {:text "WoW" :menu-label "game version (WoW)" - :min-width 70 :pref-width 70 :max-width 100 + :min-width 70 :pref-width 140 :max-width 210 :cell-value-factory identity :cell-factory {:fx/cell-type :tree-table-cell :describe (fn [row] - (let [text (some-> row :interface-version str utils/interface-version-to-game-version) + (let [text (addon-game-version-list-string row) text (if-not (string? text) "" text)] {:graphic {:fx/type fx.ext.node/with-tooltip-props :props {:tooltip {:fx/type :tooltip @@ -1676,7 +1685,7 @@ the release data for a selected release in `release-list`." [addon :addon/expanded] (mapv (fn [release] - (menu-item (or (:release-label release) (:version release)) + (menu-item (:version release) (async-handler (juxt (partial cli/set-version addon release) clear-table-selected-items)))) (:release-list addon))) @@ -2308,7 +2317,7 @@ blacklist [:group-addons :release-list :source-map-list] sanitised (apply dissoc addon blacklist) - transformations {:interface-version str} + transformations {:interface-version-list #(clojure.string/join ", " %)} sanitised (apply (fn [[k vfn]] (if (k addon) (update sanitised k vfn) addon)) transformations) @@ -2393,7 +2402,7 @@ "install") (async-handler #(cli/set-version addon release))))) column-list [{:text "" :style-class ["wide-button-column"] :min-width 120 :pref-width 120 :max-width 120 :resizable false :cell-value-factory install-button} - {:text "name" :cell-value-factory #(or (:release-label %) (:version %))}] + {:text "name" :cell-value-factory :version}] row-list (or (:release-list addon) []) disabled? (not (addon/releases-visible? addon))] {:fx/type :border-pane diff --git a/src/strongbox/specs.clj b/src/strongbox/specs.clj index 58c0cc8a..0e3e0e1a 100644 --- a/src/strongbox/specs.clj +++ b/src/strongbox/specs.clj @@ -44,6 +44,7 @@ (s/def ::gte-zero #(and (number? %) (>= % 0))) +(s/def ::list-of-ints (s/coll-of int?)) (s/def ::list-of-strings (s/coll-of string?)) (s/def ::list-of-maps (s/coll-of map?)) (s/def ::list-of-keywords (s/coll-of keyword?)) @@ -121,9 +122,9 @@ (s/def ::update? boolean?) (s/def ::interface-version (and int? (fn [interface-version] (>= interface-version 10000)))) ;; 90005, 11307, 20501 +(s/def ::interface-version-list (s/coll-of ::interface-version)) (s/def ::name string?) ;; normalised name of the addon, shared between toc file and curseforge (s/def ::label string?) ;; name of the addon without normalisation -(s/def ::release-label ::label) (s/def ::latest-strongbox-release (s/or :set string? :not-set nil? :failed keyword?)) @@ -290,7 +291,7 @@ ::label ::description ::dirname - ::interface-version + ::interface-version-list ::installed-version :addon/supported-game-tracks] :opt-un [::dirsize ;; not present on error during calculation. zero during testing. @@ -377,9 +378,7 @@ (s/def :addon/source-updates (s/keys :req-un [::version ::download-url - ::game-track] - :opt-un [::interface-version - ::release-label])) + ::game-track])) (s/def :addon/release-list (s/coll-of :addon/source-updates)) diff --git a/src/strongbox/toc.clj b/src/strongbox/toc.clj index b441f50a..ba41b74c 100644 --- a/src/strongbox/toc.clj +++ b/src/strongbox/toc.clj @@ -98,105 +98,129 @@ [label string?] (-> label lower-case rm-trailing-version utils/slugify)) +(defn-spec parse-interface-value (s/or :ok ::sp/list-of-ints) + "parses a '# Interface' value which may be a single integer or a comma separated list of integers." + [val (s/or :ok string?, :supported int?, :noop nil?)] + (cond + (nil? val) [] + (int? val) [val] + :else (some->> (clojure.string/split val #",") + (map clojure.string/trim) + (map utils/to-int) + (remove nil?) + distinct + vec))) + ;; +(defn-spec -parse-addon-toc map? + "parses raw `keyvals` map, interpreting and extrapolating values, issuing warnings, etc" + [keyvals map?, use-defaults boolean?] + (let [dirname (:dirname keyvals) + no-label-label (str dirname " *") ;; "EveryAddon *" + label (:title keyvals) + label (if (empty? label) + (do (warn "addon with no \"Title\" value found:" dirname) + (when use-defaults + no-label-label)) + label) + + wowi-source (when-let [x-wowi-id (-> keyvals :x-wowi-id utils/to-int)] + {:source "wowinterface" + :source-id x-wowi-id}) + + ;;curse-source (when-let [x-curse-id (-> keyvals :x-curse-project-id utils/to-int)] + ;; {:source "curseforge" + ;; :source-id x-curse-id}) + + ;;tukui-source (when-let [x-tukui-id (-> keyvals :x-tukui-projectid utils/to-int)] + ;; {:source "tukui" + ;; :source-id x-tukui-id}) + + github-source (when-let [x-github (-> keyvals :x-github)] + {:source "github" + :source-id (utils/github-url-to-source-id x-github)}) + + github-website-source (when-let [x-website (-> keyvals :x-website)] + (when (and (not github-source) + (.startsWith x-website "https://github.com")) + {:source "github" + :source-id (utils/github-url-to-source-id x-website)})) + + source-map-list (when-let [items (->> [wowi-source github-source github-website-source + ;;curse-source tukui-source + ] + utils/items + utils/nilable)] + {:source-map-list items}) + + ignore-flag (when (some->> keyvals :version (clojure.string/includes? "@project-version@")) + (debug (format "ignoring '%s': 'Version' field in .toc file is unrendered" dirname)) + {:ignore? true}) + + ;; todo: warning when interface version not defined. + + interface-version-list (vec + (distinct + (into (some-> keyvals :interface parse-interface-value) + (some-> keyvals :#interface parse-interface-value)))) + interface-version-list (if (empty? interface-version-list) + (if use-defaults + [constants/default-interface-version] + []) + interface-version-list) + + ;; note: even after the `distinct` above, it's still possible for the derived game tracks to be duplicates + game-track-list (vec (distinct (mapv utils/interface-version-to-game-track interface-version-list))) + + addon {:name (when label (normalise-name label)) + :dirname dirname + :label label + ;; `:notes` is preferred but we'll fall back to `:description` + :description (or (:notes keyvals) (:description keyvals)) + :interface-version-list interface-version-list + + ;; `:-toc/game-track-list` is used to group .toc files later to determine which set + ;; of data to use for the selected game track before being disassociated. + :-toc/game-track-list game-track-list + + ;; replaced in `parse-addon-toc-guard` when *all* .toc files have been parsed. + :supported-game-tracks game-track-list + + :installed-version (:version keyvals) + + ;; toc file dependency values describe *load order*, not *packaging* + ;;:dependencies (:dependencies keyvals) + ;;:optional-dependencies (:optionaldependencies keyvals) + ;;:required-dependencies (:requireddeps keyvals) + } + + addon (if-let [dirsize (:dirsize keyvals)] + (assoc addon :dirsize dirsize) + addon) + + ;; prefers wowi over github and github over github-via-website. + ;; I'd like to prefer github over wowi, but github requires API calls to interact with and these are limited unless authenticated. + addon (merge addon + github-website-source github-source wowi-source + ;; curse-source tukui-source + ignore-flag source-map-list)] + addon)) + (defn-spec parse-addon-toc (s/or :ok :addon/toc, :invalid nil?) "coerces raw `keyvals` map into a valid `:addon/toc` map or returns `nil` if toc data is invalid." ([keyvals map?, addon-dir ::sp/dir] (parse-addon-toc (assoc keyvals :dirname (fs/base-name addon-dir)))) ([keyvals map?] - (let [dirname (:dirname keyvals) - no-label-label (str dirname " *") ;; "EveryAddon *" - label (:title keyvals) - label (if (empty? label) - (do (warn "addon with no \"Title\" value found:" dirname) - no-label-label) - label) - - wowi-source (when-let [x-wowi-id (-> keyvals :x-wowi-id utils/to-int)] - {:source "wowinterface" - :source-id x-wowi-id}) - - ;;curse-source (when-let [x-curse-id (-> keyvals :x-curse-project-id utils/to-int)] - ;; {:source "curseforge" - ;; :source-id x-curse-id}) - - ;;tukui-source (when-let [x-tukui-id (-> keyvals :x-tukui-projectid utils/to-int)] - ;; {:source "tukui" - ;; :source-id x-tukui-id}) - - github-source (when-let [x-github (-> keyvals :x-github)] - {:source "github" - :source-id (utils/github-url-to-source-id x-github)}) - - github-website-source (when-let [x-website (-> keyvals :x-website)] - (when (and (not github-source) - (.startsWith x-website "https://github.com")) - {:source "github" - :source-id (utils/github-url-to-source-id x-website)})) - - source-map-list (when-let [items (->> [wowi-source github-source github-website-source - ;;curse-source tukui-source - ] - utils/items - utils/nilable)] - {:source-map-list items}) - - ignore-flag (when (some->> keyvals :version (clojure.string/includes? "@project-version@")) - (debug (format "ignoring '%s': 'Version' field in .toc file is unrendered" dirname)) - {:ignore? true}) - - ;; todo: warning when interface version not defined. - interface-version (or (some-> keyvals :interface utils/to-int) - constants/default-interface-version) - - game-track (utils/interface-version-to-game-track interface-version) - - _ (when (and (some? (:-filename-game-track keyvals)) - (not= (:-filename-game-track keyvals) game-track)) - (debug (format - ;; 'classic' in .toc filename does not match 'retail' derived from it's 'Interface' value of '90200'. - ;; see BigWigs_Classic for a false-positive - "'%s' in .toc filename does not match '%s' derived from it's 'Interface' value of '%s'." - (name (:-filename-game-track keyvals)) (name game-track) interface-version))) - - addon {:name (normalise-name label) - :dirname dirname - :label label - ;; `:notes` is preferred but we'll fall back to `:description` - :description (or (:notes keyvals) (:description keyvals)) - :interface-version interface-version - :-toc/game-track game-track - - ;; expanded upon in `parse-addon-toc-guard` when it knows about *all* available toc files - :supported-game-tracks [game-track] - - :installed-version (:version keyvals) - - ;; toc file dependency values describe *load order*, not *packaging* - ;;:dependencies (:dependencies keyvals) - ;;:optional-dependencies (:optionaldependencies keyvals) - ;;:required-dependencies (:requireddeps keyvals) - } - - addon (if-let [dirsize (:dirsize keyvals)] - (assoc addon :dirsize dirsize) - addon) - - ;; prefers wowi over github and github over github-via-website. - ;; I'd like to prefer github over wowi, but github requires API calls to interact with and these are limited unless authenticated. - addon (merge addon - github-website-source github-source wowi-source - ;; curse-source tukui-source - ignore-flag source-map-list)] - - (if-not (s/valid? :addon/toc addon) + (let [use-defaults true + addon (-parse-addon-toc keyvals use-defaults)] + (if (s/valid? :addon/toc addon) + addon (do (warn (utils/reportable-error ;; "ignoring data in 'EveryAddon.toc', invalid values found." (format "ignoring data in '%s', invalid values found." (:-filename keyvals)) "feel free to report this!")) - (debug (s/explain :addon/toc addon))) - addon)))) + (debug (s/explain :addon/toc addon))))))) (defn-spec blizzard-addon? boolean? "returns `true` if given path looks like an official Blizzard addon" @@ -209,12 +233,10 @@ (when-not (blizzard-addon? addon-dir) (try (let [result (->> addon-dir read-addon-dir (map parse-addon-toc) (remove nil?)) - supported-game-tracks (->> result (map :-toc/game-track) distinct sort vec)] + supported-game-tracks (->> result (map :-toc/game-track-list) flatten distinct sort vec)] (mapv #(assoc % :supported-game-tracks supported-game-tracks) result)) (catch Exception e ;; this addon failed to parse somehow. don't propagate the exception, just report it and return `nil`. (error e (utils/reportable-error ;; "unexpected error parsing addon in directory '/path/to/addon': Some obscure exception message." (format "unexpected error parsing addon in directory '%s': %s" addon-dir (.getMessage e)))))))) - -;; -- diff --git a/src/strongbox/tukui_api.clj b/src/strongbox/tukui_api.clj index 755b97fa..0969b8c8 100644 --- a/src/strongbox/tukui_api.clj +++ b/src/strongbox/tukui_api.clj @@ -5,28 +5,20 @@ [orchestra.core :refer [defn-spec]] ;;[taoensso.timbre :as log :refer [debug info warn error spy]] [strongbox - [http :as http] [utils :as utils] [specs :as sp]])) -(def summary-list-url "https://www.tukui.org/api.php?addons") -(def classic-summary-list-url "https://www.tukui.org/api.php?classic-addons") -(def classic-tbc-summary-list-url "https://www.tukui.org/api.php?classic-tbc-addons") -(def classic-wotlk-summary-list-url "https://www.tukui.org/api.php?classic-wotlk-addons") - -(def proper-url "https://www.tukui.org/api.php?ui=%s") - (defn-spec make-url (s/nilable ::sp/url) "given a map of addon data, returns a URL to the addon's tukui page or `nil`" - [{:keys [name source-id interface-version]} map?] + [{:keys [name source-id interface-version-list]} map?] (cond (not source-id) nil (and (neg? source-id) name) (str "https://www.tukui.org/download.php?ui=" name) - (and (pos? source-id) interface-version) - (case (utils/interface-version-to-game-track interface-version) + (and (pos? source-id) (not (empty? interface-version-list))) + (case (utils/interface-version-to-game-track (first interface-version-list)) :retail (str "https://www.tukui.org/addons.php?id=" source-id) :classic (str "https://www.tukui.org/classic-addons.php?id=" source-id) :classic-tbc (str "https://www.tukui.org/classic-tbc-addons.php?id=" source-id) @@ -35,39 +27,6 @@ :else nil)) -(defn-spec expand-summary (s/or :ok :addon/release-list, :error nil?) - "fetches a list of releases from the addon host for the given `addon-summary`" - [addon :addon/expandable, game-track ::sp/game-track] - (let [source-id (:source-id addon) - source-id-str (str source-id) - - url (cond - (neg? source-id) (format proper-url (:name addon)) - (= game-track :retail) summary-list-url - (= game-track :classic) classic-summary-list-url - (= game-track :classic-tbc) classic-tbc-summary-list-url - (= game-track :classic-wotlk) classic-wotlk-summary-list-url) - - ;; tukui addons do not share IDs across game tracks like curseforge does. - ;; 2020-12-02: Tukui has dropped the per-addon endpoint, all results are now lists of items - addon-list (some-> url http/download-with-backoff utils/nilable http/sink-error utils/from-json) - addon-list (if (sequential? addon-list) - addon-list - (-> addon-list (update :id str) vector)) - - ti (->> addon-list (filter #(= source-id-str (:id %))) first) - - patch (:patch ti) - interface-version (cond - (nil? patch) {} - (= patch "All") {:interface-version (utils/game-version-to-interface-version (utils/game-track-to-latest-game-version game-track))} - :else {:interface-version (utils/game-version-to-interface-version patch)})] - (when ti - [(merge {:download-url (:url ti) - :version (:version ti) - :game-track game-track} - interface-version)]))) - (defn-spec parse-user-string (s/or :ok :addon/source-id, :error nil?) "extracts the addon ID from the given `url`, handling the edge cases of for retail tukui and elvui" [url ::sp/url] diff --git a/src/strongbox/utils.clj b/src/strongbox/utils.clj index e8abe3c5..f698e435 100644 --- a/src/strongbox/utils.clj +++ b/src/strongbox/utils.clj @@ -285,27 +285,27 @@ (defn-spec to-int (s/or :ok int?, :error nil?) "given any value `x`, converts it to an integer or returns `nil` if it can't be converted." [x any?] - (if (int? x) - x - (try (Integer/valueOf (str x)) - (catch NumberFormatException nfe - nil)))) + (cond + (nil? x) x + (int? x) x + :else (try (Integer/valueOf (str x)) + (catch NumberFormatException nfe + nil)))) (defn-spec slugify string? [string string?] (sluglib/slugify string)) (defn-spec interface-version-to-game-version (s/or :ok string?, :no-match nil?) + "'10000' => 1.0.0, '100000' => 10.0.0, '102010' => 10.2.1" [iface-version (s/or :deprecated string?, :ok int?)] - ;; warning! there is no way to convert *unambiguously* between the 'patch level' and the 'interface version' - ;; for example, patch "1.2.0" => "10200", but so does "1.20.0" => "10200" - ;; there haven't been any minor versions >4 since MOP - ;; we'll hit 10.0 soon enough (we're at 8.x at time of writing) so what then? "10.0.1" => "10000" is another collision - ;; the below code should only be considered unambigous for versions of WoW between 2.x and 8.x - ;; (and 9.x if that series follows the behaviour of all other patch levels since 2.x) - ;; see: https://wow.gamepedia.com/Patches - (let [iface-regex #"(?\d0|\d{1})\d(?\d{1})\d(?\d{1}\w?)" - matcher (re-matcher iface-regex (str iface-version)) + (let [iface-version (if (int? iface-version) + (str iface-version) + iface-version) + iface-regex (if (= (.length iface-version) 5) + #"(?\d{1})\d(?\d{1})\d(?\d)" + #"(?\d{2})\d(?\d{1})\d(?\d)") + matcher (re-matcher iface-regex iface-version) major-minor-patch (rest (re-find matcher))] (when-not (empty? major-minor-patch) (clojure.string/join "." major-minor-patch)))) @@ -808,15 +808,17 @@ (recur (+ waited# -with-lock-wait-retry-time))))))) (defn-spec patch-name (s/or :ok string?, :not-found nil?) - "returns the 'patch' name for the given `game-version`, considering only the major and minor values. - if a precise match is not found, the major version is then considered. - if a major version is not found, nil is returned. + "returns the 'patch' name for the given `game-version`. + if an exact match for `major.minor.patch` is not found then `major.minor` is considered. + if a match for `major.minor` is not found, then only `major` is considered. + if a match for `major` is not found, `nil` is returned. For example, 9.2.5 has no patch name, but 9.2 is 'Shadowlands: Eternity's End'" [game-version string?] - (let [[major, minor] (clojure.string/split game-version #"\.") - major-minor (clojure.string/join "." [major minor])] - (or (get constants/releases major-minor) - (get constants/releases major)))) + (or (get constants/releases game-version) + (let [[major, minor] (clojure.string/split game-version #"\.") + major-minor (clojure.string/join "." [major minor])] + (or (get constants/releases major-minor) + (get constants/releases major))))) (defmacro compile-time-slurp "slurps given `resource` file at macro-expansion (compile) time." @@ -934,3 +936,15 @@ (boolean? v) (-> v str clojure.string/capitalize) (keyword? v) (name v) :else (str v))) + +(defn group-by-coll + "groups a collection of maps by a collection within each map using the given `kw`, + replacing the map's `kw` with the grouped value. + for example, [{:a [1]}, {:b [1 2]}] => {:1 [{:a 1} {:b 1}] :2 [{:b 2}]}" + [kw coll-of-maps] + (group-by kw + (apply concat ;; shallow flatten + (for [row coll-of-maps] + (for [v (kw row)] + (assoc row kw v)))))) + diff --git a/test/fixtures/catalogue--v2--curseforge.json b/test/fixtures/catalogue--v2--curseforge.json deleted file mode 100644 index d45cea56..00000000 --- a/test/fixtures/catalogue--v2--curseforge.json +++ /dev/null @@ -1,14 +0,0 @@ -{"spec":{"version":2}, - "datestamp":"2020-05-27", - "total":1, - "addon-summary-list": - [{"created-date":"2019-04-13T15:23:09.397Z", - "description":"A New Simple Percent", - "download-count":1562, - "label":"A New Simple Percent", - "name":"a-new-simple-percent", - "source":"curseforge", - "source-id":319346, - "tag-list":["unit-frames"], - "updated-date":"2015-10-29T22:47:42.463Z", - "url":"https://www.curseforge.com/wow/addons/a-new-simple-percent"}]} diff --git a/test/fixtures/curseforge-api-addon--classic.json b/test/fixtures/curseforge-api-addon--classic.json deleted file mode 100644 index abe90715..00000000 --- a/test/fixtures/curseforge-api-addon--classic.json +++ /dev/null @@ -1,329 +0,0 @@ -{ - "id": 4646, - "name": "Pawn", - "authors": [ - { - "name": "TravisSpomer", - "url": "https://www.curseforge.com/members/127788-travisspomer?username=travisspomer", - "projectId": 4646, - "id": 70193, - "projectTitleId": null, - "projectTitleTitle": null, - "userId": 127788, - "twitchId": 102465511 - } - ], - "attachments": [ - { - "id": 229261, - "projectId": 4646, - "description": "", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/229/261/256/256/637054162513412977.jpeg", - "title": "637054162513412977.jpeg", - "url": "https://media.forgecdn.net/avatars/229/261/637054162513412977.jpeg", - "status": 1 - }, - { - "id": 241286, - "projectId": 4646, - "description": "", - "isDefault": true, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/241/286/256/256/637126762505530549.jpeg", - "title": "637126762505530549.jpeg", - "url": "https://media.forgecdn.net/avatars/241/286/637126762505530549.jpeg", - "status": 1 - }, - { - "id": 61157, - "projectId": 4646, - "description": "", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/61/157/256/256/636141608867724105.jpg", - "title": "636141608867724105.jpg", - "url": "https://media.forgecdn.net/avatars/61/157/636141608867724105.jpg", - "status": 1 - }, - { - "id": 102344, - "projectId": 4646, - "description": "

The loot upgrade advisor helps you know when you should roll on an item that drops in a dungeon right away.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/344/310/172/Loot_upgrade_advisor.jpg", - "title": "Loot_upgrade_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/344/Loot_upgrade_advisor.jpg", - "status": 1 - }, - { - "id": 102336, - "projectId": 4646, - "description": "

You can use Pawn to quickly evaluate upgrades in AtlasLoot (and other loot mods) and build up your wish lists.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/336/310/172/Pawn_-_AtlasLoot.png", - "title": "Pawn_-_AtlasLoot.png", - "url": "https://media.forgecdn.net/attachments/102/336/Pawn_-_AtlasLoot.png", - "status": 1 - }, - { - "id": 200060, - "projectId": 4646, - "description": "Pawn 2.2 helps you find relic upgrades for your artifact weapons, regardless of which spec you're in.", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/200/60/310/172/relic-upgrades.jpg", - "title": "Relic upgrades", - "url": "https://media.forgecdn.net/attachments/200/60/relic-upgrades.jpg", - "status": 1 - }, - { - "id": 102337, - "projectId": 4646, - "description": "

Pawn's in ur tooltipz helpin u decide what 2 spend ur dkp on

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/337/310/172/Pawn_-_tooltips.png", - "title": "Pawn_-_tooltips.png", - "url": "https://media.forgecdn.net/attachments/102/337/Pawn_-_tooltips.png", - "status": 1 - }, - { - "id": 102333, - "projectId": 4646, - "description": "

Pawn integrates with the new bag arrows feature in WoW 7.1 to help you find upgrades to your gear, even if they're not just a higher item level.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/333/310/172/Bag_arrows.jpg", - "title": "Bag_arrows.jpg", - "url": "https://media.forgecdn.net/attachments/102/333/Bag_arrows.jpg", - "status": 1 - }, - { - "id": 102338, - "projectId": 4646, - "description": "

Pawn tells you which gems of each color are best for each of your specs.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/338/310/172/Pawn_-_gems.png", - "title": "Pawn_-_gems.png", - "url": "https://media.forgecdn.net/attachments/102/338/Pawn_-_gems.png", - "status": 1 - }, - { - "id": 102345, - "projectId": 4646, - "description": "

Pawn lets you customize your tooltips the way you like them.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/345/310/172/Pawn_options.jpg", - "title": "Pawn_options.jpg", - "url": "https://media.forgecdn.net/attachments/102/345/Pawn_options.jpg", - "status": 1 - }, - { - "id": 102346, - "projectId": 4646, - "description": "

Pawn can tell you which gems will maximize an item's value for a specific purpose. It's smart enough to know when to keep socket bonuses and when to ignore them. It selects a gem quality level appropriate for the item level of the armor or weapon y...", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/346/310/172/Pawn_1.7_socketing_advisor.jpg", - "title": "Pawn_1.7_socketing_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/346/Pawn_1.7_socketing_advisor.jpg", - "status": 1 - }, - { - "id": 102335, - "projectId": 4646, - "description": "

Pawn 2.0 still lets you fully customize what it suggests, including turning on multiple specs, importing stat weights from the internet, or starting from scratch.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/335/310/172/Pawn_manual_mode.jpg", - "title": "Pawn_manual_mode.jpg", - "url": "https://media.forgecdn.net/attachments/102/335/Pawn_manual_mode.jpg", - "status": 1 - }, - { - "id": 102334, - "projectId": 4646, - "description": "

Pawn 2.0 will automatically select the scale for your current spec, so by default it will just give you suggestions for the way you're currently playing.  The simplified no-hassle annotations on your tooltips make it easy to see at a glance...", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/334/310/172/Pawn_auto_mode.jpg", - "title": "Pawn_auto_mode.jpg", - "url": "https://media.forgecdn.net/attachments/102/334/Pawn_auto_mode.jpg", - "status": 1 - }, - { - "id": 102347, - "projectId": 4646, - "description": "

Pawn's Compare tab.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/347/310/172/Pawn_s_Compare_tab.jpg", - "title": "Pawn_s_Compare_tab.jpg", - "url": "https://media.forgecdn.net/attachments/102/347/Pawn_s_Compare_tab.jpg", - "status": 1 - }, - { - "id": 102341, - "projectId": 4646, - "description": "

Pawn lets you create your own valuation scales with whatever stat values you like.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/341/310/172/Pawn_-_values.png", - "title": "Pawn_-_values.png", - "url": "https://media.forgecdn.net/attachments/102/341/Pawn_-_values.png", - "status": 1 - }, - { - "id": 102339, - "projectId": 4646, - "description": "

Find upgrades for your alts' gear at the auction house using Pawn.  You can immediately see which items have a better combination of stats.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/339/310/172/Pawn_-_auctions.jpg", - "title": "Pawn_-_auctions.jpg", - "url": "https://media.forgecdn.net/attachments/102/339/Pawn_-_auctions.jpg", - "status": 1 - }, - { - "id": 102343, - "projectId": 4646, - "description": "

Pawn's quest advisor makes it easy to see which quest rewards are upgrades to your gear, or which useless item is worth the most money.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/343/310/172/Pawn_quest_advisor.jpg", - "title": "Pawn_quest_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/343/Pawn_quest_advisor.jpg", - "status": 1 - }, - { - "id": 102332, - "projectId": 4646, - "description": "

Starting with version 2.1, Pawn now includes custom advice for all 36 specs from Mr. Robot himself.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/332/310/172/AMR.jpg", - "title": "AMR.jpg", - "url": "https://media.forgecdn.net/attachments/102/332/AMR.jpg", - "status": 1 - } - ], - "websiteUrl": "https://www.curseforge.com/wow/addons/pawn", - "gameId": 1, - "summary": "Pawn helps you compare items and find upgrades.", - "defaultFileId": 3104060, - "downloadCount": 41474151, - "latestFiles": [ - { - "id": 3104060, - "displayName": "2.4.5 (Classic)", - "fileName": "Pawn-2.4.5-Classic.zip", - "fileDate": "2020-11-06T20:46:49.923Z", - "fileLength": 767568, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3104/60/Pawn-2.4.5-Classic.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Pawn", - "fingerprint": 2323297791, - "type": 3 - } - ], - "packageFingerprint": 3121052537, - "gameVersion": [ - "1.13.5" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000001.0000000013.0000000005", - "gameVersion": "1.13.5", - "gameVersionReleaseDate": "2020-07-07T00:00:00Z", - "gameVersionName": "1.13.5" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2044631, - "fileLegacyMappingId": null, - "projectId": 4646, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 549342193, - "gameVersionDateReleased": "2020-07-07T00:00:00Z", - "gameVersionMappingId": 2518413, - "gameVersionId": 7957, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_classic" - } - ], - "categories": [ - { - "categoryId": 1009, - "name": "Bags & Inventory", - "url": "https://www.curseforge.com/wow/addons/bags-inventory", - "avatarUrl": "https://media.forgecdn.net/avatars/54/445/636135209663914354.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54445, - "gameId": 1 - }, - { - "categoryId": 1013, - "name": "Quests & Leveling", - "url": "https://www.curseforge.com/wow/addons/quests-leveling", - "avatarUrl": "https://media.forgecdn.net/avatars/54/449/636135209685443713.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54449, - "gameId": 1 - }, - { - "categoryId": 1055, - "name": "Tooltip", - "url": "https://www.curseforge.com/wow/addons/tooltip", - "avatarUrl": "https://media.forgecdn.net/avatars/54/459/636135209747227110.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54459, - "gameId": 1 - } - ], - "status": 4, - "primaryCategoryId": 1009, - "categorySection": { - "id": 1, - "gameId": 1, - "name": "Addons", - "packageType": 1, - "path": "Interface\\Addons", - "initialInclusionPattern": "(?i)^([^/]+)[\\\\/]\\1\\.toc$", - "extraIncludePattern": "(?i)^[^/\\\\]+[/\\\\]Bindings\\.xml$", - "gameCategoryId": 1 - }, - "slug": "pawn", - "gameVersionLatestFiles": [ - { - "gameVersion": "1.13.5", - "projectFileId": 3104060, - "projectFileName": "Pawn-2.4.5-Classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - } - ], - "isFeatured": false, - "popularityScore": 114915.8125, - "gamePopularityRank": 6, - "primaryLanguage": "enUS", - "gameSlug": "wow", - "gameName": "World of Warcraft", - "portalName": "www.curseforge.com", - "dateModified": "2020-11-06T20:56:32.41Z", - "dateCreated": "2008-01-14T07:05:01Z", - "dateReleased": "2020-11-06T20:47:12.92Z", - "isAvailable": true, - "isExperiemental": false -} diff --git a/test/fixtures/curseforge-api-addon--everyaddon.json b/test/fixtures/curseforge-api-addon--everyaddon.json deleted file mode 100644 index 49e833b8..00000000 --- a/test/fixtures/curseforge-api-addon--everyaddon.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "id": 1, - "name": "Every Addon", - "authors": [ - { - "name": "torkus", - "url": "https://www.curseforge.com/members/1-torkus?username=torkus", - "projectId": 1, - "id": 1, - "projectTitleId": null, - "projectTitleTitle": null, - "userId": 1, - "twitchId": 1 - } - ], - "attachments": [], - "websiteUrl": "https://www.curseforge.com/wow/addons/every-addon", - "gameId": 1, - "summary": "Does what no other addon does, slightly differently", - "defaultFileId": 1, - "downloadCount": 1, - "latestFiles": [ - { - "id": 1, - "displayName": "v8.2.0-v1.13.2-7135.139", - "fileName": "EveryAddon-v8.2.0-v1.13.2-7135.139.zip", - "fileDate": "2019-07-11T11:13:39.763Z", - "fileLength": 1, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/1/1/EveryAddon.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "EveryAddon", - "fingerprint": 1, - "type": 3 - } - ], - "packageFingerprint": 1, - "gameVersion": [ - "8.0.1" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000008.0000000000.0000000001", - "gameVersion": "8.0.1", - "gameVersionReleaseDate": "2018-07-17T00:00:00Z", - "gameVersionName": "8.0.1" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 1, - "fileLegacyMappingId": null, - "projectId": 1, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 1, - "gameVersionDateReleased": "2001-01-01T00:00:00Z", - "gameVersionMappingId": 1, - "gameVersionId": 7350, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - } - ], - "categories": [ - { - "categoryId": 1013, - "name": "Quests & Leveling", - "url": "https://www.curseforge.com/wow/addons/quests-leveling", - "avatarUrl": "https://media.forgecdn.net/avatars/54/449/636135209685443713.png", - "parentId": 1, - "rootId": 1, - "projectId": 1, - "avatarId": 1, - "gameId": 1 - } - ], - "status": 4, - "primaryCategoryId": 1013, - "categorySection": { - "id": 1, - "gameId": 1, - "name": "Addons", - "packageType": 1, - "path": "Interface\\Addons", - "initialInclusionPattern": "(?i)^([^/]+)[\\\\/]\\1\\.toc$", - "extraIncludePattern": "(?i)^[^/\\\\]+[/\\\\]Bindings\\.xml$", - "gameCategoryId": 1 - }, - "slug": "every-addon", - "gameVersionLatestFiles": [ - { - "gameVersion": "8.0.1", - "projectFileId": 1, - "projectFileName": "EveryAddon.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - } - ], - "isFeatured": false, - "popularityScore": 52.70240020751953, - "gamePopularityRank": 2913, - "primaryLanguage": "enUS", - "gameSlug": "wow", - "gameName": "World of Warcraft", - "portalName": "www.curseforge.com", - "dateModified": "2019-07-11T11:14:30.43Z", - "dateCreated": "2019-07-11T03:23:24.1Z", - "dateReleased": "2019-07-11T11:13:39.763Z", - "isAvailable": true, - "isExperiemental": false -} diff --git a/test/fixtures/curseforge-api-addon--everyotheraddon-classic.json b/test/fixtures/curseforge-api-addon--everyotheraddon-classic.json deleted file mode 100644 index 69938c34..00000000 --- a/test/fixtures/curseforge-api-addon--everyotheraddon-classic.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "id": 1, - "name": "Every Other Addon", - "authors": [ - { - "name": "torkus", - "url": "https://www.curseforge.com/members/1-torkus?username=torkus", - "projectId": 1, - "id": 1, - "projectTitleId": null, - "projectTitleTitle": null, - "userId": 1, - "twitchId": 1 - } - ], - "attachments": [], - "websiteUrl": "https://www.curseforge.com/wow/addons/every-other-addon", - "gameId": 1, - "summary": "Does what every addon does, just better", - "defaultFileId": 2, - "downloadCount": 1, - "latestFiles": [ - { - "id": 2, - "displayName": "v8.2.0-v1.13.2-7135.139", - "fileName": "EveryOtherAddon-v8.2.0-v1.13.2-7135.139.zip", - "fileDate": "2019-07-11T11:13:39.763Z", - "fileLength": 1, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/2/2/EveryOtherAddon.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "EveryOtherAddon", - "fingerprint": 1, - "type": 3 - } - ], - "packageFingerprint": 1, - "gameVersion": [ - "1.13.2" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000008.0000000000.0000000001", - "gameVersion": "1.13.2", - "gameVersionReleaseDate": "2018-07-17T00:00:00Z", - "gameVersionName": "1.13.2" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 1, - "fileLegacyMappingId": null, - "projectId": 1, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 1, - "gameVersionDateReleased": "2001-01-01T00:00:00Z", - "gameVersionMappingId": 1, - "gameVersionId": 7350, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_classic" - } - ], - "categories": [ - { - "categoryId": 1013, - "name": "Quests & Leveling", - "url": "https://www.curseforge.com/wow/addons/quests-leveling", - "avatarUrl": "https://media.forgecdn.net/avatars/54/449/123.png", - "parentId": 1, - "rootId": 1, - "projectId": 1, - "avatarId": 1, - "gameId": 1 - } - ], - "status": 4, - "primaryCategoryId": 1013, - "categorySection": { - "id": 1, - "gameId": 1, - "name": "Addons", - "packageType": 1, - "path": "Interface\\Addons", - "initialInclusionPattern": "(?i)^([^/]+)[\\\\/]\\1\\.toc$", - "extraIncludePattern": "(?i)^[^/\\\\]+[/\\\\]Bindings\\.xml$", - "gameCategoryId": 1 - }, - "slug": "every-other-addon", - "gameVersionLatestFiles": [ - { - "gameVersion": "1.13.2", - "projectFileId": 1, - "projectFileName": "EveryOtherAddon.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - } - ], - "isFeatured": false, - "popularityScore": 52.70240020751953, - "gamePopularityRank": 2913, - "primaryLanguage": "enUS", - "gameSlug": "wow", - "gameName": "World of Warcraft", - "portalName": "www.curseforge.com", - "dateModified": "2019-07-11T11:14:30.43Z", - "dateCreated": "2019-07-11T03:23:24.1Z", - "dateReleased": "2019-07-11T11:13:39.763Z", - "isAvailable": true, - "isExperiemental": false -} diff --git a/test/fixtures/curseforge-api-addon--everyotheraddon.json b/test/fixtures/curseforge-api-addon--everyotheraddon.json deleted file mode 100644 index 8c203ccd..00000000 --- a/test/fixtures/curseforge-api-addon--everyotheraddon.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "id": 1, - "name": "Every Other Addon", - "authors": [ - { - "name": "torkus", - "url": "https://www.curseforge.com/members/1-torkus?username=torkus", - "projectId": 1, - "id": 1, - "projectTitleId": null, - "projectTitleTitle": null, - "userId": 1, - "twitchId": 1 - } - ], - "attachments": [], - "websiteUrl": "https://www.curseforge.com/wow/addons/every-other-addon", - "gameId": 1, - "summary": "Does what every addon does, just better", - "defaultFileId": 2, - "downloadCount": 1, - "latestFiles": [ - { - "id": 2, - "displayName": "v8.2.0-v1.13.2-7135.139", - "fileName": "EveryOtherAddon-v8.2.0-v1.13.2-7135.139.zip", - "fileDate": "2019-07-11T11:13:39.763Z", - "fileLength": 1, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/2/2/EveryOtherAddon.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "EveryOtherAddon", - "fingerprint": 1, - "type": 3 - } - ], - "packageFingerprint": 1, - "gameVersion": [ - "8.2.0" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000008.0000000000.0000000001", - "gameVersion": "8.2.0", - "gameVersionReleaseDate": "2018-07-17T00:00:00Z", - "gameVersionName": "8.2.0" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 1, - "fileLegacyMappingId": null, - "projectId": 1, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 1, - "gameVersionDateReleased": "2001-01-01T00:00:00Z", - "gameVersionMappingId": 1, - "gameVersionId": 7350, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - } - ], - "categories": [ - { - "categoryId": 1013, - "name": "Quests & Leveling", - "url": "https://www.curseforge.com/wow/addons/quests-leveling", - "avatarUrl": "https://media.forgecdn.net/avatars/54/449/123.png", - "parentId": 1, - "rootId": 1, - "projectId": 1, - "avatarId": 1, - "gameId": 1 - } - ], - "status": 4, - "primaryCategoryId": 1013, - "categorySection": { - "id": 1, - "gameId": 1, - "name": "Addons", - "packageType": 1, - "path": "Interface\\Addons", - "initialInclusionPattern": "(?i)^([^/]+)[\\\\/]\\1\\.toc$", - "extraIncludePattern": "(?i)^[^/\\\\]+[/\\\\]Bindings\\.xml$", - "gameCategoryId": 1 - }, - "slug": "every-other-addon", - "gameVersionLatestFiles": [ - { - "gameVersion": "8.2.0", - "projectFileId": 1, - "projectFileName": "EveryOtherAddon.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - } - ], - "isFeatured": false, - "popularityScore": 52.70240020751953, - "gamePopularityRank": 2913, - "primaryLanguage": "enUS", - "gameSlug": "wow", - "gameName": "World of Warcraft", - "portalName": "www.curseforge.com", - "dateModified": "2019-07-11T11:14:30.43Z", - "dateCreated": "2019-07-11T03:23:24.1Z", - "dateReleased": "2019-07-11T11:13:39.763Z", - "isAvailable": true, - "isExperiemental": false -} diff --git a/test/fixtures/curseforge-api-addon--new-game-track.json b/test/fixtures/curseforge-api-addon--new-game-track.json deleted file mode 100644 index 1c0396a8..00000000 --- a/test/fixtures/curseforge-api-addon--new-game-track.json +++ /dev/null @@ -1,619 +0,0 @@ -{ - "id": 100547, - "name": "Plater Nameplates", - "authors": [ - { - "name": "Terciob", - "url": "https://www.curseforge.com/members/4961209-terciob?username=terciob", - "projectId": 100547, - "id": 71521, - "projectTitleId": null, - "projectTitleTitle": null, - "userId": 4961209, - "twitchId": 21186570 - } - ], - "attachments": [ - { - "id": 61572, - "projectId": 100547, - "description": "", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/61/572/256/256/636141658110686644.png", - "title": "636141658110686644.png", - "url": "https://media.forgecdn.net/avatars/61/572/636141658110686644.png", - "status": 1 - }, - { - "id": 185556, - "projectId": 100547, - "description": "", - "isDefault": true, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/185/556/256/256/636828401320016782.png", - "title": "636828401320016782.png", - "url": "https://media.forgecdn.net/avatars/185/556/636828401320016782.png", - "status": 1 - }, - { - "id": 103773, - "projectId": 100547, - "description": "

When out of ocmbat, nameplates has a reduced size.
\nIt's configurable.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/103/773/310/172/outofcombat.png", - "title": "outofcombat.png", - "url": "https://media.forgecdn.net/attachments/103/773/outofcombat.png", - "status": 1 - }, - { - "id": 103771, - "projectId": 100547, - "description": "

If friendly nameplate are enabled, this is how Plater show plates for friendly players.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/103/771/310/172/friendlyplayer.png", - "title": "friendlyplayer.png", - "url": "https://media.forgecdn.net/attachments/103/771/friendlyplayer.png", - "status": 1 - }, - { - "id": 103772, - "projectId": 100547, - "description": "

When in combat, plates has normal size (also configurable).
\nAs DPS the red bar means the mob has aggro on you.
\nIf you are a tank, would be opposite: red nameplate = no aggro.

\n\n

AS DPS the purple color means the mob isn't attacking you.<...", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/103/772/310/172/incombat.png", - "title": "incombat.png", - "url": "https://media.forgecdn.net/attachments/103/772/incombat.png", - "status": 1 - } - ], - "websiteUrl": "https://www.curseforge.com/wow/addons/plater-nameplates", - "gameId": 1, - "summary": "Highly customizable nameplate with support to scripts and animations.", - "defaultFileId": 3254070, - "downloadCount": 8351875, - "latestFiles": [ - { - "id": 2636070, - "displayName": "v8.0.1.149 - RC1", - "fileName": "Plater-v8.0.1.149.zip", - "fileDate": "2018-11-07T16:08:30.41Z", - "fileLength": 982147, - "releaseType": 2, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/2636/70/Plater-v8.0.1.149.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Plater", - "fingerprint": 3314145207, - "type": 3 - } - ], - "packageFingerprint": 220319764, - "gameVersion": [ - "8.0.1" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000008.0000000000.0000000001", - "gameVersion": "8.0.1", - "gameVersionReleaseDate": "2018-07-17T00:00:00Z", - "gameVersionName": "8.0.1" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 1469612, - "fileLegacyMappingId": null, - "projectId": 100547, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 274393376, - "gameVersionDateReleased": "2018-07-17T00:00:00Z", - "gameVersionMappingId": 1695466, - "gameVersionId": 7003, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - }, - { - "id": 3254070, - "displayName": "Plater-1.13.6.97-Classic", - "fileName": "Plater-1.13.6.97-Classic.zip", - "fileDate": "2021-03-28T20:23:41.14Z", - "fileLength": 3578384, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3254/70/Plater-1.13.6.97-Classic.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Plater", - "fingerprint": 767788839, - "type": 3 - } - ], - "packageFingerprint": 1050565619, - "gameVersion": [ - "1.13.6" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000001.0000000013.0000000006", - "gameVersion": "1.13.6", - "gameVersionReleaseDate": "2020-12-02T00:00:00Z", - "gameVersionName": "1.13.6" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2238064, - "fileLegacyMappingId": null, - "projectId": 100547, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 633771824, - "gameVersionDateReleased": "2020-12-02T00:00:00Z", - "gameVersionMappingId": 2824386, - "gameVersionId": 8171, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_classic" - }, - { - "id": 3257930, - "displayName": "Plater-Plater-v9.0.2.327b-Retail", - "fileName": "Plater-Plater-v9.0.2.327b-Retail.zip", - "fileDate": "2021-04-01T17:52:48.797Z", - "fileLength": 4007098, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3257/930/Plater-Plater-v9.0.2.327b-Retail.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Plater", - "fingerprint": 3980671207, - "type": 3 - } - ], - "packageFingerprint": 1451493547, - "gameVersion": [ - "9.0.5" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000009.0000000000.0000000005", - "gameVersion": "9.0.5", - "gameVersionReleaseDate": "2021-03-09T00:00:00Z", - "gameVersionName": "9.0.5" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2243127, - "fileLegacyMappingId": null, - "projectId": 100547, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 635958381, - "gameVersionDateReleased": "2021-03-09T00:00:00Z", - "gameVersionMappingId": 2832728, - "gameVersionId": 8267, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - }, - { - "id": 3258121, - "displayName": "Plater-v2.5.1-BC-Beta2", - "fileName": "Plater-v2.5.1-BC-Beta2.zip", - "fileDate": "2021-04-01T20:52:05.263Z", - "fileLength": 3884671, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3258/121/Plater-v2.5.1-BC-Beta2.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Plater", - "fingerprint": 392227688, - "type": 3 - } - ], - "packageFingerprint": 1542758302, - "gameVersion": [ - "2.5.1" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000002.0000000005.0000000001", - "gameVersion": "2.5.1", - "gameVersionReleaseDate": "2021-03-31T00:00:00Z", - "gameVersionName": "2.5.1" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2243383, - "fileLegacyMappingId": null, - "projectId": 100547, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 636039806, - "gameVersionDateReleased": "2021-03-31T00:00:00Z", - "gameVersionMappingId": 2833096, - "gameVersionId": 8287, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": null - }, - { - "id": 3258245, - "displayName": "Plater-v9.0.2.327-Retail-17-g0894b8e-alpha", - "fileName": "Plater-Plater-v9.0.2.327-Retail-17-g0894b8e-alpha.zip", - "fileDate": "2021-04-01T23:07:32.907Z", - "fileLength": 4011236, - "releaseType": 3, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3258/245/Plater-Plater-v9.0.2.327-Retail-17-g0894b8e-alpha.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Plater", - "fingerprint": 2895237431, - "type": 3 - } - ], - "packageFingerprint": 402127999, - "gameVersion": [], - "sortableGameVersion": [], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2243557, - "fileLegacyMappingId": null, - "projectId": 100547, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 636098850, - "gameVersionDateReleased": "2021-03-09T00:00:00Z", - "gameVersionMappingId": 2833368, - "gameVersionId": 8267, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - } - ], - "categories": [ - { - "categoryId": 1016, - "name": "Unit Frames", - "url": "https://www.curseforge.com/wow/addons/unit-frames", - "avatarUrl": "https://media.forgecdn.net/avatars/54/452/636135209705942926.png", - "parentId": 1, - "rootId": 1, - "projectId": 100547, - "avatarId": 54452, - "gameId": 1 - } - ], - "status": 4, - "primaryCategoryId": 1016, - "categorySection": { - "id": 1, - "gameId": 1, - "name": "Addons", - "packageType": 1, - "path": "Interface\\Addons", - "initialInclusionPattern": "(?i)^([^/]+)[\\\\/]\\1\\.toc$", - "extraIncludePattern": "(?i)^[^/\\\\]+[/\\\\]Bindings\\.xml$", - "gameCategoryId": 1 - }, - "slug": "plater-nameplates", - "gameVersionLatestFiles": [ - { - "gameVersion": "2.5.1", - "projectFileId": 3258121, - "projectFileName": "Plater-v2.5.1-BC-Beta2.zip", - "fileType": 1, - "gameVersionFlavor": null - }, - { - "gameVersion": "9.0.5", - "projectFileId": 3257930, - "projectFileName": "Plater-Plater-v9.0.2.327b-Retail.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.6", - "projectFileId": 3254070, - "projectFileName": "Plater-1.13.6.97-Classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "9.0.2", - "projectFileId": 3211998, - "projectFileName": "Plater-Plater-v9.0.2.325a-Retail-25-g13a9cb6-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "9.0.2", - "projectFileId": 3189198, - "projectFileName": "Plater-Plater-v9.0.2.325a-Retail.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.5", - "projectFileId": 3117954, - "projectFileName": "Plater-1.13.5.95-Classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "9.0.1", - "projectFileId": 3115875, - "projectFileName": "Plater-Plater-v9.0.1.316-Retail-16-gde9abaf-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "9.0.1", - "projectFileId": 3109921, - "projectFileName": "Plater-Plater-v9.0.1.316-Retail.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.3.0", - "projectFileId": 3073944, - "projectFileName": "Plater-Plater-v8.3.0.307-Retail-1-gf08f80d-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.3.0", - "projectFileId": 3073655, - "projectFileName": "Plater-Plater-v8.3.0.307-Retail.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.4", - "projectFileId": 2992852, - "projectFileName": "Plater-1.13.4.81-Classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "1.13.3", - "projectFileId": 2875456, - "projectFileName": "Plater-1.13.3.73-Classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "8.2.5", - "projectFileId": 2862385, - "projectFileName": "Plater-Plater-v8.2.5.283-Retail-15-g1be9ef7-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.2.5", - "projectFileId": 2850932, - "projectFileName": "Plater-Plater-v8.2.5.283-Retail.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.2", - "projectFileId": 2840995, - "projectFileName": "Plater-1.13.3.67-Classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "8.2.0", - "projectFileId": 2780409, - "projectFileName": "Plater-v8.2.0.277.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.2.0", - "projectFileId": 2780384, - "projectFileName": "Plater-v8.2.0.276-8-g5d097c8-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.1.5", - "projectFileId": 2729751, - "projectFileName": "Plater-v8.1.5.265-1-g7ceac95-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.1.5", - "projectFileId": 2727258, - "projectFileName": "Plater-v8.1.5.265.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.1.0", - "projectFileId": 2686095, - "projectFileName": "Plater-r232-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.1.0", - "projectFileId": 2684779, - "projectFileName": "Plater-v8.1.0.228.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.0.1", - "projectFileId": 2647445, - "projectFileName": "Plater-v8.1.0.166.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.0.1", - "projectFileId": 2643084, - "projectFileName": "Plater-r159-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.0.1", - "projectFileId": 2636070, - "projectFileName": "Plater-v8.0.1.149.zip", - "fileType": 2, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.3.5", - "projectFileId": 2551401, - "projectFileName": "Plater-v7.3.5.072.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.3.5", - "projectFileId": 2547834, - "projectFileName": "Plater-v7.3.5.068.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.3.0", - "projectFileId": 2507941, - "projectFileName": "Plater-v7.3.2.057.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.2.5", - "projectFileId": 2464413, - "projectFileName": "Plater-r51-release.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.2.0", - "projectFileId": 2417540, - "projectFileName": "Plater-r43-release.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.2.0", - "projectFileId": 2399031, - "projectFileName": "Plater-r39-release-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.1.0", - "projectFileId": 2353654, - "projectFileName": "Plater-05f33dc8126a-alpha.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.0.3", - "projectFileId": 946496, - "projectFileName": "Plater-r36.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.0.3", - "projectFileId": 932888, - "projectFileName": "Plater-r19.zip", - "fileType": 2, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.0.3", - "projectFileId": 921207, - "projectFileName": "Plater-r1.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - } - ], - "isFeatured": false, - "popularityScore": 62693.125, - "gamePopularityRank": 21, - "primaryLanguage": "enUS", - "gameSlug": "wow", - "gameName": "World of Warcraft", - "portalName": "www.curseforge.com", - "dateModified": "2021-04-01T23:11:57.977Z", - "dateCreated": "2016-06-15T00:11:47.34Z", - "dateReleased": "2021-04-01T23:07:32.907Z", - "isAvailable": true, - "isExperiemental": false -} diff --git a/test/fixtures/curseforge-api-addon--retail-AND-classic.json b/test/fixtures/curseforge-api-addon--retail-AND-classic.json deleted file mode 100644 index 4a8c55a2..00000000 --- a/test/fixtures/curseforge-api-addon--retail-AND-classic.json +++ /dev/null @@ -1,391 +0,0 @@ -{ - "id": 4646, - "name": "Pawn", - "authors": [ - { - "name": "TravisSpomer", - "url": "https://www.curseforge.com/members/127788-travisspomer?username=travisspomer", - "projectId": 4646, - "id": 70193, - "projectTitleId": null, - "projectTitleTitle": null, - "userId": 127788, - "twitchId": 102465511 - } - ], - "attachments": [ - { - "id": 229261, - "projectId": 4646, - "description": "", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/229/261/256/256/637054162513412977.jpeg", - "title": "637054162513412977.jpeg", - "url": "https://media.forgecdn.net/avatars/229/261/637054162513412977.jpeg", - "status": 1 - }, - { - "id": 241286, - "projectId": 4646, - "description": "", - "isDefault": true, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/241/286/256/256/637126762505530549.jpeg", - "title": "637126762505530549.jpeg", - "url": "https://media.forgecdn.net/avatars/241/286/637126762505530549.jpeg", - "status": 1 - }, - { - "id": 61157, - "projectId": 4646, - "description": "", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/61/157/256/256/636141608867724105.jpg", - "title": "636141608867724105.jpg", - "url": "https://media.forgecdn.net/avatars/61/157/636141608867724105.jpg", - "status": 1 - }, - { - "id": 102344, - "projectId": 4646, - "description": "

The loot upgrade advisor helps you know when you should roll on an item that drops in a dungeon right away.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/344/310/172/Loot_upgrade_advisor.jpg", - "title": "Loot_upgrade_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/344/Loot_upgrade_advisor.jpg", - "status": 1 - }, - { - "id": 102336, - "projectId": 4646, - "description": "

You can use Pawn to quickly evaluate upgrades in AtlasLoot (and other loot mods) and build up your wish lists.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/336/310/172/Pawn_-_AtlasLoot.png", - "title": "Pawn_-_AtlasLoot.png", - "url": "https://media.forgecdn.net/attachments/102/336/Pawn_-_AtlasLoot.png", - "status": 1 - }, - { - "id": 200060, - "projectId": 4646, - "description": "Pawn 2.2 helps you find relic upgrades for your artifact weapons, regardless of which spec you're in.", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/200/60/310/172/relic-upgrades.jpg", - "title": "Relic upgrades", - "url": "https://media.forgecdn.net/attachments/200/60/relic-upgrades.jpg", - "status": 1 - }, - { - "id": 102337, - "projectId": 4646, - "description": "

Pawn's in ur tooltipz helpin u decide what 2 spend ur dkp on

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/337/310/172/Pawn_-_tooltips.png", - "title": "Pawn_-_tooltips.png", - "url": "https://media.forgecdn.net/attachments/102/337/Pawn_-_tooltips.png", - "status": 1 - }, - { - "id": 102333, - "projectId": 4646, - "description": "

Pawn integrates with the new bag arrows feature in WoW 7.1 to help you find upgrades to your gear, even if they're not just a higher item level.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/333/310/172/Bag_arrows.jpg", - "title": "Bag_arrows.jpg", - "url": "https://media.forgecdn.net/attachments/102/333/Bag_arrows.jpg", - "status": 1 - }, - { - "id": 102338, - "projectId": 4646, - "description": "

Pawn tells you which gems of each color are best for each of your specs.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/338/310/172/Pawn_-_gems.png", - "title": "Pawn_-_gems.png", - "url": "https://media.forgecdn.net/attachments/102/338/Pawn_-_gems.png", - "status": 1 - }, - { - "id": 102345, - "projectId": 4646, - "description": "

Pawn lets you customize your tooltips the way you like them.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/345/310/172/Pawn_options.jpg", - "title": "Pawn_options.jpg", - "url": "https://media.forgecdn.net/attachments/102/345/Pawn_options.jpg", - "status": 1 - }, - { - "id": 102346, - "projectId": 4646, - "description": "

Pawn can tell you which gems will maximize an item's value for a specific purpose. It's smart enough to know when to keep socket bonuses and when to ignore them. It selects a gem quality level appropriate for the item level of the armor or weapon y...", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/346/310/172/Pawn_1.7_socketing_advisor.jpg", - "title": "Pawn_1.7_socketing_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/346/Pawn_1.7_socketing_advisor.jpg", - "status": 1 - }, - { - "id": 102335, - "projectId": 4646, - "description": "

Pawn 2.0 still lets you fully customize what it suggests, including turning on multiple specs, importing stat weights from the internet, or starting from scratch.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/335/310/172/Pawn_manual_mode.jpg", - "title": "Pawn_manual_mode.jpg", - "url": "https://media.forgecdn.net/attachments/102/335/Pawn_manual_mode.jpg", - "status": 1 - }, - { - "id": 102334, - "projectId": 4646, - "description": "

Pawn 2.0 will automatically select the scale for your current spec, so by default it will just give you suggestions for the way you're currently playing.  The simplified no-hassle annotations on your tooltips make it easy to see at a glance...", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/334/310/172/Pawn_auto_mode.jpg", - "title": "Pawn_auto_mode.jpg", - "url": "https://media.forgecdn.net/attachments/102/334/Pawn_auto_mode.jpg", - "status": 1 - }, - { - "id": 102347, - "projectId": 4646, - "description": "

Pawn's Compare tab.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/347/310/172/Pawn_s_Compare_tab.jpg", - "title": "Pawn_s_Compare_tab.jpg", - "url": "https://media.forgecdn.net/attachments/102/347/Pawn_s_Compare_tab.jpg", - "status": 1 - }, - { - "id": 102341, - "projectId": 4646, - "description": "

Pawn lets you create your own valuation scales with whatever stat values you like.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/341/310/172/Pawn_-_values.png", - "title": "Pawn_-_values.png", - "url": "https://media.forgecdn.net/attachments/102/341/Pawn_-_values.png", - "status": 1 - }, - { - "id": 102339, - "projectId": 4646, - "description": "

Find upgrades for your alts' gear at the auction house using Pawn.  You can immediately see which items have a better combination of stats.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/339/310/172/Pawn_-_auctions.jpg", - "title": "Pawn_-_auctions.jpg", - "url": "https://media.forgecdn.net/attachments/102/339/Pawn_-_auctions.jpg", - "status": 1 - }, - { - "id": 102343, - "projectId": 4646, - "description": "

Pawn's quest advisor makes it easy to see which quest rewards are upgrades to your gear, or which useless item is worth the most money.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/343/310/172/Pawn_quest_advisor.jpg", - "title": "Pawn_quest_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/343/Pawn_quest_advisor.jpg", - "status": 1 - }, - { - "id": 102332, - "projectId": 4646, - "description": "

Starting with version 2.1, Pawn now includes custom advice for all 36 specs from Mr. Robot himself.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/332/310/172/AMR.jpg", - "title": "AMR.jpg", - "url": "https://media.forgecdn.net/attachments/102/332/AMR.jpg", - "status": 1 - } - ], - "websiteUrl": "https://www.curseforge.com/wow/addons/pawn", - "gameId": 1, - "summary": "Pawn helps you compare items and find upgrades.", - "defaultFileId": 3104060, - "downloadCount": 41474151, - "latestFiles": [ - { - "id": 3104060, - "displayName": "2.4.5 (Classic)", - "fileName": "Pawn-2.4.5-Classic.zip", - "fileDate": "2020-11-06T20:46:49.923Z", - "fileLength": 767568, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3104/60/Pawn-2.4.5-Classic.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Pawn", - "fingerprint": 2323297791, - "type": 3 - } - ], - "packageFingerprint": 3121052537, - "gameVersion": [ - "1.13.5" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000001.0000000013.0000000005", - "gameVersion": "1.13.5", - "gameVersionReleaseDate": "2020-07-07T00:00:00Z", - "gameVersionName": "1.13.5" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2044631, - "fileLegacyMappingId": null, - "projectId": 4646, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 549342193, - "gameVersionDateReleased": "2020-07-07T00:00:00Z", - "gameVersionMappingId": 2518413, - "gameVersionId": 7957, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_classic" - }, - { - "id": 3104062, - "displayName": "2.4.5", - "fileName": "Pawn-2.4.5.zip", - "fileDate": "2020-11-06T20:47:12.92Z", - "fileLength": 767569, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3104/62/Pawn-2.4.5.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Pawn", - "fingerprint": 2686444960, - "type": 3 - } - ], - "packageFingerprint": 1780532995, - "gameVersion": [ - "9.0.1" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000009.0000000000.0000000001", - "gameVersion": "9.0.1", - "gameVersionReleaseDate": "2020-07-17T00:00:00Z", - "gameVersionName": "9.0.1" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2044633, - "fileLegacyMappingId": null, - "projectId": 4646, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 549342237, - "gameVersionDateReleased": "2020-07-17T00:00:00Z", - "gameVersionMappingId": 2518415, - "gameVersionId": 7971, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - } - ], - "categories": [ - { - "categoryId": 1009, - "name": "Bags & Inventory", - "url": "https://www.curseforge.com/wow/addons/bags-inventory", - "avatarUrl": "https://media.forgecdn.net/avatars/54/445/636135209663914354.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54445, - "gameId": 1 - }, - { - "categoryId": 1013, - "name": "Quests & Leveling", - "url": "https://www.curseforge.com/wow/addons/quests-leveling", - "avatarUrl": "https://media.forgecdn.net/avatars/54/449/636135209685443713.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54449, - "gameId": 1 - }, - { - "categoryId": 1055, - "name": "Tooltip", - "url": "https://www.curseforge.com/wow/addons/tooltip", - "avatarUrl": "https://media.forgecdn.net/avatars/54/459/636135209747227110.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54459, - "gameId": 1 - } - ], - "status": 4, - "primaryCategoryId": 1009, - "categorySection": { - "id": 1, - "gameId": 1, - "name": "Addons", - "packageType": 1, - "path": "Interface\\Addons", - "initialInclusionPattern": "(?i)^([^/]+)[\\\\/]\\1\\.toc$", - "extraIncludePattern": "(?i)^[^/\\\\]+[/\\\\]Bindings\\.xml$", - "gameCategoryId": 1 - }, - "slug": "pawn", - "gameVersionLatestFiles": [ - { - "gameVersion": "9.0.1", - "projectFileId": 3104062, - "projectFileName": "Pawn-2.4.5.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.5", - "projectFileId": 3104060, - "projectFileName": "Pawn-2.4.5-Classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - } - ], - "isFeatured": false, - "popularityScore": 114915.8125, - "gamePopularityRank": 6, - "primaryLanguage": "enUS", - "gameSlug": "wow", - "gameName": "World of Warcraft", - "portalName": "www.curseforge.com", - "dateModified": "2020-11-06T20:56:32.41Z", - "dateCreated": "2008-01-14T07:05:01Z", - "dateReleased": "2020-11-06T20:47:12.92Z", - "isAvailable": true, - "isExperiemental": false -} diff --git a/test/fixtures/curseforge-api-addon--retail.json b/test/fixtures/curseforge-api-addon--retail.json deleted file mode 100644 index 903b7646..00000000 --- a/test/fixtures/curseforge-api-addon--retail.json +++ /dev/null @@ -1,329 +0,0 @@ -{ - "id": 4646, - "name": "Pawn", - "authors": [ - { - "name": "TravisSpomer", - "url": "https://www.curseforge.com/members/127788-travisspomer?username=travisspomer", - "projectId": 4646, - "id": 70193, - "projectTitleId": null, - "projectTitleTitle": null, - "userId": 127788, - "twitchId": 102465511 - } - ], - "attachments": [ - { - "id": 229261, - "projectId": 4646, - "description": "", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/229/261/256/256/637054162513412977.jpeg", - "title": "637054162513412977.jpeg", - "url": "https://media.forgecdn.net/avatars/229/261/637054162513412977.jpeg", - "status": 1 - }, - { - "id": 241286, - "projectId": 4646, - "description": "", - "isDefault": true, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/241/286/256/256/637126762505530549.jpeg", - "title": "637126762505530549.jpeg", - "url": "https://media.forgecdn.net/avatars/241/286/637126762505530549.jpeg", - "status": 1 - }, - { - "id": 61157, - "projectId": 4646, - "description": "", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/61/157/256/256/636141608867724105.jpg", - "title": "636141608867724105.jpg", - "url": "https://media.forgecdn.net/avatars/61/157/636141608867724105.jpg", - "status": 1 - }, - { - "id": 102344, - "projectId": 4646, - "description": "

The loot upgrade advisor helps you know when you should roll on an item that drops in a dungeon right away.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/344/310/172/Loot_upgrade_advisor.jpg", - "title": "Loot_upgrade_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/344/Loot_upgrade_advisor.jpg", - "status": 1 - }, - { - "id": 102336, - "projectId": 4646, - "description": "

You can use Pawn to quickly evaluate upgrades in AtlasLoot (and other loot mods) and build up your wish lists.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/336/310/172/Pawn_-_AtlasLoot.png", - "title": "Pawn_-_AtlasLoot.png", - "url": "https://media.forgecdn.net/attachments/102/336/Pawn_-_AtlasLoot.png", - "status": 1 - }, - { - "id": 200060, - "projectId": 4646, - "description": "Pawn 2.2 helps you find relic upgrades for your artifact weapons, regardless of which spec you're in.", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/200/60/310/172/relic-upgrades.jpg", - "title": "Relic upgrades", - "url": "https://media.forgecdn.net/attachments/200/60/relic-upgrades.jpg", - "status": 1 - }, - { - "id": 102337, - "projectId": 4646, - "description": "

Pawn's in ur tooltipz helpin u decide what 2 spend ur dkp on

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/337/310/172/Pawn_-_tooltips.png", - "title": "Pawn_-_tooltips.png", - "url": "https://media.forgecdn.net/attachments/102/337/Pawn_-_tooltips.png", - "status": 1 - }, - { - "id": 102333, - "projectId": 4646, - "description": "

Pawn integrates with the new bag arrows feature in WoW 7.1 to help you find upgrades to your gear, even if they're not just a higher item level.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/333/310/172/Bag_arrows.jpg", - "title": "Bag_arrows.jpg", - "url": "https://media.forgecdn.net/attachments/102/333/Bag_arrows.jpg", - "status": 1 - }, - { - "id": 102338, - "projectId": 4646, - "description": "

Pawn tells you which gems of each color are best for each of your specs.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/338/310/172/Pawn_-_gems.png", - "title": "Pawn_-_gems.png", - "url": "https://media.forgecdn.net/attachments/102/338/Pawn_-_gems.png", - "status": 1 - }, - { - "id": 102345, - "projectId": 4646, - "description": "

Pawn lets you customize your tooltips the way you like them.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/345/310/172/Pawn_options.jpg", - "title": "Pawn_options.jpg", - "url": "https://media.forgecdn.net/attachments/102/345/Pawn_options.jpg", - "status": 1 - }, - { - "id": 102346, - "projectId": 4646, - "description": "

Pawn can tell you which gems will maximize an item's value for a specific purpose. It's smart enough to know when to keep socket bonuses and when to ignore them. It selects a gem quality level appropriate for the item level of the armor or weapon y...", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/346/310/172/Pawn_1.7_socketing_advisor.jpg", - "title": "Pawn_1.7_socketing_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/346/Pawn_1.7_socketing_advisor.jpg", - "status": 1 - }, - { - "id": 102335, - "projectId": 4646, - "description": "

Pawn 2.0 still lets you fully customize what it suggests, including turning on multiple specs, importing stat weights from the internet, or starting from scratch.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/335/310/172/Pawn_manual_mode.jpg", - "title": "Pawn_manual_mode.jpg", - "url": "https://media.forgecdn.net/attachments/102/335/Pawn_manual_mode.jpg", - "status": 1 - }, - { - "id": 102334, - "projectId": 4646, - "description": "

Pawn 2.0 will automatically select the scale for your current spec, so by default it will just give you suggestions for the way you're currently playing.  The simplified no-hassle annotations on your tooltips make it easy to see at a glance...", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/334/310/172/Pawn_auto_mode.jpg", - "title": "Pawn_auto_mode.jpg", - "url": "https://media.forgecdn.net/attachments/102/334/Pawn_auto_mode.jpg", - "status": 1 - }, - { - "id": 102347, - "projectId": 4646, - "description": "

Pawn's Compare tab.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/347/310/172/Pawn_s_Compare_tab.jpg", - "title": "Pawn_s_Compare_tab.jpg", - "url": "https://media.forgecdn.net/attachments/102/347/Pawn_s_Compare_tab.jpg", - "status": 1 - }, - { - "id": 102341, - "projectId": 4646, - "description": "

Pawn lets you create your own valuation scales with whatever stat values you like.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/341/310/172/Pawn_-_values.png", - "title": "Pawn_-_values.png", - "url": "https://media.forgecdn.net/attachments/102/341/Pawn_-_values.png", - "status": 1 - }, - { - "id": 102339, - "projectId": 4646, - "description": "

Find upgrades for your alts' gear at the auction house using Pawn.  You can immediately see which items have a better combination of stats.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/339/310/172/Pawn_-_auctions.jpg", - "title": "Pawn_-_auctions.jpg", - "url": "https://media.forgecdn.net/attachments/102/339/Pawn_-_auctions.jpg", - "status": 1 - }, - { - "id": 102343, - "projectId": 4646, - "description": "

Pawn's quest advisor makes it easy to see which quest rewards are upgrades to your gear, or which useless item is worth the most money.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/343/310/172/Pawn_quest_advisor.jpg", - "title": "Pawn_quest_advisor.jpg", - "url": "https://media.forgecdn.net/attachments/102/343/Pawn_quest_advisor.jpg", - "status": 1 - }, - { - "id": 102332, - "projectId": 4646, - "description": "

Starting with version 2.1, Pawn now includes custom advice for all 36 specs from Mr. Robot himself.

", - "isDefault": false, - "thumbnailUrl": "https://media.forgecdn.net/attachments/thumbnails/102/332/310/172/AMR.jpg", - "title": "AMR.jpg", - "url": "https://media.forgecdn.net/attachments/102/332/AMR.jpg", - "status": 1 - } - ], - "websiteUrl": "https://www.curseforge.com/wow/addons/pawn", - "gameId": 1, - "summary": "Pawn helps you compare items and find upgrades.", - "defaultFileId": 3104060, - "downloadCount": 41474151, - "latestFiles": [ - { - "id": 3104062, - "displayName": "2.4.5", - "fileName": "Pawn-2.4.5.zip", - "fileDate": "2020-11-06T20:47:12.92Z", - "fileLength": 767569, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3104/62/Pawn-2.4.5.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [], - "isAvailable": true, - "modules": [ - { - "foldername": "Pawn", - "fingerprint": 2686444960, - "type": 3 - } - ], - "packageFingerprint": 1780532995, - "gameVersion": [ - "9.0.1" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000009.0000000000.0000000001", - "gameVersion": "9.0.1", - "gameVersionReleaseDate": "2020-07-17T00:00:00Z", - "gameVersionName": "9.0.1" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2044633, - "fileLegacyMappingId": null, - "projectId": 4646, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 549342237, - "gameVersionDateReleased": "2020-07-17T00:00:00Z", - "gameVersionMappingId": 2518415, - "gameVersionId": 7971, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - } - ], - "categories": [ - { - "categoryId": 1009, - "name": "Bags & Inventory", - "url": "https://www.curseforge.com/wow/addons/bags-inventory", - "avatarUrl": "https://media.forgecdn.net/avatars/54/445/636135209663914354.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54445, - "gameId": 1 - }, - { - "categoryId": 1013, - "name": "Quests & Leveling", - "url": "https://www.curseforge.com/wow/addons/quests-leveling", - "avatarUrl": "https://media.forgecdn.net/avatars/54/449/636135209685443713.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54449, - "gameId": 1 - }, - { - "categoryId": 1055, - "name": "Tooltip", - "url": "https://www.curseforge.com/wow/addons/tooltip", - "avatarUrl": "https://media.forgecdn.net/avatars/54/459/636135209747227110.png", - "parentId": 1, - "rootId": 1, - "projectId": 4646, - "avatarId": 54459, - "gameId": 1 - } - ], - "status": 4, - "primaryCategoryId": 1009, - "categorySection": { - "id": 1, - "gameId": 1, - "name": "Addons", - "packageType": 1, - "path": "Interface\\Addons", - "initialInclusionPattern": "(?i)^([^/]+)[\\\\/]\\1\\.toc$", - "extraIncludePattern": "(?i)^[^/\\\\]+[/\\\\]Bindings\\.xml$", - "gameCategoryId": 1 - }, - "slug": "pawn", - "gameVersionLatestFiles": [ - { - "gameVersion": "9.0.1", - "projectFileId": 3104062, - "projectFileName": "Pawn-2.4.5.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - } - ], - "isFeatured": false, - "popularityScore": 114915.8125, - "gamePopularityRank": 6, - "primaryLanguage": "enUS", - "gameSlug": "wow", - "gameName": "World of Warcraft", - "portalName": "www.curseforge.com", - "dateModified": "2020-11-06T20:56:32.41Z", - "dateCreated": "2008-01-14T07:05:01Z", - "dateReleased": "2020-11-06T20:47:12.92Z", - "isAvailable": true, - "isExperiemental": false -} diff --git a/test/fixtures/import-export--installed-addons-list.edn b/test/fixtures/import-export--installed-addons-list.edn index 53d62b8c..5b0cd87f 100644 --- a/test/fixtures/import-export--installed-addons-list.edn +++ b/test/fixtures/import-export--installed-addons-list.edn @@ -7,8 +7,8 @@ :dirname "AdiBags", :label "AdiBags", :description "Adirelle's bag addon.", - :interface-version 80200, - :toc/game-track :retail + :interface-version-list [80200], + :-toc/game-track-list [:retail] :supported-game-tracks [:retail] :installed-version "v1.9.17", :group-id "https://www.curseforge.com/wow/addons/adibags", @@ -18,8 +18,8 @@ :dirname "AdiBags_Config", :label "AdiBags Configuration", :description "Adirelle's bag addon.", - :interface-version 80200, - :toc/game-track :retail + :interface-version-list [80200], + :-toc/game-track-list [:retail] :supported-game-tracks [:retail] :installed-version "v1.9.17", :group-id "https://www.curseforge.com/wow/addons/adibags", @@ -31,8 +31,8 @@ :installed-game-track :retail, :name "adibags", :source "curseforge", - :interface-version 80200, - :toc/game-track :retail + :interface-version-list [80200], + :-toc/game-track-list [:retail] :supported-game-tracks [:retail] :download-url "https://www.curseforge.com/wow/addons/adibags/download/2738272/file", @@ -47,9 +47,9 @@ :label "No Name" :description "An addon with no match in the catalogue" :dirname "noname" - :interface-version 80200 + :interface-version-list [80200] :installed-version "7.8.9" - :toc/game-track :retail + :-toc/game-track-list :retail :supported-game-tracks [:retail]} {:created-date "2011-01-04T05:42:23Z", :description @@ -62,8 +62,8 @@ :installed-game-track :retail, :name "carbonite", :source "curseforge", - :interface-version 80200, - :toc/game-track :retail + :interface-version-list [80200], + :-toc/game-track-list :retail :supported-game-tracks [:retail] :download-url "https://www.curseforge.com/wow/addons/carbonite/download/2732714/file", diff --git a/test/fixtures/import-export--tukui-addon-list.json b/test/fixtures/import-export--tukui-addon-list.json deleted file mode 100644 index 995848d2..00000000 --- a/test/fixtures/import-export--tukui-addon-list.json +++ /dev/null @@ -1,16 +0,0 @@ -[{ - "id": "4", - "name": "Addon4", - "small_desc": "desc.", - "author": "authorname", - "version": "1.2.3", - "screenshot_url": "https://www.tukui.org/4", - "url": "https://www.tukui.org/addons.php?download=4", - "category": "Roleplay", - "downloads": "2838", - "lastupdate": "2019-07-29 20:48:25", - "patch": "8.2", - "last_download": "2019-12-05 00:57:41", - "web_url": "https://www.tukui.org/addons.php?id=4", - "changelog": "https://www.tukui.org/addons.php?id=4&changelog" -}] diff --git a/test/fixtures/tukui--addon-details-missing-patch.json b/test/fixtures/tukui--addon-details-missing-patch.json deleted file mode 100644 index ccd65cfd..00000000 --- a/test/fixtures/tukui--addon-details-missing-patch.json +++ /dev/null @@ -1,16 +0,0 @@ -[{ - "id": "98", - "name": "[rp:tags]", - "small_desc": "Add roleplaying fields to ElvUI to create RP UIs.", - "author": "oraibi", - "version": "0.960", - "screenshot_url": "https://www.tukui.org/98", - "url": "https://www.tukui.org/addons.php?download=98", - "category": "Roleplay", - "downloads": "2838", - "lastupdate": "2019-07-29 20:48:25", - "patch": null, - "last_download": "2019-12-05 00:57:41", - "web_url": "https://www.tukui.org/addons.php?id=98", - "changelog": "https://www.tukui.org/addons.php?id=98&changelog" -}] diff --git a/test/fixtures/tukui--addon-details.json b/test/fixtures/tukui--addon-details.json deleted file mode 100644 index ec080a90..00000000 --- a/test/fixtures/tukui--addon-details.json +++ /dev/null @@ -1,16 +0,0 @@ -[{ - "id": "98", - "name": "[rp:tags]", - "small_desc": "Add roleplaying fields to ElvUI to create RP UIs.", - "author": "oraibi", - "version": "0.960", - "screenshot_url": "https://www.tukui.org/98", - "url": "https://www.tukui.org/addons.php?download=98", - "category": "Roleplay", - "downloads": "2838", - "lastupdate": "2019-07-29 20:48:25", - "patch": "8.2", - "last_download": "2019-12-05 00:57:41", - "web_url": "https://www.tukui.org/addons.php?id=98", - "changelog": "https://www.tukui.org/addons.php?id=98&changelog" -}] diff --git a/test/fixtures/tukui--elvui-addon-proper.json b/test/fixtures/tukui--elvui-addon-proper.json deleted file mode 100644 index 70fc7fa2..00000000 --- a/test/fixtures/tukui--elvui-addon-proper.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "ElvUI", - "author": "Elv/Blazeflack", - "url": "https://www.tukui.org/downloads/elvui-11.26.zip", - "version": "11.26", - "changelog": "https://www.tukui.org/ui/elvui/changelog", - "ticket": "https://git.tukui.org/elvui/elvui/issues", - "git": "https://git.tukui.org/elvui/elvui", - "id": -2, - "patch": "8.2.5", - "lastupdate": "2019-12-05", - "web_url": "https://www.tukui.org/download.php?ui=elvui", - "lastdownload": "2019-12-08 02:21:26", - "donate_url": "http://www.tukui.org/support.php", - "small_desc": "A user interface designed around user-friendliness with extra features that are not included in the standard ui", - "screenshot_url": "https://www.tukui.org/images/screenshots/DarkTheme_ThickBorders_DPS.jpg", - "downloads": 2147483000, - "category": "Full UI Replacements" -} diff --git a/test/fixtures/tukui--tukui-addon-proper.json b/test/fixtures/tukui--tukui-addon-proper.json deleted file mode 100644 index 54cc6249..00000000 --- a/test/fixtures/tukui--tukui-addon-proper.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "Tukui", - "author": "Tukz", - "url": "https://www.tukui.org/downloads/tukui-18.27.zip", - "version": "18.27", - "changelog": "https://www.tukui.org/ui/tukui/changelog", - "ticket": "https://git.tukui.org/Tukz/Tukui/issues", - "git": "https://git.tukui.org/Tukz/Tukui", - "id": -1, - "patch": "8.2", - "lastupdate": "2019-09-24", - "web_url": "https://www.tukui.org/download.php?ui=tukui", - "lastdownload": "2019-12-08 02:21:25", - "donate_url": "http://www.tukui.org/support.php", - "small_desc": "Minimalistic and lightweight world of warcraft user interface", - "screenshot_url": "https://www.tukui.org/images/screenshots/t4.jpg", - "downloads": 2147483000, - "category": "Full UI Replacements" -} diff --git a/test/fixtures/user-catalogue--curseforge.json b/test/fixtures/user-catalogue--curseforge.json deleted file mode 100644 index 5b75cdcb..00000000 --- a/test/fixtures/user-catalogue--curseforge.json +++ /dev/null @@ -1,1397 +0,0 @@ -{ - "id": 13501, - "name": "Bartender4", - "authors": [ - { - "name": "nevcairiel", - "url": "https://www.curseforge.com/members/32560-nevcairiel?username=nevcairiel", - "projectId": 13501, - "id": 77778, - "projectTitleId": null, - "projectTitleTitle": null, - "userId": 32560, - "twitchId": 62321014 - } - ], - "attachments": [ - { - "id": 64267, - "projectId": 13501, - "description": "", - "isDefault": true, - "thumbnailUrl": "https://media.forgecdn.net/avatars/thumbnails/64/267/256/256/636151513516385958.png", - "title": "636151513516385958.png", - "url": "https://media.forgecdn.net/avatars/64/267/636151513516385958.png", - "status": 1 - } - ], - "websiteUrl": "https://www.curseforge.com/wow/addons/bartender4", - "gameId": 1, - "summary": "Simple and Advanced combined - Bartender4 ActionBar AddOn", - "defaultFileId": 3317600, - "downloadCount": 49487178, - "latestFiles": [ - { - "id": 3317600, - "displayName": "4.10.9-classic", - "fileName": "Bartender4-4.10.9-classic.zip", - "fileDate": "2021-05-21T07:52:57.627Z", - "fileLength": 321240, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3317/600/Bartender4-4.10.9-classic.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [ - { - "id": 64315838, - "addonId": 26499, - "type": 1, - "fileId": 3317600 - }, - { - "id": 64315832, - "addonId": 16386, - "type": 1, - "fileId": 3317600 - }, - { - "id": 64315833, - "addonId": 13376, - "type": 1, - "fileId": 3317600 - }, - { - "id": 64315835, - "addonId": 14295, - "type": 1, - "fileId": 3317600 - }, - { - "id": 64315834, - "addonId": 14328, - "type": 1, - "fileId": 3317600 - }, - { - "id": 64315836, - "addonId": 15049, - "type": 1, - "fileId": 3317600 - }, - { - "id": 64315831, - "addonId": 15552, - "type": 1, - "fileId": 3317600 - }, - { - "id": 64315837, - "addonId": 88673, - "type": 1, - "fileId": 3317600 - } - ], - "isAvailable": true, - "modules": [ - { - "foldername": "Bartender4", - "fingerprint": 1505448636, - "type": 3 - } - ], - "packageFingerprint": 2226290539, - "gameVersion": [ - "1.13.7" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000001.0000000013.0000000007", - "gameVersion": "1.13.7", - "gameVersionReleaseDate": "2021-04-20T00:00:00Z", - "gameVersionName": "1.13.7" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2319650, - "fileLegacyMappingId": null, - "projectId": 13501, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 666480391, - "gameVersionDateReleased": "2021-04-20T00:00:00Z", - "gameVersionMappingId": 2959196, - "gameVersionId": 8292, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_classic" - }, - { - "id": 3317601, - "displayName": "4.10.9-bcc", - "fileName": "Bartender4-4.10.9-bcc.zip", - "fileDate": "2021-05-21T07:53:19.033Z", - "fileLength": 315107, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3317/601/Bartender4-4.10.9-bcc.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [ - { - "id": 64315843, - "addonId": 14295, - "type": 1, - "fileId": 3317601 - }, - { - "id": 64315845, - "addonId": 88673, - "type": 1, - "fileId": 3317601 - }, - { - "id": 64315842, - "addonId": 14328, - "type": 1, - "fileId": 3317601 - }, - { - "id": 64315840, - "addonId": 16386, - "type": 1, - "fileId": 3317601 - }, - { - "id": 64315839, - "addonId": 15552, - "type": 1, - "fileId": 3317601 - }, - { - "id": 64315846, - "addonId": 26499, - "type": 1, - "fileId": 3317601 - }, - { - "id": 64315844, - "addonId": 15049, - "type": 1, - "fileId": 3317601 - }, - { - "id": 64315841, - "addonId": 13376, - "type": 1, - "fileId": 3317601 - } - ], - "isAvailable": true, - "modules": [ - { - "foldername": "Bartender4", - "fingerprint": 2631765186, - "type": 3 - } - ], - "packageFingerprint": 131770765, - "gameVersion": [ - "2.5.1" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000002.0000000005.0000000001", - "gameVersion": "2.5.1", - "gameVersionReleaseDate": "2021-03-31T00:00:00Z", - "gameVersionName": "2.5.1" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2319651, - "fileLegacyMappingId": null, - "projectId": 13501, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 666480515, - "gameVersionDateReleased": "2021-03-31T00:00:00Z", - "gameVersionMappingId": 2959197, - "gameVersionId": 8287, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_burning_crusade" - }, - { - "id": 3317602, - "displayName": "4.10.9", - "fileName": "Bartender4-4.10.9.zip", - "fileDate": "2021-05-21T07:53:39.97Z", - "fileLength": 321679, - "releaseType": 1, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3317/602/Bartender4-4.10.9.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [ - { - "id": 64315852, - "addonId": 14295, - "type": 1, - "fileId": 3317602 - }, - { - "id": 64315855, - "addonId": 26499, - "type": 1, - "fileId": 3317602 - }, - { - "id": 64315850, - "addonId": 13376, - "type": 1, - "fileId": 3317602 - }, - { - "id": 64315848, - "addonId": 16386, - "type": 1, - "fileId": 3317602 - }, - { - "id": 64315851, - "addonId": 14328, - "type": 1, - "fileId": 3317602 - }, - { - "id": 64315854, - "addonId": 88673, - "type": 1, - "fileId": 3317602 - }, - { - "id": 64315847, - "addonId": 15552, - "type": 1, - "fileId": 3317602 - }, - { - "id": 64315853, - "addonId": 15049, - "type": 1, - "fileId": 3317602 - }, - { - "id": 64315849, - "addonId": 19651, - "type": 1, - "fileId": 3317602 - } - ], - "isAvailable": true, - "modules": [ - { - "foldername": "Bartender4", - "fingerprint": 1895300554, - "type": 3 - } - ], - "packageFingerprint": 3521037772, - "gameVersion": [ - "9.0.5" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000009.0000000000.0000000005", - "gameVersion": "9.0.5", - "gameVersionReleaseDate": "2021-03-09T00:00:00Z", - "gameVersionName": "9.0.5" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2319652, - "fileLegacyMappingId": null, - "projectId": 13501, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 666480633, - "gameVersionDateReleased": "2021-03-09T00:00:00Z", - "gameVersionMappingId": 2959198, - "gameVersionId": 8267, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - }, - { - "id": 3317611, - "displayName": "4.10.9-1-gab2e00f-classic", - "fileName": "Bartender4-4.10.9-1-gab2e00f-classic.zip", - "fileDate": "2021-05-21T08:04:26.6Z", - "fileLength": 321415, - "releaseType": 3, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3317/611/Bartender4-4.10.9-1-gab2e00f-classic.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [ - { - "id": 64316911, - "addonId": 88673, - "type": 1, - "fileId": 3317611 - }, - { - "id": 64316909, - "addonId": 14295, - "type": 1, - "fileId": 3317611 - }, - { - "id": 64316907, - "addonId": 13376, - "type": 1, - "fileId": 3317611 - }, - { - "id": 64316905, - "addonId": 15552, - "type": 1, - "fileId": 3317611 - }, - { - "id": 64316910, - "addonId": 15049, - "type": 1, - "fileId": 3317611 - }, - { - "id": 64316906, - "addonId": 16386, - "type": 1, - "fileId": 3317611 - }, - { - "id": 64316912, - "addonId": 26499, - "type": 1, - "fileId": 3317611 - }, - { - "id": 64316908, - "addonId": 14328, - "type": 1, - "fileId": 3317611 - } - ], - "isAvailable": true, - "modules": [ - { - "foldername": "Bartender4", - "fingerprint": 252935292, - "type": 3 - } - ], - "packageFingerprint": 456899979, - "gameVersion": [ - "1.13.7" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000001.0000000013.0000000007", - "gameVersion": "1.13.7", - "gameVersionReleaseDate": "2021-04-20T00:00:00Z", - "gameVersionName": "1.13.7" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2319661, - "fileLegacyMappingId": null, - "projectId": 13501, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 666485462, - "gameVersionDateReleased": "2021-04-20T00:00:00Z", - "gameVersionMappingId": 2959216, - "gameVersionId": 8292, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_classic" - }, - { - "id": 3317612, - "displayName": "4.10.9-1-gab2e00f-bcc", - "fileName": "Bartender4-4.10.9-1-gab2e00f-bcc.zip", - "fileDate": "2021-05-21T08:04:50.93Z", - "fileLength": 315282, - "releaseType": 3, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3317/612/Bartender4-4.10.9-1-gab2e00f-bcc.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [ - { - "id": 64316920, - "addonId": 26499, - "type": 1, - "fileId": 3317612 - }, - { - "id": 64316914, - "addonId": 16386, - "type": 1, - "fileId": 3317612 - }, - { - "id": 64316919, - "addonId": 88673, - "type": 1, - "fileId": 3317612 - }, - { - "id": 64316917, - "addonId": 14295, - "type": 1, - "fileId": 3317612 - }, - { - "id": 64316915, - "addonId": 13376, - "type": 1, - "fileId": 3317612 - }, - { - "id": 64316918, - "addonId": 15049, - "type": 1, - "fileId": 3317612 - }, - { - "id": 64316916, - "addonId": 14328, - "type": 1, - "fileId": 3317612 - }, - { - "id": 64316913, - "addonId": 15552, - "type": 1, - "fileId": 3317612 - } - ], - "isAvailable": true, - "modules": [ - { - "foldername": "Bartender4", - "fingerprint": 3530971563, - "type": 3 - } - ], - "packageFingerprint": 2826594191, - "gameVersion": [ - "2.5.1" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000002.0000000005.0000000001", - "gameVersion": "2.5.1", - "gameVersionReleaseDate": "2021-03-31T00:00:00Z", - "gameVersionName": "2.5.1" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2319662, - "fileLegacyMappingId": null, - "projectId": 13501, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 666485586, - "gameVersionDateReleased": "2021-03-31T00:00:00Z", - "gameVersionMappingId": 2959217, - "gameVersionId": 8287, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_burning_crusade" - }, - { - "id": 3317613, - "displayName": "4.10.9-1-gab2e00f", - "fileName": "Bartender4-4.10.9-1-gab2e00f.zip", - "fileDate": "2021-05-21T08:05:15.833Z", - "fileLength": 321853, - "releaseType": 3, - "fileStatus": 4, - "downloadUrl": "https://edge.forgecdn.net/files/3317/613/Bartender4-4.10.9-1-gab2e00f.zip", - "isAlternate": false, - "alternateFileId": 0, - "dependencies": [ - { - "id": 64316926, - "addonId": 14295, - "type": 1, - "fileId": 3317613 - }, - { - "id": 64316929, - "addonId": 26499, - "type": 1, - "fileId": 3317613 - }, - { - "id": 64316923, - "addonId": 19651, - "type": 1, - "fileId": 3317613 - }, - { - "id": 64316925, - "addonId": 14328, - "type": 1, - "fileId": 3317613 - }, - { - "id": 64316924, - "addonId": 13376, - "type": 1, - "fileId": 3317613 - }, - { - "id": 64316927, - "addonId": 15049, - "type": 1, - "fileId": 3317613 - }, - { - "id": 64316921, - "addonId": 15552, - "type": 1, - "fileId": 3317613 - }, - { - "id": 64316922, - "addonId": 16386, - "type": 1, - "fileId": 3317613 - }, - { - "id": 64316928, - "addonId": 88673, - "type": 1, - "fileId": 3317613 - } - ], - "isAvailable": true, - "modules": [ - { - "foldername": "Bartender4", - "fingerprint": 2717353747, - "type": 3 - } - ], - "packageFingerprint": 361309172, - "gameVersion": [ - "9.0.5" - ], - "sortableGameVersion": [ - { - "gameVersionPadded": "0000000009.0000000000.0000000005", - "gameVersion": "9.0.5", - "gameVersionReleaseDate": "2021-03-09T00:00:00Z", - "gameVersionName": "9.0.5" - } - ], - "installMetadata": null, - "changelog": null, - "hasInstallScript": false, - "isCompatibleWithClient": true, - "categorySectionPackageType": 1, - "restrictProjectFileAccess": 1, - "projectStatus": 4, - "renderCacheId": 2319663, - "fileLegacyMappingId": null, - "projectId": 13501, - "parentProjectFileId": null, - "parentFileLegacyMappingId": null, - "fileTypeId": null, - "exposeAsAlternative": null, - "packageFingerprintId": 666485704, - "gameVersionDateReleased": "2021-03-09T00:00:00Z", - "gameVersionMappingId": 2959218, - "gameVersionId": 8267, - "gameId": 1, - "isServerPack": false, - "serverPackFileId": null, - "gameVersionFlavor": "wow_retail" - } - ], - "categories": [ - { - "categoryId": 1018, - "name": "Action Bars", - "url": "https://www.curseforge.com/wow/addons/action-bars", - "avatarUrl": "https://media.forgecdn.net/avatars/54/454/636135209718137182.png", - "parentId": 1, - "rootId": 1, - "projectId": 13501, - "avatarId": 54454, - "gameId": 1 - } - ], - "status": 4, - "primaryCategoryId": 1018, - "categorySection": { - "id": 1, - "gameId": 1, - "name": "Addons", - "packageType": 1, - "path": "Interface\\Addons", - "initialInclusionPattern": "(?i)^([^/]+)[\\\\/]\\1\\.toc$", - "extraIncludePattern": "(?i)^[^/\\\\]+[/\\\\]Bindings\\.xml$", - "gameCategoryId": 1 - }, - "slug": "bartender4", - "gameVersionLatestFiles": [ - { - "gameVersion": "9.0.5", - "projectFileId": 3317613, - "projectFileName": "Bartender4-4.10.9-1-gab2e00f.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "2.5.1", - "projectFileId": 3317612, - "projectFileName": "Bartender4-4.10.9-1-gab2e00f-bcc.zip", - "fileType": 3, - "gameVersionFlavor": "wow_burning_crusade" - }, - { - "gameVersion": "1.13.7", - "projectFileId": 3317611, - "projectFileName": "Bartender4-4.10.9-1-gab2e00f-classic.zip", - "fileType": 3, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "9.0.5", - "projectFileId": 3317602, - "projectFileName": "Bartender4-4.10.9.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "2.5.1", - "projectFileId": 3317601, - "projectFileName": "Bartender4-4.10.9-bcc.zip", - "fileType": 1, - "gameVersionFlavor": "wow_burning_crusade" - }, - { - "gameVersion": "1.13.7", - "projectFileId": 3317600, - "projectFileName": "Bartender4-4.10.9-classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "1.13.5", - "projectFileId": 3240044, - "projectFileName": "Bartender4-4.10.7-classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "9.0.2", - "projectFileId": 3116677, - "projectFileName": "Bartender4-4.10.6.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "9.0.1", - "projectFileId": 3103586, - "projectFileName": "Bartender4-4.10.5-1-gaea0bea.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.5", - "projectFileId": 3103585, - "projectFileName": "Bartender4-4.10.5-1-gaea0bea-classic.zip", - "fileType": 3, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "9.0.1", - "projectFileId": 3086953, - "projectFileName": "Bartender4-4.10.5.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.3.0", - "projectFileId": 3078613, - "projectFileName": "Bartender4-4.9.0-16-g5a871a9.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.3", - "projectFileId": 3044583, - "projectFileName": "Bartender4-4.9.0-4-ge5bfd09-classic.zip", - "fileType": 3, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "8.3.0", - "projectFileId": 2870199, - "projectFileName": "Bartender4-4.9.0.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.3", - "projectFileId": 2870198, - "projectFileName": "Bartender4-4.9.0-classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "8.2.5", - "projectFileId": 2843094, - "projectFileName": "Bartender4-4.8.9-2-gc5bd6e2.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.2.5", - "projectFileId": 2843080, - "projectFileName": "Bartender4-4.8.9.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "1.13.2", - "projectFileId": 2843055, - "projectFileName": "Bartender4-4.8.8-2-gd43d3ab-classic.zip", - "fileType": 3, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "1.13.2", - "projectFileId": 2794702, - "projectFileName": "Bartender4-4.8.8-classic.zip", - "fileType": 1, - "gameVersionFlavor": "wow_classic" - }, - { - "gameVersion": "8.2.0", - "projectFileId": 2784179, - "projectFileName": "Bartender4-4.8.7-2-gb6977ae.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.2.0", - "projectFileId": 2780888, - "projectFileName": "Bartender4-4.8.7.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.1.5", - "projectFileId": 2724523, - "projectFileName": "Bartender4-4.8.2-19-g086a5b3.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.1.0", - "projectFileId": 2664289, - "projectFileName": "Bartender4-4.8.2.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.1.0", - "projectFileId": 2664274, - "projectFileName": "Bartender4-4.8.1-4-g1b1195b-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.0.1", - "projectFileId": 2585279, - "projectFileName": "Bartender4-4.8.1.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "8.0.1", - "projectFileId": 2585252, - "projectFileName": "Bartender4-4.8.0-2-g03ef1a8-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.3.5", - "projectFileId": 2575890, - "projectFileName": "Bartender4-4.7.10-14-g0dede90-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.3.0", - "projectFileId": 2498143, - "projectFileName": "Bartender4-4.7.10-1-g5c05e08-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.3.0", - "projectFileId": 2471453, - "projectFileName": "Bartender4-4.7.10.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.2.5", - "projectFileId": 2449589, - "projectFileName": "Bartender4-4.7.9.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.2.5", - "projectFileId": 2449586, - "projectFileName": "Bartender4-4.7.8-1-g862369f-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.2.0", - "projectFileId": 2398602, - "projectFileName": "Bartender4-4.7.7.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.2.0", - "projectFileId": 2398600, - "projectFileName": "Bartender4-74bfd21-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.1.5", - "projectFileId": 2383564, - "projectFileName": "Bartender4-233e1c3-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.1.5", - "projectFileId": 2376511, - "projectFileName": "Bartender4-4.7.6.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.1.0", - "projectFileId": 2351456, - "projectFileName": "Bartender4-4.7.5.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.1.0", - "projectFileId": 2351453, - "projectFileName": "Bartender4-f236276-alpha.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.0.3", - "projectFileId": 950885, - "projectFileName": "Bartender4-4.7.3.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "7.0.3", - "projectFileId": 947179, - "projectFileName": "Bartender4-4.7.2-4-g396325a.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.2.4", - "projectFileId": 924847, - "projectFileName": "Bartender4-4.6.14-10-g67293dd.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.2.3", - "projectFileId": 912951, - "projectFileName": "Bartender4-4.6.14-1-gb264f8d.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.2.3", - "projectFileId": 911904, - "projectFileName": "Bartender4-4.6.14.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.2.2", - "projectFileId": 898712, - "projectFileName": "Bartender4-4.6.11.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.2.2", - "projectFileId": 897886, - "projectFileName": "Bartender4-4.6.10-2-ge46e8cf.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.2.0", - "projectFileId": 886361, - "projectFileName": "Bartender4-4.6.10.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.2.0", - "projectFileId": 885628, - "projectFileName": "Bartender4-4.6.9-1-g4d76161.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.1.0", - "projectFileId": 871356, - "projectFileName": "Bartender4-4.6.8.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.1.0", - "projectFileId": 871354, - "projectFileName": "Bartender4-4.6.7-3-g3bf0410.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.0.3", - "projectFileId": 862745, - "projectFileName": "Bartender4-4.6.6-2-g4905fdf.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.0.3", - "projectFileId": 855382, - "projectFileName": "Bartender4-4.6.6.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.0.2", - "projectFileId": 826271, - "projectFileName": "Bartender4-4.6.3-1-gf6c7890.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "6.0.2", - "projectFileId": 826244, - "projectFileName": "Bartender4-4.6.3.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.4.8", - "projectFileId": 814698, - "projectFileName": "Bartender4-4.5.13.2-10-g430843a.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.4.7", - "projectFileId": 790340, - "projectFileName": "Bartender4-4.5.13.2-8-gdbd8c46.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.4.1", - "projectFileId": 755334, - "projectFileName": "Bartender4-4.5.13.2-4-g26c7a85.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.4.0", - "projectFileId": 749972, - "projectFileName": "Bartender4-4.5.13.2.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.4.0", - "projectFileId": 749970, - "projectFileName": "Bartender4-4.5.13.1-1-gee6fa4b.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.3.0", - "projectFileId": 707060, - "projectFileName": "Bartender4-4.5.10.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.3.0", - "projectFileId": 707051, - "projectFileName": "Bartender4-4.5.9-1-g4d98fdf.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.2.0", - "projectFileId": 687109, - "projectFileName": "Bartender4-4.5.9.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.2.0", - "projectFileId": 687096, - "projectFileName": "Bartender4-4.5.6-1-g8e6e8e9.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.1.0", - "projectFileId": 651834, - "projectFileName": "Bartender4-4.5.8.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.0.5", - "projectFileId": 630379, - "projectFileName": "Bartender4-4.5.5.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.0.5", - "projectFileId": 628961, - "projectFileName": "Bartender4-4.5.4-1-g764fc96.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.0.4", - "projectFileId": 621674, - "projectFileName": "Bartender4-4.5.3-7-gabdfcec.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "5.0.4", - "projectFileId": 620790, - "projectFileName": "Bartender4-4.5.3.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.3.4", - "projectFileId": 602937, - "projectFileName": "Bartender4-4.4.20-3-g688c5a8.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.3.4", - "projectFileId": 601940, - "projectFileName": "Bartender4-mop-fixes-4.4.20.1-nolib.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.2.0", - "projectFileId": 601938, - "projectFileName": "Bartender4-mop-fixes-4.4.19-nolib.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.1.0", - "projectFileId": 601937, - "projectFileName": "Bartender4-mop-fixes-4.4.18-nolib.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.0.6", - "projectFileId": 601936, - "projectFileName": "Bartender4-mop-fixes-4.4.17-nolib.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.3.5", - "projectFileId": 601927, - "projectFileName": "Bartender4-mop-fixes-4.4.2-nolib.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.2.0", - "projectFileId": 601926, - "projectFileName": "Bartender4-mop-fixes-4.4.1-nolib.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.1.0", - "projectFileId": 601924, - "projectFileName": "Bartender4-mop-fixes-4.3.3-nolib.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.1.0", - "projectFileId": 601920, - "projectFileName": "Bartender4-mop-fixes-4.3.0-beta2-nolib.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.0.9", - "projectFileId": 601917, - "projectFileName": "Bartender4-mop-fixes-4.2.6-nolib.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.0.9", - "projectFileId": 601910, - "projectFileName": "Bartender4-mop-fixes-4.2.0-beta3-nolib.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "2.4.3", - "projectFileId": 601805, - "projectFileName": "Bartender4-mop-fixes-4.0.1.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.3.0", - "projectFileId": 560493, - "projectFileName": "Bartender4-4.4.20-2-g04cabae.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.3.0", - "projectFileId": 555596, - "projectFileName": "Bartender4-4.4.20.1.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.2.0", - "projectFileId": 548704, - "projectFileName": "Bartender4-4.4.19-5-g3ec39e4.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.1.0", - "projectFileId": 527925, - "projectFileName": "Bartender4-4.4.18-1-g8e40ddc.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.0.6", - "projectFileId": 504195, - "projectFileName": "Bartender4-4.4.16-1-gd79a65d.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.0.3", - "projectFileId": 480845, - "projectFileName": "Bartender4-4.4.14-5-g2d49a36.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.0.3", - "projectFileId": 480424, - "projectFileName": "Bartender4-4.4.14.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.0.1", - "projectFileId": 478936, - "projectFileName": "Bartender4-4.4.13-7-g2f970dc.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "4.0.1", - "projectFileId": 470217, - "projectFileName": "Bartender4-4.4.13.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.3.5", - "projectFileId": 439962, - "projectFileName": "Bartender4-4.4.2-12-g94f3b58.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.2.0", - "projectFileId": 399997, - "projectFileName": "Bartender4-blizzardart-alpha1-7-ga4d3c23.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.3.0", - "projectFileId": 399065, - "projectFileName": "Bartender4-4.4.2.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.3.0", - "projectFileId": 399052, - "projectFileName": "Bartender4-4.4.1-6-gfb3b048.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.0.8", - "projectFileId": 328738, - "projectFileName": "Bartender4-4.2.5-2-g53cf1e1.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.0.8", - "projectFileId": 327005, - "projectFileName": "Bartender4-4.2.5.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.0.3", - "projectFileId": 325296, - "projectFileName": "Bartender4-4.2.3-6-g4f7c46a.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.0.3", - "projectFileId": 322001, - "projectFileName": "Bartender4-4.2.3.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.0.2", - "projectFileId": 306123, - "projectFileName": "Bartender4-4.1.2-25-g94b3dec.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "3.0.2", - "projectFileId": 298025, - "projectFileName": "Bartender4-4.1.2.zip", - "fileType": 1, - "gameVersionFlavor": "wow_retail" - }, - { - "gameVersion": "2.4.3", - "projectFileId": 146284, - "projectFileName": "Bartender4-4.0.1-1-g9d6bc2b.zip", - "fileType": 3, - "gameVersionFlavor": "wow_retail" - } - ], - "isFeatured": false, - "popularityScore": 81166.796875, - "gamePopularityRank": 10, - "primaryLanguage": "enUS", - "gameSlug": "wow", - "gameName": "World of Warcraft", - "portalName": "www.curseforge.com", - "dateModified": "2021-05-21T08:06:47.507Z", - "dateCreated": "2008-09-14T11:33:16Z", - "dateReleased": "2021-05-21T08:05:15.833Z", - "isAvailable": true, - "isExperiemental": false -} diff --git a/test/fixtures/user-catalogue--tukui-classic-tbc.json b/test/fixtures/user-catalogue--tukui-classic-tbc.json deleted file mode 100644 index 92bb4de4..00000000 --- a/test/fixtures/user-catalogue--tukui-classic-tbc.json +++ /dev/null @@ -1,435 +0,0 @@ -[ - { - "id": "3", - "name": "AddOnSkins", - "small_desc": "Skins for AddOns", - "author": "Azilroka", - "version": "4.51", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1618533934/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=3", - "category": "Skins", - "downloads": "26738", - "lastupdate": "2021-04-16 00:50:31", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=3", - "last_download": "2021-06-26 15:07:44", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=3&changelog" - }, - { - "id": "13", - "name": "BenikUI - TBC", - "small_desc": "BenikUI is an external ElvUI TBC mod, adding different frame style and new features like detatched portraits and dashboards.", - "author": "Benik", - "version": "1.04", - "screenshot_url": "https://www.tukui.org/addons/Benik/1621553245/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=13", - "category": "Plugins: ElvUI", - "downloads": "13720", - "lastupdate": "2021-05-30 15:25:25", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=13", - "last_download": "2021-06-26 15:09:12", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=13&changelog", - "donate_url": "https://www.paypal.com/paypalme/benikui" - }, - { - "id": "5", - "name": "Custom Tags", - "small_desc": "A collection of custom unitframe tags requested by users.", - "author": "Azilroka", - "version": "1.09", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1618764093/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=5", - "category": "Plugins: ElvUI", - "downloads": "2684", - "lastupdate": "2021-04-18 16:41:33", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=5", - "last_download": "2021-06-26 12:40:42", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE" - }, - { - "id": "25", - "name": "Dynamic Status Icons", - "small_desc": "Adds various status icons to ElvUI UnitFrames", - "author": "Repooc", - "version": "1.05", - "screenshot_url": "https://www.tukui.org/addons/Repooc/1623311494/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=25", - "category": "Plugins: ElvUI", - "downloads": "379", - "lastupdate": "2021-06-14 22:01:30", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=25", - "last_download": "2021-06-26 04:14:41", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=25&changelog", - "donate_url": "https://paypal.me/repooc" - }, - { - "id": "10", - "name": "Eltruism", - "small_desc": "Eltruism is a plugin that includes DPS/Tank/Healer profiles and more features not available in base ElvUI", - "author": "eltreum", - "version": "2.3.6", - "screenshot_url": "https://www.tukui.org/addons/eltreum/1621352923/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=10", - "category": "Plugins: ElvUI", - "downloads": "7853", - "lastupdate": "2021-06-26 02:40:37", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=10", - "last_download": "2021-06-26 15:05:49", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=10&changelog" - }, - { - "id": "2", - "name": "ElvUI", - "small_desc": "A USER INTERFACE DESIGNED AROUND USER-FRIENDLINESS WITH EXTRA FEATURES THAT ARE NOT INCLUDED IN THE STANDARD UI.", - "author": "Elv", - "version": "2.10", - "screenshot_url": "https://www.tukui.org/addons/Elv/1618532665/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=2", - "category": "Interfaces", - "downloads": "955986", - "lastupdate": "2021-06-20 20:49:34", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=2", - "last_download": "2021-06-26 15:14:57", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=2&changelog", - "donate_url": "https://www.tukui.org/support.php" - }, - { - "id": "12", - "name": "ElvUI EasyBuff", - "small_desc": "Monitor and reapply Buffs to yourself and your raid with a simple mouse wheel scroll. Automatically remove unwanted buffs too!", - "author": "foo_", - "version": "1.4.1", - "screenshot_url": "https://www.tukui.org/addons/foo_/1621499112/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=12", - "category": "Plugins: ElvUI", - "downloads": "10215", - "lastupdate": "2021-05-29 03:30:31", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=12", - "last_download": "2021-06-26 14:29:11", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=12&changelog" - }, - { - "id": "14", - "name": "ElvUI Login Screen and Character Select", - "small_desc": "Glues and Buttons to update the Login Screen and Character Select to the ElvUI Style", - "author": "eltreum", - "version": "2.0.0", - "screenshot_url": "https://www.tukui.org/addons/eltreum/1621602053/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=14", - "category": "Skins", - "downloads": "7627", - "lastupdate": "2021-05-30 15:46:15", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=14", - "last_download": "2021-06-26 14:29:23", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=14&changelog" - }, - { - "id": "19", - "name": "ElvUI PVP Data Text", - "small_desc": "Create a data text to display PVP information", - "author": "Hydra", - "version": "1.07", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1621755716/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=19", - "category": "Plugins: ElvUI", - "downloads": "2597", - "lastupdate": "2021-06-16 08:51:17", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=19", - "last_download": "2021-06-26 14:45:04", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=19&changelog", - "donate_url": "https://paypal.me/vuiaddon" - }, - { - "id": "11", - "name": "ElvUI TauntAlert", - "small_desc": "Simple taunt notification plugin. Configure display and sounds for taunt events.", - "author": "foo_", - "version": "1.2.2", - "screenshot_url": "https://www.tukui.org/addons/foo_/1621486905/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=11", - "category": "Plugins: ElvUI", - "downloads": "4049", - "lastupdate": "2021-05-31 03:25:19", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=11", - "last_download": "2021-06-26 15:13:30", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=11&changelog" - }, - { - "id": "8", - "name": "ElvUI_LuckyoneUI TBC", - "small_desc": "Luckyone's ElvUI Edit: Layouts, Tags, Options and AddOn profiles", - "author": "Luckyone", - "version": "1.29", - "screenshot_url": "https://www.tukui.org/addons/Luckyone/1621022575/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=8", - "category": "Plugins: ElvUI", - "downloads": "13087", - "lastupdate": "2021-06-08 10:25:10", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=8", - "last_download": "2021-06-26 15:03:01", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=8&changelog", - "donate_url": "https://streamlabs.com/luckyone1996/tip" - }, - { - "id": "24", - "name": "ElvUI_mMediaTag TBC", - "small_desc": "", - "author": "Blinkii", - "version": "2.62", - "screenshot_url": "https://www.tukui.org/addons/Blinkii/1623078577/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=24", - "category": "Plugins: ElvUI", - "downloads": "817", - "lastupdate": "2021-06-09 09:39:55", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=24", - "last_download": "2021-06-26 14:26:27", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=24&changelog" - }, - { - "id": "20", - "name": "Gathering", - "small_desc": "Display per-hour gathering rates of items in a clean tooltip", - "author": "Hydra", - "version": "1.41", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1621973156/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=20", - "category": "Professions", - "downloads": "6084", - "lastupdate": "2021-06-18 19:30:06", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=20", - "last_download": "2021-06-26 15:12:37", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=20&changelog", - "donate_url": "https://www.paypal.me/vuiaddon" - }, - { - "id": "15", - "name": "GennUI TBC", - "small_desc": "A clean minimalistic edit for ElvUI.", - "author": "Gennoken", - "version": "1.02", - "screenshot_url": "https://www.tukui.org/addons/Gennoken/1621768119/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=15", - "category": "Plugins: ElvUI", - "downloads": "2926", - "lastupdate": "2021-05-31 22:01:27", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=15", - "last_download": "2021-06-26 15:01:16", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=15&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4QJDXS8MBAZS&source=url" - }, - { - "id": "6", - "name": "HydraUI", - "small_desc": "A visual interface replacement. It restyles the default interface, while adding many useful features.", - "author": "Hydra", - "version": "1.13", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1619382889/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=6", - "category": "Interfaces", - "downloads": "6883", - "lastupdate": "2021-06-22 03:44:04", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=6", - "last_download": "2021-06-26 15:00:43", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=6&changelog", - "donate_url": "https://www.paypal.me/vuiaddon" - }, - { - "id": "22", - "name": "Location Plus - TBC", - "small_desc": "Adds player location, coords + 2 Datatexts and a tooltip with info based on player location/level. ", - "author": "Benik", - "version": "1.01", - "screenshot_url": "https://www.tukui.org/addons/Benik/1622389128/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=22", - "category": "Plugins: ElvUI", - "downloads": "3611", - "lastupdate": "2021-05-30 19:18:26", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=22", - "last_download": "2021-06-26 14:47:16", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=22&changelog", - "donate_url": "https://www.paypal.com/paypalme/benikui" - }, - { - "id": "26", - "name": "MaxUI Classic TBC", - "small_desc": "MaxUI Classic TBC is an external edit for Tukui and World of Warcraft Classic TBC.", - "author": "Maximvs", - "version": "6.501", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1624115740/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=26", - "category": "Edited UIs & Compilations", - "downloads": "212", - "lastupdate": "2021-06-19 15:13:15", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=26", - "last_download": "2021-06-26 15:04:00", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=26&changelog" - }, - { - "id": "21", - "name": "MerathilisUI-TBC", - "small_desc": "ElvUI_MerathilisUI is an external ElvUI Mod. Mostly for the design in a transparent look with a few additional features.", - "author": "Merathilis", - "version": "1.01", - "screenshot_url": "https://www.tukui.org/addons/Merathilis/1622182915/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=21", - "category": "Plugins: ElvUI", - "downloads": "2012", - "lastupdate": "2021-06-08 06:21:52", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=21", - "last_download": "2021-06-26 14:38:51", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=21&changelog", - "donate_url": "https://paypal.me/merathilis" - }, - { - "id": "9", - "name": "NoobTacoUI", - "small_desc": "NoobTacoUI is an ElvUI Profile that uses the Nord Theme Color scheme of web development", - "author": "NoobTaco", - "version": "1.2.5", - "screenshot_url": "https://www.tukui.org/addons/NoobTaco/1621299522/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=9", - "category": "Edited UIs & Compilations", - "downloads": "1717", - "lastupdate": "2021-05-24 16:41:32", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=9", - "last_download": "2021-06-26 13:46:09", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=9&changelog", - "donate_url": "https://www.paypal.com/donate?hosted_button_id=2DS266TUNQHCW" - }, - { - "id": "23", - "name": "OrkoUI TBC", - "small_desc": "A unique user interface using ElvUI as the core containing a normal and a healer layout.", - "author": "ThreeLeos", - "version": "1.3", - "screenshot_url": "https://www.tukui.org/addons/ThreeLeos/1622579853/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=23", - "category": "Edited UIs & Compilations", - "downloads": "671", - "lastupdate": "2021-06-19 03:39:45", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=23", - "last_download": "2021-06-26 09:06:51", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=23&changelog", - "donate_url": "https://www.paypal.com/donate/?token=xpFVYvhiWad2hXK0SnXHFUVIBuwD7MKHJBjkfPyvGxTTLe__J8PyOtcnmCd3KFLYsByBHG&country.x=US&locale.x=US" - }, - { - "id": "7", - "name": "PatUI TBC", - "small_desc": "PatUI external edit of Tukui TBC", - "author": "Pat", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/Pat/1620761055/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=7", - "category": "Edited UIs & Compilations", - "downloads": "1314", - "lastupdate": "2021-05-18 20:38:06", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=7", - "last_download": "2021-06-26 11:23:13", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=7&changelog" - }, - { - "id": "16", - "name": "ProjectAzilroka", - "small_desc": "Projects by Azilroka", - "author": "Azilroka", - "version": "1.78", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1621733812/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=16", - "category": "Miscellaneous", - "downloads": "5736", - "lastupdate": "2021-05-23 01:36:52", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=16", - "last_download": "2021-06-26 14:14:04", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=16&changelog", - "donate_url": "https://www.paypal.com/donate/?token=tITyMoJuBuoLPPvTu3sPp1pHi3FZfzEdIJX1FhwA9tvTe01diwPnRm_8xSo2haJ4XkK_rm&country.x=US&locale.x=US" - }, - { - "id": "4", - "name": "RedtuzkUI TBC", - "small_desc": "RedtuzkUI TBC Classic is a clean and functional external edit for ElvUI.", - "author": "Redtuzk", - "version": "1.5.0", - "screenshot_url": "https://www.tukui.org/addons/Redtuzk/1621367637/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=4", - "category": "Plugins: ElvUI", - "downloads": "15178", - "lastupdate": "2021-05-18 18:52:11", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=4", - "last_download": "2021-06-26 15:14:26", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=4&changelog", - "donate_url": "http://paypal.me/redtuzk" - }, - { - "id": "1", - "name": "Tukui", - "small_desc": "A clean, lightweight, minimalist and popular user interface among the warcraft community since 2007.", - "author": "Tukz", - "version": "20.22", - "screenshot_url": "https://www.tukui.org/addons/Tukz/1618531589/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=1", - "category": "Interfaces", - "downloads": "40191", - "lastupdate": "2021-06-09 10:24:53", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=1", - "last_download": "2021-06-26 15:11:00", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=1&changelog", - "donate_url": "https://www.tukui.org/support.php" - }, - { - "id": "17", - "name": "Tukui Ammo Data Text", - "small_desc": "Create a data text to display ammo count", - "author": "Hydra", - "version": "1.03", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1621740985/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=17", - "category": "Plugins: Tukui", - "downloads": "909", - "lastupdate": "2021-05-23 03:36:25", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=17", - "last_download": "2021-06-26 11:25:45", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=17&changelog", - "donate_url": "https://paypal.me/vuiaddon" - }, - { - "id": "18", - "name": "Tukui PVP Data Text", - "small_desc": "Create a data text to display PVP information", - "author": "Hydra", - "version": "1.04", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1621746009/screenshot.png", - "url": "https://www.tukui.org/classic-tbc-addons.php?download=18", - "category": "Plugins: Tukui", - "downloads": "1328", - "lastupdate": "2021-05-23 05:00:09", - "patch": "2.5.1", - "web_url": "https://www.tukui.org/classic-tbc-addons.php?id=18", - "last_download": "2021-06-26 11:19:40", - "changelog": "https://www.tukui.org/classic-tbc-addons.php?id=18&changelog", - "donate_url": "https://paypal.me/vuiaddon" - } -] \ No newline at end of file diff --git a/test/fixtures/user-catalogue--tukui-classic.json b/test/fixtures/user-catalogue--tukui-classic.json deleted file mode 100644 index 65eb56cf..00000000 --- a/test/fixtures/user-catalogue--tukui-classic.json +++ /dev/null @@ -1,718 +0,0 @@ -[ - { - "id": "3", - "name": "AddOnSkins", - "small_desc": "Skins for Blizzard UI & AddOns", - "author": "Azilroka", - "version": "4.51", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1565734166/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=3", - "category": "Skins", - "downloads": "182881", - "lastupdate": "2021-04-18 15:54:47", - "patch": "1.13.6", - "web_url": "https://www.tukui.org/classic-addons.php?id=3", - "last_download": "2021-06-26 01:35:21", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE" - }, - { - "id": "36", - "name": "AlysiaUI_Classic", - "small_desc": "clean and modern UI with Tank/DPS and Heal Layout. transparent and Classcolor Themes are available.", - "author": "Dlarge", - "version": "1.02", - "screenshot_url": "https://www.tukui.org/addons/Dlarge/1588623355/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=36", - "category": "Plugins: ElvUI", - "downloads": "4797", - "lastupdate": "2020-05-05 20:17:14", - "patch": "1.13.4", - "web_url": "https://www.tukui.org/classic-addons.php?id=36", - "last_download": "2021-06-25 19:55:21", - "changelog": "https://www.tukui.org/classic-addons.php?id=36&changelog" - }, - { - "id": "13", - "name": "BenikUI Classic", - "small_desc": "BenikUI is an external ElvUI Classic mod, adding different frame style and new features like detatched portraits and dashboards.", - "author": "Benik", - "version": "1.18", - "screenshot_url": "https://www.tukui.org/addons/Benik/1567123192/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=13", - "category": "Plugins: ElvUI", - "downloads": "71507", - "lastupdate": "2021-04-15 07:58:03", - "patch": "1.13.6", - "web_url": "https://www.tukui.org/classic-addons.php?id=13", - "last_download": "2021-06-26 00:01:25", - "changelog": "https://www.tukui.org/classic-addons.php?id=13&changelog", - "donate_url": "https://www.paypal.com/paypalme/benikui" - }, - { - "id": "30", - "name": "Custom Tags", - "small_desc": "A collection of custom unitframe tags requested by users.", - "author": "Azilroka", - "version": "1.09", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1572490846/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=30", - "category": "Plugins: ElvUI", - "downloads": "8399", - "lastupdate": "2021-04-18 16:39:32", - "patch": "1.13.6", - "web_url": "https://www.tukui.org/classic-addons.php?id=30", - "last_download": "2021-06-25 06:10:54", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE" - }, - { - "id": "7", - "name": "DSM Classic", - "small_desc": "Small collection of shared media to insert to Elvui or any other UI that supports SharedMedia for Classic.", - "author": "Dajova", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/Dajova/1566157544/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=7", - "category": "Miscellaneous", - "downloads": "13141", - "lastupdate": "2019-08-18 19:45:44", - "patch": "1.13.2", - "web_url": "https://www.tukui.org/classic-addons.php?id=7", - "last_download": "2021-06-25 10:22:45", - "changelog": "https://www.tukui.org/classic-addons.php?id=7&changelog" - }, - { - "id": "51", - "name": "Dynamic Status Icons", - "small_desc": "Adds various status icons to ElvUI UnitFrames", - "author": "Repooc", - "version": "1.05", - "screenshot_url": "https://www.tukui.org/addons/Repooc/1623313089/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=51", - "category": "Plugins: ElvUI", - "downloads": "58", - "lastupdate": "2021-06-14 22:01:06", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=51", - "last_download": "2021-06-25 06:13:00", - "changelog": "https://www.tukui.org/classic-addons.php?id=51&changelog", - "donate_url": "https://paypal.me/repooc" - }, - { - "id": "49", - "name": "Eltruism", - "small_desc": "Eltruism is a plugin that includes DPS/Tank/Healer profiles and more features not available in base ElvUI", - "author": "eltreum", - "version": "2.3.5", - "screenshot_url": "https://www.tukui.org/addons/eltreum/1621352923/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=49", - "category": "Plugins: ElvUI", - "downloads": "777", - "lastupdate": "2021-06-24 17:05:49", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=49", - "last_download": "2021-06-25 21:37:09", - "changelog": "https://www.tukui.org/classic-addons.php?id=49&changelog" - }, - { - "id": "2", - "name": "ElvUI", - "small_desc": "A USER INTERFACE DESIGNED AROUND USER-FRIENDLINESS WITH EXTRA FEATURES THAT ARE NOT INCLUDED IN THE STANDARD UI.\r\n", - "author": "Elv", - "version": "1.44", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1566071430/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=2", - "category": "Interfaces", - "downloads": "2230656", - "lastupdate": "2021-05-31 02:07:52", - "patch": "1.13.6", - "web_url": "https://www.tukui.org/classic-addons.php?id=2", - "last_download": "2021-06-26 02:02:20", - "changelog": "https://www.tukui.org/classic-addons.php?id=2&changelog" - }, - { - "id": "31", - "name": "ELVUI DATATEXT BARS 2 - Classic", - "small_desc": "", - "author": "Merathilis", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/Merathilis/1585202303/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=31", - "category": "Plugins: ElvUI", - "downloads": "6650", - "lastupdate": "2020-03-26 05:58:23", - "patch": "1.13.4", - "web_url": "https://www.tukui.org/classic-addons.php?id=31", - "last_download": "2021-06-25 10:00:14", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=GHQCQTKD9NKDA&item_name=DTBars2+(tukui.org)" - }, - { - "id": "34", - "name": "ElvUI EasyBuff", - "small_desc": "Monitor and reapply Buffs to yourself and your raid with a simple mouse wheel scroll! (NEW) Automatically remove unwanted buffs too!", - "author": "foo_", - "version": "1.1.7", - "screenshot_url": "https://www.tukui.org/addons/foo_/1586805226/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=34", - "category": "Plugins: ElvUI", - "downloads": "8780", - "lastupdate": "2020-05-06 07:05:50", - "patch": "1.13.4", - "web_url": "https://www.tukui.org/classic-addons.php?id=34", - "last_download": "2021-06-26 01:13:22", - "changelog": "https://www.tukui.org/classic-addons.php?id=34&changelog" - }, - { - "id": "50", - "name": "ElvUI Login Screen and Character Select", - "small_desc": "Glues and Buttons to update the Login Screen and Character Select to the ElvUI Style", - "author": "eltreum", - "version": "2.0.0", - "screenshot_url": "https://www.tukui.org/addons/eltreum/1621602049/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=50", - "category": "Skins", - "downloads": "629", - "lastupdate": "2021-05-30 15:46:21", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=50", - "last_download": "2021-06-25 06:12:50", - "changelog": "https://www.tukui.org/classic-addons.php?id=50&changelog" - }, - { - "id": "22", - "name": "ElvUI Nuts and Bolts Classic", - "small_desc": "A compilation of useful mini addons.", - "author": "Benik", - "version": "1.04", - "screenshot_url": "https://www.tukui.org/addons/Benik/1568533911/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=22", - "category": "Plugins: ElvUI", - "downloads": "32750", - "lastupdate": "2020-10-18 13:54:56", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=22", - "last_download": "2021-06-26 00:38:10", - "changelog": "https://www.tukui.org/classic-addons.php?id=22&changelog", - "donate_url": "https://www.paypal.com/paypalme/benikui" - }, - { - "id": "24", - "name": "ElvUI Progressive Colored DataBars", - "small_desc": "Colorize and customize ElvUI Classic's DataBars", - "author": "Myrroddin", - "version": "1.0.1", - "screenshot_url": "https://www.tukui.org/addons/Myrroddin/1568856414/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=24", - "category": "Plugins: ElvUI", - "downloads": "10636", - "lastupdate": "2020-07-29 00:47:54", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=24", - "last_download": "2021-06-25 19:55:11", - "changelog": "https://www.tukui.org/classic-addons.php?id=24&changelog", - "donate_url": "https://www.patreon.com/Myrroddin" - }, - { - "id": "39", - "name": "ElvUI PVP Data Text", - "small_desc": "Create a data text to display PVP information", - "author": "Hydra", - "version": "1.06", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1590358882/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=39", - "category": "Plugins: ElvUI", - "downloads": "6782", - "lastupdate": "2021-04-25 18:53:26", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=39", - "last_download": "2021-06-25 06:11:11", - "changelog": "https://www.tukui.org/classic-addons.php?id=39&changelog", - "donate_url": "https://paypal.me/vuiaddon" - }, - { - "id": "33", - "name": "ElvUI TauntAlert", - "small_desc": "Simple taunt notification plugin. Configure display and sounds for taunt events.", - "author": "foo_", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/foo_/1586624391/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=33", - "category": "Plugins: ElvUI", - "downloads": "6060", - "lastupdate": "2020-04-11 16:59:51", - "patch": "1.13.4", - "web_url": "https://www.tukui.org/classic-addons.php?id=33", - "last_download": "2021-06-25 19:55:14" - }, - { - "id": "15", - "name": "ElvUI UnitFramePlugin", - "small_desc": "Plugin to make your health/power frame transparent.", - "author": "Lifeismystery", - "version": "1.1", - "screenshot_url": "https://www.tukui.org/addons/lifeismystery/1567323668/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=15", - "category": "Unit Frames", - "downloads": "14495", - "lastupdate": "2019-09-01 14:23:54", - "patch": "1.13.2", - "web_url": "https://www.tukui.org/classic-addons.php?id=15", - "last_download": "2021-06-25 21:51:01", - "donate_url": "https://www.paypal.me/lifeismystery" - }, - { - "id": "11", - "name": "ELVUI ZARAC G13", - "small_desc": "", - "author": "ZARAC", - "version": "0.12", - "screenshot_url": "https://www.tukui.org/addons/Zarac/1566954420/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=11", - "category": "Action Bars", - "downloads": "6068", - "lastupdate": "2019-08-28 01:07:00", - "patch": "1.13.2", - "web_url": "https://www.tukui.org/classic-addons.php?id=11", - "last_download": "2021-06-25 06:11:20" - }, - { - "id": "12", - "name": "ElvUI_ExtraDataTexts_Classic", - "small_desc": "", - "author": "Caedis", - "version": "1.0.2", - "screenshot_url": "https://www.tukui.org/addons/Caedis/1567026902/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=12", - "category": "Plugins: ElvUI", - "downloads": "37534", - "lastupdate": "2019-09-02 01:38:14", - "patch": "1.13.2", - "web_url": "https://www.tukui.org/classic-addons.php?id=12", - "last_download": "2021-06-25 20:34:11", - "changelog": "https://www.tukui.org/classic-addons.php?id=12&changelog" - }, - { - "id": "48", - "name": "ElvUI_LuckyoneUI Classic", - "small_desc": "Luckyone's ElvUI Edit: Layouts, Tags, Options and AddOn profiles", - "author": "Luckyone", - "version": "1.29", - "screenshot_url": "https://www.tukui.org/addons/Luckyone/1621022425/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=48", - "category": "Plugins: ElvUI", - "downloads": "1165", - "lastupdate": "2021-06-08 10:25:06", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=48", - "last_download": "2021-06-25 15:26:23", - "changelog": "https://www.tukui.org/classic-addons.php?id=48&changelog", - "donate_url": "https://streamlabs.com/luckyone1996/tip" - }, - { - "id": "32", - "name": "ElvUI_mMediaTagClassic", - "small_desc": "Statusbar Textur, Tags and Datatext", - "author": "Blinkii", - "version": "2.62", - "screenshot_url": "https://www.tukui.org/addons/Blinkii/1586266837/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=32", - "category": "Plugins: ElvUI", - "downloads": "9565", - "lastupdate": "2021-06-09 09:39:13", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=32", - "last_download": "2021-06-25 23:49:01", - "changelog": "https://www.tukui.org/classic-addons.php?id=32&changelog" - }, - { - "id": "40", - "name": "Gathering Classic", - "small_desc": "Display per-hour gathering rates of items in a clean tooltip", - "author": "Hydra", - "version": "1.35", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1592243339/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=40", - "category": "Professions", - "downloads": "8783", - "lastupdate": "2021-06-14 20:01:14", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=40", - "last_download": "2021-06-25 18:06:29", - "changelog": "https://www.tukui.org/classic-addons.php?id=40&changelog", - "donate_url": "https://www.paypal.me/vuiaddon" - }, - { - "id": "17", - "name": "GennUI Classic", - "small_desc": "A clean minimalistic edit for ElvUI.", - "author": "Gennoken", - "version": "1.25", - "screenshot_url": "https://www.tukui.org/addons/Gennoken/1621767968/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=17", - "category": "Plugins: ElvUI", - "downloads": "12708", - "lastupdate": "2021-05-23 11:05:50", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=17", - "last_download": "2021-06-25 06:09:09", - "changelog": "https://www.tukui.org/classic-addons.php?id=17&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4QJDXS8MBAZS&source=url" - }, - { - "id": "41", - "name": "HydraUI", - "small_desc": "A visual interface replacement. It restyles the default interface, while adding many useful features.", - "author": "Hydra", - "version": "1.11", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1592326687/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=41", - "category": "Interfaces", - "downloads": "11372", - "lastupdate": "2021-06-22 04:01:13", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=41", - "last_download": "2021-06-25 22:47:43", - "changelog": "https://www.tukui.org/classic-addons.php?id=41&changelog", - "donate_url": "https://www.paypal.me/vuiaddon" - }, - { - "id": "14", - "name": "LocationPlus Classic for ElvUI", - "small_desc": "Adds player location, coords + 2 Datatexts and a tooltip with info based on player location/level. ", - "author": "Benik", - "version": "1.05", - "screenshot_url": "https://www.tukui.org/addons/Benik/1567292532/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=14", - "category": "Plugins: ElvUI", - "downloads": "42520", - "lastupdate": "2020-09-21 13:30:12", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=14", - "last_download": "2021-06-25 23:43:40", - "changelog": "https://www.tukui.org/classic-addons.php?id=14&changelog", - "donate_url": "https://www.paypal.com/paypalme/benikui" - }, - { - "id": "27", - "name": "Masque: Epix", - "small_desc": "Masque Skin for the ever popular addon Masque.", - "author": "EPIX", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/Epix/1569420066/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=27", - "category": null, - "downloads": "5903", - "lastupdate": "2019-09-25 14:01:06", - "patch": "1.13.2", - "web_url": "https://www.tukui.org/classic-addons.php?id=27", - "last_download": "2021-06-25 22:17:28", - "changelog": "https://www.tukui.org/classic-addons.php?id=27&changelog" - }, - { - "id": "5", - "name": "MaxUI Classic", - "small_desc": "MaxUI Classic is an external edit for Tukui Classic and World of Warcraft Classic.", - "author": "Maximvs", - "version": "5.53", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1565647416/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=5", - "category": "Edited UIs & Compilations", - "downloads": "17875", - "lastupdate": "2020-07-08 22:00:38", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=5", - "last_download": "2021-06-25 18:32:12", - "changelog": "https://www.tukui.org/classic-addons.php?id=5&changelog" - }, - { - "id": "10", - "name": "MerathilisUI-Classic", - "small_desc": "ElvUI_MerathilisUI is an external ElvUI Mod. Mostly for the design in a transparent look with a few additional features.", - "author": "Merathilis", - "version": "1.53", - "screenshot_url": "https://www.tukui.org/addons/Merathilis/1566889197/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=10", - "category": "Plugins: ElvUI", - "downloads": "20509", - "lastupdate": "2020-09-09 15:00:35", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=10", - "last_download": "2021-06-25 06:05:15", - "changelog": "https://www.tukui.org/classic-addons.php?id=10&changelog", - "donate_url": "https://paypal.me/merathilis" - }, - { - "id": "35", - "name": "MOGUI: Classic Edition", - "small_desc": "MOGUI is a project of my own design, it is made for all classes and roles. ", - "author": "MaximumOverdrive", - "version": "1.1", - "screenshot_url": "https://www.tukui.org/addons/MaximumOverdrive/1587592805/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=35", - "category": "Edited UIs & Compilations", - "downloads": "4699", - "lastupdate": "2020-04-22 22:00:05", - "patch": "1.13.4", - "web_url": "https://www.tukui.org/classic-addons.php?id=35", - "last_download": "2021-06-24 03:50:27", - "changelog": "https://www.tukui.org/classic-addons.php?id=35&changelog" - }, - { - "id": "21", - "name": "Neat Minimap", - "small_desc": "Hide buttons and clutter when not mousing over the minimap", - "author": "MooreaTv", - "version": "v1.07.02-c", - "screenshot_url": "https://www.tukui.org/addons/MooreaTv/1568193395/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=21", - "category": "Map & Minimap", - "downloads": "15912", - "lastupdate": "2020-12-02 01:28:29", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=21", - "last_download": "2021-06-25 06:32:11", - "changelog": "https://www.tukui.org/classic-addons.php?id=21&changelog" - }, - { - "id": "47", - "name": "NoobTacoUI - Classic", - "small_desc": "NoobTacoUI is an ElvUI Profile that uses the Nord Theme Color scheme of web development", - "author": "NoobTaco", - "version": "1.2.5", - "screenshot_url": "https://www.tukui.org/addons/NoobTaco/1618423821/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=47", - "category": "Edited UIs & Compilations", - "downloads": "810", - "lastupdate": "2021-05-24 16:40:45", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=47", - "last_download": "2021-06-25 18:32:47", - "changelog": "https://www.tukui.org/classic-addons.php?id=47&changelog", - "donate_url": "https://www.paypal.com/donate?hosted_button_id=2DS266TUNQHCW" - }, - { - "id": "4", - "name": "PatUI Classic", - "small_desc": "PatUI Classic is an external edit for Tukui Classic that changes the style of default Tukui.", - "author": "Pat", - "version": "1.3", - "screenshot_url": "https://www.tukui.org/addons/Pat/1615331885/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=4", - "category": "Edited UIs & Compilations", - "downloads": "8501", - "lastupdate": "2021-03-09 23:17:01", - "patch": "1.13.6", - "web_url": "https://www.tukui.org/classic-addons.php?id=4", - "last_download": "2021-06-25 06:49:03", - "changelog": "https://www.tukui.org/classic-addons.php?id=4&changelog" - }, - { - "id": "8", - "name": "ProjectAzilroka", - "small_desc": "ProjectAzilroka", - "author": "Azilroka", - "version": "1.78", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1566420133/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=8", - "category": "Miscellaneous", - "downloads": "50550", - "lastupdate": "2021-05-23 01:33:50", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=8", - "last_download": "2021-06-26 01:01:06", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE" - }, - { - "id": "6", - "name": "RedtuzkUI Classic", - "small_desc": "RedtuzkUI Classic is a clean and functional external edit for ElvUI.", - "author": "Redtuzk", - "version": "1.3.1", - "screenshot_url": "https://www.tukui.org/addons/Redtuzk/1587246286/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=6", - "category": "Edited UIs & Compilations", - "downloads": "82837", - "lastupdate": "2021-01-12 17:02:18", - "patch": "1.13.6", - "web_url": "https://www.tukui.org/classic-addons.php?id=6", - "last_download": "2021-06-26 00:13:03", - "changelog": "https://www.tukui.org/classic-addons.php?id=6&changelog", - "donate_url": "http://paypal.me/redtuzk" - }, - { - "id": "45", - "name": "RetroUI_CE", - "small_desc": "RetroUI_CE is a side project that calls back to UI's of the past. They were simple and usable for all classes and roles. ", - "author": "MaximumOverdrive", - "version": "1.01", - "screenshot_url": "https://www.tukui.org/addons/MaximumOverdrive/1604466846/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=45", - "category": "Plugins: ElvUI", - "downloads": "3556", - "lastupdate": "2020-11-06 21:41:45", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=45", - "last_download": "2021-06-25 15:22:27", - "changelog": "https://www.tukui.org/classic-addons.php?id=45&changelog" - }, - { - "id": "46", - "name": "Skillet-Classic", - "small_desc": "This package works on both Classic Era and Burning Crusade Classic", - "author": "bsmorgan", - "version": "1.25", - "screenshot_url": "https://www.tukui.org/addons/bsmorgan/1606756339/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=46", - "category": "Professions", - "downloads": "4950", - "lastupdate": "2021-05-31 15:36:13", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=46", - "last_download": "2021-06-26 00:09:47", - "changelog": "https://www.tukui.org/classic-addons.php?id=46&changelog" - }, - { - "id": "1", - "name": "Tukui", - "small_desc": "A clean, lightweight, minimalist and popular user interface among the warcraft community since 2007.", - "author": "Tukz", - "version": "1.38", - "screenshot_url": "https://www.tukui.org/addons/Tukz/1567179135/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=1", - "category": "Interfaces", - "downloads": "296883", - "lastupdate": "2020-07-11 23:10:36", - "patch": "1.13.4", - "web_url": "https://www.tukui.org/classic-addons.php?id=1", - "last_download": "2021-06-26 01:55:19", - "changelog": "https://www.tukui.org/classic-addons.php?id=1&changelog", - "donate_url": "https://www.tukui.org/support.php" - }, - { - "id": "37", - "name": "Tukui Ammo Data Text", - "small_desc": "Create a data text to display ammo count", - "author": "Hydra", - "version": "1.03", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1590357202/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=37", - "category": "Plugins: Tukui", - "downloads": "4777", - "lastupdate": "2021-04-25 19:03:59", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=37", - "last_download": "2021-06-20 03:07:08", - "changelog": "https://www.tukui.org/classic-addons.php?id=37&changelog", - "donate_url": "https://paypal.me/vuiaddon" - }, - { - "id": "9", - "name": "Tukui Custom Action Bar Layout", - "small_desc": "This is an addon for Tukui that allows defining a custom layout for the action bars.", - "author": "LaPoubelle", - "version": "1.01", - "screenshot_url": "https://www.tukui.org/addons/LaPoubelle/1566732623/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=9", - "category": "Plugins: Tukui", - "downloads": "9602", - "lastupdate": "2019-12-24 10:22:14", - "patch": "1.13.3", - "web_url": "https://www.tukui.org/classic-addons.php?id=9", - "last_download": "2021-06-25 06:10:01", - "changelog": "https://www.tukui.org/classic-addons.php?id=9&changelog" - }, - { - "id": "43", - "name": "Tukui Nameplate Features Classic", - "small_desc": "Extra nameplate features like scaling, alpha settings, threat options.", - "author": "Maximvs", - "version": "1.00", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1594207418/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=43", - "category": "Plugins: Tukui", - "downloads": "5268", - "lastupdate": "2020-07-08 11:23:38", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=43", - "last_download": "2021-06-20 16:44:43", - "changelog": "https://www.tukui.org/classic-addons.php?id=43&changelog" - }, - { - "id": "38", - "name": "Tukui PVP Data Text", - "small_desc": "Create a data text to display PVP information", - "author": "Hydra", - "version": "1.04", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1590358743/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=38", - "category": "Plugins: Tukui", - "downloads": "4612", - "lastupdate": "2021-04-25 19:16:59", - "patch": "1.13.7", - "web_url": "https://www.tukui.org/classic-addons.php?id=38", - "last_download": "2021-06-25 08:47:06", - "changelog": "https://www.tukui.org/classic-addons.php?id=38&changelog", - "donate_url": "https://paypal.me/vuiaddon" - }, - { - "id": "44", - "name": "Tukui Server Time Data Text", - "small_desc": "Shows the server time, along with a tooltip that shows both server and local time, when hovered. Respects the 24-hour setting from Tukui.", - "author": "botezatumihaicatalin", - "version": "1.0.0", - "screenshot_url": "https://www.tukui.org/addons/botezatumihaicatalin/1595835177/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=44", - "category": "Plugins: Tukui", - "downloads": "4536", - "lastupdate": "2020-07-27 07:32:57", - "patch": "1.13.5", - "web_url": "https://www.tukui.org/classic-addons.php?id=44", - "last_download": "2021-06-25 15:24:25" - }, - { - "id": "26", - "name": "Tukui Tracking Menu", - "small_desc": "This addon adds a drop-down menu to the tracking icon, allowing you to select what to track.", - "author": "LaPoubelle", - "version": "1.01", - "screenshot_url": "https://www.tukui.org/addons/LaPoubelle/1569248195/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=26", - "category": "Plugins: Tukui", - "downloads": "8021", - "lastupdate": "2019-12-24 11:19:52", - "patch": "1.13.3", - "web_url": "https://www.tukui.org/classic-addons.php?id=26", - "last_download": "2021-06-25 06:11:06", - "changelog": "https://www.tukui.org/classic-addons.php?id=26&changelog" - }, - { - "id": "16", - "name": "Tukui World Font", - "small_desc": "", - "author": "Tukz", - "version": "1", - "screenshot_url": "https://www.tukui.org/addons/Tukz/1567334327/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=16", - "category": "Plugins: Tukui", - "downloads": "8304", - "lastupdate": "2019-09-01 13:51:08", - "patch": "1.13.2", - "web_url": "https://www.tukui.org/classic-addons.php?id=16", - "last_download": "2021-06-26 00:01:28", - "changelog": "https://www.tukui.org/classic-addons.php?id=16&changelog" - }, - { - "id": "23", - "name": "Tukui_Microbar", - "small_desc": "microbar for Tukui", - "author": "Pat", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/Pat/1568847947/screenshot.png", - "url": "https://www.tukui.org/classic-addons.php?download=23", - "category": "Plugins: Tukui", - "downloads": "6733", - "lastupdate": "2019-09-18 23:05:47", - "patch": "1.13.2", - "web_url": "https://www.tukui.org/classic-addons.php?id=23", - "last_download": "2021-06-25 06:11:11" - } -] \ No newline at end of file diff --git a/test/fixtures/user-catalogue--tukui.json b/test/fixtures/user-catalogue--tukui.json deleted file mode 100644 index 6ddc9f95..00000000 --- a/test/fixtures/user-catalogue--tukui.json +++ /dev/null @@ -1,1685 +0,0 @@ -[ - { - "id": "3", - "name": "AddOnSkins", - "small_desc": "Skins for AddOns", - "author": "Azilroka", - "version": "4.51", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1503198132/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=3", - "category": "Skins", - "downloads": "1793960", - "lastupdate": "2021-04-18 15:54:03", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=3", - "last_download": "2021-06-26 02:02:22", - "changelog": "https://www.tukui.org/addons.php?id=3&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE" - }, - { - "id": "42", - "name": "AlhanaUI", - "small_desc": "AlhanaUI is an external Tukui edit that adds additional features and function to the existing Tukui. ", - "author": "Alhana", - "version": "4.19", - "screenshot_url": "https://www.tukui.org/addons/Alhana/1534193008/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=42", - "category": "Edited UIs & Compilations", - "downloads": "45323", - "lastupdate": "2019-07-25 17:00:42", - "patch": "8.2.5", - "web_url": "https://www.tukui.org/addons.php?id=42", - "last_download": "2021-06-25 17:37:02", - "changelog": "https://www.tukui.org/addons.php?id=42&changelog" - }, - { - "id": "82", - "name": "AlhanaUI - The ElvUI Edit", - "small_desc": "AlhanaUI - The ElvUI Edit is simply the Tukui version in ElvUI format.", - "author": "Alhana", - "version": "2.06", - "screenshot_url": "https://www.tukui.org/addons/Alhana/1510164691/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=82", - "category": "Plugins: ElvUI", - "downloads": "25328", - "lastupdate": "2018-12-14 22:48:38", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=82", - "last_download": "2021-06-25 13:05:54", - "changelog": "https://www.tukui.org/addons.php?id=82&changelog" - }, - { - "id": "67", - "name": "AlhanaUISexyMap", - "small_desc": "Allows the use of the SexyMap minimap addon in conjunction with AlhanaUI or Tukui", - "author": "Alhana", - "version": "1.03", - "screenshot_url": "https://www.tukui.org/addons/Alhana/1505999923/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=67", - "category": "Map & Minimap", - "downloads": "12247", - "lastupdate": "2019-07-25 17:02:51", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=67", - "last_download": "2021-06-25 21:34:56", - "changelog": "https://www.tukui.org/addons.php?id=67&changelog" - }, - { - "id": "84", - "name": "Altoholic Count Hider", - "small_desc": "This little addon makes tooltip lines with item counts disappear on items of your choice (Hearthstones are in there by default).\r\n", - "author": "Darth_Predator", - "version": "1.07", - "screenshot_url": "https://www.tukui.org/addons/Darth_Predator/1512500918/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=84", - "category": "Plugins: Other", - "downloads": "7681", - "lastupdate": "2019-03-05 17:04:17", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=84", - "last_download": "2021-06-25 07:29:20", - "changelog": "https://www.tukui.org/addons.php?id=84&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=GHQCQTKD9NKDA&item_name=Altoholic+Count+Hider+(tukui.org)" - }, - { - "id": "156", - "name": "AlysiaUI", - "small_desc": "clean and modern UI with Tank/DPS and Heal Layout. transparent and Classcolor Themes are available.", - "author": "Dlarge", - "version": "1.04", - "screenshot_url": "https://www.tukui.org/addons/Dlarge/1587664383/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=156", - "category": "Plugins: ElvUI", - "downloads": "6979", - "lastupdate": "2020-05-04 06:18:42", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=156", - "last_download": "2021-06-25 07:29:27", - "changelog": "https://www.tukui.org/addons.php?id=156&changelog" - }, - { - "id": "153", - "name": "Arcane_UI", - "small_desc": "An minimalistic ElvUI mod.", - "author": "ArcaneFRaG", - "version": "1.1", - "screenshot_url": "https://www.tukui.org/addons/ArcaneFRaG/1581248843/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=153", - "category": "Plugins: ElvUI", - "downloads": "6181", - "lastupdate": "2020-02-06 11:55:05", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=153", - "last_download": "2021-06-25 07:28:20", - "changelog": "https://www.tukui.org/addons.php?id=153&changelog" - }, - { - "id": "172", - "name": "Auto Keystone", - "small_desc": "Insert keystones into the Font of Power automatically", - "author": "Hydra", - "version": "1.34", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1593712087/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=172", - "category": "Bags & Inventory", - "downloads": "53182", - "lastupdate": "2021-06-01 03:44:35", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=172", - "last_download": "2021-06-26 01:52:14", - "changelog": "https://www.tukui.org/addons.php?id=172&changelog", - "donate_url": "https://www.paypal.me/vuiaddon" - }, - { - "id": "11", - "name": "BenikUI - The ElvUI edit", - "small_desc": "BenikUI is an external ElvUI mod, adding different frame style and new features like detatched portraits and dashboards.", - "author": "Benik", - "version": "4.05", - "screenshot_url": "https://www.tukui.org/addons/Benik/1503446445/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=11", - "category": "Plugins: ElvUI", - "downloads": "546440", - "lastupdate": "2021-04-15 07:56:44", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=11", - "last_download": "2021-06-26 02:01:44", - "changelog": "https://www.tukui.org/addons.php?id=11&changelog", - "donate_url": "https://www.paypal.com/paypalme/benikui" - }, - { - "id": "170", - "name": "Bigger Action Buttons", - "small_desc": "Allow you to go over the default max size of buttons (60) in action bars, pet bar, stance bar and micro bar. ", - "author": "ephelia", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/ephelia/1593641642/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=170", - "category": "Action Bars", - "downloads": "8873", - "lastupdate": "2020-07-01 22:14:02", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=170", - "last_download": "2021-06-25 21:40:28", - "changelog": "https://www.tukui.org/addons.php?id=170&changelog" - }, - { - "id": "148", - "name": "Buff Highlight", - "small_desc": "Lighweight plugin for to ElvUI that allows to highlight unit frames when a specific buff is on the unit.", - "author": "Kaalos", - "version": "3.0", - "screenshot_url": "https://www.tukui.org/addons/Kaalos/1592056963/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=148", - "category": "Buffs & Debuffs", - "downloads": "20859", - "lastupdate": "2020-10-15 10:54:02", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=148", - "last_download": "2021-06-26 00:13:14", - "changelog": "https://www.tukui.org/addons.php?id=148&changelog" - }, - { - "id": "163", - "name": "Call to Arms", - "small_desc": "Display active Call to Arms bonuses", - "author": "Hydra", - "version": "1.44", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1592239061/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=163", - "category": "Combat", - "downloads": "15740", - "lastupdate": "2021-03-09 08:45:10", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=163", - "last_download": "2021-06-25 17:03:37", - "changelog": "https://www.tukui.org/addons.php?id=163&changelog", - "donate_url": "https://www.paypal.me/vuiaddon" - }, - { - "id": "75", - "name": "Cecile_MeterOverlay", - "small_desc": "display any damage meter as overlay in a configurable data text", - "author": "CecileValdelius", - "version": "1.2.2", - "screenshot_url": "https://www.tukui.org/addons/CecileValdelius/1508587487/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=75", - "category": "Combat", - "downloads": "9518", - "lastupdate": "2017-10-21 08:04:47", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=75", - "last_download": "2021-06-25 18:44:28", - "changelog": "https://www.tukui.org/addons.php?id=75&changelog" - }, - { - "id": "177", - "name": "Chat Box Fader", - "small_desc": "Fades the chat box when conditions are met.", - "author": "doc309", - "version": "3.2", - "screenshot_url": "https://www.tukui.org/addons/doc309/1595259454/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=177", - "category": "Chat & Communication", - "downloads": "5398", - "lastupdate": "2020-07-23 21:27:49", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=177", - "last_download": "2021-06-25 19:16:50", - "changelog": "https://www.tukui.org/addons.php?id=177&changelog" - }, - { - "id": "186", - "name": "CopyPasta2", - "small_desc": "CopyPasta2 is a small utility that enables multi-line/unlimited-length pasting of text or commands into WoW. ", - "author": "Nuaik", - "version": "1.0.6", - "screenshot_url": "https://www.tukui.org/addons/Nuaik/1603106204/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=186", - "category": "Chat & Communication", - "downloads": "14352", - "lastupdate": "2021-03-10 09:01:54", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=186", - "last_download": "2021-06-25 23:39:09", - "changelog": "https://www.tukui.org/addons.php?id=186&changelog" - }, - { - "id": "147", - "name": "Custom Tags", - "small_desc": "A collection of custom unitframe tags requested by users.", - "author": "Azilroka", - "version": "1.09", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1572490941/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=147", - "category": "Plugins: ElvUI", - "downloads": "19681", - "lastupdate": "2021-04-18 16:38:46", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=147", - "last_download": "2021-06-26 02:04:29", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=TENQSTDX5SEWE" - }, - { - "id": "8", - "name": "DecUI", - "small_desc": "DecUI - Shadowlands", - "author": "Dec", - "version": "12.00", - "screenshot_url": "https://www.tukui.org/addons/Dec/1602630931/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=8", - "category": "Edited UIs & Compilations", - "downloads": "32553", - "lastupdate": "2020-10-16 17:27:38", - "patch": "9.0.1", - "web_url": "https://www.tukui.org/addons.php?id=8", - "last_download": "2021-06-25 07:26:22", - "changelog": "https://www.tukui.org/addons.php?id=8&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5HWM62A3RRTHU" - }, - { - "id": "70", - "name": "DejaCharacterStats", - "small_desc": "Dejablue's restored and improved character stats frame display.", - "author": "dejoblue", - "version": "900r1", - "screenshot_url": "https://www.tukui.org/addons/dejoblue/1526922946/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=70", - "category": "Combat", - "downloads": "68884", - "lastupdate": "2020-10-14 17:56:34", - "patch": "9.0.1", - "web_url": "https://www.tukui.org/addons.php?id=70", - "last_download": "2021-06-26 02:03:19", - "changelog": "https://www.tukui.org/addons.php?id=70&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CL4UN8NCQLZQL" - }, - { - "id": "169", - "name": "DiceUI", - "small_desc": "DiceUI is an external ElvUI mod with a clean and ultra minimal interface. ", - "author": "Stice", - "version": "1.01", - "screenshot_url": "https://www.tukui.org/addons/Stice/1593424755/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=169", - "category": "Plugins: ElvUI", - "downloads": "4961", - "lastupdate": "2020-07-01 04:55:24", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=169", - "last_download": "2021-06-25 07:29:48", - "changelog": "https://www.tukui.org/addons.php?id=169&changelog" - }, - { - "id": "58", - "name": "DSM (Dajova's Shared Media)", - "small_desc": "Small collection of shared media to insert to Elvui or any other UI.", - "author": "Dajova", - "version": "3.6", - "screenshot_url": "https://www.tukui.org/addons/Dajova/1504534026/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=58", - "category": "Miscellaneous", - "downloads": "26549", - "lastupdate": "2021-02-03 23:15:37", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=58", - "last_download": "2021-06-26 01:25:53", - "changelog": "https://www.tukui.org/addons.php?id=58&changelog", - "donate_url": "https://paypal.me/dajova" - }, - { - "id": "210", - "name": "Dynamic Status Icons", - "small_desc": "Adds various status icons to ElvUI UnitFrames for Combat/Resting/Dead/Normal", - "author": "Repooc", - "version": "1.05", - "screenshot_url": "https://www.tukui.org/addons/Repooc/1623310954/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=210", - "category": "Plugins: ElvUI", - "downloads": "204", - "lastupdate": "2021-06-14 22:00:40", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=210", - "last_download": "2021-06-25 23:13:13", - "changelog": "https://www.tukui.org/addons.php?id=210&changelog", - "donate_url": "https://paypal.me/repooc" - }, - { - "id": "209", - "name": "Eltruism", - "small_desc": "Eltruism is a plugin that includes DPS/Tank/Healer profiles and more features not available in base ElvUI", - "author": "eltreum", - "version": "2.3.5", - "screenshot_url": "https://www.tukui.org/addons/eltreum/1620607916/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=209", - "category": "Plugins: ElvUI", - "downloads": "3255", - "lastupdate": "2021-06-24 17:05:51", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=209", - "last_download": "2021-06-26 01:22:12", - "changelog": "https://www.tukui.org/addons.php?id=209&changelog" - }, - { - "id": "64", - "name": "ElvUI Actionbar Combat State", - "small_desc": "Allows for different visibility settings in and out of combat.", - "author": "Darth_Predator", - "version": "1.46", - "screenshot_url": "https://www.tukui.org/addons/Darth_Predator/1505667497/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=64", - "category": "Plugins: ElvUI", - "downloads": "31503", - "lastupdate": "2019-09-06 08:49:27", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=64", - "last_download": "2021-06-26 00:21:30", - "changelog": "https://www.tukui.org/addons.php?id=64&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=GHQCQTKD9NKDA&item_name=Actionbar+Combat+State+(tukui.org)" - }, - { - "id": "174", - "name": "ElvUI BC DataTexts", - "small_desc": "Usefull DataTexts supporting ElvUI 11.43", - "author": "alucard666tepes", - "version": "9.0.5.04", - "screenshot_url": "https://www.tukui.org/addons/alucard666tepes/1594411237/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=174", - "category": "Plugins: ElvUI", - "downloads": "9250", - "lastupdate": "2021-05-21 17:49:59", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=174", - "last_download": "2021-06-25 02:41:16", - "changelog": "https://www.tukui.org/addons.php?id=174&changelog" - }, - { - "id": "152", - "name": "ElvUI Cardinal Points", - "small_desc": "Adds cardinal points (N. S. E. and W.) to the minimap.", - "author": "Petrah", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/Petrah/1580359163/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=152", - "category": "Map & Minimap", - "downloads": "8292", - "lastupdate": "2020-01-30 04:39:23", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=152", - "last_download": "2021-06-25 07:29:07", - "changelog": "https://www.tukui.org/addons.php?id=152&changelog", - "donate_url": "https://www.paypal.me/AbendLabs" - }, - { - "id": "182", - "name": "ElvUI Chat Panel AutoHide", - "small_desc": "Automatically hides the ElvUI Chat Panels when in combat.", - "author": "EJK", - "version": "1.1", - "screenshot_url": "https://www.tukui.org/addons/EJK/1597406573/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=182", - "category": "Chat & Communication", - "downloads": "8869", - "lastupdate": "2020-08-15 02:56:56", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=182", - "last_download": "2021-06-25 15:23:48", - "changelog": "https://www.tukui.org/addons.php?id=182&changelog" - }, - { - "id": "44", - "name": "ElvUI CustomMedia", - "small_desc": "This custom Addon adds 14 new Fonts and 18 Textures to your ElvUI!", - "author": "Atwood", - "version": "2.0", - "screenshot_url": "https://www.tukui.org/addons/Atwood/1598796520/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=44", - "category": "Unit Frames", - "downloads": "46936", - "lastupdate": "2021-03-09 18:18:07", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=44", - "last_download": "2021-06-26 01:56:38", - "changelog": "https://www.tukui.org/addons.php?id=44&changelog" - }, - { - "id": "188", - "name": "ElvUI Enhanced (Again)", - "small_desc": "This is a continuation of ElvUI Enhanced and a more lite weight version. Minimap button bar and location text and cords above the map.", - "author": "Tevoll", - "version": "4.0.5", - "screenshot_url": "https://www.tukui.org/addons/Tevoll/1603534027/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=188", - "category": "Plugins: ElvUI", - "downloads": "27719", - "lastupdate": "2021-03-17 07:55:05", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=188", - "last_download": "2021-06-25 22:33:01", - "changelog": "https://www.tukui.org/addons.php?id=188&changelog", - "donate_url": "https://paypal.me/nickbock" - }, - { - "id": "159", - "name": "ElvUI Honor Data Text", - "small_desc": "Create a data text to display honor", - "author": "Hydra", - "version": "1.11", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1590209276/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=159", - "category": "Plugins: ElvUI", - "downloads": "8533", - "lastupdate": "2021-03-09 08:32:43", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=159", - "last_download": "2021-06-26 00:44:16", - "changelog": "https://www.tukui.org/addons.php?id=159&changelog", - "donate_url": "https://paypal.me/vuiaddon" - }, - { - "id": "202", - "name": "ElvUI Login Screen and Character Select", - "small_desc": "Glues and Buttons to update the Login Screen and Character Select to the ElvUI Style", - "author": "eltreum", - "version": "2.0.0", - "screenshot_url": "https://www.tukui.org/addons/eltreum/1610661681/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=202", - "category": "Skins", - "downloads": "13802", - "lastupdate": "2021-05-30 15:46:19", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=202", - "last_download": "2021-06-26 01:36:26", - "changelog": "https://www.tukui.org/addons.php?id=202&changelog" - }, - { - "id": "65", - "name": "ElvUI Microbar Enhancement", - "small_desc": "Plugin that adds options to ElvUI's microbar.", - "author": "Darth_Predator", - "version": "1.88", - "screenshot_url": "https://www.tukui.org/addons/Darth_Predator/1505669510/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=65", - "category": "Plugins: ElvUI", - "downloads": "61809", - "lastupdate": "2021-05-02 21:45:56", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=65", - "last_download": "2021-06-26 00:00:33", - "changelog": "https://www.tukui.org/addons.php?id=65&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=GHQCQTKD9NKDA&item_name=Microbar+Enhancement+(tukui.org)" - }, - { - "id": "9", - "name": "ElvUI Nuts and Bolts", - "small_desc": "A compilation of useful mini addons.", - "author": "Benik", - "version": "1.25", - "screenshot_url": "https://www.tukui.org/addons/Benik/1541880527/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=9", - "category": "Plugins: ElvUI", - "downloads": "202518", - "lastupdate": "2021-04-15 07:59:15", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=9", - "last_download": "2021-06-26 02:04:55", - "changelog": "https://www.tukui.org/addons.php?id=9&changelog", - "donate_url": "https://www.paypal.com/paypalme/benikui" - }, - { - "id": "77", - "name": "ElvUI Progressive DataBars Colors", - "small_desc": "Add some color to the DataBars!", - "author": "Myrroddin", - "version": "8.3-1", - "screenshot_url": "https://www.tukui.org/addons/Myrroddin/1508680073/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=77", - "category": "Plugins: ElvUI", - "downloads": "39496", - "lastupdate": "2020-07-28 23:40:16", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=77", - "last_download": "2021-06-25 07:26:11", - "changelog": "https://www.tukui.org/addons.php?id=77&changelog", - "donate_url": "https://www.patreon.com/Myrroddin" - }, - { - "id": "81", - "name": "ElvUI Unitframes Fixed Colors", - "small_desc": "Makes unitframes of your choice be specifically colored at certain breakpoints", - "author": "Darth_Predator", - "version": "1.05", - "screenshot_url": "https://www.tukui.org/addons/Darth_Predator/1509819932/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=81", - "category": "Plugins: ElvUI", - "downloads": "16574", - "lastupdate": "2019-09-06 09:04:56", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=81", - "last_download": "2021-06-25 16:12:58", - "changelog": "https://www.tukui.org/addons.php?id=81&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=GHQCQTKD9NKDA&item_name=Unitframes+Fixed+Colors+(tukui.org)" - }, - { - "id": "115", - "name": "Elvui:Glues Restored", - "small_desc": "Old Elvui:Glues Plugin", - "author": "oddball250", - "version": "1", - "screenshot_url": "https://www.tukui.org/addons/oddball250/1536162293/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=115", - "category": "Plugins: ElvUI", - "downloads": "12327", - "lastupdate": "2018-09-05 11:44:53", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=115", - "last_download": "2021-06-25 07:27:21" - }, - { - "id": "85", - "name": "ElvUI_AbsorbTags", - "small_desc": "This addon allows more tracking of absorbs on ElvUIs raid frames.", - "author": "krypt87", - "version": "5.1.6", - "screenshot_url": "https://www.tukui.org/addons/krypt87/1580527535/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=85", - "category": "Unit Frames", - "downloads": "35861", - "lastupdate": "2021-03-13 03:12:18", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=85", - "last_download": "2021-06-25 21:33:32", - "changelog": "https://www.tukui.org/addons.php?id=85&changelog", - "donate_url": "https://paypal.me/Bartley451" - }, - { - "id": "88", - "name": "ElvUI_AP_tooltip", - "small_desc": "Simple plugin for ElvUI tooltip to show AP with % on item tooltip.", - "author": "lifeismystery", - "version": "1.2", - "screenshot_url": "https://www.tukui.org/addons/lifeismystery/1516188311/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=88", - "category": "Tooltips", - "downloads": "9056", - "lastupdate": "2018-01-21 02:51:43", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=88", - "last_download": "2021-06-25 02:12:52", - "changelog": "https://www.tukui.org/addons.php?id=88&changelog", - "donate_url": "https://paypal.me/lifeismystery" - }, - { - "id": "99", - "name": "ElvUI_ColorblindHelper", - "small_desc": "Cross-character settings for reaction and threat color more suitable for the colorblind.", - "author": "mltco78dhs", - "version": "8.1.5.1", - "screenshot_url": "https://www.tukui.org/addons/mltco78dhs/1523591388/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=99", - "category": "Plugins: ElvUI", - "downloads": "6579", - "lastupdate": "2019-03-13 03:28:56", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=99", - "last_download": "2021-06-25 02:13:30", - "changelog": "https://www.tukui.org/addons.php?id=99&changelog", - "donate_url": "https://www.patreon.com/KaldaraWorks" - }, - { - "id": "207", - "name": "ElvUI_CustomStyleFilters", - "small_desc": "ElvUI_CustomStyleFilters provides the ability to dynamically create nameplate style filter triggers based on custom Lua conditions.", - "author": "Nihilistzsche", - "version": "2.22", - "screenshot_url": "https://www.tukui.org/addons/NihilisticPandem/1615800120/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=207", - "category": null, - "downloads": "1474", - "lastupdate": "2021-03-20 01:38:07", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=207", - "last_download": "2021-06-25 02:13:57", - "changelog": "https://www.tukui.org/addons.php?id=207&changelog" - }, - { - "id": "90", - "name": "ElvUI_DebuffsAlert", - "small_desc": "Color the unit healthbar if there is a debuff from this filter(Doesn't matter if you can dispell it or not)", - "author": "lifeismystery", - "version": "2.1", - "screenshot_url": "https://www.tukui.org/addons/lifeismystery/1516976527/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=90", - "category": "Buffs & Debuffs", - "downloads": "16661", - "lastupdate": "2020-08-19 05:50:33", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=90", - "last_download": "2021-06-25 02:11:32", - "changelog": "https://www.tukui.org/addons.php?id=90&changelog", - "donate_url": "https://www.paypal.me/lifeismystery" - }, - { - "id": "66", - "name": "ElvUI_ExtraDataTexts", - "small_desc": "Adds more datatexts to ElvUI", - "author": "Caedis", - "version": "2.1.4", - "screenshot_url": "https://www.tukui.org/addons/Caedis/1505774679/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=66", - "category": "Plugins: ElvUI", - "downloads": "72892", - "lastupdate": "2020-10-18 07:28:21", - "patch": "9.0.1", - "web_url": "https://www.tukui.org/addons.php?id=66", - "last_download": "2021-06-26 00:58:40", - "changelog": "https://www.tukui.org/addons.php?id=66&changelog" - }, - { - "id": "112", - "name": "ElvUI_GlobalFadePersist", - "small_desc": "This is a simple plugin that will make the Global Fade option persistent through Combat, Targeting, Setting Focus, Loss of Health, etc.", - "author": "Sauces", - "version": ".1", - "screenshot_url": "https://www.tukui.org/addons/Sauces/1535605540/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=112", - "category": "Plugins: ElvUI", - "downloads": "11549", - "lastupdate": "2019-02-18 01:10:11", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=112", - "last_download": "2021-06-26 01:48:27", - "changelog": "https://www.tukui.org/addons.php?id=112&changelog" - }, - { - "id": "154", - "name": "ElvUI_LuckyoneUI", - "small_desc": "Luckyone's ElvUI Edit: Layouts, Tags, Options and AddOn profiles", - "author": "Luckyone", - "version": "1.29", - "screenshot_url": "https://www.tukui.org/addons/Luckyone/1618183803/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=154", - "category": "Plugins: ElvUI", - "downloads": "45211", - "lastupdate": "2021-06-08 10:25:01", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=154", - "last_download": "2021-06-26 02:03:03", - "changelog": "https://www.tukui.org/addons.php?id=154&changelog", - "donate_url": "https://streamlabs.com/luckyone1996/tip" - }, - { - "id": "60", - "name": "ElvUI_mMediaTag", - "small_desc": "Statusbar Textur, Tags and Datatext", - "author": "Blinkii", - "version": "2.62", - "screenshot_url": "https://www.tukui.org/addons/Blinkii/1588423152/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=60", - "category": "Plugins: ElvUI", - "downloads": "160907", - "lastupdate": "2021-06-17 17:22:22", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=60", - "last_download": "2021-06-26 01:47:29", - "changelog": "https://www.tukui.org/addons.php?id=60&changelog" - }, - { - "id": "129", - "name": "ElvUI_SecondsToBuff", - "small_desc": "Change Buff timer to HH:MM:SS format", - "author": "k0nker", - "version": "8.2.5.2", - "screenshot_url": "https://www.tukui.org/addons/k0nker/1544901245/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=129", - "category": "Buffs & Debuffs", - "downloads": "10669", - "lastupdate": "2019-11-11 16:51:00", - "patch": "8.2.5", - "web_url": "https://www.tukui.org/addons.php?id=129", - "last_download": "2021-06-25 12:50:55", - "changelog": "https://www.tukui.org/addons.php?id=129&changelog" - }, - { - "id": "110", - "name": "Enoqx UI", - "small_desc": "Enoqx Elv UI Layout", - "author": "Enoqx", - "version": "1.2.2", - "screenshot_url": "https://www.tukui.org/addons/Enoqx/1552027237/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=110", - "category": "Plugins: ElvUI", - "downloads": "6466", - "lastupdate": "2019-08-23 16:34:35", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=110", - "last_download": "2021-06-25 07:34:26", - "changelog": "https://www.tukui.org/addons.php?id=110&changelog" - }, - { - "id": "86", - "name": "ExUI Legion", - "small_desc": "Plugin for ElvUI", - "author": "Exeil", - "version": "2.01", - "screenshot_url": "https://www.tukui.org/addons/Exeil/1523360068/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=86", - "category": "Plugins: ElvUI", - "downloads": "9503", - "lastupdate": "2018-04-10 16:04:28", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=86", - "last_download": "2021-06-25 18:47:28", - "changelog": "https://www.tukui.org/addons.php?id=86&changelog" - }, - { - "id": "137", - "name": "Floating Combat Text", - "small_desc": "ElvUI: Floating Combat Text", - "author": "Simpy", - "version": "1.14", - "screenshot_url": "https://www.tukui.org/addons/Simpy/1555787046/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=137", - "category": "Combat", - "downloads": "178032", - "lastupdate": "2021-03-09 16:59:12", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=137", - "last_download": "2021-06-26 01:54:47", - "changelog": "https://www.tukui.org/addons.php?id=137&changelog", - "donate_url": "https://www.paypal.me/koditaylor" - }, - { - "id": "164", - "name": "Gathering", - "small_desc": "Display per-hour gathering rates of items in a clean tooltip", - "author": "Hydra", - "version": "1.45", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1592243333/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=164", - "category": "Professions", - "downloads": "15762", - "lastupdate": "2021-06-14 20:02:50", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=164", - "last_download": "2021-06-26 01:08:20", - "changelog": "https://www.tukui.org/addons.php?id=164&changelog", - "donate_url": "https://www.paypal.me/vuiaddon" - }, - { - "id": "93", - "name": "GeekFan UI", - "small_desc": "Basic informational layout for ElvUI", - "author": "sgeek7", - "version": "3.2.1", - "screenshot_url": "https://www.tukui.org/addons/sgeek7/1567451294/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=93", - "category": "Plugins: ElvUI", - "downloads": "8321", - "lastupdate": "2019-09-26 02:12:30", - "patch": "8.2.5", - "web_url": "https://www.tukui.org/addons.php?id=93", - "last_download": "2021-06-25 07:34:49", - "changelog": "https://www.tukui.org/addons.php?id=93&changelog" - }, - { - "id": "96", - "name": "GennUI", - "small_desc": "A clean minimalistic edit for ElvUI.", - "author": "Gennoken", - "version": "2.62", - "screenshot_url": "https://www.tukui.org/addons/Gennoken/1621767719/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=96", - "category": "Plugins: ElvUI", - "downloads": "47953", - "lastupdate": "2021-05-23 11:01:40", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=96", - "last_download": "2021-06-26 00:22:15", - "changelog": "https://www.tukui.org/addons.php?id=96&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4QJDXS8MBAZS&source=url" - }, - { - "id": "198", - "name": "Guild Revenue Agent", - "small_desc": "Manage guild taxes", - "author": "starksprings", - "version": "1.9", - "screenshot_url": "https://www.tukui.org/addons/starksprings/1609619053/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=198", - "category": "Guild", - "downloads": "3832", - "lastupdate": "2021-04-01 02:42:10", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=198", - "last_download": "2021-06-26 02:05:00", - "changelog": "https://www.tukui.org/addons.php?id=198&changelog" - }, - { - "id": "165", - "name": "HydraUI", - "small_desc": "A visual interface replacement. It restyles the default interface, while adding many useful features.", - "author": "Hydra", - "version": "1.11", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1592326696/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=165", - "category": "Miscellaneous", - "downloads": "11737", - "lastupdate": "2021-06-22 03:53:27", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=165", - "last_download": "2021-06-25 20:01:38", - "changelog": "https://www.tukui.org/addons.php?id=165&changelog", - "donate_url": "https://www.paypal.me/vuiaddon" - }, - { - "id": "161", - "name": "InputLagFix", - "small_desc": "Fix/Reduce the input lag in World Of Warcraft.", - "author": "Ghanvert", - "version": "5.0.1", - "screenshot_url": "https://www.tukui.org/addons/Ghanvert/1600157293/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=161", - "category": "Action Bars", - "downloads": "15074", - "lastupdate": "2020-09-15 08:05:19", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=161", - "last_download": "2021-06-25 20:56:33", - "changelog": "https://www.tukui.org/addons.php?id=161&changelog" - }, - { - "id": "71", - "name": "KotUI", - "small_desc": "Plugin for ElvUI", - "author": "Kot", - "version": "1.07", - "screenshot_url": "https://www.tukui.org/addons/Kot/1506974692/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=71", - "category": "Plugins: ElvUI", - "downloads": "7443", - "lastupdate": "2018-02-09 14:20:28", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=71", - "last_download": "2021-06-25 12:48:41", - "changelog": "https://www.tukui.org/addons.php?id=71&changelog" - }, - { - "id": "127", - "name": "Kringels MediaTags", - "small_desc": "Adds custom tags, fonts, textures & sounds", - "author": "kringel", - "version": "2.8", - "screenshot_url": "https://www.tukui.org/addons/kringel/1547339025/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=127", - "category": "Plugins: ElvUI", - "downloads": "20579", - "lastupdate": "2021-03-10 05:37:28", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=127", - "last_download": "2021-06-26 01:20:58", - "changelog": "https://www.tukui.org/addons.php?id=127&changelog" - }, - { - "id": "6", - "name": "LocationPlus for ElvUI", - "small_desc": "Adds player location, coords + 2 Datatexts and a tooltip with info based on player location/level. ", - "author": "Benik", - "version": "2.59", - "screenshot_url": "https://www.tukui.org/addons/Benik/1503320903/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=6", - "category": "Plugins: ElvUI", - "downloads": "516914", - "lastupdate": "2021-04-15 08:00:45", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=6", - "last_download": "2021-06-26 02:04:42", - "changelog": "https://www.tukui.org/addons.php?id=6&changelog", - "donate_url": "https://www.paypal.com/paypalme/benikui" - }, - { - "id": "5", - "name": "MaxUI", - "small_desc": "MaxUI is an external edit for Tukui 20+, with a unique style and added functionality.", - "author": "Maximvs", - "version": "6.172", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1603486765/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=5", - "category": "Edited UIs & Compilations", - "downloads": "26168", - "lastupdate": "2021-06-19 11:41:55", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=5", - "last_download": "2021-06-25 23:10:19", - "changelog": "https://www.tukui.org/addons.php?id=5&changelog" - }, - { - "id": "146", - "name": "MelloUI: Refunded", - "small_desc": "A Custom Elvui Edit.", - "author": "MelloTV", - "version": "9.0.2", - "screenshot_url": "https://www.tukui.org/addons/MelloTV/1605888118/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=146", - "category": "Edited UIs & Compilations", - "downloads": "11245", - "lastupdate": "2020-11-20 16:41:12", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=146", - "last_download": "2021-06-25 23:12:56" - }, - { - "id": "1", - "name": "MerathilisUI", - "small_desc": "ElvUI_MerathilisUI is an external ElvUI Mod. Mostly for the design in a transparent look with a few additional features.", - "author": "Merathilis", - "version": "4.73", - "screenshot_url": "https://www.tukui.org/addons/Merathilis/1603027212/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=1", - "category": "Plugins: ElvUI", - "downloads": "183317", - "lastupdate": "2021-03-10 12:17:28", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=1", - "last_download": "2021-06-26 01:34:28", - "changelog": "https://www.tukui.org/addons.php?id=1&changelog", - "donate_url": "https://paypal.me/merathilis" - }, - { - "id": "142", - "name": "MOG:UI", - "small_desc": "MOGUI is a project of my own design made for all classes and roles. Sometimes, simple is best.", - "author": "MaximumOverdrive", - "version": "3.64", - "screenshot_url": "https://www.tukui.org/addons/MaximumOverdrive/1607045645/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=142", - "category": "Edited UIs & Compilations", - "downloads": "8389", - "lastupdate": "2020-12-11 02:14:21", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=142", - "last_download": "2021-06-25 14:45:41", - "changelog": "https://www.tukui.org/addons.php?id=142&changelog" - }, - { - "id": "204", - "name": "MoneyPrinter", - "small_desc": "It prints your money", - "author": "timdotcom", - "version": "1.0.16", - "screenshot_url": "https://www.tukui.org/addons/timdotcom/1612127400/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=204", - "category": "Miscellaneous", - "downloads": "1364", - "lastupdate": "2021-01-31 21:10:00", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=204", - "last_download": "2021-06-25 15:24:24", - "changelog": "https://www.tukui.org/addons.php?id=204&changelog" - }, - { - "id": "4", - "name": "NihilistUI", - "small_desc": "An external edit for ElvUI that adds a lot of new and exclusive features.", - "author": "Nihilistzsche", - "version": "12.01", - "screenshot_url": "https://www.tukui.org/addons/NihilisticPandem/1559312497/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=4", - "category": "Plugins: ElvUI", - "downloads": "13165", - "lastupdate": "2021-04-23 15:36:09", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=4", - "last_download": "2021-06-25 19:35:44", - "changelog": "https://www.tukui.org/addons.php?id=4&changelog" - }, - { - "id": "187", - "name": "NoobTacoUI", - "small_desc": "NoobTacoUI is an ElvUI Profile that uses the Nord Theme Color scheme of web development", - "author": "NoobTaco", - "version": "1.2.5", - "screenshot_url": "https://www.tukui.org/addons/NoobTaco/1603405273/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=187", - "category": "Edited UIs & Compilations", - "downloads": "5708", - "lastupdate": "2021-05-24 16:39:59", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=187", - "last_download": "2021-06-26 00:15:49", - "changelog": "https://www.tukui.org/addons.php?id=187&changelog", - "donate_url": "https://www.paypal.com/donate?hosted_button_id=2DS266TUNQHCW" - }, - { - "id": "185", - "name": "NoobTacoUI Media", - "small_desc": "Google fonts and Elite overlay for unit frames.", - "author": "NoobTaco", - "version": "1.0.3", - "screenshot_url": "https://www.tukui.org/addons/NoobTaco/1603040315/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=185", - "category": "Miscellaneous", - "downloads": "4538", - "lastupdate": "2020-10-23 18:05:53", - "patch": "9.0.1", - "web_url": "https://www.tukui.org/addons.php?id=185", - "last_download": "2021-06-25 20:57:38", - "changelog": "https://www.tukui.org/addons.php?id=185&changelog", - "donate_url": "https://www.paypal.com/donate?hosted_button_id=2DS266TUNQHCW" - }, - { - "id": "109", - "name": "OrkoUI", - "small_desc": "A unique graphical user interface using ElvUI as the core. ", - "author": "ThreeLeos", - "version": "", - "screenshot_url": "https://www.tukui.org/addons/ThreeLeos/1533841969/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=109", - "category": "Plugins: ElvUI", - "downloads": "6090", - "lastupdate": "2018-08-21 20:19:14", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=109", - "last_download": "2021-06-25 21:10:31", - "changelog": "https://www.tukui.org/addons.php?id=109&changelog", - "donate_url": "https://www.paypal.com/donate/?token=xpFVYvhiWad2hXK0SnXHFUVIBuwD7MKHJBjkfPyvGxTTLe__J8PyOtcnmCd3KFLYsByBHG&country.x=US&locale.x=US" - }, - { - "id": "135", - "name": "PatUI", - "small_desc": "PatUI is an external edit for Tukui 20+ that changes the style of default Tukui.", - "author": "Pat", - "version": "0.6.1", - "screenshot_url": "https://www.tukui.org/addons/Pat/1619129244/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=135", - "category": "Edited UIs & Compilations", - "downloads": "6953", - "lastupdate": "2021-04-26 22:35:26", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=135", - "last_download": "2021-06-25 18:07:04", - "changelog": "https://www.tukui.org/addons.php?id=135&changelog" - }, - { - "id": "79", - "name": "ProjectAzilroka", - "small_desc": "Projects by Azilroka", - "author": "Azilroka", - "version": "1.78", - "screenshot_url": "https://www.tukui.org/addons/Azilroka/1544291929/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=79", - "category": "Miscellaneous", - "downloads": "331862", - "lastupdate": "2021-05-23 01:20:16", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=79", - "last_download": "2021-06-26 02:04:17", - "changelog": "https://www.tukui.org/addons.php?id=79&changelog", - "donate_url": "https://www.paypal.com/donate/?token=tITyMoJuBuoLPPvTu3sPp1pHi3FZfzEdIJX1FhwA9tvTe01diwPnRm_8xSo2haJ4XkK_rm&country.x=US&locale.x=US" - }, - { - "id": "107", - "name": "RedtuzkUI", - "small_desc": "RedtuzkUI is a clean and functional external edit for ElvUI.", - "author": "Redtuzk", - "version": "1.9.10", - "screenshot_url": "https://www.tukui.org/addons/Redtuzk/1563572836/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=107", - "category": "Plugins: ElvUI", - "downloads": "119993", - "lastupdate": "2020-10-18 15:11:19", - "patch": "9.0.1", - "web_url": "https://www.tukui.org/addons.php?id=107", - "last_download": "2021-06-26 00:58:43", - "changelog": "https://www.tukui.org/addons.php?id=107&changelog", - "donate_url": "http://paypal.me/redtuzk" - }, - { - "id": "43", - "name": "Rehok Tags", - "small_desc": "Adds tags for different formatting of text on ElvUI", - "author": "Rehok", - "version": "3.0.1", - "screenshot_url": "https://www.tukui.org/addons/Rehok/1503764589/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=43", - "category": "Plugins: ElvUI", - "downloads": "6554", - "lastupdate": "2017-09-14 06:27:21", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=43", - "last_download": "2021-06-25 02:28:24", - "changelog": "https://www.tukui.org/addons.php?id=43&changelog" - }, - { - "id": "140", - "name": "RematchElvUISkin", - "small_desc": "Rematch ElvUI Skin", - "author": "Nihilistzsche", - "version": "1.2.7", - "screenshot_url": "https://www.tukui.org/addons/NihilisticPandem/1561687900/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=140", - "category": "Plugins: ElvUI", - "downloads": "13468", - "lastupdate": "2021-03-17 10:52:17", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=140", - "last_download": "2021-06-25 17:06:49", - "changelog": "https://www.tukui.org/addons.php?id=140&changelog" - }, - { - "id": "189", - "name": "RetroUI", - "small_desc": "RetroUI is a side project that calls back to what I loved about UI's in the past. They were simple and usable for all classes and roles. ", - "author": "MaximumOverdrive", - "version": "1.05", - "screenshot_url": "https://www.tukui.org/addons/MaximumOverdrive/1611625066/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=189", - "category": "Plugins: ElvUI", - "downloads": "5547", - "lastupdate": "2021-01-26 01:19:16", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=189", - "last_download": "2021-06-25 20:04:10", - "changelog": "https://www.tukui.org/addons.php?id=189&changelog" - }, - { - "id": "139", - "name": "rp:Friends", - "small_desc": "Customizable friendslist alternative for roleplayers", - "author": "oraibi", - "version": "0.100a2", - "screenshot_url": "https://www.tukui.org/addons/oraibi/1560783132/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=139", - "category": "Roleplay", - "downloads": "5174", - "lastupdate": "2019-06-17 14:52:12", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=139", - "last_download": "2021-06-25 07:29:47", - "changelog": "https://www.tukui.org/addons.php?id=139&changelog" - }, - { - "id": "72", - "name": "SanUI", - "small_desc": "An interface for the raiding druid, integrating all specs. Change between different configurations without UI reload.", - "author": "SanUI", - "version": "9.0.5.0", - "screenshot_url": "https://www.tukui.org/addons/SanUI/1533148450/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=72", - "category": "Edited UIs & Compilations", - "downloads": "8191", - "lastupdate": "2021-04-05 14:51:20", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=72", - "last_download": "2021-06-25 07:29:14", - "changelog": "https://www.tukui.org/addons.php?id=72&changelog" - }, - { - "id": "38", - "name": "Shadow and Light", - "small_desc": "Shadow & Light is an addon that customizes and adds extra functionality to ElvUI.", - "author": "Repooc", - "version": "4.21", - "screenshot_url": "https://www.tukui.org/addons/Darth_Predator/1577050912/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=38", - "category": "Plugins: ElvUI", - "downloads": "1480772", - "lastupdate": "2021-04-13 01:32:12", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=38", - "last_download": "2021-06-26 01:54:19", - "changelog": "https://www.tukui.org/addons.php?id=38&changelog", - "donate_url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=EJB4DRU7QZYMG&source=url" - }, - { - "id": "205", - "name": "Skillet", - "small_desc": "A trade skill window replacement for WoW", - "author": "bsmorgan", - "version": "4.30", - "screenshot_url": "https://www.tukui.org/addons/bsmorgan/1613604794/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=205", - "category": "Professions", - "downloads": "2821", - "lastupdate": "2021-05-31 15:32:19", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=205", - "last_download": "2021-06-25 23:38:04", - "changelog": "https://www.tukui.org/addons.php?id=205&changelog" - }, - { - "id": "143", - "name": "Skullflower UI", - "small_desc": "Skullflower's ElvUI Edit", - "author": "derakkor", - "version": "1.7.3", - "screenshot_url": "https://www.tukui.org/addons/derakkor/1600358051/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=143", - "category": "Plugins: ElvUI", - "downloads": "12499", - "lastupdate": "2020-10-21 03:53:21", - "patch": "9.0.1", - "web_url": "https://www.tukui.org/addons.php?id=143", - "last_download": "2021-06-26 00:51:35", - "changelog": "https://www.tukui.org/addons.php?id=143&changelog", - "donate_url": "paypal.me/vindicationio" - }, - { - "id": "92", - "name": "Souschef's UI", - "small_desc": "Souschef's UI is a custom interface based on ElvUI. ", - "author": "Except", - "version": "1.10b", - "screenshot_url": "https://www.tukui.org/addons/Except/1518369944/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=92", - "category": "Plugins: ElvUI", - "downloads": "13882", - "lastupdate": "2021-03-19 15:37:56", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=92", - "last_download": "2021-06-26 01:15:53", - "changelog": "https://www.tukui.org/addons.php?id=92&changelog", - "donate_url": "https://streamlabs.com/exceptstreams" - }, - { - "id": "160", - "name": "SticeUI", - "small_desc": "SticeUI is an external ElvUI mod with a clean and minimal interface.", - "author": "Stice", - "version": "1.06", - "screenshot_url": "https://www.tukui.org/addons/Stice/1590802361/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=160", - "category": "Plugins: ElvUI", - "downloads": "5376", - "lastupdate": "2020-05-31 06:50:42", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=160", - "last_download": "2021-06-25 15:52:08", - "changelog": "https://www.tukui.org/addons.php?id=160&changelog" - }, - { - "id": "141", - "name": "ThinkTankUI: Remastered", - "small_desc": "ThinkTankUI: [Remastered] is a graphical addon compilation The UI focuses on providing the user with real time buff/debuff tracking.", - "author": "MaximumOverdrive", - "version": "3.29", - "screenshot_url": "https://www.tukui.org/addons/MaximumOverdrive/1609180044/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=141", - "category": "Edited UIs & Compilations", - "downloads": "11398", - "lastupdate": "2020-12-28 18:26:47", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=141", - "last_download": "2021-06-25 15:21:02", - "changelog": "https://www.tukui.org/addons.php?id=141&changelog" - }, - { - "id": "199", - "name": "ToxiUI", - "small_desc": "A minimalistic ElvUI edit by Toxi & Nawuko", - "author": "t0x1com", - "version": "v5.3.0", - "screenshot_url": "https://www.tukui.org/addons/t0x1com/1609976175/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=199", - "category": "Plugins: ElvUI", - "downloads": "36088", - "lastupdate": "2021-06-15 14:11:28", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=199", - "last_download": "2021-06-26 02:02:34", - "changelog": "https://www.tukui.org/addons.php?id=199&changelog", - "donate_url": "http://paypal.me/toxiui" - }, - { - "id": "34", - "name": "Tukui Roleicons", - "small_desc": "Roleicons for Tukui", - "author": "Maximvs", - "version": "1.05", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1503494196/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=34", - "category": "Plugins: Tukui", - "downloads": "12072", - "lastupdate": "2019-01-03 00:12:36", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=34", - "last_download": "2021-06-25 02:25:42", - "changelog": "https://www.tukui.org/addons.php?id=34&changelog" - }, - { - "id": "57", - "name": "Tukui Actionbar Highlight", - "small_desc": "Tukui Actionbar Highlight adds options for altering the actionbar highlights/procs.", - "author": "Maximvs", - "version": "1.02", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1504435620/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=57", - "category": "Plugins: Tukui", - "downloads": "15602", - "lastupdate": "2018-07-21 12:06:53", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=57", - "last_download": "2021-06-25 19:01:47", - "changelog": "https://www.tukui.org/addons.php?id=57&changelog" - }, - { - "id": "106", - "name": "Tukui Actionbar Layouts", - "small_desc": "Different Tukui Actionbar layouts (WIP)", - "author": "Maximvs", - "version": "1.05", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1532190354/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=106", - "category": "Plugins: Tukui", - "downloads": "10773", - "lastupdate": "2019-01-03 00:09:09", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=106", - "last_download": "2021-06-25 02:29:24", - "changelog": "https://www.tukui.org/addons.php?id=106&changelog" - }, - { - "id": "208", - "name": "Tukui ChatBar", - "small_desc": "ChatBar f\u00fcr Tukui", - "author": "Sinaris", - "version": "1.0", - "screenshot_url": "https://www.tukui.org/addons/Sinaris/1615463408/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=208", - "category": "Chat & Communication", - "downloads": "1334", - "lastupdate": "2021-03-11 11:52:54", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=208", - "last_download": "2021-06-26 01:48:53", - "changelog": "https://www.tukui.org/addons.php?id=208&changelog" - }, - { - "id": "31", - "name": "Tukui Class Chat Backgrounds ", - "small_desc": "Class Background art for Tukui Chat frames.", - "author": "Maximvs", - "version": "1.06", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1532189914/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=31", - "category": "Plugins: Tukui", - "downloads": "7477", - "lastupdate": "2019-01-03 00:01:01", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=31", - "last_download": "2021-06-25 02:26:25", - "changelog": "https://www.tukui.org/addons.php?id=31&changelog" - }, - { - "id": "108", - "name": "Tukui Dark Theme", - "small_desc": "Adds a Dark Theme option for Tukui unit frames.", - "author": "Innervasion", - "version": "2.0", - "screenshot_url": "https://www.tukui.org/addons/Innervasion/1612450164/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=108", - "category": "Plugins: Tukui", - "downloads": "12335", - "lastupdate": "2021-02-04 14:45:47", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=108", - "last_download": "2021-06-25 02:17:13", - "changelog": "https://www.tukui.org/addons.php?id=108&changelog" - }, - { - "id": "37", - "name": "Tukui Extra Datatexts", - "small_desc": "Extra Datatext panels at the bottom center of the screen.", - "author": "Maximvs", - "version": "1.12", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1532190087/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=37", - "category": "Plugins: Tukui", - "downloads": "11321", - "lastupdate": "2019-01-03 00:10:55", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=37", - "last_download": "2021-06-25 02:16:47", - "changelog": "https://www.tukui.org/addons.php?id=37&changelog" - }, - { - "id": "158", - "name": "Tukui Honor Data Text", - "small_desc": "Create a data text to display honor", - "author": "Hydra", - "version": "1.04", - "screenshot_url": "https://www.tukui.org/addons/Hydra/1590356630/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=158", - "category": "Plugins: Tukui", - "downloads": "5379", - "lastupdate": "2020-11-17 19:37:44", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=158", - "last_download": "2021-06-25 09:10:50", - "changelog": "https://www.tukui.org/addons.php?id=158&changelog", - "donate_url": "https://paypal.me/vuiaddon" - }, - { - "id": "36", - "name": "Tukui Location Panel", - "small_desc": "Location Panel for Tukui", - "author": "Maximvs", - "version": "1.09", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1532189959/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=36", - "category": "Plugins: Tukui", - "downloads": "10280", - "lastupdate": "2019-01-06 09:40:29", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=36", - "last_download": "2021-06-25 02:16:38", - "changelog": "https://www.tukui.org/addons.php?id=36&changelog" - }, - { - "id": "32", - "name": "Tukui Markbar", - "small_desc": "Markbar with target- and worldmarkers.", - "author": "Maximvs", - "version": "1.14", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1532190051/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=32", - "category": "Plugins: Tukui", - "downloads": "13194", - "lastupdate": "2019-01-06 09:25:33", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=32", - "last_download": "2021-06-25 02:12:02", - "changelog": "https://www.tukui.org/addons.php?id=32&changelog" - }, - { - "id": "74", - "name": "Tukui Minimap Disabler", - "small_desc": "Disables TukUI's Minimap.", - "author": "Bodom", - "version": "1.1.7", - "screenshot_url": "https://www.tukui.org/addons/Bodom/1508125959/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=74", - "category": "Plugins: Tukui", - "downloads": "8039", - "lastupdate": "2020-10-18 03:36:06", - "patch": "9.0.1", - "web_url": "https://www.tukui.org/addons.php?id=74", - "last_download": "2021-06-25 07:29:18", - "changelog": "https://www.tukui.org/addons.php?id=74&changelog" - }, - { - "id": "30", - "name": "Tukui My own Edit", - "small_desc": "Tukui Modification Starting setup", - "author": "Maximvs", - "version": "0.04", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1503487767/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=30", - "category": "Plugins: Tukui", - "downloads": "7611", - "lastupdate": "2019-01-03 00:15:15", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=30", - "last_download": "2021-06-25 10:28:12", - "changelog": "https://www.tukui.org/addons.php?id=30&changelog" - }, - { - "id": "130", - "name": "Tukui Nameplate Features", - "small_desc": "Extra Features for Tukui Nameplates", - "author": "Maximvs", - "version": "1.02", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1546476143/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=130", - "category": "Plugins: Tukui", - "downloads": "12747", - "lastupdate": "2019-01-06 11:27:49", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=130", - "last_download": "2021-06-26 00:28:07", - "changelog": "https://www.tukui.org/addons.php?id=130&changelog" - }, - { - "id": "117", - "name": "Tukui Player UF Auras", - "small_desc": "Player UnitFrame Buffs and Debuffs.", - "author": "Maximvs", - "version": "1.04", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1537735755/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=117", - "category": "Plugins: Tukui", - "downloads": "7574", - "lastupdate": "2019-01-03 00:08:19", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=117", - "last_download": "2021-06-25 02:26:23", - "changelog": "https://www.tukui.org/addons.php?id=117&changelog" - }, - { - "id": "206", - "name": "Tukui PortalBar", - "small_desc": "Every mage needs a portalbar", - "author": "Sinaris", - "version": "1.01", - "screenshot_url": "https://www.tukui.org/addons/Sinaris/1614871639/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=206", - "category": "Class", - "downloads": "1177", - "lastupdate": "2021-03-11 11:37:28", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=206", - "last_download": "2021-06-25 21:43:10", - "changelog": "https://www.tukui.org/addons.php?id=206&changelog" - }, - { - "id": "56", - "name": "Tukui Portrait Overlay", - "small_desc": "Portrait Overlay for Player and Target frames of Tukui.", - "author": "Maximvs", - "version": "1.04", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1532189991/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=56", - "category": "Plugins: Tukui", - "downloads": "11797", - "lastupdate": "2019-01-03 00:05:31", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=56", - "last_download": "2021-06-25 16:32:15", - "changelog": "https://www.tukui.org/addons.php?id=56&changelog" - }, - { - "id": "91", - "name": "Tukui Resting Icon/Text", - "small_desc": "Resting Icon and/or Text for Tukui Player UnitFrame.", - "author": "Maximvs", - "version": "1.03", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1532190025/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=91", - "category": "Plugins: Tukui", - "downloads": "8875", - "lastupdate": "2019-01-03 00:06:53", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=91", - "last_download": "2021-06-25 02:26:05", - "changelog": "https://www.tukui.org/addons.php?id=91&changelog" - }, - { - "id": "33", - "name": "Tukui Shortcut menu", - "small_desc": "Shortcut Menu for functions like /tukui c, /tukui move etc.", - "author": "Maximvs", - "version": "1.07", - "screenshot_url": "https://www.tukui.org/addons/Maximvs/1532189942/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=33", - "category": "Plugins: Tukui", - "downloads": "10627", - "lastupdate": "2019-01-06 09:24:38", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=33", - "last_download": "2021-06-25 22:52:18", - "changelog": "https://www.tukui.org/addons.php?id=33&changelog" - }, - { - "id": "136", - "name": "Tukui_SmallerWorldMap", - "small_desc": "makes the maximized world map smaller like in ElvUI", - "author": "Pat", - "version": "0.1", - "screenshot_url": "https://www.tukui.org/addons/Pat/1555186929/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=136", - "category": "Plugins: Tukui", - "downloads": "6346", - "lastupdate": "2019-04-13 20:22:09", - "patch": null, - "web_url": "https://www.tukui.org/addons.php?id=136", - "last_download": "2021-06-25 08:16:56" - }, - { - "id": "133", - "name": "VxtUI", - "small_desc": "VxtUI is an edit of ElvUI, BenikUI, S&L Edit, and other AddOns/Plug-Ins.", - "author": "vxt", - "version": "5.17", - "screenshot_url": "https://www.tukui.org/addons/vxt/1607012593/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=133", - "category": "Edited UIs & Compilations", - "downloads": "21020", - "lastupdate": "2021-01-05 15:21:18", - "patch": "9.0.2", - "web_url": "https://www.tukui.org/addons.php?id=133", - "last_download": "2021-06-25 07:26:53", - "changelog": "https://www.tukui.org/addons.php?id=133&changelog" - }, - { - "id": "176", - "name": "Zone Text Hider", - "small_desc": "The picture is a meaningless screen shot of my UI. \r\nIt's a simple plugin that hides the Zone text.", - "author": "doc309", - "version": "2.0", - "screenshot_url": "https://www.tukui.org/addons/doc309/1594949699/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=176", - "category": "Plugins: ElvUI", - "downloads": "4542", - "lastupdate": "2020-07-17 02:41:36", - "patch": "8.3", - "web_url": "https://www.tukui.org/addons.php?id=176", - "last_download": "2021-06-25 15:27:57", - "changelog": "https://www.tukui.org/addons.php?id=176&changelog" - }, - { - "id": "98", - "name": "[rp:tags]", - "small_desc": "Create roleplaying-oriented unit frames in ElvUI and/or rpUnitFrames", - "author": "oraibi", - "version": "9.0.5.10", - "screenshot_url": "https://www.tukui.org/addons/oraibi/1522565869/screenshot.png", - "url": "https://www.tukui.org/addons.php?download=98", - "category": "Roleplay", - "downloads": "7864", - "lastupdate": "2021-06-05 10:01:00", - "patch": "9.0.5", - "web_url": "https://www.tukui.org/addons.php?id=98", - "last_download": "2021-06-25 07:23:30", - "changelog": "https://www.tukui.org/addons.php?id=98&changelog" - } -] \ No newline at end of file diff --git a/test/strongbox/addon_test.clj b/test/strongbox/addon_test.clj index c7998c34..ee6cef1e 100644 --- a/test/strongbox/addon_test.clj +++ b/test/strongbox/addon_test.clj @@ -43,85 +43,145 @@ (deftest group-addons (testing "addons with nothing to group on are not modified" - (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" :interface-version 80300 :installed-version "1.2.3" :supported-game-tracks [:retail]} - {:name "a2", :dirname "A2", :label "A2", :description "" :interface-version 80300 :installed-version "4.5.6" :supported-game-tracks [:retail]} - {:name "a3", :dirname "A3", :label "A2", :description "" :interface-version 80300 :installed-version "7.8.9" :supported-game-tracks [:retail]}] + (let [addon-list [{:name "a1", + :dirname "A1", + :label "A1", + :description "" + :interface-version-list [80300] + :installed-version "1.2.3" + :supported-game-tracks [:retail]} + + {:name "a2", + :dirname "A2", + :label "A2", + :description "" + :interface-version-list [80300] + :installed-version "4.5.6" + :supported-game-tracks [:retail]} + + {:name "a3", + :dirname "A3", + :label "A2", + :description "" + :interface-version-list [80300] + :installed-version "7.8.9" + :supported-game-tracks [:retail]}] expected addon-list] (is (= expected (addon/group-addons addon-list))))) (testing "addons with groupable data but no groupings are not modified" - (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" :interface-version 80300 :installed-version "1.2.3" + (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" + :interface-version-list [80300] + :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" :primary? true} - {:name "a2", :dirname "A2", :label "A2", :description "" :interface-version 80300 :installed-version "4.5.6" + {:name "a2", :dirname "A2", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "4.5.6" :supported-game-tracks [:retail] :group-id "bar" :primary? true} - {:name "a3", :dirname "A3", :label "A2", :description "" :interface-version 80300 :installed-version "7.8.9" + {:name "a3", :dirname "A3", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "7.8.9" :supported-game-tracks [:retail] :group-id "baz" :primary? true}] expected addon-list] (is (= expected (addon/group-addons addon-list))))) (testing "addons with groupable data with one marked as the `primary`, group as expected" - (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" :interface-version 80300 :installed-version "1.2.3" + (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" + :interface-version-list [80300] + :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" :primary? true} - {:name "a2", :dirname "A2", :label "A2", :description "" :interface-version 80300 :installed-version "4.5.6" + {:name "a2", :dirname "A2", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "4.5.6" :supported-game-tracks [:retail] :group-id "foo" :primary? false} - {:name "a3", :dirname "A3", :label "A2", :description "" :interface-version 80300 :installed-version "7.8.9" + {:name "a3", :dirname "A3", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "7.8.9" :supported-game-tracks [:retail] :group-id "bar" :primary? true}] - expected [{:name "a1", :dirname "A1", :label "A1", :description "" :interface-version 80300 :installed-version "1.2.3" + expected [{:name "a1", :dirname "A1", :label "A1", :description "" + :interface-version-list [80300] + :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" :primary? true :group-addons - [{:name "a1", :dirname "A1", :label "A1", :description "" :interface-version 80300 :installed-version "1.2.3" + [{:name "a1", :dirname "A1", :label "A1", :description "" + :interface-version-list [80300] + :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" :primary? true} - {:name "a2", :dirname "A2", :label "A2", :description "" :interface-version 80300 :installed-version "4.5.6" + {:name "a2", :dirname "A2", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "4.5.6" :supported-game-tracks [:retail] :group-id "foo" :primary? false}]} - {:name "a3", :dirname "A3", :label "A2", :description "" :interface-version 80300 :installed-version "7.8.9" + {:name "a3", :dirname "A3", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "7.8.9" :supported-game-tracks [:retail] :group-id "bar" :primary? true}]] (is (= expected (addon/group-addons addon-list))))) (testing "synthetic records are created for groupable addons with no primary addon" - (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" :interface-version 80300 :installed-version "1.2.3" + (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" + :interface-version-list [80300] + :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" :primary? false} - {:name "a2", :dirname "A2", :label "A2", :description "" :interface-version 80300 :installed-version "4.5.6" + {:name "a2", :dirname "A2", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "4.5.6" :supported-game-tracks [:retail] :group-id "foo" :primary? false} - {:name "a3", :dirname "A3", :label "A2", :description "" :interface-version 80300 :installed-version "7.8.9" + {:name "a3", :dirname "A3", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "7.8.9" :supported-game-tracks [:retail] :group-id "bar" :primary? true}] - expected [{:name "a1", :dirname "A1", :label "foo (group)", :description "group record for the foo addon" :interface-version 80300 :installed-version "1.2.3" + expected [{:name "a1", :dirname "A1", :label "foo (group)", :description "group record for the foo addon" + :interface-version-list [80300] + :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" :primary? false :group-addons - [{:name "a1", :dirname "A1", :label "A1", :description "" :interface-version 80300 :installed-version "1.2.3" + [{:name "a1", :dirname "A1", :label "A1", :description "" + :interface-version-list [80300] + :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" :primary? false} - {:name "a2", :dirname "A2", :label "A2", :description "" :interface-version 80300 :installed-version "4.5.6" + {:name "a2", :dirname "A2", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "4.5.6" :supported-game-tracks [:retail] :group-id "foo" :primary? false}]} - {:name "a3", :dirname "A3", :label "A2", :description "" :interface-version 80300 :installed-version "7.8.9" + {:name "a3", :dirname "A3", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "7.8.9" :supported-game-tracks [:retail] :group-id "bar" :primary? true}]] (is (= expected (addon/group-addons addon-list))))) (testing "if any one addon in a group is ignored, the top-level addon ('all') is also ignored" - (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" :interface-version 80300 :installed-version "1.2.3" + (let [addon-list [{:name "a1", :dirname "A1", :label "A1", :description "" + :interface-version-list [80300] + :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" :primary? true} - {:name "a2", :dirname "A2", :label "A2", :description "" :interface-version 80300 :installed-version "4.5.6" + {:name "a2", :dirname "A2", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "4.5.6" :supported-game-tracks [:retail] :group-id "foo" :primary? false} - {:name "a3", :dirname "A3", :label "A2", :description "" :interface-version 80300 :installed-version "7.8.9" + {:name "a3", :dirname "A3", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "7.8.9" :supported-game-tracks [:retail] :group-id "foo" :primary? false :ignore? true}] @@ -129,7 +189,7 @@ :dirname "A1" :label "A1" :description "" - :interface-version 80300 + :interface-version-list [80300] :installed-version "1.2.3" :supported-game-tracks [:retail] @@ -140,7 +200,7 @@ :dirname "A1", :label "A1", :description "" - :interface-version 80300 + :interface-version-list [80300] :supported-game-tracks [:retail] :installed-version "1.2.3" @@ -150,7 +210,7 @@ :dirname "A2", :label "A2", :description "" - :interface-version 80300 + :interface-version-list [80300] :supported-game-tracks [:retail] :installed-version "4.5.6" @@ -160,7 +220,7 @@ :dirname "A3", :label "A2", :description "" - :interface-version 80300 + :interface-version-list [80300] :supported-game-tracks [:retail] :installed-version "7.8.9" @@ -185,7 +245,7 @@ :dirsize 0 :label "SomeAddon", :description "asdf", - :interface-version 80300, + :interface-version-list [80300] :supported-game-tracks [:retail] :installed-version "1.2.3"}] @@ -218,7 +278,7 @@ :dirsize 0 :label "SomeAddon" :description "asdf" - :interface-version 80300 + :interface-version-list [80300] ;; shared between toc and nfo, nfo wins out :installed-version "1.2.3" @@ -260,7 +320,7 @@ :dirsize 0 :label "SomeAddon", :description "asdf", - :interface-version 80300, + :interface-version-list [80300] :installed-version "1.2.3" :supported-game-tracks [:retail]}] (is (= expected (addon/load-installed-addon some-addon-path :retail))) @@ -285,7 +345,7 @@ :dirsize 0 :label "SomeAddon", :description "asdf", - :interface-version 80300 + :interface-version-list [80300] :supported-game-tracks [:retail] :installed-version "@project-version@" :source "wowinterface" @@ -304,7 +364,7 @@ :dirname "EveryAddon", :dirsize 0 :installed-version "1.2.3", - :interface-version 11307, + :interface-version-list [11307] :label "EveryAddon 1.2.3", :name "everyaddon", :supported-game-tracks [:classic :classic-tbc :retail]}] @@ -334,7 +394,9 @@ expected (helper/install-dir-contents) - defaults {:name "nom" :label "Nom" :description "" :interface-version 90100 :installed-version "0.1" + defaults {:name "nom" :label "Nom" :description "" + :interface-version-list [90100] + :installed-version "0.1" :supported-game-tracks [:retail]}] (doseq [[given error-prefix] cases] (let [[error-message] @@ -348,25 +410,34 @@ (deftest test-pinned-dir-list (testing "directory names of pinned addons are detected" (let [addon-list [;; single, unpinned, addon - {:name "a1", :dirname "A1", :label "A1", :description "" :installed-version "1.2.3" :interface-version 80300 + {:name "a1", :dirname "A1", :label "A1", :description "" :installed-version "1.2.3" + :interface-version-list [80300] :supported-game-tracks [:retail] :group-id "foo" :primary? true} ;; single, pinned, addon - {:name "a2", :dirname "A2", :label "A2", :description "" :interface-version 80300 :installed-version "4.5.6" + {:name "a2", :dirname "A2", :label "A2", :description "" + :interface-version-list [80300] + :installed-version "4.5.6" :supported-game-tracks [:retail] :group-id "bar" :primary? false :pinned-version "4.5.6"} ;; grouped addon, group members pinned - {:name "a3", :dirname "A3", :label "A3", :description "" :interface-version 80300 :installed-version "7.8.9" + {:name "a3", :dirname "A3", :label "A3", :description "" + :interface-version-list [80300] + :installed-version "7.8.9" :supported-game-tracks [:retail] :group-id "baz" :primary? true, :pinned-version "7.8.9" :group-addons [;; addon's contain themselves in `:group-addons` - {:name "a3", :dirname "A3", :label "A3", :description "" :interface-version 80300 :installed-version "7.8.9" + {:name "a3", :dirname "A3", :label "A3", :description "" + :interface-version-list [80300] + :installed-version "7.8.9" :supported-game-tracks [:retail] :group-id "baz" :primary? true :pinned-version "7.8.9"} - {:name "a3-sub", :dirname "A3_Sub", :label "A3-Sub", :description "" :interface-version 80300 :installed-version "7.8.9.0" + {:name "a3-sub", :dirname "A3_Sub", :label "A3-Sub", :description "" + :interface-version-list [80300] + :installed-version "7.8.9.0" :supported-game-tracks [:retail] :group-id "baz" :primary? false :pinned-version "7.8.9"}]} @@ -374,15 +445,21 @@ ;; grouped addon, only a group member pinned. ;; todo: support this case and consider both A4 and A4_Sub pinned? ;; is this case possible if an unpinned addon overwrites a pinned one? - {:name "a4", :dirname "A4", :label "A4", :description "" :interface-version 80300 :installed-version "0.1.2" + {:name "a4", :dirname "A4", :label "A4", :description "" + :interface-version-list [80300] + :installed-version "0.1.2" :supported-game-tracks [:retail] :group-id "bup" :primary? false :group-addons [;; addon's contain themselves in `:group-addons` - {:name "a4", :dirname "A4", :label "A4", :description "" :interface-version 80300 :installed-version "0.1.2" + {:name "a4", :dirname "A4", :label "A4", :description "" + :interface-version-list [80300] + :installed-version "0.1.2" :supported-game-tracks [:retail] :group-id "bup" :primary? false} ;;, :pinned-version "7.8.9"} ;; we're not doing this. should we be doing this? - {:name "a4-sub", :dirname "A4_Sub", :label "A4-Sub", :description "" :interface-version 80300 :installed-version "0.1.2.0" + {:name "a4-sub", :dirname "A4_Sub", :label "A4-Sub", :description "" + :interface-version-list [80300] + :installed-version "0.1.2.0" :supported-game-tracks [:retail] :group-id "bup" :primary? false :pinned-version "foooooooooooo"}]}] @@ -404,7 +481,7 @@ :dirname "EveryAddon", :label "Every Addon", :description "" - :interface-version 80300 + :interface-version-list [80300] :installed-version "1.2.3" :supported-game-tracks [:retail] :group-id "foo" @@ -483,54 +560,54 @@ (deftest test-re-installable? (testing "an addon is re-installable if a release matching its installed-version is present" - (let [addon {:name "a3", :dirname "A3", :label "A3", :description "" :interface-version 80300 :installed-version "1.2.0" + (let [addon {:name "a3", :dirname "A3", :label "A3", :description "" + :interface-version-list [80300] + :installed-version "1.2.0" :group-id "baz", :primary? true, :download-url "https://example.org/path/to/addon.zip" :source "curseforge" :source-id 123 :version "1.2.0" :game-track :retail :release-list [{:download-url "https://example.org/path/to/addon.zip" :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Addon-1.2.3.zip", + :interface-version-list [90000], :version "1.2.3"} {:download-url "https://example.org/path/to/addon.zip" :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Addon-1.2.0.zip", + :interface-version-list [90000], :version "1.2.0"}]}] (is (addon/re-installable? addon))))) (deftest test-find-release (testing "an addon's installed release can be found" - (let [addon {:name "a3", :dirname "A3", :label "A3", :description "" :interface-version 80300 :installed-version "1.2.0" + (let [addon {:name "a3", :dirname "A3", :label "A3", :description "" + :interface-version-list [80300] + :installed-version "1.2.0" :group-id "baz", :primary? true, :download-url "https://example.org/path/to/addon.zip" :source "curseforge" :source-id 123 :version "1.2.0" :game-track :retail :release-list [{:download-url "https://example.org/path/to/addon.zip" :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Addon-1.2.3.zip", + :interface-version-list [90000], :version "1.2.3"} {:download-url "https://example.org/path/to/addon.zip" :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Addon-1.2.0.zip", + :interface-version-list [90000], :version "1.2.0"}]} expected (get-in addon [:release-list 1])] (is (= expected (addon/find-release addon)))))) (deftest test-find-pinned-release (testing "an addon's installed release can be found" - (let [addon {:name "a3", :dirname "A3", :label "A3", :description "" :interface-version 80300 :installed-version "1.2.0" + (let [addon {:name "a3", :dirname "A3", :label "A3", :description "" + :interface-version-list [80300] + :installed-version "1.2.0" :group-id "baz", :primary? true, :download-url "https://example.org/path/to/addon.zip" :source "curseforge" :source-id 123 :version "1.2.0" :game-track :retail :pinned-version "1.2.3" :release-list [{:download-url "https://example.org/path/to/addon.zip" :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Addon-1.2.3.zip", + :interface-version-list [90000], :version "1.2.3"} {:download-url "https://example.org/path/to/addon.zip" :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Addon-1.2.0.zip", + :interface-version-list [90000], :version "1.2.0"}]} expected (get-in addon [:release-list 0])] (is (= expected (addon/find-pinned-release addon)))))) diff --git a/test/strongbox/catalogue_test.clj b/test/strongbox/catalogue_test.clj index f1aefaa2..fc4f7e84 100644 --- a/test/strongbox/catalogue_test.clj +++ b/test/strongbox/catalogue_test.clj @@ -543,8 +543,8 @@ {:group-id "https://example.org" :source "wowinterface" :source-id 123 - :interface-version constants/default-interface-version-classic - :toc/game-track :classic + :interface-version-list [constants/default-interface-version-classic] + :-toc/game-track-list [:classic] :supported-game-tracks [:classic]}) expected {:label "EveryAddon 1.2.3", :name "everyaddon", diff --git a/test/strongbox/cli_test.clj b/test/strongbox/cli_test.clj index 0c870d0d..9b4464e7 100644 --- a/test/strongbox/cli_test.clj +++ b/test/strongbox/cli_test.clj @@ -480,7 +480,7 @@ :group-id "https://www.wowinterface.com/downloads/info25079", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000] :supported-game-tracks [:retail] :label "EveryAddon 1.2.3", :name "rotation-master", @@ -534,7 +534,7 @@ (:addon-summary-list (catalogue/read-catalogue (core/paths :user-catalogue-file)))))))))) (deftest import-addon--curseforge - (testing "user curseforge addon is not added to the user catalogue if it's present in the catalogue" + (testing "user's curseforge addon is *not* added to the user-catalogue, even if it is present in the regular catalogue" (let [install-dir (helper/install-dir) match {:created-date "2010-05-07T18:48:16Z", @@ -552,15 +552,15 @@ catalogue (utils/to-json (catalogue/new-catalogue [match])) - every-addon-zip-file (fixture-path "everyaddon--1-2-3.zip") fake-routes {"https://raw.githubusercontent.com/ogri-la/strongbox-catalogue/master/short-catalogue.json" {:get (fn [req] {:status 200 :body catalogue})} - "https://addons-ecs.forgesvc.net/api/v2/addon/1" - {:get (fn [req] {:status 200 :body (slurp (fixture-path "curseforge-api-addon--everyaddon.json"))})} + ;; won't be hit + ;;"https://addons-ecs.forgesvc.net/api/v2/addon/1" - "https://edge.forgecdn.net/files/1/1/EveryAddon.zip" - {:get (fn [req] {:status 200 :body (helper/file-to-lazy-byte-array every-addon-zip-file)})}} + ;; won't be hit + ;;"https://edge.forgecdn.net/files/1/1/EveryAddon.zip" + } user-url (:url match)] @@ -610,7 +610,7 @@ :group-id "https://www.tukui.org/addons.php?id=98", :installed-game-track :retail, :installed-version "0.960", - :interface-version 70000, + :interface-version-list [70000], :supported-game-tracks [:retail] :label "EveryAddon 1.2.3", :name "-rp-tags", @@ -626,15 +626,15 @@ catalogue (utils/to-json (catalogue/new-catalogue [match])) - every-addon-zip-file (fixture-path "everyaddon--1-2-3.zip") fake-routes {"https://raw.githubusercontent.com/ogri-la/strongbox-catalogue/master/short-catalogue.json" {:get (fn [req] {:status 200 :body catalogue})} - "https://www.tukui.org/api.php?addons" - {:get (fn [req] {:status 200 :body (slurp (fixture-path "tukui--addon-details.json"))})} + ;; won't be hit + ;;"https://www.tukui.org/api.php?addons" - "https://www.tukui.org/addons.php?download=98" - {:get (fn [req] {:status 200 :body (helper/file-to-lazy-byte-array every-addon-zip-file)})}} + ;; won't be hit + ;;"https://www.tukui.org/addons.php?download=98" + } user-url (:url match)] @@ -684,10 +684,6 @@ ;; this is because regular catalogues are updated periodically and the user-catalogue is not. full-catalogue short-catalogue - tukui-fixture (slurp (fixture-path "user-catalogue--tukui.json")) - tukui-classic-fixture (slurp (fixture-path "user-catalogue--tukui-classic.json")) - tukui-classic-tbc-fixture (slurp (fixture-path "user-catalogue--tukui-classic-tbc.json")) - curseforge-fixture (slurp (fixture-path "user-catalogue--curseforge.json")) wowinterface-fixture (slurp (fixture-path "user-catalogue--wowinterface.json")) github-fixture (slurp (fixture-path "user-catalogue--github.json")) github-contents-fixture (slurp (fixture-path "user-catalogue--github-contents.json")) @@ -705,15 +701,6 @@ "https://raw.githubusercontent.com/ogri-la/strongbox-catalogue/master/short-catalogue.json" {:get (fn [req] {:status 200 :body short-catalogue})} - "https://www.tukui.org/api.php?addons" - {:get (fn [req] {:status 200 :body tukui-fixture})} - - "https://www.tukui.org/api.php?classic-addons" - {:get (fn [req] {:status 200 :body tukui-classic-fixture})} - - "https://www.tukui.org/api.php?classic-tbc-addons" - {:get (fn [req] {:status 200 :body tukui-classic-tbc-fixture})} - "https://api.github.com/repos/Stanzilla/AdvancedInterfaceOptions/releases" {:get (fn [req] {:status 200 :body github-fixture})} @@ -729,9 +716,6 @@ "https://api.mmoui.com/v3/game/WOW/filedetails/24566.json" {:get (fn [req] {:status 200 :body wowinterface-fixture})} - "https://addons-ecs.forgesvc.net/api/v2/addon/13501" - {:get (fn [req] {:status 200 :body curseforge-fixture})} - "https://gitlab.com/api/v4/projects/thing-engineering%2Fwowthing%2Fwowthing-collector" {:get (fn [req] {:status 200 :body gitlab-repo-fixture})} @@ -845,7 +829,7 @@ :installed-version "5.6.20210831" :name "the-undermine-journal" :source "wowinterface" - :interface-version 90100 + :interface-version-list [90100] :game-track :retail :installed-game-track :retail :label "The Undermine Journal" @@ -933,7 +917,7 @@ :dirname "EveryAddon", :group-id "everyaddon-aaaaaaaa", :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :label "EveryAddon 1.2.3", :name "everyaddon", :primary? true, @@ -942,14 +926,14 @@ :dirname "EveryAddon-BundledAddon", :group-id "everyaddon-aaaaaaaa", :installed-version "a.b.c", - :interface-version 80000, + :interface-version-list [80000], :label "BundledAddon a.b.c", :name "bundledaddon-a-b-c", :primary? false, :supported-game-tracks [:retail]}], :group-id "everyaddon-aaaaaaaa", :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :label "EveryAddon 1.2.3", :name "everyaddon", :primary? true, diff --git a/test/strongbox/core_test.clj b/test/strongbox/core_test.clj index b7eea8f2..a4af477a 100644 --- a/test/strongbox/core_test.clj +++ b/test/strongbox/core_test.clj @@ -222,7 +222,6 @@ addon3-wowinterface-fixture (slurp (fixture-path "import-export--wowinterface-addon-details.json")) addon3-zip-file (fixture-path "addon3.zip") - addon4-tukui-addon-list-fixture (slurp (fixture-path "import-export--tukui-addon-list.json")) addon4-zip-file (fixture-path "addon4.zip") addon5-github-addon-fixture (slurp (fixture-path "import-export--github-addon-details.json")) @@ -247,8 +246,7 @@ {:get (fn [req] {:status 200 :body (helper/file-to-lazy-byte-array addon3-zip-file)})} ;; addon4, tukui - "https://www.tukui.org/api.php?addons" - {:get (fn [req] {:status 200 :body addon4-tukui-addon-list-fixture})} + ;; disabled ;; ... zip file "https://www.tukui.org/addons.php?download=4" @@ -273,7 +271,7 @@ :group-id "https://www.wowinterface.com/downloads/info3", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :label "Addon3", :matched? true, :name "addon3", @@ -300,7 +298,7 @@ :group-id "https://github.com/author/addon5", :installed-game-track :classic-tbc, :installed-version "v0.6", - :interface-version 70000, + :interface-version-list [70000], :label "Addon5", :matched? true, :name "addon5", @@ -341,7 +339,6 @@ addon3-wowinterface-fixture (slurp (fixture-path "import-export--wowinterface-addon-details.json")) addon3-zip-file (fixture-path "addon3.zip") - addon4-tukui-addon-list-fixture (slurp (fixture-path "import-export--tukui-addon-list.json")) addon4-zip-file (fixture-path "addon4.zip") addon5-github-addon-fixture (slurp (fixture-path "import-export--github-addon-details.json")) @@ -366,8 +363,7 @@ {:get (fn [req] {:status 200 :body (helper/file-to-lazy-byte-array addon3-zip-file)})} ;; addon4, tukui - "https://www.tukui.org/api.php?addons" - {:get (fn [req] {:status 200 :body addon4-tukui-addon-list-fixture})} + ;; disabled ;; ... zip file "https://www.tukui.org/addons.php?download=4" @@ -392,7 +388,7 @@ :group-id "https://www.wowinterface.com/downloads/info3", :installed-game-track :classic, ;; imported game track :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000] :label "Addon3", :matched? true, :name "addon3", @@ -419,7 +415,7 @@ :group-id "https://github.com/author/addon5", :installed-game-track :classic-tbc, :installed-version "v0.6", - :interface-version 70000, + :interface-version-list [70000] :label "Addon5", :matched? true, :name "addon5", @@ -463,7 +459,7 @@ dummy-catalogue (catalogue/new-catalogue catalogue) ;; this is a subset of the data the remote addon host (like wowinterface) serves us - api-result [{:game-track :retail, + api-result [{:game-track :retail, ;; todo: be careful here. it's game-track from source updates, not anything else :UIVersion "v8.10.00"}] alt-api-result (assoc-in api-result [0 :UIVersion] "v8.20.00") @@ -489,7 +485,7 @@ :label "Every Addon" :description "foo" :dirname "EveryAddon" - :interface-version 70000 + :interface-version-list [70000] :installed-version "v8.10.00" :supported-game-tracks [:retail]} @@ -764,10 +760,12 @@ (testing "installing an addon with a single invalid toc is possible, but loading it's toc data is not." (with-running-app (let [install-dir (helper/install-dir) - [[addon] downloaded-file] (helper/gen-addon! install-dir {:override {:interface-version 0}}) + [[addon] downloaded-file] (helper/gen-addon! install-dir {:override {:interface-version-list [0]}}) + install-path (->> addon :toc :dirname (fs/file install-dir) str) expected (-> addon :derived-nfo)] (core/install-addon (:installable addon) install-dir downloaded-file) - (is (= expected (core/load-installed-addon (str (fs/file install-dir (-> addon :toc :dirname)))))) + + (is (= expected (core/load-installed-addon install-path))) (is (= [expected] (core/get-state :installed-addon-list))))))) ;; @@ -1158,7 +1156,7 @@ :label "EveryAddon" :description "Toc Description" :dirname "EveryAddon" - :interface-version 70000 + :interface-version-list [70000] :installed-version "1.2.3" :supported-game-tracks [:retail]} @@ -1180,7 +1178,7 @@ :label "EveryAddon" :description "Toc Description" :dirname "EveryAddon" - :interface-version 70000 + :interface-version-list [70000] :installed-version "1.2.3" :supported-game-tracks [:retail] @@ -1217,7 +1215,7 @@ :group-id "https://group.id/never/fetched", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :supported-game-tracks [:retail] :label "EveryAddon 1.2.3", :name "everyaddon", @@ -1252,7 +1250,7 @@ :group-id "https://group.id/never/fetched", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :supported-game-tracks [:retail] :label "EveryAddon 1.2.3", :name "everyaddon", @@ -1302,7 +1300,7 @@ :installed-game-track :retail, :installed-version "5.6.7", - :interface-version 80000, + :interface-version-list [80000], :supported-game-tracks [:retail] :label "BundledAddon a.b.c", :name "everyotheraddon", @@ -1317,7 +1315,7 @@ :group-id "https://group.id/also/never/fetched", :installed-game-track :retail, :installed-version "5.6.7", - :interface-version 70000, + :interface-version-list [70000], :supported-game-tracks [:retail] :label "EveryOtherAddon 5.6.7", :name "everyotheraddon", @@ -1329,7 +1327,7 @@ :ignore? true, :installed-game-track :retail, :installed-version "5.6.7", - :interface-version 80000, + :interface-version-list [80000], :supported-game-tracks [:retail] :label "fetched (group)", :name "everyotheraddon", @@ -1377,7 +1375,7 @@ :group-id "https://group.id/never/fetched", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :supported-game-tracks [:retail] :label "EveryAddon 1.2.3", :name "everyaddon", @@ -1736,7 +1734,7 @@ :group-id "https://example.com/EveryAddonThree", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :label "EveryAddon", :name "everyaddon", :primary? false, @@ -1751,7 +1749,7 @@ :group-id "https://example.com/EveryAddonThree", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :label "EveryAddon", :name "everyaddon", :primary? false, @@ -1766,7 +1764,7 @@ :group-id "https://example.com/EveryAddonThree", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :label "EveryAddon", :name "everyaddon", :primary? false, @@ -1778,7 +1776,7 @@ :group-id "https://example.com/EveryAddonThree", :installed-game-track :retail, :installed-version "1.2.3", - :interface-version 70000, + :interface-version-list [70000], :label "EveryAddonThree (group)", :name "everyaddon", :primary? false, @@ -1824,8 +1822,8 @@ :label "Every Addon" :description "foo" :dirname "EveryAddon" - :interface-version 70000 - :toc/game-track :retail + :interface-version-list [70000] + :-toc/game-track-list [:retail] :supported-game-tracks [:retail] :installed-version "v8.10.00"} installed-addon-list [toc] @@ -1858,8 +1856,8 @@ :label "Every Addon" :description "foo" :dirname "EveryAddon" - :interface-version 70000 - :toc/game-track :retail + :interface-version-list [70000] + :-toc/game-track-list [:retail] :supported-game-tracks [:retail] :installed-version "v8.10.00" :ignore? true} diff --git a/test/strongbox/curseforge_api_test.clj b/test/strongbox/curseforge_api_test.clj index ff2c9cb4..83d976b4 100644 --- a/test/strongbox/curseforge_api_test.clj +++ b/test/strongbox/curseforge_api_test.clj @@ -1,319 +1,9 @@ (ns strongbox.curseforge-api-test (:require [clojure.test :refer [deftest testing is use-fixtures]] - [clj-http.fake :refer [with-fake-routes-in-isolation]] ;;[taoensso.timbre :as log :refer [debug info warn error spy]] [strongbox - [constants :as constants] - [curseforge-api :as curseforge-api] - [test-helper :as helper :refer [fixture-path]]])) - -(deftest expand-summary - (testing "simple addon expansion, ideal conditions" - (let [api-results (slurp (fixture-path "curseforge-api-addon--everyaddon.json")) - fake-routes {"https://addons-ecs.forgesvc.net/api/v2/addon/1" - {:get (fn [req] {:status 200 :body api-results})}} - - game-track :retail - - ;; what would be seen in the catalogue - addon-summary {:created-date "2010-05-07T18:48:16Z", - :description "Does what no other addon does, slightly differently", - :tag-list [:bags :inventory] - :updated-date "2019-06-26T01:21:39Z", - :name "everyaddon", - :source "curseforge", - :label "EveryAddon", - :download-count 3000000, - :source-id 1, - :url "https://www.curseforge.com/wow/addons/everyaddon"} - - ;; what is added to figure out how to download file - expected [{:download-url "https://edge.forgecdn.net/files/1/1/EveryAddon.zip" - :version "v8.2.0-v1.13.2-7135.139" - :interface-version 80000 ;; "8.0.1" => 80000 - :release-label "[WoW 8.0.1] EveryAddon-v8.2.0-v1.13.2-7135.139" - :game-track game-track}]] - (with-fake-routes-in-isolation fake-routes - (is (= expected (curseforge-api/expand-summary addon-summary game-track))))))) - -(deftest expand-summary--no-matching-release - (testing "addon expansion when selected game track doesn't match anything available in releases" - (let [api-results (slurp (fixture-path "curseforge-api-addon--everyaddon.json")) - fake-routes {"https://addons-ecs.forgesvc.net/api/v2/addon/1" - {:get (fn [req] {:status 200 :body api-results})}} - addon-summary {:created-date "2010-05-07T18:48:16Z", - :description "Does what no other addon does, slightly differently", - :tag-list [:bags :inventory] - :updated-date "2019-06-26T01:21:39Z", - :name "everyaddon", - :source "curseforge", - :label "EveryAddon", - :download-count 3000000, - :source-id 1, - :url "https://www.curseforge.com/wow/addons/everyaddon"} - game-track :classic - expected nil] - (with-fake-routes-in-isolation fake-routes - (is (= expected (curseforge-api/expand-summary addon-summary game-track))))))) - -(deftest group-releases - ;; todo: we are testing multiple things here: - ;; gameVersionFlavor grouping when gameVersion is absent - ;; excluding non-stable and alternate releases - (testing "releases are filtered and grouped correctly when `:gameVersion` is not present (unstable and alternate releases are not considered)." - (let [[alpha, beta, stable] [3 2 1] - latest-files [;; retail versions - {:gameVersionFlavor "wow_retail", :fileDate "2001-01-03T00:00:00.000Z", :releaseType alpha, :exposeAsAlternative nil - :displayName "1.2.3-alpha" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/1.2.3-alpha.zip"} - {:gameVersionFlavor "wow_retail", :fileDate "2001-01-02T00:00:00.000Z", :releaseType beta, :exposeAsAlternative nil - :displayName "1.2.3-beta" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/1.2.3-beta.zip"} - {:gameVersionFlavor "wow_retail", :fileDate "2001-01-01T00:00:00.000Z", :releaseType stable, :exposeAsAlternative nil - :displayName "1.2.3" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/1.2.3.zip"} - {:gameVersionFlavor "wow_retail", :fileDate "2001-01-01T00:00:00.000Z", :releaseType stable, :exposeAsAlternative true - :displayName "1.2.3-nolib" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/1.2.3-no-lib.zip"} - - ;; classic versions, mirror retail releases - {:gameVersionFlavor "wow_classic", :fileDate "2001-01-03T00:00:00.000Z", :releaseType alpha, :exposeAsAlternative nil - :displayName "a.b.c-nolib" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/a.b.c-alpha.zip"} - {:gameVersionFlavor "wow_classic", :fileDate "2001-01-02T00:00:00.000Z", :releaseType beta, :exposeAsAlternative nil - :displayName "a.b.c-beta" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/a.b.c-beta.zip"} - {:gameVersionFlavor "wow_classic", :fileDate "2001-01-01T00:00:00.000Z", :releaseType stable, :exposeAsAlternative nil - :displayName "a.b.c" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/a.b.c.zip"} - {:gameVersionFlavor "wow_classic", :fileDate "2001-01-01T00:00:00.000Z", :releaseType stable, :exposeAsAlternative true - :displayName "a.b.c-nolib" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/a.b.c-no-lib.zip"}] - - fixture {:latestFiles latest-files} - expected {:retail [{:download-url "https://example.org/path/to/1.2.3.zip" - :version "1.2.3" - :game-track :retail - :release-label "[WoW 10.0.0] Foo", - ;; synthetic, we had to guess using `:gameVersionFlavor` - :interface-version constants/default-interface-version}] - :classic [{:download-url "https://example.org/path/to/a.b.c.zip" - :version "a.b.c" - :game-track :classic - :release-label "[WoW 1.14.3] Foo" - ;; synthetic, we had to guess using `:gameVersionFlavor` - :interface-version constants/default-interface-version-classic}]}] - (is (= expected (curseforge-api/group-releases fixture))))) - - (testing "a release using both `:gameVersionFlavor` and a list of supported `:gameVersion` game tracks ignores `:gameVersionFlavor` and is expanded into multiple releases" - (let [stable 1 - latest-files [{:gameVersionFlavor "wow_retail", :gameVersion ["1.13.1" "8.2.5"] - :fileDate "2001-01-03T00:00:00.000Z", :releaseType stable, :exposeAsAlternative nil - :displayName "1.2.3" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/foo.zip"}] - fixture {:latestFiles latest-files} - - expected {:retail [{:download-url "https://example.org/path/to/foo.zip" - :version "1.2.3" - :game-track :retail - :release-label "[WoW 1.13.1] Foo", - :interface-version 80200}] - :classic [{:download-url "https://example.org/path/to/foo.zip" - :version "1.2.3" - :game-track :classic - :release-label "[WoW 1.13.1] Foo", - :interface-version 11300}]}] - (is (= expected (curseforge-api/group-releases fixture))))) - - (testing "multiple releases supporting mixed, multiple, game tracks are expanded and ordered correctly" - (let [stable 1 - latest-files [{:gameVersionFlavor "wow_retail", :gameVersion ["8.2.5"] - :fileDate "2001-01-03T00:00:00.000Z", :releaseType stable, :exposeAsAlternative nil - :displayName "1.2.4" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/1.2.4.zip"} - - {:gameVersionFlavor "wow_retail", :gameVersion ["1.13.1" "8.2.5"] - :fileDate "2001-01-01T00:00:00.000Z", :releaseType stable, :exposeAsAlternative nil - :displayName "1.2.3" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/1.2.3.zip"}] - fixture {:latestFiles latest-files} - - expected {;; retail versions available from 2001-01-03 and 2001-01-01 releases - :retail [{:download-url "https://example.org/path/to/1.2.4.zip" - :version "1.2.4" - :game-track :retail - :release-label "[WoW 8.2.5] Foo" - :interface-version 80200} - {:download-url "https://example.org/path/to/1.2.3.zip" - :version "1.2.3" - :game-track :retail - :release-label "[WoW 1.13.1] Foo", - :interface-version 80200}] - - ;; classic version available from the 2001-01-01 release - :classic [{:download-url "https://example.org/path/to/1.2.3.zip" - :version "1.2.3" - :game-track :classic - :release-label "[WoW 1.13.1] Foo", - :interface-version 11300}]}] - (is (= expected (curseforge-api/group-releases fixture))))) - - (testing "use `:gameVersionFlavor` to decide the game track when `:gameVersion` is empty." - (let [stable 1 - latest-files [{:gameVersionFlavor "wow_classic", :gameVersion [] - :fileDate "2019-01-01T00:00:00.000Z", :releaseType stable, :exposeAsAlternative nil - :displayName "1.2.4" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/1.2.4.zip"} - - {:gameVersionFlavor "wow_retail", :gameVersion ["1.13.1" "8.2.5"] - :fileDate "2001-01-01T00:00:00.000Z", :releaseType stable, :exposeAsAlternative nil - :displayName "1.2.3" :fileName "Foo.zip" :downloadUrl "https://example.org/path/to/1.2.3.zip"}] - fixture {:latestFiles latest-files} - - expected {:retail [{:download-url "https://example.org/path/to/1.2.3.zip" - :version "1.2.3" - :game-track :retail - :release-label "[WoW 1.13.1] Foo", - :interface-version 80200}] - - :classic [{:download-url "https://example.org/path/to/1.2.4.zip" - :version "1.2.4" - :game-track :classic - :release-label "[WoW 1.14.3] Foo", - :interface-version 11400} - {:download-url "https://example.org/path/to/1.2.3.zip" - :version "1.2.3" - :game-track :classic - :release-label "[WoW 1.13.1] Foo", - :interface-version 11300}]}] - (is (= expected (curseforge-api/group-releases fixture)))))) - -;; - -(deftest download-addon-404 - (testing "regular addon fetch that yields a 404 returns nil" - (let [;; listed in the curseforge catalogue but returns (returned) a 404 when fetched - zombie-addon {:name "Brewmaster Tools" - :url "https://www.curseforge.com/wow/addons/brewmastertools" - :label "" - :tag-list [] - :updated-date "2019-01-01T00:00:00Z" - :download-count 0 - :source-id 1 - :source "curseforge"} - fake-routes {"https://addons-ecs.forgesvc.net/api/v2/addon/1" - {:get (fn [req] {:status 404 :reason-phrase "Not Found" :body "

Not Found

"})}}] - (with-fake-routes-in-isolation fake-routes - (is (nil? (curseforge-api/expand-summary zombie-addon :retail))))))) - -;; - -(deftest release-download-url - (let [cases [[1234 "foo.zip" "https://edge.forgecdn.net/files/1/234/foo.zip"] - [12345 "foo.zip" "https://edge.forgecdn.net/files/12/345/foo.zip"] - [123456 "foo.zip" "https://edge.forgecdn.net/files/123/456/foo.zip"] - [1234567 "foo.zip" "https://edge.forgecdn.net/files/1234/567/foo.zip"] - [12345678 "foo.zip" "https://edge.forgecdn.net/files/12345/678/foo.zip"] - [123456789 "foo.zip" "https://edge.forgecdn.net/files/123456/789/foo.zip"] - [1234567899 "foo.zip" "https://edge.forgecdn.net/files/1234567/899/foo.zip"] - ;; actual examples - [842942 "DraenorTreasures-r20141229205945.zip" "https://edge.forgecdn.net/files/842/942/DraenorTreasures-r20141229205945.zip"] - ;; leading zeroes stripped on second bit to more closely match URLs from `:latestFiles` - [3117033 "CanIMogIt-9.0.2v1.30.zip" "https://edge.forgecdn.net/files/3117/33/CanIMogIt-9.0.2v1.30.zip"] - [2731023 "xptracker.zip" "https://edge.forgecdn.net/files/2731/23/xptracker.zip"]]] - - (doseq [[project-file-id project-file-name expected] cases] - (is (= expected (curseforge-api/release-download-url project-file-id project-file-name)))))) - -(deftest older-releases - (testing "bad cases" - (let [cases [[[] []] - [[{}] []]]] - (doseq [[given expected] cases] - (is (= expected (curseforge-api/older-releases given)))))) - - (testing "single release" - (let [given [{:fileType 1 :projectFileId 123456 :projectFileName "Foo.zip" :gameVersion "8.0.3" :gameVersionFlavor "wow_classic"}] - expected [{:download-url "https://edge.forgecdn.net/files/123/456/Foo.zip", - :game-track :classic, - :interface-version 80000, - :release-label "[WoW 8.0.3] Foo", - :version "Foo"}]] - (is (= expected (curseforge-api/older-releases given))))) - - (testing "multiple releases, only stable releases returned" - (let [given [{:fileType 1 :projectFileId 123456 :projectFileName "Foo.zip" :gameVersion "8.0.3" :gameVersionFlavor "wow_classic"} - {:fileType 2 :projectFileId 123457 :projectFileName "Foo-beta.zip" :gameVersion "8.0.3" :gameVersionFlavor "wow_classic"} - {:fileType 3 :projectFileId 123458 :projectFileName "Foo-alpha.zip" :gameVersion "8.0.3" :gameVersionFlavor "wow_classic"}] - expected [{:download-url "https://edge.forgecdn.net/files/123/456/Foo.zip", - :game-track :classic, - :interface-version 80000, - :release-label "[WoW 8.0.3] Foo", - :version "Foo"}]] - (is (= expected (curseforge-api/older-releases given))))) - - (testing "multiple releases, multiple stable" - (let [given [{:fileType 1 :projectFileId 123456 :projectFileName "Foo-v2.zip" :gameVersion "8.0.3" :gameVersionFlavor "wow_classic"} - {:fileType 1 :projectFileId 123457 :projectFileName "Foo-v1.zip" :gameVersion "8.0.0" :gameVersionFlavor "wow_classic"}] - expected [{:download-url "https://edge.forgecdn.net/files/123/456/Foo-v2.zip", - :game-track :classic, - :interface-version 80000, - :release-label "[WoW 8.0.3] Foo-v2", - :version "Foo-v2"} - {:download-url "https://edge.forgecdn.net/files/123/457/Foo-v1.zip", - :game-track :classic, - :interface-version 80000, - :release-label "[WoW 8.0.0] Foo-v1", - :version "Foo-v1"}]] - (is (= expected (curseforge-api/older-releases given))))) - - (testing "multiple releases, multiple stable, ambiguous naming" - (let [given [{:fileType 1 :projectFileId 123456 :projectFileName "Foo.zip" :gameVersion "8.0.3" :gameVersionFlavor "wow_classic"} - {:fileType 1 :projectFileId 123457 :projectFileName "Foo.zip" :gameVersion "8.0.0" :gameVersionFlavor "wow_classic"}] - expected [{:download-url "https://edge.forgecdn.net/files/123/456/Foo.zip", - :game-track :classic, - :interface-version 80000, - :release-label "[WoW 8.0.3] Foo--123456", - :version "Foo--123456"} - {:download-url "https://edge.forgecdn.net/files/123/457/Foo.zip", - :game-track :classic, - :interface-version 80000, - :release-label "[WoW 8.0.0] Foo--123457", - :version "Foo--123457"}]] - (is (= expected (curseforge-api/older-releases given)))))) - -(deftest strip-leading-duplicates - (testing "second addon is removed if it's url matches the first. third is preserved." - (let [given [{:download-url "https://edge.forgecdn.net/files/3104/62/Pawn-2.4.5.zip", - :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Pawn-2.4.5.zip", - :version "2.4.5"} - {:download-url "https://edge.forgecdn.net/files/3104/62/Pawn-2.4.5.zip", - :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Pawn-2.4.5.zip", - :version "Pawn-2.4.5.zip"} - {:download-url "https://edge.forgecdn.net/files/3100/42/Pawn-2.4.0.zip", - :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.0] Pawn-2.4.0.zip", - :version "Pawn-2.4.0.zip"}] - expected (concat [(first given)] (rest (rest given)))] - (is (= expected (curseforge-api/prune-leading-duplicates given))))) - - (testing "single release isn't modified" - (let [given [{:download-url "https://edge.forgecdn.net/files/3104/62/Pawn-2.4.5.zip", - :game-track :retail, - :interface-version 90000, - :release-label "[WoW 9.0.1] Pawn-2.4.5.zip", - :version "2.4.5"}] - expected given] - (is (= expected (curseforge-api/prune-leading-duplicates given))))) - - (testing "empty/nil releases return nil" - (let [cases [[[] nil] - [nil nil]]] - (doseq [[given expected] cases] - (is (= expected (curseforge-api/prune-leading-duplicates given))))))) - -(deftest game-version-flavor-to-game-track - (let [cases [["wow_classic" :classic] - ["wow_burning_crusade" :classic-tbc] - ["wow_retail" :retail] - ["foo" :retail] - [nil :retail]]] - (doseq [[given expected] cases] - (is (= expected (curseforge-api/game-version-flavor-to-game-track given)))))) + [curseforge-api :as curseforge-api]])) (deftest parse-user-string (let [cases [["https://www.curseforge.com/wow/addons/deadly-boss-mods" diff --git a/test/strongbox/github_api_test.clj b/test/strongbox/github_api_test.clj index 1a668036..759b24c4 100644 --- a/test/strongbox/github_api_test.clj +++ b/test/strongbox/github_api_test.clj @@ -193,7 +193,10 @@ [{:interface constants/default-interface-version} [:retail]] [{:interface constants/default-interface-version :#interface constants/default-interface-version-classic} [:retail :classic]] - [{:interface 20501 :#interface 90000} [:retail :classic-tbc]]]] + [{:interface 20501 :#interface 90000} [:classic-tbc :retail]] + + ;; ordering is regular `:interface` first, templated `:#interface` second + [{:#interface 20501 :interface 90000} [:retail :classic-tbc]]]] (doseq [[given expected] cases] (is (= expected (github-api/-find-gametracks-toc-data given))))))) diff --git a/test/strongbox/jfx_test.clj b/test/strongbox/jfx_test.clj index cc8ce0d2..626ad683 100644 --- a/test/strongbox/jfx_test.clj +++ b/test/strongbox/jfx_test.clj @@ -184,3 +184,16 @@ Supports Last updated ()"] (is (= expected (jfx/addon-as-text-for-catalogue given)))))) + +(deftest addon-game-version-list-string + (let [cases [[nil nil] + [{} nil] + [{:interface-version-list []} ""] + [{:interface-version-list [1]} ""] + [{:interface-version-list [10000]} "1.0.0"] + [{:interface-version-list [10000, 100000]} "1.0.0 | 10.0.0"] + [{:interface-version-list [10000, 100000 110000]} "1.0.0 | 10.0.0 | 11.0.0"] + ;; duplicates are removed (11000 => 1.0.0) + [{:interface-version-list [10000, 11000]} "1.0.0"]]] + (doseq [[given expected] cases] + (is (= expected (jfx/addon-game-version-list-string given)))))) diff --git a/test/strongbox/test_helper.clj b/test/strongbox/test_helper.clj index fe47e23b..e21de419 100644 --- a/test/strongbox/test_helper.clj +++ b/test/strongbox/test_helper.clj @@ -72,9 +72,9 @@ :description "Does what no other addon does, slightly differently" :dirname "EveryAddon", :label "EveryAddon 1.2.3", - :interface-version 70000, + :interface-version-list [70000], :installed-version "1.2.3" - :toc/game-track :retail + :-toc/game-track-list [:retail] :supported-game-tracks [:retail]}) (def nfo-data @@ -109,7 +109,7 @@ (def source-updates "updates to the addon data fetched from remote source" - {:interface-version 70000, + {:interface-version-list [70000], :download-url "https://www.example.org/wow/addons/everyaddon/download/123456/file", :version "1.2.3" :game-track :retail}) @@ -237,11 +237,19 @@ (fn [string] (clojure.string/join "" (map clojure.string/capitalize (clojure.string/split string #"-")))) + interface-value-list-formatter + (fn [vs] + (clojure.string/join ", " vs)) + + format-map {:interface interface-value-list-formatter} + render-line (fn [[key val]] - (format "## %s: %s" (unslug (name key)) val)) + (format "## %s: %s" + (unslug (name key)) + ((get format-map key identity) val))) - rename-map {:interface-version :interface + rename-map {:interface-version-list :interface :label :title :installed-version :version} toc (clojure.set/rename-keys addon rename-map) @@ -269,7 +277,7 @@ nom (get override :label "EveryAddon") version (get override :version "1.2.3") description (get override :description "Does what no other addon does, slightly differently.") - interface-version (get override :interface-version 70000) + interface-version-list (get override :interface-version-list [70000]) source "wowinterface" source-id (get override :source-id "999") @@ -297,7 +305,7 @@ :version version :description description :dirname dirname - :interface-version interface-version + :interface-version-list interface-version-list :installed-version version :supported-game-tracks [game-track]} @@ -379,5 +387,3 @@ "convenience. just like `gen-addon`, but also writes the generated zip file to the given `output-dir`." [output-dir & [opts]] (mk-addon! output-dir (gen-addon-data opts))) - -;; diff --git a/test/strongbox/toc_test.clj b/test/strongbox/toc_test.clj index fa686abd..a78c60f1 100644 --- a/test/strongbox/toc_test.clj +++ b/test/strongbox/toc_test.clj @@ -90,9 +90,9 @@ SomeAddon.lua") :dirsize 0 :label "Addon Name" :description "Description of the addon here" - :interface-version 80205 - :-toc/game-track :retail - :supported-game-tracks [:retail] + :interface-version-list [80205 11302] + :-toc/game-track-list [:retail :classic] + :supported-game-tracks [:classic :retail] :installed-version "1.6.1" :source "wowinterface" :source-id 12345 @@ -108,8 +108,8 @@ SomeAddon.lua") :dirname "EveryAddon" :label "EveryAddon *" :description nil - :interface-version constants/default-interface-version - :-toc/game-track :retail + :interface-version-list [constants/default-interface-version] + :-toc/game-track-list [:retail] :supported-game-tracks [:retail] :installed-version nil} @@ -119,9 +119,9 @@ SomeAddon.lua") ;; classic interface version gets a :classic game-track [{:interface constants/default-interface-version-classic} - (merge base-case {:interface-version constants/default-interface-version-classic + (merge base-case {:interface-version-list [constants/default-interface-version-classic] :supported-game-tracks [:classic] - :-toc/game-track :classic})] + :-toc/game-track-list [:classic]})] ;; addon is in development [{:version "@project-version@"} (merge base-case @@ -138,9 +138,9 @@ SomeAddon.lua") defaults {:dirname "dirname" :description nil :installed-version nil - :interface-version constants/default-interface-version + :interface-version-list [constants/default-interface-version] :supported-game-tracks [:retail] - :-toc/game-track :retail} + :-toc/game-track-list [:retail]} cases [;; wowinterface [{:x-wowi-id "123"} {:label "dirname *" :name "dirname" :source "wowinterface" :source-id 123 @@ -208,6 +208,27 @@ SomeAddon.lua") :let [expected (merge expected defaults)]] (is (= expected (toc/parse-addon-toc given addon-dir))))))) +(deftest parse-addon-toc--duplicate-interface-versions-removed + (let [case {:interface 10000 :#interface 10000} + expected [10000] + use-defaults false] + (is (= expected (:interface-version-list (toc/-parse-addon-toc case use-defaults)))))) + +(deftest parse-addon-toc--use-defaults + (testing "with-defaults true" + (let [case {:title nil + :interface nil} + expected {:label " *" + :interface-version-list [constants/default-interface-version]}] + (is (= expected (select-keys (toc/-parse-addon-toc case true) [:label :interface-version-list]))))) + + (testing "with-defaults false" + (let [case {:title nil + :interface nil} + expected {:label nil + :interface-version-list []}] + (is (= expected (select-keys (toc/-parse-addon-toc case false) [:label :interface-version-list])))))) + (deftest rm-trailing-version (testing "parsing of 'Title' attribute in toc file" (let [cases [["Grid" "Grid"] ;; no trailing version? no problems @@ -259,3 +280,52 @@ SomeAddon.lua") (let [fixture (helper/fixture-path "questie--invalid.toc") raw-data (toc/read-toc-file fixture)] (is (nil? (toc/parse-addon-toc raw-data)))))) + +(deftest parse-addon-toc--multiple-interface-versions + (testing "multiple interface versions are supported" + (let [fixture {:title "foo" + :label "Foo" + :description "Foo Bar" + :dirname "Baz" + :interface "100206, 40400, 11502" + :installed-version "1.2.3" + :supported-game-tracks []} + + expected {:description "Foo Bar", + :dirname "Baz", + :installed-version nil, + :interface-version-list [100206 40400 11502], + :label "foo", + :name "foo", + :supported-game-tracks [:retail :classic-cata :classic], + :-toc/game-track-list [:retail :classic-cata :classic]}] + (is (= expected (toc/parse-addon-toc fixture)))))) + +(deftest parse-interface-value + (testing "interface values can be parsed into a set of game tracks" + (let [cases [[nil []] + + ;; --- + + ["", []] + ["asdf", []] + ["1", [1]] + ["1,2", [1,2]] + ["1, 2", [1,2]] + ["1,2, 3", [1,2,3]] + ["1,2,3,", [1,2,3]] + [",1,2,3,", [1,2,3]] + ["100206, 40400, 11502", [100206, 40400, 11502]] + + ;; integers are used by tests but not encouraged. + [0, [0]] + [1, [1]] + [100206, [100206]] + + ;; dupes + ["1,1", [1]], + ["1, 1, 1", [1]], + ["1,1,2,2,3", [1,2,3]]]] + + (doseq [[given expected] cases] + (is (= expected (toc/parse-interface-value given))))))) diff --git a/test/strongbox/tukui_api_test.clj b/test/strongbox/tukui_api_test.clj index dba27c5e..838d4ae5 100644 --- a/test/strongbox/tukui_api_test.clj +++ b/test/strongbox/tukui_api_test.clj @@ -1,115 +1,8 @@ (ns strongbox.tukui-api-test (:require [clojure.test :refer [deftest testing is use-fixtures]] - [clj-http.fake :refer [with-fake-routes-in-isolation]] - ;;[taoensso.timbre :as log :refer [debug info warn error spy]] [strongbox - [tukui-api :as tukui-api] - [test-helper :as helper :refer [fixture-path]]])) - -(deftest expand-summaries - (testing "expanding regular addon" - (let [fixture (slurp (fixture-path "tukui--addon-details.json")) - - source-id 98 - game-track :retail - - fake-routes {(format tukui-api/summary-list-url source-id) - {:get (fn [req] {:status 200 :body fixture})}} - - addon-summary {:description "Add roleplaying fields to ElvUI to create RP UIs.", - :tag-list [:roleplay], - :game-track-list [:retail], - :updated-date "2019-07-29T20:48:25Z", - :name "-rp-tags", - :source "tukui", - :label "[rp:tags]", - :download-count 2838, - :source-id source-id, - :url "https://www.tukui.org/addons.php?id=98"} - - expected [{:download-url "https://www.tukui.org/addons.php?download=98" - :version "0.960" - :interface-version 80200 - :game-track game-track}]] - - (with-fake-routes-in-isolation fake-routes - (is (= expected (tukui-api/expand-summary addon-summary game-track)))))) - - (testing "expanding addon proper" - (let [fixture (slurp (fixture-path "tukui--elvui-addon-proper.json")) - - fake-routes {"https://www.tukui.org/api.php?ui=elvui" - {:get (fn [req] {:status 200 :body fixture})}} - - game-track :retail - - addon-summary {:description "A user interface designed around user-friendliness with extra features that are not included in the standard ui", - :tag-list [:ui] - :game-track-list [:classic :retail], - :updated-date "2019-12-05T00:00:00Z", - :name "elvui", - :source "tukui", - :label "ElvUI", - :download-count 2147483000, - :source-id -2, - :url "https://www.tukui.org/download.php?ui=elvui"} - - expected [{:download-url "https://www.tukui.org/downloads/elvui-11.26.zip" - :version "11.26" - :interface-version 80200 - :game-track game-track}]] - (with-fake-routes-in-isolation fake-routes - (is (= expected (tukui-api/expand-summary addon-summary game-track))))))) - -(deftest download-addon-404 - (testing "regular addon fetch that yields a 404 returns nil" - (let [addon-summary {:description "A user interface designed around user-friendliness with extra features that are not included in the standard ui", - :tag-list [:ui] - :game-track-list [:classic :retail], - :updated-date "2019-12-05T00:00:00Z", - :name "elvui", - :source "tukui", - :label "ElvUI", - :download-count 2147483000, - :source-id -2, - :url "https://www.tukui.org/download.php?ui=elvui"} - - game-track :retail - - fake-routes {"https://www.tukui.org/api.php?ui=elvui" - {:get (fn [req] {:status 404 :reason-phrase "Not Found" :body "

Not Found

"})}}] - (with-fake-routes-in-isolation fake-routes - (is (nil? (tukui-api/expand-summary addon-summary game-track))))))) - -(deftest expanding-addon--missing-patch - (testing "2020-11-21 the tukui addon proper was found to be missing it's `:patch` key resulting in a NPE attempting to convert it to game version" - (let [fixture (slurp (fixture-path "tukui--addon-details-missing-patch.json")) - - source-id 98 - - game-track :retail - - fake-routes {(format tukui-api/summary-list-url source-id) - {:get (fn [req] {:status 200 :body fixture})}} - - addon-summary {:description "Add roleplaying fields to ElvUI to create RP UIs.", - :tag-list [:roleplay], - :game-track-list [:retail], - :updated-date "2019-07-29T20:48:25Z", - :name "-rp-tags", - :source "tukui", - :label "[rp:tags]", - :download-count 2838, - :source-id source-id, - :url "https://www.tukui.org/addons.php?id=98"} - - expected [{:download-url "https://www.tukui.org/addons.php?download=98" - ;; :interface-version ... ;; elided - :version "0.960" - :game-track game-track}]] - (with-fake-routes-in-isolation fake-routes - (is (= expected (tukui-api/expand-summary addon-summary game-track))))))) + [tukui-api :as tukui-api]])) (deftest parse-user-string (let [cases [;; retail @@ -143,32 +36,32 @@ (deftest make-url (let [cases [;; retail tukui addon - [{:name "foo" :source-id 123 :interface-version 90000} "https://www.tukui.org/addons.php?id=123"] + [{:name "foo" :source-id 123 :interface-version-list [90000]} "https://www.tukui.org/addons.php?id=123"] ;; classic tukui addon - [{:name "foo" :source-id 123 :interface-version 10000} "https://www.tukui.org/classic-addons.php?id=123"] + [{:name "foo" :source-id 123 :interface-version-list [10000]} "https://www.tukui.org/classic-addons.php?id=123"] ;; classic-tbc tukui addon - [{:name "foo" :source-id 123 :interface-version 20000} "https://www.tukui.org/classic-tbc-addons.php?id=123"] + [{:name "foo" :source-id 123 :interface-version-list [20000]} "https://www.tukui.org/classic-tbc-addons.php?id=123"] ;; tukui retail proper url - [{:name "tukui" :source-id -1 :interface-version 90000} "https://www.tukui.org/download.php?ui=tukui"] + [{:name "tukui" :source-id -1 :interface-version-list [90000]} "https://www.tukui.org/download.php?ui=tukui"] ;; elvui retail proper url - [{:name "elvui" :source-id -2 :interface-version 90000} "https://www.tukui.org/download.php?ui=elvui"] + [{:name "elvui" :source-id -2 :interface-version-list [90000]} "https://www.tukui.org/download.php?ui=elvui"] ;; tukui classic url - [{:name "tukui" :source-id 1 :interface-version 10000} "https://www.tukui.org/classic-addons.php?id=1"] + [{:name "tukui" :source-id 1 :interface-version-list [10000]} "https://www.tukui.org/classic-addons.php?id=1"] ;; elvui classic url - [{:name "tukui" :source-id 2 :interface-version 10000} "https://www.tukui.org/classic-addons.php?id=2"] + [{:name "tukui" :source-id 2 :interface-version-list [10000]} "https://www.tukui.org/classic-addons.php?id=2"] ;; ..etc ;; dodgy url - [{:name "foo" :source-id -99 :interface-version 90000} "https://www.tukui.org/download.php?ui=foo"] - [{:source-id 1 :interface-version 10000} "https://www.tukui.org/classic-addons.php?id=1"] + [{:name "foo" :source-id -99 :interface-version-list [90000]} "https://www.tukui.org/download.php?ui=foo"] + [{:source-id 1 :interface-version-list [10000]} "https://www.tukui.org/classic-addons.php?id=1"] ;; bad urls [{} nil] [{:source-id 1} nil] - [{:source-id -1 :interface-version 90000} nil]]] + [{:source-id -1 :interface-version-list [90000]} nil]]] (doseq [[given expected] cases] (is (= expected (tukui-api/make-url given)), (str "failed on given: " given))))) diff --git a/test/strongbox/utils_test.clj b/test/strongbox/utils_test.clj index c6d4f7d5..3361d87a 100644 --- a/test/strongbox/utils_test.clj +++ b/test/strongbox/utils_test.clj @@ -38,12 +38,13 @@ "10000" "1.0.0" ;; first release "20001" "2.0.1" ;; Burning Crusade, Before The Storm "30002" "3.0.2" ;; WotLK, Echos of Doom - "30008a" "3.0.8a" ;; 'a' ?? supported, but eh ... + ;;"30008a" "3.0.8a" ;; 'a' ?? supported, but eh ... ;; 2024-07-14: case no longer supported ;; six digit cases "100000" "10.0.0" "100002" "10.0.2" "100102" "10.1.2" ;; just guessing + "110000" "11.0.0" "200102" "20.1.2" "300102" "30.1.2" ;; first three digits are now the major, second two minor and remaining is patch (I think ...) @@ -307,6 +308,7 @@ ;; ...etc ["9.0.1" :retail] ["10.0.2" :retail] + ["11.0.0" :retail] [constants/latest-retail-game-version :retail]]] (doseq [[given expected] cases] @@ -618,7 +620,8 @@ (let [cases [["" nil] ["foo" nil] ["a.b" nil] - ["1.2" "World of Warcraft: Mysteries of Maraudon"]]] + ["1.2" "World of Warcraft: Mysteries of Maraudon"] + ["10.2.7" "Dragonflight: Dark Heart"]]] (doseq [[given expected] cases] (is (= expected (utils/patch-name given)))))) @@ -713,3 +716,52 @@ [false "False"]]] (doseq [[given expected] cases] (is (= expected (utils/pretty-print-value given)))))) + +(deftest to-int + (let [cases [[nil nil] + [{} nil] + ["asdf" nil] + ["" nil] + ["1" 1] + ["1,2,3", nil] + ["1, 2, 3", nil]]] + (doseq [[given expected] cases] + (is (= expected (utils/to-int given)))))) + +(deftest group-by-coll + (let [given [{:key "aaa" :foo [:a :b]} + {:key "bbb" :foo [:b :c]}] + + ;; one entry for :a, grouped on :foo = :a + ;; two entries for :b, grouped on :foo = :b + ;; one entry for :c, grouped on :foo = :c + expected {:a [{:key "aaa" :foo :a}] + :b [{:key "aaa" :foo :b} + {:key "bbb" :foo :b}] + :c [{:key "bbb" :foo :c}]}] + + (is (= expected (utils/group-by-coll :foo given))))) + +(deftest group-by-coll--game-tracks + (let [given [{:version "1.2.3" :-toc/game-track-list [:classic :retail]} + {:version "3.2.1" :-toc/game-track-list [:retail]}] + + expected {:retail [{:version "1.2.3" :-toc/game-track-list :retail} + {:version "3.2.1" :-toc/game-track-list :retail}] + :classic [{:version "1.2.3" :-toc/game-track-list :classic}]}] + (is (= expected (utils/group-by-coll :-toc/game-track-list given))))) + +(deftest group-by-coll--empty + (let [cases [[nil {}] + [[] {}] + ['() {}] + [{} {}] + ["foo" {}] + [[[]] {}] + [[{}] {}] + [{:foo "bar"} {}] + [[{:foo "bar"}] {\a [{:foo \a}], \b [{:foo \b}], \r [{:foo \r}]}] + [[{:foo ["bar"]}] {"bar" [{:foo "bar"}]}]]] + + (doseq [[given expected] cases] + (is (= expected (utils/group-by-coll :foo given))))))