fix(sets): set number can now be alphanumerical
This commit is contained in:
+15
-19
@@ -5,33 +5,29 @@ from .exceptions import ErrorException
|
|||||||
def parse_set(set: str, /) -> str:
|
def parse_set(set: str, /) -> str:
|
||||||
number, _, version = set.partition('-')
|
number, _, version = set.partition('-')
|
||||||
|
|
||||||
# Making sure both are integers
|
# Set number can be alphanumeric (e.g., "McDR6US", "10312", "COMCON035")
|
||||||
|
# Just validate it's not empty
|
||||||
|
if not number or number.strip() == '':
|
||||||
|
raise ErrorException('Set number cannot be empty')
|
||||||
|
|
||||||
|
# Clean up the number (trim whitespace)
|
||||||
|
number = number.strip()
|
||||||
|
|
||||||
|
# Version defaults to 1 if not provided
|
||||||
if version == '':
|
if version == '':
|
||||||
version = 1
|
version = '1'
|
||||||
|
|
||||||
|
# Version must be a positive integer
|
||||||
try:
|
try:
|
||||||
number = int(number)
|
version_int = int(version)
|
||||||
except Exception:
|
|
||||||
raise ErrorException('Number "{number}" is not a number'.format(
|
|
||||||
number=number,
|
|
||||||
))
|
|
||||||
|
|
||||||
try:
|
|
||||||
version = int(version)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
raise ErrorException('Version "{version}" is not a number'.format(
|
raise ErrorException('Version "{version}" is not a number'.format(
|
||||||
version=version,
|
version=version,
|
||||||
))
|
))
|
||||||
|
|
||||||
# Make sure both are positive
|
if version_int < 0:
|
||||||
if number < 0:
|
raise ErrorException('Version "{version}" should be positive'.format(
|
||||||
raise ErrorException('Number "{number}" should be positive'.format(
|
|
||||||
number=number,
|
|
||||||
))
|
|
||||||
|
|
||||||
if version < 0:
|
|
||||||
raise ErrorException('Version "{version}" should be positive'.format( # noqa: E501
|
|
||||||
version=version,
|
version=version,
|
||||||
))
|
))
|
||||||
|
|
||||||
return '{number}-{version}'.format(number=number, version=version)
|
return '{number}-{version}'.format(number=number, version=version_int)
|
||||||
|
|||||||
@@ -196,11 +196,12 @@ class RebrickableSet(BrickRecord):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def from_rebrickable(data: dict[str, Any], /, **_) -> dict[str, Any]:
|
def from_rebrickable(data: dict[str, Any], /, **_) -> dict[str, Any]:
|
||||||
# Extracting version and number
|
# Extracting version and number
|
||||||
|
# Note: number can be alphanumeric (e.g., "McDR6US", "COMCON035")
|
||||||
number, _, version = str(data['set_num']).partition('-')
|
number, _, version = str(data['set_num']).partition('-')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'set': str(data['set_num']),
|
'set': str(data['set_num']),
|
||||||
'number': int(number),
|
'number': str(number), # Keep as string to support alphanumeric sets
|
||||||
'version': int(version),
|
'version': int(version),
|
||||||
'name': str(data['name']),
|
'name': str(data['name']),
|
||||||
'year': int(data['year']),
|
'year': int(data['year']),
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
-- description: Change set number column from INTEGER to TEXT to support alphanumeric set numbers
|
||||||
|
|
||||||
|
-- Temporarily disable foreign key constraints for this migration
|
||||||
|
-- This is necessary because we're recreating a table that other tables reference
|
||||||
|
-- We verify integrity at the end to ensure safety
|
||||||
|
PRAGMA foreign_keys=OFF;
|
||||||
|
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
-- Create new table with TEXT number column
|
||||||
|
CREATE TABLE "rebrickable_sets_new" (
|
||||||
|
"set" TEXT NOT NULL,
|
||||||
|
"number" TEXT NOT NULL,
|
||||||
|
"version" INTEGER NOT NULL,
|
||||||
|
"name" TEXT NOT NULL,
|
||||||
|
"year" INTEGER NOT NULL,
|
||||||
|
"theme_id" INTEGER NOT NULL,
|
||||||
|
"number_of_parts" INTEGER NOT NULL,
|
||||||
|
"image" TEXT,
|
||||||
|
"url" TEXT,
|
||||||
|
"last_modified" TEXT,
|
||||||
|
PRIMARY KEY("set")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Copy all data from old table to new table
|
||||||
|
-- Cast INTEGER number to TEXT explicitly
|
||||||
|
INSERT INTO "rebrickable_sets_new"
|
||||||
|
SELECT
|
||||||
|
"set",
|
||||||
|
CAST("number" AS TEXT),
|
||||||
|
"version",
|
||||||
|
"name",
|
||||||
|
"year",
|
||||||
|
"theme_id",
|
||||||
|
"number_of_parts",
|
||||||
|
"image",
|
||||||
|
"url",
|
||||||
|
"last_modified"
|
||||||
|
FROM "rebrickable_sets";
|
||||||
|
|
||||||
|
-- Drop old table
|
||||||
|
DROP TABLE "rebrickable_sets";
|
||||||
|
|
||||||
|
-- Rename new table to original name
|
||||||
|
ALTER TABLE "rebrickable_sets_new" RENAME TO "rebrickable_sets";
|
||||||
|
|
||||||
|
-- Recreate the index
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_rebrickable_sets_number_version
|
||||||
|
ON rebrickable_sets(number, version);
|
||||||
|
|
||||||
|
-- Verify foreign key integrity before committing
|
||||||
|
-- This ensures we haven't broken any references
|
||||||
|
PRAGMA foreign_key_check;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
-- Re-enable foreign key constraints
|
||||||
|
PRAGMA foreign_keys=ON;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
from typing import Final
|
from typing import Final
|
||||||
|
|
||||||
__version__: Final[str] = '1.3.0'
|
__version__: Final[str] = '1.3.0'
|
||||||
__database_version__: Final[int] = 19
|
__database_version__: Final[int] = 20
|
||||||
|
|||||||
Reference in New Issue
Block a user