Commit Graph

3042 Commits

Author SHA1 Message Date
Claudio Ortolina 28fb570c65 Update dependencies
live_debugger 0.7.0 => 0.8.0 (minor)
2026-04-21 15:18:23 +01:00
Claudio Ortolina 9eece7e861 Add litestream-based backup script 2026-04-21 14:47:29 +01:00
Claudio Ortolina f81d756e3e Improve backup script
- Add confirmation
- Makes backup atomic
- Sortable names
2026-04-21 14:46:24 +01:00
Claudio Ortolina 9e1b66a535 Update erlang to 28.4.3 2026-04-21 14:28:14 +01:00
Claudio Ortolina 016c4691be Canonicalize tailwind classes 2026-04-21 14:22:41 +01:00
Claudio Ortolina 007f59b0c3 Update tailwind from 4.2.3 to 4.2.4 2026-04-21 14:16:46 +01:00
Claudio Ortolina dd1d99a145 Fix store_embedding/3 spec to reflect float list input 2026-04-21 12:57:28 +01:00
Claudio Ortolina 30c0a961e9 Stringify format atom in get_release_status query 2026-04-21 12:57:09 +01:00
Claudio Ortolina d22ed5e7a1 Disable dialyzer opaque checks 2026-04-21 12:53:35 +01:00
Claudio Ortolina 87522a6551 Fully qualify nested type refs in MusicBrainz.Release 2026-04-21 12:48:55 +01:00
Claudio Ortolina c7749924fe Spec release component private helpers 2026-04-21 12:48:36 +01:00
Claudio Ortolina 563135fcea Remove dead nil fallback on play_count 2026-04-21 12:48:17 +01:00
Claudio Ortolina 9840690af1 Fix nil-index crash in move_record_in_set 2026-04-21 12:47:57 +01:00
Claudio Ortolina 53348a328e Relax ScrobbleRule.t to allow unpersisted structs 2026-04-21 12:47:38 +01:00
Claudio Ortolina 87d2a8f186 Fix Maintenance vacuum/optimize return specs 2026-04-21 12:47:18 +01:00
Claudio Ortolina 40ac5bdc99 Widen Transform.new/1 spec to accept keyword list 2026-04-21 12:47:00 +01:00
Claudio Ortolina 29bfa20978 Remove unreachable error clauses in form save helpers 2026-04-21 12:46:35 +01:00
Claudio Ortolina a93ef6d076 Install and configure dialyzer 2026-04-21 12:27:27 +01:00
Claudio Ortolina ed4e92b1a7 Cover Ignore a few other modules 2026-04-20 23:00:44 +01:00
Claudio Ortolina 56983c3e2c Update tailwind from 4.2.2 to 4.2.3 2026-04-20 22:47:38 +01:00
Claudio Ortolina dc71b2ff90 Fix badge align issue in barcode scan cart 2026-04-20 16:04:20 +01:00
Claudio Ortolina 8d004d39cc Extract shared cart sidebar component 2026-04-20 15:57:44 +01:00
Claudio Ortolina 9851a5c6bf Use cart with barcode scanner 2026-04-20 15:46:40 +01:00
Claudio Ortolina d47df899b7 Improve layout of add record form
Remove results count (I never looked at it)
2026-04-20 15:31:14 +01:00
Claudio Ortolina fd93aaed30 Update architecture docs 2026-04-20 15:15:29 +01:00
Claudio Ortolina 7ad094d537 Complete ML-143 2026-04-20 15:15:29 +01:00
Claudio Ortolina eaece07193 Count formats in results 2026-04-20 15:15:29 +01:00
Claudio Ortolina c4ebe636ff Fix ML-143 review: security, worker, and test improvements
Closes ML-143 review findings:
- cast_id/1 uses Integer.parse instead of String.to_integer
- add_to_cart validates against server-side release_groups
- JS.push payload trimmed to {id, format} only
- Oban.insert_all result checked for partial failures
- handle_async success resets @importing? to false
- ImportFromMusicbrainzReleaseGroup gets unique constraint
- Record.parse_datetime/1 made public with safe match
- Workers delegate to Record.parse_datetime/1
- Test coverage: change_format, clear_cart, wishlist single import
2026-04-20 15:15:29 +01:00
Claudio Ortolina 3f5ce060b1 Implement ML-143: Cart-style multi record import
Closes ML-143.
2026-04-20 15:15:29 +01:00
Claudio Ortolina 0ae8e69fb9 Add ML-143: Cart-style multi record import 2026-04-20 11:02:51 +01:00
Claudio Ortolina 5c32016c39 Add ML-142: Improve scrobble UI in the Release component 2026-04-20 11:02:25 +01:00
Claudio Ortolina f3d103cf7f Add backlog section to summary task 2026-04-20 10:11:34 +01:00
Claudio Ortolina cbf29a22bc Allow backlog mcp commands 2026-04-20 10:07:35 +01:00
Claudio Ortolina f995e01ca7 Import issue history in backlog.md 2026-04-20 10:02:25 +01:00
Claudio Ortolina 78487b0085 Pin Wikipedia intro_html to fixture value
Map.has_key? verified the key existed but not the content. The
fixture is deterministic — assert the stored value equals
Wikipedia.Fixtures.article_extract_html/0.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina a6319d55df Pin artist_live/show image_data_hash assertions
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 07c99992a3 Pin barcode_scan release assertions
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 162c10e70a Pin fetch_artist_image asset lookup
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina bce8560ce8 Pin fetch_artist_info stored-data assertions
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 1f457f0f11 Pin prune_assets test to %Asset{hash: ^hash} match
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 8a6c688a56 Assert parsed audit JSON structure
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 0eabe4b3ab Assert import count > 0 in options-forwarding test
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 8ce5da65e2 Pin Brave search error body assertion
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina cedb86af5d Pin OpenAI API error assertions to their shapes
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 6adfbea336 Pin Records.populate_genres error to OpenAI prefix
Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 0ee0dcb118 Match decoded OpenAI error body, not raw JSON
Switch the 500-response stubs to Req.Test.json so Req decodes the
body, then match the map shape. Avoids coupling the assertion to
the exact JSON serialization.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina 1429f7a826 Drop tautological delete.id checks
Repo.delete always returns the struct it was given, so deleted.id
== original.id is trivially true. Thread deleted.id through the
trailing get_*! call instead, so the binding is load-bearing.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina bb260437a1 Pin populate_genres error to OpenAI prefix
Match the string prefix "OpenAI API error:" that propagates from
OpenAI.gpt on non-2xx responses.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina a841ccf8e8 Tighten generate_record_embedding assertions
Assert stored embedding text matches the representation helper.
Pin the OpenAI-500 error path to the raw JSON body string.

Refs #176
2026-04-20 06:50:04 +01:00
Claudio Ortolina bbe0d5cd9e Pin artist_refresh_discogs_data assertions
Bind the returned ArtistInfo. For the no-discogs branch, assert
discogs_data was not touched.

Refs #176
2026-04-20 06:50:04 +01:00