- Enable next/back navigation buttons on all documentation pages.
- Add a "Supported endpoints" docs page listing every service method, and
document the
generalservice in the getting-started guides. - Order the getting-started section ahead of the module reference in the docs navigation, and add short intros to the reference pages.
- Correct the name-change service accessor in the docs from
Client.name_changestoClient.names. - Correct the stated minimum Python version in the installation guide from 3.9 to 3.10.
- Add optional
HttpErrorResponse.codefield capturing the machine-readable error code returned by the WOM API (defaults toNonewhen absent). - Every
BaseEnumsubclass now defines anUnknownvariant. Unrecognized values received from the API decode toUnknown(viaBaseEnum._missing_) instead of raising, and anUnknownEnumWarningis emitted viawarnings.warn.Unknownis skipped when iterating an enum (viaBaseEnumMeta), soat_random()never returns it. - Add the
UnknownEnumWarningwarning category (exported aswom.UnknownEnumWarning) so unrecognized-enum warnings can be filtered or silenced withwarnings.filterwarnings. - Add
Client.names.get_name_change_details, wrapping theGET /names/{id}endpoint. Returns a newNameChangeDetailmodel (with a nestedNameChangeDatacarrying the old/newSnapshots used to review the change;dataisNonefor already-resolved changes). - Add
Client.names.bulk_submit_name_changes, wrapping thePOST /names/bulkendpoint. Accepts a sequence of(old_name, new_name)tuples and returns a newNameChangeBulkResultmodel. - Add
Client.general, a newGeneralServicefor endpoints that aren't specific to a domain, withget_stats()wrapping theGET /statsendpoint and returning a newStatsmodel. - Add
Client.efficiency.get_rates, wrapping theGET /efficiency/ratesendpoint. Returns a list ofSkillMetaConfigfor theEhpmetric or a list ofBossMetaConfigforEhb. Adds the supportingEfficiencyAlgorithmTypeenum and theSkillMetaMethod,SkillMetaBonus,SkillMetaConfig, andBossMetaConfigmodels.
- Failed requests whose body isn't the expected JSON object (e.g. an HTML error
page from a gateway, an empty body, or a non-object JSON payload) no longer
raise while being decoded. They are now returned as a well-formed
Err(HttpErrorResponse)carrying the HTTP status, preserving the guarantee that service methods never raise on API errors. A bare-message endpoint that returns a 2xx without the expected{"message": ...}envelope is likewise reported as success rather than raising. NameChangeReviewContextnow types its fractional diff fields as floats:hours_diff,ehp_diff, andehb_diffareOptional[float], andnegative_gainsvalues arefloat. Previously these wereint, causingget_name_change_detailsto raise amsgspec.ValidationErrorwhen the API returned a fractionalhoursDiff(e.g. on a deniedtransition_period_too_longchange).Snapshot.imported_atnow defaults toNone, so a live (never-imported) snapshot that omits theimportedAtkey entirely decodes instead of raising amsgspec.ValidationError. This previously brokeget_name_change_details(and any snapshot-returning endpoint) whenever the API returned a fresh hiscores snapshot.
Route.compilenow raisesValueErrorwhen the number of arguments does not match the number of{}placeholders in the route uri, instead of silently leaving unfilled placeholders in the request path.- Unrecognized enum values now emit an
UnknownEnumWarningthrough thewarningsmodule instead of printing tostderr, so consumers can filter, capture, or escalate them like any other warning. - Drop the direct import of
attrs(it was never a declared dependency and was only satisfied transitively viaaiohttp); the internalRoutetype is now a plain slotted class, leavingaiohttpandmsgspecas the only runtime deps. - Bare-message endpoints (delete/add/remove members and participants/teams,
and the update-all endpoints) now classify success purely by HTTP status
instead of matching the response message text. Any successful (2xx) response
is returned as
Ok(HttpSuccessResponse)regardless of the message wording; failures come back asErr(HttpErrorResponse)with the API'scode. This also fixes success messages that don't begin with"Success"being misreported as errors. - Bump the minimum
msgspecversion to>=0.21.0, which is required to decode enums that use a custom metaclass. - Migrate the build and dependency management from Poetry to
uv (
pyproject.tomlmoved to PEP 621 with the hatchling backend, and CI/release workflows now use uv). No changes to the published package or its runtime dependencies. - Expand the test suite with full coverage for the players, groups, and competitions services and the HTTP service, bringing overall coverage to 100%.
- Add support for
Mad Angelboss.
- Convert to numpy style docstrings.
- Add
PlayerService.get_bulk_gains(...). - Add supporting models:
BaseGainsBulkGainsBulkGroupMemberGains
- Add
PlayerService.get_bulk_hiscores(...).BulkGroupHiscoresActivityItemBulkGroupHiscoresBossItemBulkGroupHiscoresComputedMetricItemBulkGroupHiscoresDataBulkGroupHiscoresEntryBulkGroupHiscoresMetricsBulkGroupHiscoresSkillItem
- Add new boss metric
Maggot King(maggot_king).
- Added new 'GB_ENG' country enum value.
- Remove
idproperty fromSnapshotmodel. - Remove support for Python 3.9.
- Add support for Python 3.14.
- Add support for
Brutusboss.
- Add sailing metric.
- Added new boss metric
Shellbane Gryphon(shellbane_gryphon).
- Added missing
Countryenum values.
- Add new boss metric
Doom of Mokhaiotl(doom_of_mokhaiotl).
- Add new boss metric
Yama(yama).
- Add new boss metric
Royal Titans(the_royal_titans).
- Drop support for Python 3.8.
- Minimum msgspec version is now
0.19.0.
- Add
CollectionsLoggedmetric. - Add support for Python 3.13.
- Added two new boss metrics
AmoxliatlandHueycoatl.
Stable!
Group.clan_chatis now optional.
- Fix bug where old groups with no clan chat would fail to deserialize.
- Added Araxxor to the
Bossesenum.
Stable Release Candidate 1
10x performance increase when serializing/deserializing models!
- Removed internal
wom._climodule. - Renamed project info
wompycli command towom. - Models are now
msgspec.Structmodels instead ofattrsmodels. PlayerDetailnow inherits fromPlayerand so theplayerproperty was removed.PlayerAchievementProgressnow inherits fromAchievementProgressand so theachievementproperty was removed.PlayerCompetitionStandingnow inherits fromPlayerParticipationand so theparticipationproperty was removed.GroupMembershipandPlayerMembershipnow inherit fromMembershipand so themembershipproperty was removed.PlayerArchivenow inherits fromArchiveand so thearchiveproperty was removed.- Renamed
RecordService.get_global_record_leaderboardstoget_global_leaderboards. RecordLeaderboardEntrynow inherits fromRecordand so therecordproperty was removed.- Removed
DeniedNameChangeReviewContext, andSkippedNameChangeReviewContext, their properties now live onNameChangeReviewContext. CompetitionParticipationDetailnow inherits fromCompetitionParticipationand so theparticipationproperty was removed.CompetitionDetailnow inherits fromCompetitionand so thecompetitionproperty was removed.CompetitionService.edit_competitionnow returns aCompetition.- All methods in the
Serializerprefixed withdeserialize_were removed. GroupDetailnow inherits fromGroupand so thegroupproperty was removed.- The
verification_codeproperty onGroupDetailwas removed. - Converted the
Skills,Activities,Bosses, andComputedMetricsenums intofrozensets. CompetitionWithParticipationswas renamed toCreatedCompetitionDetailbecause theparticipationsproperty was removed and added toCompetitionand the name was no longer an accurate representation of the object.EfficiencyService.get_global_leaderboardwas renamed toget_global_leaderboardsto be in line with the other leaderboard method names.- The
from_strandfrom_str_maybemethods were removed from theMetricenum.
- Added
CreatedGroupDetailmodel which always has the verification code present. - Added
previous_roleproperty toGroupActivity. - Added
CompetitionService.get_details_csvmethod. - Added
MetricLeaderclass for the different flavors of leader to derive from. - Added
CompetitionCSVTableTypeenum for the competition details csv endpoint. - Added pagination to
PlayerService.get_snapshots.
Record.valueis now afloatinstead of anint.ComputedMetricLeader.valueis now afloatinstead of anint.- The
Metricenum now includes all variants of the oldSkills,Activities,Bosses, andComputedMetricsenums. GroupService.create_groupnow returns aCreatedGroupDetailmodel.- Updated docstrings for group classes.
- Fixed broken poetry install link in contributing guide.
- Add varlamore metrics (ColosseumGlory, LunarChests, SolHeredit).
- Fix bug where
PlayerDetailwith no latest snapshot would fail to deserialize.
- Add
ScurriustoBosses.
- Add
archiveproperty toPlayerDetail. - Add
ArchiveandPlayerArchivemodels/serialization methods. - Add
get_archivesmethod toPlayerService. - Add
to_dictmethod toResult.
- Fix some Python 3.8 incompatible type hints.
- Fix invalid key regression for social links.
- Add
at_randommethod toBaseEnumfor generating an enum variant at random. - Add
levelsproperty toCompetitionParticipationDetail. - Add
patron,banner_image, andprofile_imageproperties toGroup. - Add
SocialLinksmodel andsocial_linksproperty toGroupDetail. - Add getting started guide to the documentation.
- Methods that previously accepted only
GroupMemberFragmentnow accept strings as well. - Update examples in
GroupServicethat work withGroupMemberFragment. - Remove usage of weakref slots throughout the project, improving memory footprint.
- Add
rankproperty toSnapshotTimelineEntry.
- Add
GroupActivityandGroupActivityTypemodels. - Add
deserialize_group_activityserializer method. - Add
get_activitygroup service method. - Add
GROUP_ACTIVITYRoute.
Player.updated_atis now optional.
- Add
FailedToDeserializeerror.
- Fix typo in docstring for
PlayerService.get_records.
- Add
F2P Lvl 3player build.
- Add support for Desert Treasure 2 bosses.
- Add
PlayerService.get_snapshots_timelinemethod. - Add
SnapshotTimelineEntrymodel and corresponding serializer method. - Add
GroupMemberGainsmodel and corresponding serializer method.
GroupService.get_gainsmethod now returns aGroupMemberGainsmodel.
- Add
Bannedplayer status. - Add helpful error message if new enum variants are not yet added to the lib.
- Make
MetricLeaders.playeroptional, indicating no player leads in the metric. - Fix typos in the
Bossesenum.
- Remove
NameChangeService.get_name_change_detailsas it is no longer supported by WOM. - Remove models and serialization methods associated with the above method.
- Add new
review_contextfield toNameChange. - Add
NameChangeReviewContext,SkippedNameChangeReviewContext, andDeniedNameChangeReviewContextmodels. - Add
NameChangeReviewReasonenum. - Add serialization method for the above models.
- Fix support for Python 3.8 and 3.9 by using older style type hints.
- Fix bug in
Routethat caused requests to be made to incorrect URI's.
- Add a new required async
Client.startmethod to fix deprecation warning emitted by creating aClientSessionin a non-async function.
- Add new wildy bosses Artio, Calvarion, and Spindel to the
Bossesenum.
MetricLeaders,PlayerGainsData, andSnapshotDatanow contain mappings of theirenums.Skillskey to values of the associated type that was previously contained in the list.- The deserialization methods associated with the above types were also updated to accommodate this.
- the
Player.flaggedfield was removed in favor of thePlayer.statusfield.
- Only include the type of the value, not the value itself, in the error message raised when
calling
unwrap_erron anOkvariant. Skill.ehp,Boss.ehb, andComputedMetric.valueare nowfloattype.
- Tests! 👀
- A
PlayerStatusenum representing the statuses a player can be in (flagged, active, etc)
GroupStatistics.average_statsis now aSnapshotrather than aGroupSnapshot.- Remove
GroupSnapshotmodel sincecreated_atonSnapshotis now guaranteed to be present.
- Add some missing models to
__all__.
- Add leaders models:
SkillLeader,BossLeader,ActivityLeader,ComputedMetricLeader, andMetricLeaders. - Add
metric_leadersproperty toGroupStatistics. - Add deserialization methods for the new leader models.
EfficiencyService.get_global_leaderboardnow accepts abothkwarg, and will no longer erroneously allow you to pass many computed metrics as*args.
- Relaxed the pinned dependencies for better compatibility.
- The
metricparameter toEfficiencyService.get_global_leaderboardis now defaulted to EHP.
- Initial release!