From f5f4a7c6fb39806fa8f263b705cfa958de9b9a7b Mon Sep 17 00:00:00 2001 From: Elliot <3186037+elliot-100@users.noreply.github.com> Date: Fri, 18 Oct 2024 14:08:28 +0100 Subject: [PATCH 1/2] Docs: README: removed outdated content; fix missing `:` and lint example code --- README.md | 97 +++++++++---------------------------------------------- 1 file changed, 15 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index 42e7177..c4f26b6 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,8 @@ The unofficial Python [`spond` library package](https://github.com/Olen/Spond/) gets data from the Spond API and returns `dict` objects. -This unofficial Python `spond-classes` library package parses those `dict` objects to create -[Pydantic](https://docs.pydantic.dev/) class instances, i.e. provides an object abstraction layer. +This unofficial Python `spond-classes` library package parses those `dict` objects to +create [Pydantic](https://docs.pydantic.dev/) class instances, i.e. provides an object abstraction layer. Experimental, partial, read-only implementation. @@ -32,105 +32,38 @@ Adapting the example code in [`Spond`](https://github.com/Olen/Spond/) README: ```python import asyncio -from spond import spond -import spond_classes +from spond.spond import Spond +from spond_classes import Group # fake credentials and ids -username = 'my@mail.invalid' -password = 'Pa55worD' -group_id = 'G1' -subgroup_id = 'SG1' +USERNAME = 'my@mail.invalid' +PASSWORD = 'Pa55worD' +GROUP_ID = 'G1' +SUBGROUP_ID = 'SG1' async def main(): - s = spond.Spond(username=username, password=password) - group_data = await s.get_group(group_id) + s = Spond(username=USERNAME, password=PASSWORD) + group_data = await s.get_group(GROUP_ID) await s.clientsession.close() # Now we can create a class instance ... - group = spond_classes.Group.model_validate(group_data) + group = Group.model_validate(group_data) # or `spond_classes.Group(**group_data)` - # ... use class properties instead of dict keys ... + # ... use class attributes instead of dict keys ... print(group.name) - # ... access subordinate instances and their properties ... + # ... access subordinate instances and their attributes ... for member in group.members: print(f"{member.full_name} is in the {group.name} group") # ... and use some helper methods - subgroup = group.subgroup_by_id(subgroup_id) - for member in group.members_by_subgroup(subgroup) + subgroup = group.subgroup_by_id(SUBGROUP_ID) + for member in group.members_by_subgroup(subgroup): print(f"{member.full_name} is in the {subgroup.name} subgroup") asyncio.run(main()) -``` -## Key features - -* Create `Group` instance from the dict returned from the API by the corresponding - `Spond` method: - -```python -spond_classes.Group.model_validate(dict) -# or `spond_classes.Group(**dict)` -``` - -* Then access class instance attributes and methods: - -```python -Group.uid: str -Group.members: list[Member] -Group.name: str -Group.roles: list[Role] -Group.subgroups: list[Subgroup] - -Group.member_by_id() -> Member -Group.role_by_id() -> Role -Group.subgroup_by_id() -> Subgroup - -Group.members_by_subgroup(subgroup: Subgroup) -> list[Member] -Group.members_by_role(role: Role) -> list[Member] -``` - -* Also provides access to subordinate `Member`, `Role`, `Subgroup` instances: -```python -Member.uid: str -Member.created_time: datetime -Member.email: str -Member.first_name: str -Member.full_name: str -Member.last_name: str -Member.phone_number: str -Member.Profile.uid: str -Member.role_uids: list[str] -Member.subgroup_uids: list[str] - -Role.uid: str -Role.name: str - -Subgroup.uid: str -Subgroup.name: str -``` - -* Create `Event` instance from the dict returned from the API by the corresponding - `Spond` method: - -```python -spond_classes.Event.model_validate(dict) -# or spond_classes.Event(**dict) -``` - -* Then access attributes: - -```python -Event.uid: str -Event.heading: str -Event.start_time: datetime -Event.Responses.accepted_uids: list[str] -Event.Responses.declined_uids: list[str] -Event.Responses.unanswered_uids: list[str] -Event.Responses.waiting_list_uids: list[str] -Event.Responses.unconfirmed_uids: list[str] ``` ## Documentation From 9adb5b1c3f70d6ca17225ea5b7f31b855e94e6f8 Mon Sep 17 00:00:00 2001 From: Elliot <3186037+elliot-100@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:00:34 +0100 Subject: [PATCH 2/2] dev-deps: update mypy, ruff --- .pre-commit-config.yaml | 2 +- CHANGELOG.md | 11 +++ docs/search.js | 2 +- docs/spond_classes.html | 191 ++++++++++++++++++++++++++++++++++++-- pyproject.toml | 4 +- spond_classes/__init__.py | 3 +- 6 files changed, 200 insertions(+), 13 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f37d5ba..80a6824 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,6 +9,6 @@ repos: - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.6.9 + rev: v0.7.0 hooks: - id: ruff-format diff --git a/CHANGELOG.md b/CHANGELOG.md index 3de1d69..9234cd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,17 @@ and this project tries to adhere to [Semantic Versioning](https://semver.org/spe Historic and pre-release versions aren't necessarily included. +## UNRELEASED - TBC + +### Added + +- Event `Responses` to public API + +### Changed + +- Update dev dependencies: mypy, ruff + + ## [0.12.0] - 2024-10-11 ### Added diff --git a/docs/search.js b/docs/search.js index 1c34d9b..042eca9 100644 --- a/docs/search.js +++ b/docs/search.js @@ -1,6 +1,6 @@ window.pdocSearch = (function(){ /** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();oMain module.

\n"}, {"fullname": "spond_classes.Event", "modulename": "spond_classes", "qualname": "Event", "kind": "class", "doc": "

Represents an event in the Spond system.

\n\n

Events data is retrieved from the events API endpoint.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Event.uid", "modulename": "spond_classes", "qualname": "Event.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Event.heading", "modulename": "spond_classes", "qualname": "Event.heading", "kind": "variable", "doc": "

\n", "annotation": ": str"}, {"fullname": "spond_classes.Event.responses", "modulename": "spond_classes", "qualname": "Event.responses", "kind": "variable", "doc": "

\n", "annotation": ": spond_classes.event.Responses"}, {"fullname": "spond_classes.Event.type", "modulename": "spond_classes", "qualname": "Event.type", "kind": "variable", "doc": "

\n", "annotation": ": spond_classes.event.EventType"}, {"fullname": "spond_classes.Event.created_time", "modulename": "spond_classes", "qualname": "Event.created_time", "kind": "variable", "doc": "

Derived from createdTime in API.

\n", "annotation": ": datetime.datetime"}, {"fullname": "spond_classes.Event.end_time", "modulename": "spond_classes", "qualname": "Event.end_time", "kind": "variable", "doc": "

Datetime at which the Event ends.\nDerived from endTimestamp in API.

\n", "annotation": ": datetime.datetime"}, {"fullname": "spond_classes.Event.start_time", "modulename": "spond_classes", "qualname": "Event.start_time", "kind": "variable", "doc": "

Datetime at which the Event starts.\nDerived from startTimestamp in API.

\n", "annotation": ": datetime.datetime"}, {"fullname": "spond_classes.Event.cancelled", "modulename": "spond_classes", "qualname": "Event.cancelled", "kind": "variable", "doc": "

Optional.

\n", "annotation": ": bool | None"}, {"fullname": "spond_classes.Event.invite_time", "modulename": "spond_classes", "qualname": "Event.invite_time", "kind": "variable", "doc": "

Optional.\nDerived from inviteTime in API.

\n", "annotation": ": datetime.datetime | None"}, {"fullname": "spond_classes.Event.url", "modulename": "spond_classes", "qualname": "Event.url", "kind": "variable", "doc": "

Return the URL of the Event, for convenience.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Event.model_config", "modulename": "spond_classes", "qualname": "Event.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Event.model_fields", "modulename": "spond_classes", "qualname": "Event.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'heading': FieldInfo(annotation=str, required=True), 'responses': FieldInfo(annotation=Responses, required=True), 'type': FieldInfo(annotation=EventType, required=True), 'created_time': FieldInfo(annotation=datetime, required=True, alias='createdTime', alias_priority=2), 'end_time': FieldInfo(annotation=datetime, required=True, alias='endTimestamp', alias_priority=2), 'start_time': FieldInfo(annotation=datetime, required=True, alias='startTimestamp', alias_priority=2), 'cancelled': FieldInfo(annotation=Union[bool, NoneType], required=False, default=None), 'invite_time': FieldInfo(annotation=Union[datetime, NoneType], required=False, default=None, alias='inviteTime', alias_priority=2)}"}, {"fullname": "spond_classes.Event.model_computed_fields", "modulename": "spond_classes", "qualname": "Event.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.EventType", "modulename": "spond_classes", "qualname": "EventType", "kind": "class", "doc": "

Represents the kind of Event.

\n", "bases": "enum.Enum"}, {"fullname": "spond_classes.EventType.EVENT", "modulename": "spond_classes", "qualname": "EventType.EVENT", "kind": "variable", "doc": "

\n", "default_value": "<EventType.EVENT: 'EVENT'>"}, {"fullname": "spond_classes.EventType.RECURRING", "modulename": "spond_classes", "qualname": "EventType.RECURRING", "kind": "variable", "doc": "

\n", "default_value": "<EventType.RECURRING: 'RECURRING'>"}, {"fullname": "spond_classes.Group", "modulename": "spond_classes", "qualname": "Group", "kind": "class", "doc": "

Represents a group in the Spond system.

\n\n

Groups data is retrieved from the groups API endpoint.

\n\n

A Group has:

\n\n
    \n
  • zero, one or more Members
  • \n
  • zero, one or more Roles
  • \n
  • zero, one or more Subgroups
  • \n
\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Group.uid", "modulename": "spond_classes", "qualname": "Group.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Group.name", "modulename": "spond_classes", "qualname": "Group.name", "kind": "variable", "doc": "

\n", "annotation": ": str"}, {"fullname": "spond_classes.Group.members", "modulename": "spond_classes", "qualname": "Group.members", "kind": "variable", "doc": "

Members belonging to the Group. Derived from members in API.

\n", "annotation": ": list[spond_classes.member.Member]"}, {"fullname": "spond_classes.Group.roles", "modulename": "spond_classes", "qualname": "Group.roles", "kind": "variable", "doc": "

Roles belonging to the Group. Derived from roles in API.

\n", "annotation": ": list[spond_classes.role.Role]"}, {"fullname": "spond_classes.Group.subgroups", "modulename": "spond_classes", "qualname": "Group.subgroups", "kind": "variable", "doc": "

Subgroups belonging to the Group. Derived from subGroups in API.

\n", "annotation": ": list[spond_classes.subgroup.Subgroup]"}, {"fullname": "spond_classes.Group.member_by_id", "modulename": "spond_classes", "qualname": "Group.member_by_id", "kind": "function", "doc": "

Return the Member with matching ID.

\n\n
Parameters
\n\n
    \n
  • member_uid: ID to look up.
  • \n
\n\n
Returns
\n\n
    \n
  • Member
  • \n
\n\n
Raises
\n\n
    \n
  • LookupError: If uid is not found.
  • \n
\n", "signature": "(self, member_uid: str) -> spond_classes.member.Member:", "funcdef": "def"}, {"fullname": "spond_classes.Group.role_by_id", "modulename": "spond_classes", "qualname": "Group.role_by_id", "kind": "function", "doc": "

Return the Role with matching ID.

\n\n
Parameters
\n\n
    \n
  • role_uid: ID to look up.
  • \n
\n\n
Returns
\n\n
    \n
  • Role
  • \n
\n\n
Raises
\n\n
    \n
  • LookupError: If uid is not found.
  • \n
\n", "signature": "(self, role_uid: str) -> spond_classes.role.Role:", "funcdef": "def"}, {"fullname": "spond_classes.Group.subgroup_by_id", "modulename": "spond_classes", "qualname": "Group.subgroup_by_id", "kind": "function", "doc": "

Return the Subgroup with matching ID.

\n\n
Parameters
\n\n
    \n
  • subgroup_uid: ID to look up.
  • \n
\n\n
Returns
\n\n
    \n
  • Subgroup
  • \n
\n\n
Raises
\n\n
    \n
  • LookupError: If uid is not found.
  • \n
\n", "signature": "(self, subgroup_uid: str) -> spond_classes.subgroup.Subgroup:", "funcdef": "def"}, {"fullname": "spond_classes.Group.members_by_subgroup", "modulename": "spond_classes", "qualname": "Group.members_by_subgroup", "kind": "function", "doc": "

Return Members in the Subgroup.

\n\n
Parameters
\n\n
    \n
  • subgroup: Subgroup from which to return Members.
  • \n
\n\n
Returns
\n\n
    \n
  • list[Member]
  • \n
\n\n
Raises
\n\n
    \n
  • TypeError: If subgroup is not a Subgroup instance.
  • \n
\n", "signature": "(\tself,\tsubgroup: spond_classes.subgroup.Subgroup) -> list[spond_classes.member.Member]:", "funcdef": "def"}, {"fullname": "spond_classes.Group.members_by_role", "modulename": "spond_classes", "qualname": "Group.members_by_role", "kind": "function", "doc": "

Return Members with the Role.

\n\n
Parameters
\n\n
    \n
  • role: Role from which to return Members.
  • \n
\n\n
Returns
\n\n
    \n
  • list[Member]
  • \n
\n\n
Raises
\n\n
    \n
  • TypeError: If role is not a Role instance.
  • \n
\n", "signature": "(self, role: spond_classes.role.Role) -> list[spond_classes.member.Member]:", "funcdef": "def"}, {"fullname": "spond_classes.Group.model_config", "modulename": "spond_classes", "qualname": "Group.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Group.model_fields", "modulename": "spond_classes", "qualname": "Group.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'name': FieldInfo(annotation=str, required=True), 'members': FieldInfo(annotation=list[Member], required=True), 'roles': FieldInfo(annotation=list[Role], required=True), 'subgroups': FieldInfo(annotation=list[Subgroup], required=True, alias='subGroups', alias_priority=2)}"}, {"fullname": "spond_classes.Group.model_computed_fields", "modulename": "spond_classes", "qualname": "Group.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Member", "modulename": "spond_classes", "qualname": "Member", "kind": "class", "doc": "

Represents a member in the Spond system.

\n\n

A Member is an individual's Group-specific record.

\n\n

A Member may have a Profile.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Member.uid", "modulename": "spond_classes", "qualname": "Member.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Member.created_time", "modulename": "spond_classes", "qualname": "Member.created_time", "kind": "variable", "doc": "

Derived from createdTime in API.

\n", "annotation": ": datetime.datetime"}, {"fullname": "spond_classes.Member.first_name", "modulename": "spond_classes", "qualname": "Member.first_name", "kind": "variable", "doc": "

firstName in API.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Member.last_name", "modulename": "spond_classes", "qualname": "Member.last_name", "kind": "variable", "doc": "

lastName in API.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Member.subgroup_uids", "modulename": "spond_classes", "qualname": "Member.subgroup_uids", "kind": "variable", "doc": "

subGroups in API; aliased to avoid confusion with Subgroup instances.

\n", "annotation": ": list[str]"}, {"fullname": "spond_classes.Member.email", "modulename": "spond_classes", "qualname": "Member.email", "kind": "variable", "doc": "

\n", "annotation": ": str | None"}, {"fullname": "spond_classes.Member.phone_number", "modulename": "spond_classes", "qualname": "Member.phone_number", "kind": "variable", "doc": "

phoneNumber in API.

\n", "annotation": ": str | None"}, {"fullname": "spond_classes.Member.profile", "modulename": "spond_classes", "qualname": "Member.profile", "kind": "variable", "doc": "

Derived from profile in API.

\n", "annotation": ": spond_classes.profile_.Profile | None"}, {"fullname": "spond_classes.Member.role_uids", "modulename": "spond_classes", "qualname": "Member.role_uids", "kind": "variable", "doc": "

roles in API; aliased to avoid confusion with Role instances.

\n", "annotation": ": list[str] | None"}, {"fullname": "spond_classes.Member.full_name", "modulename": "spond_classes", "qualname": "Member.full_name", "kind": "variable", "doc": "

Return the Member's full name, for convenience.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Member.model_config", "modulename": "spond_classes", "qualname": "Member.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Member.model_fields", "modulename": "spond_classes", "qualname": "Member.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'created_time': FieldInfo(annotation=datetime, required=True, alias='createdTime', alias_priority=2), 'first_name': FieldInfo(annotation=str, required=True, alias='firstName', alias_priority=2), 'last_name': FieldInfo(annotation=str, required=True, alias='lastName', alias_priority=2), 'subgroup_uids': FieldInfo(annotation=list[str], required=True, alias='subGroups', alias_priority=2), 'email': FieldInfo(annotation=Union[str, NoneType], required=False, default=None), 'phone_number': FieldInfo(annotation=Union[str, NoneType], required=False, default=None, alias='phoneNumber', alias_priority=2), 'profile': FieldInfo(annotation=Union[Profile, NoneType], required=False, default=None), 'role_uids': FieldInfo(annotation=Union[list[str], NoneType], required=False, default=None, alias='roles', alias_priority=2)}"}, {"fullname": "spond_classes.Member.model_computed_fields", "modulename": "spond_classes", "qualname": "Member.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Profile", "modulename": "spond_classes", "qualname": "Profile", "kind": "class", "doc": "

Represents a profile in the Spond system.

\n\n

A Profile is an individual's account-specific record.

\n\n

A Profile belongs to a Member.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Profile.uid", "modulename": "spond_classes", "qualname": "Profile.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Profile.first_name", "modulename": "spond_classes", "qualname": "Profile.first_name", "kind": "variable", "doc": "

firstName in API.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Profile.last_name", "modulename": "spond_classes", "qualname": "Profile.last_name", "kind": "variable", "doc": "

lastName in API.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Profile.email", "modulename": "spond_classes", "qualname": "Profile.email", "kind": "variable", "doc": "

\n", "annotation": ": str | None"}, {"fullname": "spond_classes.Profile.phone_number", "modulename": "spond_classes", "qualname": "Profile.phone_number", "kind": "variable", "doc": "

phoneNumber in API.

\n", "annotation": ": str | None"}, {"fullname": "spond_classes.Profile.full_name", "modulename": "spond_classes", "qualname": "Profile.full_name", "kind": "variable", "doc": "

Return the Profile's full name, for convenience.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Profile.model_config", "modulename": "spond_classes", "qualname": "Profile.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Profile.model_fields", "modulename": "spond_classes", "qualname": "Profile.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'first_name': FieldInfo(annotation=str, required=True, alias='firstName', alias_priority=2), 'last_name': FieldInfo(annotation=str, required=True, alias='lastName', alias_priority=2), 'email': FieldInfo(annotation=Union[str, NoneType], required=False, default=None), 'phone_number': FieldInfo(annotation=Union[str, NoneType], required=False, default=None, alias='phoneNumber', alias_priority=2)}"}, {"fullname": "spond_classes.Profile.model_computed_fields", "modulename": "spond_classes", "qualname": "Profile.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Role", "modulename": "spond_classes", "qualname": "Role", "kind": "class", "doc": "

Represents a role in the Spond system.

\n\n

A Role belongs to a Group.

\n\n

Use Group.members_by_role() to get subordinate Members.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Role.uid", "modulename": "spond_classes", "qualname": "Role.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Role.name", "modulename": "spond_classes", "qualname": "Role.name", "kind": "variable", "doc": "

\n", "annotation": ": str"}, {"fullname": "spond_classes.Role.model_config", "modulename": "spond_classes", "qualname": "Role.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Role.model_fields", "modulename": "spond_classes", "qualname": "Role.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'name': FieldInfo(annotation=str, required=True)}"}, {"fullname": "spond_classes.Role.model_computed_fields", "modulename": "spond_classes", "qualname": "Role.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Subgroup", "modulename": "spond_classes", "qualname": "Subgroup", "kind": "class", "doc": "

Represents a subgroup in the Spond system.

\n\n

A Subgroup belongs to a Group.

\n\n

Use Group.members_by_subgroup() to get subordinate Members.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Subgroup.uid", "modulename": "spond_classes", "qualname": "Subgroup.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Subgroup.name", "modulename": "spond_classes", "qualname": "Subgroup.name", "kind": "variable", "doc": "

\n", "annotation": ": str"}, {"fullname": "spond_classes.Subgroup.model_config", "modulename": "spond_classes", "qualname": "Subgroup.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Subgroup.model_fields", "modulename": "spond_classes", "qualname": "Subgroup.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'name': FieldInfo(annotation=str, required=True)}"}, {"fullname": "spond_classes.Subgroup.model_computed_fields", "modulename": "spond_classes", "qualname": "Subgroup.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}]; + /** pdoc search index */const docs = [{"fullname": "spond_classes", "modulename": "spond_classes", "kind": "module", "doc": "

Main module.

\n"}, {"fullname": "spond_classes.Event", "modulename": "spond_classes", "qualname": "Event", "kind": "class", "doc": "

Represents an event in the Spond system.

\n\n

Events data is retrieved from the events API endpoint.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Event.uid", "modulename": "spond_classes", "qualname": "Event.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Event.heading", "modulename": "spond_classes", "qualname": "Event.heading", "kind": "variable", "doc": "

\n", "annotation": ": str"}, {"fullname": "spond_classes.Event.responses", "modulename": "spond_classes", "qualname": "Event.responses", "kind": "variable", "doc": "

\n", "annotation": ": spond_classes.event.Responses"}, {"fullname": "spond_classes.Event.type", "modulename": "spond_classes", "qualname": "Event.type", "kind": "variable", "doc": "

\n", "annotation": ": spond_classes.event.EventType"}, {"fullname": "spond_classes.Event.created_time", "modulename": "spond_classes", "qualname": "Event.created_time", "kind": "variable", "doc": "

Derived from createdTime in API.

\n", "annotation": ": datetime.datetime"}, {"fullname": "spond_classes.Event.end_time", "modulename": "spond_classes", "qualname": "Event.end_time", "kind": "variable", "doc": "

Datetime at which the Event ends.\nDerived from endTimestamp in API.

\n", "annotation": ": datetime.datetime"}, {"fullname": "spond_classes.Event.start_time", "modulename": "spond_classes", "qualname": "Event.start_time", "kind": "variable", "doc": "

Datetime at which the Event starts.\nDerived from startTimestamp in API.

\n", "annotation": ": datetime.datetime"}, {"fullname": "spond_classes.Event.cancelled", "modulename": "spond_classes", "qualname": "Event.cancelled", "kind": "variable", "doc": "

Optional.

\n", "annotation": ": bool | None"}, {"fullname": "spond_classes.Event.invite_time", "modulename": "spond_classes", "qualname": "Event.invite_time", "kind": "variable", "doc": "

Optional.\nDerived from inviteTime in API.

\n", "annotation": ": datetime.datetime | None"}, {"fullname": "spond_classes.Event.url", "modulename": "spond_classes", "qualname": "Event.url", "kind": "variable", "doc": "

Return the URL of the Event, for convenience.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Event.model_config", "modulename": "spond_classes", "qualname": "Event.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Event.model_fields", "modulename": "spond_classes", "qualname": "Event.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'heading': FieldInfo(annotation=str, required=True), 'responses': FieldInfo(annotation=Responses, required=True), 'type': FieldInfo(annotation=EventType, required=True), 'created_time': FieldInfo(annotation=datetime, required=True, alias='createdTime', alias_priority=2), 'end_time': FieldInfo(annotation=datetime, required=True, alias='endTimestamp', alias_priority=2), 'start_time': FieldInfo(annotation=datetime, required=True, alias='startTimestamp', alias_priority=2), 'cancelled': FieldInfo(annotation=Union[bool, NoneType], required=False, default=None), 'invite_time': FieldInfo(annotation=Union[datetime, NoneType], required=False, default=None, alias='inviteTime', alias_priority=2)}"}, {"fullname": "spond_classes.Event.model_computed_fields", "modulename": "spond_classes", "qualname": "Event.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.EventType", "modulename": "spond_classes", "qualname": "EventType", "kind": "class", "doc": "

Represents the kind of Event.

\n", "bases": "enum.Enum"}, {"fullname": "spond_classes.EventType.EVENT", "modulename": "spond_classes", "qualname": "EventType.EVENT", "kind": "variable", "doc": "

\n", "default_value": "<EventType.EVENT: 'EVENT'>"}, {"fullname": "spond_classes.EventType.RECURRING", "modulename": "spond_classes", "qualname": "EventType.RECURRING", "kind": "variable", "doc": "

\n", "default_value": "<EventType.RECURRING: 'RECURRING'>"}, {"fullname": "spond_classes.Responses", "modulename": "spond_classes", "qualname": "Responses", "kind": "class", "doc": "

Represents the responses to an Event.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Responses.accepted_uids", "modulename": "spond_classes", "qualname": "Responses.accepted_uids", "kind": "variable", "doc": "

acceptedIds in API.

\n", "annotation": ": list[str]"}, {"fullname": "spond_classes.Responses.declined_uids", "modulename": "spond_classes", "qualname": "Responses.declined_uids", "kind": "variable", "doc": "

declinedIds in API.

\n", "annotation": ": list[str]"}, {"fullname": "spond_classes.Responses.unanswered_uids", "modulename": "spond_classes", "qualname": "Responses.unanswered_uids", "kind": "variable", "doc": "

unansweredIds in API.

\n", "annotation": ": list[str]"}, {"fullname": "spond_classes.Responses.waiting_list_uids", "modulename": "spond_classes", "qualname": "Responses.waiting_list_uids", "kind": "variable", "doc": "

waitinglistIds in API.

\n", "annotation": ": list[str]"}, {"fullname": "spond_classes.Responses.unconfirmed_uids", "modulename": "spond_classes", "qualname": "Responses.unconfirmed_uids", "kind": "variable", "doc": "

unconfirmedIds in API.

\n", "annotation": ": list[str]"}, {"fullname": "spond_classes.Responses.model_config", "modulename": "spond_classes", "qualname": "Responses.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Responses.model_fields", "modulename": "spond_classes", "qualname": "Responses.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'accepted_uids': FieldInfo(annotation=list[str], required=True, alias='acceptedIds', alias_priority=2), 'declined_uids': FieldInfo(annotation=list[str], required=True, alias='declinedIds', alias_priority=2), 'unanswered_uids': FieldInfo(annotation=list[str], required=True, alias='unansweredIds', alias_priority=2), 'waiting_list_uids': FieldInfo(annotation=list[str], required=True, alias='waitinglistIds', alias_priority=2), 'unconfirmed_uids': FieldInfo(annotation=list[str], required=True, alias='unconfirmedIds', alias_priority=2)}"}, {"fullname": "spond_classes.Responses.model_computed_fields", "modulename": "spond_classes", "qualname": "Responses.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Group", "modulename": "spond_classes", "qualname": "Group", "kind": "class", "doc": "

Represents a group in the Spond system.

\n\n

Groups data is retrieved from the groups API endpoint.

\n\n

A Group has:

\n\n
    \n
  • zero, one or more Members
  • \n
  • zero, one or more Roles
  • \n
  • zero, one or more Subgroups
  • \n
\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Group.uid", "modulename": "spond_classes", "qualname": "Group.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Group.name", "modulename": "spond_classes", "qualname": "Group.name", "kind": "variable", "doc": "

\n", "annotation": ": str"}, {"fullname": "spond_classes.Group.members", "modulename": "spond_classes", "qualname": "Group.members", "kind": "variable", "doc": "

Members belonging to the Group. Derived from members in API.

\n", "annotation": ": list[spond_classes.member.Member]"}, {"fullname": "spond_classes.Group.roles", "modulename": "spond_classes", "qualname": "Group.roles", "kind": "variable", "doc": "

Roles belonging to the Group. Derived from roles in API.

\n", "annotation": ": list[spond_classes.role.Role]"}, {"fullname": "spond_classes.Group.subgroups", "modulename": "spond_classes", "qualname": "Group.subgroups", "kind": "variable", "doc": "

Subgroups belonging to the Group. Derived from subGroups in API.

\n", "annotation": ": list[spond_classes.subgroup.Subgroup]"}, {"fullname": "spond_classes.Group.member_by_id", "modulename": "spond_classes", "qualname": "Group.member_by_id", "kind": "function", "doc": "

Return the Member with matching ID.

\n\n
Parameters
\n\n
    \n
  • member_uid: ID to look up.
  • \n
\n\n
Returns
\n\n
    \n
  • Member
  • \n
\n\n
Raises
\n\n
    \n
  • LookupError: If uid is not found.
  • \n
\n", "signature": "(self, member_uid: str) -> spond_classes.member.Member:", "funcdef": "def"}, {"fullname": "spond_classes.Group.role_by_id", "modulename": "spond_classes", "qualname": "Group.role_by_id", "kind": "function", "doc": "

Return the Role with matching ID.

\n\n
Parameters
\n\n
    \n
  • role_uid: ID to look up.
  • \n
\n\n
Returns
\n\n
    \n
  • Role
  • \n
\n\n
Raises
\n\n
    \n
  • LookupError: If uid is not found.
  • \n
\n", "signature": "(self, role_uid: str) -> spond_classes.role.Role:", "funcdef": "def"}, {"fullname": "spond_classes.Group.subgroup_by_id", "modulename": "spond_classes", "qualname": "Group.subgroup_by_id", "kind": "function", "doc": "

Return the Subgroup with matching ID.

\n\n
Parameters
\n\n
    \n
  • subgroup_uid: ID to look up.
  • \n
\n\n
Returns
\n\n
    \n
  • Subgroup
  • \n
\n\n
Raises
\n\n
    \n
  • LookupError: If uid is not found.
  • \n
\n", "signature": "(self, subgroup_uid: str) -> spond_classes.subgroup.Subgroup:", "funcdef": "def"}, {"fullname": "spond_classes.Group.members_by_subgroup", "modulename": "spond_classes", "qualname": "Group.members_by_subgroup", "kind": "function", "doc": "

Return Members in the Subgroup.

\n\n
Parameters
\n\n
    \n
  • subgroup: Subgroup from which to return Members.
  • \n
\n\n
Returns
\n\n
    \n
  • list[Member]
  • \n
\n\n
Raises
\n\n
    \n
  • TypeError: If subgroup is not a Subgroup instance.
  • \n
\n", "signature": "(\tself,\tsubgroup: spond_classes.subgroup.Subgroup) -> list[spond_classes.member.Member]:", "funcdef": "def"}, {"fullname": "spond_classes.Group.members_by_role", "modulename": "spond_classes", "qualname": "Group.members_by_role", "kind": "function", "doc": "

Return Members with the Role.

\n\n
Parameters
\n\n
    \n
  • role: Role from which to return Members.
  • \n
\n\n
Returns
\n\n
    \n
  • list[Member]
  • \n
\n\n
Raises
\n\n
    \n
  • TypeError: If role is not a Role instance.
  • \n
\n", "signature": "(self, role: spond_classes.role.Role) -> list[spond_classes.member.Member]:", "funcdef": "def"}, {"fullname": "spond_classes.Group.model_config", "modulename": "spond_classes", "qualname": "Group.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Group.model_fields", "modulename": "spond_classes", "qualname": "Group.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'name': FieldInfo(annotation=str, required=True), 'members': FieldInfo(annotation=list[Member], required=True), 'roles': FieldInfo(annotation=list[Role], required=True), 'subgroups': FieldInfo(annotation=list[Subgroup], required=True, alias='subGroups', alias_priority=2)}"}, {"fullname": "spond_classes.Group.model_computed_fields", "modulename": "spond_classes", "qualname": "Group.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Member", "modulename": "spond_classes", "qualname": "Member", "kind": "class", "doc": "

Represents a member in the Spond system.

\n\n

A Member is an individual's Group-specific record.

\n\n

A Member may have a Profile.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Member.uid", "modulename": "spond_classes", "qualname": "Member.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Member.created_time", "modulename": "spond_classes", "qualname": "Member.created_time", "kind": "variable", "doc": "

Derived from createdTime in API.

\n", "annotation": ": datetime.datetime"}, {"fullname": "spond_classes.Member.first_name", "modulename": "spond_classes", "qualname": "Member.first_name", "kind": "variable", "doc": "

firstName in API.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Member.last_name", "modulename": "spond_classes", "qualname": "Member.last_name", "kind": "variable", "doc": "

lastName in API.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Member.subgroup_uids", "modulename": "spond_classes", "qualname": "Member.subgroup_uids", "kind": "variable", "doc": "

subGroups in API; aliased to avoid confusion with Subgroup instances.

\n", "annotation": ": list[str]"}, {"fullname": "spond_classes.Member.email", "modulename": "spond_classes", "qualname": "Member.email", "kind": "variable", "doc": "

\n", "annotation": ": str | None"}, {"fullname": "spond_classes.Member.phone_number", "modulename": "spond_classes", "qualname": "Member.phone_number", "kind": "variable", "doc": "

phoneNumber in API.

\n", "annotation": ": str | None"}, {"fullname": "spond_classes.Member.profile", "modulename": "spond_classes", "qualname": "Member.profile", "kind": "variable", "doc": "

Derived from profile in API.

\n", "annotation": ": spond_classes.profile_.Profile | None"}, {"fullname": "spond_classes.Member.role_uids", "modulename": "spond_classes", "qualname": "Member.role_uids", "kind": "variable", "doc": "

roles in API; aliased to avoid confusion with Role instances.

\n", "annotation": ": list[str] | None"}, {"fullname": "spond_classes.Member.full_name", "modulename": "spond_classes", "qualname": "Member.full_name", "kind": "variable", "doc": "

Return the Member's full name, for convenience.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Member.model_config", "modulename": "spond_classes", "qualname": "Member.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Member.model_fields", "modulename": "spond_classes", "qualname": "Member.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'created_time': FieldInfo(annotation=datetime, required=True, alias='createdTime', alias_priority=2), 'first_name': FieldInfo(annotation=str, required=True, alias='firstName', alias_priority=2), 'last_name': FieldInfo(annotation=str, required=True, alias='lastName', alias_priority=2), 'subgroup_uids': FieldInfo(annotation=list[str], required=True, alias='subGroups', alias_priority=2), 'email': FieldInfo(annotation=Union[str, NoneType], required=False, default=None), 'phone_number': FieldInfo(annotation=Union[str, NoneType], required=False, default=None, alias='phoneNumber', alias_priority=2), 'profile': FieldInfo(annotation=Union[Profile, NoneType], required=False, default=None), 'role_uids': FieldInfo(annotation=Union[list[str], NoneType], required=False, default=None, alias='roles', alias_priority=2)}"}, {"fullname": "spond_classes.Member.model_computed_fields", "modulename": "spond_classes", "qualname": "Member.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Profile", "modulename": "spond_classes", "qualname": "Profile", "kind": "class", "doc": "

Represents a profile in the Spond system.

\n\n

A Profile is an individual's account-specific record.

\n\n

A Profile belongs to a Member.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Profile.uid", "modulename": "spond_classes", "qualname": "Profile.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Profile.first_name", "modulename": "spond_classes", "qualname": "Profile.first_name", "kind": "variable", "doc": "

firstName in API.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Profile.last_name", "modulename": "spond_classes", "qualname": "Profile.last_name", "kind": "variable", "doc": "

lastName in API.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Profile.email", "modulename": "spond_classes", "qualname": "Profile.email", "kind": "variable", "doc": "

\n", "annotation": ": str | None"}, {"fullname": "spond_classes.Profile.phone_number", "modulename": "spond_classes", "qualname": "Profile.phone_number", "kind": "variable", "doc": "

phoneNumber in API.

\n", "annotation": ": str | None"}, {"fullname": "spond_classes.Profile.full_name", "modulename": "spond_classes", "qualname": "Profile.full_name", "kind": "variable", "doc": "

Return the Profile's full name, for convenience.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Profile.model_config", "modulename": "spond_classes", "qualname": "Profile.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Profile.model_fields", "modulename": "spond_classes", "qualname": "Profile.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'first_name': FieldInfo(annotation=str, required=True, alias='firstName', alias_priority=2), 'last_name': FieldInfo(annotation=str, required=True, alias='lastName', alias_priority=2), 'email': FieldInfo(annotation=Union[str, NoneType], required=False, default=None), 'phone_number': FieldInfo(annotation=Union[str, NoneType], required=False, default=None, alias='phoneNumber', alias_priority=2)}"}, {"fullname": "spond_classes.Profile.model_computed_fields", "modulename": "spond_classes", "qualname": "Profile.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Role", "modulename": "spond_classes", "qualname": "Role", "kind": "class", "doc": "

Represents a role in the Spond system.

\n\n

A Role belongs to a Group.

\n\n

Use Group.members_by_role() to get subordinate Members.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Role.uid", "modulename": "spond_classes", "qualname": "Role.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Role.name", "modulename": "spond_classes", "qualname": "Role.name", "kind": "variable", "doc": "

\n", "annotation": ": str"}, {"fullname": "spond_classes.Role.model_config", "modulename": "spond_classes", "qualname": "Role.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Role.model_fields", "modulename": "spond_classes", "qualname": "Role.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'name': FieldInfo(annotation=str, required=True)}"}, {"fullname": "spond_classes.Role.model_computed_fields", "modulename": "spond_classes", "qualname": "Role.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}, {"fullname": "spond_classes.Subgroup", "modulename": "spond_classes", "qualname": "Subgroup", "kind": "class", "doc": "

Represents a subgroup in the Spond system.

\n\n

A Subgroup belongs to a Group.

\n\n

Use Group.members_by_subgroup() to get subordinate Members.

\n", "bases": "pydantic.main.BaseModel"}, {"fullname": "spond_classes.Subgroup.uid", "modulename": "spond_classes", "qualname": "Subgroup.uid", "kind": "variable", "doc": "

id in API; aliased as that's a Python built-in, and the Spond package\nuses uid.

\n", "annotation": ": str"}, {"fullname": "spond_classes.Subgroup.name", "modulename": "spond_classes", "qualname": "Subgroup.name", "kind": "variable", "doc": "

\n", "annotation": ": str"}, {"fullname": "spond_classes.Subgroup.model_config", "modulename": "spond_classes", "qualname": "Subgroup.model_config", "kind": "variable", "doc": "

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

\n", "annotation": ": ClassVar[pydantic.config.ConfigDict]", "default_value": "{}"}, {"fullname": "spond_classes.Subgroup.model_fields", "modulename": "spond_classes", "qualname": "Subgroup.model_fields", "kind": "variable", "doc": "

Metadata about the fields defined on the model,\nmapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

\n\n

This replaces Model.__fields__ from Pydantic V1.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.FieldInfo]]", "default_value": "{'uid': FieldInfo(annotation=str, required=True, alias='id', alias_priority=2), 'name': FieldInfo(annotation=str, required=True)}"}, {"fullname": "spond_classes.Subgroup.model_computed_fields", "modulename": "spond_classes", "qualname": "Subgroup.model_computed_fields", "kind": "variable", "doc": "

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

\n", "annotation": ": ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]]", "default_value": "{}"}]; // mirrored in build-search-index.js (part 1) // Also split on html tags. this is a cheap heuristic, but good enough. diff --git a/docs/spond_classes.html b/docs/spond_classes.html index cd33067..425957a 100644 --- a/docs/spond_classes.html +++ b/docs/spond_classes.html @@ -79,6 +79,36 @@

API Documentation

+ +
  • + Responses + +
  • Group @@ -272,7 +302,7 @@

    2 3# Explicitly import classes and functions into the package namespace to define the API. 4 - 5from .event import Event, EventType + 5from .event import Event, EventType, Responses 6from .group import Group 7from .member import Member 8from .profile_ import Profile @@ -282,12 +312,13 @@

    12__all__ = [ 13 "Event", 14 "EventType", -15 "Group", -16 "Member", -17 "Profile", -18 "Role", -19 "Subgroup", -20] +15 "Responses", +16 "Group", +17 "Member", +18 "Profile", +19 "Role", +20 "Subgroup", +21] @@ -383,7 +414,7 @@

    - responses: spond_classes.event.Responses + responses: Responses
    @@ -585,6 +616,150 @@

    +

    + +
    + +
    + + class + Responses(pydantic.main.BaseModel): + + + +
    + +
    10class Responses(BaseModel):
    +11    """Represents the responses to an `Event`."""
    +12
    +13    # Lists which always exist in API data, but may be empty
    +14    accepted_uids: list[str] = Field(alias="acceptedIds")
    +15    """`acceptedIds` in API."""
    +16    declined_uids: list[str] = Field(alias="declinedIds")
    +17    """`declinedIds` in API."""
    +18    unanswered_uids: list[str] = Field(alias="unansweredIds")
    +19    """`unansweredIds` in API."""
    +20    waiting_list_uids: list[str] = Field(alias="waitinglistIds")
    +21    """`waitinglistIds` in API."""
    +22    unconfirmed_uids: list[str] = Field(alias="unconfirmedIds")
    +23    """`unconfirmedIds` in API."""
    +
    + + +

    Represents the responses to an Event.

    +
    + + +
    +
    + accepted_uids: list[str] + + +
    + + +

    acceptedIds in API.

    +
    + + +
    +
    +
    + declined_uids: list[str] + + +
    + + +

    declinedIds in API.

    +
    + + +
    +
    +
    + unanswered_uids: list[str] + + +
    + + +

    unansweredIds in API.

    +
    + + +
    +
    +
    + waiting_list_uids: list[str] + + +
    + + +

    waitinglistIds in API.

    +
    + + +
    +
    +
    + unconfirmed_uids: list[str] + + +
    + + +

    unconfirmedIds in API.

    +
    + + +
    +
    +
    + model_config: ClassVar[pydantic.config.ConfigDict] = +{} + + +
    + + +

    Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

    +
    + + +
    +
    +
    + model_fields: ClassVar[Dict[str, pydantic.fields.FieldInfo]] = + + {'accepted_uids': FieldInfo(annotation=list[str], required=True, alias='acceptedIds', alias_priority=2), 'declined_uids': FieldInfo(annotation=list[str], required=True, alias='declinedIds', alias_priority=2), 'unanswered_uids': FieldInfo(annotation=list[str], required=True, alias='unansweredIds', alias_priority=2), 'waiting_list_uids': FieldInfo(annotation=list[str], required=True, alias='waitinglistIds', alias_priority=2), 'unconfirmed_uids': FieldInfo(annotation=list[str], required=True, alias='unconfirmedIds', alias_priority=2)} + + +
    + + +

    Metadata about the fields defined on the model, +mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.

    + +

    This replaces Model.__fields__ from Pydantic V1.

    +
    + + +
    +
    +
    + model_computed_fields: ClassVar[Dict[str, pydantic.fields.ComputedFieldInfo]] = +{} + + +
    + + +

    A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

    +
    + +
    diff --git a/pyproject.toml b/pyproject.toml index 09fa018..b212c29 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,10 +17,10 @@ pydantic = ">=2.7.1" [tool.poetry.group.dev.dependencies] pdoc = "15.0.0" pre-commit = "4.0.1" -ruff = "0.6.9" +ruff = "0.7.0" [tool.poetry.group.test.dependencies] -mypy = "1.11.2" +mypy = "1.12.0" pytest = "8.3.3" [tool.mypy] diff --git a/spond_classes/__init__.py b/spond_classes/__init__.py index 9a1e19a..5dfc5bc 100644 --- a/spond_classes/__init__.py +++ b/spond_classes/__init__.py @@ -2,7 +2,7 @@ # Explicitly import classes and functions into the package namespace to define the API. -from .event import Event, EventType +from .event import Event, EventType, Responses from .group import Group from .member import Member from .profile_ import Profile @@ -12,6 +12,7 @@ __all__ = [ "Event", "EventType", + "Responses", "Group", "Member", "Profile",