Add requirements to db write
This commit is contained in:
		| @@ -204,6 +204,37 @@ class Item: | |||||||
|         base = lookup_basetype(self.code) |         base = lookup_basetype(self.code) | ||||||
|         return base["width"], base["height"] |         return base["width"], base["height"] | ||||||
|  |  | ||||||
|  |     def requirements(self) -> dict: | ||||||
|  |         base = lookup_basetype(self.code) | ||||||
|  |         # TODO: How is class requirements determined on basetypes? | ||||||
|  |         reqs = { | ||||||
|  |             "lvl": base["req_lvl"], | ||||||
|  |             "dex": base["req_dex"], | ||||||
|  |             "str": base["req_str"], | ||||||
|  |             "class": None, | ||||||
|  |         } | ||||||
|  |         # TODO: Can implicit mod end up increasing requirements? | ||||||
|  |         if self.quality == Quality.UNIQUE: | ||||||
|  |             reqs["lvl"] = lookup_unique(self.unique_id)["req_lvl"] | ||||||
|  |         elif self.quality == Quality.SET: | ||||||
|  |             reqs["lvl"] = lookup_set_item(self.set_id)["req_lvl"] | ||||||
|  |         elif self.is_runeword: | ||||||
|  |             # TODO: What affects runeword level? Only the sockets? | ||||||
|  |             pass | ||||||
|  |         elif self.quality in [Quality.MAGIC, Quality.RARE, Quality.CRAFTED]: | ||||||
|  |             for m, id in [("suffixes", id) for id in self.suffixes] + [ | ||||||
|  |                 ("prefixes", id) for id in self.prefixes | ||||||
|  |             ]: | ||||||
|  |                 affix = lookup_affix(id, m) | ||||||
|  |                 reqs["lvl"] = max(reqs["lvl"], affix["req_lvl"]) | ||||||
|  |                 if affix["req_class"]: | ||||||
|  |                     reqs["class"] = affix["req_class"] | ||||||
|  |         if self.sockets: | ||||||
|  |             for socket in self.sockets: | ||||||
|  |                 socket_reqs = socket.requirements() | ||||||
|  |                 reqs["lvl"] = max(reqs["lvl"], socket_reqs["lvl"]) | ||||||
|  |         return reqs | ||||||
|  |  | ||||||
|     def write_to_db(self, socketed_into=None, commit=True) -> int: |     def write_to_db(self, socketed_into=None, commit=True) -> int: | ||||||
|         name = lookup_basetype(self.code)["name"] |         name = lookup_basetype(self.code)["name"] | ||||||
|         # FIXME: handle magic & rare names |         # FIXME: handle magic & rare names | ||||||
| @@ -218,13 +249,14 @@ class Item: | |||||||
|             lookup_set_item(self.set_id)["set"] if self.quality == Quality.SET else None |             lookup_set_item(self.set_id)["set"] if self.quality == Quality.SET else None | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  |         req = self.requirements() | ||||||
|         db = get_db() |         db = get_db() | ||||||
|         cur = db.cursor() |         cur = db.cursor() | ||||||
|         cur.execute( |         cur.execute( | ||||||
|             """INSERT INTO item (itembase_name, socketed_into, raw_data, raw_version, |             """INSERT INTO item (itembase_name, socketed_into, raw_data, raw_version, | ||||||
|             is_identified, is_socketed, is_beginner, is_simple, is_ethereal, |             is_identified, is_socketed, is_beginner, is_simple, is_ethereal, | ||||||
|             is_personalized, is_runeword, code) |             is_personalized, is_runeword, code, req_lvl) | ||||||
|             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", |             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", | ||||||
|             ( |             ( | ||||||
|                 lookup_basetype(self.code)["name"], |                 lookup_basetype(self.code)["name"], | ||||||
|                 socketed_into, |                 socketed_into, | ||||||
| @@ -238,38 +270,44 @@ class Item: | |||||||
|                 self.is_personalized, |                 self.is_personalized, | ||||||
|                 self.is_runeword, |                 self.is_runeword, | ||||||
|                 self.code, |                 self.code, | ||||||
|  |                 req["lvl"], | ||||||
|             ), |             ), | ||||||
|         ) |         ) | ||||||
|         item_id = cur.lastrowid |         item_id = cur.lastrowid | ||||||
|  |  | ||||||
|         cur.execute( |         if not self.is_simple: | ||||||
|             """INSERT INTO item_extra (item_id, item_name, |             cur.execute( | ||||||
|             set_name, uid, lvl, quality, graphic, implicit, low_quality, set_id, |                 """INSERT INTO item_extra (item_id, item_name, | ||||||
|             unique_id, nameword1, nameword2, runeword_id, personal_name, |                 set_name, uid, lvl, quality, graphic, implicit, low_quality, set_id, | ||||||
|             defense, durability, max_durability, quantity) |                 unique_id, nameword1, nameword2, runeword_id, personal_name, | ||||||
|             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", |                 defense, durability, max_durability, quantity, req_str, req_dex, | ||||||
|             ( |                 req_class) | ||||||
|                 item_id, |                 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", | ||||||
|                 name, |                 ( | ||||||
|                 set_name, |                     item_id, | ||||||
|                 self.uid, |                     name, | ||||||
|                 self.lvl, |                     set_name, | ||||||
|                 int(self.quality) if self.quality else None, |                     self.uid, | ||||||
|                 self.graphic, |                     self.lvl, | ||||||
|                 self.implicit, |                     int(self.quality) if self.quality else None, | ||||||
|                 int(self.low_quality) if self.low_quality else None, |                     self.graphic, | ||||||
|                 self.set_id, |                     self.implicit, | ||||||
|                 self.unique_id, |                     int(self.low_quality) if self.low_quality else None, | ||||||
|                 self.nameword1, |                     self.set_id, | ||||||
|                 self.nameword2, |                     self.unique_id, | ||||||
|                 self.runeword_id, |                     self.nameword1, | ||||||
|                 self.personal_name, |                     self.nameword2, | ||||||
|                 self.defense, |                     self.runeword_id, | ||||||
|                 self.durability, |                     self.personal_name, | ||||||
|                 self.max_durability, |                     self.defense, | ||||||
|                 self.quantity, |                     self.durability, | ||||||
|             ), |                     self.max_durability, | ||||||
|         ) |                     self.quantity, | ||||||
|  |                     req["str"], | ||||||
|  |                     req["dex"], | ||||||
|  |                     req["class"], | ||||||
|  |                 ), | ||||||
|  |             ) | ||||||
|  |  | ||||||
|         if self.quality in [Quality.MAGIC, Quality.RARE, Quality.CRAFTED]: |         if self.quality in [Quality.MAGIC, Quality.RARE, Quality.CRAFTED]: | ||||||
|             for prefix, id in [(False, id) for id in self.suffixes] + [ |             for prefix, id in [(False, id) for id in self.suffixes] + [ | ||||||
| @@ -313,7 +351,7 @@ class Item: | |||||||
|             uid, lvl, quality, graphic, implicit, low_quality, set_id, unique_id, |             uid, lvl, quality, graphic, implicit, low_quality, set_id, unique_id, | ||||||
|             nameword1, nameword2, runeword_id, personal_name, defense, durability, |             nameword1, nameword2, runeword_id, personal_name, defense, durability, | ||||||
|             max_durability, quantity |             max_durability, quantity | ||||||
|             FROM item INNER JOIN item_extra ON id = item_id WHERE id = ?""", |             FROM item LEFT JOIN item_extra ON id = item_id WHERE id = ?""", | ||||||
|             (id,), |             (id,), | ||||||
|         ).fetchone() |         ).fetchone() | ||||||
|         if row["raw_version"] != STASH_TAB_VERSION: |         if row["raw_version"] != STASH_TAB_VERSION: | ||||||
| @@ -431,3 +469,11 @@ def lookup_runeword(id: int) -> dict: | |||||||
|         with open(os.path.join(_data_path, "runewords.json")) as f: |         with open(os.path.join(_data_path, "runewords.json")) as f: | ||||||
|             _runeword_map = json.load(f) |             _runeword_map = json.load(f) | ||||||
|     return _runeword_map[str(id)] |     return _runeword_map[str(id)] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def lookup_affix(id: int, prefix: bool) -> dict: | ||||||
|  |     global _affix_map | ||||||
|  |     if _affix_map is None: | ||||||
|  |         with open(os.path.join(_data_path, "affixes.json")) as f: | ||||||
|  |             _affix_map = json.load(f) | ||||||
|  |     return _affix_map["prefixes" if prefix else "suffixes"][str(id)] | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ CREATE TABLE item ( | |||||||
|     --        items have two names: the base name and item_extra.item_name. |     --        items have two names: the base name and item_extra.item_name. | ||||||
|     itembase_name TEXT NOT NULL, |     itembase_name TEXT NOT NULL, | ||||||
|     socketed_into INTEGER DEFAULT NULL, |     socketed_into INTEGER DEFAULT NULL, | ||||||
|  |     req_lvl INTEGER DEFAULT 0, | ||||||
|  |  | ||||||
|     -- The following fields match the fields of the item object in item.py |     -- The following fields match the fields of the item object in item.py | ||||||
|     raw_data BLOB NOT NULL, |     raw_data BLOB NOT NULL, | ||||||
| @@ -38,6 +39,9 @@ CREATE TABLE item_extra ( | |||||||
|     item_id INTEGER PRIMARY KEY, |     item_id INTEGER PRIMARY KEY, | ||||||
|     item_name TEXT DEFAULT NULL, |     item_name TEXT DEFAULT NULL, | ||||||
|     set_name TEXT DEFAULT NULL, |     set_name TEXT DEFAULT NULL, | ||||||
|  |     req_str INTEGER DEFAULT 0, | ||||||
|  |     req_dex INTEGER DEFAULT 0, | ||||||
|  |     req_class TEXT DEFAULT NULL, | ||||||
|  |  | ||||||
|     -- The following fields match the fields of the item object in item.py |     -- The following fields match the fields of the item object in item.py | ||||||
|     uid INTEGER DEFAULT NULL, |     uid INTEGER DEFAULT NULL, | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ import os | |||||||
| import tempfile | import tempfile | ||||||
| import unittest | import unittest | ||||||
|  |  | ||||||
| from d2warehouse.db import close_db, create_db, set_db_path | from d2warehouse.db import close_db, create_db, get_db, set_db_path | ||||||
| from d2warehouse.item import Item | from d2warehouse.item import Item | ||||||
| from d2warehouse.parser import parse_item | from d2warehouse.parser import parse_item | ||||||
|  |  | ||||||
| @@ -29,3 +29,14 @@ class DbTest(unittest.TestCase): | |||||||
|         db_id = item.write_to_db() |         db_id = item.write_to_db() | ||||||
|         loaded_item = Item.load_from_db(db_id) |         loaded_item = Item.load_from_db(db_id) | ||||||
|         self.assertEqual(item, loaded_item) |         self.assertEqual(item, loaded_item) | ||||||
|  |  | ||||||
|  |         # Check that requirement was written properly | ||||||
|  |         db = get_db() | ||||||
|  |         reqs = db.execute( | ||||||
|  |             "SELECT req_lvl, req_str, req_dex, req_class FROM item JOIN item_extra ON id = item_id WHERE id = 1" | ||||||
|  |         ).fetchone() | ||||||
|  |         expected_reqs = item.requirements() | ||||||
|  |         self.assertEqual(reqs["req_lvl"], expected_reqs["lvl"]) | ||||||
|  |         self.assertEqual(reqs["req_str"], expected_reqs["str"]) | ||||||
|  |         self.assertEqual(reqs["req_dex"], expected_reqs["dex"]) | ||||||
|  |         self.assertEqual(reqs["req_class"], expected_reqs["class"]) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user