GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — feat(codegen)!: generate the data requests and their SpotifyApi methods from the spec by dargmuesli · Pull Request #487 · spotify-web-api-java/spotify-web-api-java

Conversation

@dargmuesli

@dargmuesli dargmuesli commented Nov 3, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

Step 5 of the plan in #461, for v11 on beta. It replaces the prototype in #486, which kept the 10.x API. Here the OpenAPI spec is the reference, and every place the generated API moves is recorded in MIGRATION.md. This branch is based on beta with main merged in, so the API-gate and ModelObjects work it builds on is already present; the diff is the codegen change only.

codegen/requests.yaml maps each of the 106 data request classes to its spec operationId in one line, with a handful of entries recording a deliberate departure from the spec: the eight typed search classes, top artists and tracks, the reorder/replace split of one operation, the recommendations method's arguments, and one model the spec doesn't have. codegen/generate.py renders every request class from spec/openapi.yaml: the verb, path, query, path and body parameters with their Java types and argument checks, the Javadoc and deprecation, and how the response is read, including paging and cursor paging. It also writes the SpotifyApi method that creates each request, between // <generated-…> markers. Two classes stay hand-written: GetUsersTopArtistsAndTracksRequest (generic over its item type) and AddCustomPlaylistCoverImageRequest (JPEG body). A new CI step regenerates the classes and fails when they differ from what's committed.

The generated API follows the spec. A SpotifyApi method takes the operation's required parameters, typed like their setters, and optional parameters go on the builder; the old varargs, String[] and JsonArray overloads are gone. Each setter has the wire name, so additionalTypes becomes additional_types, includeExternal becomes include_external, snapshotId becomes snapshot_id, and public becomes public_. A body array is a List<String> and a body object a Map<String, Object> instead of Gson JsonArray/JsonObject, which AbstractRequest serializes; an array of one-field objects such as [{"uri": …}] takes the field values and wraps them, so removePlaylistItems still takes plain URIs. If a parameter exists in both the query and the body, only the query one is offered, because Spotify ignores the body copy when both are sent. POST and PUT always send a JSON body, as before.

All the caller-facing changes are listed in MIGRATION.md, taken from japicmp's report against 10.1.0 (66 removed and 49 added signatures, 2 changed return types). GetSeveralAudiobooksRequest returns Audiobook[] and GetCategoryPlaylistsRequest returns FeaturedPlaylists, following the response schema. country, timestamp and album_type are removed because the spec no longer has them. Two fixes fall out of following the spec: GetRecentlyPlayedTracksRequest.after/before now send Unix milliseconds instead of a formatted date, and deprecation now matches the spec everywhere, so followPlaylist and saveTracksForCurrentUser are deprecated.

Verified locally: 420 tests pass, codegen/generate.py --check reports no drift, ci/check-docs.py checks all 115 examples, Javadoc passes doclint, and the examples module compiles.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@codecov

codecov Bot commented Nov 3, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 43.23040% with 239 lines in your changes missing coverage. Please review.
✅ Project coverage is 47.78%. Comparing base (8bb5196) to head (2df99e1).

Files with missing lines Patch % Lines
...equests/data/tracks/GetRecommendationsRequest.java 7.93% 109 Missing and 7 partials ⚠️
...ts/data/episodes/GetUsersSavedEpisodesRequest.java 44.44% 0 Missing and 5 partials ⚠️
...ata/search/simplified/SearchAudiobooksRequest.java 16.66% 3 Missing and 2 partials ⚠️
...simplified/special/SearchAlbumsSpecialRequest.java 16.66% 3 Missing and 2 partials ⚠️
...s/data/audiobooks/GetAudiobookChaptersRequest.java 0.00% 2 Missing and 2 partials ⚠️
.../UpdatePlaylistsItemsReorderDeprecatedRequest.java 33.33% 0 Missing and 4 partials ⚠️
.../playlists/UpdatePlaylistsItemsReorderRequest.java 33.33% 0 Missing and 4 partials ⚠️
...s/data/tracks/SaveTracksForCurrentUserRequest.java 42.85% 3 Missing and 1 partial ⚠️
...fy/requests/data/albums/GetAlbumTracksRequest.java 25.00% 0 Missing and 3 partials ⚠️
...requests/data/artists/GetArtistsAlbumsRequest.java 25.00% 0 Missing and 3 partials ⚠️
... and 40 more
Additional details and impacted files
@@             Coverage Diff              @@
##               beta     #487      +/-   ##
============================================
+ Coverage     47.39%   47.78%   +0.39%     
+ Complexity      725      721       -4     
============================================
  Files           212      213       +1     
  Lines          6214     6171      -43     
  Branches        579      524      -55     
============================================
+ Hits           2945     2949       +4     
- Misses         2888     2905      +17     
+ Partials        381      317      -64     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

dargmuesli added 3 commits November 4, 2026 15:17
@dargmuesli
feat(codegen)!: generate the data requests and their SpotifyApi metho…
27f0a9b
…ds from the spec

codegen/generate.py renders every data request class, and the SpotifyApi
method that creates it, from spec/openapi.yaml. codegen/requests.yaml maps
each class to its operation and records the few deliberate departures from
the spec (search types, top artists/tracks, a split reorder/replace
operation, a missing model). Two classes stay hand-written: the generic
top-artists-and-tracks request and the JPEG cover upload.

The generated API follows the spec, so where the hand-written one differed
it changes:
- setters use the wire name (additional_types, include_external, snapshot_id)
- SpotifyApi methods take the required parameters, typed like their setters,
  instead of varargs, arrays or JsonArray overloads
- body arrays and objects are List<String> and Map<String, Object> instead
  of JsonArray and JsonObject, serialized by AbstractRequest
- a body field duplicating a query parameter is dropped; Spotify ignores it
  when the query parameter is sent
- parameters the spec no longer lists are gone (country, timestamp)
- return types follow the response schema (GetSeveralAudiobooksRequest
  returns Audiobook[], GetCategoryPlaylistsRequest FeaturedPlaylists)
- recently played takes after/before as Unix milliseconds, as the spec
  says, instead of a formatted date

POST and PUT keep always sending a JSON body.

Refs #461
@dargmuesli
docs(examples): follow the generated request API
1ca7402
@dargmuesli
docs: document the generated request API and check it in CI
2c679ae
- CI regenerates the request classes and fails when the committed ones
  differ (PyYAML in a throwaway venv)
- AGENTS.md and CONTRIBUTING.md describe adding an endpoint through
  codegen/requests.yaml instead of writing the class by hand
- MIGRATION.md lists every changed SpotifyApi method, builder setter and
  return type, taken from the japicmp report against 10.1.0
- ci/check-docs.py treats any older major version as the past side of the
  guide, not only v9, so v10 names can be listed

Refs #461
@dargmuesli
dargmuesli force-pushed the feat/codegen branch from e939634 to 2c679ae Compare November 5, 2026 10:43
@dargmuesli
dargmuesli marked this pull request as ready for review November 5, 2026 11:04
@dargmuesli
dargmuesli requested a balanced review from Copilot November 5, 2026 11:13
Copilot started reviewing on behalf of dargmuesli November 5, 2026 11:14
View session
Copilot AI reviewed Nov 5, 2026
View reviewed changes

Copilot AI left a comment

Copy link
Copy Markdown

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Generated setters drop existing URI-count, volume, repeat-state, and offset constraints, allowing invalid arguments to reach the API even with assertions enabled.

6 open issues
  • Medium severity Restore the 40-URI maximum validation · New
  • Medium severity Restore the 40-URI count check · New
  • Medium severity Preserve the 40-URI upper bound · New
  • Medium severity Enforce the 100-percent upper bound · New
  • Medium severity Validate repeat state against allowed values · New
  • Medium severity Enforce the 100,000 offset maximum · New
What changed in this PR

Makes the OpenAPI specification the source of truth for v11 data requests and their SpotifyApi factory methods, introducing breaking API changes and migrating callers.

Changes:

  • Generates request parameters, documentation, deprecations, validation, and response handling from the spec.
  • Adds collection/map body serialization and shared response-parsing helpers.
  • Updates tests, examples, contributor guidance, and CI checks for generated-code drift.

This pull request requires changes. Six moderate validation regressions remain: the library check, remove, and save requests lose their 40-URI limits; playback volume loses its upper bound of 100; repeat mode loses its restriction to track, context, or off; and current-user playlist pagination loses its maximum offset of 100,000. These setters now accept invalid inputs even with assertions enabled. Preserve these constraints in the spec or generator and regenerate the affected setters.

File Description
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​UnfollowArtistsOrUsersRequestTest.java Uses comma-separated query IDs.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​FollowPlaylistRequestTest.java Sets optional visibility through the builder.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​FollowArtistsOrUsersRequestTest.java Removes coverage for retired body-ID overloads.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​CheckIfUserFollowsPlaylistRequestTest.java Sets optional IDs through the builder.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​CheckCurrentUserFollowsArtistsOrUsersRequestTest.java Uses comma-separated query IDs.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​SaveTracksForCurrentUserRequestTest.java Verifies list-valued IDs in the JSON body.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​GetSeveralAudioFeaturesRequestTest.java Uses comma-separated track IDs.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​CheckUsersSavedTracksRequestTest.java Uses comma-separated track IDs.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​shows/​CheckUsersSavedShowsRequestTest.java Uses comma-separated show IDs.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​search/​simplified/​SearchTracksRequestTest.java Uses the wire-named include_external setter.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​search/​simplified/​SearchShowsRequestTest.java Uses the wire-named include_external setter.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​search/​simplified/​SearchPlaylistsRequestTest.java Uses the wire-named include_external setter.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​search/​simplified/​SearchEpisodesRequestTest.java Uses the wire-named include_external setter.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​search/​simplified/​SearchArtistsRequestTest.java Uses the wire-named include_external setter.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​search/​simplified/​SearchAlbumsRequestTest.java Uses the wire-named include_external setter.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​search/​SearchRequestTest.java Uses the wire-named search setter.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​UpdatePlaylistsItemsReplaceRequestTest.java Tests builder-based replacement URIs.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​UpdatePlaylistsItemsReplaceDeprecatedRequestTest.java Migrates deprecated replacement request usage.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​UpdatePlaylistsItemsReorderRequestTest.java Sets reorder parameters through builders.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​UpdatePlaylistsItemsReorderDeprecatedRequestTest.java Migrates deprecated reorder request usage.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​RemovePlaylistItemsRequestTest.java Tests list input and the wire-named snapshot setter.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​RemovePlaylistItemsDeprecatedRequestTest.java Updates snapshot setter and body assertions.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​GetPlaylistRequestTest.java Uses additional_types.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​GetPlaylistItemsRequestTest.java Uses additional_types.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​GetPlaylistItemsDeprecatedRequestTest.java Uses additional_types.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​GetFeaturedPlaylistsRequestTest.java Removes unsupported country and timestamp parameters.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​GetCategoryPlaylistsRequestTest.java Tests the FeaturedPlaylists response wrapper.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​AddItemsToPlaylistRequestTest.java Tests query-based playlist additions.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​AddItemsToPlaylistDeprecatedRequestTest.java Migrates deprecated playlist-addition usage.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​TransferUsersPlaybackRequestTest.java Uses list-valued device IDs.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​StartUsersPlaybackRequestTest.java Uses a map-valued playback offset.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​StartUsersPlaybackRequestNumericTest.java Tests collection/map body serialization.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​GetUsersCurrentlyPlayingTrackRequestTest.java Uses additional_types across fixtures.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​GetRecentlyPlayedRequestTest.java Expects Unix-millisecond query values.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​GetInformationAboutUsersCurrentPlaybackRequestTest.java Uses additional_types across fixtures.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​episodes/​CheckUsersSavedEpisodesRequestTest.java Uses comma-separated episode IDs.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​audiobooks/​GetSeveralAudiobooksRequestTest.java Expects the full Audiobook[] response type.
src/​test/​java/​se/​michaelthelin/​spotify/​requests/​data/​albums/​CheckUsersSavedAlbumsRequestTest.java Uses comma-separated album IDs.
src/​test/​java/​se/​michaelthelin/​spotify/​ITest.java Updates shared timestamp, list, and map test values.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​UnfollowPlaylistRequest.java Adopts generated structure and documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​GetUsersProfileRequest.java Adopts generated profile-request documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​GetCurrentUsersProfileRequest.java Adopts generated profile-request structure.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​users/​FollowPlaylistRequest.java Aligns builder metadata and deprecation with the spec.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​RemoveUsersSavedTracksRequest.java Updates generated documentation and ID validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​GetTracksAudioFeaturesRequest.java Adopts generated documentation and builder annotations.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​GetTracksAudioAnalysisRequest.java Adopts generated documentation and builder annotations.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​GetTrackRequest.java Adopts spec-derived parameter documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​GetSeveralTracksAudioFeaturesRequest.java Updates generated documentation and ID validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​tracks/​CheckUsersSavedTracksRequest.java Uses shared Boolean-array parsing.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​shows/​SaveShowsForCurrentUserRequest.java Adds JSON content type and generated validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​shows/​GetUsersSavedShowsRequest.java Adopts generated paging documentation and checks.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​GetUsersPlaylistsRequest.java Adopts generated paging documentation and checks.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​GetPlaylistCoverImageRequest.java Adopts generated cover-request structure.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​playlists/​GetCurrentUsersPlaylistsRequest.java Regenerates paging validation; loses the 100,000 maximum offset.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​TogglePlaybackShuffleRequest.java Adopts generated documentation and state checks.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​SkipToPreviousRequest.java Adopts generated playback documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​SkipToNextRequest.java Adopts generated playback documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​SetRepeatModeRequest.java Regenerates state handling; loses allowed-state validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​SetPlaybackVolumeRequest.java Regenerates volume handling; loses the maximum of 100.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​SeekToPositionRequest.java Adopts generated seek-request documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​PausePlaybackRequest.java Adopts generated playback documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​GetUsersQueueRequest.java Adopts generated queue-request structure.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​GetAvailableDevicesRequest.java Adopts generated device-request documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​player/​AddItemToPlaybackQueueRequest.java Aligns generated setter order and documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​markets/​GetAvailableMarketsRequest.java Uses shared string-array parsing.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​library/​SaveItemsToLibraryRequest.java Adds JSON content type; loses the 40-URI count check.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​library/​RemoveItemsFromLibraryRequest.java Regenerates URI handling; loses the 40-URI count check.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​library/​CheckUsersSavedItemsRequest.java Uses shared parsing; loses the 40-URI count check.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​genres/​GetRecommendationGenresRequest.java Replaces custom genre-array parsing with a shared helper.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​episodes/​SaveEpisodesForCurrentUserRequest.java Adds JSON content type and generated checks.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​episodes/​RemoveEpisodesForCurrentUserRequest.java Updates generated documentation and ID validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​episodes/​GetSeveralEpisodesRequest.java Updates generated documentation and ID validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​chapters/​GetChapterRequest.java Aligns chapter-request documentation with the spec.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​categories/​GetSingleBrowseCategoryRequest.java Updates generated documentation and locale validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​audiobooks/​RemoveAudiobooksForCurrentUserRequest.java Updates generated documentation and ID validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​audiobooks/​GetUsersSavedAudiobooksRequest.java Adopts generated paging documentation and checks.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​audiobooks/​GetAudiobookRequest.java Aligns audiobook-request documentation with the spec.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​artists/​GetSeveralArtistsRequest.java Updates generated documentation and ID validation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​artists/​GetArtistsTopTracksRequest.java Aligns generated top-tracks documentation.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​artists/​GetArtistsRelatedArtistsRequest.java Adopts generated documentation and builder annotations.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​artists/​GetArtistRequest.java Adopts generated artist-request structure.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​albums/​SaveAlbumsForCurrentUserRequest.java Applies the spec ID limit and JSON content type.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​albums/​RemoveAlbumsForCurrentUserRequest.java Applies the spec-derived 20-ID limit.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​albums/​GetNewReleasesRequest.java Adopts generated paging documentation and checks.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​albums/​GetAlbumRequest.java Adopts generated album-request structure.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​data/​albums/​CheckUsersSavedAlbumsRequest.java Uses shared parsing and the spec ID limit.
src/​main/​java/​se/​michaelthelin/​spotify/​requests/​AbstractRequest.java Serializes collection and map body values.
src/​main/​java/​se/​michaelthelin/​spotify/​internal/​RequestValues.java Wraps values into one-field body objects.
src/​main/​java/​se/​michaelthelin/​spotify/​internal/​ModelObjectJson.java Adds primitive-value response-parsing helpers.
examples/​data/​users/​UnfollowArtistsOrUsersExample.java Uses comma-separated query IDs.
examples/​data/​users/​FollowPlaylistExample.java Sets visibility through the builder.
examples/​data/​users/​FollowArtistsOrUsersExample.java Uses comma-separated query IDs.
examples/​data/​users/​CheckIfUserFollowsPlaylistExample.java Sets optional IDs through the builder.
examples/​data/​users/​CheckCurrentUserFollowsArtistsOrUsersExample.java Uses comma-separated query IDs.
examples/​data/​tracks/​SaveTracksForCurrentUserExample.java Supplies track IDs as a list.
examples/​data/​tracks/​GetSeveralTracksAudioFeaturesExample.java Uses comma-separated track IDs.
examples/​data/​tracks/​CheckUsersSavedTracksExample.java Uses comma-separated track IDs.
examples/​data/​shows/​CheckUsersSavedShowsExample.java Uses comma-separated show IDs.
examples/​data/​search/​simplified/​SearchTracksExample.java Updates commented search-setter usage.
examples/​data/​search/​simplified/​SearchShowsExample.java Updates commented search-setter usage.
examples/​data/​search/​simplified/​SearchPlaylistsExample.java Updates commented search-setter usage.
examples/​data/​search/​simplified/​SearchEpisodesExample.java Updates commented search-setter usage.
examples/​data/​search/​simplified/​SearchArtistsExample.java Updates commented search-setter usage.
examples/​data/​search/​simplified/​SearchAlbumsExample.java Updates commented search-setter usage.
examples/​data/​search/​SearchForItemExample.java Updates commented search-setter usage.
examples/​data/​playlists/​UpdatePlaylistsItemsReplaceExample.java Supplies replacement URIs through the builder.
examples/​data/​playlists/​UpdatePlaylistsItemsReplaceDeprecatedExample.java Migrates deprecated replacement request usage.
examples/​data/​playlists/​UpdatePlaylistsItemsReorderExample.java Sets reorder parameters through the builder.
examples/​data/​playlists/​UpdatePlaylistsItemsReorderDeprecatedExample.java Migrates deprecated reorder request usage.
examples/​data/​playlists/​RemovePlaylistItemsExample.java Updates commented snapshot-setter usage.
examples/​data/​playlists/​RemovePlaylistItemsDeprecatedExample.java Uses URI lists and the renamed snapshot setter.
examples/​data/​playlists/​GetPlaylistItemsExample.java Updates the commented additional-types setter.
examples/​data/​playlists/​GetPlaylistItemsDeprecatedExample.java Updates the commented additional-types setter.
examples/​data/​playlists/​GetPlaylistExample.java Updates the commented additional-types setter.
examples/​data/​playlists/​GetFeaturedPlaylistsExample.java Removes comments showing unsupported parameters.
examples/​data/​playlists/​GetCategoryPlaylistsExample.java Consumes the FeaturedPlaylists response wrapper.
examples/​data/​playlists/​AddItemsToPlaylistExample.java Supplies comma-separated URIs through the builder.
examples/​data/​playlists/​AddItemsToPlaylistDeprecatedExample.java Migrates deprecated playlist-addition usage.
examples/​data/​player/​TransferPlaybackExample.java Supplies device IDs as a list.
examples/​data/​player/​GetRecentlyPlayedTracksExample.java Shows millisecond timestamp arguments in comments.
examples/​data/​player/​GetPlaybackStateExample.java Updates the commented additional-types setter.
examples/​data/​player/​GetCurrentlyPlayingTrackExample.java Updates the commented additional-types setter.
examples/​data/​episodes/​CheckUsersSavedEpisodesExample.java Uses comma-separated episode IDs.
examples/​data/​audiobooks/​GetSeveralAudiobooksExample.java Consumes full Audiobook[] responses.
examples/​data/​albums/​CheckUsersSavedAlbumsExample.java Uses comma-separated album IDs.
CONTRIBUTING.md Documents the generated-endpoint contribution workflow.
ci/​check-docs.py Recognizes older-major migration-guide references.
AGENTS.md Documents generation and revised API conventions.
.github/​workflows/​ci.yml Adds generated-output drift verification.

Review effort: Balanced

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread src/main/java/se/michaelthelin/spotify/requests/data/library/CheckUsersSavedItemsRequest.java Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread src/main/java/se/michaelthelin/spotify/requests/data/library/RemoveItemsFromLibraryRequest.java Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread src/main/java/se/michaelthelin/spotify/requests/data/library/SaveItemsToLibraryRequest.java Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread src/main/java/se/michaelthelin/spotify/requests/data/player/SetPlaybackVolumeRequest.java Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread src/main/java/se/michaelthelin/spotify/requests/data/player/SetRepeatModeRequest.java Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread ...n/java/se/michaelthelin/spotify/requests/data/playlists/GetCurrentUsersPlaylistsRequest.java Resolved

Uh oh!

There was an error while loading. Please reload this page.

@dargmuesli
fix(codegen): restore the argument checks the spec documents
2df99e1
The generator read integer bounds and enums from the schema, and mined the
description only for "Maximum: N IDs" and "maximum of N items". Seven setters
therefore lost a check the spec states: the 40-URI limit of the library
endpoints, the single id of the playlist follow check, the 0 to 100 volume
range, the three repeat states, and the 100,000 offset maximum of the two
playlist endpoints.

The vendored spec now carries the bounds as schema fields (enum on the repeat
state, minimum and maximum on the volume and the two offset parameters), and
the count-limit regex also reads "Maximum: N URIs" and "Maximum: N id".
ArgumentChecksTest pins the restored checks at their boundaries.
@dargmuesli

dargmuesli commented Nov 5, 2026

Copy link
Copy Markdown
Member Author

While fixing these six I swept the spec for the same class of drop and found one more setter the review missed: CheckIfUserFollowsPlaylistRequest.ids used to assert a single id, and the spec's "Maximum: 1 id" phrasing (lowercase singular) fell through the generator's "Maximum: N IDs" regex. The same commit restores it.

The fix has two parts. Where OpenAPI can express the constraint, the vendored spec/openapi.yaml now carries it as a schema field: enum on the repeat state, minimum and maximum on the volume and the two playlist offset parameters. Where it cannot (a count limit on a comma-separated string parameter), the generator's existing description regex now also reads "Maximum: N URIs" and "Maximum: N id". AGENTS.md notes that the vendored spec is the published spec plus these constraint fields, so a future spec refresh does not drop them, and ArgumentChecksTest pins every restored check at its boundary.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@dargmuesli dargmuesli mentioned this pull request Nov 5, 2026
refactor(build): move the generated request classes to src/generated/java #492
Merged
@dargmuesli
dargmuesli merged commit 903664a into beta Nov 5, 2026
11 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@dargmuesli
dargmuesli deleted the feat/codegen branch November 5, 2026 12:31
This was referenced Nov 5, 2026
refactor(models)!: remove the deprecated JsonUtil classes #493
Merged
refactor: reduce boilerplate code #461
Closed
refactor(module)!: require Gson without re-exporting it #494
Merged
ci(release): v11 #484
Draft
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

Copilot code review Copilot
Copilot review effort
Applies to this pull request for everyone.Learn more about Copilot code review.
Copilot left review comments

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@dargmuesli
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.