fix(sets): set number can now be alphanumerical

This commit is contained in:
2025-12-05 19:33:25 +01:00
parent 4d4a1aa9f9
commit 41e61a2f41
4 changed files with 76 additions and 21 deletions

View File

@@ -5,33 +5,29 @@ from .exceptions import ErrorException
def parse_set(set: str, /) -> str:
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 == '':
version = 1
version = '1'
# Version must be a positive integer
try:
number = int(number)
except Exception:
raise ErrorException('Number "{number}" is not a number'.format(
number=number,
))
try:
version = int(version)
version_int = int(version)
except Exception:
raise ErrorException('Version "{version}" is not a number'.format(
version=version,
))
# Make sure both are positive
if number < 0:
raise ErrorException('Number "{number}" should be positive'.format(
number=number,
))
if version < 0:
raise ErrorException('Version "{version}" should be positive'.format( # noqa: E501
if version_int < 0:
raise ErrorException('Version "{version}" should be positive'.format(
version=version,
))
return '{number}-{version}'.format(number=number, version=version)
return '{number}-{version}'.format(number=number, version=version_int)

View File

@@ -196,11 +196,12 @@ class RebrickableSet(BrickRecord):
@staticmethod
def from_rebrickable(data: dict[str, Any], /, **_) -> dict[str, Any]:
# Extracting version and number
# Note: number can be alphanumeric (e.g., "McDR6US", "COMCON035")
number, _, version = str(data['set_num']).partition('-')
return {
'set': str(data['set_num']),
'number': int(number),
'number': str(number), # Keep as string to support alphanumeric sets
'version': int(version),
'name': str(data['name']),
'year': int(data['year']),

View File

@@ -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;

View File

@@ -1,4 +1,4 @@
from typing import Final
__version__: Final[str] = '1.3.0'
__database_version__: Final[int] = 19
__database_version__: Final[int] = 20